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

This commit is contained in:
Fabio Comuni 2011-04-18 16:58:20 +02:00
commit ee16413935
53 changed files with 5534 additions and 1649 deletions

1
.gitignore vendored
View file

@ -7,4 +7,5 @@ include/jquery-1.4.2.min.js
*.out *.out
*.version* *.version*
push* push*
langup
home.html home.html

View file

@ -2,9 +2,9 @@
set_time_limit(0); set_time_limit(0);
define ( 'FRIENDIKA_VERSION', '2.1.948' ); define ( 'FRIENDIKA_VERSION', '2.1.952' );
define ( 'DFRN_PROTOCOL_VERSION', '2.21' ); define ( 'DFRN_PROTOCOL_VERSION', '2.21' );
define ( 'DB_UPDATE_VERSION', 1051 ); define ( 'DB_UPDATE_VERSION', 1053 );
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' );
@ -290,7 +290,7 @@ class App {
if($this->cmd === '.well-known/host-meta') { if($this->cmd === '.well-known/host-meta') {
require_once('include/hostxrd.php'); require_once('include/hostxrd.php');
hostxrd($this->hostname); hostxrd($this->get_baseurl());
// NOTREACHED // NOTREACHED
} }

View file

@ -64,6 +64,7 @@ CREATE TABLE IF NOT EXISTS `contact` (
`issued-id` char(255) NOT NULL, `issued-id` char(255) NOT NULL,
`dfrn-id` char(255) NOT NULL, `dfrn-id` char(255) NOT NULL,
`url` char(255) NOT NULL, `url` char(255) NOT NULL,
`addr` char(255) NOT NULL,
`alias` char(255) NOT NULL, `alias` char(255) NOT NULL,
`pubkey` text NOT NULL, `pubkey` text NOT NULL,
`prvkey` text NOT NULL, `prvkey` text NOT NULL,
@ -194,6 +195,7 @@ CREATE TABLE IF NOT EXISTS `item` (
`deny_cid` mediumtext NOT NULL, `deny_cid` mediumtext NOT NULL,
`deny_gid` mediumtext NOT NULL, `deny_gid` mediumtext NOT NULL,
`private` tinyint(1) NOT NULL DEFAULT '0', `private` tinyint(1) NOT NULL DEFAULT '0',
`pubmail` tinyint(1) NOT NULL DEFAULT '0',
`visible` tinyint(1) NOT NULL DEFAULT '0', `visible` tinyint(1) NOT NULL DEFAULT '0',
`unseen` tinyint(1) NOT NULL DEFAULT '1', `unseen` tinyint(1) NOT NULL DEFAULT '1',
`deleted` tinyint(1) NOT NULL DEFAULT '0', `deleted` tinyint(1) NOT NULL DEFAULT '0',
@ -508,9 +510,13 @@ CREATE TABLE IF NOT EXISTS `mailacct` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`uid` INT NOT NULL, `uid` INT NOT NULL,
`server` CHAR( 255 ) NOT NULL , `server` CHAR( 255 ) NOT NULL ,
`port` INT NOT NULL,
`ssltype` CHAR( 16 ) NOT NULL,
`mailbox` CHAR( 255 ) NOT NULL,
`user` CHAR( 255 ) NOT NULL , `user` CHAR( 255 ) NOT NULL ,
`pass` CHAR( 255 ) NOT NULL , `pass` TEXT NOT NULL ,
`reply_to` CHAR( 255 ) NOT NULL , `reply_to` CHAR( 255 ) NOT NULL ,
`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;

View file

@ -9,7 +9,7 @@ The first thing you can do is look at the Directory for somebody you would like
Click that. It will take you to a "Connect" form. Click that. It will take you to a "Connect" form.
This is going to ask you for your profile locator. This is necessary so that this person's website can find yours. This is going to ask you for your Identity Address. This is necessary so that this person's website can find yours.
What do you put in the box? What do you put in the box?
@ -17,21 +17,23 @@ If your Friendika site is called "demo.friendika.com" and your username/nickname
Notice this looks just like an email address. It was meant to be that way. It's easy for people to remember. Notice this looks just like an email address. It was meant to be that way. It's easy for people to remember.
You *could* also put in the URL of your profile page, such as "http://demo.friendika.com/profile/bob". You *could* also put in the URL of your "home" page, such as "http://demo.friendika.com/profile/bob", but the email-style address is certainly easier.
The email-style locator is certainly easier.
When you've submitted the connection page, it will take you back to your own site where you must then login (if necessary) and verify the connection request on *your* site. Once you've done this, the two websites can communicate with each other to complete the process (after your new friend has approved the request). When you've submitted the connection page, it will take you back to your own site where you must then login (if necessary) and verify the connection request on *your* site. Once you've done this, the two websites can communicate with each other to complete the process (after your new friend has approved the request).
If you already know somebody's profile location, you can enter it in the "connect" box on your "Contacts" page. This will take you through a similar process. If you already know somebody's Identity Address, you can enter it in the "connect" box on your "Contacts" page. This will take you through a similar process.
You can also use your profile locator or other people's profile locators to become friends across networks. The list of possible networks is growing all the time. If you know (for instance) "bob" on identi.ca (a Status.Net site) you could put bob@identi.ca into your Contact page and become friends across networks. (Or you can put in Bob's profile URL if you wish). You can also be "partial" friends with somebody on Google Buzz by putting in their gmail address. Google Buzz does not yet support all the protocols we need for direct messaging, but you should be able to follow status updates from within Friendika. **Alternate Networks**
This works from other networks as well. If a friend of yours has an identi.ca account, they can become friends with you by putting your Friendika profile locator into their identi.ca subscription dialog box. You can also use your Identity Address or other people's Identity Addresses to become friends across networks. The list of possible networks is growing all the time. If you know (for instance) "bob" on identi.ca (a Status.Net site) you could put bob@identi.ca into your Contact page and become friends across networks. (Or you can put in the URL to Bob's identi.ca page if you wish). You can also be "partial" friends with somebody on Google Buzz by putting in their gmail address. Google Buzz does not yet support all the protocols we need for direct messaging, but you should be able to follow status updates from within Friendika. You can do the same for Twitter accounts and Diaspora accounts. In fact you can "follow" most anybody or any website that produces a syndication feed (RSS/Atom,etc.). If we can find an information stream and a name to attach to the contact, we'll try to connect with them.
If you have supplied your mailbox connection information on your Settings page, you can enter the email address of anybody that has sent you a message recently and have their email messages show up in your social stream. You can also reply to them from within Friendika.
People can also become friends with you from other networks. If a friend of yours has an identi.ca account, they can become friends with you by putting your Friendika Identity Address into their identi.ca subscription dialog box.
If this happens you will receive a notification. You will need to approve this before the friendship is complete. If this happens you will receive a notification. You will need to approve this before the friendship is complete.
Some networks allow people to send you messages without being friends and without your approval. Friendika does not allow this by default. It would open a gateway for spam. So when you've approved a friend request from one of these networks, look at your contact page for that person (this will be displayed as soon as you approve the relationship). They might be marked as an "Ignored" contact. Some networks allow people to send you messages without being friends and without your approval. Friendika does not allow this by default, as it would open a gateway for spam. So when you've approved a friend request from one of these networks, look at your contact page for that person (this will be displayed as soon as you approve the relationship). They might be marked as an "Ignored" contact.
This means they can see some of your posts (your public posts), but they aren't permitted to send you anything. You can "Un-ignore" them if you desire to allow them to contact you directly and to have their status updates appear in your Network feed. This means they can see some of your posts (your public posts), but they aren't permitted to send you anything. You can "Un-ignore" them if you desire to allow them to contact you directly and to have their status updates appear in your Network feed.

View file

@ -15,7 +15,7 @@ The following are various ways of indicating a person:
* @mike - indicates a known contact in your social circle whose nickname is "mike" * @mike - indicates a known contact in your social circle whose nickname is "mike"
* @mike_macgirvin - indicates a known contact in your social circle whose full name is "Mike Macgirvin". Note that spaces cannot be used inside tags. * @mike_macgirvin - indicates a known contact in your social circle whose full name is "Mike Macgirvin". Note that spaces cannot be used inside tags.
* @mike@macgirvin.com - indicates the profile locator of a person on a different network, or one that is *not* in your social circle. This can only be an email-style locator, not a web URL. * @mike@macgirvin.com - indicates the Identity Address of a person on a different network, or one that is *not* in your social circle. This can only be an email-style locator, not a web URL.
Unless their system blocks unsolicited "mentions", the person tagged will likely receive a "Mention" post/activity or become a direct participant in the conversation in the case of public posts. Please note that Friendika often blocks incoming "mentions" from other networks and especially from people with no relationship to you. This is a spam prevention measure. Unless their system blocks unsolicited "mentions", the person tagged will likely receive a "Mention" post/activity or become a direct participant in the conversation in the case of public posts. Please note that Friendika often blocks incoming "mentions" from other networks and especially from people with no relationship to you. This is a spam prevention measure.

View file

@ -261,3 +261,231 @@ function scrape_feed($url) {
return $ret; return $ret;
}} }}
function probe_url($url) {
require_once('include/email.php');
$result = array();
if(! $url)
return $result;
$diaspora = false;
$email_conversant = false;
if($url) {
$links = lrdd($url);
if(count($links)) {
foreach($links as $link) {
if($link['@attributes']['rel'] === NAMESPACE_DFRN)
$dfrn = unamp($link['@attributes']['href']);
if($link['@attributes']['rel'] === 'salmon')
$notify = unamp($link['@attributes']['href']);
if($link['@attributes']['rel'] === NAMESPACE_FEED)
$poll = unamp($link['@attributes']['href']);
if($link['@attributes']['rel'] === 'http://microformats.org/profile/hcard')
$hcard = unamp($link['@attributes']['href']);
if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page')
$profile = unamp($link['@attributes']['href']);
if($link['@attributes']['rel'] === 'http://joindiaspora.com/seed_location')
$diaspora = true;
}
// Status.Net can have more than one profile URL. We need to match the profile URL
// to a contact on incoming messages to prevent spam, and we won't know which one
// to match. So in case of two, one of them is stored as an alias. Only store URL's
// and not webfinger user@host aliases. If they've got more than two non-email style
// aliases, let's hope we're lucky and get one that matches the feed author-uri because
// otherwise we're screwed.
foreach($links as $link) {
if($link['@attributes']['rel'] === 'alias') {
if(strpos($link['@attributes']['href'],'@') === false) {
if(isset($profile)) {
if($link['@attributes']['href'] !== $profile)
$alias = unamp($link['@attributes']['href']);
}
else
$profile = unamp($link['@attributes']['href']);
}
}
}
}
else {
// Check email
$orig_url = $url;
if((strpos($orig_url,'@')) && validate_email($orig_url)) {
$x = q("SELECT `prvkey` FROM `user` WHERE `uid` = %d LIMIT 1",
intval(local_user())
);
$r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1",
intval(local_user())
);
if(count($x) && count($r)) {
$mailbox = construct_mailbox_name($r[0]);
$password = '';
openssl_private_decrypt(hex2bin($r[0]['pass']),$password,$x[0]['prvkey']);
$mbox = email_connect($mailbox,$r[0]['user'],$password);
unset($password);
}
if($mbox) {
$msgs = email_poll($mbox,$orig_url);
if(count($msgs)) {
$addr = $orig_url;
$network = NETWORK_MAIL;
$name = substr($url,0,strpos($url,'@'));
$profile = 'http://' . substr($url,strpos($url,'@')+1);
// fix nick character range
$vcard = array('fn' => $name, 'nick' => $name, 'photo' => gravatar_img($url));
$notify = 'smtp ' . random_string();
$poll = 'email ' . random_string();
$priority = 0;
$x = email_msg_meta($mbox,$msgs[0]);
$adr = imap_rfc822_parse_adrlist($x->from,'');
if(strlen($adr[0]->personal))
$vcard['fn'] = notags($adr[0]->personal);
}
imap_close($mbox);
}
}
}
}
if(strlen($dfrn)) {
$ret = scrape_dfrn($dfrn);
if(is_array($ret) && x($ret,'dfrn-request')) {
$network = NETWORK_DFRN;
$request = $ret['dfrn-request'];
$confirm = $ret['dfrn-confirm'];
$notify = $ret['dfrn-notify'];
$poll = $ret['dfrn-poll'];
}
}
if($network !== NETWORK_DFRN && $network !== NETWORK_MAIL) {
$network = NETWORK_OSTATUS;
$priority = 0;
if($hcard) {
$vcard = scrape_vcard($hcard);
// Google doesn't use absolute url in profile photos
if((x($vcard,'photo')) && substr($vcard['photo'],0,1) == '/') {
$h = @parse_url($hcard);
if($h)
$vcard['photo'] = $h['scheme'] . '://' . $h['host'] . $vcard['photo'];
}
logger('probe_url: scrape_vcard: ' . print_r($vcard,true), LOGGER_DATA);
}
if(! $profile) {
if($diaspora)
$profile = $hcard;
else
$profile = $url;
}
if(! x($vcard,'fn'))
if(x($vcard,'nick'))
$vcard['fn'] = $vcard['nick'];
if((! isset($vcard)) && (! $poll)) {
$ret = scrape_feed($url);
logger('probe_url: scrape_feed returns: ' . print_r($ret,true), LOGGER_DATA);
if(count($ret) && ($ret['feed_atom'] || $ret['feed_rss'])) {
$poll = ((x($ret,'feed_atom')) ? unamp($ret['feed_atom']) : unamp($ret['feed_rss']));
$vcard = array();
if(x($ret,'photo'))
$vcard['photo'] = $ret['photo'];
require_once('simplepie/simplepie.inc');
$feed = new SimplePie();
$xml = fetch_url($poll);
$feed->set_raw_data($xml);
$feed->init();
if(! x($vcard,'photo'))
$vcard['photo'] = $feed->get_image_url();
$author = $feed->get_author();
if($author) {
$vcard['fn'] = unxmlify(trim($author->get_name()));
if(! $vcard['fn'])
$vcard['fn'] = trim(unxmlify($author->get_email()));
if(strpos($vcard['fn'],'@') !== false)
$vcard['fn'] = substr($vcard['fn'],0,strpos($vcard['fn'],'@'));
$vcard['nick'] = strtolower(notags(unxmlify($vcard['fn'])));
if(strpos($vcard['nick'],' '))
$vcard['nick'] = trim(substr($vcard['nick'],0,strpos($vcard['nick'],' ')));
$email = unxmlify($author->get_email());
}
else {
$item = $feed->get_item(0);
if($item) {
$author = $item->get_author();
if($author) {
$vcard['fn'] = trim(unxmlify($author->get_name()));
if(! $vcard['fn'])
$vcard['fn'] = trim(unxmlify($author->get_email()));
if(strpos($vcard['fn'],'@') !== false)
$vcard['fn'] = substr($vcard['fn'],0,strpos($vcard['fn'],'@'));
$vcard['nick'] = strtolower(unxmlify($vcard['fn']));
if(strpos($vcard['nick'],' '))
$vcard['nick'] = trim(substr($vcard['nick'],0,strpos($vcard['nick'],' ')));
$email = unxmlify($author->get_email());
}
if(! $vcard['photo']) {
$rawmedia = $item->get_item_tags('http://search.yahoo.com/mrss/','thumbnail');
if($rawmedia && $rawmedia[0]['attribs']['']['url'])
$vcard['photo'] = unxmlify($rawmedia[0]['attribs']['']['url']);
}
}
}
if((! $vcard['photo']) && strlen($email))
$vcard['photo'] = gravatar_img($email);
if($poll === $profile)
$lnk = $feed->get_permalink();
if(isset($lnk) && strlen($lnk))
$profile = $lnk;
if(! (x($vcard,'fn')))
$vcard['fn'] = notags($feed->get_title());
if(! (x($vcard,'fn')))
$vcard['fn'] = notags($feed->get_description());
$network = 'feed';
$priority = 2;
}
}
}
if(! x($vcard,'photo')) {
$a = get_app();
$vcard['photo'] = $a->get_baseurl() . '/images/default-profile.jpg' ;
}
$vcard['fn'] = notags($vcard['fn']);
$vcard['nick'] = notags($vcard['nick']);
$result['name'] = $vcard['fn'];
$result['nick'] = $vcard['nick'];
$result['url'] = $profile;
$result['addr'] = $addr;
$result['notify'] = $notify;
$result['poll'] = $poll;
$result['request'] = $request;
$result['confirm'] = $confirm;
$result['photo'] = $vcard['photo'];
$result['priority'] = $priority;
$result['network'] = $network;
$result['alias'] = $alias;
logger('probe_url: ' . print_r($result,true), LOGGER_DEBUG);
return $result;
}

View file

@ -57,9 +57,12 @@ function contact_select($selname, $selclass, $preselected = false, $size = 4, $p
$sql_extra .= sprintf(" AND `rel` = %d ", intval(REL_BUD)); $sql_extra .= sprintf(" AND `rel` = %d ", intval(REL_BUD));
} }
if($privmail || $privatenet) { if($privmail) {
$sql_extra .= " AND `network` IN ( 'dfrn' ) "; $sql_extra .= " AND `network` IN ( 'dfrn' ) ";
} }
elseif($privatenet) {
$sql_extra .= " AND `network` IN ( 'dfrn', 'mail' ) ";
}
if($privmail) if($privmail)
$o .= "<select name=\"$selname\" id=\"$selclass\" class=\"$selclass\" size=\"$size\" >\r\n"; $o .= "<select name=\"$selname\" id=\"$selclass\" class=\"$selclass\" size=\"$size\" >\r\n";

View file

@ -85,6 +85,8 @@ function conversation(&$a, $items, $mode, $update) {
$profile_name = ((strlen($item['author-name'])) ? $item['author-name'] : $item['name']); $profile_name = ((strlen($item['author-name'])) ? $item['author-name'] : $item['name']);
$profile_avatar = ((strlen($item['author-avatar'])) ? $item['author-avatar'] : $item['thumb']); $profile_avatar = ((strlen($item['author-avatar'])) ? $item['author-avatar'] : $item['thumb']);
$profile_link = ((strlen($item['author-link'])) ? $item['author-link'] : $item['url']); $profile_link = ((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
if($profile_link === 'mailbox')
$profile_link = '';
$redirect_url = $a->get_baseurl() . '/redir/' . $item['cid'] ; $redirect_url = $a->get_baseurl() . '/redir/' . $item['cid'] ;
@ -360,6 +362,9 @@ function conversation(&$a, $items, $mode, $update) {
else else
$profile_link = $item['url']; $profile_link = $item['url'];
if($profile_link === 'mailbox')
$profile_link = '';
$like = ((x($alike,$item['id'])) ? format_like($alike[$item['id']],$alike[$item['id'] . '-l'],'like',$item['id']) : ''); $like = ((x($alike,$item['id'])) ? format_like($alike[$item['id']],$alike[$item['id'] . '-l'],'like',$item['id']) : '');
$dislike = ((x($dlike,$item['id'])) ? format_like($dlike[$item['id']],$dlike[$item['id'] . '-l'],'dislike',$item['id']) : ''); $dislike = ((x($dlike,$item['id'])) ? format_like($dlike[$item['id']],$dlike[$item['id'] . '-l'],'dislike',$item['id']) : '');
@ -483,6 +488,9 @@ function item_photo_menu($item){
$profile_link = ((strlen($item['author-link'])) ? $item['author-link'] : $item['url']); $profile_link = ((strlen($item['author-link'])) ? $item['author-link'] : $item['url']);
$redirect_url = $a->get_baseurl() . '/redir/' . $item['cid'] ; $redirect_url = $a->get_baseurl() . '/redir/' . $item['cid'] ;
if($profile_link === 'mailbox')
$profile_link = '';
// $item['contact-uid'] is only set on profile page and indicates the uid of the user who owns the profile. // $item['contact-uid'] is only set on profile page and indicates the uid of the user who owns the profile.
$profile_owner = ((x($item,'contact-uid')) && intval($item['contact-uid']) ? intval($item['contact-uid']) : 0); $profile_owner = ((x($item,'contact-uid')) && intval($item['contact-uid']) ? intval($item['contact-uid']) : 0);
@ -495,21 +503,26 @@ function item_photo_menu($item){
if((local_user() && ($profile_owner == 0)) if((local_user() && ($profile_owner == 0))
|| ($profile_owner && $profile_owner == local_user())) { || ($profile_owner && $profile_owner == local_user())) {
if(strlen($item['author-link']) && link_compare($item['author-link'],$item['url'])) if(strlen($item['author-link']) && link_compare($item['author-link'],$item['url'])) {
$redir = $redirect_url; $redir = $redirect_url;
$cid = $item['cid'];
}
elseif(isset($a->authors[$item['author-link']])) { elseif(isset($a->authors[$item['author-link']])) {
$redir = $a->get_baseurl() . '/redir/' . $a->authors[$item['author-link']]['id']; $redir = $a->get_baseurl() . '/redir/' . $a->authors[$item['author-link']]['id'];
$cid = $a->authors[$item['author-link']]['id']; $cid = $a->authors[$item['author-link']]['id'];
} }
if($item['author-link'] === 'mailbox')
$cid = $item['cid'];
if($item['network'] === 'dfrn' && (! $item['self'])) { if((isset($cid)) && (! $item['self'])) {
$contact_url = $a->get_baseurl() . '/contacts/' . $cid;
if($item['network'] === 'dfrn') {
$status_link = $redir . "?url=status"; $status_link = $redir . "?url=status";
$profile_link = $redir . "?url=profile"; $profile_link = $redir . "?url=profile";
$photos_link = $redir . "?url=photos"; $photos_link = $redir . "?url=photos";
$pm_url = $a->get_baseurl() . '/message/new/' . $cid; $pm_url = $a->get_baseurl() . '/message/new/' . $cid;
} }
}
$contact_url = $item['self']?"":$a->get_baseurl() . '/contacts/' . (($item['cid']) ? $item['cid'] : $cid);
} }

191
include/email.php Normal file
View file

@ -0,0 +1,191 @@
<?php
function email_connect($mailbox,$username,$password) {
if(! function_exists('imap_open'))
return false;
$mbox = imap_open($mailbox,$username,$password);
return $mbox;
}
function email_poll($mbox,$email_addr) {
if(! ($mbox && $email_addr))
return array();;
$search = imap_search($mbox,'FROM "' . $email_addr . '"', SE_UID);
return (($search) ? $search : array());
}
function construct_mailbox_name($mailacct) {
$ret = '{' . $mailacct['server'] . (($mailacct['port']) ? ':' . $mailacct['port'] : '');
$ret .= (($mailacct['ssltype']) ? '/' . $mailacct['ssltype'] . '/novalidate-cert' : '');
$ret .= '}' . $mailacct['mailbox'];
return $ret;
}
function email_msg_meta($mbox,$uid) {
$ret = (($mbox && $uid) ? imap_fetch_overview($mbox,$uid,FT_UID) : array(array()));
return ((count($ret)) ? $ret[0] : array());
}
function email_msg_headers($mbox,$uid) {
$raw_header = (($mbox && $uid) ? imap_fetchheader($mbox,$uid,FT_UID) : '');
$raw_header = str_replace("\r",'',$raw_header);
$ret = array();
$h = split("\n",$raw_header);
if(count($h))
foreach($h as $line ) {
if (preg_match("/^[a-zA-Z]/", $line)) {
$key = substr($line,0,strpos($line,':'));
$value = substr($line,strpos($line,':')+1);
$last_entry = strtolower($key);
$ret[$last_entry] = trim($value);
}
else {
$ret[$last_entry] .= ' ' . trim($line);
}
}
return $ret;
}
function email_get_msg($mbox,$uid) {
$ret = array();
$struc = (($mbox && $uid) ? imap_fetchstructure($mbox,$uid,FT_UID) : null);
if(! $struc)
return $ret;
if(! $struc->parts) {
$ret['body'] = email_get_part($mbox,$uid,$struc,0);
}
else {
foreach($struc->parts as $ptop => $p) {
$x = email_get_part($mbox,$uid,$p,$ptop + 1);
if($x)
$ret['body'] = $x;
}
}
return $ret;
}
// At the moment - only return plain/text.
// Later we'll repackage inline images as data url's and make the HTML safe
function email_get_part($mbox,$uid,$p,$partno) {
// $partno = '1', '2', '2.1', '2.1.3', etc for multipart, 0 if simple
global $htmlmsg,$plainmsg,$charset,$attachments;
echo $partno;
// DECODE DATA
$data = ($partno)
? imap_fetchbody($mbox,$uid,$partno, FT_UID|FT_PEEK)
: imap_body($mbox,$uid,FT_UID|FT_PEEK);
// Any part may be encoded, even plain text messages, so check everything.
if ($p->encoding==4)
$data = quoted_printable_decode($data);
elseif ($p->encoding==3)
$data = base64_decode($data);
// PARAMETERS
// get all parameters, like charset, filenames of attachments, etc.
$params = array();
if ($p->parameters)
foreach ($p->parameters as $x)
$params[strtolower($x->attribute)] = $x->value;
if ($p->dparameters)
foreach ($p->dparameters as $x)
$params[strtolower($x->attribute)] = $x->value;
// ATTACHMENT
// Any part with a filename is an attachment,
// so an attached text file (type 0) is not mistaken as the message.
if ($params['filename'] || $params['name']) {
// filename may be given as 'Filename' or 'Name' or both
$filename = ($params['filename'])? $params['filename'] : $params['name'];
// filename may be encoded, so see imap_mime_header_decode()
$attachments[$filename] = $data; // this is a problem if two files have same name
}
// TEXT
if ($p->type == 0 && $data) {
// Messages may be split in different parts because of inline attachments,
// so append parts together with blank row.
if (strtolower($p->subtype)=='plain')
return (trim($data) ."\n\n");
else
$data = '';
// $htmlmsg .= $data ."<br><br>";
$charset = $params['charset']; // assume all parts are same charset
}
// EMBEDDED MESSAGE
// Many bounce notifications embed the original message as type 2,
// but AOL uses type 1 (multipart), which is not handled here.
// There are no PHP functions to parse embedded messages,
// so this just appends the raw source to the main message.
// elseif ($p->type==2 && $data) {
// $plainmsg .= $data."\n\n";
// }
// SUBPART RECURSION
if ($p->parts) {
foreach ($p->parts as $partno0=>$p2) {
$x = email_get_part($mbox,$uid,$p2,$partno . '.' . ($partno0+1)); // 1.2, 1.2.1, etc.
if($x)
return $x;
}
}
}
function email_header_encode($in_str, $charset) {
$out_str = $in_str;
if ($out_str && $charset) {
// define start delimimter, end delimiter and spacer
$end = "?=";
$start = "=?" . $charset . "?B?";
$spacer = $end . "\r\n " . $start;
// determine length of encoded text within chunks
// and ensure length is even
$length = 75 - strlen($start) - strlen($end);
/*
[EDIT BY danbrown AT php DOT net: The following
is a bugfix provided by (gardan AT gmx DOT de)
on 31-MAR-2005 with the following note:
"This means: $length should not be even,
but divisible by 4. The reason is that in
base64-encoding 3 8-bit-chars are represented
by 4 6-bit-chars. These 4 chars must not be
split between two encoded words, according
to RFC-2047.
*/
$length = $length - ($length % 4);
// encode the string and split it into chunks
// with spacers after each chunk
$out_str = base64_encode($out_str);
$out_str = chunk_split($out_str, $length, $spacer);
// remove trailing spacer and
// add start and end delimiters
$spacer = preg_quote($spacer);
$out_str = preg_replace("/" . $spacer . "$/", "", $out_str);
$out_str = $start . $out_str . $end;
}
return $out_str;
}

View file

@ -123,7 +123,8 @@ function group_public_members($gid) {
if(intval($gid)) { if(intval($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 AND `contact`.`network` != 'dfrn' ", WHERE `gid` = %d AND `group_member`.`uid` = %d
AND `contact`.`network` != 'dfrn' AND `contact`.`network` != 'mail' ",
intval($gid), intval($gid),
intval(local_user()) intval(local_user())
); );

View file

@ -1,10 +1,10 @@
<?php <?php
function hostxrd($hostname) { function hostxrd($baseurl) {
header("Content-type: text/xml"); header("Content-type: text/xml");
$tpl = file_get_contents('view/xrd_host.tpl'); $tpl = file_get_contents('view/xrd_host.tpl');
echo str_replace('$domain',$hostname,$tpl); echo str_replace('$domain',$baseurl,$tpl);
session_write_close(); session_write_close();
exit(); exit();

View file

@ -1415,7 +1415,9 @@ function new_follower($importer,$contact,$datarray,$item) {
$res = mail($r[0]['email'], $res = mail($r[0]['email'],
t("You have a new follower at ") . $a->config['sitename'], t("You have a new follower at ") . $a->config['sitename'],
$email, $email,
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] ); 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
} }
} }

View file

@ -72,7 +72,7 @@ function notifier_run($argv, $argc){
else { else {
// find ancestors // find ancestors
$r = q("SELECT `parent`, `uid`, `edited` FROM `item` WHERE `id` = %d LIMIT 1", $r = q("SELECT * FROM `item` WHERE `id` = %d LIMIT 1",
intval($item_id) intval($item_id)
); );
@ -80,6 +80,7 @@ function notifier_run($argv, $argc){
return; return;
} }
$parent_item = $r[0];
$parent_id = intval($r[0]['parent']); $parent_id = intval($r[0]['parent']);
$uid = $r[0]['uid']; $uid = $r[0]['uid'];
$updated = $r[0]['edited']; $updated = $r[0]['edited'];
@ -267,12 +268,25 @@ function notifier_run($argv, $argc){
logger('notifier: slaps: ' . print_r($slaps,true), LOGGER_DATA); logger('notifier: slaps: ' . print_r($slaps,true), LOGGER_DATA);
// If this is a public message and pubmail is set on the parent, include all your email contacts
if((! strlen($parent_item['allow_cid'])) && (! strlen($parent_item['allow_gid'])) && (! strlen($parent_item['deny_cid'])) && (! strlen($parent_item['deny_gid']))
&& (intval($parent_item['pubmail']))) {
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `network` = '%s'",
intval($uid),
dbesc(NETWORK_MAIL)
);
if(count($r)) {
foreach($r as $rr)
$recipients[] = $rr['id'];
}
}
if($followup) if($followup)
$recip_str = $parent['contact-id']; $recip_str = $parent['contact-id'];
else else
$recip_str = implode(', ', $recipients); $recip_str = implode(', ', $recipients);
$r = q("SELECT * FROM `contact` WHERE `id` IN ( %s ) AND `blocked` = 0 AND `pending` = 0 ", $r = q("SELECT * FROM `contact` WHERE `id` IN ( %s ) AND `blocked` = 0 AND `pending` = 0 ",
dbesc($recip_str) dbesc($recip_str)
); );
@ -352,6 +366,79 @@ function notifier_run($argv, $argc){
} }
break; break;
case 'mail': case 'mail':
// WARNING: does not currently convert to RFC2047 header encodings, etc.
$addr = $contact['addr'];
if(! strlen($addr))
break;
if($cmd === 'wall-new' || $cmd === 'comment-new') {
$it = null;
if($cmd === 'wall-new')
$it = $items[0];
else {
$r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1",
intval($argv[2]),
intval($uid)
);
if(count($r))
$it = $r[0];
}
if(! $it)
break;
$local_user = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1",
intval($uid)
);
if(! count($local_user))
break;
$reply_to = '';
$r1 = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
intval($uid)
);
if($r1 && $r1[0]['reply_to'])
$reply_to = $r1[0]['reply_to'];
$subject = (($it['title']) ? $it['title'] : t("\x28no subject\x29")) ;
$headers = 'From: ' . $local_user[0]['username'] . ' <' . $local_user[0]['email'] . '>' . "\n";
if($reply_to)
$headers .= 'Reply-to: ' . $reply_to . "\n";
$headers .= 'Message-id: <' . $it['uri'] . '>' . "\n";
if($it['uri'] !== $it['parent-uri']) {
$header .= 'References: <' . $it['parent-uri'] . '>' . "\n";
if(! strlen($it['title'])) {
$r = q("SELECT `title` FROM `item` WHERE `parent-uri` = '%s' LIMIT 1",
dbesc($it['parent-uri'])
);
if(count($r)) {
$subtitle = $r[0]['title'];
if($subtitle) {
if(strncasecmp($subtitle,'RE:',3))
$subject = $subtitle;
else
$subject = 'Re: ' . $subtitle;
}
}
}
}
$headers .= 'MIME-Version: 1.0' . "\n";
$headers .= 'Content-Type: text/html; charset=UTF-8' . "\n";
$headers .= 'Content-Transfer-Encoding: 8bit' . "\n\n";
$html = prepare_body($it);
$message = '<html><body>' . $html . '</body></html>';
logger('notifier: email delivery to ' . $addr);
mail($addr, $subject, $message, $headers);
}
break;
case 'dspr': case 'dspr':
case 'feed': case 'feed':
case 'face': case 'face':

View file

@ -1,4 +1,5 @@
<?php <?php
require_once("boot.php"); require_once("boot.php");
function poller_run($argv, $argc){ function poller_run($argv, $argc){
@ -15,11 +16,14 @@ function poller_run($argv, $argc){
unset($db_host, $db_user, $db_pass, $db_data); unset($db_host, $db_user, $db_pass, $db_data);
}; };
$mbox = null;
require_once('session.php'); require_once('session.php');
require_once('datetime.php'); require_once('datetime.php');
require_once('simplepie/simplepie.inc'); require_once('simplepie/simplepie.inc');
require_once('include/items.php'); require_once('include/items.php');
require_once('include/Contact.php'); require_once('include/Contact.php');
require_once('include/email.php');
$a->set_baseurl(get_config('system','url')); $a->set_baseurl(get_config('system','url'));
@ -85,6 +89,9 @@ function poller_run($argv, $argc){
continue; continue;
foreach($res as $contact) { foreach($res as $contact) {
$xml = false;
if($manual_id) if($manual_id)
$contact['last-update'] = '0000-00-00 00:00:00'; $contact['last-update'] = '0000-00-00 00:00:00';
@ -158,7 +165,7 @@ function poller_run($argv, $argc){
: datetime_convert('UTC','UTC',$contact['last-update'], ATOM_TIME) : datetime_convert('UTC','UTC',$contact['last-update'], ATOM_TIME)
); );
if($contact['network'] === 'dfrn') { if($contact['network'] === NETWORK_DFRN) {
$idtosend = $orig_id = (($contact['dfrn-id']) ? $contact['dfrn-id'] : $contact['issued-id']); $idtosend = $orig_id = (($contact['dfrn-id']) ? $contact['dfrn-id'] : $contact['issued-id']);
@ -175,12 +182,12 @@ function poller_run($argv, $argc){
. '&type=data&last_update=' . $last_update . '&type=data&last_update=' . $last_update
. '&perm=' . $perm ; . '&perm=' . $perm ;
$xml = fetch_url($url); $handshake_xml = fetch_url($url);
logger('poller: handshake with url ' . $url . ' returns xml: ' . $xml, LOGGER_DATA); logger('poller: handshake with url ' . $url . ' returns xml: ' . $handshake_xml, LOGGER_DATA);
if(! $xml) { if(! $handshake_xml) {
logger("poller: $url appears to be dead - marking for death "); logger("poller: $url appears to be dead - marking for death ");
// dead connection - might be a transient event, or this might // dead connection - might be a transient event, or this might
// mean the software was uninstalled or the domain expired. // mean the software was uninstalled or the domain expired.
@ -197,7 +204,7 @@ function poller_run($argv, $argc){
continue; continue;
} }
if(! strstr($xml,'<?xml')) { if(! strstr($handshake_xml,'<?xml')) {
logger('poller: response from ' . $url . ' did not contain XML.'); logger('poller: response from ' . $url . ' did not contain XML.');
$r = q("UPDATE `contact` SET `last-update` = '%s' WHERE `id` = %d LIMIT 1", $r = q("UPDATE `contact` SET `last-update` = '%s' WHERE `id` = %d LIMIT 1",
dbesc(datetime_convert()), dbesc(datetime_convert()),
@ -207,7 +214,7 @@ function poller_run($argv, $argc){
} }
$res = parse_xml_string($xml); $res = parse_xml_string($handshake_xml);
if(intval($res->status) == 1) { if(intval($res->status) == 1) {
logger("poller: $url replied status 1 - marking for death "); logger("poller: $url replied status 1 - marking for death ");
@ -265,18 +272,124 @@ function poller_run($argv, $argc){
$xml = post_url($contact['poll'],$postvars); $xml = post_url($contact['poll'],$postvars);
} }
else { elseif(($contact['network'] === NETWORK_OSTATUS)
|| ($contact['network'] === NETWORK_DIASPORA)
|| ($contact['network'] === NETWORK_FEED) ) {
// $contact['network'] !== 'dfrn' // Upgrading DB fields from an older Friendika version
// Will only do this once per notify-enabled OStatus contact
if(($contact['notify']) && (! $contact['writable'])) { if(($contact['notify']) && (! $contact['writable'])) {
q("UPDATE `contact` SET `writable` = 1 WHERE `id` = %d LIMIT 1", q("UPDATE `contact` SET `writable` = 1 WHERE `id` = %d LIMIT 1",
intval($contact['id']) intval($contact['id'])
); );
} }
$xml = fetch_url($contact['poll']); $xml = fetch_url($contact['poll']);
} }
elseif($contact['network'] === NETWORK_MAIL) {
if(! $mbox) {
$x = q("SELECT `prvkey` FROM `user` WHERE `uid` = %d LIMIT 1",
intval($importer_uid)
);
$mailconf = q("SELECT * FROM `mailacct` WHERE `server` != '' AND `uid` = %d LIMIT 1",
intval($importer_uid)
);
if(count($x) && count($mailconf)) {
$mailbox = construct_mailbox_name($mailconf[0]);
$password = '';
openssl_private_decrypt(hex2bin($mailconf[0]['pass']),$password,$x[0]['prvkey']);
$mbox = email_connect($mailbox,$mailconf[0]['user'],$password);
unset($password);
if($mbox) {
q("UPDATE `mailacct` SET `last_check` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
dbesc(datetime_convert()),
intval($mailconf[0]['id']),
intval($importer_uid)
);
}
}
}
if($mbox) {
$msgs = email_poll($mbox,$contact['addr']);
if(count($msgs)) {
foreach($msgs as $msg_uid) {
$datarray = array();
$meta = email_msg_meta($mbox,$msg_uid);
$headers = email_msg_headers($mbox,$msg_uid);
// look for a 'references' header and try and match with a parent item we have locally.
$raw_refs = ((x($headers,'references')) ? str_replace("\t",'',$headers['references']) : '');
$datarray['uri'] = trim($meta->message_id,'<>');
if($raw_refs) {
$refs_arr = explode(' ', $raw_refs);
if(count($refs_arr)) {
for($x = 0; $x < count($refs_arr); $x ++)
$refs_arr[$x] = "'" . str_replace(array('<','>',' '),array('','',''),dbesc($refs_arr[$x])) . "'";
}
$qstr = implode(',',$refs_arr);
$r = q("SELECT `uri` , `parent-uri` FROM `item` WHERE `uri` IN ( $qstr ) AND `uid` = %d LIMIT 1",
intval($importer_uid)
);
if(count($r))
$datarray['parent-uri'] = $r[0]['uri'];
}
if(! x($datarray,'parent-uri'))
$datarray['parent-uri'] = $datarray['uri'];
// Have we seen it before?
$r = q("SELECT * FROM `item` WHERE `uid` = %d AND `uri` = '%s' LIMIT 1",
intval($importer_uid),
dbesc($datarray['uri'])
);
if(count($r)) {
if($meta->deleted && ! $r[0]['deleted']) {
q("UPDATE `item` SET `deleted` = `, `changed` = '%s' WHERE `id` = %d LIMIT 1",
dbesc(datetime_convert()),
intval($r[0]['id'])
);
}
continue;
}
$datarray['title'] = notags(trim($meta->subject));
$datarray['created'] = datetime_convert('UTC','UTC',$meta->date);
$r = email_get_msg($mbox,$msg_uid);
if(! $r)
continue;
$datarray['body'] = escape_tags($r['body']);
$datarray['uid'] = $importer_uid;
$datarray['contact-id'] = $contact['id'];
if($datarray['parent-uri'] === $datarray['uri'])
$datarray['private'] = 1;
$datarray['author-name'] = $contact['name'];
$datarray['author-link'] = 'mailbox';
$datarray['author-avatar'] = $contact['photo'];
$stored_item = item_store($datarray);
q("UPDATE `item` SET `last-child` = 0 WHERE `parent-uri` = '%s' AND `uid` = %d",
dbesc($datarray['parent-uri']),
intval($importer_uid)
);
q("UPDATE `item` SET `last-child` = 1 WHERE `id` = %d LIMIT 1",
intval($stored_item)
);
}
}
}
}
elseif($contact['network'] === NETWORK_FACEBOOK) {
// TODO: work in progress
}
if($xml) {
logger('poller: received xml : ' . $xml, LOGGER_DATA); logger('poller: received xml : ' . $xml, LOGGER_DATA);
if(! strstr($xml,'<?xml')) { if(! strstr($xml,'<?xml')) {
@ -296,8 +409,7 @@ function poller_run($argv, $argc){
consume_feed($xml,$importer,$contact,$hub,1); consume_feed($xml,$importer,$contact,$hub,1);
if((strlen($hub)) && ($hub_update) if((strlen($hub)) && ($hub_update) && (($contact['rel'] == REL_BUD) || (($contact['network'] === NETWORK_OSTATUS) && (! $contact['readonly'])))) {
&& (($contact['rel'] == REL_BUD) || (($contact['network'] === 'stat') && (! $contact['readonly'])))) {
logger('poller: subscribing to hub(s) : ' . $hub . ' contact name : ' . $contact['name'] . ' local user : ' . $importer['name']); logger('poller: subscribing to hub(s) : ' . $hub . ' contact name : ' . $contact['name'] . ' local user : ' . $importer['name']);
$hubs = explode(',', $hub); $hubs = explode(',', $hub);
if(count($hubs)) { if(count($hubs)) {
@ -309,7 +421,7 @@ function poller_run($argv, $argc){
} }
} }
} }
}
$updated = datetime_convert(); $updated = datetime_convert();
@ -323,6 +435,9 @@ function poller_run($argv, $argc){
} }
} }
if($mbox && function_exists('imap_close'))
imap_close($mbox);
return; return;
} }

View file

@ -284,7 +284,7 @@ function contacts_content(&$a) {
'$contact_id' => $r[0]['id'], '$contact_id' => $r[0]['id'],
'$block_text' => (($r[0]['blocked']) ? t('Unblock this contact') : t('Block this contact') ), '$block_text' => (($r[0]['blocked']) ? t('Unblock this contact') : t('Block this contact') ),
'$ignore_text' => (($r[0]['readonly']) ? t('Unignore this contact') : t('Ignore this contact') ), '$ignore_text' => (($r[0]['readonly']) ? t('Unignore this contact') : t('Ignore this contact') ),
'$insecure' => (($r[0]['network'] !== 'dfrn') ? $insecure : ''), '$insecure' => (($r[0]['network'] !== NETWORK_DFRN && $r[0]['network'] !== NETWORK_MAIL) ? $insecure : ''),
'$info' => $r[0]['info'], '$info' => $r[0]['info'],
'$blocked' => (($r[0]['blocked']) ? '<div id="block-message">' . t('Currently blocked') . '</div>' : ''), '$blocked' => (($r[0]['blocked']) ? '<div id="block-message">' . t('Currently blocked') . '</div>' : ''),
'$ignored' => (($r[0]['readonly']) ? '<div id="ignore-message">' . t('Currently ignored') . '</div>' : ''), '$ignored' => (($r[0]['readonly']) ? '<div id="ignore-message">' . t('Currently ignored') . '</div>' : ''),

View file

@ -651,7 +651,11 @@ function dfrn_confirm_post(&$a,$handsfree = null) {
); );
$res = mail($r[0]['email'], sprintf( t("Connection accepted at %s") , $a->config['sitename']), $res = mail($r[0]['email'], sprintf( t("Connection accepted at %s") , $a->config['sitename']),
$email_tpl, 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] ); $email_tpl,
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
if(!$res) { if(!$res) {
// pointless throwing an error here and confusing the person at the other end of the wire. // pointless throwing an error here and confusing the person at the other end of the wire.
} }

View file

@ -401,7 +401,11 @@ function dfrn_notify_post(&$a) {
)); ));
$res = mail($importer['email'], sprintf(t('%s commented on an item at %s'), $from , $a->config['sitename']), $res = mail($importer['email'], sprintf(t('%s commented on an item at %s'), $from , $a->config['sitename']),
$email_tpl, "From: " . t('Administrator') . '@' . $a->get_hostname() ); $email_tpl,
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
} }
} }
xml_status(0); xml_status(0);
@ -487,7 +491,11 @@ function dfrn_notify_post(&$a) {
)); ));
$res = mail($importer['email'], sprintf( t("%s commented on an item at %s") , $from ,$a->config['sitename']), $res = mail($importer['email'], sprintf( t("%s commented on an item at %s") , $from ,$a->config['sitename']),
$email_tpl, "From: ".t("Administrator") . "@". $a->get_hostname() ); $email_tpl,
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
break; break;
} }
} }

View file

@ -544,7 +544,10 @@ function dfrn_request_content(&$a) {
$res = mail($r[0]['email'], $res = mail($r[0]['email'],
t("Introduction received at ") . $a->config['sitename'], t("Introduction received at ") . $a->config['sitename'],
$email, $email,
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] ); 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
// This is a redundant notification - no point throwing errors if it fails. // This is a redundant notification - no point throwing errors if it fails.
} }
if($auto_confirm) { if($auto_confirm) {
@ -615,17 +618,18 @@ function dfrn_request_content(&$a) {
$o .= replace_macros($tpl,array( $o .= replace_macros($tpl,array(
'$header' => t('Friend/Connection Request'), '$header' => t('Friend/Connection Request'),
'$desc' => t('Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca'),
'$pls_answer' => t('Please answer the following:'), '$pls_answer' => t('Please answer the following:'),
'$does_know' => t('Does $name know you?'), '$does_know' => t('Does $name know you?'),
'$yes' => t('Yes'), '$yes' => t('Yes'),
'$no' => t('No'), '$no' => t('No'),
'$add_note' => t('Add a personal note:'), '$add_note' => t('Add a personal note:'),
'$page_desc' => t('Please enter your profile address from one of the following supported social networks:'), '$page_desc' => t("Please enter your 'Identity Address' from one of the following supported social networks:"),
'$friendika' => t('Friendika'), '$friendika' => t('Friendika'),
'$statusnet' => t('StatusNet/Federated Social Web'), '$statusnet' => t('StatusNet/Federated Social Web'),
'$private_net' => t("Private \x28secure\x29 network"), '$private_net' => t("Private \x28secure\x29 network"),
'$public_net' => t("Public \x28insecure\x29 network"), '$public_net' => t("Public \x28insecure\x29 network"),
'$your_address' => t('Your profile address:'), '$your_address' => t('Your Identity Address:'),
'$submit' => t('Submit Request'), '$submit' => t('Submit Request'),
'$cancel' => t('Cancel'), '$cancel' => t('Cancel'),
'$nickname' => $a->argv[1], '$nickname' => $a->argv[1],

View file

@ -51,6 +51,28 @@ function editpost_content(&$a) {
$jotplugins = ''; $jotplugins = '';
$jotnets = ''; $jotnets = '';
$mail_enabled = false;
$pubmail_enabled = false;
$r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1",
intval(local_user())
);
if(count($r)) {
$mail_enabled = true;
if(intval($r[0]['pubmail']))
$pubmail_enabled = true;
}
if($mail_enabled) {
$selected = (($pubmail_enabled) ? ' checked="checked" ' : '');
$jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . 'value="1" /> '
. t("Post to Email") . '</div>';
}
call_hooks('jot_tool', $jotplugins); call_hooks('jot_tool', $jotplugins);
call_hooks('jot_networks', $jotnets); call_hooks('jot_networks', $jotnets);

View file

@ -11,200 +11,45 @@ function follow_post(&$a) {
} }
$url = $orig_url = notags(trim($_POST['url'])); $url = $orig_url = notags(trim($_POST['url']));
$diaspora = false;
$email_conversant = false;
if($url) { $ret = probe_url($url);
$links = lrdd($url);
if(count($links)) {
foreach($links as $link) {
if($link['@attributes']['rel'] === NAMESPACE_DFRN)
$dfrn = unamp($link['@attributes']['href']);
if($link['@attributes']['rel'] === 'salmon')
$notify = unamp($link['@attributes']['href']);
if($link['@attributes']['rel'] === NAMESPACE_FEED)
$poll = unamp($link['@attributes']['href']);
if($link['@attributes']['rel'] === 'http://microformats.org/profile/hcard')
$hcard = unamp($link['@attributes']['href']);
if($link['@attributes']['rel'] === 'http://webfinger.net/rel/profile-page')
$profile = unamp($link['@attributes']['href']);
if($link['@attributes']['rel'] === 'http://joindiaspora.com/seed_location')
$diaspora = true;
} if($ret['network'] === NETWORK_DFRN) {
// Status.Net can have more than one profile URL. We need to match the profile URL
// to a contact on incoming messages to prevent spam, and we won't know which one
// to match. So in case of two, one of them is stored as an alias. Only store URL's
// and not webfinger user@host aliases. If they've got more than two non-email style
// aliases, let's hope we're lucky and get one that matches the feed author-uri because
// otherwise we're screwed.
foreach($links as $link) {
if($link['@attributes']['rel'] === 'alias') {
if(strpos($link['@attributes']['href'],'@') === false) {
if(isset($profile)) {
if($link['@attributes']['href'] !== $profile)
$alias = unamp($link['@attributes']['href']);
}
else
$profile = unamp($link['@attributes']['href']);
}
}
}
}
else {
if((strpos($orig_url,'@')) && validate_email($orig_url)) {
$email_conversant = true;
}
}
}
// If we find a DFRN site, send our subscriber to the other person's
// dfrn_request page and all the other details will get sorted.
if(strlen($dfrn)) {
$ret = scrape_dfrn($dfrn);
if(is_array($ret) && x($ret,'dfrn-request')) {
if(strlen($a->path)) if(strlen($a->path))
$myaddr = bin2hex($a->get_baseurl() . '/profile/' . $a->user['nickname']); $myaddr = bin2hex($a->get_baseurl() . '/profile/' . $a->user['nickname']);
else else
$myaddr = bin2hex($a->user['nickname'] . '@' . $a->get_hostname()); $myaddr = bin2hex($a->user['nickname'] . '@' . $a->get_hostname());
goaway($ret['dfrn-request'] . "&addr=$myaddr"); goaway($ret['request'] . "&addr=$myaddr");
// NOTREACHED // NOTREACHED
} }
}
$network = 'stat';
$priority = 0;
if($hcard) {
$vcard = scrape_vcard($hcard);
// Google doesn't use absolute url in profile photos
if((x($vcard,'photo')) && substr($vcard['photo'],0,1) == '/') {
$h = @parse_url($hcard);
if($h)
$vcard['photo'] = $h['scheme'] . '://' . $h['host'] . $vcard['photo'];
}
logger('mod_follow: scrape_vcard: ' . print_r($vcard,true), LOGGER_DATA);
}
if(! $profile) {
if($diaspora)
$profile = $hcard;
else
$profile = $url;
}
if(! x($vcard,'fn'))
if(x($vcard,'nick'))
$vcard['fn'] = $vcard['nick'];
if((! isset($vcard)) && (! $poll)) {
$ret = scrape_feed($url);
logger('mod_follow: scrape_feed returns: ' . print_r($ret,true), LOGGER_DATA);
if(count($ret) && ($ret['feed_atom'] || $ret['feed_rss'])) {
$poll = ((x($ret,'feed_atom')) ? unamp($ret['feed_atom']) : unamp($ret['feed_rss']));
$vcard = array();
if(x($ret,'photo'))
$vcard['photo'] = $ret['photo'];
require_once('simplepie/simplepie.inc');
$feed = new SimplePie();
$xml = fetch_url($poll);
$feed->set_raw_data($xml);
$feed->init();
if(! x($vcard,'photo'))
$vcard['photo'] = $feed->get_image_url();
$author = $feed->get_author();
if($author) {
$vcard['fn'] = unxmlify(trim($author->get_name()));
if(! $vcard['fn'])
$vcard['fn'] = trim(unxmlify($author->get_email()));
if(strpos($vcard['fn'],'@') !== false)
$vcard['fn'] = substr($vcard['fn'],0,strpos($vcard['fn'],'@'));
$vcard['nick'] = strtolower(notags(unxmlify($vcard['fn'])));
if(strpos($vcard['nick'],' '))
$vcard['nick'] = trim(substr($vcard['nick'],0,strpos($vcard['nick'],' ')));
$email = unxmlify($author->get_email());
}
else {
$item = $feed->get_item(0);
if($item) {
$author = $item->get_author();
if($author) {
$vcard['fn'] = trim(unxmlify($author->get_name()));
if(! $vcard['fn'])
$vcard['fn'] = trim(unxmlify($author->get_email()));
if(strpos($vcard['fn'],'@') !== false)
$vcard['fn'] = substr($vcard['fn'],0,strpos($vcard['fn'],'@'));
$vcard['nick'] = strtolower(unxmlify($vcard['fn']));
if(strpos($vcard['nick'],' '))
$vcard['nick'] = trim(substr($vcard['nick'],0,strpos($vcard['nick'],' ')));
$email = unxmlify($author->get_email());
}
if(! $vcard['photo']) {
$rawmedia = $item->get_item_tags('http://search.yahoo.com/mrss/','thumbnail');
if($rawmedia && $rawmedia[0]['attribs']['']['url'])
$vcard['photo'] = unxmlify($rawmedia[0]['attribs']['']['url']);
}
}
}
if((! $vcard['photo']) && strlen($email))
$vcard['photo'] = gravatar_img($email);
if($poll === $profile)
$lnk = $feed->get_permalink();
if(isset($lnk) && strlen($lnk))
$profile = $lnk;
if(! (x($vcard,'fn')))
$vcard['fn'] = notags($feed->get_title());
if(! (x($vcard,'fn')))
$vcard['fn'] = notags($feed->get_description());
$network = 'feed';
$priority = 2;
}
}
logger('follow: poll=' . $poll . ' notify=' . $notify . ' profile=' . $profile . ' vcard=' . print_r($vcard,true));
$vcard['fn'] = notags($vcard['fn']);
$vcard['nick'] = notags($vcard['nick']);
// do we have enough information? // do we have enough information?
if(! ((x($vcard['fn'])) && ($poll) && ($profile))) { if(! ((x($ret,'name')) && (x($ret,'poll')) && ((x($ret,'url')) || (x($ret,'addr'))))) {
notice( t('The profile address specified does not provide adequate information.') . EOL); notice( t('The profile address specified does not provide adequate information.') . EOL);
goaway($_SESSION['return_url']); goaway($_SESSION['return_url']);
} }
if(! $notify) { if(! $ret['notify']) {
notice( t('Limited profile. This person will be unable to receive direct/personal notifications from you.') . EOL); notice( t('Limited profile. This person will be unable to receive direct/personal notifications from you.') . EOL);
} }
if(! x($vcard,'photo')) $writeable = ((($ret['network'] === NETWORK_OSTATUS) && ($ret['notify'])) ? 1 : 0);
$vcard['photo'] = $a->get_baseurl() . '/images/default-profile.jpg' ; if($ret['network'] === NETWORK_MAIL) {
$writeable = 1;
$writeable = ((($network === 'stat') && ($notify)) ? 1 : 0);
}
// check if we already have a contact // check if we already have a contact
// the poll url is more reliable than the profile url, as we may have // the poll url is more reliable than the profile url, as we may have
// indirect links or webfinger links // indirect links or webfinger links
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `poll` = '%s' LIMIT 1", $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `poll` = '%s' LIMIT 1",
intval(local_user()), intval(local_user()),
dbesc($poll) dbesc($ret['poll'])
); );
if(count($r)) { if(count($r)) {
@ -219,27 +64,28 @@ function follow_post(&$a) {
} }
else { else {
// create contact record // create contact record
$r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `alias`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `rel`, `priority`, $r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `addr`, `alias`, `notify`, `poll`, `name`, `nick`, `photo`, `network`, `rel`, `priority`,
`writable`, `blocked`, `readonly`, `pending` ) `writable`, `blocked`, `readonly`, `pending` )
VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ", VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, 0, 0, 0 ) ",
intval(local_user()), intval(local_user()),
dbesc(datetime_convert()), dbesc(datetime_convert()),
dbesc($profile), dbesc($ret['url']),
dbesc($alias), dbesc($ret['addr']),
dbesc($notify), dbesc($ret['alias']),
dbesc($poll), dbesc($ret['notify']),
dbesc($vcard['fn']), dbesc($ret['poll']),
dbesc($vcard['nick']), dbesc($ret['name']),
dbesc($vcard['photo']), dbesc($ret['nick']),
dbesc($network), dbesc($ret['photo']),
intval(REL_FAN), dbesc($ret['network']),
intval($priority), intval(($ret['network'] === NETWORK_MAIL) ? REL_BUD : REL_FAN),
intval($writable) intval($ret['priority']),
intval($writeable)
); );
} }
$r = q("SELECT * FROM `contact` WHERE `url` = '%s' AND `uid` = %d LIMIT 1", $r = q("SELECT * FROM `contact` WHERE `url` = '%s' AND `uid` = %d LIMIT 1",
dbesc($profile), dbesc($ret['url']),
intval(local_user()) intval(local_user())
); );
@ -254,7 +100,7 @@ function follow_post(&$a) {
require_once("Photo.php"); require_once("Photo.php");
$photos = import_profile_photo($vcard['photo'],local_user(),$contact_id); $photos = import_profile_photo($ret['photo'],local_user(),$contact_id);
$r = q("UPDATE `contact` SET `photo` = '%s', $r = q("UPDATE `contact` SET `photo` = '%s',
`thumb` = '%s', `thumb` = '%s',

View file

@ -22,12 +22,16 @@ function help_content(&$a) {
$text = ''; $text = '';
if($a->argc > 1) if($a->argc > 1) {
$text = load_doc_file('doc/' . $a->argv[1] . '.md'); $text = load_doc_file('doc/' . $a->argv[1] . '.md');
$a->page['title'] = t('Help:') . ' ' . str_replace('-',' ',notags($a->argv[1]));
}
if(! $text) { if(! $text) {
$text = load_doc_file('doc/Home.md'); $text = load_doc_file('doc/Home.md');
$a->page['title'] = t('Help');
} }
return Markdown($text); return Markdown($text);
} }

View file

@ -30,7 +30,11 @@ function invite_post(&$a) {
} }
$res = mail($recip, sprintf(t('Please join my network on %s'), $a->config['sitename']), $res = mail($recip, sprintf(t('Please join my network on %s'), $a->config['sitename']),
$message, "From: " . $a->user['email']); $message,
"From: " . $a->user['email'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
if($res) { if($res) {
$total ++; $total ++;
} }

View file

@ -96,6 +96,7 @@ function item_post(&$a) {
$body = escape_tags(trim($_POST['body'])); $body = escape_tags(trim($_POST['body']));
$private = $orig_post['private']; $private = $orig_post['private'];
$pubmail_enable = $orig_post['pubmail'];
} }
else { else {
$str_group_allow = perms2str($_POST['group_allow']); $str_group_allow = perms2str($_POST['group_allow']);
@ -121,6 +122,7 @@ function item_post(&$a) {
$private = 1; $private = 1;
} }
$pubmail_enable = ((x($_POST,'pubmail_enable') && intval($_POST['pubmail_enable']) && (! $private)) ? 1 : 0);
if(! strlen($body)) { if(! strlen($body)) {
notice( t('Empty post discarded.') . EOL ); notice( t('Empty post discarded.') . EOL );
@ -362,6 +364,7 @@ function item_post(&$a) {
$datarray['deny_cid'] = $str_contact_deny; $datarray['deny_cid'] = $str_contact_deny;
$datarray['deny_gid'] = $str_group_deny; $datarray['deny_gid'] = $str_group_deny;
$datarray['private'] = $private; $datarray['private'] = $private;
$datarray['pubmail'] = $pubmail_enable;
/** /**
* These fields are for the convenience of plugins... * These fields are for the convenience of plugins...
@ -399,8 +402,8 @@ function item_post(&$a) {
$r = q("INSERT INTO `item` (`uid`,`type`,`wall`,`gravity`,`contact-id`,`owner-name`,`owner-link`,`owner-avatar`, $r = q("INSERT INTO `item` (`uid`,`type`,`wall`,`gravity`,`contact-id`,`owner-name`,`owner-link`,`owner-avatar`,
`author-name`, `author-link`, `author-avatar`, `created`, `edited`, `changed`, `uri`, `title`, `body`, `location`, `coord`, `author-name`, `author-link`, `author-avatar`, `created`, `edited`, `changed`, `uri`, `title`, `body`, `location`, `coord`,
`tag`, `inform`, `verb`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`, `private` ) `tag`, `inform`, `verb`, `allow_cid`, `allow_gid`, `deny_cid`, `deny_gid`, `private`, `pubmail` )
VALUES( %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d )", VALUES( %d, '%s', %d, %d, %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d )",
intval($datarray['uid']), intval($datarray['uid']),
dbesc($datarray['type']), dbesc($datarray['type']),
intval($datarray['wall']), intval($datarray['wall']),
@ -427,7 +430,8 @@ function item_post(&$a) {
dbesc($datarray['allow_gid']), dbesc($datarray['allow_gid']),
dbesc($datarray['deny_cid']), dbesc($datarray['deny_cid']),
dbesc($datarray['deny_gid']), dbesc($datarray['deny_gid']),
intval($datarray['private']) intval($datarray['private']),
intval($datarray['pubmail'])
); );
$r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' LIMIT 1", $r = q("SELECT `id` FROM `item` WHERE `uri` = '%s' LIMIT 1",
@ -472,7 +476,10 @@ function item_post(&$a) {
)); ));
$res = mail($user['email'], sprintf( t("%s commented on your item at %s") ,$from,$a->config['sitename']), $res = mail($user['email'], sprintf( t("%s commented on your item at %s") ,$from,$a->config['sitename']),
$email_tpl,"From: " . t("Administrator") . "@" . $a->get_hostname() ); $email_tpl,
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
} }
} }
else { else {
@ -495,7 +502,11 @@ function item_post(&$a) {
)); ));
$res = mail($user['email'], sprintf( t("%s posted on your profile wall at %s") ,$from, $a->config['sitename']), $res = mail($user['email'], sprintf( t("%s posted on your profile wall at %s") ,$from, $a->config['sitename']),
$email_tpl,"From: " . t("Administrator") . "@" . $a->get_hostname() ); $email_tpl,
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
} }
} }
@ -538,11 +549,10 @@ function item_post(&$a) {
$addr = trim($recip); $addr = trim($recip);
if(! strlen($addr)) if(! strlen($addr))
continue; continue;
$disclaimer = '<hr />' . sprintf(t('This message was sent to you by %s, a member of the Friendika social network.'),$a->user['username']) $disclaimer = '<hr />' . sprintf( t('This message was sent to you by %s, a member of the Friendika social network.'),$a->user['username'])
. '<br />'; . '<br />';
$disclaimer .= t('You may visit them online at') . ' ' $disclaimer .= sprintf( t('You may visit them online at %s'), $a->get_baseurl() . '/profile/' . $a->user['nickname']) . EOL;
. $a->get_baseurl() . '/profile/' . $a->user['nickname'] . '<br />'; $disclaimer .= t('Please contact the sender by replying to this post if you do not wish to receive these messages.') . EOL;
$disclaimer .= t('Please contact the sender by replying to this post if you do not wish to receive these messages.') . '<br />';
$subject = '[Friendika]' . ' ' . sprintf( t('%s posted an update.'),$a->user['username']); $subject = '[Friendika]' . ' ' . sprintf( t('%s posted an update.'),$a->user['username']);
$headers = 'From: ' . $a->user['username'] . ' <' . $a->user['email'] . '>' . "\n"; $headers = 'From: ' . $a->user['username'] . ' <' . $a->user['email'] . '>' . "\n";

View file

@ -36,7 +36,11 @@ function lostpass_post(&$a) {
)); ));
$res = mail($email, sprintf( t('Password reset requested at %s'),$a->config['sitename']), $res = mail($email, sprintf( t('Password reset requested at %s'),$a->config['sitename']),
$email_tpl, 'From: ' . t('Administrator') . '@' . $_SERVER[SERVER_NAME]); $email_tpl,
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
goaway($a->get_baseurl()); goaway($a->get_baseurl());
} }
@ -94,7 +98,10 @@ function lostpass_content(&$a) {
'$new_password' => $new_password, '$new_password' => $new_password,
'$uid' => $newuid )); '$uid' => $newuid ));
$res = mail($email,"Your password has changed at {$a->config['sitename']}",$email_tpl,"From: Administrator@{$_SERVER[SERVER_NAME]}"); $res = mail($email,"Your password has changed at {$a->config['sitename']}",$email_tpl,
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
return $o; return $o;
} }

View file

@ -94,6 +94,28 @@ function network_content(&$a, $update = 0) {
$jotplugins = ''; $jotplugins = '';
$jotnets = ''; $jotnets = '';
$mail_enabled = false;
$pubmail_enabled = false;
$r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1",
intval(local_user())
);
if(count($r)) {
$mail_enabled = true;
if(intval($r[0]['pubmail']))
$pubmail_enabled = true;
}
if($mail_enabled) {
$selected = (($pubmail_enabled) ? ' checked="checked" ' : '');
$jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . 'value="1" /> '
. t("Post to Email") . '</div>';
}
call_hooks('jot_tool', $jotplugins); call_hooks('jot_tool', $jotplugins);
call_hooks('jot_networks', $jotnets); call_hooks('jot_networks', $jotnets);

View file

@ -147,6 +147,26 @@ function profile_content(&$a, $update = 0) {
$jotplugins = ''; $jotplugins = '';
$jotnets = ''; $jotnets = '';
$mail_enabled = false;
$pubmail_enabled = false;
if($is_owner) {
$r = q("SELECT * FROM `mailacct` WHERE `uid` = %d AND `server` != '' LIMIT 1",
intval(local_user())
);
if(count($r)) {
$mail_enabled = true;
if(intval($r[0]['pubmail']))
$pubmail_enabled = true;
}
}
if($mail_enabled) {
$selected = (($pubmail_enabled) ? ' checked="checked" ' : '');
$jotnets .= '<div class="profile-jot-net"><input type="checkbox" name="pubmail_enable"' . $selected . 'value="1" /> '
. t("Post to Email") . '</div>';
}
call_hooks('jot_tool', $jotplugins); call_hooks('jot_tool', $jotplugins);
call_hooks('jot_networks', $jotnets); call_hooks('jot_networks', $jotnets);

View file

@ -329,7 +329,10 @@ function register_post(&$a) {
'$uid' => $newuid )); '$uid' => $newuid ));
$res = mail($email, sprintf(t('Registration details for %s'), $a->config['sitename']), $res = mail($email, sprintf(t('Registration details for %s'), $a->config['sitename']),
$email_tpl, 'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME']); $email_tpl,
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
if($res) { if($res) {
@ -366,8 +369,10 @@ function register_post(&$a) {
)); ));
$res = mail($a->config['admin_email'], sprintf(t('Registration request at %s'), $a->config['sitename']), $res = mail($a->config['admin_email'], sprintf(t('Registration request at %s'), $a->config['sitename']),
$email_tpl,'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME']); $email_tpl,
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
if($res) { if($res) {
notice( t('Your registration is pending approval by the site owner.') . EOL ) ; notice( t('Your registration is pending approval by the site owner.') . EOL ) ;
goaway($a->get_baseurl()); goaway($a->get_baseurl());

View file

@ -90,7 +90,10 @@ function regmod_content(&$a) {
)); ));
$res = mail($user[0]['email'], sprintf(t('Registration details for %s'), $a->config['sitename']), $res = mail($user[0]['email'], sprintf(t('Registration details for %s'), $a->config['sitename']),
$email_tpl,'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] ); $email_tpl,
'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
. 'Content-type: text/plain; charset=UTF-8' . "\n"
. 'Content-transfer-encoding: 8bit' );
if($res) { if($res) {
notice( t('Account approved.') . EOL ); notice( t('Account approved.') . EOL );

View file

@ -73,6 +73,41 @@ function settings_post(&$a) {
$page_flags = (((x($_POST,'page-flags')) && (intval($_POST['page-flags']))) ? intval($_POST['page-flags']) : 0); $page_flags = (((x($_POST,'page-flags')) && (intval($_POST['page-flags']))) ? intval($_POST['page-flags']) : 0);
$blockwall = (((x($_POST,'blockwall')) && (intval($_POST['blockwall']) == 1)) ? 0: 1); // this setting is inverted! $blockwall = (((x($_POST,'blockwall')) && (intval($_POST['blockwall']) == 1)) ? 0: 1); // this setting is inverted!
$mail_server = ((x($_POST,'mail_server')) ? $_POST['mail_server'] : '');
$mail_port = ((x($_POST,'mail_port')) ? $_POST['mail_port'] : '');
$mail_ssl = ((x($_POST,'mail_ssl')) ? strtolower(trim($_POST['mail_ssl'])) : '');
$mail_user = ((x($_POST,'mail_user')) ? $_POST['mail_user'] : '');
$mail_pass = ((x($_POST,'mail_pass')) ? trim($_POST['mail_pass']) : '');
$mail_replyto = ((x($_POST,'mail_replyto')) ? $_POST['mail_replyto'] : '');
$mail_pubmail = ((x($_POST,'mail_pubmail')) ? $_POST['mail_pubmail'] : '');
$r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
intval(local_user())
);
if(! count($r)) {
q("INSERT INTO `mailacct` (`uid`) VALUES (%d)",
intval(local_user())
);
}
if(strlen($mail_pass)) {
$pass = '';
openssl(private_encrypt($mail_pass,$pass,$a->user['pubkey']));
q("UPDATE `mailacct` SET `pass` = '%s' WHERE `uid` = %d LIMIT 1",
dbesc(hex2bin($pass)),
intval(local_user())
);
}
$r = q("UPDATE `mailacct` SET `server` = '%s', `port` = %d, `ssltype` = '%s', `user` = '%s',
`mailbox` = 'INBOX', `reply_to` = '%s', `pubmail` = %d WHERE `uid` = %d LIMIT 1",
dbesc($mail_server),
intval($mail_port),
dbesc($mail_ssl),
dbesc($mail_user),
dbesc($mail_replyto),
intval($mail_pubmail),
intval(local_user())
);
$notify = 0; $notify = 0;
if(x($_POST,'notify1')) if(x($_POST,'notify1'))
@ -249,6 +284,19 @@ function settings_content(&$a) {
if(! strlen($a->user['timezone'])) if(! strlen($a->user['timezone']))
$timezone = date_default_timezone_get(); $timezone = date_default_timezone_get();
$r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
local_user()
);
$mail_server = ((count($r)) ? $r[0]['server'] : '');
$mail_port = ((count($r)) ? $r[0]['port'] : '');
$mail_ssl = ((count($r)) ? $r[0]['ssltype'] : '');
$mail_user = ((count($r)) ? $r[0]['user'] : '');
$mail_replyto = ((count($r)) ? $r[0]['reply_to'] : '');
$mail_pubmail = ((count($r)) ? $r[0]['pubmail'] : 0);
$pageset_tpl = load_view_file('view/pagetypes.tpl'); $pageset_tpl = load_view_file('view/pagetypes.tpl');
$pagetype = replace_macros($pageset_tpl,array( $pagetype = replace_macros($pageset_tpl,array(
'$normal' => (($a->user['page-flags'] == PAGE_NORMAL) ? " checked=\"checked\" " : ""), '$normal' => (($a->user['page-flags'] == PAGE_NORMAL) ? " checked=\"checked\" " : ""),
@ -331,6 +379,7 @@ function settings_content(&$a) {
$theme_selector .= '<option val="' . basename($file) . '"' . $selected . '>' . basename($file) . '</option>'; $theme_selector .= '<option val="' . basename($file) . '"' . $selected . '>' . basename($file) . '</option>';
} }
} }
$theme_selector .= '</select>'; $theme_selector .= '</select>';
$subdir = ((strlen($a->get_path())) ? '<br />' . t('or') . ' ' . $a->get_baseurl() . '/profile/' . $nickname : ''); $subdir = ((strlen($a->get_path())) ? '<br />' . t('or') . ' ' . $a->get_baseurl() . '/profile/' . $nickname : '');
@ -338,7 +387,7 @@ function settings_content(&$a) {
$tpl_addr = load_view_file("view/settings_nick_set.tpl"); $tpl_addr = load_view_file("view/settings_nick_set.tpl");
$prof_addr = replace_macros($tpl_addr,array( $prof_addr = replace_macros($tpl_addr,array(
'$desc' => t('Your profile address is'), '$desc' => t('Your Identity Address is'),
'$nickname' => $nickname, '$nickname' => $nickname,
'$subdir' => $subdir, '$subdir' => $subdir,
'$basepath' => $a->get_hostname() '$basepath' => $a->get_hostname()
@ -407,7 +456,23 @@ function settings_content(&$a) {
'$expire' => $expire, '$expire' => $expire,
'$blockw_checked' => (($blockwall) ? '' : ' checked="checked" ' ), '$blockw_checked' => (($blockwall) ? '' : ' checked="checked" ' ),
'$theme' => $theme_selector, '$theme' => $theme_selector,
'$pagetype' => $pagetype '$pagetype' => $pagetype,
'$lbl_imap0' => t('Email/Mailbox Setup'),
'$imap_desc' => t("If you wish to communicate with email contacts using this service \x28optional\x29, please specify how to connect to your mailbox."),
'$lbl_imap1' => t('IMAP server name:'),
'$imap_server' => $mail_server,
'$lbl_imap2' => t('IMAP port:'),
'$imap_port' => $mail_port,
'$lbl_imap3' => t("Security \x28TLS or SSL\x29:"),
'$imap_ssl' => $mail_ssl,
'$lbl_imap4' => t('Email login name:'),
'$imap_user' => $mail_user,
'$lbl_imap5' => t('Email password:'),
'$lbl_imap6' => t("Reply-to address \x28Optional\x29:"),
'$imap_replyto' => $mail_replyto,
'$lbl_imap7' => t('Send public posts to all email contacts:'),
'$pubmail_checked' => (($mail_pubmail) ? ' checked="checked" ' : ''),
)); ));
call_hooks('settings_form',$o); call_hooks('settings_form',$o);

View file

@ -460,3 +460,19 @@ function update_1050() {
) ENGINE = MYISAM "); ) ENGINE = MYISAM ");
} }
function update_1051() {
q("ALTER TABLE `mailacct` ADD `port` INT NOT NULL AFTER `server` ,
ADD `ssltype` CHAR( 16 ) NOT NULL AFTER `port` ,
ADD `mailbox` CHAR( 255 ) NOT NULL AFTER `ssltype` ");
q("ALTER TABLE `contact` ADD `addr` CHAR( 255 ) NOT NULL AFTER `url` ");
}
function update_1052() {
q("ALTER TABLE `mailacct` CHANGE `pass` `pass` TEXT CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL");
q("ALTER TABLE `mailacct` ADD `pubmail` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `reply_to` ");
q("ALTER TABLE `item` ADD `pubmail` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `private` ");
}

File diff suppressed because it is too large Load diff

View file

@ -209,17 +209,18 @@ $a->strings['Confirm'] = 'Confirm';
$a->strings['[Name Withheld]'] = '[Name Withheld]'; $a->strings['[Name Withheld]'] = '[Name Withheld]';
$a->strings["Introduction received at "] = "Introduction received at "; $a->strings["Introduction received at "] = "Introduction received at ";
$a->strings['Friend/Connection Request'] = 'Friend/Connection Request'; $a->strings['Friend/Connection Request'] = 'Friend/Connection Request';
$a->strings['Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca'] = 'Examples: jojo@demo.friendika.com, http://demo.friendika.com/profile/jojo, testuser@identi.ca';
$a->strings['Please answer the following:'] = 'Please answer the following:'; $a->strings['Please answer the following:'] = 'Please answer the following:';
$a->strings['Does $name know you?'] = 'Does $name know you?'; $a->strings['Does $name know you?'] = 'Does $name know you?';
$a->strings['Yes'] = 'Yes'; $a->strings['Yes'] = 'Yes';
$a->strings['No'] = 'No'; $a->strings['No'] = 'No';
$a->strings['Add a personal note:'] = 'Add a personal note:'; $a->strings['Add a personal note:'] = 'Add a personal note:';
$a->strings['Please enter your profile address from one of the following supported social networks:'] = 'Please enter your profile address from one of the following supported social networks:'; $a->strings["Please enter your 'Identity Address' from one of the following supported social networks:"] = "Please enter your 'Identity Address' from one of the following supported social networks:";
$a->strings['Friendika'] = 'Friendika'; $a->strings['Friendika'] = 'Friendika';
$a->strings['StatusNet/Federated Social Web'] = 'StatusNet/Federated Social Web'; $a->strings['StatusNet/Federated Social Web'] = 'StatusNet/Federated Social Web';
$a->strings["Private \x28secure\x29 network"] = "Private \x28secure\x29 network"; $a->strings["Private \x28secure\x29 network"] = "Private \x28secure\x29 network";
$a->strings["Public \x28insecure\x29 network"] = "Public \x28insecure\x29 network"; $a->strings["Public \x28insecure\x29 network"] = "Public \x28insecure\x29 network";
$a->strings['Your profile address:'] = 'Your profile address:'; $a->strings['Your Identity Address:'] = 'Your Identity Address:';
$a->strings['Submit Request'] = 'Submit Request'; $a->strings['Submit Request'] = 'Submit Request';
$a->strings['Cancel'] = 'Cancel'; $a->strings['Cancel'] = 'Cancel';
$a->strings["%d required parameter was not found at the given location"] = array( $a->strings["%d required parameter was not found at the given location"] = array(
@ -261,6 +262,8 @@ $a->strings['Click on a contact to add or remove.'] = 'Click on a contact to add
$a->strings['Group Editor'] = 'Group Editor'; $a->strings['Group Editor'] = 'Group Editor';
$a->strings['Members'] = 'Members'; $a->strings['Members'] = 'Members';
$a->strings['All Contacts'] = 'All Contacts'; $a->strings['All Contacts'] = 'All Contacts';
$a->strings['Help:'] = 'Help:';
$a->strings['Help'] = 'Help';
$a->strings["Welcome to %s"] = "Welcome to %s"; $a->strings["Welcome to %s"] = "Welcome to %s";
$a->strings['Could not create/connect to database.'] = 'Could not create/connect to database.'; $a->strings['Could not create/connect to database.'] = 'Could not create/connect to database.';
$a->strings['Connected to database.'] = 'Connected to database.'; $a->strings['Connected to database.'] = 'Connected to database.';
@ -314,7 +317,6 @@ $a->strings['Unable to locate original post.'] = 'Unable to locate original post
$a->strings['Empty post discarded.'] = 'Empty post discarded.'; $a->strings['Empty post discarded.'] = 'Empty post discarded.';
$a->strings['Wall Photos'] = 'Wall Photos'; $a->strings['Wall Photos'] = 'Wall Photos';
$a->strings["%s commented on your item at %s"] = "%s commented on your item at %s"; $a->strings["%s commented on your item at %s"] = "%s commented on your item at %s";
$a->strings["Administrator"] = "Administrator";
$a->strings["%s posted on your profile wall at %s"] = "%s posted on your profile wall at %s"; $a->strings["%s posted on your profile wall at %s"] = "%s posted on your profile wall at %s";
$a->strings['System error. Post not saved.'] = 'System error. Post not saved.'; $a->strings['System error. Post not saved.'] = 'System error. Post not saved.';
$a->strings['You may visit them online at'] = 'You may visit them online at'; $a->strings['You may visit them online at'] = 'You may visit them online at';
@ -551,7 +553,7 @@ $a->strings["&nbsp;\x28Optional\x29 Allow this OpenID to login to this account."
$a->strings['Publish your default profile in site directory?'] = 'Publish your default profile in site directory?'; $a->strings['Publish your default profile in site directory?'] = 'Publish your default profile in site directory?';
$a->strings['Publish your default profile in global social directory?'] = 'Publish your default profile in global social directory?'; $a->strings['Publish your default profile in global social directory?'] = 'Publish your default profile in global social directory?';
$a->strings['Profile is <strong>not published</strong>.'] = 'Profile is <strong>not published</strong>.'; $a->strings['Profile is <strong>not published</strong>.'] = 'Profile is <strong>not published</strong>.';
$a->strings['Your profile address is'] = 'Your profile address is'; $a->strings['Your Identity Address is'] = 'Your Identity Address is';
$a->strings['Export Personal Data'] = 'Export Personal Data'; $a->strings['Export Personal Data'] = 'Export Personal Data';
$a->strings['Basic Settings'] = 'Basic Settings'; $a->strings['Basic Settings'] = 'Basic Settings';
$a->strings['Full Name:'] = 'Full Name:'; $a->strings['Full Name:'] = 'Full Name:';
@ -637,11 +639,9 @@ $a->strings['Create a new group'] = 'Create a new group';
$a->strings['Everybody'] = 'Everybody'; $a->strings['Everybody'] = 'Everybody';
$a->strings['Birthday:'] = 'Birthday:'; $a->strings['Birthday:'] = 'Birthday:';
$a->strings['Home'] = 'Home'; $a->strings['Home'] = 'Home';
$a->strings['Help'] = 'Help';
$a->strings['Apps'] = 'Apps'; $a->strings['Apps'] = 'Apps';
$a->strings['Directory'] = 'Directory'; $a->strings['Directory'] = 'Directory';
$a->strings['Network'] = 'Network'; $a->strings['Network'] = 'Network';
$a->strings['Notifications'] = 'Notifications';
$a->strings['Manage'] = 'Manage'; $a->strings['Manage'] = 'Manage';
$a->strings['Settings'] = 'Settings'; $a->strings['Settings'] = 'Settings';
$a->strings['Embedding disabled'] = 'Embedding disabled'; $a->strings['Embedding disabled'] = 'Embedding disabled';

View file

@ -7,6 +7,7 @@ $page_desc<br />
<li><a href="http://friendika.com" title="$private_net">$friendika</a> <img src="images/lock_icon.gif" alt="$private_net" title="$private_net" /></li> <li><a href="http://friendika.com" title="$private_net">$friendika</a> <img src="images/lock_icon.gif" alt="$private_net" title="$private_net" /></li>
<li><a href="http://ostatus.org" title="$public_net" >$statusnet</a> <img src="images/unlock_icon.gif" alt="$public_net" title="$public_net"/></li> <li><a href="http://ostatus.org" title="$public_net" >$statusnet</a> <img src="images/unlock_icon.gif" alt="$public_net" title="$public_net"/></li>
</ul> </ul>
$desc
</p> </p>
<form action="dfrn_request/$nickname" method="post" /> <form action="dfrn_request/$nickname" method="post" />

View file

@ -0,0 +1,18 @@
Estimado/a $username,
'$from' ha comentado un elemento/conversación que estás siguiendo.
-----
$body
-----
Accede a $siteurl para ver la conversación completa:
$display
$sitename

View file

@ -0,0 +1,13 @@
Estimado/a $myname,
Tienes un nuevo seguidor en $sitename - '$requestor'.
Puedes visitar su perfil en $url.
Inicie sesión en su sitio para aprobar o rechazar/cancelar la solicitud.
$siteurl
$sitename

View file

@ -0,0 +1,19 @@
Estimado/a $username,
Grandes noticias... '$fn' a '$dfrn_url' ha aceptado tu solicitud de conexión en '$sitename'.
Ahora sois amigos mutuos y podreis intercambiar actualizaciones de estado, fotos, y correo electrónico
sin restricción alguna.
Visita tu página de 'Contactos' en $sitename si desear realizar cualquier cambio en esta relación.
$siteurl
[Por ejemplo, puedes crear un perfil independiente con información que no está disponible al público en general
- y asignar derechos de visualización a '$fn'].
$sitename

73
view/es/htconfig.tpl Normal file
View file

@ -0,0 +1,73 @@
<?php
// Set the following for your MySQL installation
// Copy or rename this file to .htconfig.php
$db_host = '$dbhost';
$db_user = '$dbuser';
$db_pass = '$dbpass';
$db_data = '$dbdata';
// If you are using a subdirectory of your domain you will need to put the
// relative path (from the root of your domain) here.
// For instance if your URL is 'http://example.com/directory/subdirectory',
// set $a->path to 'directory/subdirectory'.
$a->path = '$urlpath';
// Choose a legal default timezone. If you are unsure, use "America/Los_Angeles".
// It can be changed later and only applies to timestamps for anonymous viewers.
$default_timezone = '$timezone';
// What is your site name?
$a->config['sitename'] = "La Mia Rete di Amici";
// Your choices are REGISTER_OPEN, REGISTER_APPROVE, or REGISTER_CLOSED.
// Be certain to create your own personal account before setting
// REGISTER_CLOSED. 'register_text' (if set) will be displayed prominently on
// the registration page. REGISTER_APPROVE requires you set 'admin_email'
// to the email address of an already registered person who can authorise
// and/or approve/deny the request.
$a->config['register_policy'] = REGISTER_OPEN;
$a->config['register_text'] = '';
$a->config['admin_email'] = '';
// Maximum size of an imported message, 0 is unlimited
$a->config['max_import_size'] = 10000;
// maximum size of uploaded photos
$a->config['system']['maximagesize'] = 800000;
// Location of PHP command line processor
$a->config['php_path'] = '$phpath';
// Location of global directory submission page.
$a->config['system']['directory_submit_url'] = 'http://dir.friendika.com/submit';
$a->config['system']['directory_search_url'] = 'http://dir.friendika.com/directory?search=';
// PuSH - aka pubsubhubbub URL. This makes delivery of public posts as fast as private posts
$a->config['system']['huburl'] = 'http://pubsubhubbub.appspot.com';
// Server-to-server private message encryption (RINO) is allowed by default.
// Encryption will only be provided if this setting is true and the
// PHP mcrypt extension is installed on both systems
$a->config['system']['rino_encrypt'] = true;
// default system theme
$a->config['system']['theme'] = 'duepuntozero';
// Addons or plugins are configured here.
// This is a comma seperated list of addons to enable. Example:
// $a->config['system']['addon'] = 'js_upload,randplace,oembed';
$a->config['system']['addon'] = 'js_upload';

View file

@ -0,0 +1,21 @@
Estimado/a $username,
'$fn' en '$dfrn_url' ha aceptado tu petición
conexión a '$sitename'.
'$fn' ha optado por aceptarte come "fan", que restringe ciertas
formas de comunicación, como mensajes privados y algunas interacciones
con el perfil. Si eres una "celebridad" o una página de comunidad,
estos ajustes se aplican automáticamente
'$fn' puede optar por extender esto en una relación más permisiva
en el futuro.
Empezarás a recibir las actualizaciones públicas de estado de '$fn',
que aparecerán en tu página "Red" en
$siteurl
$sitename

34
view/es/lostpass_eml.tpl Normal file
View file

@ -0,0 +1,34 @@
Estimado/a $username,
Se ha recibido una solicitud en $sitename recientemente para restablecer
tu contraseña. Para confirmar esta solicitud, por favor seleccione el enlace de
verificación debajo o cópialo y pégalo en la barra de direcciones de tu navegador.
Se NO has solicitado este cambio, por favor NO sigas el enlace indicado e ignora
y/o elimina este mensaje.
Tu contraseña no se cambiará a menos que podamos verificar que eres tu quien
emitió esta solicitud.
Sigue este enlace para verificar tu identidad:
$reset_link
A continuación recibirás un mensaje con la nueva contraseña.
Despues de accceder, podrás cambiar la contraseña de tu cuenta en la página de
configuración.
Los datos de acceso son los siguientes:
Sitio: $siteurl
Nombre: $email
Saludos,
La administración de $sitename

View file

@ -0,0 +1,24 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional //EN">
<html>
<head>
<title>Mensaje de Friendika</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
</head>
<body>
<table style="border:1px solid #ccc">
<tbody>
<tr><td colspan="2" style="background:#3b5998; color:#FFFFFF; font-weight:bold; font-family:'lucida grande', tahoma, verdana,arial, sans-serif; padding: 4px 8px; vertical-align: middle; font-size:16px; letter-spacing: -0.03em; text-align: left;"><img style="width:32px;height:32px;" src='$siteurl/images/friendika-32.png'><span style="padding:7px;">Friendika</span></td></tr>
<tr><td style="padding-top:22px;" colspan="2">Has recibido un nuevo mensaje privado de '$from' en $siteName.</td></tr>
<tr><td style="padding-left:22px;padding-top:22px;width:60px;" valign="top" rowspan=3><a href="$url"><img style="border:0px;width:48px;height:48px;" src="$thumb"></a></td>
<td style="padding-top:22px;"><a href="$url">$from</a></td></tr>
<tr><td style="font-weight:bold;padding-bottom:5px;">$title</td></tr>
<tr><td style="padding-right:22px;">$htmlversion</td></tr>
<tr><td style="padding-top:11px;padding-bottom:11px;" colspan="2">Accede a <a href="$siteurl">$siteurl</a> para leer y responder a tus mensajes privados.</td></tr>
<tr><td></td><td>$siteName</td></tr>
</tbody>
</table>
</body>
</html>

View file

@ -0,0 +1,9 @@
Has recibido un nuevo mensaje privado de '$from' en $siteName.
$title
$textversion
Accede a $siteurl para leer y responder a tus mensajes privados.
$siteName

2636
view/es/messages.po Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,19 @@
Estimado/a $username,
Tu contraseña ha sido modificada como has solicitado. Anota esta información
(o cambia inmediatamente la contraseña con algo que recuerdes).
Tus datos de acceso son los siguientes:
Sitio: $siteurl
Nombre: $email
Contraseña: $new_password
Después de acceder puedes cambiar la contraseña desde la página de configuración de tu perfil.
$sitename

View file

@ -0,0 +1,21 @@
Estimado/a $username,
Gracias por registrarte en $sitename. Tu cuenta ha sido creada.
Los datos de acceso son los siguientes:
Sitio: $siteurl
Nombre: $email
Contraseña: $password
Después de acceder puedes cambiar tu contraseña en la página de "Configuración".
Toma un momento para revisar las otras configuraciones de la cuenta en esa página.
Gracias y bienvenido/a $sitename.

View file

@ -0,0 +1,22 @@
Se ha recibido la solicitud de registro de un nuevo usuario en
$sitename que requiere tu aprobación.
Los datos de acceso son los siguientes:
Nombre Completo: $username
Sitio: $siteurl
Nombre: $email
Para aprobar esta solicitud, visita el siguiente enlace:
$siteurl/regmod/allow/$hash
Para denegar la solicitud y eliminar la cuenta, por favor visita:
$siteurl/regmod/deny/$hash
Gracias.

View file

@ -0,0 +1,13 @@
Estimado/a $myname,
Acabas de recibir una solicitud de conexión de '$requestor' en $sitename.
Puedes visitar su perfil en $url.
Accede a tu sitio para ver la presentación completa y aceptar o ignorar/cancelar la solicitud.
$siteurl
$sitename

579
view/es/strings.php Normal file
View file

@ -0,0 +1,579 @@
<?php
function string_plural_select($n){
return ($n != 1);
}
;
$a->strings["Not Found"] = "No se ha encontrado";
$a->strings["Page not found."] = "Página no encontrada.";
$a->strings["Permission denied"] = "Permiso denegado";
$a->strings["Permission denied."] = "Permiso denegado.";
$a->strings["Create a New Account"] = "Crea una nueva cuenta";
$a->strings["Register"] = "Registrarse";
$a->strings["Nickname or Email address: "] = "Apodo o dirección de email: ";
$a->strings["Password: "] = "Contraseña: ";
$a->strings["Login"] = "Acceder";
$a->strings["Nickname/Email/OpenID: "] = "Apodo/Email/OpenID: ";
$a->strings["Password (if not OpenID): "] = "Contraseña (si no OpenID): ";
$a->strings["Forgot your password?"] = "¿Olvidó la contraseña?";
$a->strings["Password Reset"] = "Resetear la contraseña";
$a->strings["Logout"] = "Salir";
$a->strings["prev"] = "ant";
$a->strings["first"] = "primera";
$a->strings["last"] = "última";
$a->strings["next"] = "sig";
$a->strings["%s likes this."] = "A %s le gusta esto.";
$a->strings["%s doesn't like this."] = "A %s no le gusta esto.";
$a->strings["<span %1\$s>%2\$d people</span> like this."] = "Le gusta a <span %1\$s>%2\$d personas</span>.";
$a->strings["<span %1\$s>%2\$d people</span> don't like this."] = "No le gusta a <span %1\$s>%2\$d personas</span>.";
$a->strings["and"] = "y";
$a->strings[", and %d other people"] = ", y otras %d personas";
$a->strings["%s like this."] = "Le gusta a %s.";
$a->strings["%s don't like this."] = "No le gusta a %s.";
$a->strings["No contacts"] = "Nigún contacto";
$a->strings["Contacts"] = "Contactos";
$a->strings["View Contacts"] = "Ver contactos";
$a->strings["Search"] = "Busca";
$a->strings["No profile"] = "Nigún perfil";
$a->strings["Connect"] = "Conecta";
$a->strings["Location:"] = "Ubicación:";
$a->strings[", "] = ", ";
$a->strings["Gender:"] = "Género:";
$a->strings["Status:"] = "Estado:";
$a->strings["Homepage:"] = "Página web:";
$a->strings["Monday"] = "Lunes";
$a->strings["Tuesday"] = "Martes";
$a->strings["Wednesday"] = "Miércoles";
$a->strings["Thursday"] = "Jueves";
$a->strings["Friday"] = "Viernes";
$a->strings["Saturday"] = "Sábado";
$a->strings["Sunday"] = "Domingo";
$a->strings["January"] = "Enero";
$a->strings["February"] = "Febrero";
$a->strings["March"] = "Marzo";
$a->strings["April"] = "Abril";
$a->strings["May"] = "Mayo";
$a->strings["June"] = "Junio";
$a->strings["July"] = "Julio";
$a->strings["August"] = "Agosto";
$a->strings["September"] = "Septiembre";
$a->strings["October"] = "Octubre";
$a->strings["November"] = "Noviembre";
$a->strings["December"] = "Diciembre";
$a->strings["Birthdays this week:"] = "Cumpleaños esta semana:";
$a->strings["(Adjusted for local time)"] = "(Convertido a la hora local)";
$a->strings["[today]"] = "[hoy]";
$a->strings["link to source"] = "Enlace al original";
$a->strings["Welcome back %s"] = "Bienvenido de nuevo %s";
$a->strings["Manage Identities and/or Pages"] = "Administrar identidades y / o páginas";
$a->strings["(Toggle between different identities or community/group pages which share your account details.)"] = "(Alternar entre las diferentes identidades o las páginas de comunidades / grupos que comparten los datos de su cuenta.)";
$a->strings["Select an identity to manage: "] = "Seleccione una identidad a gestionar:";
$a->strings["Submit"] = "Envia";
$a->strings["Image exceeds size limit of %d"] = "El tamaño de la imagen supera el límite de %d";
$a->strings["Unable to process image."] = "Imposible procesar la imagen.";
$a->strings["Wall Photos"] = "Foto del Muro";
$a->strings["Image upload failed."] = "Subida de imagen fallida.";
$a->strings["Administrator"] = "Administrador";
$a->strings["noreply"] = "no-responder";
$a->strings["New mail received at "] = "Nuevo correo recibido en ";
$a->strings["%s commented on an item at %s"] = "%s ha commentato un elemento en %s";
$a->strings["Share"] = "Compartir";
$a->strings["Upload photo"] = "Subir foto";
$a->strings["Insert web link"] = "Insertar enlace web";
$a->strings["Insert YouTube video"] = "Insertar video de YouTube";
$a->strings["Set your location"] = "Configura la tu ubicación";
$a->strings["Clear browser location"] = "Borrar la ubicación del navegador";
$a->strings["Please wait"] = "Por favor, espere";
$a->strings["Permission settings"] = "Configuración de permisos";
$a->strings["CC: email addresses"] = "CC: dirección email";
$a->strings["Example: bob@example.com, mary@example.com"] = "Ejemplo: juan@ejemplo.com, sofia@ejemplo.com";
$a->strings["Private Message"] = "Mensaje privado";
$a->strings["I like this (toggle)"] = "Me gusta esto (cambiar)";
$a->strings["I don't like this (toggle)"] = "No me gusta questo (cambiar)";
$a->strings["This is you"] = "Éste/a eres tú";
$a->strings["Delete"] = "Eliminar";
$a->strings["View \$name's profile"] = "Ver el perfil de \$name";
$a->strings["Shared content is covered by the <a href=\"http://creativecommons.org/licenses/by/3.0/\">Creative Commons Attribution 3.0</a> license."] = "El contenido en común está cubierto por la licencia <a href=\"http://creativecommons.org/licenses/by/3.0/deed.it\">Creative Commons Atribución 3.0</a>.";
$a->strings["The profile address specified does not provide adequate information."] = "La dirección del perfil especificado no proporciona información adecuada.";
$a->strings["Limited profile. This person will be unable to receive direct/personal notifications from you."] = "Perfil limitado. Esta persona no podrá recibir notificaciones directas/personales de usted.";
$a->strings["Unable to retrieve contact information."] = "No ha sido posible recibir la información del contacto.";
$a->strings["following"] = "siguiendo";
$a->strings["Image uploaded but image cropping failed."] = "Imagen recibida, pero ha fallado al recortarla.";
$a->strings["Profile Photos"] = "Foto del perfil";
$a->strings["Image size reduction [%s] failed."] = "Ha fallado la reducción de las dimensiones de la imagen [%s].";
$a->strings["Unable to process image"] = "Imposible procesar la imagen";
$a->strings["Image uploaded successfully."] = "Imagen subida con éxito.";
$a->strings["Welcome to %s"] = "Bienvenido a %s";
$a->strings["Please login."] = "Accede.";
$a->strings["Registration revoked for %s"] = "Registro anulado para %s";
$a->strings["Registration details for %s"] = "Detalles de registro para %s";
$a->strings["Account approved."] = "Cuenta aprobada.";
$a->strings["Profile not found."] = "Perfil no encontrado.";
$a->strings["Profile Name is required."] = "El nombre de perfil es requerido.";
$a->strings["Profile updated."] = "Perfil actualizado.";
$a->strings["Profile deleted."] = "Perfil eliminado.";
$a->strings["Profile-"] = "Perfil-";
$a->strings["New profile created."] = "Nuevo perfil creado.";
$a->strings["Profile unavailable to clone."] = "Imposible duplicar el perfil.";
$a->strings["This is your <strong>public</strong> profile.<br />It <strong>may</strong> be visible to anybody using the internet."] = "Éste es tu perfil <strong>público</strong>.<br /><strong>Puede</strong> ser visto por cualquiera usando internet.";
$a->strings["Age: "] = "Edad : ";
$a->strings["Profile Image"] = "Imagen del Perfil";
$a->strings["Passwords do not match. Password unchanged."] = "Las contraseñas no coinciden. La contraseña no ha sido modificada.";
$a->strings["Empty passwords are not allowed. Password unchanged."] = "No se permiten contraseñas vacías. La contraseña no ha sido modificada.";
$a->strings["Password changed."] = "Contraseña modificada.";
$a->strings["Password update failed. Please try again."] = "La actualización de la contraseña ha fallado. Por favor, pruebe otra vez.";
$a->strings[" Please use a shorter name."] = " Usa un nombre más corto.";
$a->strings[" Name too short."] = " Nombre demasiado corto.";
$a->strings[" Not valid email."] = " Email no válido.";
$a->strings[" Cannot change to that email."] = " No se puede usar ese email.";
$a->strings["Settings updated."] = "Configuración actualizada.";
$a->strings["Plugin Settings"] = "Configuración de los Plugin";
$a->strings["Account Settings"] = "Configuración de la cuenta";
$a->strings["No Plugin settings configured"] = "Ningún Plugin ha sido configurado";
$a->strings["OpenID: "] = "OpenID: ";
$a->strings["&nbsp;(Optional) Allow this OpenID to login to this account."] = "&nbsp;(Opcional) Permitir a este OpenID acceder a esta cuenta.";
$a->strings["Profile is <strong>not published</strong>."] = "El perfil <strong>no está publicado</strong>.";
$a->strings["Default Post Permissions"] = "Permisos por defecto para los mensajes";
$a->strings["View in context"] = "Ver en el contexto";
$a->strings["Photo Albums"] = "Álbum de Fotos";
$a->strings["Contact Photos"] = "Foto del contacto";
$a->strings["Contact information unavailable"] = "Información del contacto no disponible";
$a->strings["Album not found."] = "Album no encontrado.";
$a->strings["Delete Album"] = "Eliminar album";
$a->strings["Delete Photo"] = "Eliminar foto";
$a->strings["was tagged in a"] = "ha sido etiquetado en";
$a->strings["photo"] = "foto";
$a->strings["by"] = "por";
$a->strings["Image exceeds size limit of "] = "La imagen supera el limite de tamaño de ";
$a->strings["No photos selected"] = "Ninguna foto seleccionada";
$a->strings["Upload Photos"] = "Subir fotos";
$a->strings["New album name: "] = "Nombre del nuevo álbum: ";
$a->strings["or existing album name: "] = "o nombre de un álbum existente: ";
$a->strings["Permissions"] = "Permisos";
$a->strings["Edit Album"] = "Modifica álbum";
$a->strings["View Photo"] = "Ver foto";
$a->strings["Photo not available"] = "Foto no disponible";
$a->strings["Edit photo"] = "Modificar foto";
$a->strings["Use as profile photo"] = "Usar como foto del perfil";
$a->strings["View Full Size"] = "Ver a tamaño completo";
$a->strings["Tags: "] = "Etiquetas: ";
$a->strings["[Remove any tag]"] = "[Borrar todas las etiquetas]";
$a->strings["New album name"] = "Nuevo nombre de álbum";
$a->strings["Caption"] = "Título";
$a->strings["Add a Tag"] = "Añadir una etiqueta";
$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping"] = "Ejemplo: @bob, @Barbara_Jensen, @jim@example.com, #California, #camping";
$a->strings["Recent Photos"] = "Fotos recientes";
$a->strings["Upload New Photos"] = "Subir nuevas fotos";
$a->strings["View Album"] = "Ver álbum";
$a->strings["Item not found."] = "Elemento no encontrado.";
$a->strings["View \$owner_name's profile"] = "Ver el perfil de \$owner_name";
$a->strings["to"] = "a";
$a->strings["Wall-to-Wall"] = "Muro-A-Muro";
$a->strings["via Wall-To-Wall:"] = "via Muro-A-Muro:";
$a->strings["Item has been removed."] = "El elemento ha sido eliminado.";
$a->strings["%s : Not a valid email address."] = "%s: No es una dirección válida de email.";
$a->strings["Please join my network on %s"] = "Por favor únete a mi red social en %s";
$a->strings["%s : Message delivery failed."] = "%s: Ha fallado la entrega del mensaje.";
$a->strings["%d message sent."] = array(
0 => "%d mensaje enviado.",
1 => "%d mensajes enviados.",
);
$a->strings["Send invitations"] = "Enviar invitaciones";
$a->strings["Enter email addresses, one per line:"] = "Introduce las direcciones de email, una por línea:";
$a->strings["Your message:"] = "Tu mensaje:";
$a->strings["Please join my social network on %s"] = "Únete a mi red social en % s";
$a->strings["To accept this invitation, please visit:"] = "Para aceptar esta invitación, por favor visita:";
$a->strings["Once you have registered, please connect with me via my profile page at:"] = "Una vez registrado, por favor contacta conmigo a través de mi página de perfil en:";
$a->strings["Invite Friends"] = "Invitar amigos";
$a->strings["Connect/Follow"] = "Conectar/Seguir";
$a->strings["Example: bob@example.com, http://example.com/barbara"] = "Ejemplo: bob@ejemplo.com, http://ejemplo.com/barbara";
$a->strings["Follow"] = "Seguir";
$a->strings["Could not access contact record."] = "No se pudo acceder a los datos del contacto.";
$a->strings["Could not locate selected profile."] = "No se pudo encontrar el perfil seleccionado.";
$a->strings["Contact updated."] = "Contacto actualizado.";
$a->strings["Failed to update contact record."] = "Error al actualizar el contacto.";
$a->strings["Contact has been blocked"] = "El contacto ha sido bloqueado";
$a->strings["Contact has been unblocked"] = "El contacto ha sido desbloqueado";
$a->strings["Contact has been ignored"] = "El contacto ha sido ignorado";
$a->strings["Contact has been unignored"] = "El contacto es no ignorado";
$a->strings["stopped following"] = "dejó de seguir";
$a->strings["Contact has been removed."] = "El contacto ha sido eliminado";
$a->strings["Contact not found."] = "Contacto no encontrado.";
$a->strings["Mutual Friendship"] = "Amistad recíproca";
$a->strings["is a fan of yours"] = "es tu fan";
$a->strings["you are a fan of"] = "eres fan de";
$a->strings["Never"] = "Nunca";
$a->strings["(Update was successful)"] = "(La actualización se ha completado)";
$a->strings["(Update was not successful)"] = "(La actualización no se ha completado)";
$a->strings["Contact Editor"] = "Editor de contactos";
$a->strings["Visit \$name's profile"] = "Visita el perfil de \$name";
$a->strings["Block/Unblock contact"] = "Boquear/Desbloquear contacto";
$a->strings["Ignore contact"] = "Ignorar contacto";
$a->strings["Delete contact"] = "Eliminar contacto";
$a->strings["Last updated: "] = "Última actualización:";
$a->strings["Update public posts: "] = "Actualizar mensajes públicos: ";
$a->strings["Update now"] = "Actualizar ahora";
$a->strings["Unblock this contact"] = "Desbloquear a este contacto";
$a->strings["Block this contact"] = "Bloquear a este contacto";
$a->strings["Unignore this contact"] = "Eliminar de contactos ignorados";
$a->strings["Ignore this contact"] = "Agregar a contactos ignorados";
$a->strings["Currently blocked"] = "Bloqueados";
$a->strings["Currently ignored"] = "Ignorados";
$a->strings["Show Blocked Connections"] = "Mostrar conexiones bloqueadas";
$a->strings["Hide Blocked Connections"] = "Esconder conexiones bloqueadas";
$a->strings["Finding: "] = "Busco: ";
$a->strings["Find"] = "Encontrar";
$a->strings["Visit \$username's profile"] = "Visita el perfil de \$username";
$a->strings["Edit contact"] = "Modificar contacto";
$a->strings["Remote privacy information not available."] = "Información sobre privacidad remota no disponible.";
$a->strings["Visible to:"] = "Visible a:";
$a->strings["Invalid OpenID url"] = "Url OpenID no valido";
$a->strings["Please enter the required information."] = "Por favor, introduzca la información necesaria.";
$a->strings["Please use a shorter name."] = "Por favor, use un nombre más corto.";
$a->strings["Name too short."] = "El nombre es demasiado corto.";
$a->strings["That doesn\\'t appear to be your full (First Last) name."] = "Ese no parece ser su nombre completo (Nombre Apellido).";
$a->strings["Your email domain is not among those allowed on this site."] = "Su dominio de correo electrónico no se encuentra entre los permitidos en este sitio.";
$a->strings["Not a valid email address."] = "No es una dirección de correo electrónico válida.";
$a->strings["Cannot use that email."] = "No se puede utilizar estecorreo electrónico.";
$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "Su \"apodo\"sólo puede contener \"az\", \"0-9\", \"-\", y \"_\", y también debe empezar por una letra.";
$a->strings["Nickname is already registered. Please choose another."] = "Apodo ya registrado. Por favor, elija otro.";
$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "ERROR GRAVE: La generación de claves de seguridad ha fallado.";
$a->strings["An error occurred during registration. Please try again."] = "Se produjo un error durante el registro. Por favor, inténtelo de nuevo.";
$a->strings["An error occurred creating your default profile. Please try again."] = "Error al crear su perfil predeterminado. Por favor, inténtelo de nuevo.";
$a->strings["Registration successful. Please check your email for further instructions."] = "Se ha registrado con éxito. Por favor, consulte su correo electrónico para obtener instrucciones adicionales.";
$a->strings["Failed to send email message. Here is the message that failed."] = "Error al enviar mensaje de correo electrónico. Aquí está el mensaje no enviado.";
$a->strings["Your registration can not be processed."] = "Su registro no se puede procesar.";
$a->strings["Registration request at %s"] = "Solicitud de registro en% s";
$a->strings["Your registration is pending approval by the site owner."] = "Su registro está pendiente de aprobación por el propietario del sitio.";
$a->strings["You may (optionally) fill in this form via OpenID by supplying your OpenID and clicking 'Register'."] = "Usted puede (opcionalmente) rellenar este formulario a través de OpenID mediante el suministro de su OpenID y haciendo clic en 'Registrar '.";
$a->strings["If you are not familiar with OpenID, please leave that field blank and fill in the rest of the items."] = "Si usted no está familiarizado con OpenID, por favor deje ese campo en blanco y rellene el resto de los elementos.";
$a->strings["Your OpenID (optional): "] = "Tu OpenID (opcional):";
$a->strings["Members of this network prefer to communicate with real people who use their real names."] = "Los miembros de esta red prefieren comunicarse con personas reales que usan sus nombres reales.";
$a->strings["Include your profile in member directory?"] = "¿Incluir su perfil en el directorio de miembros?";
$a->strings["Yes"] = "";
$a->strings["No"] = "No";
$a->strings["Registration"] = "Registro";
$a->strings["Your Full Name (e.g. Joe Smith): "] = "Su nombre completo (por ejemplo, Joe Smith):";
$a->strings["Your Email Address: "] = "Su dirección de correo electrónico:";
$a->strings["Choose a profile nickname. This must begin with a text character. Your profile address on this site will then be '<strong>nickname@\$sitename</strong>'."] = "Elija un apodo perfil. Debe comenzar con un carácter de texto. Su dirección de perfil en este sitio va a ser '<strong>nickname@\$sitename</strong>'.";
$a->strings["Choose a nickname: "] = "Escoge un apodo: ";
$a->strings["Could not create/connect to database."] = "No se pudo crear o conectarse a la base de datos.";
$a->strings["Connected to database."] = "Conectado a la base de datos.";
$a->strings["Database import succeeded."] = "Importación de la base de datos completada.";
$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "IMPORTANTE: Usted tendrá que [manualmente] configurar una tarea programada para el encuestador";
$a->strings["Please see the file \"INSTALL.txt\"."] = "Por favor, consulte el archivo \"INSTALL.txt\".";
$a->strings["Database import failed."] = "La importación de la base de datos ha fallado.";
$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Puede que tenga que importar el archivo \"Database.sql\" manualmente usando phpmyadmin o mysql.";
$a->strings["Welcome to Friendika."] = "Bienvenido a Friendika.";
$a->strings["Could not find a command line version of PHP in the web server PATH."] = "No se pudo encontrar una versión de línea de comandos de PHP en la ruta del servidor web.";
$a->strings["This is required. Please adjust the configuration file .htconfig.php accordingly."] = "Esto es necesario. Por favor, modifica el archivo de configuración. htconfig.php en consecuencia.";
$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "La versión en línea de comandos de PHP en su sistema no tiene \"register_argc_argv\" habilitado.";
$a->strings["This is required for message delivery to work."] = "Esto es necesario para el funcionamiento de la entrega de mensajes.";
$a->strings["Error: the \"openssl_pkey_new\" function on this system is not able to generate encryption keys"] = "Error: La función \"openssl_pkey_new\" en este sistema no es capaz de generar claves de cifrado";
$a->strings["If running under Windows, please see \"http://www.php.net/manual/en/openssl.installation.php\"."] = "Si se ejecuta en Windows, por favor consulte la sección \"http://www.php.net/manual/en/openssl.installation.php\".";
$a->strings["Error: Apache webserver mod-rewrite module is required but not installed."] = "Error: El módulo servidor web Apache mod-rewrite es necesario pero no está instalado.";
$a->strings["Error: libCURL PHP module required but not installed."] = "Error: El módulo libcurl PHP es necesario, pero no está instalado.";
$a->strings["Error: GD graphics PHP module with JPEG support required but not installed."] = "Error: El módulo de gráficos GD de PHP con soporte JPEG es necesario, pero no está instalado.";
$a->strings["Error: openssl PHP module required but not installed."] = "Error: El módulo openssl PHP es necesario, pero no está instalado.";
$a->strings["Error: mysqli PHP module required but not installed."] = "Error: El módulo PHP mysqli es necesario, pero no está instalado.";
$a->strings["The web installer needs to be able to create a file called \".htconfig.php\" in the top folder of your web server and it is unable to do so."] = "El programa de instalación web necesita ser capaz de crear un archivo llamado \". htconfig.php\" en la carpeta superior de su servidor web y es incapaz de hacerlo.";
$a->strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "Esto es muy a menudo una configuración de permisos, pues el servidor web puede que no sea capaz de escribir archivos en la carpeta - incluso si usted puede.";
$a->strings["Please check with your site documentation or support people to see if this situation can be corrected."] = "Por favor, consulte el sitio de documentación o gente de ayuda para ver si esta situación se puede corregir.";
$a->strings["If not, you may be required to perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Si no, deberá proceder con la instalación manual. Por favor, consulte el archivo \"INSTALL.txt\"para obtener instrucciones.";
$a->strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "El archivo de configuración de base de datos \". htconfig.php\" No se pudo escribir. Por favor, utilice el texto adjunto para crear un archivo de configuración en la raíz de su servidor web.";
$a->strings["Errors encountered creating database tables."] = "Errores encontrados creando las tablas de bases de datos.";
$a->strings["Normal View"] = "Vista normal";
$a->strings["New Item View"] = "Vista de nuevos elementos";
$a->strings["No such group"] = "Ningún grupo";
$a->strings["Group is empty"] = "El grupo está vacío";
$a->strings["Group: "] = "Grupo: ";
$a->strings["Invalid request identifier."] = "Solicitud de identificación no válida.";
$a->strings["Discard"] = "Descartar";
$a->strings["Ignore"] = "Ignorar";
$a->strings["Show Ignored Requests"] = "Mostrar peticiones ignoradas";
$a->strings["Hide Ignored Requests"] = "Esconder peticiones ignoradas";
$a->strings["Claims to be known to you: "] = "Dice conocerte:";
$a->strings["yes"] = "";
$a->strings["no"] = "no";
$a->strings["Approve as: "] = "Aprobar como:";
$a->strings["Friend"] = "Amig@";
$a->strings["Fan/Admirer"] = "Fan/Admirador";
$a->strings["Notification type: "] = "Tipo di notificación: ";
$a->strings["Friend/Connect Request"] = "Solicitud de Amistad/Conexión";
$a->strings["New Follower"] = "Nuevo seguidor";
$a->strings["Approve"] = "Aprobar";
$a->strings["No notifications."] = "Ninguna notificación.";
$a->strings["No registrations."] = "Ningún registro.";
$a->strings["This introduction has already been accepted."] = "Esta presentación ya ha sido aceptada.";
$a->strings["Profile location is not valid or does not contain profile information."] = "Ubicación del perfil no es válido o no contiene la información de perfil.";
$a->strings["Warning: profile location has no identifiable owner name."] = "Aviso: Ubicación del perfil no tiene nombre del propietario identificable.";
$a->strings["Warning: profile location has no profile photo."] = "Advertencia: ubicación del perfil no tiene foto de perfil.";
$a->strings["%d required parameter was not found at the given location"] = array(
0 => "% d parámetro requerido no se encontró en el lugar determinado",
1 => "% d parámetros requeridos no se encontraron en el lugar determinado",
);
$a->strings["Introduction complete."] = "Presentación completa.";
$a->strings["Unrecoverable protocol error."] = "Error de protocolo irrecuperable.";
$a->strings["Profile unavailable."] = "Perfil no disponible.";
$a->strings["%s has received too many connection requests today."] = "% s ha recibido demasiadas solicitudes de conexión hoy.";
$a->strings["Spam protection measures have been invoked."] = "Han sido activadas las medidas de protección contra spam.";
$a->strings["Friends are advised to please try again in 24 hours."] = "Se aconseja a los amigos intentarlo de nuevo en 24 horas.";
$a->strings["Invalid locator"] = "Localizador no válido";
$a->strings["Unable to resolve your name at the provided location."] = "No se ha podido resolver tu nombre en la ubicación indicada.";
$a->strings["You have already introduced yourself here."] = "Ya te has presentado aquí.";
$a->strings["Apparently you are already friends with %s."] = "Al parecer, ya eres amigo de % s.";
$a->strings["Invalid profile URL."] = "Dirección de perfil no válida.";
$a->strings["Disallowed profile URL."] = "Dirección de perfil no permitida.";
$a->strings["Your introduction has been sent."] = "Su presentación ha sido enviada.";
$a->strings["Please login to confirm introduction."] = "Inicia sesión para confirmar la presentación.";
$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Inicio de sesión con la identificación incorrecta. Entra en <strong>este</ strong> perfil.";
$a->strings["[Name Withheld]"] = "[Nombre oculto]";
$a->strings["Introduction received at "] = "Presentación recibida en";
$a->strings["Friend/Connection Request"] = "Solicitud de Amistad/Conexión";
$a->strings["Please answer the following:"] = "Por favor responda lo siguiente:";
$a->strings["Does \$name know you?"] = "$name te conoce?";
$a->strings["Add a personal note:"] = "Agregar una nota personal:";
$a->strings["Please enter your profile address from one of the following supported social networks:"] = "Por favor, introduzca su dirección de perfil de uno de las siguientes redes sociales soportadas:";
$a->strings["Friendika"] = "Friendika";
$a->strings["StatusNet/Federated Social Web"] = "StatusNet/Federated Social Web";
$a->strings["Private (secure) network"] = "Red privada (segura) ";
$a->strings["Public (insecure) network"] = "Red pública (insegura)";
$a->strings["Your profile address:"] = "Su dirección de perfil:";
$a->strings["Submit Request"] = "Enviar solicitud";
$a->strings["Cancel"] = "Cancelar";
$a->strings["status"] = "estado";
$a->strings["%1\$s likes %2\$s's %3\$s"] = "A %1\$s gusta %3\$s de %2\$s";
$a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "A %1\$s no gusta %3\$s de %2\$s";
$a->strings["Password reset requested at %s"] = "Restablecer la contraseña solicitada en %s";
$a->strings["Remove My Account"] = "Eliminar mi cuenta";
$a->strings["This will completely remove your account. Once this has been done it is not recoverable."] = "Esto eliminará por completo su cuenta. Una vez hecho esto no es recuperable.";
$a->strings["Please enter your password for verification:"] = "Por favor, introduzca su contraseña para la verificación:";
$a->strings["Applications"] = "Aplicaciones";
$a->strings["Global Directory"] = "Directorio global";
$a->strings["Unable to locate original post."] = "No se puede encontrar post original.";
$a->strings["Empty post discarded."] = "Mensaje vacío descartado.";
$a->strings["%s commented on your item at %s"] = "%s ha comentado en tu post en %s";
$a->strings["%s posted on your profile wall at %s"] = "%s ha publicado en tu muro en %s";
$a->strings["System error. Post not saved."] = "Error del sistema. Mensaje no guardado.";
$a->strings["This message was sent to you by %s, a member of the Friendika social network."] = "Este mensaje le ha sido enviado por %s, un miembro de la red social Friendika.";
$a->strings["You may visit them online at"] = "Puede visitarle online en";
$a->strings["Please contact the sender by replying to this post if you do not wish to receive these messages."] = "Por favor contacte al remitente respondiendo a este mensaje si no desea recibir estos mensajes.";
$a->strings["%s posted an update."] = "%s ha publicado una actualización.";
$a->strings["Tag removed"] = "Etiqueta eliminada";
$a->strings["Remove Item Tag"] = "Eliminar etiqueta del elemento";
$a->strings["Select a tag to remove: "] = "Seleccione una etiqueta para eliminar:";
$a->strings["Remove"] = "Eliminar";
$a->strings["No recipient selected."] = "Ningún destinatario seleccionado";
$a->strings["[no subject]"] = "[sin asunto]";
$a->strings["Unable to locate contact information."] = "No se puede encontrar información del contacto.";
$a->strings["Message sent."] = "Mensaje enviado.";
$a->strings["Message could not be sent."] = "El mensaje no ha podido ser enviado.";
$a->strings["Messages"] = "Mensajes";
$a->strings["Inbox"] = "Entrada";
$a->strings["Outbox"] = "Enviados";
$a->strings["New Message"] = "Nuevo mensaje";
$a->strings["Message deleted."] = "Mensaje eliminado.";
$a->strings["Conversation removed."] = "Conversación eliminada.";
$a->strings["Send Private Message"] = "Enviar mensaje privado";
$a->strings["To:"] = "A:";
$a->strings["Subject:"] = "Asunto:";
$a->strings["No messages."] = "No hay mensajes.";
$a->strings["Delete conversation"] = "Eliminar conversación";
$a->strings["Message not available."] = "Mensaje no disponibile.";
$a->strings["Delete message"] = "Borrar mensaje";
$a->strings["Send Reply"] = "Enviar respuesta";
$a->strings["Response from remote site was not understood."] = "La respuesta desde el sitio remoto no ha sido entendida.";
$a->strings["Unexpected response from remote site: "] = "Respuesta inesperada desde el sitio remoto:";
$a->strings["Confirmation completed successfully."] = "Confirmación completada con éxito.";
$a->strings["Remote site reported: "] = "El sito remoto informó:";
$a->strings["Temporary failure. Please wait and try again."] = "Error temporal. Por favor, espere y vuelva a intentarlo.";
$a->strings["Introduction failed or was revoked."] = "La presentación ha fallado o ha sido anulada.";
$a->strings["Unable to set contact photo."] = "Imposible establecer la foto del contacto.";
$a->strings["is now friends with"] = "ahora es amigo de";
$a->strings["No user record found for '%s' "] = "Ningún usuario encontrado para '%s'";
$a->strings["Our site encryption key is apparently messed up."] = "Nuestra clave de cifrado del site es aparentemente un lío.";
$a->strings["Empty site URL was provided or URL could not be decrypted by us."] = "Se ha proporcionado una dirección vacía o no hemos podido descifrarla.";
$a->strings["Contact record was not found for you on our site."] = "El contacto no se ha encontrado en nuestro sitio.";
$a->strings["The ID provided by your system is a duplicate on our system. It should work if you try again."] = "La identificación proporcionada por el sistema es un duplicado de nuestro sistema. Debería funcionar si intenta de nuevo.";
$a->strings["Unable to set your contact credentials on our system."] = "No se puede establecer sus credenciales de contacto en nuestro sistema.";
$a->strings["Unable to update your contact profile details on our system"] = "No se puede actualizar los datos de tu perfil de contacto en nuestro sistema";
$a->strings["Connection accepted at %s"] = "Conexión aceptada en % s";
$a->strings["Login failed."] = "Accesso fallido.";
$a->strings["Welcome back "] = "Bienvenido de nuevo";
$a->strings["%s welcomes %s"] = "%s te da la bienvenida a %s";
$a->strings["No contacts."] = "Ningún contacto.";
$a->strings["Group created."] = "Grupo creado.";
$a->strings["Could not create group."] = "Imposible crear el grupo.";
$a->strings["Group not found."] = "Grupo no encontrado.";
$a->strings["Group name changed."] = "El nombre del grupo ha cambiado.";
$a->strings["Membership list updated."] = "Lista de miembros actualizada.";
$a->strings["Group removed."] = "Grupo eliminado.";
$a->strings["Unable to remove group."] = "No se puede eliminar el grupo.";
$a->strings["Post to Twitter"] = "Publicar en Twitter";
$a->strings["Twitter Posting Settings"] = "Configuración de publicación en Twitter";
$a->strings["No consumer key pair for Twitter found. Please contact your site administrator."] = "No se ha encontrado ningún par de claves para Twitter. Póngase en contacto con el administrador del sitio.";
$a->strings["At this Friendika instance the Twitter plugin was enabled but you have not yet connected your account to your Twitter account. To do so click the button below to get a PIN from Twitter which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to Twitter."] = "En esta instancia de Friendika el plugin de Twitter fue habilitado, pero aún no ha vinculado su cuenta a su cuenta de Twitter.Para ello haga clic en el botón abajo para obtener un PIN de Twitter, que tiene que copiar en el cuadro de entrada y enviar el formulario. Solo sus posts <strong>públicos</strong> se publicarán en Twitter.";
$a->strings["Log in with Twitter"] = "Acceder con Twitter";
$a->strings["Copy the PIN from Twitter here"] = "Copia el PIN de Twitter aquí";
$a->strings["Currently connected to: "] = "Actualmente conectado a:";
$a->strings["If enabled all your <strong>public</strong> postings will be posted to the associated Twitter account as well."] = "Si se habilita, todos sus posts <strong>públicos</ strong> se publicarán también en la cuenta de Twitter asociada.";
$a->strings["Send public postings to Twitter"] = "Enviar posts públicos a Twitter";
$a->strings["Clear OAuth configuration"] = "Borrar la configuración de OAuth";
$a->strings["Post to StatusNet"] = "Publicar en StatusNet";
$a->strings["StatusNet Posting Settings"] = "Configuración de envío a StatusNet";
$a->strings["No consumer key pair for StatusNet found. Register your Friendika Account as an desktop client on your StatusNet account, copy the consumer key pair here and enter the API base root.<br />Before you register your own OAuth key pair ask the administrator if there is already a key pair for this Friendika installation at your favorited StatusNet installation."] = "No se ha encontrado ningún par de claves para StatusNet. Registre su cuenta de Friendika como cliente de escritorio en su cuenta de StatusNet, copie la clave consumer aquí y escriba la dirección de la base API.<br />Antes de registrar su propio par de claves OAuth, pregunte al administrador si ya hay un par de claves para este instalación de Friendika en su instalación StatusNet favorita.";
$a->strings["OAuth Consumer Key"] = "OAuth Consumer Key";
$a->strings["OAuth Consumer Secret"] = "OAuth Consumer Secret";
$a->strings["Base API Path (remember the trailing /)"] = "Dirección de base para la API (recordar el / al final)";
$a->strings["To connect to your StatusNet account click the button below to get a security code from StatusNet which you have to copy into the input box below and submit the form. Only your <strong>public</strong> posts will be posted to StatusNet."] = "Para conectarse a su cuenta de StatusNet haga clic en el botón abajo para obtener un PIN de StatusNet, que tiene que copiar en el cuadro de entrada y enviar el formulario. Solo sus posts <strong>públicos</strong> se publicarán en StatusNet.";
$a->strings["Log in with StatusNet"] = "Inicia sesión con StatusNet";
$a->strings["Copy the security code from StatusNet here"] = "Copia el código de seguridad de StatusNet aquí";
$a->strings["If enabled all your <strong>public</strong> postings will be posted to the associated StatusNet account as well."] = "Si se habilita, todos sus posts <strong>públicos</ strong> se publicarán también en la cuenta de StatusNet asociada.";
$a->strings["Send public postings to StatusNet"] = "Enviar posts públicos a StatusNet";
$a->strings["Three Dimensional Tic-Tac-Toe"] = "Tic-Tac-Toe tridimensionale";
$a->strings["3D Tic-Tac-Toe"] = "3D Tic-Tac-Toe";
$a->strings["New game"] = "Nueva partida";
$a->strings["New game with handicap"] = "Nuevo juego con handicap";
$a->strings["Three dimensional tic-tac-toe is just like the traditional game except that it is played on multiple levels simultaneously. "] = "Tic-tac-toe tridimensional es como el juego tradicional, excepto que se juega en varios niveles simultáneamente.";
$a->strings["In this case there are three levels. You win by getting three in a row on any level, as well as up, down, and diagonally across the different levels."] = "En este caso hay tres niveles. Ganarás por conseguir tres en raya en cualquier nivel, así como arriba, abajo y en diagonal a través de los diferentes niveles.";
$a->strings["The handicap game disables the center position on the middle level because the player claiming this square often has an unfair advantage."] = "El juego con handicap desactiva la posición central en el nivel medio porque el jugador reclama que este cuadrado tiene a menudo una ventaja injusta.";
$a->strings["You go first..."] = "Comienza tú...";
$a->strings["I'm going first this time..."] = "Yo voy primero esta vez...";
$a->strings["You won!"] = "¡Has ganado!";
$a->strings["\"Cat\" game!"] = "¡Empate!";
$a->strings["I won!"] = "¡He ganado!";
$a->strings["Select files to upload: "] = "Seleccione los archivos a subir: ";
$a->strings["Use the following controls only if the Java uploader [above] fails to launch."] = "Usa el seguente controllo solo se el el caricatore Java (qui sopra) no parte.";
$a->strings["Facebook disabled"] = "Facebook no habilitado";
$a->strings["Facebook API key is missing."] = "Falta la Clave API de Facebook.";
$a->strings["Facebook Connect"] = "Facebook Connect";
$a->strings["Install Facebook post connector"] = "Instalar el conector con Facebook";
$a->strings["Remove Facebook post connector"] = "DesInstalar el conector con Facebook";
$a->strings["Post to Facebook by default"] = "Publicar en Facebook de forma predeterminada";
$a->strings["Facebook"] = "Facebook";
$a->strings["Facebook Connector Settings"] = "Configuración de conexión a Facebook";
$a->strings["Post to Facebook"] = "Publicar en Facebook";
$a->strings["Image: "] = "Imagen: ";
$a->strings["Randplace Settings"] = "Configuración de Randplace";
$a->strings["Enable Randplace Plugin"] = "Activar el plugin Randplace";
$a->strings["Upload a file"] = "Subir un archivo";
$a->strings["Drop files here to upload"] = "Soltar los archivos aquí para subir";
$a->strings["Failed"] = "Falló";
$a->strings["No files were uploaded."] = "No hay archivos subidos.";
$a->strings["Uploaded file is empty"] = "El archivo subido está vacío";
$a->strings["Uploaded file is too large"] = "El archivo subido es demasiado grande";
$a->strings["File has an invalid extension, it should be one of "] = "El archivo tiene una extensión no válida, debería ser una de ";
$a->strings["Upload was cancelled, or server error encountered"] = "La subida ha sido cancelada, o se encontró un error del servidor";
$a->strings["Unknown | Not categorised"] = "Desconocido | No clasificado";
$a->strings["Block immediately"] = "Bloquear inmediatamente";
$a->strings["Shady, spammer, self-marketer"] = "Sospechoso, spammer, auto-publicidad";
$a->strings["Known to me, but no opinion"] = "Le conozco, sin opinión";
$a->strings["OK, probably harmless"] = "OK, probablemente inofensivo";
$a->strings["Reputable, has my trust"] = "Buena reputación, tiene mi confianza";
$a->strings["Frequently"] = "Frequentemente";
$a->strings["Hourly"] = "Cada hora";
$a->strings["Twice daily"] = "Dos veces al día";
$a->strings["Daily"] = "Diariamente";
$a->strings["Weekly"] = "Semanalmente";
$a->strings["Monthly"] = "Mensualmente";
$a->strings["Male"] = "Male";
$a->strings["Female"] = "Mujer";
$a->strings["Currently Male"] = "Actualmente Hombre";
$a->strings["Currently Female"] = "Actualmente Mujer";
$a->strings["Mostly Male"] = "Mayormente Hombre";
$a->strings["Mostly Female"] = "Mayormente Mujer";
$a->strings["Transgender"] = "Transgénero";
$a->strings["Intersex"] = "Bisexual";
$a->strings["Transsexual"] = "Transexual";
$a->strings["Hermaphrodite"] = "Hermafrodita";
$a->strings["Neuter"] = "Neutro";
$a->strings["Non-specific"] = "No-específico";
$a->strings["Other"] = "Otro";
$a->strings["Undecided"] = "Indeciso";
$a->strings["Males"] = "Hombres";
$a->strings["Females"] = "Mujeres";
$a->strings["Gay"] = "Gay";
$a->strings["Lesbian"] = "Lesbiana";
$a->strings["No Preference"] = "Sin preferencias";
$a->strings["Bisexual"] = "Bisexual";
$a->strings["Autosexual"] = "Autosexual";
$a->strings["Abstinent"] = "Abstinente";
$a->strings["Virgin"] = "Virgen";
$a->strings["Deviant"] = "Desviado";
$a->strings["Fetish"] = "Fetish";
$a->strings["Oodles"] = "Montones";
$a->strings["Nonsexual"] = "No sexual";
$a->strings["Single"] = "Soltero";
$a->strings["Lonely"] = "Solitario";
$a->strings["Available"] = "Disponible";
$a->strings["Unavailable"] = "No disponible";
$a->strings["Dating"] = "de citas";
$a->strings["Unfaithful"] = "Infiel";
$a->strings["Sex Addict"] = "Adicto al sexo";
$a->strings["Friends"] = "Amigos";
$a->strings["Friends/Benefits"] = "Amigos con beneficios";
$a->strings["Casual"] = "Casual";
$a->strings["Engaged"] = "Comprometido/a";
$a->strings["Married"] = "Casado/a";
$a->strings["Partners"] = "Socios";
$a->strings["Cohabiting"] = "Cohabitando";
$a->strings["Happy"] = "Feliz";
$a->strings["Not Looking"] = "No estoy buscando";
$a->strings["Swinger"] = "Scambista";
$a->strings["Betrayed"] = "Traicionado/a";
$a->strings["Separated"] = "Separado/a";
$a->strings["Unstable"] = "Inestable";
$a->strings["Divorced"] = "Divorciado/a";
$a->strings["Widowed"] = "Viudo/a";
$a->strings["Uncertain"] = "Incierto";
$a->strings["Complicated"] = "Complicado";
$a->strings["Don't care"] = "No importa";
$a->strings["Ask me"] = "Pregúntame";
$a->strings["Visible To:"] = "Visible a:";
$a->strings["Groups"] = "Grupos";
$a->strings["Except For:"] = "A excepción de:";
$a->strings["Logged out."] = "Sesión terminada";
$a->strings["Miscellaneous"] = "Varios";
$a->strings["less than a second ago"] = "hace menos de un segundo";
$a->strings["year"] = "año";
$a->strings["years"] = "años";
$a->strings["month"] = "mes";
$a->strings["months"] = "meses";
$a->strings["week"] = "semana";
$a->strings["weeks"] = "semanas";
$a->strings["day"] = "día";
$a->strings["days"] = "días";
$a->strings["hour"] = "hora";
$a->strings["hours"] = "horas";
$a->strings["minute"] = "minuto";
$a->strings["minutes"] = "minutos";
$a->strings["second"] = "segundo";
$a->strings["seconds"] = "segundos";
$a->strings[" ago"] = " hace";
$a->strings["Home"] = "Home";
$a->strings["Apps"] = "Aplicaciones";
$a->strings["Directory"] = "Directorio";
$a->strings["Network"] = "Red";
$a->strings["Notifications"] = "Notificaciones";
$a->strings["Manage"] = "Administrar";
$a->strings["Settings"] = "Configuración";
$a->strings["Profiles"] = "Perfiles";
$a->strings["Birthday:"] = "Fecha de nacimiento:";
$a->strings["You have a new follower at "] = "Tienes un nuevo seguidor en ";
$a->strings["Create a new group"] = "Crear un nuevo grupo";
$a->strings["Everybody"] = "Todo el mundo";
$a->strings["Embedding disabled"] = "Embedding desabilitado";
$a->strings["Birthday Reminders"] = "Recordatorios de cumpleaños";
$a->strings["Insert Vorbis [.ogg] video"] = "Insertar video Vorbis [.ogg]";
$a->strings["Insert Vorbis [.ogg] audio"] = "Insertar audio Vorbis [.ogg]";
$a->strings["Edit"] = "Editar";
$a->strings["No results."] = "No hay resultados.";
$a->strings["<< Prev"] = "<< Ant";
$a->strings["Next >>"] = "Sig >>";
$a->strings["Item not found"] = "Elemento no encontrado";
$a->strings["Edit post"] = "Editar mensaje";
$a->strings["Cannot locate DNS info for database server '%s'"] = "No se puede encontrar información de DNS para el servidor de base de datos '%s'";
$a->strings["%d Contact"] = array(
0 => "%d Contacto",
1 => "%d Contactos",
);

View file

@ -0,0 +1,18 @@
Estimado/a $username,
'$from' ha escrito algo en el muro de tu perfil.
-----
$body
-----
Accede a $siteurl para ver o borrar el elemento:
$display
$sitename

View file

@ -164,7 +164,35 @@ $profile_in_net_dir
<input type="submit" name="submit" class="settings-submit" value="$submit" /> <input type="submit" name="submit" class="settings-submit" value="$submit" />
</div> </div>
<h3 class="settings-imap">$lbl_imap0</h3>
<p>
$imap_desc
</p>
<label for="imap-server" id="settings-label-imap1">$lbl_imap1</label>
<input type="text" id="imap-server" name="mail_server" value="$imap_server" />
<div id="imap-server-end"></div>
<label for="imap-port" id="settings-label-imap2">$lbl_imap2</label>
<input type="text" id="imap-port" name="mail_port" value="$imap_port" />
<div id="imap-port-end"></div>
<label for="imap-ssl" id="settings-label-imap3">$lbl_imap3</label>
<input type="text" id="imap-ssl" name="mail_ssl" value="$imap_ssl" />
<div id="imap-ssl-end"></div>
<label for="imap-user" id="settings-label-imap4">$lbl_imap4</label>
<input type="text" id="imap-user" name="mail_user" value="$imap_user" />
<div id="imap-user-end"></div>
<label for="imap-pass" id="settings-label-imap5">$lbl_imap5</label>
<input type="password" id="imap-pass" name="mail_pass" value="" />
<div id="imap-pass-end"></div>
<label for="imap-replyto" id="settings-label-imap6">$lbl_imap6</label>
<input type="text" id="imap-replyto" name="mail_replyto" value="$imap_replyto" />
<div id="imap-replyto-end"></div>
<label for="imap-pubmail" id="settings-label-imap7">$lbl_imap7</label>
<input type="checkbox" name="mail_pubmail" id="imap-pubmail" $pubmail_checked value="1" />
<div id="imap-pubmail-end"></div>
<div class="settings-submit-wrapper" >
<input type="submit" name="submit" class="settings-submit" value="$submit" />
</div>
<h3 class="settings-heading">$lbl_advn</h3> <h3 class="settings-heading">$lbl_advn</h3>

File diff suppressed because it is too large Load diff

View file

@ -402,7 +402,14 @@ input#dfrn-url {
#notify2-end, #notify2-end,
#notify3-end, #notify3-end,
#notify4-end, #notify4-end,
#notify5-end { #notify5-end,
#imap-server-end,
#imap-port-end,
#imap-ssl-end,
#imap-user-end,
#imap-pass-end,
#imap-replyto-end,
#imap-pubmail-end {
margin-bottom: 5px; margin-bottom: 5px;
clear: both; clear: both;
} }
@ -423,7 +430,14 @@ input#dfrn-url {
#settings-label-notify2, #settings-label-notify2,
#settings-label-notify3, #settings-label-notify3,
#settings-label-notify4, #settings-label-notify4,
#settings-label-notify5 { #settings-label-notify5,
#settings-label-imap1,
#settings-label-imap2,
#settings-label-imap3,
#settings-label-imap4,
#settings-label-imap5,
#settings-label-imap6,
#settings-label-imap7 {
float: left; float: left;
width: 200px; width: 200px;
} }
@ -443,7 +457,14 @@ input#dfrn-url {
#notify2, #notify2,
#notify3, #notify3,
#notify4, #notify4,
#notify5 { #notify5,
#imap-server,
#imap-port,
#imap-ssl,
#imap-user,
#imap-pass,
#imap-replyto,
#imap-pubmail {
float: left; float: left;
margin-bottom: 20px; margin-bottom: 20px;
} }

View file

@ -529,7 +529,14 @@ input#dfrn-url {
#notify2-end, #notify2-end,
#notify3-end, #notify3-end,
#notify4-end, #notify4-end,
#notify5-end { #notify5-end,
#imap-server-end,
#imap-port-end,
#imap-ssl-end,
#imap-user-end,
#imap-pass-end,
#imap-replyto-end,
#imap-pubmail-end {
margin-bottom: 5px; margin-bottom: 5px;
clear: both; clear: both;
} }
@ -550,7 +557,14 @@ input#dfrn-url {
#settings-label-notify2, #settings-label-notify2,
#settings-label-notify3, #settings-label-notify3,
#settings-label-notify4, #settings-label-notify4,
#settings-label-notify5 { #settings-label-notify5,
#settings-label-imap1,
#settings-label-imap2,
#settings-label-imap3,
#settings-label-imap4,
#settings-label-imap5,
#settings-label-imap6,
#settings-label-imap7 {
float: left; float: left;
width: 200px; width: 200px;
} }
@ -570,7 +584,14 @@ input#dfrn-url {
#notify2, #notify2,
#notify3, #notify3,
#notify4, #notify4,
#notify5 { #notify5,
#imap-server,
#imap-port,
#imap-ssl,
#imap-user,
#imap-pass,
#imap-replyto,
#imap-pubmail {
float: left; float: left;
margin-bottom: 20px; margin-bottom: 20px;
} }

View file

@ -4,9 +4,9 @@
<hm:Host>$domain</hm:Host> <hm:Host>$domain</hm:Host>
<Link rel='lrdd' template='http://$domain/xrd/?uri={uri}' /> <Link rel='lrdd' template='$domain/xrd/?uri={uri}' />
<Link rel='acct-mgmt' href='http://$domain/amcd' /> <Link rel='acct-mgmt' href='$domain/amcd' />
<Link rel='http://services.mozilla.com/amcd/0.1' href='http://$domain/amcd' /> <Link rel='http://services.mozilla.com/amcd/0.1' href='$domain/amcd' />
<Link rel="http://oexchange.org/spec/0.8/rel/resident-target" type="application/xrd+xml" <Link rel="http://oexchange.org/spec/0.8/rel/resident-target" type="application/xrd+xml"
href="http://$domain/oexchange/xrd" /> href="$domain/oexchange/xrd" />
</XRD> </XRD>