Merge remote-tracking branch 'friendika/master' into newui

This commit is contained in:
fabrixxm 2011-08-26 14:44:24 +02:00
commit 5ec4a4e6de
37 changed files with 3736 additions and 775 deletions

View file

@ -15,20 +15,32 @@ hosting provider prior to installation.
Before you begin: Choose a domain name or subdomain name for your server. Before you begin: Choose a domain name or subdomain name for your server.
Put some thought into this - because changing it is currently not-supported. Put some thought into this - because changing it is currently not-supported.
Things will break, and some of your friends may have difficulty communicating Things will break, and some of your friends may have difficulty communicating
with you. We plan to address this limitation in a future release. with you. We plan to address this limitation in a future release. Also decide
if you wish to connect with members of the Diaspora network, as this will
impact the installation requirements.
Decide if you will use SSL and obtain an SSL cert. Communications with the
Diaspora network MAY require both SSL AND an SSL cert signed by a CA which is
recognised by the major browsers. Friendika will work with self-signed certs
but Diaspora communication may not. For best results, install your cert PRIOR
to installing Friendika and when visiting your site for the initial
installation in step 5, please use the https: link. (Use the http: or non-SSL
link if your cert is self-signed).
1. Requirements 1. Requirements
- Apache with mod-rewrite enabled and "Options All" so you can use a - Apache with mod-rewrite enabled and "Options All" so you can use a
local .htaccess file local .htaccess file
- PHP 5.2+. The later the better. You'll need 5.3 for encryption of key - PHP 5.2+. The later the better. PHP 5.3 is required for communications
exchange conversations with the Diaspora network and improved security.
- PHP *command line* access with register_argc_argv set to true in the - PHP *command line* access with register_argc_argv set to true in the
php.ini file php.ini file [or see 'poormancron' in section 8]
- curl, gd, mysql, mbstring, and openssl extensions
- curl, gd, mysql, mbstring, mcrypt, and openssl extensions
- some form of email server or email gateway such that PHP mail() works - some form of email server or email gateway such that PHP mail() works
- mcrypt (optional; used for end-to-end message encryption)
- Mysql 5.x - Mysql 5.x
@ -36,12 +48,8 @@ php.ini file
(Windows) [Note: other options are presented in Section 8 of this document] (Windows) [Note: other options are presented in Section 8 of this document]
- Installation into a top-level domain or sub-domain (without a - Installation into a top-level domain or sub-domain (without a
directory/path component in the URL) is preferred. Directory paths will directory/path component in the URL) is preferred. This is REQUIRED if
not be as convenient to use and have not been thoroughly tested. you wish to communicate with the Diaspora network.
[Dreamhost.com offers all of the necessary hosting features at a
reasonable price. If your hosting provider doesn't allow Unix shell access,
you might have trouble getting everything to work.]
2. Unpack the Friendika files into the root of your web server document area. 2. Unpack the Friendika files into the root of your web server document area.
@ -58,7 +66,9 @@ write or create files in your web directory, create an empty file called
.htconfig.php and make it writable by the web server. .htconfig.php and make it writable by the web server.
5. Visit your website with a web browser and follow the instructions. Please 5. Visit your website with a web browser and follow the instructions. Please
note any error messages and correct these before continuing. note any error messages and correct these before continuing. If you are using
SSL with a known signature authority (recommended), use the https: link to your
website. If you are using a self-signed cert or no cert, use the http: link.
6. *If* the automated installation fails for any reason, check the following: 6. *If* the automated installation fails for any reason, check the following:
@ -99,7 +109,9 @@ have troubles with this section please contact your hosting provider for
assistance. Friendika will not work correctly if you cannot perform this step. assistance. Friendika will not work correctly if you cannot perform this step.
Alternative: You may be able to use the 'poormancron' plugin to perform this Alternative: You may be able to use the 'poormancron' plugin to perform this
step if you are using a recent Friendika release. To do this, edit the file step if you are using a recent Friendika release. 'poormancron' may result in
perfomance and memory issues and is only suitable for small sites with one or
two users and a handful of contacts. To do this, edit the file
".htconfig.php" and look for a line describing your plugins. On a fresh ".htconfig.php" and look for a line describing your plugins. On a fresh
installation, it will look like installation, it will look like
@ -114,7 +126,7 @@ $a->config['system']['addon'] = 'js_upload,poormancron';
and save your changes. and save your changes.
##################################################################### #####################################################################
If things don't work... If things don't work...

View file

@ -151,6 +151,8 @@ function fb_get_friends($uid) {
logger('facebook: fb_get_friends: ' . $s, LOGGER_DATA); logger('facebook: fb_get_friends: ' . $s, LOGGER_DATA);
$j = json_decode($s); $j = json_decode($s);
logger('facebook: fb_get_friends: json: ' . print_r($j,true), LOGGER_DATA); logger('facebook: fb_get_friends: json: ' . print_r($j,true), LOGGER_DATA);
if(! $j->data)
return;
foreach($j->data as $person) { foreach($j->data as $person) {
$s = fetch_url('https://graph.facebook.com/' . $person->id . '?access_token=' . $access_token); $s = fetch_url('https://graph.facebook.com/' . $person->id . '?access_token=' . $access_token);
if($s) { if($s) {

View file

@ -8,9 +8,9 @@ require_once("include/pgettext.php");
require_once('include/nav.php'); require_once('include/nav.php');
define ( 'FRIENDIKA_VERSION', '2.2.1079' ); define ( 'FRIENDIKA_VERSION', '2.2.1083' );
define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' );
define ( 'DB_UPDATE_VERSION', 1081 ); define ( 'DB_UPDATE_VERSION', 1082 );
define ( 'EOL', "<br />\r\n" ); define ( 'EOL', "<br />\r\n" );
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );

View file

@ -38,7 +38,7 @@ CREATE TABLE IF NOT EXISTS `config` (
`k` char(255) NOT NULL, `k` char(255) NOT NULL,
`v` text NOT NULL, `v` text NOT NULL,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8; ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
@ -267,6 +267,7 @@ CREATE TABLE IF NOT EXISTS `photo` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`uid` int(10) unsigned NOT NULL, `uid` int(10) unsigned NOT NULL,
`contact-id` int(10) unsigned NOT NULL, `contact-id` int(10) unsigned NOT NULL,
`guid` char(64) NOT NULL,
`resource-id` char(255) NOT NULL, `resource-id` char(255) NOT NULL,
`created` datetime NOT NULL, `created` datetime NOT NULL,
`edited` datetime NOT NULL, `edited` datetime NOT NULL,
@ -288,7 +289,8 @@ CREATE TABLE IF NOT EXISTS `photo` (
KEY `resource-id` (`resource-id`), KEY `resource-id` (`resource-id`),
KEY `album` (`album`), KEY `album` (`album`),
KEY `scale` (`scale`), KEY `scale` (`scale`),
KEY `profile` (`profile`) KEY `profile` (`profile`),
KEY `guid` (`guid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8; ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- -------------------------------------------------------- -- --------------------------------------------------------
@ -426,7 +428,7 @@ CREATE TABLE IF NOT EXISTS `register` (
`password` CHAR(255) NOT NULL, `password` CHAR(255) NOT NULL,
`language` CHAR(16) NOT NULL, `language` CHAR(16) NOT NULL,
PRIMARY KEY (`id`) PRIMARY KEY (`id`)
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `clients` ( CREATE TABLE IF NOT EXISTS `clients` (
@ -434,7 +436,7 @@ CREATE TABLE IF NOT EXISTS `clients` (
`pw` VARCHAR( 20 ) NOT NULL , `pw` VARCHAR( 20 ) NOT NULL ,
`redirect_uri` VARCHAR( 200 ) NOT NULL , `redirect_uri` VARCHAR( 200 ) NOT NULL ,
PRIMARY KEY ( `client_id` ) PRIMARY KEY ( `client_id` )
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `tokens` ( CREATE TABLE IF NOT EXISTS `tokens` (
`id` VARCHAR( 40 ) NOT NULL , `id` VARCHAR( 40 ) NOT NULL ,
@ -442,7 +444,7 @@ CREATE TABLE IF NOT EXISTS `tokens` (
`expires` INT NOT NULL , `expires` INT NOT NULL ,
`scope` VARCHAR( 200 ) NOT NULL , `scope` VARCHAR( 200 ) NOT NULL ,
PRIMARY KEY ( `id` ) PRIMARY KEY ( `id` )
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `auth_codes` ( CREATE TABLE IF NOT EXISTS `auth_codes` (
`id` VARCHAR( 40 ) NOT NULL , `id` VARCHAR( 40 ) NOT NULL ,
@ -451,7 +453,7 @@ CREATE TABLE IF NOT EXISTS `auth_codes` (
`expires` INT NOT NULL , `expires` INT NOT NULL ,
`scope` VARCHAR( 250 ) NOT NULL , `scope` VARCHAR( 250 ) NOT NULL ,
PRIMARY KEY ( `id` ) PRIMARY KEY ( `id` )
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `queue` ( CREATE TABLE IF NOT EXISTS `queue` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
@ -460,7 +462,7 @@ CREATE TABLE IF NOT EXISTS `queue` (
`created` DATETIME NOT NULL , `created` DATETIME NOT NULL ,
`last` DATETIME NOT NULL , `last` DATETIME NOT NULL ,
`content` MEDIUMTEXT NOT NULL `content` MEDIUMTEXT NOT NULL
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `pconfig` ( CREATE TABLE IF NOT EXISTS `pconfig` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
@ -468,7 +470,7 @@ CREATE TABLE IF NOT EXISTS `pconfig` (
`cat` CHAR( 255 ) NOT NULL , `cat` CHAR( 255 ) NOT NULL ,
`k` CHAR( 255 ) NOT NULL , `k` CHAR( 255 ) NOT NULL ,
`v` MEDIUMTEXT NOT NULL `v` MEDIUMTEXT NOT NULL
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `hook` ( CREATE TABLE IF NOT EXISTS `hook` (
@ -476,7 +478,7 @@ CREATE TABLE IF NOT EXISTS `hook` (
`hook` CHAR( 255 ) NOT NULL , `hook` CHAR( 255 ) NOT NULL ,
`file` CHAR( 255 ) NOT NULL , `file` CHAR( 255 ) NOT NULL ,
`function` CHAR( 255 ) NOT NULL `function` CHAR( 255 ) NOT NULL
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `addon` ( CREATE TABLE IF NOT EXISTS `addon` (
@ -486,7 +488,7 @@ CREATE TABLE IF NOT EXISTS `addon` (
`installed` TINYINT( 1 ) NOT NULL DEFAULT '0' , `installed` TINYINT( 1 ) NOT NULL DEFAULT '0' ,
`timestamp` BIGINT NOT NULL DEFAULT '0' , `timestamp` BIGINT NOT NULL DEFAULT '0' ,
`plugin_admin` TINYINT( 1 ) NOT NULL DEFAULT '0' `plugin_admin` TINYINT( 1 ) NOT NULL DEFAULT '0'
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `event` ( CREATE TABLE IF NOT EXISTS `event` (
@ -507,13 +509,13 @@ CREATE TABLE IF NOT EXISTS `event` (
`allow_gid` MEDIUMTEXT NOT NULL , `allow_gid` MEDIUMTEXT NOT NULL ,
`deny_cid` MEDIUMTEXT NOT NULL , `deny_cid` MEDIUMTEXT NOT NULL ,
`deny_gid` MEDIUMTEXT NOT NULL `deny_gid` MEDIUMTEXT NOT NULL
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `cache` ( CREATE TABLE IF NOT EXISTS `cache` (
`k` CHAR( 255 ) NOT NULL PRIMARY KEY , `k` CHAR( 255 ) NOT NULL PRIMARY KEY ,
`v` TEXT NOT NULL, `v` TEXT NOT NULL,
`updated` DATETIME NOT NULL `updated` DATETIME NOT NULL
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `fcontact` ( CREATE TABLE IF NOT EXISTS `fcontact` (
@ -534,14 +536,14 @@ CREATE TABLE IF NOT EXISTS `fcontact` (
`updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00', `updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
INDEX ( `addr` ), INDEX ( `addr` ),
INDEX ( `network` ) INDEX ( `network` )
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `ffinder` ( CREATE TABLE IF NOT EXISTS `ffinder` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT UNSIGNED NOT NULL , `uid` INT UNSIGNED NOT NULL ,
`cid` INT UNSIGNED NOT NULL , `cid` INT UNSIGNED NOT NULL ,
`fid` INT UNSIGNED NOT NULL `fid` INT UNSIGNED NOT NULL
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `fsuggest` ( CREATE TABLE IF NOT EXISTS `fsuggest` (
@ -554,7 +556,7 @@ CREATE TABLE IF NOT EXISTS `fsuggest` (
`photo` CHAR( 255 ) NOT NULL , `photo` CHAR( 255 ) NOT NULL ,
`note` TEXT NOT NULL , `note` TEXT NOT NULL ,
`created` DATETIME NOT NULL `created` DATETIME NOT NULL
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `mailacct` ( CREATE TABLE IF NOT EXISTS `mailacct` (
@ -569,7 +571,7 @@ CREATE TABLE IF NOT EXISTS `mailacct` (
`reply_to` CHAR( 255 ) NOT NULL , `reply_to` CHAR( 255 ) NOT NULL ,
`pubmail` TINYINT(1) NOT NULL DEFAULT '0', `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'
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `attach` ( CREATE TABLE IF NOT EXISTS `attach` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
@ -585,13 +587,13 @@ CREATE TABLE IF NOT EXISTS `attach` (
`allow_gid` MEDIUMTEXT NOT NULL , `allow_gid` MEDIUMTEXT NOT NULL ,
`deny_cid` MEDIUMTEXT NOT NULL , `deny_cid` MEDIUMTEXT NOT NULL ,
`deny_gid` MEDIUMTEXT NOT NULL `deny_gid` MEDIUMTEXT NOT NULL
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `guid` ( CREATE TABLE IF NOT EXISTS `guid` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`guid` CHAR( 64 ) NOT NULL , `guid` CHAR( 64 ) NOT NULL ,
INDEX ( `guid` ) INDEX ( `guid` )
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `sign` ( CREATE TABLE IF NOT EXISTS `sign` (
@ -601,6 +603,6 @@ CREATE TABLE IF NOT EXISTS `sign` (
`signature` TEXT NOT NULL , `signature` TEXT NOT NULL ,
`signer` CHAR( 255 ) NOT NULL , `signer` CHAR( 255 ) NOT NULL ,
INDEX ( `iid` ) INDEX ( `iid` )
) ENGINE = MYISAM DEFAULT CHARSET=utf8; ) ENGINE = MyISAM DEFAULT CHARSET=utf8;

View file

@ -85,3 +85,55 @@ function unmark_for_death($contact) {
); );
}} }}
if(! function_exists('contact_photo_menu')){
function contact_photo_menu($contact) {
$a = get_app();
$contact_url="";
$pm_url="";
$status_link="";
$photos_link="";
$posts_link="";
$sparkle = false;
if($contact['network'] === NETWORK_DFRN) {
$sparkle = true;
$profile_link = $a->get_baseurl() . '/redir/' . $contact['id'];
}
else
$profile_link = $contact['url'];
if($profile_link === 'mailbox')
$profile_link = '';
if($sparkle) {
$status_link = $profile_link . "?url=status";
$photos_link = $profile_link . "?url=photos";
$profile_link = $profile_link . "?url=profile";
$pm_url = $a->get_baseurl() . '/message/new/' . $contact['id'];
}
$contact_url = $a->get_baseurl() . '/contacts/' . $contact['id'];
$posts_link = $a->get_baseurl() . '/network/?cid=' . $contact['id'];
$menu = Array(
t("View status") => $status_link,
t("View profile") => $profile_link,
t("View photos") => $photos_link,
t("View recent") => $posts_link,
t("Edit contact") => $contact_url,
t("Send PM") => $pm_url,
);
$args = array('contact' => $contact, 'menu' => $menu);
call_hooks('contact_photo_menu', $args);
$o = "";
foreach($menu as $k=>$v){
if ($v!="") $o .= "<li><a href='$v'>$k</a></li>\n";
}
return $o;
}}

View file

@ -185,11 +185,20 @@ class Photo {
public function store($uid, $cid, $rid, $filename, $album, $scale, $profile = 0, $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '') { public function store($uid, $cid, $rid, $filename, $album, $scale, $profile = 0, $allow_cid = '', $allow_gid = '', $deny_cid = '', $deny_gid = '') {
$r = q("select `guid` from photo where `resource-id` = '%s' and `guid` != '' limit 1",
dbesc($rid)
);
if(count($r))
$guid = $r[0]['guid'];
else
$guid = get_guid();
$r = q("INSERT INTO `photo` $r = q("INSERT INTO `photo`
( `uid`, `contact-id`, `resource-id`, `created`, `edited`, `filename`, `album`, `height`, `width`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` ) ( `uid`, `contact-id`, `guid`, `resource-id`, `created`, `edited`, `filename`, `album`, `height`, `width`, `data`, `scale`, `profile`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid` )
VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )", VALUES ( %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, '%s', %d, %d, '%s', '%s', '%s', '%s' )",
intval($uid), intval($uid),
intval($cid), intval($cid),
dbesc($guid),
dbesc($rid), dbesc($rid),
dbesc(datetime_convert()), dbesc(datetime_convert()),
dbesc(datetime_convert()), dbesc(datetime_convert()),

View file

@ -170,7 +170,7 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
$sql_extra .= " AND `network` IN ( 'dfrn' ) "; $sql_extra .= " AND `network` IN ( 'dfrn' ) ";
} }
elseif($privatenet) { elseif($privatenet) {
$sql_extra .= " AND `network` IN ( 'dfrn', 'mail', 'face' ) "; $sql_extra .= " AND `network` IN ( 'dfrn', 'mail', 'face', 'dspr' ) ";
} }

View file

@ -48,7 +48,8 @@ if((isset($_SESSION)) && (x($_SESSION,'authenticated')) && ((! (x($_POST,'auth-p
goaway(z_root()); goaway(z_root());
} }
$r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", $r = q("SELECT `user`.*, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey`
FROM `user` WHERE `uid` = %d LIMIT 1",
intval($_SESSION['uid']) intval($_SESSION['uid'])
); );
@ -183,7 +184,8 @@ else {
// process normal login request // process normal login request
$r = q("SELECT * FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' ) $r = q("SELECT `user`.*, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey`
FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' )
AND `password` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1", AND `password` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1",
dbesc(trim($_POST['openid_url'])), dbesc(trim($_POST['openid_url'])),
dbesc(trim($_POST['openid_url'])), dbesc(trim($_POST['openid_url'])),

178
include/bb2diaspora.php Normal file
View file

@ -0,0 +1,178 @@
<?php
require_once("include/oembed.php");
require_once('include/event.php');
function diaspora2bb($s) {
$s = str_replace(array('\\**','\\__','\\*','\\_'), array('-^doublestar^-','-^doublescore-^','-^star^-','-^score^-'),$s);
$s = preg_replace("/\*\*\*(.+?)\*\*\*/", '[b][i]$1[/i][/b]', $s);
$s = preg_replace("/\_\_\_(.+?)\_\_\_/", '[b][i]$1[/i][/b]', $s);
$s = preg_replace("/\*\*(.+?)\*\*/", '[b]$1[/b]', $s);
$s = preg_replace("/\_\_(.+?)\_\_/", '[b]$1[/b]', $s);
$s = preg_replace("/\*(.+?)\*/", '[i]$1[/i]', $s);
$s = preg_replace("/\_(.+?)\_/", '[i]$1[/i]', $s);
$s = str_replace(array('-^doublestar^-','-^doublescore-^','-^star^-','-^score^-'), array('**','__','*','_'), $s);
$s = preg_replace('/\[(.+?)\]\((.+?)\)/','[url=$2]$1[/url]',$s);
$s = escape_tags($s);
return $s;
}
function stripdcode_br_cb($s) {
return '[code]' . str_replace('<br />', '', $s[1]) . '[/code]';
}
// BBcode 2 HTML was written by WAY2WEB.net
// extended to work with Mistpark/Friendika - Mike Macgirvin
function bb2diaspora($Text,$preserve_nl = false) {
// Replace any html brackets with HTML Entities to prevent executing HTML or script
// Don't use strip_tags here because it breaks [url] search by replacing & with amp
$Text = str_replace("<", "&lt;", $Text);
$Text = str_replace(">", "&gt;", $Text);
if($preserve_nl)
$Text = str_replace(array("\n","\r"), array('',''),$Text);
// Set up the parameters for a URL search string
$URLSearchString = "^\[\]";
// Set up the parameters for a MAIL search string
$MAILSearchString = $URLSearchString;
// Perform URL Search
// [img]pathtoimage[/img]
$Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/", '[$1]($1)', $Text);
$Text = preg_replace("(\[url\=([$URLSearchString]*)\](.*?)\[/url\])", '[$2]($1)', $Text);
// $Text = preg_replace("/\[img\](.*?)\[\/img\]/", t('Image/photo: ') . '$1', $Text);
// $Text = preg_replace("/\[img\](.*?)\[\/img\]/", t('image/photo'), $Text);
// Perform MAIL Search
$Text = preg_replace("(\[mail\]([$MAILSearchString]*)\[/mail\])", '[$1](mailto:$1)', $Text);
$Text = preg_replace("/\[mail\=([$MAILSearchString]*)\](.*?)\[\/mail\]/", '[$2](mailto:$1)', $Text);
$Text = str_replace('*', '\\*', $Text);
$Text = str_replace('_', '\\_', $Text);
$Text = str_replace('`','\\`', $Text);
// Check for bold text
$Text = preg_replace("(\[b\](.*?)\[\/b\])is",'**$1**',$Text);
// Check for Italics text
$Text = preg_replace("(\[i\](.*?)\[\/i\])is",'_$1_',$Text);
// Check for Underline text
// $Text = preg_replace("(\[u\](.*?)\[\/u\])is",'<u>$1</u>',$Text);
// Check for strike-through text
// $Text = preg_replace("(\[s\](.*?)\[\/s\])is",'<strike>$1</strike>',$Text);
// Check for over-line text
// $Text = preg_replace("(\[o\](.*?)\[\/o\])is",'<span class="overline">$1</span>',$Text);
// Check for colored text
// $Text = preg_replace("(\[color=(.*?)\](.*?)\[\/color\])is","<span style=\"color: $1;\">$2</span>",$Text);
// Check for sized text
// $Text = preg_replace("(\[size=(.*?)\](.*?)\[\/size\])is","<span style=\"font-size: $1;\">$2</span>",$Text);
// Check for list text
// $Text = preg_replace("/\[list\](.*?)\[\/list\]/is", '<ul class="listbullet">$1</ul>' ,$Text);
// $Text = preg_replace("/\[list=1\](.*?)\[\/list\]/is", '<ul class="listdecimal">$1</ul>' ,$Text);
// $Text = preg_replace("/\[list=i\](.*?)\[\/list\]/s",'<ul class="listlowerroman">$1</ul>' ,$Text);
// $Text = preg_replace("/\[list=I\](.*?)\[\/list\]/s", '<ul class="listupperroman">$1</ul>' ,$Text);
// $Text = preg_replace("/\[list=a\](.*?)\[\/list\]/s", '<ul class="listloweralpha">$1</ul>' ,$Text);
// $Text = preg_replace("/\[list=A\](.*?)\[\/list\]/s", '<ul class="listupperalpha">$1</ul>' ,$Text);
// $Text = preg_replace("/\[li\](.*?)\[\/li\]/s", '<li>$1</li>' ,$Text);
// $Text = preg_replace("/\[td\](.*?)\[\/td\]/s", '<td>$1</td>' ,$Text);
// $Text = preg_replace("/\[tr\](.*?)\[\/tr\]/s", '<tr>$1</tr>' ,$Text);
// $Text = preg_replace("/\[table\](.*?)\[\/table\]/s", '<table>$1</table>' ,$Text);
// $Text = preg_replace("/\[table border=1\](.*?)\[\/table\]/s", '<table border="1" >$1</table>' ,$Text);
// $Text = preg_replace("/\[table border=0\](.*?)\[\/table\]/s", '<table border="0" >$1</table>' ,$Text);
// $Text = str_replace("[*]", "<li>", $Text);
// Check for font change text
// $Text = preg_replace("(\[font=(.*?)\](.*?)\[\/font\])","<span style=\"font-family: $1;\">$2</span>",$Text);
// Declare the format for [code] layout
$Text = preg_replace_callback("/\[code\](.*?)\[\/code\]/is",'stripdcode_br_cb',$Text);
// $CodeLayout = '<code>$1</code>';
// Check for [code] text
$Text = preg_replace("/\[code\](.*?)\[\/code\]/is","```$1```", $Text);
// Declare the format for [quote] layout
// $QuoteLayout = '<blockquote>$1</blockquote>';
// Check for [quote] text
// $Text = preg_replace("/\[quote\](.*?)\[\/quote\]/is","$QuoteLayout", $Text);
// Images
// html5 video and audio
// $Text = preg_replace("/\[video\](.*?)\[\/video\]/", '<video src="$1" controls="controls" width="425" height="350"><a href="$1">$1</a></video>', $Text);
// $Text = preg_replace("/\[audio\](.*?)\[\/audio\]/", '<audio src="$1" controls="controls"><a href="$1">$1</a></audio>', $Text);
// $Text = preg_replace("/\[iframe\](.*?)\[\/iframe\]/", '<iframe src="$1" width="425" height="350"><a href="$1">$1</a></iframe>', $Text);
// [img=widthxheight]image source[/img]
// $Text = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/", '<img src="$3" style="height:{$2}px; width:{$1}px;" >', $Text);
// if (get_pconfig(local_user(), 'oembed', 'use_for_youtube' )==1){
// // use oembed for youtube links
// $Text = preg_replace("/\[youtube\]/",'[embed]',$Text);
// $Text = preg_replace("/\[\/youtube\]/",'[/embed]',$Text);
// } else {
// // Youtube extensions
// $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/",'[youtube]$1[/youtube]',$Text);
// $Text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/",'[youtube]$1[/youtube]',$Text);
// $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '<iframe width="425" height="349" src="http://www.youtube.com/embed/$1" frameborder="0" allowfullscreen></iframe>', $Text);
// }
// $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '<object width="425" height="350" type="application/x-shockwave-flash" data="http://www.youtube.com/v/$1" ><param name="movie" value="http://www.youtube.com/v/$1"></param><!--[if IE]><embed src="http://www.youtube.com/v/$1" type="application/x-shockwave-flash" width="425" height="350" /><![endif]--></object>', $Text);
// oembed tag
// $Text = oembed_bbcode2html($Text);
// If we found an event earlier, strip out all the event code and replace with a reformatted version.
// if(x($ev,'desc') && x($ev,'start')) {
// $sub = format_event_html($ev);
// $Text = preg_replace("/\[event\-description\](.*?)\[\/event\-description\]/is",$sub,$Text);
//$Text = preg_replace("/\[event\-start\](.*?)\[\/event\-start\]/is",'',$Text);
// $Text = preg_replace("/\[event\-finish\](.*?)\[\/event\-finish\]/is",'',$Text);
// $Text = preg_replace("/\[event\-location\](.*?)\[\/event\-location\]/is",'',$Text);
// $Text = preg_replace("/\[event\-adjust\](.*?)\[\/event\-adjust\]/is",'',$Text);
// }
call_hooks('bb2diaspora',$Text);
return $Text;
}

View file

@ -41,7 +41,7 @@ function bbcode($Text,$preserve_nl = false) {
// Perform URL Search // Perform URL Search
$Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\'\%\$\!\+\,]+)/", ' <a href="$2" target="external-link">$2</a>', $Text); $Text = preg_replace("/([^\]\=]|^)(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\.\=\_\~\#\%\$\!\+\,]+)/", '$1<a href="$2" target="external-link">$2</a>', $Text);
$Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/", '<a href="$1" target="external-link">$1</a>', $Text); $Text = preg_replace("/\[url\]([$URLSearchString]*)\[\/url\]/", '<a href="$1" target="external-link">$1</a>', $Text);
$Text = preg_replace("(\[url\=([$URLSearchString]*)\](.*?)\[/url\])", '<a href="$1" target="external-link">$2</a>', $Text); $Text = preg_replace("(\[url\=([$URLSearchString]*)\](.*?)\[/url\])", '<a href="$1" target="external-link">$2</a>', $Text);
@ -134,7 +134,7 @@ function bbcode($Text,$preserve_nl = false) {
// Youtube extensions // Youtube extensions
$Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/",'[youtube]$1[/youtube]',$Text); $Text = preg_replace("/\[youtube\]https?:\/\/www.youtube.com\/watch\?v\=(.*?)\[\/youtube\]/",'[youtube]$1[/youtube]',$Text);
$Text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/",'[youtube]$1[/youtube]',$Text); $Text = preg_replace("/\[youtube\]https?:\/\/youtu.be\/(.*?)\[\/youtube\]/",'[youtube]$1[/youtube]',$Text);
$Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '<iframe width="425" height="349" src="http://www.youtube.com/embed/$1" frameborder="0" allowfullscreen></iframe>', $Text); $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '<iframe width="425" height="349" src="http://www.youtube.com/embed/$1" frameborder="0" ></iframe>', $Text);
} }
// $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '<object width="425" height="350" type="application/x-shockwave-flash" data="http://www.youtube.com/v/$1" ><param name="movie" value="http://www.youtube.com/v/$1"></param><!--[if IE]><embed src="http://www.youtube.com/v/$1" type="application/x-shockwave-flash" width="425" height="350" /><![endif]--></object>', $Text); // $Text = preg_replace("/\[youtube\](.*?)\[\/youtube\]/", '<object width="425" height="350" type="application/x-shockwave-flash" data="http://www.youtube.com/v/$1" ><param name="movie" value="http://www.youtube.com/v/$1"></param><!--[if IE]><embed src="http://www.youtube.com/v/$1" type="application/x-shockwave-flash" width="425" height="350" /><![endif]--></object>', $Text);

View file

@ -46,10 +46,11 @@ function contact_reputation($current) {
} }
function contact_poll_interval($current) { function contact_poll_interval($current, $disabled = false) {
$dis = (($disabled) ? ' disabled="disabled" ' : '');
$o = ''; $o = '';
$o .= '<select id="contact-poll-interval" name="poll" />' . "\r\n"; $o .= "<select id=\"contact-poll-interval\" name=\"poll\" $dis />" . "\r\n";
$rep = array( $rep = array(
0 => t('Frequently'), 0 => t('Frequently'),
@ -67,3 +68,13 @@ function contact_poll_interval($current) {
$o .= "</select>\r\n"; $o .= "</select>\r\n";
return $o; return $o;
} }
function network_to_name($s) {
call_hooks('network_to_name', $s);
return str_replace(array(NETWORK_DFRN,NETWORK_OSTATUS,NETWORK_FEED,NETWORK_MAIL,NETWORK_DIASPORA,NETWORK_FACEBOOK,NETWORK_ZOT),
array(t('Friendika'),t('OStatus'),t('RSS/Atom'),t('Email'),t('Diaspora'),t('Facebook'),t('Zot!')),$s);
}

View file

@ -2,6 +2,74 @@
require_once('include/crypto.php'); require_once('include/crypto.php');
require_once('include/items.php'); require_once('include/items.php');
require_once('include/bb2diaspora.php');
function diaspora_dispatch($importer,$msg) {
$parsed_xml = parse_xml_string($msg['message'],false);
$xmlbase = $parsed_xml->post;
if($xmlbase->request) {
diaspora_request($importer,$xmlbase->request);
}
elseif($xmlbase->status_message) {
diaspora_post($importer,$xmlbase->status_message);
}
elseif($xmlbase->comment) {
diaspora_comment($importer,$xmlbase->comment,$msg);
}
elseif($xmlbase->like) {
diaspora_like($importer,$xmlbase->like,$msg);
}
elseif($xmlbase->retraction) {
diaspora_retraction($importer,$xmlbase->retraction,$msg);
}
elseif($xmlbase->photo) {
diaspora_photo($importer,$xmlbase->photo,$msg);
}
else {
logger('diaspora_dispatch: unknown message type: ' . print_r($xmlbase,true));
}
return;
}
function diaspora_get_contact_by_handle($uid,$handle) {
$r = q("SELECT * FROM `contact` WHERE `network` = '%s' AND `uid` = %d AND `addr` = '%s' LIMIT 1",
dbesc(NETWORK_DIASPORA),
intval($uid),
dbesc($handle)
);
if($r && count($r))
return $r[0];
return false;
}
function find_diaspora_person_by_handle($handle) {
$r = q("select * from fcontact where network = '%s' and addr = '%s' limit 1",
dbesc(NETWORK_DIASPORA),
dbesc($handle)
);
if(count($r)) {
// update record occasionally so it doesn't get stale
$d = strtotime($r[0]['updated'] . ' +00:00');
if($d < strtotime('now - 14 days')) {
q("delete from fcontact where id = %d limit 1",
intval($r[0]['id'])
);
}
else
return $r[0];
}
require_once('include/Scrape.php');
$r = probe_url($handle, PROBE_DIASPORA);
if((count($r)) && ($r['network'] === NETWORK_DIASPORA)) {
add_fcontact($r);
return ($r);
}
return false;
}
function get_diaspora_key($uri) { function get_diaspora_key($uri) {
logger('Fetching diaspora key for: ' . $uri); logger('Fetching diaspora key for: ' . $uri);
@ -13,16 +81,6 @@ function get_diaspora_key($uri) {
} }
function diaspora_base_message($type,$data) {
$tpl = get_markup_template('diaspora_' . $type . '.tpl');
if(! $tpl)
return '';
return replace_macros($tpl,$data);
}
function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) { function diaspora_msg_build($msg,$user,$contact,$prvkey,$pubkey) {
$a = get_app(); $a = get_app();
@ -262,42 +320,6 @@ function diaspora_decode($importer,$xml) {
} }
function diaspora_get_contact_by_handle($uid,$handle) {
$r = q("SELECT * FROM `contact` WHERE `network` = '%s' AND `uid` = %d AND `addr` = '%s' LIMIT 1",
dbesc(NETWORK_DIASPORA),
intval($uid),
dbesc($handle)
);
if($r && count($r))
return $r[0];
return false;
}
function find_diaspora_person_by_handle($handle) {
$r = q("select * from fcontact where network = '%s' and addr = '%s' limit 1",
dbesc(NETWORK_DIASPORA),
dbesc($handle)
);
if(count($r)) {
// update record occasionally so it doesn't get stale
$d = strtotime($r[0]['updated'] . ' +00:00');
if($d < strtotime('now - 14 days')) {
q("delete from fcontact where id = %d limit 1",
intval($r[0]['id'])
);
}
else
return $r[0];
}
require_once('include/Scrape.php');
$r = probe_url($handle, PROBE_DIASPORA);
if((count($r)) && ($r['network'] === NETWORK_DIASPORA)) {
add_fcontact($r);
return ($r);
}
return false;
}
function diaspora_request($importer,$xml) { function diaspora_request($importer,$xml) {
@ -413,32 +435,7 @@ function diaspora_post($importer,$xml) {
$created = unxmlify($xml->created_at); $created = unxmlify($xml->created_at);
$private = ((unxmlify($xml->public) == 'false') ? 1 : 0); $private = ((unxmlify($xml->public) == 'false') ? 1 : 0);
$body = unxmlify($xml->raw_message); $body = diaspora2bb($xml->raw_message);
require_once('library/HTMLPurifier.auto.php');
require_once('include/html2bbcode.php');
$maxlen = get_max_import_size();
if($maxlen && (strlen($body) > $maxlen))
$body = substr($body,0, $maxlen);
if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) {
$body = preg_replace('#<object[^>]+>.+?' . 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?</object>#s',
'[youtube]$1[/youtube]', $body);
$body = preg_replace('#<iframe[^>].+?' . 'http://www.youtube.com/embed/([A-Za-z0-9\-_=]+).+?</iframe>#s',
'[youtube]$1[/youtube]', $body);
$body = oembed_html2bbcode($body);
$config = HTMLPurifier_Config::createDefault();
$config->set('Cache.DefinitionImpl', null);
$purifier = new HTMLPurifier($config);
$body = $purifier->purify($body);
$body = html2bbcode($body);
}
$datarray = array(); $datarray = array();
$datarray['uid'] = $importer['uid']; $datarray['uid'] = $importer['uid'];
@ -522,7 +519,7 @@ function diaspora_comment($importer,$xml,$msg) {
if($parent_author_signature) { if($parent_author_signature) {
$owner_signed_data = $guid . ';' . $parent_guid . ';' . $text . ';' . $msg['author']; $owner_signed_data = $guid . ';' . $parent_guid . ';' . $text . ';' . $diaspora_handle;
$parent_author_signature = base64_decode($parent_author_signature); $parent_author_signature = base64_decode($parent_author_signature);
@ -536,32 +533,7 @@ function diaspora_comment($importer,$xml,$msg) {
// Phew! Everything checks out. Now create an item. // Phew! Everything checks out. Now create an item.
require_once('library/HTMLPurifier.auto.php'); $body = diaspora2bb($text);
require_once('include/html2bbcode.php');
$body = $text;
$maxlen = get_max_import_size();
if($maxlen && (strlen($body) > $maxlen))
$body = substr($body,0, $maxlen);
if((strpos($body,'<') !== false) || (strpos($body,'>') !== false)) {
$body = preg_replace('#<object[^>]+>.+?' . 'http://www.youtube.com/((?:v|cp)/[A-Za-z0-9\-_=]+).+?</object>#s',
'[youtube]$1[/youtube]', $body);
$body = preg_replace('#<iframe[^>].+?' . 'http://www.youtube.com/embed/([A-Za-z0-9\-_=]+).+?</iframe>#s',
'[youtube]$1[/youtube]', $body);
$body = oembed_html2bbcode($body);
$config = HTMLPurifier_Config::createDefault();
$config->set('Cache.DefinitionImpl', null);
$purifier = new HTMLPurifier($config);
$body = $purifier->purify($body);
$body = html2bbcode($body);
}
$message_id = $diaspora_handle . ':' . $guid; $message_id = $diaspora_handle . ':' . $guid;
@ -596,13 +568,67 @@ function diaspora_comment($importer,$xml,$msg) {
dbesc(base64_encode($author_signature)), dbesc(base64_encode($author_signature)),
dbesc($diaspora_handle) 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.
proc_run('php','include/notifier.php','comment',$message_id);
}
return;
}
function diaspora_photo($importer,$xml,$msg) {
$remote_photo_path = notags(unxmlify($xml->remote_photo_path));
$remote_photo_name = notags(unxmlify($xml->remote_photo_name));
$status_message_guid = notags(unxmlify($xml->status_message_guid));
$guid = notags(unxmlify($xml->guid));
$diaspora_handle = notags(unxmlify($xml->diaspora_handle));
$public = notags(unxmlify($xml->public));
$created_at = notags(unxmlify($xml_created_at));
$contact = diaspora_get_contact_by_handle($importer['uid'],$msg['author']);
if(! $contact)
return;
if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) {
logger('diaspora_photo: Ignoring this author.');
http_status_exit(202);
// NOTREACHED
} }
// notify others $r = q("SELECT * FROM `item` WHERE `uid` = %d AND `guid` = '%s' LIMIT 1",
return; intval($importer['uid']),
dbesc($status_message_guid)
);
if(! count($r)) {
logger('diaspora_photo: parent item not found: parent: ' . $parent_guid . ' item: ' . $guid);
return;
}
$parent_item = $r[0];
$link_text = '[img]' . $remote_photo_path . $remote_photo_name . '[/img]' . "\n";
$r = q("update item set `body` = '%s' where `id` = %d and `uid` = %d limit 1",
dbesc($link_text . $parent_item['body']),
intval($parent_item['id']),
intval($parent_item['uid'])
);
return;
} }
function diaspora_like($importer,$xml,$msg) { function diaspora_like($importer,$xml,$msg) {
$a = get_app(); $a = get_app();
@ -689,7 +715,8 @@ function diaspora_like($importer,$xml,$msg) {
} }
if($parent_author_signature) { if($parent_author_signature) {
$owner_signed_data = $guid . ';' . $parent_guid . ';' . $target_type . ';' . $positive . ';' . $msg['author']; // $owner_signed_data = $guid . ';' . $parent_guid . ';' . $target_type . ';' . $positive . ';' . $msg['author'];
$owner_signed_data = $guid . ';' . $parent_guid . ';' . $target_type . ';' . $positive . ';' . $diaspora_handle;
$parent_author_signature = base64_decode($parent_author_signature); $parent_author_signature = base64_decode($parent_author_signature);
@ -768,7 +795,12 @@ EOT;
); );
} }
// FIXME send notification // 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.
if(! $parent_author_signature)
proc_run('php','include/notifier.php','comment',$message_id);
return; return;
} }
@ -777,19 +809,32 @@ function diaspora_retraction($importer,$xml) {
$guid = notags(unxmlify($xml->guid)); $guid = notags(unxmlify($xml->guid));
$diaspora_handle = notags(unxmlify($xml->diaspora_handle)); $diaspora_handle = notags(unxmlify($xml->diaspora_handle));
$type = notags(unxmlify($xml->type));
$contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle); $contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle);
if(! $contact) if(! $contact)
return; return;
// if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { if($type === 'Person') {
// logger('diaspora_retraction: Ignoring this author.'); contact_remove($contact['id']);
// http_status_exit(202); }
// // NOTREACHED elseif($type === 'Post') {
// } $r = q("select * from item where guid = '%s' and uid = %d limit 1",
dbesc('guid'),
intval($importer['uid'])
);
if(count($r)) {
if(link_compare($r[0]['author-link'],$contact['url'])) {
q("update item set `deleted` = 1, `changed` = '%s' where `id` = %d limit 1",
dbesc(datetime_convert()),
intval($r[0]['id'])
);
}
}
}
http_exit_status(202);
// NOTREACHED
} }
function diaspora_share($me,$contact) { function diaspora_share($me,$contact) {
@ -805,20 +850,54 @@ function diaspora_share($me,$contact) {
$slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$me,$contact,$me['prvkey'],$contact['pubkey']))); $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$me,$contact,$me['prvkey'],$contact['pubkey'])));
post_url($contact['notify'] . '/',$slap); return(diaspora_transmit($owner,$contact,$slap));
$return_code = $a->get_curl_code();
logger('diaspora_send_share: returns: ' . $return_code);
return $return_code;
} }
function diaspora_unshare($me,$contact) {
$a = get_app();
$myaddr = $me['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
$tpl = get_markup_template('diaspora_retract.tpl');
$msg = replace_macros($tpl, array(
'$guid' => $me['guid'],
'$type' => 'Person',
'$handle' => $myaddr
));
$slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$me,$contact,$me['prvkey'],$contact['pubkey'])));
return(diaspora_transmit($owner,$contact,$slap));
}
function diaspora_send_status($item,$owner,$contact) { function diaspora_send_status($item,$owner,$contact) {
$a = get_app(); $a = get_app();
$myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3); $myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
$theiraddr = $contact['addr']; $theiraddr = $contact['addr'];
require_once('include/bbcode.php');
$body = xmlify(bbcode($item['body'])); $images = array();
$body = $item['body'];
$cnt = preg_match_all('|\[img\](.*?)\[\/img\]|',$body,$matches,PREG_SET_ORDER);
if($cnt) {
foreach($matches as $mtch) {
$detail = array();
$detail['str'] = $mtch[0];
$detail['path'] = dirname($mtch[1]) . '/';
$detail['file'] = basename($mtch[1]);
$detail['guid'] = $item['guid'];
$detail['handle'] = $myaddr;
$images[] = $detail;
$body = str_replace($detail['str'],t('link'),$body);
}
}
$body = xmlify(bb2diaspora($body));
$public = (($item['private']) ? 'false' : 'true'); $public = (($item['private']) ? 'false' : 'true');
require_once('include/datetime.php'); require_once('include/datetime.php');
@ -833,17 +912,59 @@ function diaspora_send_status($item,$owner,$contact) {
'$created' => $created '$created' => $created
)); ));
logger('diaspora_send_status: base message: ' . $msg, LOGGER_DATA); logger('diaspora_send_status: ' . $owner['username'] . ' -> ' . $contact['name'] . ' base message: ' . $msg, LOGGER_DATA);
$slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey']))); $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
post_url($contact['notify'] . '/',$slap); $return_code = diaspora_transmit($owner,$contact,$slap);
$return_code = $a->get_curl_code();
logger('diaspora_send_status: returns: ' . $return_code); if(count($images)) {
diaspora_send_images($item,$owner,$contact,$images);
}
return $return_code; return $return_code;
} }
function diaspora_send_images($item,$owner,$contact,$images) {
$a = get_app();
if(! count($images))
return;
$mysite = substr($a->get_baseurl(),strpos($a->get_baseurl(),'://') + 3) . '/photo';
$tpl = get_markup_template('diaspora_photo.tpl');
foreach($images as $image) {
if(! stristr($image['path'],$mysite))
continue;
$resource = str_replace('.jpg','',$image['file']);
$resource = substr($resource,0,strpos($resource,'-'));
$r = q("select * from photo where `resource-id` = '%s' and `uid` = %d limit 1",
dbesc($resource),
intval($owner['uid'])
);
if(! count($r))
continue;
$public = (($r[0]['allow_cid'] || $r[0]['allow_gid'] || $r[0]['deny_cid'] || $r[0]['deny_gid']) ? 'false' : 'true' );
$msg = replace_macros($tpl,array(
'$path' => xmlify($image['path']),
'$filename' => xmlify($image['file']),
'$msg_guid' => xmlify($image['guid']),
'$guid' => xmlify($r[0]['guid']),
'$handle' => xmlify($image['handle']),
'$public' => xmlify($public),
'$created_at' => xmlify(datetime_convert('UTC','UTC',$r[0]['created'],'Y-m-d h:i:s \U\T\C'))
));
logger('diaspora_send_photo: base message: ' . $msg, LOGGER_DATA);
$slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
diaspora_transmit($owner,$contact,$slap);
}
}
function diaspora_send_followup($item,$owner,$contact) { function diaspora_send_followup($item,$owner,$contact) {
$a = get_app(); $a = get_app();
@ -869,16 +990,16 @@ function diaspora_send_followup($item,$owner,$contact) {
$like = false; $like = false;
} }
$text = bbcode($item['body']); $text = bb2diaspora($item['body']);
// sign it // sign it
if($like) if($like)
$signed_text = $item['guid'] . ';' . $target_type . ';' . $positive . ';' . $myaddr; $signed_text = $item['guid'] . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $myaddr;
else else
$signed_text = $item['guid'] . ';' . $parent_guid . ';' . $text . ';' . $myaddr; $signed_text = $item['guid'] . ';' . $parent_guid . ';' . $text . ';' . $myaddr;
$authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey']),'sha'); $authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha'));
$msg = replace_macros($tpl,array( $msg = replace_macros($tpl,array(
'$guid' => xmlify($item['guid']), '$guid' => xmlify($item['guid']),
@ -894,11 +1015,7 @@ function diaspora_send_followup($item,$owner,$contact) {
$slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey']))); $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
post_url($contact['notify'] . '/',$slap); return(diaspora_transmit($owner,$contact,$slap));
$return_code = $a->get_curl_code();
logger('diaspora_send_followup: returns: ' . $return_code);
return $return_code;
} }
@ -937,7 +1054,7 @@ function diaspora_send_relay($item,$owner,$contact) {
$like = false; $like = false;
} }
$text = bbcode($item['body']); $text = bb2diaspora($item['body']);
// sign it // sign it
@ -970,10 +1087,7 @@ function diaspora_send_relay($item,$owner,$contact) {
$slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey']))); $slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
post_url($contact['notify'] . '/',$slap); return(diaspora_transmit($owner,$contact,$slap));
$return_code = $a->get_curl_code();
logger('diaspora_send_relay: returns: ' . $return_code);
return $return_code;
} }
@ -981,8 +1095,42 @@ function diaspora_send_relay($item,$owner,$contact) {
function diaspora_send_retraction($item,$owner,$contact) { function diaspora_send_retraction($item,$owner,$contact) {
$a = get_app();
$myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
$tpl = get_markup_template('diaspora_retract.tpl');
$msg = replace_macros($tpl, array(
'$guid' => $item['guid'],
'$type' => 'Post',
'$handle' => $myaddr
));
$slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'])));
return(diaspora_transmit($owner,$contact,$slap));
}
function diaspora_transmit($owner,$contact,$slap) {
} $a = get_app();
post_url($contact['notify'] . '/',$slap);
$return_code = $a->get_curl_code();
logger('diaspora_transmit: returns: ' . $return_code);
if(! $return_code) {
logger('diaspora_transmit: queue message');
// queue message for redelivery
q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`)
VALUES ( %d, '%s', '%s', '%s') ",
intval($contact['id']),
dbesc(datetime_convert()),
dbesc(datetime_convert()),
dbesc($slap)
);
}
return(($return_code) ? $return_code : (-1));
}

View file

@ -124,9 +124,10 @@ function group_public_members($gid) {
$r = q("SELECT `contact`.`id` AS `contact-id` FROM `group_member` $r = q("SELECT `contact`.`id` AS `contact-id` FROM `group_member`
LEFT JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id` LEFT JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id`
WHERE `gid` = %d AND `group_member`.`uid` = %d WHERE `gid` = %d AND `group_member`.`uid` = %d
AND `contact`.`network` != 'dfrn' AND `contact`.`network` != 'mail' AND `contact`.`network` != 'face' ", AND ( `contact`.`network` = '%s' OR `contact`.`notify` = '' )",
intval($gid), intval($gid),
intval(local_user()) intval(local_user()),
dbesc(NETWORK_OSTATUS)
); );
if(count($r)) if(count($r))
$ret = count($r); $ret = count($r);

View file

@ -12,6 +12,18 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
if(! strlen($owner_nick)) if(! strlen($owner_nick))
killme(); killme();
$public_feed = (($dfrn_id) ? false : true);
$starred = false;
$converse = false;
if($public_feed && $a->argc > 2) {
for($x = 2; $x < $a->argc; $x++) {
if($a->argv[$x] == 'converse')
$converse = true;
}
}
$sql_extra = " AND `allow_cid` = '' AND `allow_gid` = '' AND `deny_cid` = '' AND `deny_gid` = '' "; $sql_extra = " AND `allow_cid` = '' AND `allow_gid` = '' AND `deny_cid` = '' AND `deny_gid` = '' ";
$r = q("SELECT `contact`.*, `user`.`uid` AS `user_uid`, `user`.`nickname`, `user`.`timezone` $r = q("SELECT `contact`.*, `user`.`uid` AS `user_uid`, `user`.`nickname`, `user`.`timezone`
@ -29,7 +41,7 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
$birthday = feed_birthday($owner_id,$owner['timezone']); $birthday = feed_birthday($owner_id,$owner['timezone']);
if(strlen($dfrn_id)) { if(! $public_feed) {
$sql_extra = ''; $sql_extra = '';
switch($direction) { switch($direction) {
@ -81,7 +93,7 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
); );
} }
if($dfrn_id === '' || $dfrn_id === '*') if($public_feed)
$sort = 'DESC'; $sort = 'DESC';
else else
$sort = 'ASC'; $sort = 'ASC';
@ -89,6 +101,11 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
if(! strlen($last_update)) if(! strlen($last_update))
$last_update = 'now -30 days'; $last_update = 'now -30 days';
if($public_feed) {
if(! $converse)
$sql_extra .= " AND `contact`.`self` = 1 ";
}
$check_date = datetime_convert('UTC','UTC',$last_update,'Y-m-d H:i:s'); $check_date = datetime_convert('UTC','UTC',$last_update,'Y-m-d H:i:s');
$r = q("SELECT `item`.*, `item`.`id` AS `item_id`, $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
@ -152,7 +169,7 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
// public feeds get html, our own nodes use bbcode // public feeds get html, our own nodes use bbcode
if($dfrn_id === '') { if($public_feed) {
$type = 'html'; $type = 'html';
// catch any email that's in a public conversation and make sure it doesn't leak // catch any email that's in a public conversation and make sure it doesn't leak
if($item['private']) if($item['private'])
@ -1556,7 +1573,7 @@ function subscribe_to_hub($url,$importer,$contact) {
intval($importer['uid']) intval($importer['uid'])
); );
} }
if(! count($r)) if((! count($r)) || $contact['network'] === NETWORK_DIASPORA)
return; return;
$push_url = get_config('system','url') . '/pubsub/' . $r[0]['nickname'] . '/' . $contact['id']; $push_url = get_config('system','url') . '/pubsub/' . $r[0]['nickname'] . '/' . $contact['id'];

View file

@ -508,7 +508,7 @@ function fetch_xrd_links($url) {
$xrd_timeout = intval(get_config('system','xrd_timeout')); $xrd_timeout = intval(get_config('system','xrd_timeout'));
$redirects = 0; $redirects = 0;
$xml = fetch_url($url,false,$redirects,(($xrd_timeout) ? $xrd_timeout : 30)); $xml = fetch_url($url,false,$redirects,(($xrd_timeout) ? $xrd_timeout : 20));
logger('fetch_xrd_links: ' . $xml, LOGGER_DATA); logger('fetch_xrd_links: ' . $xml, LOGGER_DATA);
@ -536,7 +536,7 @@ function fetch_xrd_links($url) {
$aliases = array($alias); $aliases = array($alias);
else else
$aliases = $alias; $aliases = $alias;
if($aliases && count($aliases)) { if(is_array($aliases) && count($aliases)) {
foreach($aliases as $alias) { foreach($aliases as $alias) {
$links[]['@attributes'] = array('rel' => 'alias' , 'href' => $alias); $links[]['@attributes'] = array('rel' => 'alias' , 'href' => $alias);
} }

View file

@ -139,7 +139,7 @@ function notifier_run($argv, $argc){
$hub = get_config('system','huburl'); $hub = get_config('system','huburl');
// If this is a public conversation, notify the feed hub // If this is a public conversation, notify the feed hub
$notify_hub = true; $public_message = true;
// fill this in with a single salmon slap if applicable // fill this in with a single salmon slap if applicable
$slap = ''; $slap = '';
@ -150,10 +150,40 @@ function notifier_run($argv, $argc){
$parent = $items[0]; $parent = $items[0];
if($parent['wall'] == 0 && (! $expire)) { // This is IMPORTANT!!!!
// We will only send a "notify owner to relay" or followup message if the referenced post
// originated on our system by virtue of having our hostname somewhere
// in the URI, AND it was a comment (not top_level) AND the parent originated elsewhere.
// if $parent['wall'] == 1 we will already have the parent message in our array
// and we will relay the whole lot.
// expire sends an entire group of expire messages and cannot be forwarded.
// However the conversation owner will be a part of the conversation and will
// be notified during this run.
// Other DFRN conversation members will be alerted during polled updates.
// Diaspora members currently are not notified of expirations, and other networks have
// either limited or no ability to process deletions. We should at least fix Diaspora
// by stringing togther an array of retractions and sending them onward.
$localhost = $a->get_hostname();
if(strpos($localhost,':'))
$localhost = substr($localhost,0,strpos($localhost,':'));
/**
*
* Be VERY CAREFUL if you make any changes to the following line. Seemingly innocuous changes
* have been known to cause runaway conditions which affected several servers, along with
* permissions issues.
*
*/
if((! $top_level) && ($parent['wall'] == 0) && (! $expire) && (stristr($target_item['uri'],$localhost))) {
// local followup to remote post // local followup to remote post
$followup = true; $followup = true;
$notify_hub = false; // not public $public_message = false; // not public
$conversant_str = dbesc($parent['contact-id']); $conversant_str = dbesc($parent['contact-id']);
} }
else { else {
@ -163,7 +193,7 @@ function notifier_run($argv, $argc){
|| (strlen($parent['allow_gid'])) || (strlen($parent['allow_gid']))
|| (strlen($parent['deny_cid'])) || (strlen($parent['deny_cid']))
|| (strlen($parent['deny_gid']))) { || (strlen($parent['deny_gid']))) {
$notify_hub = false; // private recipients, not public $public_message = false; // private recipients, not public
} }
$allow_people = expand_acl($parent['allow_cid']); $allow_people = expand_acl($parent['allow_cid']);
@ -177,7 +207,7 @@ function notifier_run($argv, $argc){
$recipients[] = $item['contact-id']; $recipients[] = $item['contact-id'];
$conversants[] = $item['contact-id']; $conversants[] = $item['contact-id'];
// pull out additional tagged people to notify (if public message) // pull out additional tagged people to notify (if public message)
if($notify_hub && strlen($item['inform'])) { if($public_message && strlen($item['inform'])) {
$people = explode(',',$item['inform']); $people = explode(',',$item['inform']);
foreach($people as $person) { foreach($people as $person) {
if(substr($person,0,4) === 'cid:') { if(substr($person,0,4) === 'cid:') {
@ -241,7 +271,7 @@ function notifier_run($argv, $argc){
)); ));
if($cmd === 'mail') { if($cmd === 'mail') {
$notify_hub = false; // mail is not public $public_message = false; // mail is not public
$body = fix_private_photos($item['body'],$owner['uid']); $body = fix_private_photos($item['body'],$owner['uid']);
@ -257,7 +287,7 @@ function notifier_run($argv, $argc){
)); ));
} }
elseif($cmd === 'suggest') { elseif($cmd === 'suggest') {
$notify_hub = false; // suggestions are not public $public_message = false; // suggestions are not public
$sugg_template = get_markup_template('atom_suggest.tpl'); $sugg_template = get_markup_template('atom_suggest.tpl');
@ -296,7 +326,7 @@ function notifier_run($argv, $argc){
// private emails may be in included in public conversations. Filter them. // private emails may be in included in public conversations. Filter them.
if(($notify_hub) && $item['private']) if(($public_message) && $item['private'])
continue; continue;
$contact = get_item_contact($item,$contacts); $contact = get_item_contact($item,$contacts);
@ -305,7 +335,7 @@ function notifier_run($argv, $argc){
$atom .= atom_entry($item,'text',$contact,$owner,true); $atom .= atom_entry($item,'text',$contact,$owner,true);
if(($top_level) && ($notify_hub) && ($item['author-link'] === $item['owner-link']) && (! $expire)) if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire))
$slaps[] = atom_entry($item,'html',$contact,$owner,true); $slaps[] = atom_entry($item,'html',$contact,$owner,true);
} }
} }
@ -403,7 +433,7 @@ function notifier_run($argv, $argc){
// only send salmon if public - e.g. if it's ok to notify // only send salmon if public - e.g. if it's ok to notify
// a public hub, it's ok to send a salmon // a public hub, it's ok to send a salmon
if((count($slaps)) && ($notify_hub) && (! $expire)) { if((count($slaps)) && ($public_message) && (! $expire)) {
logger('notifier: slapdelivery: ' . $contact['name']); logger('notifier: slapdelivery: ' . $contact['name']);
foreach($slaps as $slappy) { foreach($slaps as $slappy) {
if($contact['notify']) { if($contact['notify']) {
@ -505,12 +535,15 @@ function notifier_run($argv, $argc){
require_once('include/diaspora.php'); require_once('include/diaspora.php');
if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode))
break; break;
if(! $contact['pubkey'])
break;
if($target_item['verb'] === ACTIVITY_DISLIKE) { if($target_item['verb'] === ACTIVITY_DISLIKE) {
// unsupported // unsupported
break; break;
} }
elseif($target_item['deleted'] && (! $parent_item['verb'] === ACTIVITY_LIKE)) { elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) {
// diaspora delete, // diaspora delete,
diaspora_send_retraction($target_item,$owner,$contact); diaspora_send_retraction($target_item,$owner,$contact);
break; break;
@ -544,7 +577,7 @@ function notifier_run($argv, $argc){
// send additional slaps to mentioned remote tags (@foo@example.com) // send additional slaps to mentioned remote tags (@foo@example.com)
if($slap && count($url_recipients) && ($followup || $top_level) && $notify_hub && (! $expire)) { if($slap && count($url_recipients) && ($followup || $top_level) && $public_message && (! $expire)) {
if(! get_config('system','dfrn_only')) { if(! get_config('system','dfrn_only')) {
foreach($url_recipients as $url) { foreach($url_recipients as $url) {
if($url) { if($url) {
@ -556,7 +589,7 @@ function notifier_run($argv, $argc){
} }
} }
if((strlen($hub)) && ($notify_hub)) { if((strlen($hub)) && ($public_message)) {
$hubs = explode(',', $hub); $hubs = explode(',', $hub);
if(count($hubs)) { if(count($hubs)) {
foreach($hubs as $h) { foreach($hubs as $h) {
@ -572,12 +605,12 @@ function notifier_run($argv, $argc){
} }
} }
if($notify_hub) { if($public_message) {
/** /**
* *
* If you have less than 999 dfrn friends and it's a public message, * If you have less than 999 dfrn friends and it's a public message,
* we'll just go ahead and push them out securely with dfrn/rino. * we'll just go ahead and push them out securely with dfrn/rino or Diaspora.
* If you've got more than that, you'll have to rely on PuSH delivery. * If you've got more than that, you'll have to rely on PuSH delivery.
* *
*/ */
@ -592,9 +625,10 @@ function notifier_run($argv, $argc){
*/ */
$r = q("SELECT `id`, `name` FROM `contact` $r = q("SELECT `id`, `name` FROM `contact`
WHERE `network` = '%s' AND `uid` = %d AND `blocked` = 0 AND `pending` = 0 WHERE `network` in ('%s','%s') AND `uid` = %d AND `blocked` = 0 AND `pending` = 0
AND `rel` != %d ", AND `rel` != %d ",
dbesc(NETWORK_DFRN), dbesc(NETWORK_DFRN),
dbesc(NETWORK_DIASPORA),
intval($owner['uid']), intval($owner['uid']),
intval(CONTACT_IS_SHARING) intval(CONTACT_IS_SHARING)
); );
@ -607,19 +641,66 @@ function notifier_run($argv, $argc){
/* Don't deliver to folks who have already been delivered to */ /* Don't deliver to folks who have already been delivered to */
if(! in_array($rr['id'], $conversants)) { if(in_array($rr['id'],$conversants)) {
$n = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1", logger('notifier: already delivered id=' . $rr['id']);
intval($rr['id']) continue;
); }
if(count($n)) { $n = q("SELECT * FROM `contact` WHERE `id` = %d LIMIT 1",
intval($rr['id'])
);
if(count($n)) {
$contact = $n[0];
logger('pubdeliver: network: ' . $contact['network']);
switch($contact['network']) {
case NETWORK_DFRN :
logger('notifier: dfrnpubdelivery: ' . $contact['name']);
$deliver_status = dfrn_deliver($owner,$contact,$atom);
break;
case NETWORK_DIASPORA :
require_once('include/diaspora.php');
logger('notifier: diaspora pubdelivery: ' . $contact['name']);
if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) {
logger('notifier: diaspora pubdelivery not allowed at this time');
break;
}
if(! $contact['pubkey']) {
logger('notifier: diaspora pubdelivery: no pubkey');
break;
}
logger('notifier: dfrnpubdelivery: ' . $n[0]['name']); if($target_item['verb'] === ACTIVITY_DISLIKE) {
$deliver_status = dfrn_deliver($owner,$n[0],$atom); // unsupported
break;
}
elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) {
// diaspora delete,
diaspora_send_retraction($target_item,$owner,$contact);
break;
}
elseif($followup) {
// send comments, likes and retractions of likes to owner to relay
diaspora_send_followup($target_item,$owner,$contact);
break;
}
elseif($target_item['parent'] != $target_item['id']) {
// we are the relay - send comments, likes and unlikes to our conversants
diaspora_send_relay($target_item,$owner,$contact);
break;
}
elseif($top_level) {
diaspora_send_status($target_item,$owner,$contact);
break;
}
default:
break;
} }
} }
else
logger('notifier: dfrnpubdelivery: ignoring ' . $rr['name']);
} }
} }
} }

View file

@ -82,12 +82,18 @@ function poller_run($argv, $argc){
if(! $restart) if(! $restart)
proc_run('php','include/cronhooks.php'); proc_run('php','include/cronhooks.php');
// Only poll from those with suitable relationships,
// and which have a polling address and ignore Diaspora since
// we are unable to match those posts with a Diaspora GUID and prevent duplicates.
$contacts = q("SELECT `id` FROM `contact` $contacts = q("SELECT `id` FROM `contact`
WHERE ( `rel` = %d OR `rel` = %d ) AND `poll` != '' WHERE ( `rel` = %d OR `rel` = %d ) AND `poll` != ''
AND `network` != '%s'
$sql_extra $sql_extra
AND `self` = 0 AND `blocked` = 0 AND `readonly` = 0 ORDER BY RAND()", AND `self` = 0 AND `blocked` = 0 AND `readonly` = 0 ORDER BY RAND()",
intval(CONTACT_IS_SHARING), intval(CONTACT_IS_SHARING),
intval(CONTACT_IS_FRIEND) intval(CONTACT_IS_FRIEND),
dbesc(NETWORK_DIASPORA)
); );
if(! count($contacts)) { if(! count($contacts)) {

View file

@ -29,6 +29,11 @@ function queue_run($argv, $argc){
load_hooks(); load_hooks();
if($argc > 1)
$queue_id = intval($argv[1]);
else
$queue_id = 0;
$deadguys = array(); $deadguys = array();
logger('queue: start'); logger('queue: start');
@ -44,27 +49,41 @@ function queue_run($argv, $argc){
q("DELETE FROM `queue` WHERE `created` < UTC_TIMESTAMP() - INTERVAL 3 DAY"); q("DELETE FROM `queue` WHERE `created` < UTC_TIMESTAMP() - INTERVAL 3 DAY");
} }
$r = q("SELECT `id` FROM `queue` WHERE `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE "); if($queue_id)
$r = q("SELECT `id` FROM `queue` WHERE `id` = %d LIMIT 1",
intval($queue_id)
);
else
$r = q("SELECT `id` FROM `queue` WHERE `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ");
if(! count($r)){ if(! count($r)){
return; return;
} }
call_hooks('queue_predeliver', $a, $r); if(! $queue_id)
call_hooks('queue_predeliver', $a, $r);
// delivery loop // delivery loop
require_once('include/salmon.php'); require_once('include/salmon.php');
require_once('include/diaspora.php');
foreach($r as $q_item) { foreach($r as $q_item) {
// queue_predeliver hooks may have changed the queue db details, // queue_predeliver hooks may have changed the queue db details,
// so check again if this entry still needs processing // so check again if this entry still needs processing
$qi = q("SELECT * FROM `queue` WHERE `id` = %d AND `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ", if($queue_id) {
intval($q_item['id']) $qi = q("select * from queue where `id` = %d limit 1",
); intval($queue_id)
);
}
else {
$qi = q("SELECT * FROM `queue` WHERE `id` = %d AND `last` < UTC_TIMESTAMP() - INTERVAL 15 MINUTE ",
intval($q_item['id'])
);
}
if(! count($qi)) if(! count($qi))
continue; continue;
@ -82,7 +101,8 @@ function queue_run($argv, $argc){
continue; continue;
} }
$u = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", $u = q("SELECT `user`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`
FROM `user` WHERE `uid` = %d LIMIT 1",
intval($c[0]['uid']) intval($c[0]['uid'])
); );
if(! count($u)) { if(! count($u)) {
@ -120,6 +140,18 @@ function queue_run($argv, $argc){
remove_queue_item($q_item['id']); remove_queue_item($q_item['id']);
} }
break; break;
case NETWORK_DIASPORA:
if($contact['notify']) {
logger('queue: diaspora_delivery: item ' . $q_item['id'] . ' for ' . $contact['name']);
$deliver_status = diaspora_transmit($owner,$contact,$data);
if($deliver_status == (-1))
update_queue_time($q_item['id']);
else
remove_queue_item($q_item['id']);
}
break;
default: default:
$params = array('owner' => $owner, 'contact' => $contact, 'queue' => $q_item, 'result' => false); $params = array('owner' => $owner, 'contact' => $contact, 'queue' => $q_item, 'result' => false);
call_hooks('queue_deliver', $a, $params); call_hooks('queue_deliver', $a, $params);

View file

@ -73,6 +73,13 @@ function slapper($owner,$url,$slap) {
if(! strlen($url)) if(! strlen($url))
return; return;
if(! $owner['sprvkey']) {
logger(sprintf("slapper: user '%s' (%d) does not have a salmon private key. Send failed.",
$owner['username'],$owner['uid']));
return;
}
// add all namespaces to item // add all namespaces to item
$namespaces = <<< EOT $namespaces = <<< EOT
@ -102,11 +109,11 @@ EOT;
$precomputed = '.YXBwbGljYXRpb24vYXRvbSt4bWw=.YmFzZTY0dXJs.UlNBLVNIQTI1Ng=='; $precomputed = '.YXBwbGljYXRpb24vYXRvbSt4bWw=.YmFzZTY0dXJs.UlNBLVNIQTI1Ng==';
$signature = base64url_encode(rsa_sign(str_replace('=','',$data . $precomputed),true),$owner['sprvkey']); $signature = base64url_encode(rsa_sign(str_replace('=','',$data . $precomputed),$owner['sprvkey']));
$signature2 = base64url_encode(rsa_sign($data . $precomputed),$owner['sprvkey']); $signature2 = base64url_encode(rsa_sign($data . $precomputed,$owner['sprvkey']));
$signature3 = base64url_encode(rsa_sign($data),$owner['sprvkey']); $signature3 = base64url_encode(rsa_sign($data,$owner['sprvkey']));
$salmon_tpl = get_markup_template('magicsig.tpl'); $salmon_tpl = get_markup_template('magicsig.tpl');

View file

@ -197,6 +197,7 @@ function admin_page_site_post(&$a){
$timeout = ((x($_POST,'timeout')) ? intval(trim($_POST['timeout'])) : 60); $timeout = ((x($_POST,'timeout')) ? intval(trim($_POST['timeout'])) : 60);
$dfrn_only = ((x($_POST,'dfrn_only')) ? True : False); $dfrn_only = ((x($_POST,'dfrn_only')) ? True : False);
$ostatus_disabled = !((x($_POST,'ostatus_disabled')) ? True : False); $ostatus_disabled = !((x($_POST,'ostatus_disabled')) ? True : False);
$diaspora_enabled = ((x($_POST,'diaspora_enabled')) ? True : False);
set_config('config','sitename',$sitename); set_config('config','sitename',$sitename);
@ -241,6 +242,7 @@ function admin_page_site_post(&$a){
set_config('system','curl_timeout', $timeout); set_config('system','curl_timeout', $timeout);
set_config('system','dfrn_only', $dfrn_only); set_config('system','dfrn_only', $dfrn_only);
set_config('system','ostatus_disabled', $ostatus_disabled); set_config('system','ostatus_disabled', $ostatus_disabled);
set_config('system','diaspora_enabled', $diaspora_enabled);
info( t('Site settings updated.') . EOL); info( t('Site settings updated.') . EOL);
goaway($a->get_baseurl() . '/admin/site' ); goaway($a->get_baseurl() . '/admin/site' );
@ -325,6 +327,7 @@ function admin_page_site(&$a) {
'$no_utf' => array('no_utf', t("UTF-8 Regular expressions"), !get_config('system','no_utf'), "Use PHP UTF8 regular expressions"), '$no_utf' => array('no_utf', t("UTF-8 Regular expressions"), !get_config('system','no_utf'), "Use PHP UTF8 regular expressions"),
'$no_community_page' => array('no_community_page', t("Show Community Page"), !get_config('system','no_community_page'), "Display a Community page showing all recent public postings on this site."), '$no_community_page' => array('no_community_page', t("Show Community Page"), !get_config('system','no_community_page'), "Display a Community page showing all recent public postings on this site."),
'$ostatus_disabled' => array('ostatus_disabled', t("Enable OStatus support"), !get_config('system','ostatus_disable'), "Provide built-in OStatus \x28identi.ca, status.net, etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed."), '$ostatus_disabled' => array('ostatus_disabled', t("Enable OStatus support"), !get_config('system','ostatus_disable'), "Provide built-in OStatus \x28identi.ca, status.net, etc.\x29 compatibility. All communications in OStatus are public, so privacy warnings will be occasionally displayed."),
'$diaspora_enabled' => array('diaspora_enabled', t("Enable Diaspora support"), get_config('system','diaspora_enabled'), "Provide built-in Diaspora network compatibility."),
'$dfrn_only' => array('dfrn_only', t('Only allow Friendika contacts'), get_config('system','dfrn_only'), "All contacts must use Friendika protocols. All other built-in communication protocols disabled."), '$dfrn_only' => array('dfrn_only', t('Only allow Friendika contacts'), get_config('system','dfrn_only'), "All contacts must use Friendika protocols. All other built-in communication protocols disabled."),
'$verifyssl' => array('verifyssl', t("Verify SSL"), get_config('system','verifyssl'), "If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites."), '$verifyssl' => array('verifyssl', t("Verify SSL"), get_config('system','verifyssl'), "If you wish, you can turn on strict certificate checking. This will mean you cannot connect (at all) to self-signed SSL sites."),
'$proxyuser' => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""), '$proxyuser' => array('proxyuser', t("Proxy user"), get_config('system','proxyuser'), ""),

View file

@ -163,9 +163,9 @@ function contacts_content(&$a) {
if($cmd === 'block') { if($cmd === 'block') {
$blocked = (($orig_record[0]['blocked']) ? 0 : 1); $blocked = (($orig_record[0]['blocked']) ? 0 : 1);
$r = q("UPDATE `contact` SET `blocked` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1", $r = q("UPDATE `contact` SET `blocked` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($blocked), intval($blocked),
intval($contact_id), intval($contact_id),
intval(local_user()) intval(local_user())
); );
if($r) { if($r) {
//notice( t('Contact has been ') . (($blocked) ? t('blocked') : t('unblocked')) . EOL ); //notice( t('Contact has been ') . (($blocked) ? t('blocked') : t('unblocked')) . EOL );
@ -178,9 +178,9 @@ function contacts_content(&$a) {
if($cmd === 'ignore') { if($cmd === 'ignore') {
$readonly = (($orig_record[0]['readonly']) ? 0 : 1); $readonly = (($orig_record[0]['readonly']) ? 0 : 1);
$r = q("UPDATE `contact` SET `readonly` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1", $r = q("UPDATE `contact` SET `readonly` = %d WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($readonly), intval($readonly),
intval($contact_id), intval($contact_id),
intval(local_user()) intval(local_user())
); );
if($r) { if($r) {
info( (($readonly) ? t('Contact has been ignored') : t('Contact has been unignored')) . EOL ); info( (($readonly) ? t('Contact has been ignored') : t('Contact has been unignored')) . EOL );
@ -193,7 +193,7 @@ function contacts_content(&$a) {
// create an unfollow slap // create an unfollow slap
if($orig_record[0]['network'] === 'stat') { if($orig_record[0]['network'] === NETWORK_OSTATUS) {
$tpl = get_markup_template('follow_slap.tpl'); $tpl = get_markup_template('follow_slap.tpl');
$slap = replace_macros($tpl, array( $slap = replace_macros($tpl, array(
'$name' => $a->user['username'], '$name' => $a->user['username'],
@ -215,13 +215,15 @@ function contacts_content(&$a) {
slapper($a->user,$orig_record[0]['notify'],$slap); slapper($a->user,$orig_record[0]['notify'],$slap);
} }
} }
elseif($orig_record[0]['network'] === NETWORK_DIASPORA) {
if($orig_record[0]['network'] === 'dfrn') { require_once('include/diaspora.php');
diaspora_unshare($a->user,$orig_record[0]);
}
elseif($orig_record[0]['network'] === NETWORK_DFRN) {
require_once('include/items.php'); require_once('include/items.php');
dfrn_deliver($a->user,$orig_record[0],'placeholder', 1); dfrn_deliver($a->user,$orig_record[0],'placeholder', 1);
} }
contact_remove($orig_record[0]['id']); contact_remove($orig_record[0]['id']);
info( t('Contact has been removed.') . EOL ); info( t('Contact has been removed.') . EOL );
goaway($a->get_baseurl() . '/contacts'); goaway($a->get_baseurl() . '/contacts');
@ -290,6 +292,9 @@ function contacts_content(&$a) {
$lblsuggest = (($r[0]['network'] === NETWORK_DFRN) $lblsuggest = (($r[0]['network'] === NETWORK_DFRN)
? '<div id="contact-suggest-wrapper"><a href="fsuggest/' . $r[0]['id'] . '" id="contact-suggest">' . t('Suggest friends') . '</a></div>' : ''); ? '<div id="contact-suggest-wrapper"><a href="fsuggest/' . $r[0]['id'] . '" id="contact-suggest">' . t('Suggest friends') . '</a></div>' : '');
$poll_enabled = (($r[0]['network'] !== NETWORK_DIASPORA) ? true : false);
$nettype = '<div id="contact-edit-nettype">' . sprintf( t('Network type: %s'),network_to_name($r[0]['network'])) . '</div>';
$o .= replace_macros($tpl,array( $o .= replace_macros($tpl,array(
'$header' => t('Contact Editor'), '$header' => t('Contact Editor'),
@ -310,7 +315,9 @@ function contacts_content(&$a) {
'$lblsuggest' => $lblsuggest, '$lblsuggest' => $lblsuggest,
'$grps' => $grps, '$grps' => $grps,
'$delete' => t('Delete contact'), '$delete' => t('Delete contact'),
'$poll_interval' => contact_poll_interval($r[0]['priority']), '$nettype' => $nettype,
'$poll_interval' => contact_poll_interval($r[0]['priority'],(! $poll_enabled)),
'$poll_enabled' => $poll_enabled,
'$lastupdtext' => t('Last updated: '), '$lastupdtext' => t('Last updated: '),
'$updpub' => t('Update public posts: '), '$updpub' => t('Update public posts: '),
'$last_update' => $last_update, '$last_update' => $last_update,
@ -420,11 +427,12 @@ function contacts_content(&$a) {
$o .= replace_macros($tpl, array( $o .= replace_macros($tpl, array(
'$img_hover' => sprintf( t('Visit %s\'s profile [%s]'),$rr['name'],$rr['url']), '$img_hover' => sprintf( t('Visit %s\'s profile [%s]'),$rr['name'],$rr['url']),
'$edit_hover' => t('Edit contact'), '$edit_hover' => t('Edit contact'),
'$contact_photo_menu' => contact_photo_menu($rr),
'$id' => $rr['id'], '$id' => $rr['id'],
'$alt_text' => $alt_text, '$alt_text' => $alt_text,
'$dir_icon' => $dir_icon, '$dir_icon' => $dir_icon,
'$thumb' => $rr['thumb'], '$thumb' => $rr['thumb'],
'$name' => substr($rr['name'],0,20), '$name' => $rr['name'],
'$username' => $rr['name'], '$username' => $rr['name'],
'$sparkle' => $sparkle, '$sparkle' => $sparkle,
'$url' => $url '$url' => $url

View file

@ -55,7 +55,8 @@ function openid_content(&$a) {
} }
$r = q("SELECT * FROM `user` WHERE `openid` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1", $r = q("SELECT `user`.*, `user`.`pubkey` as `upubkey`, `user`.`prvkey` as `uprvkey`
FROM `user` WHERE `openid` = '%s' AND `blocked` = 0 AND `verified` = 1 LIMIT 1",
dbesc($_SESSION['openid']) dbesc($_SESSION['openid'])
); );
if(! count($r)) { if(! count($r)) {

View file

@ -122,6 +122,12 @@ function pubsub_post(&$a) {
$contact = $r[0]; $contact = $r[0];
// we have no way to match Diaspora guid's with atom post id's and could get duplicates.
// we'll assume that direct delivery is robust (and this is a bad assumption, but the duplicates are messy).
if($r[0]['network'] === NETWORK_DIASPORA)
hub_post_return();
$feedhub = ''; $feedhub = '';
require_once('include/items.php'); require_once('include/items.php');

View file

@ -15,8 +15,6 @@ function receive_post(&$a) {
if($a->argc != 3 || $a->argv[1] !== 'users') if($a->argc != 3 || $a->argv[1] !== 'users')
http_status_exit(500); http_status_exit(500);
logger('receive: raw input: ' . file_get_contents('php://input'), LOGGER_DATA);
$guid = $a->argv[2]; $guid = $a->argv[2];
$r = q("SELECT * FROM `user` WHERE `guid` = '%s' LIMIT 1", $r = q("SELECT * FROM `user` WHERE `guid` = '%s' LIMIT 1",
@ -43,29 +41,7 @@ function receive_post(&$a) {
if(! is_array($msg)) if(! is_array($msg))
http_status_exit(500); http_status_exit(500);
diaspora_dispatch($importer,$msg);
$parsed_xml = parse_xml_string($msg['message'],false);
$xmlbase = $parsed_xml->post;
if($xmlbase->request) {
diaspora_request($importer,$xmlbase->request);
}
elseif($xmlbase->status_message) {
diaspora_post($importer,$xmlbase->status_message);
}
elseif($xmlbase->comment) {
diaspora_comment($importer,$xmlbase->comment,$msg);
}
elseif($xmlbase->like) {
diaspora_like($importer,$xmlbase->like,$msg);
}
elseif($xmlbase->retraction) {
diaspora_retraction($importer,$xmlbase->retraction,$msg);
}
else {
logger('mod-diaspora: unknown message type: ' . print_r($xmlbase,true));
}
http_status_exit(200); http_status_exit(200);
// NOTREACHED // NOTREACHED

View file

@ -1,6 +1,6 @@
<?php <?php
define( 'UPDATE_VERSION' , 1081 ); define( 'UPDATE_VERSION' , 1082 );
/** /**
* *
@ -673,4 +673,19 @@ function update_1079() {
function update_1080() { function update_1080() {
q("ALTER TABLE `fcontact` ADD `updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'"); q("ALTER TABLE `fcontact` ADD `updated` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00'");
} }
function update_1081() {
q("ALTER TABLE `photo` ADD `guid` CHAR( 64 ) NOT NULL AFTER `contact`id`,
ADD INDEX ( `guid` ) ");
$r = q("SELECT distinct(`resource-id`) FROM `photo` WHERE 1 group by `id`");
if(count($r)) {
foreach($r as $rr) {
$guid = get_guid();
q("update `photo` set `guid` = '%s' where `resource-id` = '%s'",
dbesc($guid),
dbesc($rr['resource-id'])
);
}
}
}

View file

@ -31,6 +31,7 @@
{{ inc field_checkbox.tpl with $field=$force_publish }}{{ endinc }} {{ inc field_checkbox.tpl with $field=$force_publish }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$no_community_page }}{{ endinc }} {{ inc field_checkbox.tpl with $field=$no_community_page }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$ostatus_disabled }}{{ endinc }} {{ inc field_checkbox.tpl with $field=$ostatus_disabled }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$diaspora_enabled }}{{ endinc }}
{{ inc field_checkbox.tpl with $field=$dfrn_only }}{{ endinc }} {{ inc field_checkbox.tpl with $field=$dfrn_only }}{{ endinc }}
{{ inc field_input.tpl with $field=$global_directory }}{{ endinc }} {{ inc field_input.tpl with $field=$global_directory }}{{ endinc }}

View file

@ -83,7 +83,7 @@
<poco:primary>true</poco:primary> <poco:primary>true</poco:primary>
</poco:urls> </poco:urls>
</author> </author>
<link rel="ostatus:conversation" href="$status.url"/> <link rel="ostatus:conversation" type="text/html" href="$status.url"/>
</entry> </entry>
{{ endfor }} {{ endfor }}

View file

@ -3,6 +3,8 @@
<div id="contact-edit-banner-name">$name</div> <div id="contact-edit-banner-name">$name</div>
$nettype
<form action="contacts/$contact_id" method="post" > <form action="contacts/$contact_id" method="post" >
<input type="hidden" name="contact_id" value="$contact_id"> <input type="hidden" name="contact_id" value="$contact_id">
@ -28,13 +30,14 @@
</div> </div>
<div id="contact-edit-nav-end"></div> <div id="contact-edit-nav-end"></div>
{{ if $poll_enabled }}
<div id="contact-edit-poll-wrapper"> <div id="contact-edit-poll-wrapper">
<div id="contact-edit-last-update-text">$lastupdtext<span id="contact-edit-last-updated">$last_update</span></div> <div id="contact-edit-last-update-text">$lastupdtext<span id="contact-edit-last-updated">$last_update</span></div>
<div id="contact-edit-poll-text">$updpub</div> <div id="contact-edit-poll-text">$updpub</div>
$poll_interval $poll_interval
<div id="contact-edit-update-now"><a href="contacts/$contact_id/update">$udnow</a></div> <div id="contact-edit-update-now"><a href="contacts/$contact_id/update" >$udnow</a></div>
</div> </div>
{{ endif }}
</div> </div>
<div id="contact-edit-end" ></div> <div id="contact-edit-end" ></div>

View file

@ -1,19 +1,18 @@
<div class="contact-entry-wrapper" id="contact-entry-wrapper-$id" > <div class="contact-entry-wrapper" id="contact-entry-wrapper-$id" >
<div class="contact-entry-photo-wrapper" > <div class="contact-entry-photo-wrapper" >
<div class="contact-entry-nav-wrapper" > <div class="contact-entry-photo" id="contact-entry-photo-$id"
<div class="contact-entry-direction-wrapper" > onmouseover="if (typeof t$id != 'undefined') clearTimeout(t$id); openMenu('contact-photo-menu-button-$id')" onmouseout="t$id=setTimeout('closeMenu(\'contact-photo-menu-button-$id\'); closeMenu(\'contact-photo-menu-$id\');',200)" >
<img class="contact-entry-direction-icon" src="$dir_icon" alt="$alt_text" title="$alt_text" />
</div>
<div class="contact-entry-direction-end" ></div>
<div class="contact-entry-edit-links" >
<a class="icon pencil" href="contacts/$id" class="contact-entry-edit-link" title="$edit_hover"></a>
</div>
<div class="contact-entry-edit-end"></div>
</div>
<div class="contact-entry-nav-end"></div>
<div class="contact-entry-photo" id="contact-entry-photo-$id" >
<a href="$url" title="$img_hover" /><img src="$thumb" $sparkle alt="$name" /></a> <a href="$url" title="$img_hover" /><img src="$thumb" $sparkle alt="$name" /></a>
<span onclick="openClose('contact-photo-menu-$id');" class="fakelink contact-photo-menu-button" id="contact-photo-menu-button-$id">menu</span>
<div class="contact-photo-menu" id="contact-photo-menu-$id">
<ul>
$contact_photo_menu
</ul>
</div>
</div> </div>
</div> </div>

View file

@ -380,8 +380,8 @@ $a->strings["View New Items"] = "Neue Einträge anzeigen";
$a->strings["View Any Items"] = "Alle Einträge anzeigen"; $a->strings["View Any Items"] = "Alle Einträge anzeigen";
$a->strings["View Starred Items"] = "Gesternte Einträge anzeigen"; $a->strings["View Starred Items"] = "Gesternte Einträge anzeigen";
$a->strings["Warning: This group contains %s member from an insecure network."] = array( $a->strings["Warning: This group contains %s member from an insecure network."] = array(
0 => "", 0 => "Warnung: Diese Gruppe beinhaltet %s Mitglied aus unsicheren Netzwerken.",
1 => "", 1 => "Warnung: Diese Gruppe beinhaltet %s Mitglieder aus unsicheren Netzwerken.",
); );
$a->strings["Private messages to this group are at risk of public disclosure."] = "Private Nachrichten an diese Gruppe könnten an die Öffentlichkeit geraten."; $a->strings["Private messages to this group are at risk of public disclosure."] = "Private Nachrichten an diese Gruppe könnten an die Öffentlichkeit geraten.";
$a->strings["No such group"] = "Es gibt keine solche Gruppe"; $a->strings["No such group"] = "Es gibt keine solche Gruppe";

13
view/diaspora_photo.tpl Normal file
View file

@ -0,0 +1,13 @@
<XML>
<post>
<photo>
<remote_photo_path>$path</remote_photo_path>
<remote_photo_name>$filename</remote_photo_name>
<status_message_guid>$msg_guid</status_message_guid>
<guid>$guid</guid>
<diaspora_handle>$handle</diaspora_handle>
<public>$public</public>
<created_at>$created_at</created_at>
</photo>
</post>
</XML>

File diff suppressed because it is too large Load diff

View file

@ -1,7 +1,7 @@
<?php <?php
function string_plural_select($n){ function string_plural_select($n){
return ; return ($n != 1);
} }
; ;
$a->strings["Logged out."] = "Déconnecté."; $a->strings["Logged out."] = "Déconnecté.";
@ -367,7 +367,7 @@ $a->strings["Global Directory"] = "Annuaire global";
$a->strings["Finding: "] = "Trouvé: "; $a->strings["Finding: "] = "Trouvé: ";
$a->strings["View Contacts"] = "Voir les contacts"; $a->strings["View Contacts"] = "Voir les contacts";
$a->strings["No contacts."] = "Aucun contact."; $a->strings["No contacts."] = "Aucun contact.";
$a->strings["Visit \$username's profile"] = "Visiter le profil de %s"; $a->strings["Visit \$username's profile"] = "Visiter le profil de \$username";
$a->strings["No profile"] = "Aucun profil"; $a->strings["No profile"] = "Aucun profil";
$a->strings["Tag removed"] = "Étiquette enlevée"; $a->strings["Tag removed"] = "Étiquette enlevée";
$a->strings["Remove Item Tag"] = "Enlever l'étiquette de l'élément"; $a->strings["Remove Item Tag"] = "Enlever l'étiquette de l'élément";
@ -394,7 +394,7 @@ $a->strings["(Toggle between different identities or community/group pages which
$a->strings["Select an identity to manage: "] = "Choisir une identité à gérer: "; $a->strings["Select an identity to manage: "] = "Choisir une identité à gérer: ";
$a->strings["noreply"] = "noreply"; $a->strings["noreply"] = "noreply";
$a->strings["New mail received at "] = "Nouvel email reçu à "; $a->strings["New mail received at "] = "Nouvel email reçu à ";
$a->strings["%s commented on an item at %s"] = "%s a commanté sur une publication : %s"; $a->strings["%s commented on an item at %s"] = "%s a commenté sur une publication : %s";
$a->strings["%s welcomes %s"] = "%s accueille %s"; $a->strings["%s welcomes %s"] = "%s accueille %s";
$a->strings["This introduction has already been accepted."] = "Cette introduction a déjà été acceptée."; $a->strings["This introduction has already been accepted."] = "Cette introduction a déjà été acceptée.";
$a->strings["Profile location is not valid or does not contain profile information."] = "L'emplacement du profil est invalide ou ne contient pas de profil valide."; $a->strings["Profile location is not valid or does not contain profile information."] = "L'emplacement du profil est invalide ou ne contient pas de profil valide.";
@ -676,7 +676,7 @@ $a->strings["%d member"] = array(
1 => "%d membres", 1 => "%d membres",
); );
$a->strings["Warning: This group contains %s from an insecure network."] = "Attention : ce groupe contient %s, qui se connecte depuis un réseau non-sécurisé."; $a->strings["Warning: This group contains %s from an insecure network."] = "Attention : ce groupe contient %s, qui se connecte depuis un réseau non-sécurisé.";
$a->strings["Private messages to this group are at risk of public disclosure."] = "Les messages privés envoyés à ce groupe s'exposent à une diffusion incontrôlée."; $a->strings["Private messages to this group are at risk of public disclosure."] = "es messages privés envoyés à ce groupe s'exposent à une diffusion incontrôlée.";
$a->strings["D, d M Y - g:i A"] = "D, d M Y - g:i A"; $a->strings["D, d M Y - g:i A"] = "D, d M Y - g:i A";
$a->strings["Friendika Social Network"] = "Réseau social Friendika"; $a->strings["Friendika Social Network"] = "Réseau social Friendika";
$a->strings["Installation"] = "Installation"; $a->strings["Installation"] = "Installation";
@ -689,9 +689,9 @@ $a->strings["Database Login Password"] = "Mot de passe de la base";
$a->strings["Database Name"] = "Nom de la base"; $a->strings["Database Name"] = "Nom de la base";
$a->strings["Please select a default timezone for your website"] = "Sélectionner un fuseau horaire par défaut pour votre site"; $a->strings["Please select a default timezone for your website"] = "Sélectionner un fuseau horaire par défaut pour votre site";
$a->strings["Normal Account"] = "Compte normal"; $a->strings["Normal Account"] = "Compte normal";
$a->strings["This account is a normal personal profile"] = "Ce compte correspond à un profil normal, pour une seule personne (physique, généralement)"; $a->strings["This account is a normal personal profile"] = "e compte correspond à un profil normal, pour une seule personne (physique, généralement)";
$a->strings["Soapbox Account"] = "Compte \"boîte à savon\""; $a->strings["Soapbox Account"] = "Compte \"boîte à savon\"";
$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "Accepter automatiquement toutes les demandes d'amitié/connexion comme étant des fans 'en lecture seule'"; $a->strings["Automatically approve all connection/friend requests as read-only fans"] = "ccepter automatiquement toutes les demandes d'amitié/connexion comme étant des fans 'en lecture seule'";
$a->strings["Community/Celebrity Account"] = "Compte de communauté/célébrité"; $a->strings["Community/Celebrity Account"] = "Compte de communauté/célébrité";
$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "Accepter automatiquement toutes les demandes d'amitié/connexion comme étant des fans en 'lecture/écriture'"; $a->strings["Automatically approve all connection/friend requests as read-write fans"] = "Accepter automatiquement toutes les demandes d'amitié/connexion comme étant des fans en 'lecture/écriture'";
$a->strings["Automatic Friend Account"] = "Compte auto-amical"; $a->strings["Automatic Friend Account"] = "Compte auto-amical";
@ -770,3 +770,319 @@ $a->strings["Invalid profile identifier."] = "Identifiant de profil invalide.";
$a->strings["Profile Visibility Editor"] = "Éditer la visibilité du profil"; $a->strings["Profile Visibility Editor"] = "Éditer la visibilité du profil";
$a->strings["Visible To"] = "Visible par"; $a->strings["Visible To"] = "Visible par";
$a->strings["All Contacts (with secure profile access)"] = "Tous les contacts (ayant un accès sécurisé)"; $a->strings["All Contacts (with secure profile access)"] = "Tous les contacts (ayant un accès sécurisé)";
$a->strings["(click to open/close)"] = "(cliquer pour ouvrir/fermer)";
$a->strings["Contact settings applied."] = "Réglages du contact appliqués.";
$a->strings["Contact update failed."] = "Echec lors de la mise à jour du contact.";
$a->strings["Repair Contact Settings"] = "Réparer les réglages du contact";
$a->strings["<strong>WARNING: This is highly advanced</strong> and if you enter incorrect information your communications with this contact will stop working."] = "<strong>ATTENTION: Ceci est à réserver aux utilisateurs avancés</strong> et pourrait bloquer vos communications avec ce contact en cas d'erreur.";
$a->strings["Please use your browser 'Back' button <strong>now</strong> if you are uncertain what to do on this page."] = "Merci d'utiliser le bouton 'Précédent' <strong>tout de suite</strong> si vous avez le moindre doute.";
$a->strings["Name"] = "Nom";
$a->strings["Account Nickname"] = "Pseudo du compte";
$a->strings["Account URL"] = "URL du compte";
$a->strings["Friend Request URL"] = "URL de requête";
$a->strings["Friend Confirm URL"] = "URL de confirmation";
$a->strings["Notification Endpoint URL"] = "URL de notification";
$a->strings["Poll/Feed URL"] = "URL de poll/feed";
$a->strings["Repair contact URL settings"] = "Réparer les URLs du contact";
$a->strings["Repair contact URL settings (WARNING: Advanced)"] = "Réparer les URLs du contact (ATTENTION: procédure avancée)";
$a->strings["(no subject)"] = "(aucun sujet)";
$a->strings["Welcome "] = "Bienvenue ";
$a->strings["Please upload a profile photo."] = "Merci de téléverser une photo pour votre profil.";
$a->strings["%1\$s is now friends with %2\$s"] = "%1\$s est désormais relié à %2\$s";
$a->strings["View recent"] = "Voir les nouveautés";
$a->strings["Visible to <strong>everybody</strong>"] = "Visible par <strong>tout le monde</strong>";
$a->strings["Post to Email"] = "Transmettre par courriel";
$a->strings["Image/photo"] = "Image/photo";
$a->strings["Updating contacts"] = "Mettre les contacts à jour";
$a->strings["Install Facebook connector for this account."] = "Activer le connecteur Facebook pour ce compte.";
$a->strings["Remove Facebook connector"] = "Désactiver le connecteur Facebook";
$a->strings["Post to Facebook cancelled because of multi-network access permission conflict."] = "Envoi vers Facebook annulé à cause d'un conflit dans les permissions d'accès aux réseaux tiers.";
$a->strings["View on Friendika"] = "Voir sur Friendika";
$a->strings["Contact: "] = "Contact: ";
$a->strings["Private messages to this person are at risk of public disclosure."] = "Les messages privés destinés à cette personne risquent des fuites.";
$a->strings["Invalid contact."] = "Contact invalide.";
$a->strings["Public access denied."] = "Accès public refusé.";
$a->strings["Your Identity Address is"] = "L'adresse de votre identité est";
$a->strings["Email/Mailbox Setup"] = "Réglages Courriel/Boîte";
$a->strings["If you wish to communicate with email contacts using this service (optional), please specify how to connect to your mailbox."] = "Si vous souhaitez communiquer avec vos contacts 'courriel' via ce service (facultatif), indiquez comment vous connecter à votre boîte.";
$a->strings["IMAP server name:"] = "Serveur IMAP:";
$a->strings["IMAP port:"] = "Port:";
$a->strings["Security (TLS or SSL):"] = "Sécurité (TLS ou SSL):";
$a->strings["Email login name:"] = "Identifiant courriel:";
$a->strings["Email password:"] = "Mot de passe courriel:";
$a->strings["Reply-to address (Optional):"] = "Adresse de réponse (facultatif):";
$a->strings["Send public posts to all email contacts:"] = "Envoyer les entrées publiques à tous les contacts courriel:";
$a->strings["Email access is disabled on this site."] = "L'accès par courriel est désactivé sur ce site.";
$a->strings["You may visit them online at %s"] = "Vous pouvez leur rendre visite à %s";
$a->strings["skip this step"] = "ignorer cette étape";
$a->strings["Help:"] = "Aide:";
$a->strings["Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca"] = "Exemples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, utilisateur@identi.ca";
$a->strings["Please enter your 'Identity Address' from one of the following supported social networks:"] = "Merci d'indiquer votre 'Adresse d'identité' issue de l'un des réseaux sociaux supportés:";
$a->strings["Your Identity Address:"] = "Adresse de votre identité:";
$a->strings["View conversations"] = "Voir conversations";
$a->strings["event"] = "[[event]]";
$a->strings["%s from %s"] = "[[%s from %s]]";
$a->strings["Select"] = "Sélectionner";
$a->strings["toggle star status"] = "(dé)marquer d'une étoile";
$a->strings["Delete Selected Items"] = "Supprimer les éléments selectionnés";
$a->strings["Attach file"] = "Joindre un fichier";
$a->strings["Public post"] = "Entrée publique";
$a->strings["bytes"] = "octets";
$a->strings["Select an alternate language"] = "Choisir une langue complémentaire";
$a->strings["show"] = "montrer";
$a->strings["don't show"] = "ne pas montrer";
$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
$a->strings["Starts:"] = "Commence:";
$a->strings["Finishes:"] = "Termine:";
$a->strings["Sharing notification from Diaspora network"] = "Partager les notifications du réseau Diaspora";
$a->strings["link"] = "lien";
$a->strings["From: "] = "De:";
$a->strings["never"] = "jamais";
$a->strings["End this session"] = "Terminer cette session";
$a->strings["Sign in"] = "Se connecter";
$a->strings["Home Page"] = "Page d'accueil";
$a->strings["Create an account"] = "Créer un compte";
$a->strings["Help and documentation"] = "Aide et documentation";
$a->strings["Addon applications, utilities, games"] = "Applications supplémentaires, utilitaires, jeux";
$a->strings["Search site content"] = "Rechercher dans le contenu du site";
$a->strings["Community"] = "Place publique";
$a->strings["Conversations on this site"] = "Conversations sur ce site";
$a->strings["People directory"] = "Annuaire";
$a->strings["Conversations from your friends"] = "Conversations de vos amis";
$a->strings["Your posts and conversations"] = "Vos conversations et entrées";
$a->strings["Friend requests"] = "Demandes de connexion/amitié";
$a->strings["Private mail"] = "Courriel privé";
$a->strings["Manage other pages"] = "Gérer les autres pages";
$a->strings["Account settings"] = "Réglages du compte";
$a->strings["Manage/edit profiles"] = "Gérer/éditer les profils";
$a->strings["Manage/edit friends and contacts"] = "Gérer/éditer les amis et contacts";
$a->strings["Admin"] = "Admin";
$a->strings["Site setup and configuration"] = "Configuration du site";
$a->strings["This website is tracked using the <a href='http://www.piwik.org'>Piwik</a> analytics tool."] = "Ce site construit ses statistiques grâce à <a href='http://www.piwik.org'>Piwik</a>.";
$a->strings["If you do not want that your visits are logged this way you <a href='%s'>can set a cookie to prevent Piwik from tracking further visits of the site</a> (opt-out)."] = "Si vous ne souhaitez pas que vos visites soient comptabilisées de cette manière, vous pouvez <a href='%s'>activer un cookie qui internet à Piwik d'en tenir compte à l'avenir</a> (mécanisme d'opt-out).";
$a->strings["Piwik Base URL"] = "URL de base de Piwik";
$a->strings["Site ID"] = "ID du site";
$a->strings["Show opt-out cookie link?"] = "Montrer le lien du cookie d'opt-out?";
$a->strings["Link all your Facebook friends and conversations"] = "Relier tous vos amis et conversations Facebook";
$a->strings["Warning: Your Facebook privacy settings can not be imported."] = "Attention: vos réglages de vie privée ne pourront être importés de Facebook.";
$a->strings["Linked Facebook items <strong>may</strong> be publicly visible, depending on your privacy settings for this website/account."] = "Les éléments liés depuis Facebook <strong>pourront</strong> être visibles publiquement, selon les réglages.";
$a->strings["Facebook post failed. Queued for retry."] = "Echec temporaire de l'envoi vers Facebook.";
$a->strings["Generate new key"] = "Générer une nouvelle clé";
$a->strings["Widgets key"] = "Clé des widgets";
$a->strings["Widgets available"] = "Widgets disponibles";
$a->strings["Connect on Friendika!"] = "Relier par Friendika!";
$a->strings["OEmbed settings updated"] = "Réglages OEmbed mis à jour";
$a->strings["Use OEmbed for YouTube videos"] = "Utiliser OEmbed pour les vidéos YouTube";
$a->strings["URL to embed:"] = "URL à incorporer:";
$a->strings["Twitter settings updated."] = "Réglages Twitter mis à jour.";
$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated Twitter account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Si activé, toutes vos entrées <strong>publiques</strong> pourront être postées sur le compte Twitter associé. Vous pouvez choisir de le faire par défaut (ici) ou pour chaque entrée séparément dans les options de la-dite entrée.";
$a->strings["Allow posting to Twitter"] = "Autoriser à poster vers Twitter";
$a->strings["Send public postings to Twitter by default"] = "Envoyer les entrées publiques vers Twitter par défaut";
$a->strings["Consumer key"] = "Consumer key";
$a->strings["Consumer secret"] = "Consumer secret";
$a->strings["Impressum"] = "Mentions légales";
$a->strings["Site Owner"] = "Propriétaire du site";
$a->strings["Email Address"] = "Courriel";
$a->strings["Postal Address"] = "Adresse postale";
$a->strings["The impressum addon needs to be configured!<br />Please add at least the <tt>owner</tt> variable to your config file. For other variables please refer to the README file of the addon."] = "Les mentions légales ont besoin d'être paramêtrées!<br />Merci d'ajouter au moins le <tt>propriétaire</tt> à votre configuration. Pour les autres variables, merci de vous référer au README de l'extension.";
$a->strings["Site Owners Profile"] = "Profil du propriétaire";
$a->strings["Notes"] = "Notes";
$a->strings["Please contact your site administrator.<br />The provided API URL is not valid."] = "Merci de contacter l'administrateur.<br />L'URL d'API fournie n'est pas valide.";
$a->strings["We could not contact the StatusNet API with the Path you entered."] = "Impossible de contacter l'API StatusNet avec le chemin fourni.";
$a->strings["StatusNet settings updated."] = "Réglages StatusNet mis à jour.";
$a->strings["Globally Available StatusNet OAuthKeys"] = "Clé OAuth globales de StatusNet";
$a->strings["There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance (see below)."] = "Voici quelques paires de clés OAuth correspondant à quelques serveurs courants. Si vous utilisez l'un d'entre eux, merci d'utiliser la paire fournie. Sinon, vous pouvez toujours vous connecter à l'instance StatusNet de votre choix (voir plus bas).";
$a->strings["Provide your own OAuth Credentials"] = "Entrez vos coordonnées OAuth manuellement";
$a->strings["Cancel Connection Process"] = "Annuler la mise en relation";
$a->strings["Current StatusNet API is"] = "L'API StatusNet actuelle est";
$a->strings["Cancel StatusNet Connection"] = "Annuler la connexion à StatusNet";
$a->strings["If enabled all your <strong>public</strong> postings can be posted to the associated StatusNet account. You can choose to do so by default (here) or for every posting separately in the posting options when writing the entry."] = "Si activé, toutes vos entrées <strong>publiques</strong> pourront être postées sur le compte StatusNet associé. Vous pouvez choisir de le faire par défaut (ici) ou pour chaque entrée séparément dans les options de la-dite entrée.";
$a->strings["Allow posting to StatusNet"] = "Autoriser à poster vers StatusNet";
$a->strings["Send public postings to StatusNet by default"] = "Envoyer les entrées publiques vers StatusNet par défaut";
$a->strings["Site name"] = "Nom du site";
$a->strings["API URL"] = "URL de l'API";
$a->strings["Consumer Secret"] = "Consumer Secret";
$a->strings["Consumer Key"] = "Consumer Key";
$a->strings["Hide your contact/friend list from viewers of this profile?"] = "Cacher vos amis/contacts des visiteurs de ce profil?";
$a->strings["Birthday (%s):"] = "Date de naissance (%s):";
$a->strings["visible to everybody"] = "visible par tout le monde";
$a->strings["Events"] = "Evènements";
$a->strings["Personal Notes"] = "Notes personnelles";
$a->strings["Save"] = "Enregistrer";
$a->strings["An invitation is required."] = "Une invitation est requise.";
$a->strings["Invitation could not be verified."] = "L'invitation n'a pu être vérifiée.";
$a->strings["Membership on this site is by invitation only."] = "L'inscription à ce site se fait sur invitation uniquement.";
$a->strings["Your invitation ID: "] = "Votre invitation: ";
$a->strings["Welcome to Friendika"] = "Bienvenue sur Friendika";
$a->strings["New Member Checklist"] = "Checklist du nouvel inscrit";
$a->strings["We would like to offer some tips and links to help make your experience enjoyable. Click any item to visit the relevant page."] = "Nous souhaitons vous offrir quelques astuces et pointeurs pour vous aider à faire de votre passage ici un moment agréable. Cliquez sur les éléments suivants pour visiter les pages adéquates.";
$a->strings["On your <em>Settings</em> page - change your initial password. Also make a note of your Identity Address. This will be useful in making friends."] = "Sur votre page <em>Réglages</em> - vous pouvez modifier votre mot de passe. Par ailleurs, notez bien l'adresse de votre identité : elle sera fort utile pour vous faire des amis.";
$a->strings["Review the other settings, particularly the privacy settings. An unpublished directory listing is like having an unlisted phone number. In general, you should probably publish your listing - unless all of your friends and potential friends know exactly how to find you."] = "";
$a->strings["Upload a profile photo if you have not done so already. Studies have shown that people with real photos of themselves are ten times more likely to make friends than people who do not."] = "Téléversez (c'est-à-dire envoyez-nous) une photo de profil si vous ne l'avez déjà fait. Les études montrent que les gens qui utilisent une vraie photo d'eux sont dix fois plus susceptibles de se faire de nouveaux amis que les autres.";
$a->strings["Authorise the Facebook Connector if you currently have a Facebook account and we will (optionally) import all your Facebook friends and conversations."] = "Activez le connecteur Facebook si vous avez un compte sur ce service, et nous pourrons (de manière facultative) importer tous vos amis et conversations.";
$a->strings["Enter your email access information on your Settings page if you wish to import and interact with friends or mailing lists from your email INBOX"] = "Renseignez la page Réglages à propos de votre accès à vos courriels si vous souhaitez interagir avec des amis ou des listes de diffusion issues de votre boîte de réception";
$a->strings["Edit your <strong>default</strong> profile to your liking. Review the settings for hiding your list of friends and hiding the profile from unknown visitors."] = "Pensez à éditer votre profil <strong>par défaut</strong> à votre convenance. Vérifiez bien les réglages permettant de cacher vos informations aux visiteurs inconnus.";
$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."] = "Choisissez quelques mots-clés publiques pour votre profil par défaut. Vous pourrez ainsi décrire vos centres d'intérêt, et nous pourrons vous suggérer des amis les partageant.";
$a->strings["Your Contacts page is your gateway to managing friendships and connecting with friends on other networks. Typically you enter their address or site URL in the <em>Connect</em> dialog."] = "Votre page Contacts est l'endroit idéal pour gérer vos relations et vous connecter à des amis issus d'autres réseaux. En général, il suffit de saisir leur adresse dans la section <em>Relier</em>.";
$a->strings["The Directory page lets you find other people in this network or other federated sites. Look for a <em>Connect</em> or <em>Follow</em> link on their profile page. Provide your own Identity Address if requested."] = "L'Annuaire vous permet de rechercher d'autres personnes au sein de ce réseau, ou dans l'ensemble des sites fédérés. Cherchez un lien nommé <em>Relier</em>, <em>Connect</em> ou <em>Follow</em> sur leurs profils. Vous aurez peut-être à fournir votre propre adresse d'identité.";
$a->strings["Once you have made some friends, organize them into private conversation groups from the sidebar of your Contacts page and then you can interact with each group privately on your Network page."] = "Une fois que vous aurez retrouvé quelques amis ou contacts, vous pourrez les classer en groupes depuis le panneau latéral de votre page Contacts. Vous serez désormais en mesure d'interagir avec chaque groupe de manière exclusive et privée depuis la page Réseau.";
$a->strings["Our <strong>help</strong> pages may be consulted for detail on other program features and resources."] = "Nos pages d'<strong>aide</strong> peuvent être consultées pour davantage d'informations sur les fonctionnalités et procédures du réseau.";
$a->strings["No keywords to match. Please add keywords to your default profile."] = "Aucun mot-clé ne correspond. Merci d'ajouter quelques mots-clés à votre profil par défaut.";
$a->strings["[Embedded content - reload page to view]"] = "[Contenu incorporé - rechargez la page]";
$a->strings["No installed applications."] = "Pas d'application installée.";
$a->strings["View Conversations"] = "Voir par conversation";
$a->strings["View New Items"] = "Voir les nouveautés";
$a->strings["View Any Items"] = "Tout voir";
$a->strings["View Starred Items"] = "Voir les favoris";
$a->strings["Warning: This group contains %s member from an insecure network."] = array(
0 => "Ce groupe contient %s membre issu d'un réseau non-fiable.",
1 => "Ce groupe contient %s membres issus de réseaux non-fiables.",
);
$a->strings["Access to this profile has been restricted."] = "L'accès à ce profil a été restreint.";
$a->strings["Site"] = "Site";
$a->strings["Users"] = "Utilisateurs";
$a->strings["Plugins"] = "Extensions";
$a->strings["Update"] = "Mises-à-jour";
$a->strings["Logs"] = "Journaux";
$a->strings["User registrations waiting for confirmation"] = "Inscriptions d'utilisateurs en attente de confirmation";
$a->strings["Administration"] = "Administration";
$a->strings["Summary"] = "En résumé";
$a->strings["Registered users"] = "Utilisateurs inscrits";
$a->strings["Pending registrations"] = "Utilisateurs en attente d'inscription";
$a->strings["Version"] = "Version";
$a->strings["Active plugins"] = "Extensions actives";
$a->strings["Site settings updated."] = "Réglages du site appliqués.";
$a->strings["Closed"] = "Fermé";
$a->strings["Requires approval"] = "Après autorisation";
$a->strings["Open"] = "Ouvert";
$a->strings["File upload"] = "Envoi de fichiers";
$a->strings["Policies"] = "Politiques";
$a->strings["Advanced"] = "Avancé";
$a->strings["Banner/Logo"] = "Titre/Logo";
$a->strings["System language"] = "Langue du système";
$a->strings["System theme"] = "Thème du système";
$a->strings["Maximum image size"] = "Taille maximum des images";
$a->strings["Register policy"] = "Politique d'inscription";
$a->strings["Register text"] = "Texte à l'inscription";
$a->strings["Allowed friend domains"] = "Domaines autorisés pour la mise en relation";
$a->strings["Allowed email domains"] = "Domaines autorisés pour les courriels";
$a->strings["Block public"] = "Bloquer public";
$a->strings["Force publish"] = "Forcer la publication";
$a->strings["Global directory update URL"] = "URL de mise à jour de l'annuaire global";
$a->strings["Block multiple registrations"] = "Interdire les inscriptions multiples";
$a->strings["OpenID support"] = "Support d'OpenID";
$a->strings["Gravatar support"] = "Support de Gravatar";
$a->strings["Fullname check"] = "Imposer 'Prénom Nom'";
$a->strings["UTF-8 Regular expressions"] = "Expressions rationnelles en UTF-8";
$a->strings["Show Community Page"] = "Montrer la Place publique";
$a->strings["Enable OStatus support"] = "Activer OStatus";
$a->strings["Enable Diaspora support"] = "Activer Diaspora";
$a->strings["Only allow Friendika contacts"] = "N'autoriser que les contacts Friendika";
$a->strings["Verify SSL"] = "Vérifier SSL";
$a->strings["Proxy user"] = "Utilisateur du proxy";
$a->strings["Proxy URL"] = "URL du proxy";
$a->strings["Network timeout"] = "Délai d'attente du réseau";
$a->strings["%s user blocked"] = array(
0 => "%s utilisateur bloqué",
1 => "%s utilisateurs bloqués/débloqués",
);
$a->strings["%s user deleted"] = array(
0 => "%s utilisateur supprimé",
1 => "%s utilisateurs supprimés",
);
$a->strings["User '%s' deleted"] = "Utilisateur '%s' supprimé";
$a->strings["User '%s' unblocked"] = "Utilisateur '%s' débloqué";
$a->strings["User '%s' blocked"] = "Utilisateur '%s' bloqué";
$a->strings["select all"] = "tout sélectionner";
$a->strings["Request date"] = "Date de la demande";
$a->strings["Email"] = "Courriel";
$a->strings["Block"] = "Bloquer";
$a->strings["Unblock"] = "Débloquer";
$a->strings["Register date"] = "Date d'inscription";
$a->strings["Last login"] = "Dernière connexion";
$a->strings["Last item"] = "Dernière entrée";
$a->strings["Account"] = "Compte";
$a->strings["Selected users will be deleted!\\n\\nEverything these users had posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "Les utilisateurs selectionnés seront supprimés!\\n\\nTout ce qu'ils ont posté sur ce site sera définitivement perdu!\\n\\nÊtes-vous certain?";
$a->strings["The user {0} will be deleted!\\n\\nEverything this user has posted on this site will be permanently deleted!\\n\\nAre you sure?"] = "L'utilisateur {0} sera supprimé!\\n\\nTout ce qu'il a posté sur ce site sera définitivement perdu!\\n\\nÊtes-vous certain?";
$a->strings["Plugin %s disabled."] = "Extension %s désactivée.";
$a->strings["Plugin %s enabled."] = "Extension %s activée.";
$a->strings["Disable"] = "Désactiver";
$a->strings["Enable"] = "Activer";
$a->strings["Toggle"] = "Activer/Désactiver";
$a->strings["Log settings updated."] = "Réglages des journaux mis-à-jour.";
$a->strings["Clear"] = "Remettre à zéro";
$a->strings["Debugging"] = "Débogage";
$a->strings["Log file"] = "Fichier de journal";
$a->strings["Must be writable by web server. Relative to your Friendika index.php."] = "Doit pouvoir être modifié par le serveur web. Chemin relatif à l'index.php de Friendika.";
$a->strings["Log level"] = "Niveau de journalisation";
$a->strings["Close"] = "Fermer";
$a->strings["FTP Host"] = "Hôte FTP";
$a->strings["FTP Path"] = "Chemin FTP";
$a->strings["FTP User"] = "Utilisateur FTP";
$a->strings["FTP Password"] = "Mot de passe FTP";
$a->strings["In order to install Friendika we need to know how to connect to your database."] = "Pour installer Friendika, nous avons besoin des coordonnées de votre base de données.";
$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "La base spécifiée ci-dessous doit exister. Si ce n'est le cas, créez-la avant de continuer.";
$a->strings["Site administrator email address. Your account email address must match this in order to use the web admin panel."] = "Courriel de l'administrateur du site. L'adresse de courriel de votre compte doit correspondre pour pouvoir utiliser la page d'Administration.";
$a->strings["Error: mb_string PHP module required but not installed."] = "Erreur: le module mb_string de PHP est manquant.";
$a->strings["everybody"] = "tout le monde";
$a->strings["Failed to connect with email account using the settings provided."] = "Impossible de se connecter aux courriels avec les réglages fournis.";
$a->strings["Plugin settings"] = "Réglages des extensions";
$a->strings["OpenID:"] = "OpenID:";
$a->strings["(Optional) Allow this OpenID to login to this account."] = "(Facultatif) Autoriser cet OpenID à accéder à ce compte.";
$a->strings["Publish your default profile in your local site directory?"] = "Publier votre profil par défaut dans l'annuaire local?";
$a->strings["Publish your default profile in the global social directory?"] = "Publier votre profil par défaut dans l'annuaire global?";
$a->strings["Hide your contact/friend list from viewers of your default profile?"] = "Masquer vos contacts/amis aux visiteurs de votre profil par défaut?";
$a->strings["Hide profile details and all your messages from unknown viewers?"] = "Masquer vos informations et messages à tous les visiteurs inconnus?";
$a->strings["Automatically expire posts after days:"] = "Expiration automatique des entrées de plus de <em>n</em> jours:";
$a->strings["If empty, posts will not expire. Expired posts will be deleted"] = "Si le champ est vide, les entrées n'expireront pas. L'expiration équivaut à une suppression";
$a->strings["Last successful email check:"] = "Dernière vérification des courriels:";
$a->strings["Security:"] = "Sécurité";
$a->strings["None"] = "Aucune";
$a->strings["Reply-to address:"] = "Adresse de réponse:";
$a->strings["No valid account found."] = "Pas de compte valide trouvé.";
$a->strings["Create New Event"] = "Créer un évènement";
$a->strings["Previous"] = "Précédent";
$a->strings["Next"] = "Suivant";
$a->strings["l, F j"] = "l, F j";
$a->strings["Edit event"] = "Modifier l'évènement";
$a->strings["hour:minute"] = "heure:minute";
$a->strings["Event details"] = "Détails de l'évènement";
$a->strings["Format is %s %s. Starting date and Description are required."] = "Le format est %s %s. La date de début et la description sont obligatoires.";
$a->strings["Event Starts:"] = "Date/heure de début:";
$a->strings["Finish date/time is not known or not relevant"] = "La date/heure de fin est inconnue ou sans objet";
$a->strings["Event Finishes:"] = "Date/heure de fin:";
$a->strings["Adjust for viewer timezone"] = "Ajuster au fuseau horaire du visiteur";
$a->strings["Description:"] = "Description:";
$a->strings["Share this event"] = "Partager cet évènement";
$a->strings["Administrator@"] = "Administrator@";
$a->strings["%s posted to your profile wall at %s"] = "%s a écrit sur votre profil (%s)";
$a->strings["Normal site view"] = "Vue normale";
$a->strings["View all site entries"] = "Vue de toutes les entrées";
$a->strings["Visit %s's profile [%s]"] = "Visiter le profile de %s [%s]";
$a->strings["Not available."] = "Indisponible.";
$a->strings["File exceeds size limit of %d"] = "Le fichier dépasse la limite de %d";
$a->strings["File upload failed."] = "Echec du téléversement.";
$a->strings["Tips for New Members"] = "Astuces pour les nouveaux inscrits";
$a->strings["You have no more invitations available"] = "Vous ne disposez pas d'invitations";
$a->strings["You will need to supply this invitation code: \$invite_code"] = "Vous devrez fournir ce code d'invitation: \$invite_code";
$a->strings["Friend suggestion sent."] = "Suggestion d'amitié envoyée.";
$a->strings["Suggest Friends"] = "Suggérer de amis/contacts";
$a->strings["Suggest a friend for %s"] = "Suggérer un ami/contact pour %s";
$a->strings["Does %s know you?"] = "Est-ce que %s vous connaît?";
$a->strings["This site is not configured to allow communications with other networks."] = "Ce site n'est pas configuré pour permettre les communication avec d'autres réseaux.";
$a->strings["No compatible communication protocols or feeds were discovered."] = "Aucun protocole ou flux compatible n'a pu être découvert.";
$a->strings["An author or name was not found."] = "Impossible de trouver le nom ou l'auteur.";
$a->strings["No browser URL could be matched to this address."] = "Aucune URL ne correspond à cette adresse.";
$a->strings["The profile address specified belongs to a network which has been disabled on this site."] = "L'adresse de profil spécifiée appartient à un réseau dont l'usage a été désactivé sur ce site.";
$a->strings["Item not available."] = "Entrée inaccessible.";
$a->strings["Item was not found."] = "Entrée introuvable.";
$a->strings["Image file is empty."] = "L'image est vide.";
$a->strings["Access to this item is restricted."] = "L'accès à cette entrée est restreint.";
$a->strings["Friend Suggestion"] = "Suggestion d'amitié/contact";
$a->strings["suggested by %s"] = "suggéré(e) par %s";
$a->strings["Sharer"] = "Source du partage";
$a->strings["%d invitation available"] = array(
0 => "%d invitation disponible",
1 => "%d invitations disponibles",
);
$a->strings["Suggest friends"] = "Suggérer des amis/contacts";

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 B

View file

@ -688,12 +688,17 @@ div[id$="wrapper"] br { clear: left; }
*/ */
.view-contact-wrapper, .view-contact-wrapper,
.contact-entry-wrapper { float: left; margin-right: 20px; margin-bottom: 20px; position: relative;} .contact-entry-wrapper { float: left; margin-right: 20px; margin-bottom: 20px; width: 120px; height: 120px; position: relative;}
.contact-entry-direction-wrapper {position: absolute; top: 20px;} .contact-entry-direction-wrapper {position: absolute; top: 20px;}
.contact-entry-edit-links { position: absolute; top: 60px; } .contact-entry-edit-links { position: absolute; top: 60px; }
.contact-entry-photo { .contact-entry-photo {
margin-left:20px; margin-left:20px;
} }
.contact-entry-name { width: 120px; overflow: hidden; }
.contact-entry-photo {
position: relative;
}
.contact-entry-edit-links .icon { .contact-entry-edit-links .icon {
border: 1px solid #babdb6; border: 1px solid #babdb6;
-webkit-border-radius: 3px; -webkit-border-radius: 3px;
@ -718,7 +723,36 @@ div[id$="wrapper"] br { clear: left; }
#contact-edit-last-update-text { margin-bottom: 15px; } #contact-edit-last-update-text { margin-bottom: 15px; }
#contact-edit-last-updated { font-weight: bold; } #contact-edit-last-updated { font-weight: bold; }
#contact-edit-poll-text { display: inline; } #contact-edit-poll-text { display: inline; }
#contact-edit-end { clear: both; } #contact-edit-end { clear: both; margin-bottom: 65px;}
.contact-photo-menu-button {
position: absolute;
background-image: url("photo-menu.jpg");
background-position: top left;
background-repeat: no-repeat;
margin: 0px; padding: 0px;
width: 16px;
height: 16px;
top: 64px; left:0px;
overflow: hidden;
text-indent: 40px;
display: none;
}
.contact-photo-menu {
width: auto;
border: 2px solid #444444;
background: #FFFFFF;
position: absolute;
left: 0px; top: 90px;
display: none;
z-index: 10000;
}
.contact-photo-menu ul { margin:0px; padding: 0px; list-style: none }
.contact-photo-menu li a { display: block; padding: 2px; }
.contact-photo-menu li a:hover { color: #FFFFFF; background: #3465A4; text-decoration: none; }
/** /**
* register, settings & profile forms * register, settings & profile forms

View file

@ -743,7 +743,8 @@ input#dfrn-url {
.contact-entry-wrapper { .contact-entry-wrapper {
float: left; float: left;
width: 180px; width: 120px;
height: 120px;
} }
.contact-entry-direction-icon { .contact-entry-direction-icon {
@ -759,7 +760,9 @@ input#dfrn-url {
} }
.contact-entry-name { .contact-entry-name {
float: left; float: left;
margin-left: 30px; margin-left: 0px;
width: 120px;
overflow: hidden;
} }
.contact-entry-edit-links { .contact-entry-edit-links {
margin-top: 6px; margin-top: 6px;
@ -777,6 +780,7 @@ input#dfrn-url {
} }
.contact-entry-photo { .contact-entry-photo {
float: left; float: left;
position: relative;
} }
.contact-entry-end { .contact-entry-end {
clear: both; clear: both;
@ -784,6 +788,7 @@ input#dfrn-url {
#contact-edit-end { #contact-edit-end {
clear: both; clear: both;
margin-bottom: 65px;
} }
#fsuggest-desc, #fsuggest-submit-wrapper { #fsuggest-desc, #fsuggest-submit-wrapper {
@ -1374,6 +1379,12 @@ input#dfrn-url {
margin-left: 30px; margin-left: 30px;
} }
#contact-edit-nettype {
margin-top: 5px;
margin-left: 30px;
}
#contact-edit-poll-wrapper { #contact-edit-poll-wrapper {
margin-left: 50px; margin-left: 50px;
margin-top: 30px; margin-top: 30px;
@ -1458,6 +1469,35 @@ input#dfrn-url {
/*margin-left: 50px;*/ /*margin-left: 50px;*/
} }
.contact-photo-menu-button {
position: absolute;
background-image: url("photo-menu.jpg");
background-position: top left;
background-repeat: no-repeat;
margin: 0px; padding: 0px;
width: 16px;
height: 16px;
top: 64px; left:0px;
overflow: hidden;
text-indent: 40px;
display: none;
}
.contact-photo-menu {
width: auto;
border: 2px solid #444444;
background: #FFFFFF;
position: absolute;
left: 0px; top: 90px;
display: none;
z-index: 10000;
}
.contact-photo-menu ul { margin:0px; padding: 0px; list-style: none }
.contact-photo-menu li a { display: block; padding: 2px; }
.contact-photo-menu li a:hover { color: #FFFFFF; background: #3465A4; text-decoration: none; }
#block-message, #ignore-message { #block-message, #ignore-message {
margin-top: 20px; margin-top: 20px;
color: #FF0000; color: #FF0000;

View file

@ -841,7 +841,8 @@ input#dfrn-url {
.contact-entry-wrapper { .contact-entry-wrapper {
float: left; float: left;
width: 180px; width: 120px;
height: 120px;
} }
.contact-entry-direction-icon { .contact-entry-direction-icon {
@ -857,7 +858,9 @@ input#dfrn-url {
} }
.contact-entry-name { .contact-entry-name {
float: left; float: left;
margin-left: 30px; margin-left: 0px;
width: 120px;
oveflow: hidden;
} }
.contact-entry-edit-links { .contact-entry-edit-links {
margin-top: 6px; margin-top: 6px;
@ -875,6 +878,7 @@ input#dfrn-url {
} }
.contact-entry-photo { .contact-entry-photo {
float: left; float: left;
position: relative;
} }
.contact-entry-end { .contact-entry-end {
clear: both; clear: both;
@ -882,8 +886,36 @@ input#dfrn-url {
#contact-edit-end { #contact-edit-end {
clear: both; clear: both;
margin-bottom: 65px;
} }
.contact-photo-menu-button {
position: absolute;
background-image: url("photo-menu.jpg");
background-position: top left;
background-repeat: no-repeat;
margin: 0px; padding: 0px;
width: 16px;
height: 16px;
top: 64px; left:0px;
overflow: hidden;
text-indent: 40px;
display: none;
}
.contact-photo-menu {
width: 100px;
border: 2px solid #444444;
background: #FFFFFF;
position: absolute;
left: 0px; top: 90px;
display: none;
z-index: 10000;
}
.contact-photo-menu ul { margin:0px; padding: 0px; list-style: none }
.contact-photo-menu li a { display: block; padding: 2px; }
.contact-photo-menu li a:hover { color: #FFFFFF; background: #3465A4; text-decoration: none; }
#fsuggest-desc, #fsuggest-submit-wrapper { #fsuggest-desc, #fsuggest-submit-wrapper {
margin-top: 15px; margin-top: 15px;
@ -1420,6 +1452,11 @@ padding: 5px 10px 0px;
font-weight: bold; font-weight: bold;
margin-left: 30px; margin-left: 30px;
} }
#contact-edit-nettype {
margin-top: 5px;
margin-left: 30px;
}
#contact-edit-poll-wrapper { #contact-edit-poll-wrapper {
margin-left: 50px; margin-left: 50px;