From 79340c514715b5353333d8882fba450c9e42cc7e Mon Sep 17 00:00:00 2001 From: redmatrix Date: Tue, 8 Dec 2015 11:08:00 -0800 Subject: change to fallback server list --- boot.php | 4 ++-- version.inc | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/boot.php b/boot.php index d80d5fd07..c6397c06a 100755 --- a/boot.php +++ b/boot.php @@ -83,7 +83,7 @@ $DIRECTORY_FALLBACK_SERVERS = array( 'https://zothub.com', 'https://hubzilla.site', 'https://red.zottel.red', - 'https://gravizot.de', + 'https://hub.pixelbits.de', 'https://my.federated.social', 'https://hubzilla.nl' ); @@ -1324,7 +1324,7 @@ function check_config(&$a) { * */ - $r = q("SELECT * FROM `addon` WHERE `installed` = 1"); + $r = q("SELECT * FROM addon WHERE installed = 1"); if($r) $installed = $r; else diff --git a/version.inc b/version.inc index 97ba9c359..2d04a5143 100644 --- a/version.inc +++ b/version.inc @@ -1 +1 @@ -2015-12-07.1239 +2015-12-08.1240 -- cgit v1.2.3 From 29ac533cc908a57115d52a8659bce348b36ae6fa Mon Sep 17 00:00:00 2001 From: redmatrix Date: Tue, 8 Dec 2015 16:32:06 -0800 Subject: remove some unused stuff --- include/identity.php | 6 - library/ical.php | 379 --------------------------------------------------- mod/fbrowser.php | 9 +- mod/photos.php | 7 +- view/tpl/jot.tpl | 2 - 5 files changed, 3 insertions(+), 400 deletions(-) delete mode 100644 library/ical.php diff --git a/include/identity.php b/include/identity.php index 95ade3b28..98ba26bd8 100644 --- a/include/identity.php +++ b/include/identity.php @@ -896,12 +896,6 @@ function profile_load(&$a, $nickname, $profile = '') { $_SESSION['theme'] = $p[0]['channel_theme']; -// $a->set_template_engine(); // reset the template engine to the default in case the user's theme doesn't specify one - -// $theme_info_file = "view/theme/".current_theme()."/php/theme.php"; -// if (file_exists($theme_info_file)){ -// require_once($theme_info_file); -// } } /** diff --git a/library/ical.php b/library/ical.php deleted file mode 100644 index 6bb26bad8..000000000 --- a/library/ical.php +++ /dev/null @@ -1,379 +0,0 @@ - - * @license http://www.opensource.org/licenses/mit-license.php MIT License - * @version SVN: - * @link http://code.google.com/p/ics-parser/ - * @example $ical = new ical('MyCal.ics'); - * print_r( $ical->events() ); - */ - -/** - * This example demonstrates how the Ics-Parser should be used. - * - * PHP Version 5 - * - * @category Example - * @package Ics-parser - * @author Martin Thoma - * @license http://www.opensource.org/licenses/mit-license.php MIT License - * @version SVN: - * @link http://code.google.com/p/ics-parser/ - * @example $ical = new ical('MyCal.ics'); - * print_r( $ical->get_event_array() ); - -require 'class.iCalReader.php'; - -$ical = new ICal('MyCal.ics'); -$events = $ical->events(); - -$date = $events[0]['DTSTART']; -echo "The ical date: "; -echo $date; -echo "
"; - -echo "The Unix timestamp: "; -echo $ical->iCalDateToUnixTimestamp($date); -echo "
"; - -echo "The number of events: "; -echo $ical->event_count; -echo "
"; - -echo "The number of todos: "; -echo $ical->todo_count; -echo "
"; -echo "

"; - -foreach ($events as $event) { - echo "SUMMARY: ".$event['SUMMARY']."
"; - echo "DTSTART: ".$event['DTSTART']." - UNIX-Time: ".$ical->iCalDateToUnixTimestamp($event['DTSTART'])."
"; - echo "DTEND: ".$event['DTEND']."
"; - echo "DTSTAMP: ".$event['DTSTAMP']."
"; - echo "UID: ".$event['UID']."
"; - echo "CREATED: ".$event['CREATED']."
"; - echo "DESCRIPTION: ".$event['DESCRIPTION']."
"; - echo "LAST-MODIFIED: ".$event['LAST-MODIFIED']."
"; - echo "LOCATION: ".$event['LOCATION']."
"; - echo "SEQUENCE: ".$event['SEQUENCE']."
"; - echo "STATUS: ".$event['STATUS']."
"; - echo "TRANSP: ".$event['TRANSP']."
"; - echo "
"; -} - - (end example) - * - * - */ - -// error_reporting(E_ALL); - -/** - * This is the iCal-class - * - * @category Parser - * @package Ics-parser - * @author Martin Thoma - * @license http://www.opensource.org/licenses/mit-license.php MIT License - * @link http://code.google.com/p/ics-parser/ - * - * @param {string} filename The name of the file which should be parsed - * @constructor - */ -class ICal -{ - /* How many ToDos are in this ical? */ - public /** @type {int} */ $todo_count = 0; - - /* How many events are in this ical? */ - public /** @type {int} */ $event_count = 0; - - /* The parsed calendar */ - public /** @type {Array} */ $cal; - - /* Which keyword has been added to cal at last? */ - private /** @type {string} */ $_lastKeyWord; - - /** - * Creates the iCal-Object - * - * @param {string} $filename The path to the iCal-file - * - * @return Object The iCal-Object - */ - public function __construct($filename) - { - if (!$filename) { - return false; - } - - $lines = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); - if (stristr($lines[0], 'BEGIN:VCALENDAR') === false) { - return false; - } else { - // TODO: Fix multiline-description problem (see http://tools.ietf.org/html/rfc2445#section-4.8.1.5) - foreach ($lines as $line) { - $line = trim($line); - $add = $this->keyValueFromString($line); - if ($add === false) { - $this->addCalendarComponentWithKeyAndValue($type, false, $line); - continue; - } - - list($keyword, $value) = $add; - - switch ($line) { - // http://www.kanzaki.com/docs/ical/vtodo.html - case "BEGIN:VTODO": - $this->todo_count++; - $type = "VTODO"; - break; - - // http://www.kanzaki.com/docs/ical/vevent.html - case "BEGIN:VEVENT": - //echo "vevent gematcht"; - $this->event_count++; - $type = "VEVENT"; - break; - - //all other special strings - case "BEGIN:VCALENDAR": - case "BEGIN:DAYLIGHT": - // http://www.kanzaki.com/docs/ical/vtimezone.html - case "BEGIN:VTIMEZONE": - case "BEGIN:STANDARD": - $type = $value; - break; - case "END:VTODO": // end special text - goto VCALENDAR key - case "END:VEVENT": - case "END:VCALENDAR": - case "END:DAYLIGHT": - case "END:VTIMEZONE": - case "END:STANDARD": - $type = "VCALENDAR"; - break; - default: - $this->addCalendarComponentWithKeyAndValue($type, - $keyword, - $value); - break; - } - } - return $this->cal; - } - } - - /** - * Add to $this->ical array one value and key. - * - * @param {string} $component This could be VTODO, VEVENT, VCALENDAR, ... - * @param {string} $keyword The keyword, for example DTSTART - * @param {string} $value The value, for example 20110105T090000Z - * - * @return {None} - */ - public function addCalendarComponentWithKeyAndValue($component, - $keyword, - $value) - { - if ($keyword == false) { - $keyword = $this->last_keyword; - switch ($component) { - case 'VEVENT': - $value = $this->cal[$component][$this->event_count - 1] - [$keyword].$value; - break; - case 'VTODO' : - $value = $this->cal[$component][$this->todo_count - 1] - [$keyword].$value; - break; - } - } - - if (stristr($keyword, "DTSTART") or stristr($keyword, "DTEND")) { - $keyword = explode(";", $keyword); - $keyword = $keyword[0]; - } - - switch ($component) { - case "VTODO": - $this->cal[$component][$this->todo_count - 1][$keyword] = $value; - //$this->cal[$component][$this->todo_count]['Unix'] = $unixtime; - break; - case "VEVENT": - $this->cal[$component][$this->event_count - 1][$keyword] = $value; - break; - default: - $this->cal[$component][$keyword] = $value; - break; - } - $this->last_keyword = $keyword; - } - - /** - * Get a key-value pair of a string. - * - * @param {string} $text which is like "VCALENDAR:Begin" or "LOCATION:" - * - * @return {array} array("VCALENDAR", "Begin") - */ - public function keyValueFromString($text) - { - preg_match("/([^:]+)[:]([\w\W]*)/", $text, $matches); - if (count($matches) == 0) { - return false; - } - $matches = array_splice($matches, 1, 2); - return $matches; - } - - /** - * Return Unix timestamp from ical date time format - * - * @param {string} $icalDate A Date in the format YYYYMMDD[T]HHMMSS[Z] or - * YYYYMMDD[T]HHMMSS - * - * @return {int} - */ - public function iCalDateToUnixTimestamp($icalDate) - { - $icalDate = str_replace('T', '', $icalDate); - $icalDate = str_replace('Z', '', $icalDate); - - $pattern = '/([0-9]{4})'; // 1: YYYY - $pattern .= '([0-9]{2})'; // 2: MM - $pattern .= '([0-9]{2})'; // 3: DD - $pattern .= '([0-9]{0,2})'; // 4: HH - $pattern .= '([0-9]{0,2})'; // 5: MM - $pattern .= '([0-9]{0,2})/'; // 6: SS - preg_match($pattern, $icalDate, $date); - - // Unix timestamp can't represent dates before 1970 - if ($date[1] <= 1970) { - return false; - } - // Unix timestamps after 03:14:07 UTC 2038-01-19 might cause an overflow - // if 32 bit integers are used. - $timestamp = mktime((int)$date[4], - (int)$date[5], - (int)$date[6], - (int)$date[2], - (int)$date[3], - (int)$date[1]); - return $timestamp; - } - - /** - * Returns an array of arrays with all events. Every event is an associative - * array and each property is an element it. - * - * @return {array} - */ - public function events() - { - $array = $this->cal; - return $array['VEVENT']; - } - - /** - * Returns a boolean value whether thr current calendar has events or not - * - * @return {boolean} - */ - public function hasEvents() - { - return ( count($this->events()) > 0 ? true : false ); - } - - /** - * Returns false when the current calendar has no events in range, else the - * events. - * - * Note that this function makes use of a UNIX timestamp. This might be a - * problem on January the 29th, 2038. - * See http://en.wikipedia.org/wiki/Unix_time#Representing_the_number - * - * @param {boolean} $rangeStart Either true or false - * @param {boolean} $rangeEnd Either true or false - * - * @return {mixed} - */ - public function eventsFromRange($rangeStart = false, $rangeEnd = false) - { - $events = $this->sortEventsWithOrder($this->events(), SORT_ASC); - - if (!$events) { - return false; - } - - $extendedEvents = array(); - - if ($rangeStart !== false) { - $rangeStart = new DateTime(); - } - - if ($rangeEnd !== false or $rangeEnd <= 0) { - $rangeEnd = new DateTime('2038/01/18'); - } else { - $rangeEnd = new DateTime($rangeEnd); - } - - $rangeStart = $rangeStart->format('U'); - $rangeEnd = $rangeEnd->format('U'); - - - - // loop through all events by adding two new elements - foreach ($events as $anEvent) { - $timestamp = $this->iCalDateToUnixTimestamp($anEvent['DTSTART']); - if ($timestamp >= $rangeStart && $timestamp <= $rangeEnd) { - $extendedEvents[] = $anEvent; - } - } - - return $extendedEvents; - } - - /** - * Returns a boolean value whether thr current calendar has events or not - * - * @param {array} $events An array with events. - * @param {array} $sortOrder Either SORT_ASC, SORT_DESC, SORT_REGULAR, - * SORT_NUMERIC, SORT_STRING - * - * @return {boolean} - */ - public function sortEventsWithOrder($events, $sortOrder = SORT_ASC) - { - $extendedEvents = array(); - - // loop through all events by adding two new elements - foreach ($events as $anEvent) { - if (!array_key_exists('UNIX_TIMESTAMP', $anEvent)) { - $anEvent['UNIX_TIMESTAMP'] = - $this->iCalDateToUnixTimestamp($anEvent['DTSTART']); - } - - if (!array_key_exists('REAL_DATETIME', $anEvent)) { - $anEvent['REAL_DATETIME'] = - date("d.m.Y", $anEvent['UNIX_TIMESTAMP']); - } - - $extendedEvents[] = $anEvent; - } - - foreach ($extendedEvents as $key => $value) { - $timestamp[$key] = $value['UNIX_TIMESTAMP']; - } - array_multisort($timestamp, $sortOrder, $extendedEvents); - - return $extendedEvents; - } -} diff --git a/mod/fbrowser.php b/mod/fbrowser.php index 90b554edd..13abbfd8a 100644 --- a/mod/fbrowser.php +++ b/mod/fbrowser.php @@ -57,13 +57,8 @@ function fbrowser_content($a){ $types = $ph->supportedTypes(); $ext = $types[$rr['type']]; - if($a->get_template_engine() === 'internal') { - $filename_e = template_escape($rr['filename']); - } - else { - $filename_e = $rr['filename']; - } - + $filename_e = $rr['filename']; + return array( $a->get_baseurl() . '/photo/' . $rr['resource_id'] . '-' . $rr['hiq'] . '.' .$ext, $filename_e, diff --git a/mod/photos.php b/mod/photos.php index 5b3367d40..b0d9bc631 100644 --- a/mod/photos.php +++ b/mod/photos.php @@ -698,12 +698,7 @@ function photos_content(&$a) { $album_edit = null; if(($album !== t('Profile Photos')) && ($album !== 'Profile Photos') && ($album !== 'Contact Photos') && ($album !== t('Contact Photos'))) { if($can_post) { - if($a->get_template_engine() === 'internal') { - $album_e = template_escape($album); - } - else { - $album_e = $album; - } + $album_e = $album; $albums = ((array_key_exists('albums', $a->data)) ? $a->data['albums'] : photos_albums_list($a->data['channel'],$a->data['observer'])); // @fixme - syncronise actions with DAV diff --git a/view/tpl/jot.tpl b/view/tpl/jot.tpl index e7edb7e64..32a08a9b3 100755 --- a/view/tpl/jot.tpl +++ b/view/tpl/jot.tpl @@ -118,8 +118,6 @@
  • {{if $writefiles}}
  •  {{$attach}}
  • {{/if}}
  •  {{$weblink}}
  • - - {{/if}}
  •  {{$setloc}}
  • -- cgit v1.2.3 From 9d04406f9ae8a91f8ec5f3be7f89471ac5605522 Mon Sep 17 00:00:00 2001 From: jeroenpraat Date: Wed, 9 Dec 2015 01:39:02 +0100 Subject: First part of fix for issue #109 --- mod/invite.php | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/mod/invite.php b/mod/invite.php index 1af5fc1f8..e8bb74ee2 100644 --- a/mod/invite.php +++ b/mod/invite.php @@ -50,23 +50,6 @@ function invite_post(&$a) { continue; } - if($invonly && ($x || is_site_admin())) { - $code = autoname(8) . rand(1000,9999); - $nmessage = str_replace('$invite_code',$code,$message); - - $r = q("INSERT INTO `register` (`hash`,`created`) VALUES ('%s', '%s') ", - dbesc($code), - dbesc(datetime_convert()) - ); - - if(! is_site_admin()) { - $x --; - if($x >= 0) - set_pconfig(local_channel(),'system','invites_remaining',$x); - else - return; - } - } else $nmessage = $message; @@ -117,6 +100,23 @@ function invite_content(&$a) { } } + if($invonly && ($x || is_site_admin())) { + $invite_code = autoname(8) . rand(1000,9999); + $nmessage = str_replace('$invite_code',$invite_code,$message); + + $r = q("INSERT INTO `register` (`hash`,`created`) VALUES ('%s', '%s') ", + dbesc($invite_code), + dbesc(datetime_convert()) + ); + + if(! is_site_admin()) { + $x --; + if($x >= 0) + set_pconfig(local_channel(),'system','invites_remaining',$x); + else + return; + } + } $ob = $a->get_observer(); if(! $ob) -- cgit v1.2.3 From baab9b6fbc45a30dc4cce5b3c85d7c94e8e6a84c Mon Sep 17 00:00:00 2001 From: redmatrix Date: Tue, 8 Dec 2015 18:31:33 -0800 Subject: more libzot stuff --- Zotlabs/Zot/Auth.php | 356 +++++++++++++++++++++++++++++++++++ Zotlabs/Zot/Receiver.php | 167 +++++++++++++++++ mod/post.php | 471 +---------------------------------------------- 3 files changed, 527 insertions(+), 467 deletions(-) create mode 100644 Zotlabs/Zot/Auth.php diff --git a/Zotlabs/Zot/Auth.php b/Zotlabs/Zot/Auth.php new file mode 100644 index 000000000..950a7593a --- /dev/null +++ b/Zotlabs/Zot/Auth.php @@ -0,0 +1,356 @@ +ret = array('success' => false); + $this->success = false; + $this->test = ((array_key_exists('test',$req)) ? intval($req['test']) : 0); + $this->address = $req['auth']; + $this->desturl = $req['dest']; + $this->sec = $req['sec']; + $this->version = $req['version']; + $this->delegate = $req['delegate']; + + $c = get_sys_channel(); + if(! $c) { + logger('unable to obtain response (sys) channel'); + reply_die('no local channels found.'); + } + + $x = $this->GetHublocs($this->address); + + logger('hublocs'); + + foreach($x as $xx) { + + logger('verify'); + + if($this->Verify($c,$xx)) + break; + } + + /** + * @FIXME we really want to save the return_url in the session before we + * visit rmagic. This does however prevent a recursion if you visit + * rmagic directly, as it would otherwise send you back here again. + * But z_root() probably isn't where you really want to go. + */ + + if(strstr($this->desturl,z_root() . '/rmagic')) + goaway(z_root()); + + $this->reply_die(); + + } + + function GetHublocs($address) { + + // Try and find a hubloc for the person attempting to auth + $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash + where hubloc_addr = '%s' order by hubloc_id desc", + dbesc($address) + ); + + if(! $x) { + // finger them if they can't be found. + $ret = zot_finger($address, null); + if ($ret['success']) { + $j = json_decode($ret['body'], true); + if ($j) + import_xchan($j); + $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash + where hubloc_addr = '%s' order by hubloc_id desc", + dbesc($address) + ); + } + } + if(! $x) { + logger('mod_zot: auth: unable to finger ' . $address); + $this->reply_die('no hubloc found for ' . $address . ' and probing failed.'); + } + + return $x; + } + + + function Verify($channel,$hubloc) { + logger('auth request received from ' . $hubloc['hubloc_addr'] ); + + // check credentials and access + + // If they are already authenticated and haven't changed credentials, + // we can save an expensive network round trip and improve performance. + + $this->remote = remote_channel(); + $this->remote_service_class = ''; + $this->remote_level = 0; + $this->remote_hub = $hubloc['hubloc_url']; + $this->dnt = 0; + + // Also check that they are coming from the same site as they authenticated with originally. + + $already_authed = ((($this->remote) && ($hubloc['hubloc_hash'] == $this->remote) + && ($hubloc['hubloc_url'] === $_SESSION['remote_hub'])) ? true : false); + if($this->delegate && $this->delegate !== $_SESSION['delegate_channel']) + $already_authed = false; + + $j = array(); + + if(! $already_authed) { + + // Auth packets MUST use ultra top-secret hush-hush mode - e.g. the entire packet is encrypted using the + // site private key + // The actual channel sending the packet ($c[0]) is not important, but this provides a + // generic zot packet with a sender which can be verified + + $p = zot_build_packet($channel,$type = 'auth_check', + array(array('guid' => $hubloc['hubloc_guid'],'guid_sig' => $hubloc['hubloc_guid_sig'])), + $hubloc['hubloc_sitekey'], $this->sec); + + $this->dbg_msg('auth check packet created using sitekey ' . $hubloc['hubloc_sitekey']); + $this->dbg_msg('packet contents: ' . $p); + + + $result = zot_zot($hubloc['hubloc_callback'],$p); + + if(! $result['success']) { + logger('auth_check callback failed.'); + if($this->test) { + $this->dbg_msg('auth check request to your site returned .' . print_r($result, true)); + return false; + } + return false; + } + $j = json_decode($result['body'], true); + if(! $j) { + logger('auth_check json data malformed.'); + if($this->test) { + $this->dbg_msg('json malformed: ' . $result['body']); + return false; + } + } + + $this->dbg_msg('auth check request returned .' . print_r($j, true)); + + if ($already_authed || $j['success']) { + if($j['success']) { + // legit response, but we do need to check that this wasn't answered by a man-in-middle + if (! rsa_verify($this->sec . $hubloc['xchan_hash'],base64url_decode($j['confirm']),$hubloc['xchan_pubkey'])) { + logger('final confirmation failed.'); + if($this->test) { + $this->dbg_msg('final confirmation failed. ' . $sec . print_r($j,true) . print_r($hubloc,true)); + return false; + } + return false; + } + if (array_key_exists('service_class',$j)) + $this->remote_service_class = $j['service_class']; + if (array_key_exists('level',$j)) + $this->remote_level = $j['level']; + if (array_key_exists('DNT',$j)) + $this->dnt = $j['DNT']; + } + + // everything is good... maybe + + if(local_channel()) { + + // tell them to logout if they're logged in locally as anything but the target remote account + // in which case just shut up because they don't need to be doing this at all. + + if (get_app()->channel['channel_hash'] != $hubloc['xchan_hash']) { + logger('already authenticated locally as somebody else.'); + notice( t('Remote authentication blocked. You are logged into this site locally. Please logout and retry.') . EOL); + if($this->test) { + $$this->dbg_msg('already logged in locally with a conflicting identity.'); + return false;; + } + } + return false;; + } + + // log them in + + if ($this->test) { + $ret['success'] = true; + $this->reply_die('Authentication Success!'); + } + + $this->delegate_success = false; + if($this->delegate) { + $r = q("select * from channel left join xchan on channel_hash = xchan_hash where xchan_addr = '%s' limit 1", + dbesc($this->delegate) + ); + if ($r && intval($r[0]['channel_id'])) { + $allowed = perm_is_allowed($r[0]['channel_id'],$hubloc['xchan_hash'],'delegate'); + if($allowed) { + $_SESSION['delegate_channel'] = $r[0]['channel_id']; + $_SESSION['delegate'] = $hubloc['xchan_hash']; + $_SESSION['account_id'] = intval($r[0]['channel_account_id']); + require_once('include/security.php'); + change_channel($r[0]['channel_id']); + $this->delegate_success = true; + } + } + } + + $_SESSION['authenticated'] = 1; + if (! $this->delegate_success) { + $_SESSION['visitor_id'] = $hubloc['xchan_hash']; + $_SESSION['my_url'] = $hubloc['xchan_url']; + $_SESSION['my_address'] = $this->address; + $_SESSION['remote_service_class'] = $this->remote_service_class; + $_SESSION['remote_level'] = $this->remote_level; + $_SESSION['remote_hub'] = $this->remote_hub; + $_SESSION['DNT'] = $this->dnt; + } + + $arr = array('xchan' => $hubloc, 'url' => $this->desturl, 'session' => $_SESSION); + call_hooks('magic_auth_success',$arr); + get_app()->set_observer($hubloc); + require_once('include/security.php'); + get_app()->set_groups(init_groups_visitor($_SESSION['visitor_id'])); + info(sprintf( t('Welcome %s. Remote authentication successful.'),$hubloc['xchan_name'])); + logger('mod_zot: auth success from ' . $hubloc['xchan_addr']); + $this->success = true; + return true; + } + else { + if($this->test) { + $this->dbg_msg('auth failure. ' . print_r($_REQUEST,true) . print_r($j,true)); + return false; + } + logger('magic-auth failure - not authenticated: ' . $hubloc['xchan_addr']); + } + + if($this->test) { + $this->dbg_msg('auth failure fallthrough ' . print_r($_REQUEST,true) . print_r($j,true)); + return false; + } + } + } + + + function dbg_msg($msg) { + if($msg) { + if(array_key_exists('message',$this->ret)) + $this->ret['message'] .= $msg; + else + $this->ret['message'] = $msg; + } + } + + + function reply_die($msg,$goaway = true) { + if($msg) { + if(array_key_exists('message',$this->ret)) + $this->ret['message'] .= $msg; + else + $this->ret['message'] = $msg; + } + if($this->test) + json_return_and_die($this->ret); + if($goaway) + goaway($this->desturl); + } + +} + + +/** + * @brief HTTP POST entry point for Zot. + * + * Most access to this endpoint is via the post method. + * Here we will pick out the magic auth params which arrive as a get request, + * and the only communications to arrive this way. + * + * Magic Auth + * ========== + * + * So-called "magic auth" takes place by a special exchange. On the site where the "channel to be authenticated" lives (e.g. $mysite), + * a redirection is made via $mysite/magic to the zot endpoint of the remote site ($remotesite) with special GET parameters. + * + * The endpoint is typically https://$remotesite/post - or whatever was specified as the callback url in prior communications + * (we will bootstrap an address and fetch a zot info packet if possible where no prior communications exist) + * + * Five GET parameters are supplied: + * * auth => the urlencoded webbie (channel@host.domain) of the channel requesting access + * * dest => the desired destination URL (urlencoded) + * * sec => a random string which is also stored on $mysite for use during the verification phase. + * * version => the zot revision + * * delegate => optional urlencoded webbie of a local channel to invoke delegation rights for + * + * When this packet is received, an "auth-check" zot message is sent to $mysite. + * (e.g. if $_GET['auth'] is foobar@podunk.edu, a zot packet is sent to the podunk.edu zot endpoint, which is typically /post) + * If no information has been recorded about the requesting identity a zot information packet will be retrieved before + * continuing. + * + * The sender of this packet is an arbitrary/random site channel. The recipients will be a single recipient corresponding + * to the guid and guid_sig we have associated with the requesting auth identity + * + * \code{.json} + * { + * "type":"auth_check", + * "sender":{ + * "guid":"kgVFf_...", + * "guid_sig":"PT9-TApz...", + * "url":"http:\/\/podunk.edu", + * "url_sig":"T8Bp7j..." + * }, + * "recipients":{ + * { + * "guid":"ZHSqb...", + * "guid_sig":"JsAAXi..." + * } + * } + * "callback":"\/post", + * "version":1, + * "secret":"1eaa661", + * "secret_sig":"eKV968b1..." + * } + * \endcode + * + * auth_check messages MUST use encapsulated encryption. This message is sent to the origination site, which checks the 'secret' to see + * if it is the same as the 'sec' which it passed originally. It also checks the secret_sig which is the secret signed by the + * destination channel's private key and base64url encoded. If everything checks out, a json packet is returned: + * + * \code{.json} + * { + * "success":1, + * "confirm":"q0Ysovd1u...", + * "service_class":(optional) + * "level":(optional) + * } + * \endcode + * + * 'confirm' in this case is the base64url encoded RSA signature of the concatenation of 'secret' with the + * base64url encoded whirlpool hash of the requestor's guid and guid_sig; signed with the source channel private key. + * This prevents a man-in-the-middle from inserting a rogue success packet. Upon receipt and successful + * verification of this packet, the destination site will redirect to the original destination URL and indicate a successful remote login. + * Service_class can be used by cooperating sites to provide different access rights based on account rights and subscription plans. It is + * a string whose contents are not defined by protocol. Example: "basic" or "gold". + * + * @param[in,out] App &$a + */ diff --git a/Zotlabs/Zot/Receiver.php b/Zotlabs/Zot/Receiver.php index 6a11bcde0..238de1332 100644 --- a/Zotlabs/Zot/Receiver.php +++ b/Zotlabs/Zot/Receiver.php @@ -127,3 +127,170 @@ class Receiver { } } + + + +/** + * @brief zot communications and messaging. + * + * Sender HTTP posts to this endpoint ($site/post typically) with 'data' parameter set to json zot message packet. + * This packet is optionally encrypted, which we will discover if the json has an 'iv' element. + * $contents => array( 'alg' => 'aes256cbc', 'iv' => initialisation vector, 'key' => decryption key, 'data' => encrypted data); + * $contents->iv and $contents->key are random strings encrypted with this site's RSA public key and then base64url encoded. + * Currently only 'aes256cbc' is used, but this is extensible should that algorithm prove inadequate. + * + * Once decrypted, one will find the normal json_encoded zot message packet. + * + * Defined packet types are: notify, purge, refresh, force_refresh, auth_check, ping, and pickup + * + * Standard packet: (used by notify, purge, refresh, force_refresh, and auth_check) + * \code{.json} + * { + * "type": "notify", + * "sender":{ + * "guid":"kgVFf_1...", + * "guid_sig":"PT9-TApzp...", + * "url":"http:\/\/podunk.edu", + * "url_sig":"T8Bp7j5...", + * }, + * "recipients": { optional recipient array }, + * "callback":"\/post", + * "version":1, + * "secret":"1eaa...", + * "secret_sig": "df89025470fac8..." + * } + * \endcode + * + * Signature fields are all signed with the sender channel private key and base64url encoded. + * Recipients are arrays of guid and guid_sig, which were previously signed with the recipients private + * key and base64url encoded and later obtained via channel discovery. Absence of recipients indicates + * a public message or visible to all potential listeners on this site. + * + * "pickup" packet: + * The pickup packet is sent in response to a notify packet from another site + * \code{.json} + * { + * "type":"pickup", + * "url":"http:\/\/example.com", + * "callback":"http:\/\/example.com\/post", + * "callback_sig":"teE1_fLI...", + * "secret":"1eaa...", + * "secret_sig":"O7nB4_..." + * } + * \endcode + * + * In the pickup packet, the sig fields correspond to the respective data + * element signed with this site's system private key and then base64url encoded. + * The "secret" is the same as the original secret from the notify packet. + * + * If verification is successful, a json structure is returned containing a + * success indicator and an array of type 'pickup'. + * Each pickup element contains the original notify request and a message field + * whose contents are dependent on the message type. + * + * This JSON array is AES encapsulated using the site public key of the site + * that sent the initial zot pickup packet. + * Using the above example, this would be example.com. + * + * \code{.json} + * { + * "success":1, + * "pickup":{ + * "notify":{ + * "type":"notify", + * "sender":{ + * "guid":"kgVFf_...", + * "guid_sig":"PT9-TApz...", + * "url":"http:\/\/z.podunk.edu", + * "url_sig":"T8Bp7j5D..." + * }, + * "callback":"\/post", + * "version":1, + * "secret":"1eaa661..." + * }, + * "message":{ + * "type":"activity", + * "message_id":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu", + * "message_top":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu", + * "message_parent":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu", + * "created":"2012-11-20 04:04:16", + * "edited":"2012-11-20 04:04:16", + * "title":"", + * "body":"Hi Nickordo", + * "app":"", + * "verb":"post", + * "object_type":"", + * "target_type":"", + * "permalink":"", + * "location":"", + * "longlat":"", + * "owner":{ + * "name":"Indigo", + * "address":"indigo@podunk.edu", + * "url":"http:\/\/podunk.edu", + * "photo":{ + * "mimetype":"image\/jpeg", + * "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5" + * }, + * "guid":"kgVFf_...", + * "guid_sig":"PT9-TAp...", + * }, + * "author":{ + * "name":"Indigo", + * "address":"indigo@podunk.edu", + * "url":"http:\/\/podunk.edu", + * "photo":{ + * "mimetype":"image\/jpeg", + * "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5" + * }, + * "guid":"kgVFf_...", + * "guid_sig":"PT9-TAp..." + * } + * } + * } + * } + * \endcode + * + * Currently defined message types are 'activity', 'mail', 'profile', 'location' + * and 'channel_sync', which each have different content schemas. + * + * Ping packet: + * A ping packet does not require any parameters except the type. It may or may + * not be encrypted. + * + * \code{.json} + * { + * "type": "ping" + * } + * \endcode + * + * On receipt of a ping packet a ping response will be returned: + * + * \code{.json} + * { + * "success" : 1, + * "site" { + * "url": "http:\/\/podunk.edu", + * "url_sig": "T8Bp7j5...", + * "sitekey": "-----BEGIN PUBLIC KEY----- + * MIICIjANBgkqhkiG9w0BAQE..." + * } + * } + * \endcode + * + * The ping packet can be used to verify that a site has not been re-installed, and to + * initiate corrective action if it has. The url_sig is signed with the site private key + * and base64url encoded - and this should verify with the enclosed sitekey. Failure to + * verify indicates the site is corrupt or otherwise unable to communicate using zot. + * This return packet is not otherwise verified, so should be compared with other + * results obtained from this site which were verified prior to taking action. For instance + * if you have one verified result with this signature and key, and other records for this + * url which have different signatures and keys, it indicates that the site was re-installed + * and corrective action may commence (remove or mark invalid any entries with different + * signatures). + * If you have no records which match this url_sig and key - no corrective action should + * be taken as this packet may have been returned by an imposter. + * + * @param[in,out] App &$a + */ + diff --git a/mod/post.php b/mod/post.php index d1a53e7a6..6555a16c2 100644 --- a/mod/post.php +++ b/mod/post.php @@ -9,478 +9,15 @@ require_once('include/zot.php'); -/** - * @brief HTTP POST entry point for Zot. - * - * Most access to this endpoint is via the post method. - * Here we will pick out the magic auth params which arrive as a get request, - * and the only communications to arrive this way. - * - * Magic Auth - * ========== - * - * So-called "magic auth" takes place by a special exchange. On the site where the "channel to be authenticated" lives (e.g. $mysite), - * a redirection is made via $mysite/magic to the zot endpoint of the remote site ($remotesite) with special GET parameters. - * - * The endpoint is typically https://$remotesite/post - or whatever was specified as the callback url in prior communications - * (we will bootstrap an address and fetch a zot info packet if possible where no prior communications exist) - * - * Five GET parameters are supplied: - * * auth => the urlencoded webbie (channel@host.domain) of the channel requesting access - * * dest => the desired destination URL (urlencoded) - * * sec => a random string which is also stored on $mysite for use during the verification phase. - * * version => the zot revision - * * delegate => optional urlencoded webbie of a local channel to invoke delegation rights for - * - * When this packet is received, an "auth-check" zot message is sent to $mysite. - * (e.g. if $_GET['auth'] is foobar@podunk.edu, a zot packet is sent to the podunk.edu zot endpoint, which is typically /post) - * If no information has been recorded about the requesting identity a zot information packet will be retrieved before - * continuing. - * - * The sender of this packet is an arbitrary/random site channel. The recipients will be a single recipient corresponding - * to the guid and guid_sig we have associated with the requesting auth identity - * - * \code{.json} - * { - * "type":"auth_check", - * "sender":{ - * "guid":"kgVFf_...", - * "guid_sig":"PT9-TApz...", - * "url":"http:\/\/podunk.edu", - * "url_sig":"T8Bp7j..." - * }, - * "recipients":{ - * { - * "guid":"ZHSqb...", - * "guid_sig":"JsAAXi..." - * } - * } - * "callback":"\/post", - * "version":1, - * "secret":"1eaa661", - * "secret_sig":"eKV968b1..." - * } - * \endcode - * - * auth_check messages MUST use encapsulated encryption. This message is sent to the origination site, which checks the 'secret' to see - * if it is the same as the 'sec' which it passed originally. It also checks the secret_sig which is the secret signed by the - * destination channel's private key and base64url encoded. If everything checks out, a json packet is returned: - * - * \code{.json} - * { - * "success":1, - * "confirm":"q0Ysovd1u...", - * "service_class":(optional) - * "level":(optional) - * } - * \endcode - * - * 'confirm' in this case is the base64url encoded RSA signature of the concatenation of 'secret' with the - * base64url encoded whirlpool hash of the requestor's guid and guid_sig; signed with the source channel private key. - * This prevents a man-in-the-middle from inserting a rogue success packet. Upon receipt and successful - * verification of this packet, the destination site will redirect to the original destination URL and indicate a successful remote login. - * Service_class can be used by cooperating sites to provide different access rights based on account rights and subscription plans. It is - * a string whose contents are not defined by protocol. Example: "basic" or "gold". - * - * @param[in,out] App &$a - */ function post_init(&$a) { if (array_key_exists('auth', $_REQUEST)) { - - $ret = array('success' => false, 'message' => ''); - - logger('mod_zot: auth request received.'); - $address = $_REQUEST['auth']; - $desturl = $_REQUEST['dest']; - $sec = $_REQUEST['sec']; - $version = $_REQUEST['version']; - $delegate = $_REQUEST['delegate']; - - $test = ((x($_REQUEST, 'test')) ? intval($_REQUEST['test']) : 0); - - // They are authenticating ultimately to the site and not to a particular channel. - // Any channel will do, providing it's currently active. We just need to have an - // identity to attach to the packet we send back. So find one. - - $c = q("select * from channel where channel_removed = 0 limit 1"); - - if (! $c) { - // nobody here - logger('mod_zot: auth: unable to find a response channel'); - if ($test) { - $ret['message'] .= 'no local channels found.' . EOL; - json_return_and_die($ret); - } - - goaway($desturl); - } - - // Try and find a hubloc for the person attempting to auth - $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash where hubloc_addr = '%s' order by hubloc_id desc", - dbesc($address) - ); - - if (! $x) { - // finger them if they can't be found. - $ret = zot_finger($address, null); - if ($ret['success']) { - $j = json_decode($ret['body'], true); - if ($j) - import_xchan($j); - $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash where hubloc_addr = '%s' order by hubloc_id desc", - dbesc($address) - ); - } - } - if(! $x) { - logger('mod_zot: auth: unable to finger ' . $address); - - if($test) { - $ret['message'] .= 'no hubloc found for ' . $address . ' and probing failed.' . EOL; - json_return_and_die($ret); - } - - goaway($desturl); - } - - - foreach($x as $xx) { - logger('mod_zot: auth request received from ' . $xx['hubloc_addr'] ); - - // check credentials and access - - // If they are already authenticated and haven't changed credentials, - // we can save an expensive network round trip and improve performance. - - $remote = remote_channel(); - $result = null; - $remote_service_class = ''; - $remote_level = 0; - $remote_hub = $xx['hubloc_url']; - $DNT = 0; - - // Also check that they are coming from the same site as they authenticated with originally. - - $already_authed = ((($remote) && ($xx['hubloc_hash'] == $remote) && ($xx['hubloc_url'] === $_SESSION['remote_hub'])) ? true : false); - if($delegate && $delegate !== $_SESSION['delegate_channel']) - $already_authed = false; - - $j = array(); - - if (! $already_authed) { - - // Auth packets MUST use ultra top-secret hush-hush mode - e.g. the entire packet is encrypted using the site private key - // The actual channel sending the packet ($c[0]) is not important, but this provides a generic zot packet with a sender - // which can be verified - - $p = zot_build_packet($c[0],$type = 'auth_check', array(array('guid' => $xx['hubloc_guid'],'guid_sig' => $xx['hubloc_guid_sig'])), $xx['hubloc_sitekey'], $sec); - if ($test) { - $ret['message'] .= 'auth check packet created using sitekey ' . $xx['hubloc_sitekey'] . EOL; - $ret['message'] .= 'packet contents: ' . $p . EOL; - } - - $result = zot_zot($xx['hubloc_callback'],$p); - - if (! $result['success']) { - logger('mod_zot: auth_check callback failed.'); - if ($test) { - $ret['message'] .= 'auth check request to your site returned .' . print_r($result, true) . EOL; - continue; - } - continue; - } - $j = json_decode($result['body'], true); - if (! $j) { - logger('mod_zot: auth_check json data malformed.'); - if($test) { - $ret['message'] .= 'json malformed: ' . $result['body'] . EOL; - continue; - } - } - } - - if ($test) { - $ret['message'] .= 'auth check request returned .' . print_r($j, true) . EOL; - } - - if ($already_authed || $j['success']) { - if ($j['success']) { - // legit response, but we do need to check that this wasn't answered by a man-in-middle - if (! rsa_verify($sec . $xx['xchan_hash'],base64url_decode($j['confirm']),$xx['xchan_pubkey'])) { - logger('mod_zot: auth: final confirmation failed.'); - if ($test) { - $ret['message'] .= 'final confirmation failed. ' . $sec . print_r($j,true) . print_r($xx,true); - continue; - } - - continue; - } - if (array_key_exists('service_class',$j)) - $remote_service_class = $j['service_class']; - if (array_key_exists('level',$j)) - $remote_level = $j['level']; - if (array_key_exists('DNT',$j)) - $DNT = $j['DNT']; - } - // everything is good... maybe - if(local_channel()) { - - // tell them to logout if they're logged in locally as anything but the target remote account - // in which case just shut up because they don't need to be doing this at all. - - if ($a->channel['channel_hash'] != $xx['xchan_hash']) { - logger('mod_zot: auth: already authenticated locally as somebody else.'); - notice( t('Remote authentication blocked. You are logged into this site locally. Please logout and retry.') . EOL); - if ($test) { - $ret['message'] .= 'already logged in locally with a conflicting identity.' . EOL; - continue; - } - } - continue; - } - - // log them in - - if ($test) { - $ret['success'] = true; - $ret['message'] .= 'Authentication Success!' . EOL; - json_return_and_die($ret); - } - - $delegation_success = false; - if ($delegate) { - $r = q("select * from channel left join xchan on channel_hash = xchan_hash where xchan_addr = '%s' limit 1", - dbesc($delegate) - ); - if ($r && intval($r[0]['channel_id'])) { - $allowed = perm_is_allowed($r[0]['channel_id'],$xx['xchan_hash'],'delegate'); - if ($allowed) { - $_SESSION['delegate_channel'] = $r[0]['channel_id']; - $_SESSION['delegate'] = $xx['xchan_hash']; - $_SESSION['account_id'] = intval($r[0]['channel_account_id']); - require_once('include/security.php'); - change_channel($r[0]['channel_id']); - $delegation_success = true; - } - } - } - - $_SESSION['authenticated'] = 1; - if (! $delegation_success) { - $_SESSION['visitor_id'] = $xx['xchan_hash']; - $_SESSION['my_url'] = $xx['xchan_url']; - $_SESSION['my_address'] = $address; - $_SESSION['remote_service_class'] = $remote_service_class; - $_SESSION['remote_level'] = $remote_level; - $_SESSION['remote_hub'] = $remote_hub; - $_SESSION['DNT'] = $DNT; - } - - $arr = array('xchan' => $xx, 'url' => $desturl, 'session' => $_SESSION); - call_hooks('magic_auth_success',$arr); - $a->set_observer($xx); - require_once('include/security.php'); - $a->set_groups(init_groups_visitor($_SESSION['visitor_id'])); - info(sprintf( t('Welcome %s. Remote authentication successful.'),$xx['xchan_name'])); - logger('mod_zot: auth success from ' . $xx['xchan_addr']); - } - else { - if ($test) { - $ret['message'] .= 'auth failure. ' . print_r($_REQUEST,true) . print_r($j,true) . EOL; - continue; - } - logger('mod_zot: magic-auth failure - not authenticated: ' . $xx['xchan_addr']); - } - - if ($test) { - $ret['message'] .= 'auth failure fallthrough ' . print_r($_REQUEST,true) . print_r($j,true) . EOL; - continue; - } - } - - /** - * @FIXME we really want to save the return_url in the session before we - * visit rmagic. This does however prevent a recursion if you visit - * rmagic directly, as it would otherwise send you back here again. - * But z_root() probably isn't where you really want to go. - */ - - if(strstr($desturl,z_root() . '/rmagic')) - goaway(z_root()); - - if ($test) { - json_return_and_die($ret); - } - - goaway($desturl); + require_once('Zotlabs/Zot/Auth.php'); + $x = new Zotlabs\Zot\Auth($_REQUEST); + exit; } -} - -/** - * @brief zot communications and messaging. - * - * Sender HTTP posts to this endpoint ($site/post typically) with 'data' parameter set to json zot message packet. - * This packet is optionally encrypted, which we will discover if the json has an 'iv' element. - * $contents => array( 'alg' => 'aes256cbc', 'iv' => initialisation vector, 'key' => decryption key, 'data' => encrypted data); - * $contents->iv and $contents->key are random strings encrypted with this site's RSA public key and then base64url encoded. - * Currently only 'aes256cbc' is used, but this is extensible should that algorithm prove inadequate. - * - * Once decrypted, one will find the normal json_encoded zot message packet. - * - * Defined packet types are: notify, purge, refresh, force_refresh, auth_check, ping, and pickup - * - * Standard packet: (used by notify, purge, refresh, force_refresh, and auth_check) - * \code{.json} - * { - * "type": "notify", - * "sender":{ - * "guid":"kgVFf_1...", - * "guid_sig":"PT9-TApzp...", - * "url":"http:\/\/podunk.edu", - * "url_sig":"T8Bp7j5...", - * }, - * "recipients": { optional recipient array }, - * "callback":"\/post", - * "version":1, - * "secret":"1eaa...", - * "secret_sig": "df89025470fac8..." - * } - * \endcode - * - * Signature fields are all signed with the sender channel private key and base64url encoded. - * Recipients are arrays of guid and guid_sig, which were previously signed with the recipients private - * key and base64url encoded and later obtained via channel discovery. Absence of recipients indicates - * a public message or visible to all potential listeners on this site. - * - * "pickup" packet: - * The pickup packet is sent in response to a notify packet from another site - * \code{.json} - * { - * "type":"pickup", - * "url":"http:\/\/example.com", - * "callback":"http:\/\/example.com\/post", - * "callback_sig":"teE1_fLI...", - * "secret":"1eaa...", - * "secret_sig":"O7nB4_..." - * } - * \endcode - * - * In the pickup packet, the sig fields correspond to the respective data - * element signed with this site's system private key and then base64url encoded. - * The "secret" is the same as the original secret from the notify packet. - * - * If verification is successful, a json structure is returned containing a - * success indicator and an array of type 'pickup'. - * Each pickup element contains the original notify request and a message field - * whose contents are dependent on the message type. - * - * This JSON array is AES encapsulated using the site public key of the site - * that sent the initial zot pickup packet. - * Using the above example, this would be example.com. - * - * \code{.json} - * { - * "success":1, - * "pickup":{ - * "notify":{ - * "type":"notify", - * "sender":{ - * "guid":"kgVFf_...", - * "guid_sig":"PT9-TApz...", - * "url":"http:\/\/z.podunk.edu", - * "url_sig":"T8Bp7j5D..." - * }, - * "callback":"\/post", - * "version":1, - * "secret":"1eaa661..." - * }, - * "message":{ - * "type":"activity", - * "message_id":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu", - * "message_top":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu", - * "message_parent":"10b049ce384cbb2da9467319bc98169ab36290b8bbb403aa0c0accd9cb072e76@podunk.edu", - * "created":"2012-11-20 04:04:16", - * "edited":"2012-11-20 04:04:16", - * "title":"", - * "body":"Hi Nickordo", - * "app":"", - * "verb":"post", - * "object_type":"", - * "target_type":"", - * "permalink":"", - * "location":"", - * "longlat":"", - * "owner":{ - * "name":"Indigo", - * "address":"indigo@podunk.edu", - * "url":"http:\/\/podunk.edu", - * "photo":{ - * "mimetype":"image\/jpeg", - * "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5" - * }, - * "guid":"kgVFf_...", - * "guid_sig":"PT9-TAp...", - * }, - * "author":{ - * "name":"Indigo", - * "address":"indigo@podunk.edu", - * "url":"http:\/\/podunk.edu", - * "photo":{ - * "mimetype":"image\/jpeg", - * "src":"http:\/\/podunk.edu\/photo\/profile\/m\/5" - * }, - * "guid":"kgVFf_...", - * "guid_sig":"PT9-TAp..." - * } - * } - * } - * } - * \endcode - * - * Currently defined message types are 'activity', 'mail', 'profile', 'location' - * and 'channel_sync', which each have different content schemas. - * - * Ping packet: - * A ping packet does not require any parameters except the type. It may or may - * not be encrypted. - * - * \code{.json} - * { - * "type": "ping" - * } - * \endcode - * - * On receipt of a ping packet a ping response will be returned: - * - * \code{.json} - * { - * "success" : 1, - * "site" { - * "url": "http:\/\/podunk.edu", - * "url_sig": "T8Bp7j5...", - * "sitekey": "-----BEGIN PUBLIC KEY----- - * MIICIjANBgkqhkiG9w0BAQE..." - * } - * } - * \endcode - * - * The ping packet can be used to verify that a site has not been re-installed, and to - * initiate corrective action if it has. The url_sig is signed with the site private key - * and base64url encoded - and this should verify with the enclosed sitekey. Failure to - * verify indicates the site is corrupt or otherwise unable to communicate using zot. - * This return packet is not otherwise verified, so should be compared with other - * results obtained from this site which were verified prior to taking action. For instance - * if you have one verified result with this signature and key, and other records for this - * url which have different signatures and keys, it indicates that the site was re-installed - * and corrective action may commence (remove or mark invalid any entries with different - * signatures). - * If you have no records which match this url_sig and key - no corrective action should - * be taken as this packet may have been returned by an imposter. - * - * @param[in,out] App &$a - */ +} function post_post(&$a) { -- cgit v1.2.3 From 5735cad45795d1f810085a079106f9fea056bcca Mon Sep 17 00:00:00 2001 From: redmatrix Date: Tue, 8 Dec 2015 19:43:49 -0800 Subject: remove extra debug logging and ensure we don't try to authenticate without a hubloc --- Zotlabs/Zot/Auth.php | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/Zotlabs/Zot/Auth.php b/Zotlabs/Zot/Auth.php index 950a7593a..d0374ad7e 100644 --- a/Zotlabs/Zot/Auth.php +++ b/Zotlabs/Zot/Auth.php @@ -22,7 +22,6 @@ class Auth { function __construct($req) { - logger('construct'); $this->ret = array('success' => false); $this->success = false; @@ -41,14 +40,11 @@ class Auth { $x = $this->GetHublocs($this->address); - logger('hublocs'); - - foreach($x as $xx) { - - logger('verify'); - - if($this->Verify($c,$xx)) - break; + if($x) { + foreach($x as $xx) { + if($this->Verify($c,$xx)) + break; + } } /** -- cgit v1.2.3 From 656e5fd052d0ee1e9161e25090b54be70d4880ba Mon Sep 17 00:00:00 2001 From: redmatrix Date: Tue, 8 Dec 2015 20:42:46 -0800 Subject: use killme() instead of die() so that any sessions are closed cleanly. --- include/api_auth.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/include/api_auth.php b/include/api_auth.php index ee9db3f55..b78c69bac 100644 --- a/include/api_auth.php +++ b/include/api_auth.php @@ -1,6 +1,6 @@ "; // var_dump($consumer, $token); - die(); + killme(); } catch(Exception $e) { logger(__file__.__line__.__function__."\n".$e); @@ -56,7 +56,8 @@ function api_login(&$a){ logger('API_login: ' . print_r($_SERVER,true), LOGGER_DEBUG); header('WWW-Authenticate: Basic realm="Red"'); header('HTTP/1.0 401 Unauthorized'); - die('This api requires login'); + echo('This api requires login'); + killme(); } // process normal login request @@ -81,7 +82,8 @@ function api_login(&$a){ logger('API_login failure: ' . print_r($_SERVER,true), LOGGER_DEBUG); header('WWW-Authenticate: Basic realm="Red"'); header('HTTP/1.0 401 Unauthorized'); - die('This api requires login'); + echo('This api requires login'); + killme(); } } -- cgit v1.2.3 From 0f4ceedbb492126dcbbbcd77b5252816097d2857 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Tue, 8 Dec 2015 20:47:55 -0800 Subject: remove duplicated code --- include/api_auth.php | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/include/api_auth.php b/include/api_auth.php index b78c69bac..cabaed93e 100644 --- a/include/api_auth.php +++ b/include/api_auth.php @@ -54,10 +54,7 @@ function api_login(&$a){ if (!isset($_SERVER['PHP_AUTH_USER'])) { logger('API_login: ' . print_r($_SERVER,true), LOGGER_DEBUG); - header('WWW-Authenticate: Basic realm="Red"'); - header('HTTP/1.0 401 Unauthorized'); - echo('This api requires login'); - killme(); + retry_basic_auth(); } // process normal login request @@ -80,10 +77,7 @@ function api_login(&$a){ } if(! $record) { logger('API_login failure: ' . print_r($_SERVER,true), LOGGER_DEBUG); - header('WWW-Authenticate: Basic realm="Red"'); - header('HTTP/1.0 401 Unauthorized'); - echo('This api requires login'); - killme(); + retry_basic_auth(); } } @@ -95,3 +89,11 @@ function api_login(&$a){ $_SESSION['allow_api'] = true; } + + +function retry_basic_auth() { + header('WWW-Authenticate: Basic realm="Hubzilla"'); + header('HTTP/1.0 401 Unauthorized'); + echo('This api requires login'); + killme(); +} \ No newline at end of file -- cgit v1.2.3 From f5226a748fbd5f9b1054da8c074d18ca32ee51e4 Mon Sep 17 00:00:00 2001 From: msooon Date: Wed, 9 Dec 2015 10:48:41 +0100 Subject: =?UTF-8?q?Let=E2=80=99s=20Encrypt=20added?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library/certs/cacert.pem | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/library/certs/cacert.pem b/library/certs/cacert.pem index 1ff34f9b5..e4da7fc15 100644 --- a/library/certs/cacert.pem +++ b/library/certs/cacert.pem @@ -3986,3 +3986,33 @@ PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su -----END CERTIFICATE----- + +Lets Encrypt +============ +-----BEGIN CERTIFICATE----- +MIIEqDCCA5CgAwIBAgIRAJgT9HUT5XULQ+dDHpceRL0wDQYJKoZIhvcNAQELBQAw +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzAeFw0xNTEwMTkyMjMzMzZaFw0yMDEwMTkyMjMzMzZa +MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD +ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAJzTDPBa5S5Ht3JdN4OzaGMw6tc1Jhkl4b2+NfFwki+3uEtB +BaupnjUIWOyxKsRohwuj43Xk5vOnYnG6eYFgH9eRmp/z0HhncchpDpWRz/7mmelg +PEjMfspNdxIknUcbWuu57B43ABycrHunBerOSuu9QeU2mLnL/W08lmjfIypCkAyG +dGfIf6WauFJhFBM/ZemCh8vb+g5W9oaJ84U/l4avsNwa72sNlRZ9xCugZbKZBDZ1 +gGusSvMbkEl4L6KWTyogJSkExnTA0DHNjzE4lRa6qDO4Q/GxH8Mwf6J5MRM9LTb4 +4/zyM2q5OTHFr8SNDR1kFjOq+oQpttQLwNh9w5MCAwEAAaOCAZIwggGOMBIGA1Ud +EwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMH8GCCsGAQUFBwEBBHMwcTAy +BggrBgEFBQcwAYYmaHR0cDovL2lzcmcudHJ1c3RpZC5vY3NwLmlkZW50cnVzdC5j +b20wOwYIKwYBBQUHMAKGL2h0dHA6Ly9hcHBzLmlkZW50cnVzdC5jb20vcm9vdHMv +ZHN0cm9vdGNheDMucDdjMB8GA1UdIwQYMBaAFMSnsaR7LHH62+FLkHX/xBVghYkQ +MFQGA1UdIARNMEswCAYGZ4EMAQIBMD8GCysGAQQBgt8TAQEBMDAwLgYIKwYBBQUH +AgEWImh0dHA6Ly9jcHMucm9vdC14MS5sZXRzZW5jcnlwdC5vcmcwPAYDVR0fBDUw +MzAxoC+gLYYraHR0cDovL2NybC5pZGVudHJ1c3QuY29tL0RTVFJPT1RDQVgzQ1JM +LmNybDATBgNVHR4EDDAKoQgwBoIELm1pbDAdBgNVHQ4EFgQUqEpqYwR93brm0Tm3 +pkVl7/Oo7KEwDQYJKoZIhvcNAQELBQADggEBANHIIkus7+MJiZZQsY14cCoBG1hd +v0J20/FyWo5ppnfjL78S2k4s2GLRJ7iD9ZDKErndvbNFGcsW+9kKK/TnY21hp4Dd +ITv8S9ZYQ7oaoqs7HwhEMY9sibED4aXw09xrJZTC9zK1uIfW6t5dHQjuOWv+HHoW +ZnupyxpsEUlEaFb+/SCI4KCSBdAsYxAcsHYI5xxEI4LutHp6s3OT2FuO90WfdsIk +6q78OMSdn875bNjdBYAqxUp2/LEIHfDBkLoQz0hFJmwAbYahqKaLn73PAAm1X2kj +f1w8DdnkabOLGeOVcj9LQ+s67vBykx4anTjURkbqZslUEUsn2k5xeua2zUk= +-----END CERTIFICATE----- -- cgit v1.2.3 From 746acc21f783c69da1b388a18baf70f541989132 Mon Sep 17 00:00:00 2001 From: msooon Date: Wed, 9 Dec 2015 10:54:48 +0100 Subject: =?UTF-8?q?Let=E2=80=99s=20Encrypt=20added?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- library/cacert.pem | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/library/cacert.pem b/library/cacert.pem index 739128024..ef43898ab 100644 --- a/library/cacert.pem +++ b/library/cacert.pem @@ -4078,3 +4078,33 @@ Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ= -----END CERTIFICATE----- + +Lets Encrypt +============ +-----BEGIN CERTIFICATE----- +MIIEqDCCA5CgAwIBAgIRAJgT9HUT5XULQ+dDHpceRL0wDQYJKoZIhvcNAQELBQAw +PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD +Ew5EU1QgUm9vdCBDQSBYMzAeFw0xNTEwMTkyMjMzMzZaFw0yMDEwMTkyMjMzMzZa +MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD +ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMTCCASIwDQYJKoZIhvcNAQEBBQAD +ggEPADCCAQoCggEBAJzTDPBa5S5Ht3JdN4OzaGMw6tc1Jhkl4b2+NfFwki+3uEtB +BaupnjUIWOyxKsRohwuj43Xk5vOnYnG6eYFgH9eRmp/z0HhncchpDpWRz/7mmelg +PEjMfspNdxIknUcbWuu57B43ABycrHunBerOSuu9QeU2mLnL/W08lmjfIypCkAyG +dGfIf6WauFJhFBM/ZemCh8vb+g5W9oaJ84U/l4avsNwa72sNlRZ9xCugZbKZBDZ1 +gGusSvMbkEl4L6KWTyogJSkExnTA0DHNjzE4lRa6qDO4Q/GxH8Mwf6J5MRM9LTb4 +4/zyM2q5OTHFr8SNDR1kFjOq+oQpttQLwNh9w5MCAwEAAaOCAZIwggGOMBIGA1Ud +EwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgGGMH8GCCsGAQUFBwEBBHMwcTAy +BggrBgEFBQcwAYYmaHR0cDovL2lzcmcudHJ1c3RpZC5vY3NwLmlkZW50cnVzdC5j +b20wOwYIKwYBBQUHMAKGL2h0dHA6Ly9hcHBzLmlkZW50cnVzdC5jb20vcm9vdHMv +ZHN0cm9vdGNheDMucDdjMB8GA1UdIwQYMBaAFMSnsaR7LHH62+FLkHX/xBVghYkQ +MFQGA1UdIARNMEswCAYGZ4EMAQIBMD8GCysGAQQBgt8TAQEBMDAwLgYIKwYBBQUH +AgEWImh0dHA6Ly9jcHMucm9vdC14MS5sZXRzZW5jcnlwdC5vcmcwPAYDVR0fBDUw +MzAxoC+gLYYraHR0cDovL2NybC5pZGVudHJ1c3QuY29tL0RTVFJPT1RDQVgzQ1JM +LmNybDATBgNVHR4EDDAKoQgwBoIELm1pbDAdBgNVHQ4EFgQUqEpqYwR93brm0Tm3 +pkVl7/Oo7KEwDQYJKoZIhvcNAQELBQADggEBANHIIkus7+MJiZZQsY14cCoBG1hd +v0J20/FyWo5ppnfjL78S2k4s2GLRJ7iD9ZDKErndvbNFGcsW+9kKK/TnY21hp4Dd +ITv8S9ZYQ7oaoqs7HwhEMY9sibED4aXw09xrJZTC9zK1uIfW6t5dHQjuOWv+HHoW +ZnupyxpsEUlEaFb+/SCI4KCSBdAsYxAcsHYI5xxEI4LutHp6s3OT2FuO90WfdsIk +6q78OMSdn875bNjdBYAqxUp2/LEIHfDBkLoQz0hFJmwAbYahqKaLn73PAAm1X2kj +f1w8DdnkabOLGeOVcj9LQ+s67vBykx4anTjURkbqZslUEUsn2k5xeua2zUk= +-----END CERTIFICATE----- -- cgit v1.2.3 From 2e73e6bfb64bfa3154898ed6425a760c30d1449e Mon Sep 17 00:00:00 2001 From: jeroenpraat Date: Wed, 9 Dec 2015 14:37:14 +0100 Subject: Fix #109. --- include/account.php | 4 ++-- view/nl/hmessages.po | 2 +- view/nl/hstrings.php | 2 +- view/nl/register_open_eml.tpl | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/account.php b/include/account.php index b3a520fd4..e448bdcc6 100644 --- a/include/account.php +++ b/include/account.php @@ -67,7 +67,7 @@ function check_account_invite($invite_code) { $result['message'] .= t('An invitation is required.') . EOL; } $r = q("select * from register where `hash` = '%s' limit 1", dbesc($invite_code)); - if(! results($r)) { + if(! $r) { $result['message'] .= t('Invitation could not be verified.') . EOL; } } @@ -718,4 +718,4 @@ function upgrade_message($bbcode = false) { function upgrade_bool_message($bbcode = false) { $x = upgrade_link($bbcode); return t('This action is not available under your subscription plan.') . (($x) ? ' ' . $x : '') ; -} \ No newline at end of file +} diff --git a/view/nl/hmessages.po b/view/nl/hmessages.po index 9029d41a6..c26eddc02 100644 --- a/view/nl/hmessages.po +++ b/view/nl/hmessages.po @@ -8316,7 +8316,7 @@ msgstr "Hierbij nodig ik je uit om mij, en andere vrienden en kennissen, op $Pro #: ../../mod/invite.php:134 msgid "You will need to supply this invitation code: " -msgstr "Je moet deze uitnodigingscode opgeven:" +msgstr "Je moet deze uitnodigingscode opgeven: " #: ../../mod/invite.php:135 msgid "" diff --git a/view/nl/hstrings.php b/view/nl/hstrings.php index ea02d8633..839bf7e3b 100644 --- a/view/nl/hstrings.php +++ b/view/nl/hstrings.php @@ -1960,7 +1960,7 @@ $a->strings["Send invitations"] = "Uitnodigingen verzenden"; $a->strings["Enter email addresses, one per line:"] = "Voer e-mailadressen in, één per regel:"; $a->strings["Your message:"] = "Jouw bericht:"; $a->strings["Please join my community on \$Projectname."] = "Hierbij nodig ik je uit om mij, en andere vrienden en kennissen, op \$Projectname te vergezellen. Lees meer over \$Projectname op https://redmatrix.me."; -$a->strings["You will need to supply this invitation code: "] = "Je moet deze uitnodigingscode opgeven:"; +$a->strings["You will need to supply this invitation code: "] = "Je moet deze uitnodigingscode opgeven: "; $a->strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Registreer je op een willekeurige \$Projectname-hub (ze zijn allemaal onderling met elkaar verbonden):"; $a->strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Nadat je bent ingelogd en een kanaal hebt aangemaakt kan je mijn \$Projectname-kanaaladres in het zoekveld invullen:"; $a->strings["or visit "] = "of bezoek "; diff --git a/view/nl/register_open_eml.tpl b/view/nl/register_open_eml.tpl index e634664a6..411bd00be 100644 --- a/view/nl/register_open_eml.tpl +++ b/view/nl/register_open_eml.tpl @@ -11,7 +11,7 @@ bezoeken en een nieuwe wachtwoord aanvragen. Je kan daarna inloggen, een kanaal meteen via 'instellingen > account' (linksboven) het account verwijderen (onderaan). Excuses voor het eventuele ongemak. -Wanneer dit account wel door jou is aangemaakt: Dank je en welkom op de {{$sitename}}. +Wanneer dit account wel door jou is aangemaakt: Dank je en welkom op {{$sitename}}. Vriendelijke groet, Beheerder {{$sitename}} ({{$siteurl}}) -- cgit v1.2.3 From 200eabe0523ec89085c7546bed1c624bd66dcd24 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Wed, 9 Dec 2015 11:51:31 -0800 Subject: add empty arg --- Zotlabs/Zot/Auth.php | 8 ++++---- version.inc | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Zotlabs/Zot/Auth.php b/Zotlabs/Zot/Auth.php index d0374ad7e..715676979 100644 --- a/Zotlabs/Zot/Auth.php +++ b/Zotlabs/Zot/Auth.php @@ -57,7 +57,7 @@ class Auth { if(strstr($this->desturl,z_root() . '/rmagic')) goaway(z_root()); - $this->reply_die(); + $this->reply_die(''); } @@ -259,7 +259,7 @@ class Auth { } - function reply_die($msg,$goaway = true) { + function reply_die($msg) { if($msg) { if(array_key_exists('message',$this->ret)) $this->ret['message'] .= $msg; @@ -268,8 +268,8 @@ class Auth { } if($this->test) json_return_and_die($this->ret); - if($goaway) - goaway($this->desturl); + + goaway($this->desturl); } } diff --git a/version.inc b/version.inc index 2d04a5143..3c7cd4dfb 100644 --- a/version.inc +++ b/version.inc @@ -1 +1 @@ -2015-12-08.1240 +2015-12-09.1241 -- cgit v1.2.3 From 47f7165b07e17721d6074e1464a42af1ef99afe3 Mon Sep 17 00:00:00 2001 From: jeroenpraat Date: Wed, 9 Dec 2015 23:41:37 +0100 Subject: Some work on the login, register and default home page. Mostly neatly centering things on different viewport widths. Bluegrid schema updated. --- mod/home.php | 2 +- view/css/mod_home.css | 15 +++++++++++++++ view/css/mod_login.css | 23 +++++++++++++++++++++++ view/css/mod_register.css | 28 ++++++++++++++++------------ view/theme/redbasic/css/style.css | 5 ----- view/theme/redbasic/schema/bluegrid.css | 10 +++++++--- 6 files changed, 62 insertions(+), 21 deletions(-) create mode 100644 view/css/mod_home.css create mode 100644 view/css/mod_login.css diff --git a/mod/home.php b/mod/home.php index bf2463bbc..bfac17eab 100644 --- a/mod/home.php +++ b/mod/home.php @@ -72,7 +72,7 @@ function home_content(&$a, $update = 0, $load = false) { $sitename = get_config('system','sitename'); if($sitename) - $o .= '

    ' . sprintf( t("Welcome to %s") ,$sitename) . '

    '; + $o .= '

    ' . sprintf( t("Welcome to %s") ,$sitename) . '

    '; $loginbox = get_config('system','login_on_homepage'); if(intval($loginbox) || $loginbox === false) diff --git a/view/css/mod_home.css b/view/css/mod_home.css new file mode 100644 index 000000000..d4cf37253 --- /dev/null +++ b/view/css/mod_home.css @@ -0,0 +1,15 @@ +.home-welcome { + text-align: center; +} + +.generic-content-wrapper-styled { + margin-left: auto; + margin-right: auto; + max-width: 420px; + font-size: 1.1em; +} + +#login-main { + max-width: 400px; + margin-top: 50px; +} diff --git a/view/css/mod_login.css b/view/css/mod_login.css new file mode 100644 index 000000000..a086c50df --- /dev/null +++ b/view/css/mod_login.css @@ -0,0 +1,23 @@ +.generic-content-wrapper-styled { + margin-left: auto; + margin-right: auto; + max-width: 420px; + font-size: 1.1em; +} + +#login-main { + max-width: 400px; + margin-top: 50px; +} + +@media (min-width: 768px) and (max-width: 991px) { + #region_1 { + display: none !important; + } +} + +@media (min-width: 992px) and (max-width: 1199px) { + #region_3 { + display: table-cell !important; + } +} diff --git a/view/css/mod_register.css b/view/css/mod_register.css index b662610ae..618b7ce95 100644 --- a/view/css/mod_register.css +++ b/view/css/mod_register.css @@ -1,31 +1,35 @@ h2 { - margin-left: 5%; - margin-top: 5%; + margin: 20px 0 20px 5%; } -#register-form { - font-size: 1.4em; - margin-left: 10%; - margin-top: 5%; +.generic-content-wrapper-styled { + margin-left: auto; + margin-right: auto; + max-width: 820px; + font-size: 1.1em; } -#register-desc, #register-text, #register-sites { + +#register-desc, #register-invite-desc, #register-text, #register-sites { font-weight: bold; margin-bottom: 15px; padding: 8px; border: 1px solid #ccc; } -.register-label { +@media (min-width: 560px) { +.register-label, .register-input { float: left; - width: 275px; + width: 50%; +} } -.register-input { +@media (max-width: 559px) { +.register-label, .register-input { float: left; - width: 275px; - padding: 5px; + max-width: 400px; +} } .register-feedback { diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css index 16f7845e2..5fcf901fb 100644 --- a/view/theme/redbasic/css/style.css +++ b/view/theme/redbasic/css/style.css @@ -249,11 +249,6 @@ footer { color: $font_colour; } -#login-main { - max-width: 300px; - margin-top: 50px; -} - #cropimage-wrapper, #cropimage-preview-wrapper { float: left; padding: 30px; diff --git a/view/theme/redbasic/schema/bluegrid.css b/view/theme/redbasic/schema/bluegrid.css index 0eb3dab1f..820e84baa 100644 --- a/view/theme/redbasic/schema/bluegrid.css +++ b/view/theme/redbasic/schema/bluegrid.css @@ -284,8 +284,12 @@ input { border-radius: 0px; } +.home-welcome { + color: #FFF; + margin-bottom: 30px; +} + #login-main { - max-width: 100%; margin-top: 0; } @@ -341,7 +345,7 @@ input { background-color: #FFF; } -.btn-primary, input#event-submit, input#rmagic-submit-button, input#lostpass-submit-button, input#side-follow-submit, .profile-edit-submit-wrapper > input.profile-edit-submit-button, input#profile-photo-submit, form#chat-form > input, div#adminpage > form > div.submit > input, input.sources-submit, input.contact-edit-submit, input#dbtn-submit, input#newchannel-submit-button, input#contacts-search-submit { +.btn-primary, input#event-submit, input#rmagic-submit-button, input#lostpass-submit-button, input#side-follow-submit, .profile-edit-submit-wrapper > input.profile-edit-submit-button, input#profile-photo-submit, form#chat-form > input, div#adminpage > form > div.submit > input, input.sources-submit, input.contact-edit-submit, input#dbtn-submit, input#newchannel-submit-button, input#contacts-search-submit, input#register-submit-button { background-color: #FFF; color: #43488A; border-radius: 0px; @@ -350,7 +354,7 @@ input { transition: all .3s ease-in-out; } -.btn-primary:hover, .btn-primary:focus, input#event-submit:hover, input#event-submit:focus, input#rmagic-submit-button:hover, input#rmagic-submit-button:focus, input#lostpass-submit-button:hover, input#lostpass-submit-button:focus, input#side-follow-submit:hover, input#side-follow-submit:focus, .profile-edit-submit-wrapper > input.profile-edit-submit-button:hover, .profile-edit-submit-wrapper > input.profile-edit-submit-button:focus, input#profile-photo-submit:hover, input#profile-photo-submit:focus, form#chat-form > input:hover, form#chat-form > input:focus, div#adminpage > form > div.submit > input:hover, div#adminpage > form > div.submit > input:focus, input.sources-submit:hover, input.sources-submit:focus, input.contact-edit-submit:focus, input.contact-edit-submit:hover, input#dbtn-submit:hover, input#dbtn-submit:focus, input#newchannel-submit-button:hover, input#newchannel-submit-button:focus, input#contacts-search-submit:hover, input#contacts-search-submit:focus { +.btn-primary:hover, .btn-primary:focus, input#event-submit:hover, input#event-submit:focus, input#rmagic-submit-button:hover, input#rmagic-submit-button:focus, input#lostpass-submit-button:hover, input#lostpass-submit-button:focus, input#side-follow-submit:hover, input#side-follow-submit:focus, .profile-edit-submit-wrapper > input.profile-edit-submit-button:hover, .profile-edit-submit-wrapper > input.profile-edit-submit-button:focus, input#profile-photo-submit:hover, input#profile-photo-submit:focus, form#chat-form > input:hover, form#chat-form > input:focus, div#adminpage > form > div.submit > input:hover, div#adminpage > form > div.submit > input:focus, input.sources-submit:hover, input.sources-submit:focus, input.contact-edit-submit:focus, input.contact-edit-submit:hover, input#dbtn-submit:hover, input#dbtn-submit:focus, input#newchannel-submit-button:hover, input#newchannel-submit-button:focus, input#contacts-search-submit:hover, input#contacts-search-submit:focus, input#register-submit-button:hover, input#register-submit-button:focus { border-color: #FFF; background-color: #43488A; color: #FFF; -- cgit v1.2.3 From 4b6dcbb05776c9630490e94a4b008872105fe65e Mon Sep 17 00:00:00 2001 From: redmatrix Date: Wed, 9 Dec 2015 14:56:08 -0800 Subject: provide paths for include files --- include/api.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/include/api.php b/include/api.php index e60583a01..69cc69415 100644 --- a/include/api.php +++ b/include/api.php @@ -1,10 +1,10 @@ Date: Wed, 9 Dec 2015 18:30:30 -0800 Subject: start working on the singleton setting --- doc/database/db_abook.bb | 1 + include/follow.php | 25 ++++++++++++++++++------- include/network.php | 13 +++++++++++++ include/notifier.php | 2 ++ include/zot.php | 1 + 5 files changed, 35 insertions(+), 7 deletions(-) diff --git a/doc/database/db_abook.bb b/doc/database/db_abook.bb index 2e4b9c4a7..7ff6847e1 100644 --- a/doc/database/db_abook.bb +++ b/doc/database/db_abook.bb @@ -41,6 +41,7 @@ [tr][td]abook_feed[/td][td]indicates this connection is an RSS/Atom feed and may trigger special handling.[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td] [tr][td]abook_incl[/td][td]connection filter allow rules separated by LF[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td] [tr][td]abook_excl[/td][td]connection filter deny rules separated by LF[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td] +[tr][td]abook_instance[/td][td]comma separated list of site urls of all channel clones that this connection is connected with (used only for singleton networks which don't support cloning)[/td][td]text[/td][td]NO[/td][td]MUL[/td][td]0[/td][td] [/table] diff --git a/include/follow.php b/include/follow.php index 40ad2c299..97be82da7 100644 --- a/include/follow.php +++ b/include/follow.php @@ -161,6 +161,7 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) } } if($r) { + $xchan = $r[0]; $xchan_hash = $r[0]['xchan_hash']; $their_perms = 0; } @@ -172,7 +173,7 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) return $result; } - $x = array('channel_id' => $uid, 'follow_address' => $url, 'xchan' => $r[0], 'allowed' => 1); + $x = array('channel_id' => $uid, 'follow_address' => $url, 'xchan' => $r[0], 'allowed' => 1, 'singleton' => 0); call_hooks('follow_allow',$x); @@ -180,7 +181,7 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) $result['message'] = t('Protocol disabled.'); return $result; } - + $singleton = intval($x['singleton']); if((local_channel()) && $uid == local_channel()) { $aid = get_account_id(); @@ -221,13 +222,22 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) return $result; } - $r = q("select abook_xchan from abook where abook_xchan = '%s' and abook_channel = %d limit 1", + $r = q("select abook_xchan, abook_instance from abook where abook_xchan = '%s' and abook_channel = %d limit 1", dbesc($xchan_hash), intval($uid) ); if($r) { - $x = q("update abook set abook_their_perms = %d where abook_id = %d", + $abook_instance = $r[0]['abook_instance']; + + if(($singleton) && strpos($abook_instance,z_root()) === false) { + if($abook_instance) + $abook_instance .= ','; + $abook_instance .= z_root(); + } + + $x = q("update abook set abook_their_perms = %d, abook_instance = '%s' where abook_id = %d", intval($their_perms), + dbesc($abook_instance), intval($r[0]['abook_id']) ); } @@ -237,8 +247,8 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) if($closeness === false) $closeness = 80; - $r = q("insert into abook ( abook_account, abook_channel, abook_closeness, abook_xchan, abook_feed, abook_their_perms, abook_my_perms, abook_created, abook_updated ) - values( %d, %d, %d, '%s', %d, %d, %d, '%s', '%s' ) ", + $r = q("insert into abook ( abook_account, abook_channel, abook_closeness, abook_xchan, abook_feed, abook_their_perms, abook_my_perms, abook_created, abook_updated, abook_instance ) + values( %d, %d, %d, '%s', %d, %d, %d, '%s', '%s', '%s' ) ", intval($aid), intval($uid), intval($closeness), @@ -247,7 +257,8 @@ function new_contact($uid,$url,$channel,$interactive = false, $confirm = false) intval(($is_http) ? $their_perms|PERMS_R_STREAM|PERMS_A_REPUBLISH : $their_perms), intval($my_perms), dbesc(datetime_convert()), - dbesc(datetime_convert()) + dbesc(datetime_convert()), + dbesc(($singleton) ? z_root() : '') ); } diff --git a/include/network.php b/include/network.php index 5895d302b..68452c3d1 100644 --- a/include/network.php +++ b/include/network.php @@ -1883,3 +1883,16 @@ function check_channelallowed($hash) { return $retvalue; } +function deliverable_singleton($xchan) { + $r = q("select abook_instance from abook where abook_xchan = '%s' limit 1", + dbesc($xchan['xchan_hash']) + ); + if($r) { + if(! $r[0]['abook_instance']) + return true; + if(strpos($r[0]['abook_instance'],z_root()) !== false) + return true; + } + return false; +} + diff --git a/include/notifier.php b/include/notifier.php index b7830285a..66b6160e4 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -57,6 +57,8 @@ require_once('include/html2plain.php'); * purge_all channel_id * expire channel_id * relay item_id (item was relayed to owner, we will deliver it as owner) + * single_activity item_id (deliver to a singleton network from the appropriate clone) + * single_mail mail_id (deliver to a singleton network from the appropriate clone) * location channel_id * request channel_id xchan_hash message_id * rating xlink_id diff --git a/include/zot.php b/include/zot.php index 276afb03e..390407e4e 100644 --- a/include/zot.php +++ b/include/zot.php @@ -3798,6 +3798,7 @@ function zotinfo($arr) { $ret['site'] = array(); $ret['site']['url'] = z_root(); $ret['site']['url_sig'] = base64url_encode(rsa_sign(z_root(),$e['channel_prvkey'])); + $ret['site']['zot_auth'] = z_root() . '/magic'; $dirmode = get_config('system','directory_mode'); if(($dirmode === false) || ($dirmode == DIRECTORY_MODE_NORMAL)) -- cgit v1.2.3 From bd37f59829bbb72b66dd4a9edb16c4506e77eaed Mon Sep 17 00:00:00 2001 From: redmatrix Date: Wed, 9 Dec 2015 20:51:00 -0800 Subject: simplify magic-auth - a lot... Would be even simpler if we didn't need to provide remote debugging, which takes up about half the code. But we need that because nobody wants to try and debug this shit by asking somebody at the other end to report what's in their logfile. We've tried this repeatedly. The only thing we can do is bring back all the debugging data so you can look at it yourself. --- Zotlabs/Zot/Auth.php | 298 +++++++++++++++++++++++------------------------ doc/database/db_abook.bb | 4 +- 2 files changed, 149 insertions(+), 153 deletions(-) diff --git a/Zotlabs/Zot/Auth.php b/Zotlabs/Zot/Auth.php index 715676979..f9a1de8ab 100644 --- a/Zotlabs/Zot/Auth.php +++ b/Zotlabs/Zot/Auth.php @@ -4,8 +4,10 @@ namespace Zotlabs\Zot; class Auth { - protected $ret; protected $test; + protected $test_results; + protected $debug_msg; + protected $address; protected $desturl; protected $sec; @@ -23,19 +25,22 @@ class Auth { function __construct($req) { - $this->ret = array('success' => false); - $this->success = false; - $this->test = ((array_key_exists('test',$req)) ? intval($req['test']) : 0); - $this->address = $req['auth']; - $this->desturl = $req['dest']; - $this->sec = $req['sec']; - $this->version = $req['version']; - $this->delegate = $req['delegate']; + $this->test = ((array_key_exists('test',$req)) ? intval($req['test']) : 0); + $this->test_results = array('success' => false); + $this->debug_msg = ''; + + $this->success = false; + $this->address = $req['auth']; + $this->desturl = $req['dest']; + $this->sec = $req['sec']; + $this->version = $req['version']; + $this->delegate = $req['delegate']; $c = get_sys_channel(); if(! $c) { logger('unable to obtain response (sys) channel'); - reply_die('no local channels found.'); + $this->Debug('no local channels found.'); + $this->Finalise(); } $x = $this->GetHublocs($this->address); @@ -57,13 +62,17 @@ class Auth { if(strstr($this->desturl,z_root() . '/rmagic')) goaway(z_root()); - $this->reply_die(''); + $this->Finalise(); } function GetHublocs($address) { - // Try and find a hubloc for the person attempting to auth + // Try and find a hubloc for the person attempting to auth. + // Since we're matching by address, we have to return all entries + // some of which may be from re-installed hubs; and we'll need to + // try each sequentially to see if one can pass the test + $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash where hubloc_addr = '%s' order by hubloc_id desc", dbesc($address) @@ -74,7 +83,7 @@ class Auth { $ret = zot_finger($address, null); if ($ret['success']) { $j = json_decode($ret['body'], true); - if ($j) + if($j) import_xchan($j); $x = q("select * from hubloc left join xchan on xchan_hash = hubloc_hash where hubloc_addr = '%s' order by hubloc_id desc", @@ -84,7 +93,8 @@ class Auth { } if(! $x) { logger('mod_zot: auth: unable to finger ' . $address); - $this->reply_die('no hubloc found for ' . $address . ' and probing failed.'); + $this->Debug('no hubloc found for ' . $address . ' and probing failed.'); + $this->Finalise(); } return $x; @@ -107,167 +117,154 @@ class Auth { // Also check that they are coming from the same site as they authenticated with originally. - $already_authed = ((($this->remote) && ($hubloc['hubloc_hash'] == $this->remote) + $already_authed = (((remote_channel()) && ($hubloc['hubloc_hash'] == remote_channel()) && ($hubloc['hubloc_url'] === $_SESSION['remote_hub'])) ? true : false); - if($this->delegate && $this->delegate !== $_SESSION['delegate_channel']) - $already_authed = false; - - $j = array(); - - if(! $already_authed) { + + if($this->delegate && $this->delegate !== $_SESSION['delegate_channel']) + $already_authed = false; - // Auth packets MUST use ultra top-secret hush-hush mode - e.g. the entire packet is encrypted using the - // site private key - // The actual channel sending the packet ($c[0]) is not important, but this provides a - // generic zot packet with a sender which can be verified + if($already_authed) + return true; - $p = zot_build_packet($channel,$type = 'auth_check', - array(array('guid' => $hubloc['hubloc_guid'],'guid_sig' => $hubloc['hubloc_guid_sig'])), - $hubloc['hubloc_sitekey'], $this->sec); + if(local_channel()) { - $this->dbg_msg('auth check packet created using sitekey ' . $hubloc['hubloc_sitekey']); - $this->dbg_msg('packet contents: ' . $p); + // tell them to logout if they're logged in locally as anything but the target remote account + // in which case just shut up because they don't need to be doing this at all. - - $result = zot_zot($hubloc['hubloc_callback'],$p); - - if(! $result['success']) { - logger('auth_check callback failed.'); - if($this->test) { - $this->dbg_msg('auth check request to your site returned .' . print_r($result, true)); - return false; - } - return false; + if (get_app()->channel['channel_hash'] == $hubloc['xchan_hash']) { + return true; } - $j = json_decode($result['body'], true); - if(! $j) { - logger('auth_check json data malformed.'); + else { + logger('already authenticated locally as somebody else.'); + notice( t('Remote authentication blocked. You are logged into this site locally. Please logout and retry.') . EOL); if($this->test) { - $this->dbg_msg('json malformed: ' . $result['body']); + $this->Debug('already logged in locally with a conflicting identity.'); return false; } } + return false; + } - $this->dbg_msg('auth check request returned .' . print_r($j, true)); - - if ($already_authed || $j['success']) { - if($j['success']) { - // legit response, but we do need to check that this wasn't answered by a man-in-middle - if (! rsa_verify($this->sec . $hubloc['xchan_hash'],base64url_decode($j['confirm']),$hubloc['xchan_pubkey'])) { - logger('final confirmation failed.'); - if($this->test) { - $this->dbg_msg('final confirmation failed. ' . $sec . print_r($j,true) . print_r($hubloc,true)); - return false; - } - return false; - } - if (array_key_exists('service_class',$j)) - $this->remote_service_class = $j['service_class']; - if (array_key_exists('level',$j)) - $this->remote_level = $j['level']; - if (array_key_exists('DNT',$j)) - $this->dnt = $j['DNT']; - } + // Auth packets MUST use ultra top-secret hush-hush mode - e.g. the entire packet is encrypted using the + // site private key + // The actual channel sending the packet ($c[0]) is not important, but this provides a + // generic zot packet with a sender which can be verified - // everything is good... maybe + $p = zot_build_packet($channel,$type = 'auth_check', + array(array('guid' => $hubloc['hubloc_guid'],'guid_sig' => $hubloc['hubloc_guid_sig'])), + $hubloc['hubloc_sitekey'], $this->sec); - if(local_channel()) { + $this->Debug('auth check packet created using sitekey ' . $hubloc['hubloc_sitekey']); + $this->Debug('packet contents: ' . $p); - // tell them to logout if they're logged in locally as anything but the target remote account - // in which case just shut up because they don't need to be doing this at all. + $result = zot_zot($hubloc['hubloc_callback'],$p); - if (get_app()->channel['channel_hash'] != $hubloc['xchan_hash']) { - logger('already authenticated locally as somebody else.'); - notice( t('Remote authentication blocked. You are logged into this site locally. Please logout and retry.') . EOL); - if($this->test) { - $$this->dbg_msg('already logged in locally with a conflicting identity.'); - return false;; - } - } - return false;; - } + if(! $result['success']) { + logger('auth_check callback failed.'); + if($this->test) { + $this->Debug('auth check request to your site returned .' . print_r($result, true)); + return false; + } + return false; + } + $j = json_decode($result['body'], true); + if(! $j) { + logger('auth_check json data malformed.'); + if($this->test) { + $this->Debug('json malformed: ' . $result['body']); + return false; + } + } - // log them in + $this->Debug('auth check request returned .' . print_r($j, true)); - if ($this->test) { - $ret['success'] = true; - $this->reply_die('Authentication Success!'); - } + if(! $j['success']) + return false; - $this->delegate_success = false; - if($this->delegate) { - $r = q("select * from channel left join xchan on channel_hash = xchan_hash where xchan_addr = '%s' limit 1", - dbesc($this->delegate) - ); - if ($r && intval($r[0]['channel_id'])) { - $allowed = perm_is_allowed($r[0]['channel_id'],$hubloc['xchan_hash'],'delegate'); - if($allowed) { - $_SESSION['delegate_channel'] = $r[0]['channel_id']; - $_SESSION['delegate'] = $hubloc['xchan_hash']; - $_SESSION['account_id'] = intval($r[0]['channel_account_id']); - require_once('include/security.php'); - change_channel($r[0]['channel_id']); - $this->delegate_success = true; - } - } - } + // legit response, but we do need to check that this wasn't answered by a man-in-middle - $_SESSION['authenticated'] = 1; - if (! $this->delegate_success) { - $_SESSION['visitor_id'] = $hubloc['xchan_hash']; - $_SESSION['my_url'] = $hubloc['xchan_url']; - $_SESSION['my_address'] = $this->address; - $_SESSION['remote_service_class'] = $this->remote_service_class; - $_SESSION['remote_level'] = $this->remote_level; - $_SESSION['remote_hub'] = $this->remote_hub; - $_SESSION['DNT'] = $this->dnt; - } - - $arr = array('xchan' => $hubloc, 'url' => $this->desturl, 'session' => $_SESSION); - call_hooks('magic_auth_success',$arr); - get_app()->set_observer($hubloc); - require_once('include/security.php'); - get_app()->set_groups(init_groups_visitor($_SESSION['visitor_id'])); - info(sprintf( t('Welcome %s. Remote authentication successful.'),$hubloc['xchan_name'])); - logger('mod_zot: auth success from ' . $hubloc['xchan_addr']); - $this->success = true; - return true; + if (! rsa_verify($this->sec . $hubloc['xchan_hash'],base64url_decode($j['confirm']),$hubloc['xchan_pubkey'])) { + logger('final confirmation failed.'); + if($this->test) { + $this->Debug('final confirmation failed. ' . $sec . print_r($j,true) . print_r($hubloc,true)); + return false; } - else { - if($this->test) { - $this->dbg_msg('auth failure. ' . print_r($_REQUEST,true) . print_r($j,true)); - return false; + return false; + } + + if (array_key_exists('service_class',$j)) + $this->remote_service_class = $j['service_class']; + if (array_key_exists('level',$j)) + $this->remote_level = $j['level']; + if (array_key_exists('DNT',$j)) + $this->dnt = $j['DNT']; + + + // log them in + + if ($this->test) { + // testing only - return the success result + $this->test_results['success'] = true; + $this->Debug('Authentication Success!'); + $this->Finalise(); + } + + $_SESSION['authenticated'] = 1; + + // check for delegation + $this->delegate_success = false; + + if($this->delegate) { + $r = q("select * from channel left join xchan on channel_hash = xchan_hash where xchan_addr = '%s' limit 1", + dbesc($this->delegate) + ); + if ($r && intval($r[0]['channel_id'])) { + $allowed = perm_is_allowed($r[0]['channel_id'],$hubloc['xchan_hash'],'delegate'); + if($allowed) { + $_SESSION['delegate_channel'] = $r[0]['channel_id']; + $_SESSION['delegate'] = $hubloc['xchan_hash']; + $_SESSION['account_id'] = intval($r[0]['channel_account_id']); + require_once('include/security.php'); + // this will set the local_channel authentication in the session + change_channel($r[0]['channel_id']); + $this->delegate_success = true; } - logger('magic-auth failure - not authenticated: ' . $hubloc['xchan_addr']); } + } - if($this->test) { - $this->dbg_msg('auth failure fallthrough ' . print_r($_REQUEST,true) . print_r($j,true)); - return false; - } + if (! $this->delegate_success) { + // normal visitor (remote_channel) login session credentials + $_SESSION['visitor_id'] = $hubloc['xchan_hash']; + $_SESSION['my_url'] = $hubloc['xchan_url']; + $_SESSION['my_address'] = $this->address; + $_SESSION['remote_service_class'] = $this->remote_service_class; + $_SESSION['remote_level'] = $this->remote_level; + $_SESSION['remote_hub'] = $this->remote_hub; + $_SESSION['DNT'] = $this->dnt; } - } + $arr = array('xchan' => $hubloc, 'url' => $this->desturl, 'session' => $_SESSION); + call_hooks('magic_auth_success',$arr); + get_app()->set_observer($hubloc); + require_once('include/security.php'); + get_app()->set_groups(init_groups_visitor($_SESSION['visitor_id'])); + info(sprintf( t('Welcome %s. Remote authentication successful.'),$hubloc['xchan_name'])); + logger('mod_zot: auth success from ' . $hubloc['xchan_addr']); + $this->success = true; + return true; + } - function dbg_msg($msg) { - if($msg) { - if(array_key_exists('message',$this->ret)) - $this->ret['message'] .= $msg; - else - $this->ret['message'] = $msg; - } + function Debug($msg) { + $this->debug_msg .= $msg . EOL; } - function reply_die($msg) { - if($msg) { - if(array_key_exists('message',$this->ret)) - $this->ret['message'] .= $msg; - else - $this->ret['message'] = $msg; + function Finalise() { + + if($this->test) { + $this->test_results['message'] = $this->debug_msg; + json_return_and_die($this->test_results); } - if($this->test) - json_return_and_die($this->ret); goaway($this->desturl); } @@ -276,11 +273,6 @@ class Auth { /** - * @brief HTTP POST entry point for Zot. - * - * Most access to this endpoint is via the post method. - * Here we will pick out the magic auth params which arrive as a get request, - * and the only communications to arrive this way. * * Magic Auth * ========== @@ -298,6 +290,8 @@ class Auth { * * version => the zot revision * * delegate => optional urlencoded webbie of a local channel to invoke delegation rights for * + * * test => (optional 1 or 0 - debugs the authentication exchange and returns a json response instead of redirecting the browser session) + * * When this packet is received, an "auth-check" zot message is sent to $mysite. * (e.g. if $_GET['auth'] is foobar@podunk.edu, a zot packet is sent to the podunk.edu zot endpoint, which is typically /post) * If no information has been recorded about the requesting identity a zot information packet will be retrieved before @@ -313,7 +307,8 @@ class Auth { * "guid":"kgVFf_...", * "guid_sig":"PT9-TApz...", * "url":"http:\/\/podunk.edu", - * "url_sig":"T8Bp7j..." + * "url_sig":"T8Bp7j...", + * "sitekey":"aMtgKTiirXrICP..." * }, * "recipients":{ * { @@ -338,6 +333,7 @@ class Auth { * "confirm":"q0Ysovd1u...", * "service_class":(optional) * "level":(optional) + * "DNT": (optional do-not-track - 1 or 0) * } * \endcode * diff --git a/doc/database/db_abook.bb b/doc/database/db_abook.bb index 7ff6847e1..364429884 100644 --- a/doc/database/db_abook.bb +++ b/doc/database/db_abook.bb @@ -39,8 +39,8 @@ [tr][td]abook_unconnected[/td][td]currently unused. Projected usage is to indicate "one-way" connections which were insitgated on this end but are still pending on the remote end. [/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td] [tr][td]abook_self[/td][td]is a special case where the owner is the target. Every channel has one abook entry with abook_self and with a target abook_xchan set to channel.channel_hash . When this flag is present, abook_my_perms is the default permissions granted to all new connections and several other fields are unused.[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td] [tr][td]abook_feed[/td][td]indicates this connection is an RSS/Atom feed and may trigger special handling.[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td] -[tr][td]abook_incl[/td][td]connection filter allow rules separated by LF[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td] -[tr][td]abook_excl[/td][td]connection filter deny rules separated by LF[/td][td]int(11)[/td][td]NO[/td][td]MUL[/td][td]0[/td][td] +[tr][td]abook_incl[/td][td]connection filter allow rules separated by LF[/td][td]text[/td][td]NO[/td][td]MUL[/td][td]0[/td][td] +[tr][td]abook_excl[/td][td]connection filter deny rules separated by LF[/td][td]text[/td][td]NO[/td][td]MUL[/td][td]0[/td][td] [tr][td]abook_instance[/td][td]comma separated list of site urls of all channel clones that this connection is connected with (used only for singleton networks which don't support cloning)[/td][td]text[/td][td]NO[/td][td]MUL[/td][td]0[/td][td] [/table] -- cgit v1.2.3 From 8e1e301764058f3bf444f0e448a184614e729159 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Wed, 9 Dec 2015 21:03:29 -0800 Subject: refactor a few more redundant returns --- Zotlabs/Zot/Auth.php | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Zotlabs/Zot/Auth.php b/Zotlabs/Zot/Auth.php index f9a1de8ab..07879fbd9 100644 --- a/Zotlabs/Zot/Auth.php +++ b/Zotlabs/Zot/Auth.php @@ -158,22 +158,19 @@ class Auth { $this->Debug('packet contents: ' . $p); $result = zot_zot($hubloc['hubloc_callback'],$p); - if(! $result['success']) { logger('auth_check callback failed.'); - if($this->test) { + if($this->test) $this->Debug('auth check request to your site returned .' . print_r($result, true)); - return false; - } return false; } + $j = json_decode($result['body'], true); if(! $j) { logger('auth_check json data malformed.'); - if($this->test) { + if($this->test) $this->Debug('json malformed: ' . $result['body']); - return false; - } + return false; } $this->Debug('auth check request returned .' . print_r($j, true)); @@ -185,10 +182,8 @@ class Auth { if (! rsa_verify($this->sec . $hubloc['xchan_hash'],base64url_decode($j['confirm']),$hubloc['xchan_pubkey'])) { logger('final confirmation failed.'); - if($this->test) { + if($this->test) $this->Debug('final confirmation failed. ' . $sec . print_r($j,true) . print_r($hubloc,true)); - return false; - } return false; } @@ -211,7 +206,8 @@ class Auth { $_SESSION['authenticated'] = 1; - // check for delegation + // check for delegation and if all is well, log them in locally with delegation restrictions + $this->delegate_success = false; if($this->delegate) { -- cgit v1.2.3 From 6cd3296c082a9ecc66b21e0f050c210adba5e38e Mon Sep 17 00:00:00 2001 From: jeroenpraat Date: Thu, 10 Dec 2015 23:32:25 +0100 Subject: Missing underscores in doc --- doc/hidden_configs.bb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/hidden_configs.bb b/doc/hidden_configs.bb index b06df641f..8a02a23f2 100644 --- a/doc/hidden_configs.bb +++ b/doc/hidden_configs.bb @@ -65,7 +65,7 @@ This document assumes you're an administrator. this website. Can be overwritten by user settings. [b]system > projecthome[/b] Set the project homepage as the homepage of your hub. - [b]system > workflowchannelnext[/b] + [b]system > workflow_channel_next[/b] The page to direct users to immediately after creating a channel. [b]system > max_daily_registrations[/b] Set the maximum number of new registrations allowed on any day. -- cgit v1.2.3 From 7fa944ed953cbf2b9ee044d46e74dfd299237fa7 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Thu, 10 Dec 2015 15:13:10 -0800 Subject: don't spit out sabre xml on permission denied exceptions, just provide a 401 --- mod/cloud.php | 42 ++++++++++++------------------------------ version.inc | 2 +- 2 files changed, 13 insertions(+), 31 deletions(-) diff --git a/mod/cloud.php b/mod/cloud.php index efb33f935..67fc199bf 100644 --- a/mod/cloud.php +++ b/mod/cloud.php @@ -73,36 +73,18 @@ function cloud_init(&$a) { $server->addPlugin($lockPlugin); -/* This next bit should no longer be needed... */ - - // The next section of code allows us to bypass prompting for http-auth if a - // FILE is being accessed anonymously and permissions allow this. This way - // one can create hotlinks to public media files in their cloud and anonymous - // viewers won't get asked to login. - // If a DIRECTORY is accessed or there are permission issues accessing the - // file and we aren't previously authenticated via zot, prompt for HTTP-auth. - // This will be the default case for mounting a DAV directory. - // In order to avoid prompting for passwords for viewing a DIRECTORY, add - // the URL query parameter 'davguest=1'. - -// $isapublic_file = false; -// $davguest = ((x($_SESSION, 'davguest')) ? true : false); - -// if ((! $auth->observer) && ($_SERVER['REQUEST_METHOD'] === 'GET')) { -// try { -// $x = RedFileData('/' . $a->cmd, $auth); -// if($x instanceof RedDAV\RedFile) -// $isapublic_file = true; -// } -// catch (Exception $e) { -// $isapublic_file = false; -// } -// } - -// if ((! $auth->observer) && (! $isapublic_file) && (! $davguest)) { -// logger('mod_cloud: auth exception'); -// http_status_exit(401, 'Permission denied.'); -// } + $is_readable = false; + + if($_SERVER['REQUEST_METHOD'] === 'GET') { + try { + $x = RedFileData('/' . $a->cmd, $auth); + } + catch(\Exception $e) { + if($e instanceof Sabre\DAV\Exception\Forbidden) { + http_status_exit(401, 'Permission denied.'); + } + } + } require_once('include/RedDAV/RedBrowser.php'); // provide a directory view for the cloud in Hubzilla diff --git a/version.inc b/version.inc index 3c7cd4dfb..8ef02f56e 100644 --- a/version.inc +++ b/version.inc @@ -1 +1 @@ -2015-12-09.1241 +2015-12-10.1242 -- cgit v1.2.3 From 8389d8677d4e2deaaf5da028d9abacf7ce5ef250 Mon Sep 17 00:00:00 2001 From: redmatrix Date: Thu, 10 Dec 2015 16:39:46 -0800 Subject: some major cleanup of api authentication stuff - still needs much more and this still may not solve #206 --- include/api.php | 8 +-- include/api_auth.php | 66 +++++++++++------------ include/oauth.php | 149 +++++++++++++++++++++++++-------------------------- 3 files changed, 109 insertions(+), 114 deletions(-) diff --git a/include/api.php b/include/api.php index 69cc69415..4ad915c03 100644 --- a/include/api.php +++ b/include/api.php @@ -2298,12 +2298,11 @@ require_once('include/api_auth.php'); api_register_func('api/direct_messages','api_direct_messages_inbox',true); - function api_oauth_request_token(&$a, $type){ try{ - $oauth = new FKOAuth1(); + $oauth = new ZotOAuth1(); $req = OAuthRequest::from_request(); -logger('Req: ' . var_export($req,true)); + logger('Req: ' . var_export($req,true),LOGGER_DATA); $r = $oauth->fetch_request_token($req); }catch(Exception $e){ logger('oauth_exception: ' . print_r($e->getMessage(),true)); @@ -2313,9 +2312,10 @@ logger('Req: ' . var_export($req,true)); echo $r; killme(); } + function api_oauth_access_token(&$a, $type){ try{ - $oauth = new FKOAuth1(); + $oauth = new ZotOAuth1(); $req = OAuthRequest::from_request(); $r = $oauth->fetch_access_token($req); }catch(Exception $e){ diff --git a/include/api_auth.php b/include/api_auth.php index cabaed93e..c9978c99d 100644 --- a/include/api_auth.php +++ b/include/api_auth.php @@ -1,16 +1,18 @@ verify_request($req); @@ -23,16 +25,14 @@ function api_login(&$a){ call_hooks('logged_in', $a->user); return; } - echo __file__.__line__.__function__."
    "; 
    -//			var_dump($consumer, $token); 
     		killme();
     	}
     	catch(Exception $e) {
     		logger(__file__.__line__.__function__."\n".$e);
     	}
    -
     		
    -	// workaround for HTTP-auth in CGI mode
    +	// workarounds for HTTP-auth in CGI mode
    +
     	if(x($_SERVER,'REDIRECT_REMOTE_USER')) {
     		$userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"],6)) ;
     		if(strlen($userpass)) {
    @@ -51,43 +51,43 @@ function api_login(&$a){
     		}
     	}
     
    +	require_once('include/auth.php');
    +	require_once('include/security.php');
     
    -	if (!isset($_SERVER['PHP_AUTH_USER'])) {
    -		logger('API_login: ' . print_r($_SERVER,true), LOGGER_DEBUG);
    -		retry_basic_auth();
    -	}
    -		
     	// process normal login request
    -	require_once('include/auth.php');
    -	$channel_login = 0;
    -	$record = account_verify_password($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']);
    -	if(! $record) {
    -	        $r = q("select * from channel where channel_address = '%s' limit 1",
    +
    +	if(isset($_SERVER['PHP_AUTH_USER'])) {
    +		$channel_login = 0;
    +		$record = account_verify_password($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']);
    +		if(! $record) {
    +	        $r = q("select * from channel left join account on account.account_id = channel.channel_account_id 
    +				where channel.channel_address = '%s' limit 1",
     		       dbesc($_SERVER['PHP_AUTH_USER'])
     			);
             	if ($r) {
    -			$x = q("select * from account where account_id = %d limit 1",
    -			       intval($r[0]['channel_account_id'])
    -				);
    -			if ($x) {
    -				$record = account_verify_password($x[0]['account_email'],$_SERVER['PHP_AUTH_PW']);
    +				$record = account_verify_password($r[0]['account_email'],$_SERVER['PHP_AUTH_PW']);
     				if($record)
     					$channel_login = $r[0]['channel_id'];
     			}
     		}
    -		if(! $record) {	
    -			logger('API_login failure: ' . print_r($_SERVER,true), LOGGER_DEBUG);
    -			retry_basic_auth();
    -		}
     	}
     
    -	require_once('include/security.php');
    -	authenticate_success($record);
    +	if($record) {
    +		authenticate_success($record);
    +
    +		if($channel_login)
    +			change_channel($channel_login);
     
    -	if($channel_login)
    -		change_channel($channel_login);
    +		$_SESSION['allow_api'] = true;
    +		return true;
    +	}
    +	else {
    +		$_SERVER['PHP_AUTH_PW'] = '*****';
    +		logger('API_login failure: ' . print_r($_SERVER,true), LOGGER_DEBUG);
    +		log_failed_login('API login failure');
    +		retry_basic_auth();
    +	}
     
    -	$_SESSION['allow_api'] = true;
     }
     
     
    diff --git a/include/oauth.php b/include/oauth.php
    index 80336f906..4e5e4ecf8 100644
    --- a/include/oauth.php
    +++ b/include/oauth.php
    @@ -1,4 +1,5 @@
     
    @@ -9,16 +10,17 @@ define('REQUEST_TOKEN_DURATION', 300);
     define('ACCESS_TOKEN_DURATION', 31536000);
     
     require_once("library/OAuth1.php");
    -require_once("library/oauth2-php/lib/OAuth2.inc");
     
    -class FKOAuthDataStore extends OAuthDataStore {
    -  function gen_token(){
    +//require_once("library/oauth2-php/lib/OAuth2.inc");
    +
    +class ZotOAuthDataStore extends OAuthDataStore {
    +
    +	function gen_token(){
     		return md5(base64_encode(pack('N6', mt_rand(), mt_rand(), mt_rand(), mt_rand(), mt_rand(), uniqid())));
    -  }
    +	}
     	
    -  function lookup_consumer($consumer_key) {
    -		logger(__function__.":".$consumer_key);
    -//      echo "
    "; var_dump($consumer_key); killme();
    +	function lookup_consumer($consumer_key) {
    +		logger('consumer_key: ' . $consumer_key, LOGGER_DEBUG);
     
     		$r = q("SELECT client_id, pw, redirect_uri FROM clients WHERE client_id = '%s'",
     			dbesc($consumer_key)
    @@ -29,10 +31,11 @@ class FKOAuthDataStore extends OAuthDataStore {
     			return new OAuthConsumer($r[0]['client_id'],$r[0]['pw'],$r[0]['redirect_uri']);
     		}
     		return null;
    -  }
    +	}
     
    -  function lookup_token($consumer, $token_type, $token) {
    -		logger(__function__.":".$consumer.", ". $token_type.", ".$token);
    +	function lookup_token($consumer, $token_type, $token) {
    +
    +		logger(__function__.":".$consumer.", ". $token_type.", ".$token, LOGGER_DEBUG);
     
     		$r = q("SELECT id, secret, scope, expires, uid  FROM tokens WHERE client_id = '%s' AND scope = '%s' AND id = '%s'",
     			dbesc($consumer->key),
    @@ -48,10 +51,9 @@ class FKOAuthDataStore extends OAuthDataStore {
     			return $ot;
     		}
     		return null;
    -  }
    +	}
     
    -  function lookup_nonce($consumer, $token, $nonce, $timestamp) {
    -//		echo __file__.":".__line__."
    "; var_dump($consumer,$key); killme();
    +	function lookup_nonce($consumer, $token, $nonce, $timestamp) {
     
     		$r = q("SELECT id, secret FROM tokens WHERE client_id = '%s' AND id = '%s' AND expires = %d",
     			dbesc($consumer->key),
    @@ -62,10 +64,12 @@ class FKOAuthDataStore extends OAuthDataStore {
     		if (count($r))
     			return new OAuthToken($r[0]['id'],$r[0]['secret']);
     		return null;
    -  }
    +	}
    +
    +	function new_request_token($consumer, $callback = null) {
    +
    +		logger(__function__.":".$consumer.", ". $callback, LOGGER_DEBUG);
     
    -  function new_request_token($consumer, $callback = null) {
    -		logger(__function__.":".$consumer.", ". $callback);
     		$key = $this->gen_token();
     		$sec = $this->gen_token();
     		
    @@ -82,29 +86,31 @@ class FKOAuthDataStore extends OAuthDataStore {
     				'request',
     				time()+intval(REQUEST_TOKEN_DURATION));
     
    -		if (!$r) return null;
    +		if(! $r)
    +			return null;
     		return new OAuthToken($key,$sec);
    -  }
    +	}
     
    -  function new_access_token($token, $consumer, $verifier = null) {
    -    logger(__function__.":".$token.", ". $consumer.", ". $verifier);
    -    
    -    // return a new access token attached to this consumer
    -    // for the user associated with this token if the request token
    -    // is authorized
    -    // should also invalidate the request token
    -    
    -    $ret=Null;
    +	function new_access_token($token, $consumer, $verifier = null) {
    +
    +		logger(__function__.":".$token.", ". $consumer.", ". $verifier, LOGGER_DEBUG);
         
    -    // get user for this verifier
    -    $uverifier = get_config("oauth", $verifier);
    -    logger(__function__.":".$verifier.",".$uverifier);
    -    if (is_null($verifier) || ($uverifier!==false)){
    +		// return a new access token attached to this consumer
    +		// for the user associated with this token if the request token
    +		// is authorized
    +		// should also invalidate the request token
    +	
    +		$ret=Null;
    +	
    +		// get user for this verifier
    +		$uverifier = get_config("oauth", $verifier);
    +		logger(__function__.":".$verifier.",".$uverifier, LOGGER_DEBUG);
    +		if (is_null($verifier) || ($uverifier!==false)) {
     		
    -		$key = $this->gen_token();
    -		$sec = $this->gen_token();
    +			$key = $this->gen_token();
    +			$sec = $this->gen_token();
     
    -		$r = q("INSERT INTO tokens (id, secret, client_id, scope, expires, uid) VALUES ('%s','%s','%s','%s', %d, %d)",
    +			$r = q("INSERT INTO tokens (id, secret, client_id, scope, expires, uid) VALUES ('%s','%s','%s','%s', %d, %d)",
     				dbesc($key),
     				dbesc($sec),
     				dbesc($consumer->key),
    @@ -112,81 +118,70 @@ class FKOAuthDataStore extends OAuthDataStore {
     				time()+intval(ACCESS_TOKEN_DURATION),
     				intval($uverifier));
     
    -		if ($r)
    -			$ret = new OAuthToken($key,$sec);		
    -	}
    +			if ($r)
    +				$ret = new OAuthToken($key,$sec);		
    +		}
     		
     		
    -	q("DELETE FROM tokens WHERE id='%s'", $token->key);
    +		q("DELETE FROM tokens WHERE id='%s'", $token->key);
     	
     	
    -	if (!is_null($ret) && $uverifier!==false){
    -		del_config("oauth", $verifier);
    -	/*	$apps = get_pconfig($uverifier, "oauth", "apps");
    -		if ($apps===false) $apps=array();
    -		$apps[] = $consumer->key;
    -		set_pconfig($uverifier, "oauth", "apps", $apps);*/
    +		if (!is_null($ret) && $uverifier!==false) {
    +			del_config("oauth", $verifier);
    +	
    +			//	$apps = get_pconfig($uverifier, "oauth", "apps");
    +			//	if ($apps===false) $apps=array();
    +			//  $apps[] = $consumer->key;
    +			// set_pconfig($uverifier, "oauth", "apps", $apps);
    +		}
    +		return $ret;
     	}
    -		
    -    return $ret;
    -    
    -  }
     }
     
    -class FKOAuth1 extends OAuthServer {
    +class ZotOAuth1 extends OAuthServer {
     
     	function __construct() {
    -		parent::__construct(new FKOAuthDataStore());
    +		parent::__construct(new ZotOAuthDataStore());
     		$this->add_signature_method(new OAuthSignatureMethod_PLAINTEXT());
     		$this->add_signature_method(new OAuthSignatureMethod_HMAC_SHA1());
     	}
     	
     	function loginUser($uid){
    -		logger("RedOAuth1::loginUser $uid");
    -		$a = get_app();
    +
    +		logger("ZotOAuth1::loginUser $uid");
    +
     		$r = q("SELECT * FROM channel WHERE channel_id = %d LIMIT 1",
     			intval($uid)
     		);
     		if(count($r)){
     			$record = $r[0];
     		} else {
    -		   logger('FKOAuth1::loginUser failure: ' . print_r($_SERVER,true), LOGGER_DEBUG);
    -		    header('HTTP/1.0 401 Unauthorized');
    -		    die('This api requires login');
    +			logger('ZotOAuth1::loginUser failure: ' . print_r($_SERVER,true), LOGGER_DEBUG);
    +			header('HTTP/1.0 401 Unauthorized');
    +			echo('This api requires login');
    +			killme();
     		}
     
     		$_SESSION['uid'] = $record['channel_id'];
    -		$_SESSION['theme'] = $record['channel_theme'];
    -		$_SESSION['account_id'] = $record['channel_account_id'];
    -		$_SESSION['mobile_theme'] = get_pconfig($record['channel_id'], 'system', 'mobile_theme');
    -		$_SESSION['authenticated'] = 1;
    -		$_SESSION['my_url'] = $a->get_baseurl() . '/channel/' . $record['channel_address'];
     		$_SESSION['addr'] = $_SERVER['REMOTE_ADDR'];
    -		$_SESSION['allow_api'] = true;
    +
     		$x = q("select * from account where account_id = %d limit 1",
     			intval($record['channel_account_id'])
     		);
    -		if($x)
    -			$a->account = $x[0];
    -
    -		change_channel($record['channel_id']);
    -
    -		$a->channel = $record;
    -
    -		if(strlen($a->channel['channel_timezone'])) {
    -			date_default_timezone_set($a->channel['channel_timezone']);
    +		if($x) {
    +			require_once('include/security.php');
    +			authenticate_success($x[0],true,false,true,true);
    +			$_SESSION['allow_api'] = true;
     		}
    -
    -//		q("UPDATE `user` SET `login_date` = '%s' WHERE `uid` = %d LIMIT 1",
    -//			dbesc(datetime_convert()),
    -//			intval($_SESSION['uid'])
    -//		);
    -//
    -//		call_hooks('logged_in', $a->user);		
     	}
     	
     }
    +
     /*
    + *
    +
    + not yet used
    +
     class FKOAuth2 extends OAuth2 {
     
     	private function db_secret($client_secret){
    -- 
    cgit v1.2.3
    
    
    From f73c82632f213ac7971b54220b4a0c87d354ca1e Mon Sep 17 00:00:00 2001
    From: redmatrix 
    Date: Thu, 10 Dec 2015 19:18:55 -0800
    Subject: some minor cleanup - change the default of the discover tab (public
     stream access)
    
    ---
     Zotlabs/Zot/Auth.php | 11 ++++++-----
     include/security.php | 18 ++++++++----------
     mod/admin.php        | 11 +++++++++--
     view/js/acl.js       | 10 +++++-----
     zot                  |  1 -
     5 files changed, 28 insertions(+), 23 deletions(-)
     delete mode 160000 zot
    
    diff --git a/Zotlabs/Zot/Auth.php b/Zotlabs/Zot/Auth.php
    index 07879fbd9..fed253923 100644
    --- a/Zotlabs/Zot/Auth.php
    +++ b/Zotlabs/Zot/Auth.php
    @@ -102,12 +102,8 @@ class Auth {
     
     
     	function Verify($channel,$hubloc) {
    -		logger('auth request received from ' . $hubloc['hubloc_addr'] );
    -
    -		// check credentials and access
     
    -		// If they are already authenticated and haven't changed credentials,
    -		// we can save an expensive network round trip and improve performance.
    +		logger('auth request received from ' . $hubloc['hubloc_addr'] );
     
     		$this->remote               = remote_channel();
     		$this->remote_service_class = '';
    @@ -115,6 +111,11 @@ class Auth {
     		$this->remote_hub           = $hubloc['hubloc_url'];
     		$this->dnt                  = 0;
     
    +		// check credentials and access
    +
    +		// If they are already authenticated and haven't changed credentials,
    +		// we can save an expensive network round trip and improve performance.
    +
     		// Also check that they are coming from the same site as they authenticated with originally.
     
     		$already_authed = (((remote_channel()) && ($hubloc['hubloc_hash'] == remote_channel()) 
    diff --git a/include/security.php b/include/security.php
    index 9a25d9e0e..d4ebe0024 100644
    --- a/include/security.php
    +++ b/include/security.php
    @@ -93,6 +93,7 @@ function change_channel($change_channel) {
     	$ret = false;
     
     	if($change_channel) {
    +
     		$r = q("select channel.*, xchan.* from channel left join xchan on channel.channel_hash = xchan.xchan_hash where channel_id = %d and channel_account_id = %d and channel_removed = 0 limit 1",
     			intval($change_channel),
     			intval(get_account_id())
    @@ -136,14 +137,14 @@ function change_channel($change_channel) {
     }
     
     /**
    - * @brief Creates an addiontal SQL where statement to check permissions.
    + * @brief Creates an additional SQL where statement to check permissions.
      *
      * @param int $owner_id
    - * @param bool $remote_verified default false, not used at all
    - * @param string $groups this param is not used at all
    + * @param bool $remote_observer - if unset use current observer
      *
      * @return string additional SQL where statement
      */
    +
     function permissions_sql($owner_id, $remote_observer = null) {
     
     	$local_channel = local_channel();
    @@ -208,8 +209,7 @@ function permissions_sql($owner_id, $remote_observer = null) {
      * @brief Creates an addiontal SQL where statement to check permissions for an item.
      *
      * @param int $owner_id
    - * @param bool $remote_verified default false, not used at all
    - * @param string $groups this param is not used at all
    + * @param bool $remote_observer, use current observer if unset
      *
      * @return string additional SQL where statement
      */
    @@ -400,11 +400,9 @@ function check_form_security_token_ForbiddenOnErr($typename = '', $formname = 'f
     }
     
     
    -// Returns an array of group id's this contact is a member of.
    -// This array will only contain group id's related to the uid of this
    -// DFRN contact. They are *not* neccessarily unique across the entire site. 
    +// Returns an array of group hash id's on this entire site (across all channels) that this connection is a member of.
    +// var $contact_id = xchan_hash of connection
     
    -if(! function_exists('init_groups_visitor')) {
     function init_groups_visitor($contact_id) {
     	$groups = array();
     	$r = q("SELECT hash FROM `groups` left join group_member on groups.id = group_member.gid WHERE xchan = '%s' ",
    @@ -415,7 +413,7 @@ function init_groups_visitor($contact_id) {
     			$groups[] = $rr['hash'];
     	}
     	return $groups;
    -}}
    +}
     
     
     
    diff --git a/mod/admin.php b/mod/admin.php
    index 4b7cb3cd9..bac0148e0 100644
    --- a/mod/admin.php
    +++ b/mod/admin.php
    @@ -243,7 +243,7 @@ function admin_page_site_post(&$a){
     	$not_allowed_email    = ((x($_POST,'not_allowed_email'))	? notags(trim($_POST['not_allowed_email']))		: '');
     	$block_public         = ((x($_POST,'block_public'))		? True	: False);
     	$force_publish        = ((x($_POST,'publish_all'))		? True	: False);
    -	$disable_discover_tab = ((x($_POST,'disable_discover_tab'))		? True	:	False);
    +	$disable_discover_tab = ((x($_POST,'disable_discover_tab'))		? False	:	True);
     	$login_on_homepage    = ((x($_POST,'login_on_homepage'))		? True	:	False);
     	$global_directory     = ((x($_POST,'directory_submit_url'))	? notags(trim($_POST['directory_submit_url']))	: '');
     	$no_community_page    = !((x($_POST,'no_community_page'))	? True	:	False);
    @@ -425,6 +425,13 @@ function admin_page_site(&$a) {
     //		SSL_POLICY_FULL     => t("Force all links to use SSL")
     //	);
     
    +	$discover_tab = get_config('system','disable_discover_tab');
    +	// $disable public streams by default
    +	if($discover_tab === false)
    +		$discover_tab = 1;
    +	// now invert the logic for the setting.
    +	$discover_tab = (1 - $discover_tab);
    +
     
     	$homelogin = get_config('system','login_on_homepage');
     
    @@ -461,7 +468,7 @@ function admin_page_site(&$a) {
     		'$block_public'		=> array('block_public', t("Block public"), get_config('system','block_public'), t("Check to block public access to all otherwise public personal pages on this site unless you are currently logged in.")),
     		'$verify_email'		=> array('verify_email', t("Verify Email Addresses"), get_config('system','verify_email'), t("Check to verify email addresses used in account registration (recommended).")),
     		'$force_publish'	=> array('publish_all', t("Force publish"), get_config('system','publish_all'), t("Check to force all profiles on this site to be listed in the site directory.")),
    -		'$disable_discover_tab'	=> array('disable_discover_tab', t("Disable discovery tab"), get_config('system','disable_discover_tab'), t("Remove the tab in the network view with public content pulled from sources chosen for this site.")),
    +		'$disable_discover_tab'	=> array('disable_discover_tab', t('Import Public Streams'), $discover_tab, t('Import and allow access to public content pulled from other sites. Warning: this content is unmoderated.')),
     		'$login_on_homepage'	=> array('login_on_homepage', t("login on Homepage"),((intval($homelogin) || $homelogin === false) ? 1 : '') , t("Present a login box to visitors on the home page if no other content has been configured.")),
     
     		'$directory_server' => (($dir_choices) ? array('directory_server', t("Directory Server URL"), get_config('system','directory_server'), t("Default directory server"), $dir_choices) : null),
    diff --git a/view/js/acl.js b/view/js/acl.js
    index ed8af478a..6d94b4987 100644
    --- a/view/js/acl.js
    +++ b/view/js/acl.js
    @@ -39,18 +39,18 @@ function ACL(backend_url, preset) {
     // no longer called only on submit - call to update whenever a change occurs to the acl list. 
     
     ACL.prototype.on_submit = function() {
    -	aclfileds = $("#acl-fields").html("");
    +	aclfields = $("#acl-fields").html("");
     	$(that.allow_gid).each(function(i,v) {
    -		aclfileds.append("");
    +		aclfields.append("");
     	});
     	$(that.allow_cid).each(function(i,v) {
    -		aclfileds.append("");
    +		aclfields.append("");
     	});
     	$(that.deny_gid).each(function(i,v) {
    -		aclfileds.append("");
    +		aclfields.append("");
     	});
     	$(that.deny_cid).each(function(i,v) {
    -		aclfileds.append("");
    +		aclfields.append("");
     	});
     
     	//areYouSure jquery plugin: recheck the form here
    diff --git a/zot b/zot
    deleted file mode 160000
    index d94e61a7b..000000000
    --- a/zot
    +++ /dev/null
    @@ -1 +0,0 @@
    -Subproject commit d94e61a7b627381715751fb6cb6c0cecf7ece3f9
    -- 
    cgit v1.2.3
    
    
    From d0482133a5a29deec31a6f267769c1d1fde170ad Mon Sep 17 00:00:00 2001
    From: royalterra 
    Date: Fri, 11 Dec 2015 09:48:04 +0000
    Subject: Update INSTALL.txt
    
    ---
     install/INSTALL.txt | 15 +++++++++++++++
     1 file changed, 15 insertions(+)
    
    diff --git a/install/INSTALL.txt b/install/INSTALL.txt
    index 25852497b..1a8118a25 100644
    --- a/install/INSTALL.txt
    +++ b/install/INSTALL.txt
    @@ -382,3 +382,18 @@ stuff on your server that might access MySQL, and Hubzilla's poller which
     needs MySQL access, too. A good setting for a medium-sized hub might be to
     keep MySQL's max_connections at 100 and set mpm_prefork's
     MaxRequestWorkers to 70.
    +------------------------------------------------------------------------
    +For Calculate Automatic according to your server resources and configure 
    +mod_prefork you can Install and Execute ApacheTune 
    +
    +Home Page: https://github.com/royalterra/apache2tune
    +
    +git clone https://github.com/royalterra/apache2tune.git
    +
    +cd apache2tune
    +
    +chmod +x Apache2tune.sh
    +
    +Please Read the Documentation of Apache2tune
    +./Apache2tune.sh
    +
    -- 
    cgit v1.2.3
    
    
    From 46332732793c24771fea51b0d54975e0954ff669 Mon Sep 17 00:00:00 2001
    From: royalterra 
    Date: Fri, 11 Dec 2015 09:49:14 +0000
    Subject: Update INSTALL.txt
    
    Add Link to ApacheTune for configure mod Prefork
    ---
     install/INSTALL.txt | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/install/INSTALL.txt b/install/INSTALL.txt
    index 1a8118a25..361153e59 100644
    --- a/install/INSTALL.txt
    +++ b/install/INSTALL.txt
    @@ -397,3 +397,4 @@ chmod +x Apache2tune.sh
     Please Read the Documentation of Apache2tune
     ./Apache2tune.sh
     
    +
    -- 
    cgit v1.2.3
    
    
    From 9fb7a12849cd0e91e16c68041a525b9a552242d0 Mon Sep 17 00:00:00 2001
    From: redmatrix 
    Date: Fri, 11 Dec 2015 02:52:43 -0800
    Subject: incorrect obj_type on several items
    
    ---
     include/conversation.php |    2 +-
     include/items.php        |    3 +-
     mod/item.php             |    1 +
     mod/subthread.php        |    1 -
     util/hmessages.po        | 1230 +++++++++++++++++++++++-----------------------
     version.inc              |    2 +-
     6 files changed, 621 insertions(+), 618 deletions(-)
    
    diff --git a/include/conversation.php b/include/conversation.php
    index 3b534dc69..747bb5d0a 100644
    --- a/include/conversation.php
    +++ b/include/conversation.php
    @@ -1227,7 +1227,7 @@ function status_editor($a, $x, $popup = false) {
     		'$wait' => t('Please wait'),
     		'$permset' => t('Permission settings'),
     		'$shortpermset' => t('permissions'),
    -		'$ptyp' => (($notes_cid) ? 'note' : 'wall'),
    +		'$ptyp' => '',
     		'$content' => ((x($x,'body')) ? htmlspecialchars($x['body'], ENT_COMPAT,'UTF-8') : ''),
     		'$attachment' => ((x($x, 'attachment')) ? $x['attachment'] : ''),
     		'$post_id' => '',
    diff --git a/include/items.php b/include/items.php
    index ef1867c14..8c2e7deb2 100755
    --- a/include/items.php
    +++ b/include/items.php
    @@ -2349,7 +2349,7 @@ function item_store($arr, $allow_exec = false) {
     				return $ret;
     			}
     
    -			if($arr['obj_type'] == ACTIVITY_OBJ_NOTE)
    +			if(($arr['obj_type'] == ACTIVITY_OBJ_NOTE) && (! $arr['object']))
     				$arr['obj_type'] = ACTIVITY_OBJ_COMMENT;
     
     			// is the new message multi-level threaded?
    @@ -2870,6 +2870,7 @@ function send_status_notifications($post_id,$item) {
     	if($x) {
     		foreach($x as $xx) {
     			if($xx['author_xchan'] === $r[0]['channel_hash']) {
    +
     				$notify = true;
     
     				// check for an unfollow thread activity - we should probably decode the obj and check the id
    diff --git a/mod/item.php b/mod/item.php
    index f32ff8844..b3ef57529 100644
    --- a/mod/item.php
    +++ b/mod/item.php
    @@ -107,6 +107,7 @@ function item_post(&$a) {
     	$layout_mid  = ((x($_REQUEST,'layout_mid'))  ? escape_tags($_REQUEST['layout_mid']): '');
     	$plink       = ((x($_REQUEST,'permalink'))   ? escape_tags($_REQUEST['permalink']) : '');
     	$obj_type    = ((x($_REQUEST,'obj_type'))    ? escape_tags($_REQUEST['obj_type'])  : ACTIVITY_OBJ_NOTE);
    +
     	// allow API to bulk load a bunch of imported items with sending out a bunch of posts. 
     	$nopush      = ((x($_REQUEST,'nopush'))      ? intval($_REQUEST['nopush'])         : 0);
     
    diff --git a/mod/subthread.php b/mod/subthread.php
    index 74d742b6a..ce087806e 100755
    --- a/mod/subthread.php
    +++ b/mod/subthread.php
    @@ -147,7 +147,6 @@ function subthread_content(&$a) {
     	$arr['deny_cid']      = $item['deny_cid'];
     	$arr['deny_gid']      = $item['deny_gid'];
     
    -
     	$post = item_store($arr);	
     	$post_id = $post['item_id'];
     
    diff --git a/util/hmessages.po b/util/hmessages.po
    index 2cd008851..9357552b3 100644
    --- a/util/hmessages.po
    +++ b/util/hmessages.po
    @@ -6,9 +6,9 @@
     #, fuzzy
     msgid ""
     msgstr ""
    -"Project-Id-Version: 2015-12-04.1236\n"
    +"Project-Id-Version: 2015-12-11.1243\n"
     "Report-Msgid-Bugs-To: \n"
    -"POT-Creation-Date: 2015-12-04 00:03-0800\n"
    +"POT-Creation-Date: 2015-12-11 00:03-0800\n"
     "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
     "Last-Translator: FULL NAME \n"
     "Language-Team: LANGUAGE \n"
    @@ -17,7 +17,7 @@ msgstr ""
     "Content-Type: text/plain; charset=UTF-8\n"
     "Content-Transfer-Encoding: 8bit\n"
     
    -#: ../../include/Contact.php:101 ../../include/identity.php:953
    +#: ../../include/Contact.php:101 ../../include/identity.php:947
     #: ../../include/widgets.php:137 ../../include/widgets.php:175
     #: ../../include/conversation.php:953 ../../mod/match.php:64
     #: ../../mod/directory.php:318 ../../mod/suggest.php:52
    @@ -76,25 +76,25 @@ msgstr ""
     #: ../../mod/editwebpage.php:125 ../../mod/profile.php:64
     #: ../../mod/profile.php:72 ../../mod/api.php:26 ../../mod/api.php:31
     #: ../../mod/fsuggest.php:78 ../../mod/sources.php:66
    -#: ../../mod/notifications.php:66 ../../mod/photos.php:70
    -#: ../../mod/profile_photo.php:341 ../../mod/profile_photo.php:354
    -#: ../../mod/thing.php:271 ../../mod/thing.php:291 ../../mod/thing.php:328
    -#: ../../mod/editblock.php:65 ../../mod/network.php:12
    -#: ../../mod/pdledit.php:21 ../../mod/register.php:72
    +#: ../../mod/notifications.php:66 ../../mod/invite.php:13
    +#: ../../mod/invite.php:87 ../../mod/profile_photo.php:341
    +#: ../../mod/profile_photo.php:354 ../../mod/thing.php:271
    +#: ../../mod/thing.php:291 ../../mod/thing.php:328 ../../mod/editblock.php:65
    +#: ../../mod/network.php:12 ../../mod/pdledit.php:21 ../../mod/register.php:72
     #: ../../mod/editlayout.php:63 ../../mod/editlayout.php:87
     #: ../../mod/settings.php:568 ../../mod/webpages.php:69
     #: ../../mod/appman.php:66 ../../mod/layouts.php:69 ../../mod/layouts.php:76
    -#: ../../mod/layouts.php:87 ../../mod/locs.php:83 ../../mod/invite.php:13
    -#: ../../mod/invite.php:104 ../../mod/regmod.php:17 ../../mod/channel.php:100
    -#: ../../mod/channel.php:214 ../../mod/channel.php:254
    -#: ../../mod/editpost.php:13 ../../mod/chat.php:94 ../../mod/chat.php:99
    -#: ../../mod/viewsrc.php:14 ../../mod/authtest.php:13
    -#: ../../mod/connections.php:29 ../../mod/manage.php:6 ../../mod/menu.php:74
    -#: ../../mod/mail.php:118 ../../mod/service_limits.php:7
    -#: ../../mod/suggest.php:26 ../../mod/events.php:260 ../../mod/message.php:16
    -#: ../../mod/block.php:22 ../../mod/block.php:72 ../../mod/mitem.php:111
    -#: ../../mod/sharedwithme.php:7 ../../mod/viewconnections.php:22
    -#: ../../mod/viewconnections.php:27 ../../index.php:182 ../../index.php:365
    +#: ../../mod/layouts.php:87 ../../mod/locs.php:83 ../../mod/regmod.php:17
    +#: ../../mod/channel.php:100 ../../mod/channel.php:214
    +#: ../../mod/channel.php:254 ../../mod/photos.php:70 ../../mod/editpost.php:13
    +#: ../../mod/chat.php:94 ../../mod/chat.php:99 ../../mod/viewsrc.php:14
    +#: ../../mod/authtest.php:13 ../../mod/connections.php:29
    +#: ../../mod/manage.php:6 ../../mod/menu.php:74 ../../mod/mail.php:126
    +#: ../../mod/service_limits.php:7 ../../mod/suggest.php:26
    +#: ../../mod/events.php:260 ../../mod/message.php:16 ../../mod/block.php:22
    +#: ../../mod/block.php:72 ../../mod/mitem.php:111 ../../mod/sharedwithme.php:7
    +#: ../../mod/viewconnections.php:22 ../../mod/viewconnections.php:27
    +#: ../../index.php:182 ../../index.php:365
     msgid "Permission denied."
     msgstr ""
     
    @@ -148,16 +148,16 @@ msgstr ""
     msgid "Schedule Outbox"
     msgstr ""
     
    -#: ../../include/RedDAV/RedBrowser.php:164 ../../include/widgets.php:1331
    +#: ../../include/RedDAV/RedBrowser.php:164 ../../include/widgets.php:1330
     #: ../../include/conversation.php:1027 ../../include/apps.php:360
    -#: ../../include/apps.php:415 ../../mod/photos.php:759
    -#: ../../mod/photos.php:1198
    +#: ../../include/apps.php:415 ../../mod/photos.php:754
    +#: ../../mod/photos.php:1195
     msgid "Unknown"
     msgstr ""
     
     #: ../../include/RedDAV/RedBrowser.php:226 ../../include/conversation.php:1629
     #: ../../include/nav.php:93 ../../include/apps.php:135
    -#: ../../mod/fbrowser.php:114
    +#: ../../mod/fbrowser.php:109
     msgid "Files"
     msgstr ""
     
    @@ -178,12 +178,12 @@ msgstr ""
     
     #: ../../include/RedDAV/RedBrowser.php:231
     #: ../../include/RedDAV/RedBrowser.php:305 ../../include/widgets.php:1343
    -#: ../../mod/photos.php:784 ../../mod/photos.php:1317
    -#: ../../mod/profile_photo.php:453
    +#: ../../mod/profile_photo.php:453 ../../mod/photos.php:781
    +#: ../../mod/photos.php:1316
     msgid "Upload"
     msgstr ""
     
    -#: ../../include/RedDAV/RedBrowser.php:235 ../../mod/admin.php:974
    +#: ../../include/RedDAV/RedBrowser.php:235 ../../mod/admin.php:981
     #: ../../mod/settings.php:588 ../../mod/settings.php:614
     #: ../../mod/sharedwithme.php:95
     msgid "Name"
    @@ -218,10 +218,10 @@ msgstr ""
     #: ../../include/RedDAV/RedBrowser.php:241 ../../include/conversation.php:657
     #: ../../include/ItemObject.php:120 ../../include/apps.php:260
     #: ../../mod/group.php:173 ../../mod/blocks.php:155 ../../mod/connedit.php:551
    -#: ../../mod/editwebpage.php:223 ../../mod/photos.php:1129
    -#: ../../mod/thing.php:258 ../../mod/editblock.php:181 ../../mod/admin.php:809
    -#: ../../mod/admin.php:968 ../../mod/editlayout.php:179
    -#: ../../mod/settings.php:649 ../../mod/webpages.php:183
    +#: ../../mod/editwebpage.php:223 ../../mod/thing.php:258
    +#: ../../mod/editblock.php:181 ../../mod/admin.php:816 ../../mod/admin.php:975
    +#: ../../mod/editlayout.php:179 ../../mod/settings.php:649
    +#: ../../mod/webpages.php:183 ../../mod/photos.php:1126
     msgid "Delete"
     msgstr ""
     
    @@ -252,7 +252,7 @@ msgid "Delete this item?"
     msgstr ""
     
     #: ../../include/js_strings.php:6 ../../include/ItemObject.php:696
    -#: ../../mod/photos.php:1047 ../../mod/photos.php:1165
    +#: ../../mod/photos.php:1044 ../../mod/photos.php:1162
     msgid "Comment"
     msgstr ""
     
    @@ -325,17 +325,17 @@ msgstr ""
     #: ../../mod/poke.php:171 ../../mod/profiles.php:675
     #: ../../mod/connedit.php:715 ../../mod/fsuggest.php:108
     #: ../../mod/sources.php:104 ../../mod/sources.php:138
    -#: ../../mod/import.php:527 ../../mod/photos.php:637 ../../mod/photos.php:1008
    -#: ../../mod/photos.php:1048 ../../mod/photos.php:1166 ../../mod/thing.php:313
    +#: ../../mod/import.php:527 ../../mod/invite.php:142 ../../mod/thing.php:313
     #: ../../mod/thing.php:359 ../../mod/import_items.php:122
    -#: ../../mod/pdledit.php:58 ../../mod/admin.php:435 ../../mod/admin.php:802
    -#: ../../mod/admin.php:966 ../../mod/admin.php:1103 ../../mod/admin.php:1297
    -#: ../../mod/admin.php:1382 ../../mod/settings.php:586
    +#: ../../mod/pdledit.php:58 ../../mod/admin.php:442 ../../mod/admin.php:809
    +#: ../../mod/admin.php:973 ../../mod/admin.php:1110 ../../mod/admin.php:1304
    +#: ../../mod/admin.php:1389 ../../mod/settings.php:586
     #: ../../mod/settings.php:698 ../../mod/settings.php:726
     #: ../../mod/settings.php:749 ../../mod/settings.php:834
     #: ../../mod/settings.php:1023 ../../mod/appman.php:99 ../../mod/locs.php:116
    -#: ../../mod/invite.php:142 ../../mod/xchan.php:11 ../../mod/chat.php:184
    -#: ../../mod/chat.php:213 ../../mod/mail.php:372 ../../mod/events.php:461
    +#: ../../mod/xchan.php:11 ../../mod/photos.php:637 ../../mod/photos.php:1005
    +#: ../../mod/photos.php:1045 ../../mod/photos.php:1163 ../../mod/chat.php:184
    +#: ../../mod/chat.php:213 ../../mod/mail.php:380 ../../mod/events.php:461
     #: ../../mod/events.php:658 ../../mod/mitem.php:231
     #: ../../view/theme/redbasic/php/config.php:99
     msgid "Submit"
    @@ -663,8 +663,8 @@ msgid "Visible to specific connections."
     msgstr ""
     
     #: ../../include/items.php:4319 ../../mod/filestorage.php:27
    -#: ../../mod/thing.php:86 ../../mod/admin.php:127 ../../mod/admin.php:1005
    -#: ../../mod/admin.php:1210 ../../mod/display.php:36 ../../mod/viewsrc.php:20
    +#: ../../mod/thing.php:86 ../../mod/admin.php:127 ../../mod/admin.php:1012
    +#: ../../mod/admin.php:1217 ../../mod/display.php:36 ../../mod/viewsrc.php:20
     msgid "Item not found."
     msgstr ""
     
    @@ -690,36 +690,6 @@ msgstr ""
     msgid "Connection not found."
     msgstr ""
     
    -#: ../../include/network.php:630
    -msgid "view full size"
    -msgstr ""
    -
    -#: ../../include/network.php:1608 ../../include/enotify.php:57
    -msgid "$Projectname Notification"
    -msgstr ""
    -
    -#: ../../include/network.php:1609 ../../include/enotify.php:58
    -msgid "$projectname"
    -msgstr ""
    -
    -#: ../../include/network.php:1611 ../../include/enotify.php:60
    -msgid "Thank You,"
    -msgstr ""
    -
    -#: ../../include/network.php:1613 ../../include/enotify.php:62
    -#, php-format
    -msgid "%s Administrator"
    -msgstr ""
    -
    -#: ../../include/network.php:1655 ../../include/account.php:316
    -#: ../../include/account.php:343 ../../include/account.php:403
    -msgid "Administrator"
    -msgstr ""
    -
    -#: ../../include/network.php:1669
    -msgid "No Subject"
    -msgstr ""
    -
     #: ../../include/event.php:22 ../../include/bb2diaspora.php:471
     #: ../../include/text.php:1392
     msgid "l F d, Y \\@ g:i A"
    @@ -735,7 +705,7 @@ msgstr ""
     msgid "Finishes:"
     msgstr ""
     
    -#: ../../include/event.php:52 ../../include/identity.php:1004
    +#: ../../include/event.php:52 ../../include/identity.php:998
     #: ../../include/bb2diaspora.php:493 ../../include/text.php:1407
     #: ../../mod/directory.php:304
     msgid "Location:"
    @@ -830,206 +800,206 @@ msgstr ""
     msgid "Requested profile is not available."
     msgstr ""
     
    -#: ../../include/identity.php:966 ../../mod/profiles.php:782
    +#: ../../include/identity.php:960 ../../mod/profiles.php:782
     msgid "Change profile photo"
     msgstr ""
     
    -#: ../../include/identity.php:972
    +#: ../../include/identity.php:966
     msgid "Profiles"
     msgstr ""
     
    -#: ../../include/identity.php:972
    +#: ../../include/identity.php:966
     msgid "Manage/edit profiles"
     msgstr ""
     
    -#: ../../include/identity.php:973 ../../mod/profiles.php:783
    +#: ../../include/identity.php:967 ../../mod/profiles.php:783
     msgid "Create New Profile"
     msgstr ""
     
    -#: ../../include/identity.php:976 ../../include/nav.php:90
    +#: ../../include/identity.php:970 ../../include/nav.php:90
     msgid "Edit Profile"
     msgstr ""
     
    -#: ../../include/identity.php:988 ../../mod/profiles.php:794
    +#: ../../include/identity.php:982 ../../mod/profiles.php:794
     msgid "Profile Image"
     msgstr ""
     
    -#: ../../include/identity.php:991
    +#: ../../include/identity.php:985
     msgid "visible to everybody"
     msgstr ""
     
    -#: ../../include/identity.php:992 ../../mod/profiles.php:677
    +#: ../../include/identity.php:986 ../../mod/profiles.php:677
     #: ../../mod/profiles.php:798
     msgid "Edit visibility"
     msgstr ""
     
    -#: ../../include/identity.php:1008 ../../include/identity.php:1248
    +#: ../../include/identity.php:1002 ../../include/identity.php:1242
     msgid "Gender:"
     msgstr ""
     
    -#: ../../include/identity.php:1009 ../../include/identity.php:1292
    +#: ../../include/identity.php:1003 ../../include/identity.php:1286
     msgid "Status:"
     msgstr ""
     
    -#: ../../include/identity.php:1010 ../../include/identity.php:1303
    +#: ../../include/identity.php:1004 ../../include/identity.php:1297
     msgid "Homepage:"
     msgstr ""
     
    -#: ../../include/identity.php:1011
    +#: ../../include/identity.php:1005
     msgid "Online Now"
     msgstr ""
     
    -#: ../../include/identity.php:1095 ../../include/identity.php:1173
    +#: ../../include/identity.php:1089 ../../include/identity.php:1167
     #: ../../mod/ping.php:318
     msgid "g A l F d"
     msgstr ""
     
    -#: ../../include/identity.php:1096 ../../include/identity.php:1174
    +#: ../../include/identity.php:1090 ../../include/identity.php:1168
     msgid "F d"
     msgstr ""
     
    -#: ../../include/identity.php:1141 ../../include/identity.php:1213
    +#: ../../include/identity.php:1135 ../../include/identity.php:1207
     #: ../../mod/ping.php:341
     msgid "[today]"
     msgstr ""
     
    -#: ../../include/identity.php:1152
    +#: ../../include/identity.php:1146
     msgid "Birthday Reminders"
     msgstr ""
     
    -#: ../../include/identity.php:1153
    +#: ../../include/identity.php:1147
     msgid "Birthdays this week:"
     msgstr ""
     
    -#: ../../include/identity.php:1206
    +#: ../../include/identity.php:1200
     msgid "[No description]"
     msgstr ""
     
    -#: ../../include/identity.php:1224
    +#: ../../include/identity.php:1218
     msgid "Event Reminders"
     msgstr ""
     
    -#: ../../include/identity.php:1225
    +#: ../../include/identity.php:1219
     msgid "Events this week:"
     msgstr ""
     
    -#: ../../include/identity.php:1238 ../../include/identity.php:1355
    +#: ../../include/identity.php:1232 ../../include/identity.php:1349
     #: ../../include/apps.php:138 ../../mod/profperm.php:112
     msgid "Profile"
     msgstr ""
     
    -#: ../../include/identity.php:1246 ../../mod/settings.php:1029
    +#: ../../include/identity.php:1240 ../../mod/settings.php:1029
     msgid "Full Name:"
     msgstr ""
     
    -#: ../../include/identity.php:1253
    +#: ../../include/identity.php:1247
     msgid "Like this channel"
     msgstr ""
     
    -#: ../../include/identity.php:1264 ../../include/taxonomy.php:414
    +#: ../../include/identity.php:1258 ../../include/taxonomy.php:414
     #: ../../include/conversation.php:1721 ../../include/ItemObject.php:179
    -#: ../../mod/photos.php:1086
    +#: ../../mod/photos.php:1083
     msgctxt "noun"
     msgid "Like"
     msgid_plural "Likes"
     msgstr[0] ""
     msgstr[1] ""
     
    -#: ../../include/identity.php:1277
    +#: ../../include/identity.php:1271
     msgid "j F, Y"
     msgstr ""
     
    -#: ../../include/identity.php:1278
    +#: ../../include/identity.php:1272
     msgid "j F"
     msgstr ""
     
    -#: ../../include/identity.php:1285
    +#: ../../include/identity.php:1279
     msgid "Birthday:"
     msgstr ""
     
    -#: ../../include/identity.php:1289 ../../mod/directory.php:299
    +#: ../../include/identity.php:1283 ../../mod/directory.php:299
     msgid "Age:"
     msgstr ""
     
    -#: ../../include/identity.php:1298
    +#: ../../include/identity.php:1292
     #, php-format
     msgid "for %1$d %2$s"
     msgstr ""
     
    -#: ../../include/identity.php:1301 ../../mod/profiles.php:699
    +#: ../../include/identity.php:1295 ../../mod/profiles.php:699
     msgid "Sexual Preference:"
     msgstr ""
     
    -#: ../../include/identity.php:1305 ../../mod/profiles.php:701
    +#: ../../include/identity.php:1299 ../../mod/profiles.php:701
     #: ../../mod/directory.php:315
     msgid "Hometown:"
     msgstr ""
     
    -#: ../../include/identity.php:1307
    +#: ../../include/identity.php:1301
     msgid "Tags:"
     msgstr ""
     
    -#: ../../include/identity.php:1309 ../../mod/profiles.php:702
    +#: ../../include/identity.php:1303 ../../mod/profiles.php:702
     msgid "Political Views:"
     msgstr ""
     
    -#: ../../include/identity.php:1311
    +#: ../../include/identity.php:1305
     msgid "Religion:"
     msgstr ""
     
    -#: ../../include/identity.php:1313 ../../mod/directory.php:317
    +#: ../../include/identity.php:1307 ../../mod/directory.php:317
     msgid "About:"
     msgstr ""
     
    -#: ../../include/identity.php:1315
    +#: ../../include/identity.php:1309
     msgid "Hobbies/Interests:"
     msgstr ""
     
    -#: ../../include/identity.php:1317 ../../mod/profiles.php:705
    +#: ../../include/identity.php:1311 ../../mod/profiles.php:705
     msgid "Likes:"
     msgstr ""
     
    -#: ../../include/identity.php:1319 ../../mod/profiles.php:706
    +#: ../../include/identity.php:1313 ../../mod/profiles.php:706
     msgid "Dislikes:"
     msgstr ""
     
    -#: ../../include/identity.php:1321
    +#: ../../include/identity.php:1315
     msgid "Contact information and Social Networks:"
     msgstr ""
     
    -#: ../../include/identity.php:1323
    +#: ../../include/identity.php:1317
     msgid "My other channels:"
     msgstr ""
     
    -#: ../../include/identity.php:1325
    +#: ../../include/identity.php:1319
     msgid "Musical interests:"
     msgstr ""
     
    -#: ../../include/identity.php:1327
    +#: ../../include/identity.php:1321
     msgid "Books, literature:"
     msgstr ""
     
    -#: ../../include/identity.php:1329
    +#: ../../include/identity.php:1323
     msgid "Television:"
     msgstr ""
     
    -#: ../../include/identity.php:1331
    +#: ../../include/identity.php:1325
     msgid "Film/dance/culture/entertainment:"
     msgstr ""
     
    -#: ../../include/identity.php:1333
    +#: ../../include/identity.php:1327
     msgid "Love/Romance:"
     msgstr ""
     
    -#: ../../include/identity.php:1335
    +#: ../../include/identity.php:1329
     msgid "Work/employment:"
     msgstr ""
     
    -#: ../../include/identity.php:1337
    +#: ../../include/identity.php:1331
     msgid "School/education:"
     msgstr ""
     
    -#: ../../include/identity.php:1357
    +#: ../../include/identity.php:1351
     msgid "Like this thing"
     msgstr ""
     
    @@ -1095,13 +1065,13 @@ msgid "Other networks and post services"
     msgstr ""
     
     #: ../../include/acl_selectors.php:249 ../../mod/filestorage.php:147
    -#: ../../mod/photos.php:631 ../../mod/photos.php:1001 ../../mod/thing.php:310
    -#: ../../mod/thing.php:356 ../../mod/chat.php:211
    +#: ../../mod/thing.php:310 ../../mod/thing.php:356 ../../mod/photos.php:631
    +#: ../../mod/photos.php:998 ../../mod/chat.php:211
     msgid "Permissions"
     msgstr ""
     
     #: ../../include/acl_selectors.php:250 ../../include/ItemObject.php:384
    -#: ../../mod/photos.php:1218
    +#: ../../mod/photos.php:1215
     msgid "Close"
     msgstr ""
     
    @@ -1263,7 +1233,7 @@ msgstr ""
     
     #: ../../include/widgets.php:192 ../../include/text.php:868
     #: ../../include/text.php:880 ../../mod/rbmark.php:28 ../../mod/rbmark.php:100
    -#: ../../mod/admin.php:1442 ../../mod/admin.php:1462 ../../mod/filer.php:49
    +#: ../../mod/admin.php:1449 ../../mod/admin.php:1469 ../../mod/filer.php:49
     msgid "Save"
     msgstr ""
     
    @@ -1356,8 +1326,8 @@ msgid "Channel Sources"
     msgstr ""
     
     #: ../../include/widgets.php:554 ../../include/nav.php:202
    -#: ../../include/apps.php:134 ../../mod/admin.php:1064
    -#: ../../mod/admin.php:1264
    +#: ../../include/apps.php:134 ../../mod/admin.php:1071
    +#: ../../mod/admin.php:1271
     msgid "Settings"
     msgstr ""
     
    @@ -1493,7 +1463,7 @@ msgstr ""
     msgid "For Developers"
     msgstr ""
     
    -#: ../../include/widgets.php:1214 ../../mod/admin.php:434
    +#: ../../include/widgets.php:1214 ../../mod/admin.php:441
     msgid "Site"
     msgstr ""
     
    @@ -1501,17 +1471,17 @@ msgstr ""
     msgid "Accounts"
     msgstr ""
     
    -#: ../../include/widgets.php:1216 ../../mod/admin.php:965
    +#: ../../include/widgets.php:1216 ../../mod/admin.php:972
     msgid "Channels"
     msgstr ""
     
    -#: ../../include/widgets.php:1217 ../../mod/admin.php:1062
    -#: ../../mod/admin.php:1102
    +#: ../../include/widgets.php:1217 ../../mod/admin.php:1069
    +#: ../../mod/admin.php:1109
     msgid "Plugins"
     msgstr ""
     
    -#: ../../include/widgets.php:1218 ../../mod/admin.php:1262
    -#: ../../mod/admin.php:1296
    +#: ../../include/widgets.php:1218 ../../mod/admin.php:1269
    +#: ../../mod/admin.php:1303
     msgid "Themes"
     msgstr ""
     
    @@ -1528,7 +1498,7 @@ msgid "DB updates"
     msgstr ""
     
     #: ../../include/widgets.php:1239 ../../include/widgets.php:1245
    -#: ../../mod/admin.php:1381
    +#: ../../mod/admin.php:1388
     msgid "Logs"
     msgstr ""
     
    @@ -1544,12 +1514,12 @@ msgstr ""
     msgid "User registrations waiting for confirmation"
     msgstr ""
     
    -#: ../../include/widgets.php:1325 ../../mod/photos.php:753
    -#: ../../mod/photos.php:1286
    +#: ../../include/widgets.php:1324 ../../mod/photos.php:748
    +#: ../../mod/photos.php:1283
     msgid "View Photo"
     msgstr ""
     
    -#: ../../include/widgets.php:1341 ../../mod/photos.php:782
    +#: ../../include/widgets.php:1341 ../../mod/photos.php:779
     msgid "Edit Album"
     msgstr ""
     
    @@ -2206,42 +2176,42 @@ msgctxt "mood"
     msgid "%1$s is %2$s"
     msgstr ""
     
    -#: ../../include/conversation.php:574 ../../mod/photos.php:1063
    +#: ../../include/conversation.php:574 ../../mod/photos.php:1060
     msgctxt "title"
     msgid "Likes"
     msgstr ""
     
    -#: ../../include/conversation.php:574 ../../mod/photos.php:1063
    +#: ../../include/conversation.php:574 ../../mod/photos.php:1060
     msgctxt "title"
     msgid "Dislikes"
     msgstr ""
     
    -#: ../../include/conversation.php:575 ../../mod/photos.php:1064
    +#: ../../include/conversation.php:575 ../../mod/photos.php:1061
     msgctxt "title"
     msgid "Agree"
     msgstr ""
     
    -#: ../../include/conversation.php:575 ../../mod/photos.php:1064
    +#: ../../include/conversation.php:575 ../../mod/photos.php:1061
     msgctxt "title"
     msgid "Disagree"
     msgstr ""
     
    -#: ../../include/conversation.php:575 ../../mod/photos.php:1064
    +#: ../../include/conversation.php:575 ../../mod/photos.php:1061
     msgctxt "title"
     msgid "Abstain"
     msgstr ""
     
    -#: ../../include/conversation.php:576 ../../mod/photos.php:1065
    +#: ../../include/conversation.php:576 ../../mod/photos.php:1062
     msgctxt "title"
     msgid "Attending"
     msgstr ""
     
    -#: ../../include/conversation.php:576 ../../mod/photos.php:1065
    +#: ../../include/conversation.php:576 ../../mod/photos.php:1062
     msgctxt "title"
     msgid "Not attending"
     msgstr ""
     
    -#: ../../include/conversation.php:576 ../../mod/photos.php:1065
    +#: ../../include/conversation.php:576 ../../mod/photos.php:1062
     msgctxt "title"
     msgid "Might attend"
     msgstr ""
    @@ -2296,8 +2266,8 @@ msgstr ""
     
     #: ../../include/conversation.php:740 ../../include/conversation.php:1227
     #: ../../include/ItemObject.php:389 ../../mod/editwebpage.php:190
    -#: ../../mod/photos.php:1029 ../../mod/editblock.php:150
    -#: ../../mod/editlayout.php:148 ../../mod/editpost.php:129
    +#: ../../mod/editblock.php:150 ../../mod/editlayout.php:148
    +#: ../../mod/photos.php:1026 ../../mod/editpost.php:129
     msgid "Please wait"
     msgstr ""
     
    @@ -2403,8 +2373,8 @@ msgstr ""
     msgid "Visible to everybody"
     msgstr ""
     
    -#: ../../include/conversation.php:1155 ../../mod/mail.php:194
    -#: ../../mod/mail.php:308
    +#: ../../include/conversation.php:1155 ../../mod/mail.php:202
    +#: ../../mod/mail.php:316
     msgid "Please enter a link URL:"
     msgstr ""
     
    @@ -2429,21 +2399,21 @@ msgid "Where are you right now?"
     msgstr ""
     
     #: ../../include/conversation.php:1161 ../../mod/editpost.php:56
    -#: ../../mod/mail.php:195 ../../mod/mail.php:309
    +#: ../../mod/mail.php:203 ../../mod/mail.php:317
     msgid "Expires YYYY-MM-DD HH:MM"
     msgstr ""
     
     #: ../../include/conversation.php:1169 ../../include/page_widgets.php:40
     #: ../../include/ItemObject.php:706 ../../mod/editwebpage.php:212
    -#: ../../mod/photos.php:1049 ../../mod/editblock.php:171
    -#: ../../mod/webpages.php:188 ../../mod/editpost.php:149
    +#: ../../mod/editblock.php:171 ../../mod/webpages.php:188
    +#: ../../mod/photos.php:1046 ../../mod/editpost.php:149
     #: ../../mod/events.php:458
     msgid "Preview"
     msgstr ""
     
     #: ../../include/conversation.php:1192 ../../mod/blocks.php:154
    -#: ../../mod/photos.php:1028 ../../mod/webpages.php:182
    -#: ../../mod/layouts.php:184
    +#: ../../mod/webpages.php:182 ../../mod/layouts.php:184
    +#: ../../mod/photos.php:1025
     msgid "Share"
     msgstr ""
     
    @@ -2497,7 +2467,7 @@ msgstr ""
     
     #: ../../include/conversation.php:1206 ../../mod/editwebpage.php:183
     #: ../../mod/editblock.php:143 ../../mod/editlayout.php:141
    -#: ../../mod/editpost.php:119 ../../mod/mail.php:240 ../../mod/mail.php:370
    +#: ../../mod/editpost.php:119 ../../mod/mail.php:248 ../../mod/mail.php:378
     msgid "Attach file"
     msgstr ""
     
    @@ -2507,7 +2477,7 @@ msgstr ""
     
     #: ../../include/conversation.php:1208 ../../mod/editwebpage.php:184
     #: ../../mod/editblock.php:144 ../../mod/editlayout.php:142
    -#: ../../mod/editpost.php:120 ../../mod/mail.php:241 ../../mod/mail.php:371
    +#: ../../mod/editpost.php:120 ../../mod/mail.php:249 ../../mod/mail.php:379
     msgid "Insert web link"
     msgstr ""
     
    @@ -2590,7 +2560,7 @@ msgstr ""
     
     #: ../../include/conversation.php:1252 ../../mod/editwebpage.php:217
     #: ../../mod/editblock.php:176 ../../mod/editlayout.php:173
    -#: ../../mod/editpost.php:155 ../../mod/mail.php:245 ../../mod/mail.php:375
    +#: ../../mod/editpost.php:155 ../../mod/mail.php:253 ../../mod/mail.php:383
     msgid "Set expiration date"
     msgstr ""
     
    @@ -2599,7 +2569,7 @@ msgid "Set publish date"
     msgstr ""
     
     #: ../../include/conversation.php:1257 ../../include/ItemObject.php:709
    -#: ../../mod/editpost.php:157 ../../mod/mail.php:247 ../../mod/mail.php:377
    +#: ../../mod/editpost.php:157 ../../mod/mail.php:255 ../../mod/mail.php:385
     msgid "Encrypt text"
     msgstr ""
     
    @@ -2607,8 +2577,8 @@ msgstr ""
     msgid "OK"
     msgstr ""
     
    -#: ../../include/conversation.php:1260 ../../mod/fbrowser.php:82
    -#: ../../mod/fbrowser.php:117 ../../mod/tagrm.php:11 ../../mod/tagrm.php:134
    +#: ../../include/conversation.php:1260 ../../mod/fbrowser.php:77
    +#: ../../mod/fbrowser.php:112 ../../mod/tagrm.php:11 ../../mod/tagrm.php:134
     #: ../../mod/settings.php:587 ../../mod/settings.php:613
     #: ../../mod/editpost.php:160
     msgid "Cancel"
    @@ -2667,7 +2637,7 @@ msgstr ""
     msgid "Posts flagged as SPAM"
     msgstr ""
     
    -#: ../../include/conversation.php:1601 ../../mod/admin.php:973
    +#: ../../include/conversation.php:1601 ../../mod/admin.php:980
     msgid "Channel"
     msgstr ""
     
    @@ -2719,13 +2689,13 @@ msgid "Manage Webpages"
     msgstr ""
     
     #: ../../include/conversation.php:1697 ../../include/ItemObject.php:175
    -#: ../../include/ItemObject.php:187 ../../mod/photos.php:1082
    -#: ../../mod/photos.php:1094
    +#: ../../include/ItemObject.php:187 ../../mod/photos.php:1079
    +#: ../../mod/photos.php:1091
     msgid "View all"
     msgstr ""
     
     #: ../../include/conversation.php:1724 ../../include/ItemObject.php:184
    -#: ../../mod/photos.php:1091
    +#: ../../mod/photos.php:1088
     msgctxt "noun"
     msgid "Dislike"
     msgid_plural "Dislikes"
    @@ -2823,7 +2793,7 @@ msgid "RSS/Atom"
     msgstr ""
     
     #: ../../include/contact_selectors.php:79 ../../mod/id.php:15
    -#: ../../mod/id.php:16 ../../mod/admin.php:805 ../../mod/admin.php:814
    +#: ../../mod/id.php:16 ../../mod/admin.php:812 ../../mod/admin.php:821
     #: ../../boot.php:1483
     msgid "Email"
     msgstr ""
    @@ -2922,7 +2892,7 @@ msgid_plural "%d invitations available"
     msgstr[0] ""
     msgstr[1] ""
     
    -#: ../../include/contact_widgets.php:19 ../../mod/admin.php:439
    +#: ../../include/contact_widgets.php:19 ../../mod/admin.php:446
     msgid "Advanced"
     msgstr ""
     
    @@ -2975,6 +2945,23 @@ msgstr[1] ""
     msgid "show more"
     msgstr ""
     
    +#: ../../include/enotify.php:57 ../../include/network.php:1608
    +msgid "$Projectname Notification"
    +msgstr ""
    +
    +#: ../../include/enotify.php:58 ../../include/network.php:1609
    +msgid "$projectname"
    +msgstr ""
    +
    +#: ../../include/enotify.php:60 ../../include/network.php:1611
    +msgid "Thank You,"
    +msgstr ""
    +
    +#: ../../include/enotify.php:62 ../../include/network.php:1613
    +#, php-format
    +msgid "%s Administrator"
    +msgstr ""
    +
     #: ../../include/enotify.php:96
     #, php-format
     msgid "%s "
    @@ -3169,19 +3156,19 @@ msgstr ""
     msgid "Channel was deleted and no longer exists."
     msgstr ""
     
    -#: ../../include/follow.php:152 ../../include/follow.php:180
    +#: ../../include/follow.php:152 ../../include/follow.php:181
     msgid "Protocol disabled."
     msgstr ""
     
    -#: ../../include/follow.php:170
    +#: ../../include/follow.php:171
     msgid "Channel discovery failed."
     msgstr ""
     
    -#: ../../include/follow.php:196
    +#: ../../include/follow.php:197
     msgid "local account not found."
     msgstr ""
     
    -#: ../../include/follow.php:220
    +#: ../../include/follow.php:221
     msgid "Cannot connect to yourself."
     msgstr ""
     
    @@ -3687,7 +3674,7 @@ msgstr ""
     #: ../../include/dir_fns.php:143 ../../mod/filestorage.php:151
     #: ../../mod/filestorage.php:159 ../../mod/removeme.php:60
     #: ../../mod/connedit.php:635 ../../mod/connedit.php:684 ../../mod/api.php:106
    -#: ../../mod/photos.php:626 ../../mod/admin.php:410 ../../mod/settings.php:577
    +#: ../../mod/admin.php:410 ../../mod/settings.php:577 ../../mod/photos.php:626
     #: ../../mod/menu.php:96 ../../mod/menu.php:153 ../../mod/events.php:447
     #: ../../mod/events.php:448 ../../mod/events.php:457 ../../mod/mitem.php:154
     #: ../../mod/mitem.php:155 ../../mod/mitem.php:228 ../../mod/mitem.php:229
    @@ -3699,8 +3686,8 @@ msgstr ""
     #: ../../include/dir_fns.php:141 ../../include/dir_fns.php:142
     #: ../../include/dir_fns.php:143 ../../mod/filestorage.php:151
     #: ../../mod/filestorage.php:159 ../../mod/removeme.php:60
    -#: ../../mod/api.php:105 ../../mod/photos.php:626 ../../mod/admin.php:412
    -#: ../../mod/settings.php:577 ../../mod/menu.php:96 ../../mod/menu.php:153
    +#: ../../mod/api.php:105 ../../mod/admin.php:412 ../../mod/settings.php:577
    +#: ../../mod/photos.php:626 ../../mod/menu.php:96 ../../mod/menu.php:153
     #: ../../mod/events.php:447 ../../mod/events.php:448 ../../mod/events.php:457
     #: ../../mod/mitem.php:154 ../../mod/mitem.php:155 ../../mod/mitem.php:228
     #: ../../mod/mitem.php:229 ../../view/theme/redbasic/php/config.php:104
    @@ -3727,7 +3714,7 @@ msgstr ""
     msgid "Add new connections to this collection (privacy group)"
     msgstr ""
     
    -#: ../../include/group.php:251 ../../mod/admin.php:814
    +#: ../../include/group.php:251 ../../mod/admin.php:821
     msgid "All Channels"
     msgstr ""
     
    @@ -3759,12 +3746,12 @@ msgstr ""
     msgid "Unable to verify channel signature"
     msgstr ""
     
    -#: ../../include/zot.php:2259
    +#: ../../include/zot.php:2275
     #, php-format
     msgid "Unable to verify site signature for %s"
     msgstr ""
     
    -#: ../../include/zot.php:3586
    +#: ../../include/zot.php:3601
     msgid "invalid target signature"
     msgstr ""
     
    @@ -3799,6 +3786,19 @@ msgstr ""
     msgid "Edited"
     msgstr ""
     
    +#: ../../include/network.php:630
    +msgid "view full size"
    +msgstr ""
    +
    +#: ../../include/network.php:1655 ../../include/account.php:316
    +#: ../../include/account.php:343 ../../include/account.php:403
    +msgid "Administrator"
    +msgstr ""
    +
    +#: ../../include/network.php:1669
    +msgid "No Subject"
    +msgstr ""
    +
     #: ../../include/dba/dba_driver.php:141
     #, php-format
     msgid "Cannot locate DNS info for database server '%s'"
    @@ -3873,11 +3873,11 @@ msgstr ""
     msgid "Add Tag"
     msgstr ""
     
    -#: ../../include/ItemObject.php:254 ../../mod/photos.php:1026
    +#: ../../include/ItemObject.php:254 ../../mod/photos.php:1023
     msgid "I like this (toggle)"
     msgstr ""
     
    -#: ../../include/ItemObject.php:255 ../../mod/photos.php:1027
    +#: ../../include/ItemObject.php:255 ../../mod/photos.php:1024
     msgid "I don't like this (toggle)"
     msgstr ""
     
    @@ -3933,18 +3933,18 @@ msgstr ""
     msgid "Mark all seen"
     msgstr ""
     
    -#: ../../include/ItemObject.php:378 ../../mod/photos.php:1212
    +#: ../../include/ItemObject.php:378 ../../mod/photos.php:1209
     msgctxt "noun"
     msgid "Likes"
     msgstr ""
     
    -#: ../../include/ItemObject.php:379 ../../mod/photos.php:1213
    +#: ../../include/ItemObject.php:379 ../../mod/photos.php:1210
     msgctxt "noun"
     msgid "Dislikes"
     msgstr ""
     
    -#: ../../include/ItemObject.php:694 ../../mod/photos.php:1045
    -#: ../../mod/photos.php:1163
    +#: ../../include/ItemObject.php:694 ../../mod/photos.php:1042
    +#: ../../mod/photos.php:1160
     msgid "This is you"
     msgstr ""
     
    @@ -3960,78 +3960,6 @@ msgstr ""
     msgid "Video"
     msgstr ""
     
    -#: ../../include/account.php:27
    -msgid "Not a valid email address"
    -msgstr ""
    -
    -#: ../../include/account.php:29
    -msgid "Your email domain is not among those allowed on this site"
    -msgstr ""
    -
    -#: ../../include/account.php:35
    -msgid "Your email address is already registered at this site."
    -msgstr ""
    -
    -#: ../../include/account.php:67
    -msgid "An invitation is required."
    -msgstr ""
    -
    -#: ../../include/account.php:71
    -msgid "Invitation could not be verified."
    -msgstr ""
    -
    -#: ../../include/account.php:121
    -msgid "Please enter the required information."
    -msgstr ""
    -
    -#: ../../include/account.php:188
    -msgid "Failed to store account information."
    -msgstr ""
    -
    -#: ../../include/account.php:248
    -#, php-format
    -msgid "Registration confirmation for %s"
    -msgstr ""
    -
    -#: ../../include/account.php:314
    -#, php-format
    -msgid "Registration request at %s"
    -msgstr ""
    -
    -#: ../../include/account.php:338
    -msgid "your registration password"
    -msgstr ""
    -
    -#: ../../include/account.php:341 ../../include/account.php:401
    -#, php-format
    -msgid "Registration details for %s"
    -msgstr ""
    -
    -#: ../../include/account.php:410
    -msgid "Account approved."
    -msgstr ""
    -
    -#: ../../include/account.php:449
    -#, php-format
    -msgid "Registration revoked for %s"
    -msgstr ""
    -
    -#: ../../include/account.php:494
    -msgid "Account verified. Please login."
    -msgstr ""
    -
    -#: ../../include/account.php:707 ../../include/account.php:709
    -msgid "Click here to upgrade."
    -msgstr ""
    -
    -#: ../../include/account.php:715
    -msgid "This action exceeds the limits set by your subscription plan."
    -msgstr ""
    -
    -#: ../../include/account.php:720
    -msgid "This action is not available under your subscription plan."
    -msgstr ""
    -
     #: ../../include/apps.php:128
     msgid "Site Admin"
     msgstr ""
    @@ -4212,12 +4140,84 @@ msgstr ""
     msgid "Custom/Expert Mode"
     msgstr ""
     
    -#: ../../include/photo/photo_driver.php:719 ../../mod/photos.php:94
    -#: ../../mod/photos.php:699 ../../mod/profile_photo.php:147
    +#: ../../include/photo/photo_driver.php:719 ../../mod/profile_photo.php:147
     #: ../../mod/profile_photo.php:239 ../../mod/profile_photo.php:379
    +#: ../../mod/photos.php:94 ../../mod/photos.php:699
     msgid "Profile Photos"
     msgstr ""
     
    +#: ../../include/account.php:27
    +msgid "Not a valid email address"
    +msgstr ""
    +
    +#: ../../include/account.php:29
    +msgid "Your email domain is not among those allowed on this site"
    +msgstr ""
    +
    +#: ../../include/account.php:35
    +msgid "Your email address is already registered at this site."
    +msgstr ""
    +
    +#: ../../include/account.php:67
    +msgid "An invitation is required."
    +msgstr ""
    +
    +#: ../../include/account.php:71
    +msgid "Invitation could not be verified."
    +msgstr ""
    +
    +#: ../../include/account.php:121
    +msgid "Please enter the required information."
    +msgstr ""
    +
    +#: ../../include/account.php:188
    +msgid "Failed to store account information."
    +msgstr ""
    +
    +#: ../../include/account.php:248
    +#, php-format
    +msgid "Registration confirmation for %s"
    +msgstr ""
    +
    +#: ../../include/account.php:314
    +#, php-format
    +msgid "Registration request at %s"
    +msgstr ""
    +
    +#: ../../include/account.php:338
    +msgid "your registration password"
    +msgstr ""
    +
    +#: ../../include/account.php:341 ../../include/account.php:401
    +#, php-format
    +msgid "Registration details for %s"
    +msgstr ""
    +
    +#: ../../include/account.php:410
    +msgid "Account approved."
    +msgstr ""
    +
    +#: ../../include/account.php:449
    +#, php-format
    +msgid "Registration revoked for %s"
    +msgstr ""
    +
    +#: ../../include/account.php:494
    +msgid "Account verified. Please login."
    +msgstr ""
    +
    +#: ../../include/account.php:707 ../../include/account.php:709
    +msgid "Click here to upgrade."
    +msgstr ""
    +
    +#: ../../include/account.php:715
    +msgid "This action exceeds the limits set by your subscription plan."
    +msgstr ""
    +
    +#: ../../include/account.php:720
    +msgid "This action is not available under your subscription plan."
    +msgstr ""
    +
     #: ../../mod/filestorage.php:82
     msgid "Permission Denied."
     msgstr ""
    @@ -4419,7 +4419,8 @@ msgstr ""
     msgid "OpenID protocol error. No ID returned."
     msgstr ""
     
    -#: ../../mod/openid.php:72 ../../mod/openid.php:179 ../../mod/post.php:285
    +#: ../../mod/openid.php:72 ../../mod/openid.php:179
    +#: ../../Zotlabs/Zot/Auth.php:248
     #, php-format
     msgid "Welcome %s. Remote authentication successful."
     msgstr ""
    @@ -4828,7 +4829,7 @@ msgstr ""
     msgid "System check"
     msgstr ""
     
    -#: ../../mod/setup.php:285 ../../mod/photos.php:914 ../../mod/events.php:653
    +#: ../../mod/setup.php:285 ../../mod/photos.php:911 ../../mod/events.php:653
     #: ../../mod/events.php:660
     msgid "Next"
     msgstr ""
    @@ -5215,15 +5216,6 @@ msgstr ""
     msgid "My Connections Bookmarks"
     msgstr ""
     
    -#: ../../mod/home.php:57 ../../mod/home.php:65 ../../mod/siteinfo.php:61
    -msgid "$Projectname"
    -msgstr ""
    -
    -#: ../../mod/home.php:75
    -#, php-format
    -msgid "Welcome to %s"
    -msgstr ""
    -
     #: ../../mod/pconfig.php:27 ../../mod/pconfig.php:60
     msgid "This setting requires special processing and editing has been blocked."
     msgstr ""
    @@ -5328,7 +5320,7 @@ msgstr ""
     msgid "Interests"
     msgstr ""
     
    -#: ../../mod/profiles.php:457 ../../mod/admin.php:974
    +#: ../../mod/profiles.php:457 ../../mod/admin.php:981
     msgid "Address"
     msgstr ""
     
    @@ -5581,11 +5573,11 @@ msgstr ""
     msgid "View recent posts and comments"
     msgstr ""
     
    -#: ../../mod/connedit.php:519 ../../mod/admin.php:811
    +#: ../../mod/connedit.php:519 ../../mod/admin.php:818
     msgid "Unblock"
     msgstr ""
     
    -#: ../../mod/connedit.php:519 ../../mod/admin.php:810
    +#: ../../mod/connedit.php:519 ../../mod/admin.php:817
     msgid "Block"
     msgstr ""
     
    @@ -5741,7 +5733,7 @@ msgid ""
     "communication."
     msgstr ""
     
    -#: ../../mod/connedit.php:710 ../../mod/admin.php:807
    +#: ../../mod/connedit.php:710 ../../mod/admin.php:814
     msgid "Approve"
     msgstr ""
     
    @@ -6054,7 +6046,7 @@ msgstr ""
     msgid "Select a tag to remove: "
     msgstr ""
     
    -#: ../../mod/tagrm.php:133 ../../mod/photos.php:954
    +#: ../../mod/tagrm.php:133 ../../mod/photos.php:951
     msgid "Remove"
     msgstr ""
     
    @@ -6322,155 +6314,73 @@ msgid ""
     "only once and leave this page open until finished."
     msgstr ""
     
    -#: ../../mod/photos.php:79
    -msgid "Page owner information could not be retrieved."
    -msgstr ""
    -
    -#: ../../mod/photos.php:100
    -msgid "Album not found."
    -msgstr ""
    -
    -#: ../../mod/photos.php:127
    -msgid "Delete Album"
    +#: ../../mod/invite.php:25
    +msgid "Total invitation limit exceeded."
     msgstr ""
     
    -#: ../../mod/photos.php:171 ../../mod/photos.php:1009
    -msgid "Delete Photo"
    +#: ../../mod/invite.php:49
    +#, php-format
    +msgid "%s : Not a valid email address."
     msgstr ""
     
    -#: ../../mod/photos.php:501
    -msgid "No photos selected"
    +#: ../../mod/invite.php:59
    +msgid "Please join us on $Projectname"
     msgstr ""
     
    -#: ../../mod/photos.php:550
    -msgid "Access to this item is restricted."
    +#: ../../mod/invite.php:70
    +msgid "Invitation limit exceeded. Please contact your site administrator."
     msgstr ""
     
    -#: ../../mod/photos.php:589
    +#: ../../mod/invite.php:75
     #, php-format
    -msgid "%1$.2f MB of %2$.2f MB photo storage used."
    +msgid "%s : Message delivery failed."
     msgstr ""
     
    -#: ../../mod/photos.php:592
    +#: ../../mod/invite.php:79
     #, php-format
    -msgid "%1$.2f MB photo storage used."
    -msgstr ""
    +msgid "%d message sent."
    +msgid_plural "%d messages sent."
    +msgstr[0] ""
    +msgstr[1] ""
     
    -#: ../../mod/photos.php:620
    -msgid "Upload Photos"
    +#: ../../mod/invite.php:98
    +msgid "You have no more invitations available"
     msgstr ""
     
    -#: ../../mod/photos.php:624
    -msgid "Enter an album name"
    -msgstr ""
    -
    -#: ../../mod/photos.php:625
    -msgid "or select an existing album (doubleclick)"
    -msgstr ""
    -
    -#: ../../mod/photos.php:626
    -msgid "Create a status post for this upload"
    -msgstr ""
    -
    -#: ../../mod/photos.php:627
    -msgid "Caption (optional):"
    -msgstr ""
    -
    -#: ../../mod/photos.php:628
    -msgid "Description (optional):"
    -msgstr ""
    -
    -#: ../../mod/photos.php:655
    -msgid "Album name could not be decoded"
    -msgstr ""
    -
    -#: ../../mod/photos.php:699 ../../mod/photos.php:1236
    -#: ../../mod/photos.php:1253
    -msgid "Contact Photos"
    -msgstr ""
    -
    -#: ../../mod/photos.php:727
    -msgid "Show Newest First"
    -msgstr ""
    -
    -#: ../../mod/photos.php:729
    -msgid "Show Oldest First"
    -msgstr ""
    -
    -#: ../../mod/photos.php:827
    -msgid "Permission denied. Access to this item may be restricted."
    -msgstr ""
    -
    -#: ../../mod/photos.php:829
    -msgid "Photo not available"
    -msgstr ""
    -
    -#: ../../mod/photos.php:887
    -msgid "Use as profile photo"
    -msgstr ""
    -
    -#: ../../mod/photos.php:894
    -msgid "Private Photo"
    -msgstr ""
    -
    -#: ../../mod/photos.php:905 ../../mod/events.php:652 ../../mod/events.php:659
    -msgid "Previous"
    -msgstr ""
    -
    -#: ../../mod/photos.php:909
    -msgid "View Full Size"
    -msgstr ""
    -
    -#: ../../mod/photos.php:988
    -msgid "Edit photo"
    -msgstr ""
    -
    -#: ../../mod/photos.php:990
    -msgid "Rotate CW (right)"
    -msgstr ""
    -
    -#: ../../mod/photos.php:991
    -msgid "Rotate CCW (left)"
    -msgstr ""
    -
    -#: ../../mod/photos.php:994
    -msgid "Enter a new album name"
    -msgstr ""
    -
    -#: ../../mod/photos.php:995
    -msgid "or select an existing one (doubleclick)"
    +#: ../../mod/invite.php:129
    +msgid "Send invitations"
     msgstr ""
     
    -#: ../../mod/photos.php:998
    -msgid "Caption"
    +#: ../../mod/invite.php:130
    +msgid "Enter email addresses, one per line:"
     msgstr ""
     
    -#: ../../mod/photos.php:1000
    -msgid "Add a Tag"
    +#: ../../mod/invite.php:131 ../../mod/mail.php:246
    +msgid "Your message:"
     msgstr ""
     
    -#: ../../mod/photos.php:1004
    -msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
    +#: ../../mod/invite.php:132
    +msgid "Please join my community on $Projectname."
     msgstr ""
     
    -#: ../../mod/photos.php:1007
    -msgid "Flag as adult in album view"
    +#: ../../mod/invite.php:134
    +msgid "You will need to supply this invitation code: "
     msgstr ""
     
    -#: ../../mod/photos.php:1199
    -msgid "In This Photo:"
    +#: ../../mod/invite.php:135
    +msgid "1. Register at any $Projectname location (they are all inter-connected)"
     msgstr ""
     
    -#: ../../mod/photos.php:1204
    -msgid "Map"
    +#: ../../mod/invite.php:137
    +msgid "2. Enter my $Projectname network address into the site searchbar."
     msgstr ""
     
    -#: ../../mod/photos.php:1292
    -msgid "View Album"
    +#: ../../mod/invite.php:138
    +msgid "or visit "
     msgstr ""
     
    -#: ../../mod/photos.php:1315
    -msgid "Recent Photos"
    +#: ../../mod/invite.php:140
    +msgid "3. Click [Connect]"
     msgstr ""
     
     #: ../../mod/probe.php:24 ../../mod/probe.php:30
    @@ -6782,7 +6692,7 @@ msgstr ""
     msgid "I am over 13 years of age and accept the %s for this website"
     msgstr ""
     
    -#: ../../mod/register.php:207 ../../mod/admin.php:436
    +#: ../../mod/register.php:207 ../../mod/admin.php:443
     msgid "Registration"
     msgstr ""
     
    @@ -6842,10 +6752,10 @@ msgstr ""
     msgid "Message queues"
     msgstr ""
     
    -#: ../../mod/admin.php:198 ../../mod/admin.php:433 ../../mod/admin.php:532
    -#: ../../mod/admin.php:800 ../../mod/admin.php:964 ../../mod/admin.php:1061
    -#: ../../mod/admin.php:1101 ../../mod/admin.php:1261 ../../mod/admin.php:1295
    -#: ../../mod/admin.php:1380
    +#: ../../mod/admin.php:198 ../../mod/admin.php:440 ../../mod/admin.php:539
    +#: ../../mod/admin.php:807 ../../mod/admin.php:971 ../../mod/admin.php:1068
    +#: ../../mod/admin.php:1108 ../../mod/admin.php:1268 ../../mod/admin.php:1302
    +#: ../../mod/admin.php:1387
     msgid "Administration"
     msgstr ""
     
    @@ -6857,7 +6767,7 @@ msgstr ""
     msgid "Registered accounts"
     msgstr ""
     
    -#: ../../mod/admin.php:203 ../../mod/admin.php:536
    +#: ../../mod/admin.php:203 ../../mod/admin.php:543
     msgid "Pending registrations"
     msgstr ""
     
    @@ -6865,7 +6775,7 @@ msgstr ""
     msgid "Registered channels"
     msgstr ""
     
    -#: ../../mod/admin.php:205 ../../mod/admin.php:537
    +#: ../../mod/admin.php:205 ../../mod/admin.php:544
     msgid "Active plugins"
     msgstr ""
     
    @@ -6909,638 +6819,638 @@ msgstr ""
     msgid "My site offers free accounts with optional paid upgrades"
     msgstr ""
     
    -#: ../../mod/admin.php:437
    +#: ../../mod/admin.php:444
     msgid "File upload"
     msgstr ""
     
    -#: ../../mod/admin.php:438
    +#: ../../mod/admin.php:445
     msgid "Policies"
     msgstr ""
     
    -#: ../../mod/admin.php:443
    +#: ../../mod/admin.php:450
     msgid "Site name"
     msgstr ""
     
    -#: ../../mod/admin.php:444
    +#: ../../mod/admin.php:451
     msgid "Banner/Logo"
     msgstr ""
     
    -#: ../../mod/admin.php:445
    +#: ../../mod/admin.php:452
     msgid "Administrator Information"
     msgstr ""
     
    -#: ../../mod/admin.php:445
    +#: ../../mod/admin.php:452
     msgid ""
     "Contact information for site administrators.  Displayed on siteinfo page.  "
     "BBCode can be used here"
     msgstr ""
     
    -#: ../../mod/admin.php:446
    +#: ../../mod/admin.php:453
     msgid "System language"
     msgstr ""
     
    -#: ../../mod/admin.php:447
    +#: ../../mod/admin.php:454
     msgid "System theme"
     msgstr ""
     
    -#: ../../mod/admin.php:447
    +#: ../../mod/admin.php:454
     msgid ""
     "Default system theme - may be over-ridden by user profiles - change theme settings"
     msgstr ""
     
    -#: ../../mod/admin.php:448
    +#: ../../mod/admin.php:455
     msgid "Mobile system theme"
     msgstr ""
     
    -#: ../../mod/admin.php:448
    +#: ../../mod/admin.php:455
     msgid "Theme for mobile devices"
     msgstr ""
     
    -#: ../../mod/admin.php:450
    +#: ../../mod/admin.php:457
     msgid "Allow Feeds as Connections"
     msgstr ""
     
    -#: ../../mod/admin.php:450
    +#: ../../mod/admin.php:457
     msgid "(Heavy system resource usage)"
     msgstr ""
     
    -#: ../../mod/admin.php:451
    +#: ../../mod/admin.php:458
     msgid "Maximum image size"
     msgstr ""
     
    -#: ../../mod/admin.php:451
    +#: ../../mod/admin.php:458
     msgid ""
     "Maximum size in bytes of uploaded images. Default is 0, which means no "
     "limits."
     msgstr ""
     
    -#: ../../mod/admin.php:452
    +#: ../../mod/admin.php:459
     msgid "Does this site allow new member registration?"
     msgstr ""
     
    -#: ../../mod/admin.php:453
    +#: ../../mod/admin.php:460
     msgid "Which best describes the types of account offered by this hub?"
     msgstr ""
     
    -#: ../../mod/admin.php:454
    +#: ../../mod/admin.php:461
     msgid "Register text"
     msgstr ""
     
    -#: ../../mod/admin.php:454
    +#: ../../mod/admin.php:461
     msgid "Will be displayed prominently on the registration page."
     msgstr ""
     
    -#: ../../mod/admin.php:455
    +#: ../../mod/admin.php:462
     msgid "Site homepage to show visitors (default: login box)"
     msgstr ""
     
    -#: ../../mod/admin.php:455
    +#: ../../mod/admin.php:462
     msgid ""
     "example: 'public' to show public stream, 'page/sys/home' to show a system "
     "webpage called 'home' or 'include:home.html' to include a file."
     msgstr ""
     
    -#: ../../mod/admin.php:456
    +#: ../../mod/admin.php:463
     msgid "Preserve site homepage URL"
     msgstr ""
     
    -#: ../../mod/admin.php:456
    +#: ../../mod/admin.php:463
     msgid ""
     "Present the site homepage in a frame at the original location instead of "
     "redirecting"
     msgstr ""
     
    -#: ../../mod/admin.php:457
    +#: ../../mod/admin.php:464
     msgid "Accounts abandoned after x days"
     msgstr ""
     
    -#: ../../mod/admin.php:457
    +#: ../../mod/admin.php:464
     msgid ""
     "Will not waste system resources polling external sites for abandonded "
     "accounts. Enter 0 for no time limit."
     msgstr ""
     
    -#: ../../mod/admin.php:458
    +#: ../../mod/admin.php:465
     msgid "Allowed friend domains"
     msgstr ""
     
    -#: ../../mod/admin.php:458
    +#: ../../mod/admin.php:465
     msgid ""
     "Comma separated list of domains which are allowed to establish friendships "
     "with this site. Wildcards are accepted. Empty to allow any domains"
     msgstr ""
     
    -#: ../../mod/admin.php:459
    +#: ../../mod/admin.php:466
     msgid "Allowed email domains"
     msgstr ""
     
    -#: ../../mod/admin.php:459
    +#: ../../mod/admin.php:466
     msgid ""
     "Comma separated list of domains which are allowed in email addresses for "
     "registrations to this site. Wildcards are accepted. Empty to allow any "
     "domains"
     msgstr ""
     
    -#: ../../mod/admin.php:460
    +#: ../../mod/admin.php:467
     msgid "Not allowed email domains"
     msgstr ""
     
    -#: ../../mod/admin.php:460
    +#: ../../mod/admin.php:467
     msgid ""
     "Comma separated list of domains which are not allowed in email addresses for "
     "registrations to this site. Wildcards are accepted. Empty to allow any "
     "domains, unless allowed domains have been defined."
     msgstr ""
     
    -#: ../../mod/admin.php:461
    +#: ../../mod/admin.php:468
     msgid "Block public"
     msgstr ""
     
    -#: ../../mod/admin.php:461
    +#: ../../mod/admin.php:468
     msgid ""
     "Check to block public access to all otherwise public personal pages on this "
     "site unless you are currently logged in."
     msgstr ""
     
    -#: ../../mod/admin.php:462
    +#: ../../mod/admin.php:469
     msgid "Verify Email Addresses"
     msgstr ""
     
    -#: ../../mod/admin.php:462
    +#: ../../mod/admin.php:469
     msgid ""
     "Check to verify email addresses used in account registration (recommended)."
     msgstr ""
     
    -#: ../../mod/admin.php:463
    +#: ../../mod/admin.php:470
     msgid "Force publish"
     msgstr ""
     
    -#: ../../mod/admin.php:463
    +#: ../../mod/admin.php:470
     msgid ""
     "Check to force all profiles on this site to be listed in the site directory."
     msgstr ""
     
    -#: ../../mod/admin.php:464
    -msgid "Disable discovery tab"
    +#: ../../mod/admin.php:471
    +msgid "Import Public Streams"
     msgstr ""
     
    -#: ../../mod/admin.php:464
    +#: ../../mod/admin.php:471
     msgid ""
    -"Remove the tab in the network view with public content pulled from sources "
    -"chosen for this site."
    +"Import and allow access to public content pulled from other sites. Warning: "
    +"this content is unmoderated."
     msgstr ""
     
    -#: ../../mod/admin.php:465
    +#: ../../mod/admin.php:472
     msgid "login on Homepage"
     msgstr ""
     
    -#: ../../mod/admin.php:465
    +#: ../../mod/admin.php:472
     msgid ""
     "Present a login box to visitors on the home page if no other content has "
     "been configured."
     msgstr ""
     
    -#: ../../mod/admin.php:467
    +#: ../../mod/admin.php:474
     msgid "Directory Server URL"
     msgstr ""
     
    -#: ../../mod/admin.php:467
    +#: ../../mod/admin.php:474
     msgid "Default directory server"
     msgstr ""
     
    -#: ../../mod/admin.php:469
    +#: ../../mod/admin.php:476
     msgid "Proxy user"
     msgstr ""
     
    -#: ../../mod/admin.php:470
    +#: ../../mod/admin.php:477
     msgid "Proxy URL"
     msgstr ""
     
    -#: ../../mod/admin.php:471
    +#: ../../mod/admin.php:478
     msgid "Network timeout"
     msgstr ""
     
    -#: ../../mod/admin.php:471
    +#: ../../mod/admin.php:478
     msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
     msgstr ""
     
    -#: ../../mod/admin.php:472
    +#: ../../mod/admin.php:479
     msgid "Delivery interval"
     msgstr ""
     
    -#: ../../mod/admin.php:472
    +#: ../../mod/admin.php:479
     msgid ""
     "Delay background delivery processes by this many seconds to reduce system "
     "load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
     "for large dedicated servers."
     msgstr ""
     
    -#: ../../mod/admin.php:473
    +#: ../../mod/admin.php:480
     msgid "Deliveries per process"
     msgstr ""
     
    -#: ../../mod/admin.php:473
    +#: ../../mod/admin.php:480
     msgid ""
     "Number of deliveries to attempt in a single operating system process. Adjust "
     "if necessary to tune system performance. Recommend: 1-5."
     msgstr ""
     
    -#: ../../mod/admin.php:474
    +#: ../../mod/admin.php:481
     msgid "Poll interval"
     msgstr ""
     
    -#: ../../mod/admin.php:474
    +#: ../../mod/admin.php:481
     msgid ""
     "Delay background polling processes by this many seconds to reduce system "
     "load. If 0, use delivery interval."
     msgstr ""
     
    -#: ../../mod/admin.php:475
    +#: ../../mod/admin.php:482
     msgid "Maximum Load Average"
     msgstr ""
     
    -#: ../../mod/admin.php:475
    +#: ../../mod/admin.php:482
     msgid ""
     "Maximum system load before delivery and poll processes are deferred - "
     "default 50."
     msgstr ""
     
    -#: ../../mod/admin.php:476
    +#: ../../mod/admin.php:483
     msgid "Expiration period in days for imported (matrix/network) content"
     msgstr ""
     
    -#: ../../mod/admin.php:476
    +#: ../../mod/admin.php:483
     msgid "0 for no expiration of imported content"
     msgstr ""
     
    -#: ../../mod/admin.php:524
    +#: ../../mod/admin.php:531
     msgid "No server found"
     msgstr ""
     
    -#: ../../mod/admin.php:531 ../../mod/admin.php:814
    +#: ../../mod/admin.php:538 ../../mod/admin.php:821
     msgid "ID"
     msgstr ""
     
    -#: ../../mod/admin.php:531
    +#: ../../mod/admin.php:538
     msgid "for channel"
     msgstr ""
     
    -#: ../../mod/admin.php:531
    +#: ../../mod/admin.php:538
     msgid "on server"
     msgstr ""
     
    -#: ../../mod/admin.php:531
    +#: ../../mod/admin.php:538
     msgid "Status"
     msgstr ""
     
    -#: ../../mod/admin.php:533
    +#: ../../mod/admin.php:540
     msgid "Server"
     msgstr ""
     
    -#: ../../mod/admin.php:550
    +#: ../../mod/admin.php:557
     msgid "Update has been marked successful"
     msgstr ""
     
    -#: ../../mod/admin.php:560
    +#: ../../mod/admin.php:567
     #, php-format
     msgid "Executing %s failed. Check system logs."
     msgstr ""
     
    -#: ../../mod/admin.php:563
    +#: ../../mod/admin.php:570
     #, php-format
     msgid "Update %s was successfully applied."
     msgstr ""
     
    -#: ../../mod/admin.php:567
    +#: ../../mod/admin.php:574
     #, php-format
     msgid "Update %s did not return a status. Unknown if it succeeded."
     msgstr ""
     
    -#: ../../mod/admin.php:570
    +#: ../../mod/admin.php:577
     #, php-format
     msgid "Update function %s could not be found."
     msgstr ""
     
    -#: ../../mod/admin.php:586
    +#: ../../mod/admin.php:593
     msgid "No failed updates."
     msgstr ""
     
    -#: ../../mod/admin.php:590
    +#: ../../mod/admin.php:597
     msgid "Failed Updates"
     msgstr ""
     
    -#: ../../mod/admin.php:592
    +#: ../../mod/admin.php:599
     msgid "Mark success (if update was manually applied)"
     msgstr ""
     
    -#: ../../mod/admin.php:593
    +#: ../../mod/admin.php:600
     msgid "Attempt to execute this update step automatically"
     msgstr ""
     
    -#: ../../mod/admin.php:625
    +#: ../../mod/admin.php:632
     msgid "Queue Statistics"
     msgstr ""
     
    -#: ../../mod/admin.php:626
    +#: ../../mod/admin.php:633
     msgid "Total Entries"
     msgstr ""
     
    -#: ../../mod/admin.php:627
    +#: ../../mod/admin.php:634
     msgid "Priority"
     msgstr ""
     
    -#: ../../mod/admin.php:628
    +#: ../../mod/admin.php:635
     msgid "Destination URL"
     msgstr ""
     
    -#: ../../mod/admin.php:629
    +#: ../../mod/admin.php:636
     msgid "Mark hub permanently offline"
     msgstr ""
     
    -#: ../../mod/admin.php:630
    +#: ../../mod/admin.php:637
     msgid "Empty queue for this hub"
     msgstr ""
     
    -#: ../../mod/admin.php:631
    +#: ../../mod/admin.php:638
     msgid "Last known contact"
     msgstr ""
     
    -#: ../../mod/admin.php:667
    +#: ../../mod/admin.php:674
     #, php-format
     msgid "%s account blocked/unblocked"
     msgid_plural "%s account blocked/unblocked"
     msgstr[0] ""
     msgstr[1] ""
     
    -#: ../../mod/admin.php:675
    +#: ../../mod/admin.php:682
     #, php-format
     msgid "%s account deleted"
     msgid_plural "%s accounts deleted"
     msgstr[0] ""
     msgstr[1] ""
     
    -#: ../../mod/admin.php:711
    +#: ../../mod/admin.php:718
     msgid "Account not found"
     msgstr ""
     
    -#: ../../mod/admin.php:723
    +#: ../../mod/admin.php:730
     #, php-format
     msgid "Account '%s' deleted"
     msgstr ""
     
    -#: ../../mod/admin.php:731
    +#: ../../mod/admin.php:738
     #, php-format
     msgid "Account '%s' blocked"
     msgstr ""
     
    -#: ../../mod/admin.php:739
    +#: ../../mod/admin.php:746
     #, php-format
     msgid "Account '%s' unblocked"
     msgstr ""
     
    -#: ../../mod/admin.php:801 ../../mod/admin.php:813
    +#: ../../mod/admin.php:808 ../../mod/admin.php:820
     msgid "Users"
     msgstr ""
     
    -#: ../../mod/admin.php:803 ../../mod/admin.php:967
    +#: ../../mod/admin.php:810 ../../mod/admin.php:974
     msgid "select all"
     msgstr ""
     
    -#: ../../mod/admin.php:804
    +#: ../../mod/admin.php:811
     msgid "User registrations waiting for confirm"
     msgstr ""
     
    -#: ../../mod/admin.php:805
    +#: ../../mod/admin.php:812
     msgid "Request date"
     msgstr ""
     
    -#: ../../mod/admin.php:806
    +#: ../../mod/admin.php:813
     msgid "No registrations."
     msgstr ""
     
    -#: ../../mod/admin.php:808
    +#: ../../mod/admin.php:815
     msgid "Deny"
     msgstr ""
     
    -#: ../../mod/admin.php:814
    +#: ../../mod/admin.php:821
     msgid "Register date"
     msgstr ""
     
    -#: ../../mod/admin.php:814
    +#: ../../mod/admin.php:821
     msgid "Last login"
     msgstr ""
     
    -#: ../../mod/admin.php:814
    +#: ../../mod/admin.php:821
     msgid "Expires"
     msgstr ""
     
    -#: ../../mod/admin.php:814
    +#: ../../mod/admin.php:821
     msgid "Service Class"
     msgstr ""
     
    -#: ../../mod/admin.php:816
    +#: ../../mod/admin.php:823
     msgid ""
     "Selected accounts will be deleted!\\n\\nEverything these accounts had posted "
     "on this site will be permanently deleted!\\n\\nAre you sure?"
     msgstr ""
     
    -#: ../../mod/admin.php:817
    +#: ../../mod/admin.php:824
     msgid ""
     "The account {0} will be deleted!\\n\\nEverything this account has posted on "
     "this site will be permanently deleted!\\n\\nAre you sure?"
     msgstr ""
     
    -#: ../../mod/admin.php:853
    +#: ../../mod/admin.php:860
     #, php-format
     msgid "%s channel censored/uncensored"
     msgid_plural "%s channels censored/uncensored"
     msgstr[0] ""
     msgstr[1] ""
     
    -#: ../../mod/admin.php:862
    +#: ../../mod/admin.php:869
     #, php-format
     msgid "%s channel code allowed/disallowed"
     msgid_plural "%s channels code allowed/disallowed"
     msgstr[0] ""
     msgstr[1] ""
     
    -#: ../../mod/admin.php:869
    +#: ../../mod/admin.php:876
     #, php-format
     msgid "%s channel deleted"
     msgid_plural "%s channels deleted"
     msgstr[0] ""
     msgstr[1] ""
     
    -#: ../../mod/admin.php:889
    +#: ../../mod/admin.php:896
     msgid "Channel not found"
     msgstr ""
     
    -#: ../../mod/admin.php:900
    +#: ../../mod/admin.php:907
     #, php-format
     msgid "Channel '%s' deleted"
     msgstr ""
     
    -#: ../../mod/admin.php:912
    +#: ../../mod/admin.php:919
     #, php-format
     msgid "Channel '%s' censored"
     msgstr ""
     
    -#: ../../mod/admin.php:912
    +#: ../../mod/admin.php:919
     #, php-format
     msgid "Channel '%s' uncensored"
     msgstr ""
     
    -#: ../../mod/admin.php:923
    +#: ../../mod/admin.php:930
     #, php-format
     msgid "Channel '%s' code allowed"
     msgstr ""
     
    -#: ../../mod/admin.php:923
    +#: ../../mod/admin.php:930
     #, php-format
     msgid "Channel '%s' code disallowed"
     msgstr ""
     
    -#: ../../mod/admin.php:969
    +#: ../../mod/admin.php:976
     msgid "Censor"
     msgstr ""
     
    -#: ../../mod/admin.php:970
    +#: ../../mod/admin.php:977
     msgid "Uncensor"
     msgstr ""
     
    -#: ../../mod/admin.php:971
    +#: ../../mod/admin.php:978
     msgid "Allow Code"
     msgstr ""
     
    -#: ../../mod/admin.php:972
    +#: ../../mod/admin.php:979
     msgid "Disallow Code"
     msgstr ""
     
    -#: ../../mod/admin.php:974
    +#: ../../mod/admin.php:981
     msgid "UID"
     msgstr ""
     
    -#: ../../mod/admin.php:976
    +#: ../../mod/admin.php:983
     msgid ""
     "Selected channels will be deleted!\\n\\nEverything that was posted in these "
     "channels on this site will be permanently deleted!\\n\\nAre you sure?"
     msgstr ""
     
    -#: ../../mod/admin.php:977
    +#: ../../mod/admin.php:984
     msgid ""
     "The channel {0} will be deleted!\\n\\nEverything that was posted in this "
     "channel on this site will be permanently deleted!\\n\\nAre you sure?"
     msgstr ""
     
    -#: ../../mod/admin.php:1017
    +#: ../../mod/admin.php:1024
     #, php-format
     msgid "Plugin %s disabled."
     msgstr ""
     
    -#: ../../mod/admin.php:1021
    +#: ../../mod/admin.php:1028
     #, php-format
     msgid "Plugin %s enabled."
     msgstr ""
     
    -#: ../../mod/admin.php:1031 ../../mod/admin.php:1234
    +#: ../../mod/admin.php:1038 ../../mod/admin.php:1241
     msgid "Disable"
     msgstr ""
     
    -#: ../../mod/admin.php:1034 ../../mod/admin.php:1236
    +#: ../../mod/admin.php:1041 ../../mod/admin.php:1243
     msgid "Enable"
     msgstr ""
     
    -#: ../../mod/admin.php:1063 ../../mod/admin.php:1263
    +#: ../../mod/admin.php:1070 ../../mod/admin.php:1270
     msgid "Toggle"
     msgstr ""
     
    -#: ../../mod/admin.php:1071 ../../mod/admin.php:1273
    +#: ../../mod/admin.php:1078 ../../mod/admin.php:1280
     msgid "Author: "
     msgstr ""
     
    -#: ../../mod/admin.php:1072 ../../mod/admin.php:1274
    +#: ../../mod/admin.php:1079 ../../mod/admin.php:1281
     msgid "Maintainer: "
     msgstr ""
     
    -#: ../../mod/admin.php:1199
    +#: ../../mod/admin.php:1206
     msgid "No themes found."
     msgstr ""
     
    -#: ../../mod/admin.php:1255
    +#: ../../mod/admin.php:1262
     msgid "Screenshot"
     msgstr ""
     
    -#: ../../mod/admin.php:1301
    +#: ../../mod/admin.php:1308
     msgid "[Experimental]"
     msgstr ""
     
    -#: ../../mod/admin.php:1302
    +#: ../../mod/admin.php:1309
     msgid "[Unsupported]"
     msgstr ""
     
    -#: ../../mod/admin.php:1326
    +#: ../../mod/admin.php:1333
     msgid "Log settings updated."
     msgstr ""
     
    -#: ../../mod/admin.php:1383
    +#: ../../mod/admin.php:1390
     msgid "Clear"
     msgstr ""
     
    -#: ../../mod/admin.php:1389
    +#: ../../mod/admin.php:1396
     msgid "Debugging"
     msgstr ""
     
    -#: ../../mod/admin.php:1390
    +#: ../../mod/admin.php:1397
     msgid "Log file"
     msgstr ""
     
    -#: ../../mod/admin.php:1390
    +#: ../../mod/admin.php:1397
     msgid ""
     "Must be writable by web server. Relative to your Red top-level directory."
     msgstr ""
     
    -#: ../../mod/admin.php:1391
    +#: ../../mod/admin.php:1398
     msgid "Log level"
     msgstr ""
     
    -#: ../../mod/admin.php:1437
    +#: ../../mod/admin.php:1444
     msgid "New Profile Field"
     msgstr ""
     
    -#: ../../mod/admin.php:1438 ../../mod/admin.php:1458
    +#: ../../mod/admin.php:1445 ../../mod/admin.php:1465
     msgid "Field nickname"
     msgstr ""
     
    -#: ../../mod/admin.php:1438 ../../mod/admin.php:1458
    +#: ../../mod/admin.php:1445 ../../mod/admin.php:1465
     msgid "System name of field"
     msgstr ""
     
    -#: ../../mod/admin.php:1439 ../../mod/admin.php:1459
    +#: ../../mod/admin.php:1446 ../../mod/admin.php:1466
     msgid "Input type"
     msgstr ""
     
    -#: ../../mod/admin.php:1440 ../../mod/admin.php:1460
    +#: ../../mod/admin.php:1447 ../../mod/admin.php:1467
     msgid "Field Name"
     msgstr ""
     
    -#: ../../mod/admin.php:1440 ../../mod/admin.php:1460
    +#: ../../mod/admin.php:1447 ../../mod/admin.php:1467
     msgid "Label on profile pages"
     msgstr ""
     
    -#: ../../mod/admin.php:1441 ../../mod/admin.php:1461
    +#: ../../mod/admin.php:1448 ../../mod/admin.php:1468
     msgid "Help text"
     msgstr ""
     
    -#: ../../mod/admin.php:1441 ../../mod/admin.php:1461
    +#: ../../mod/admin.php:1448 ../../mod/admin.php:1468
     msgid "Additional info (optional)"
     msgstr ""
     
    -#: ../../mod/admin.php:1451
    +#: ../../mod/admin.php:1458
     msgid "Field definition not found"
     msgstr ""
     
    -#: ../../mod/admin.php:1457
    +#: ../../mod/admin.php:1464
     msgid "Edit Profile Field"
     msgstr ""
     
    @@ -8258,101 +8168,193 @@ msgstr ""
     msgid "Use this form to drop the location if the hub is no longer operating."
     msgstr ""
     
    -#: ../../mod/invite.php:25
    -msgid "Total invitation limit exceeded."
    +#: ../../mod/home.php:57 ../../mod/home.php:65 ../../mod/siteinfo.php:61
    +msgid "$Projectname"
     msgstr ""
     
    -#: ../../mod/invite.php:49
    +#: ../../mod/home.php:75
     #, php-format
    -msgid "%s : Not a valid email address."
    +msgid "Welcome to %s"
     msgstr ""
     
    -#: ../../mod/invite.php:76
    -msgid "Please join us on $Projectname"
    +#: ../../mod/regmod.php:11
    +msgid "Please login."
     msgstr ""
     
    -#: ../../mod/invite.php:87
    -msgid "Invitation limit exceeded. Please contact your site administrator."
    +#: ../../mod/xchan.php:6
    +msgid "Xchan Lookup"
     msgstr ""
     
    -#: ../../mod/invite.php:92
    +#: ../../mod/xchan.php:9
    +msgid "Lookup xchan beginning with (or webbie): "
    +msgstr ""
    +
    +#: ../../mod/xchan.php:37 ../../mod/menu.php:162 ../../mod/mitem.php:116
    +msgid "Not found."
    +msgstr ""
    +
    +#: ../../mod/channel.php:25 ../../mod/chat.php:19
    +msgid "You must be logged in to see this page."
    +msgstr ""
    +
    +#: ../../mod/channel.php:97
    +msgid "Insufficient permissions.  Request redirected to profile page."
    +msgstr ""
    +
    +#: ../../mod/attach.php:9
    +msgid "Item not available."
    +msgstr ""
    +
    +#: ../../mod/photos.php:79
    +msgid "Page owner information could not be retrieved."
    +msgstr ""
    +
    +#: ../../mod/photos.php:100
    +msgid "Album not found."
    +msgstr ""
    +
    +#: ../../mod/photos.php:127
    +msgid "Delete Album"
    +msgstr ""
    +
    +#: ../../mod/photos.php:171 ../../mod/photos.php:1006
    +msgid "Delete Photo"
    +msgstr ""
    +
    +#: ../../mod/photos.php:501
    +msgid "No photos selected"
    +msgstr ""
    +
    +#: ../../mod/photos.php:550
    +msgid "Access to this item is restricted."
    +msgstr ""
    +
    +#: ../../mod/photos.php:589
     #, php-format
    -msgid "%s : Message delivery failed."
    +msgid "%1$.2f MB of %2$.2f MB photo storage used."
     msgstr ""
     
    -#: ../../mod/invite.php:96
    +#: ../../mod/photos.php:592
     #, php-format
    -msgid "%d message sent."
    -msgid_plural "%d messages sent."
    -msgstr[0] ""
    -msgstr[1] ""
    +msgid "%1$.2f MB photo storage used."
    +msgstr ""
     
    -#: ../../mod/invite.php:115
    -msgid "You have no more invitations available"
    +#: ../../mod/photos.php:620
    +msgid "Upload Photos"
     msgstr ""
     
    -#: ../../mod/invite.php:129
    -msgid "Send invitations"
    +#: ../../mod/photos.php:624
    +msgid "Enter an album name"
     msgstr ""
     
    -#: ../../mod/invite.php:130
    -msgid "Enter email addresses, one per line:"
    +#: ../../mod/photos.php:625
    +msgid "or select an existing album (doubleclick)"
     msgstr ""
     
    -#: ../../mod/invite.php:131 ../../mod/mail.php:238
    -msgid "Your message:"
    +#: ../../mod/photos.php:626
    +msgid "Create a status post for this upload"
     msgstr ""
     
    -#: ../../mod/invite.php:132
    -msgid "Please join my community on $Projectname."
    +#: ../../mod/photos.php:627
    +msgid "Caption (optional):"
     msgstr ""
     
    -#: ../../mod/invite.php:134
    -msgid "You will need to supply this invitation code: "
    +#: ../../mod/photos.php:628
    +msgid "Description (optional):"
     msgstr ""
     
    -#: ../../mod/invite.php:135
    -msgid "1. Register at any $Projectname location (they are all inter-connected)"
    +#: ../../mod/photos.php:655
    +msgid "Album name could not be decoded"
     msgstr ""
     
    -#: ../../mod/invite.php:137
    -msgid "2. Enter my $Projectname network address into the site searchbar."
    +#: ../../mod/photos.php:699 ../../mod/photos.php:1233
    +#: ../../mod/photos.php:1250
    +msgid "Contact Photos"
     msgstr ""
     
    -#: ../../mod/invite.php:138
    -msgid "or visit "
    +#: ../../mod/photos.php:722
    +msgid "Show Newest First"
     msgstr ""
     
    -#: ../../mod/invite.php:140
    -msgid "3. Click [Connect]"
    +#: ../../mod/photos.php:724
    +msgid "Show Oldest First"
     msgstr ""
     
    -#: ../../mod/regmod.php:11
    -msgid "Please login."
    +#: ../../mod/photos.php:824
    +msgid "Permission denied. Access to this item may be restricted."
     msgstr ""
     
    -#: ../../mod/xchan.php:6
    -msgid "Xchan Lookup"
    +#: ../../mod/photos.php:826
    +msgid "Photo not available"
     msgstr ""
     
    -#: ../../mod/xchan.php:9
    -msgid "Lookup xchan beginning with (or webbie): "
    +#: ../../mod/photos.php:884
    +msgid "Use as profile photo"
     msgstr ""
     
    -#: ../../mod/xchan.php:37 ../../mod/menu.php:162 ../../mod/mitem.php:116
    -msgid "Not found."
    +#: ../../mod/photos.php:891
    +msgid "Private Photo"
     msgstr ""
     
    -#: ../../mod/channel.php:25 ../../mod/chat.php:19
    -msgid "You must be logged in to see this page."
    +#: ../../mod/photos.php:902 ../../mod/events.php:652 ../../mod/events.php:659
    +msgid "Previous"
     msgstr ""
     
    -#: ../../mod/channel.php:97
    -msgid "Insufficient permissions.  Request redirected to profile page."
    +#: ../../mod/photos.php:906
    +msgid "View Full Size"
     msgstr ""
     
    -#: ../../mod/attach.php:9
    -msgid "Item not available."
    +#: ../../mod/photos.php:985
    +msgid "Edit photo"
    +msgstr ""
    +
    +#: ../../mod/photos.php:987
    +msgid "Rotate CW (right)"
    +msgstr ""
    +
    +#: ../../mod/photos.php:988
    +msgid "Rotate CCW (left)"
    +msgstr ""
    +
    +#: ../../mod/photos.php:991
    +msgid "Enter a new album name"
    +msgstr ""
    +
    +#: ../../mod/photos.php:992
    +msgid "or select an existing one (doubleclick)"
    +msgstr ""
    +
    +#: ../../mod/photos.php:995
    +msgid "Caption"
    +msgstr ""
    +
    +#: ../../mod/photos.php:997
    +msgid "Add a Tag"
    +msgstr ""
    +
    +#: ../../mod/photos.php:1001
    +msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
    +msgstr ""
    +
    +#: ../../mod/photos.php:1004
    +msgid "Flag as adult in album view"
    +msgstr ""
    +
    +#: ../../mod/photos.php:1196
    +msgid "In This Photo:"
    +msgstr ""
    +
    +#: ../../mod/photos.php:1201
    +msgid "Map"
    +msgstr ""
    +
    +#: ../../mod/photos.php:1289
    +msgid "View Album"
    +msgstr ""
    +
    +#: ../../mod/photos.php:1300 ../../mod/photos.php:1313
    +#: ../../mod/photos.php:1314
    +msgid "Recent Photos"
     msgstr ""
     
     #: ../../mod/lockview.php:37
    @@ -8744,95 +8746,89 @@ msgstr ""
     msgid "Allow bookmarks"
     msgstr ""
     
    -#: ../../mod/mail.php:33
    +#: ../../mod/mail.php:34
     msgid "Unable to lookup recipient."
     msgstr ""
     
    -#: ../../mod/mail.php:41
    +#: ../../mod/mail.php:42
     msgid "Unable to communicate with requested channel."
     msgstr ""
     
    -#: ../../mod/mail.php:48
    +#: ../../mod/mail.php:49
     msgid "Cannot verify requested channel."
     msgstr ""
     
    -#: ../../mod/mail.php:74
    +#: ../../mod/mail.php:75
     msgid "Selected channel has private message restrictions. Send failed."
     msgstr ""
     
    -#: ../../mod/mail.php:132
    +#: ../../mod/mail.php:140
     msgid "Messages"
     msgstr ""
     
    -#: ../../mod/mail.php:167
    +#: ../../mod/mail.php:175
     msgid "Message recalled."
     msgstr ""
     
    -#: ../../mod/mail.php:180
    +#: ../../mod/mail.php:188
     msgid "Conversation removed."
     msgstr ""
     
    -#: ../../mod/mail.php:223
    +#: ../../mod/mail.php:231
     msgid "Requested channel is not in this network"
     msgstr ""
     
    -#: ../../mod/mail.php:231
    +#: ../../mod/mail.php:239
     msgid "Send Private Message"
     msgstr ""
     
    -#: ../../mod/mail.php:232 ../../mod/mail.php:362
    +#: ../../mod/mail.php:240 ../../mod/mail.php:370
     msgid "To:"
     msgstr ""
     
    -#: ../../mod/mail.php:235 ../../mod/mail.php:364
    +#: ../../mod/mail.php:243 ../../mod/mail.php:372
     msgid "Subject:"
     msgstr ""
     
    -#: ../../mod/mail.php:242
    +#: ../../mod/mail.php:250
     msgid "Send"
     msgstr ""
     
    -#: ../../mod/mail.php:334
    +#: ../../mod/mail.php:342
     msgid "Delete message"
     msgstr ""
     
    -#: ../../mod/mail.php:335
    +#: ../../mod/mail.php:343
     msgid "Delivery report"
     msgstr ""
     
    -#: ../../mod/mail.php:336
    +#: ../../mod/mail.php:344
     msgid "Recall message"
     msgstr ""
     
    -#: ../../mod/mail.php:338
    +#: ../../mod/mail.php:346
     msgid "Message has been recalled."
     msgstr ""
     
    -#: ../../mod/mail.php:355
    +#: ../../mod/mail.php:363
     msgid "Delete Conversation"
     msgstr ""
     
    -#: ../../mod/mail.php:357
    +#: ../../mod/mail.php:365
     msgid ""
     "No secure communications available. You may be able to "
     "respond from the sender's profile page."
     msgstr ""
     
    -#: ../../mod/mail.php:361
    +#: ../../mod/mail.php:369
     msgid "Send Reply"
     msgstr ""
     
    -#: ../../mod/mail.php:366
    +#: ../../mod/mail.php:374
     #, php-format
     msgid "Your message for %s (%s):"
     msgstr ""
     
    -#: ../../mod/post.php:234
    -msgid ""
    -"Remote authentication blocked. You are logged into this site locally. Please "
    -"logout and retry."
    -msgstr ""
    -
     #: ../../mod/service_limits.php:19
     msgid "No service class restrictions found."
     msgstr ""
    @@ -9368,3 +9364,9 @@ msgstr ""
     #, php-format
     msgid "[hubzilla] Cron tasks not running on %s"
     msgstr ""
    +
    +#: ../../Zotlabs/Zot/Auth.php:140
    +msgid ""
    +"Remote authentication blocked. You are logged into this site locally. Please "
    +"logout and retry."
    +msgstr ""
    diff --git a/version.inc b/version.inc
    index 8ef02f56e..42838e2e7 100644
    --- a/version.inc
    +++ b/version.inc
    @@ -1 +1 @@
    -2015-12-10.1242
    +2015-12-11.1243
    -- 
    cgit v1.2.3
    
    
    From 1f4c596841be66c96bc5acf28ba74e4f7154c6c8 Mon Sep 17 00:00:00 2001
    From: redmatrix 
    Date: Fri, 11 Dec 2015 17:00:45 -0800
    Subject: add deprecated update_with_media endpoint
    
    ---
     include/api.php | 1 +
     1 file changed, 1 insertion(+)
    
    diff --git a/include/api.php b/include/api.php
    index 4ad915c03..1fb48d553 100644
    --- a/include/api.php
    +++ b/include/api.php
    @@ -870,6 +870,7 @@ require_once('include/api_auth.php');
     		// this should output the last post (the one we just posted).
     		return api_status_show($a,$type);
     	}
    +	api_register_func('api/statuses/update_with_media','api_statuses_update', true);
     	api_register_func('api/statuses/update','api_statuses_update', true);
     
     
    -- 
    cgit v1.2.3
    
    
    From 395268da22bf5ec773de7fdc42a338a9cbe87d40 Mon Sep 17 00:00:00 2001
    From: redmatrix 
    Date: Fri, 11 Dec 2015 21:10:20 -0800
    Subject: a couple of api improvements
    
    ---
     include/api.php      | 11 ++++++++++-
     include/api_auth.php |  2 +-
     2 files changed, 11 insertions(+), 2 deletions(-)
    
    diff --git a/include/api.php b/include/api.php
    index 1fb48d553..fd6883f44 100644
    --- a/include/api.php
    +++ b/include/api.php
    @@ -112,8 +112,11 @@ require_once('include/api_auth.php');
     						break;
     					case "json":
     						header ("Content-Type: application/json");
    -						foreach($r as $rr)
    +						foreach($r as $rr) {
    +							if(! $rr)
    +								$rr = array();
     							$json = json_encode($rr);
    +						}
     						if ($_GET['callback'])
     							$json = $_GET['callback']."(".$json.")";
     						return $json; 
    @@ -1079,6 +1082,8 @@ require_once('include/api_auth.php');
     				'contributors' => ''					
     			);
     			$status_info['user'] = $user_info;
    +			if(array_key_exists('status',$status_info['user']))
    +				unset($status_info['user']['status']);
     		}
     
     		return  api_apply_template("status", $type, array('$status' => $status_info));
    @@ -1320,6 +1325,8 @@ require_once('include/api_auth.php');
     
     		// params
     		$id = intval(argv(3));
    +		if(! $id)
    +			$id = $_REQUEST['id'];
     
     		logger('API: api_statuses_show: '.$id);
     
    @@ -1336,10 +1343,12 @@ require_once('include/api_auth.php');
     		$r = q("select * from item where true $item_normal $sql_extra",
     			intval($id)
     		);
    +
     		xchan_query($r,true);
     
     		$ret = api_format_items($r,$user_info);
     
    +
     		if ($conversation) {
     			$data = array('$statuses' => $ret);
     			return api_apply_template("timeline", $type, $data);
    diff --git a/include/api_auth.php b/include/api_auth.php
    index c9978c99d..e3697adb0 100644
    --- a/include/api_auth.php
    +++ b/include/api_auth.php
    @@ -28,7 +28,7 @@ function api_login(&$a){
     		killme();
     	}
     	catch(Exception $e) {
    -		logger(__file__.__line__.__function__."\n".$e);
    +		logger($e->getMessage());
     	}
     		
     	// workarounds for HTTP-auth in CGI mode
    -- 
    cgit v1.2.3
    
    
    From 04d3ac9aaf76943137d1fb59c9b0e91ef967b287 Mon Sep 17 00:00:00 2001
    From: jeroenpraat 
    Date: Sat, 12 Dec 2015 17:01:43 +0100
    Subject: es+nl strings update
    
    ---
     view/es/hmessages.po | 1336 +++++++++++++++++++++++++-------------------------
     view/es/hstrings.php |  206 ++++----
     view/nl/hmessages.po | 1300 ++++++++++++++++++++++++------------------------
     view/nl/hstrings.php |  170 +++----
     4 files changed, 1508 insertions(+), 1504 deletions(-)
    
    diff --git a/view/es/hmessages.po b/view/es/hmessages.po
    index 27ad2c772..3d1938a07 100644
    --- a/view/es/hmessages.po
    +++ b/view/es/hmessages.po
    @@ -13,8 +13,8 @@ msgid ""
     msgstr ""
     "Project-Id-Version: Redmatrix\n"
     "Report-Msgid-Bugs-To: \n"
    -"POT-Creation-Date: 2015-12-04 00:03-0800\n"
    -"PO-Revision-Date: 2015-12-06 18:09+0000\n"
    +"POT-Creation-Date: 2015-12-11 00:03-0800\n"
    +"PO-Revision-Date: 2015-12-12 12:49+0000\n"
     "Last-Translator: Manuel Jiménez Friaza \n"
     "Language-Team: Spanish (http://www.transifex.com/Friendica/red-matrix/language/es/)\n"
     "MIME-Version: 1.0\n"
    @@ -23,7 +23,7 @@ msgstr ""
     "Language: es\n"
     "Plural-Forms: nplurals=2; plural=(n != 1);\n"
     
    -#: ../../include/Contact.php:101 ../../include/identity.php:953
    +#: ../../include/Contact.php:101 ../../include/identity.php:947
     #: ../../include/widgets.php:137 ../../include/widgets.php:175
     #: ../../include/conversation.php:953 ../../mod/match.php:64
     #: ../../mod/directory.php:318 ../../mod/suggest.php:52
    @@ -82,25 +82,25 @@ msgstr "Sala no encontrada."
     #: ../../mod/editwebpage.php:125 ../../mod/profile.php:64
     #: ../../mod/profile.php:72 ../../mod/api.php:26 ../../mod/api.php:31
     #: ../../mod/fsuggest.php:78 ../../mod/sources.php:66
    -#: ../../mod/notifications.php:66 ../../mod/photos.php:70
    -#: ../../mod/profile_photo.php:341 ../../mod/profile_photo.php:354
    -#: ../../mod/thing.php:271 ../../mod/thing.php:291 ../../mod/thing.php:328
    -#: ../../mod/editblock.php:65 ../../mod/network.php:12
    -#: ../../mod/pdledit.php:21 ../../mod/register.php:72
    +#: ../../mod/notifications.php:66 ../../mod/invite.php:13
    +#: ../../mod/invite.php:87 ../../mod/profile_photo.php:341
    +#: ../../mod/profile_photo.php:354 ../../mod/thing.php:271
    +#: ../../mod/thing.php:291 ../../mod/thing.php:328 ../../mod/editblock.php:65
    +#: ../../mod/network.php:12 ../../mod/pdledit.php:21 ../../mod/register.php:72
     #: ../../mod/editlayout.php:63 ../../mod/editlayout.php:87
     #: ../../mod/settings.php:568 ../../mod/webpages.php:69
     #: ../../mod/appman.php:66 ../../mod/layouts.php:69 ../../mod/layouts.php:76
    -#: ../../mod/layouts.php:87 ../../mod/locs.php:83 ../../mod/invite.php:13
    -#: ../../mod/invite.php:104 ../../mod/regmod.php:17 ../../mod/channel.php:100
    -#: ../../mod/channel.php:214 ../../mod/channel.php:254
    -#: ../../mod/editpost.php:13 ../../mod/chat.php:94 ../../mod/chat.php:99
    -#: ../../mod/viewsrc.php:14 ../../mod/authtest.php:13
    -#: ../../mod/connections.php:29 ../../mod/manage.php:6 ../../mod/menu.php:74
    -#: ../../mod/mail.php:118 ../../mod/service_limits.php:7
    -#: ../../mod/suggest.php:26 ../../mod/events.php:260 ../../mod/message.php:16
    -#: ../../mod/block.php:22 ../../mod/block.php:72 ../../mod/mitem.php:111
    -#: ../../mod/sharedwithme.php:7 ../../mod/viewconnections.php:22
    -#: ../../mod/viewconnections.php:27 ../../index.php:182 ../../index.php:365
    +#: ../../mod/layouts.php:87 ../../mod/locs.php:83 ../../mod/regmod.php:17
    +#: ../../mod/channel.php:100 ../../mod/channel.php:214
    +#: ../../mod/channel.php:254 ../../mod/photos.php:70 ../../mod/editpost.php:13
    +#: ../../mod/chat.php:94 ../../mod/chat.php:99 ../../mod/viewsrc.php:14
    +#: ../../mod/authtest.php:13 ../../mod/connections.php:29
    +#: ../../mod/manage.php:6 ../../mod/menu.php:74 ../../mod/mail.php:126
    +#: ../../mod/service_limits.php:7 ../../mod/suggest.php:26
    +#: ../../mod/events.php:260 ../../mod/message.php:16 ../../mod/block.php:22
    +#: ../../mod/block.php:72 ../../mod/mitem.php:111 ../../mod/sharedwithme.php:7
    +#: ../../mod/viewconnections.php:22 ../../mod/viewconnections.php:27
    +#: ../../index.php:182 ../../index.php:365
     msgid "Permission denied."
     msgstr "Acceso denegado."
     
    @@ -154,16 +154,16 @@ msgstr "Programar bandeja de entrada"
     msgid "Schedule Outbox"
     msgstr "Programar bandeja de salida"
     
    -#: ../../include/RedDAV/RedBrowser.php:164 ../../include/widgets.php:1331
    +#: ../../include/RedDAV/RedBrowser.php:164 ../../include/widgets.php:1330
     #: ../../include/conversation.php:1027 ../../include/apps.php:360
    -#: ../../include/apps.php:415 ../../mod/photos.php:759
    -#: ../../mod/photos.php:1198
    +#: ../../include/apps.php:415 ../../mod/photos.php:754
    +#: ../../mod/photos.php:1195
     msgid "Unknown"
     msgstr "Desconocido"
     
     #: ../../include/RedDAV/RedBrowser.php:226 ../../include/conversation.php:1629
     #: ../../include/nav.php:93 ../../include/apps.php:135
    -#: ../../mod/fbrowser.php:114
    +#: ../../mod/fbrowser.php:109
     msgid "Files"
     msgstr "Ficheros"
     
    @@ -184,12 +184,12 @@ msgstr "Crear"
     
     #: ../../include/RedDAV/RedBrowser.php:231
     #: ../../include/RedDAV/RedBrowser.php:305 ../../include/widgets.php:1343
    -#: ../../mod/photos.php:784 ../../mod/photos.php:1317
    -#: ../../mod/profile_photo.php:453
    +#: ../../mod/profile_photo.php:453 ../../mod/photos.php:781
    +#: ../../mod/photos.php:1316
     msgid "Upload"
     msgstr "Subir"
     
    -#: ../../include/RedDAV/RedBrowser.php:235 ../../mod/admin.php:974
    +#: ../../include/RedDAV/RedBrowser.php:235 ../../mod/admin.php:981
     #: ../../mod/settings.php:588 ../../mod/settings.php:614
     #: ../../mod/sharedwithme.php:95
     msgid "Name"
    @@ -224,10 +224,10 @@ msgstr "Editar"
     #: ../../include/RedDAV/RedBrowser.php:241 ../../include/conversation.php:657
     #: ../../include/ItemObject.php:120 ../../include/apps.php:260
     #: ../../mod/group.php:173 ../../mod/blocks.php:155 ../../mod/connedit.php:551
    -#: ../../mod/editwebpage.php:223 ../../mod/photos.php:1129
    -#: ../../mod/thing.php:258 ../../mod/editblock.php:181 ../../mod/admin.php:809
    -#: ../../mod/admin.php:968 ../../mod/editlayout.php:179
    -#: ../../mod/settings.php:649 ../../mod/webpages.php:183
    +#: ../../mod/editwebpage.php:223 ../../mod/thing.php:258
    +#: ../../mod/editblock.php:181 ../../mod/admin.php:816 ../../mod/admin.php:975
    +#: ../../mod/editlayout.php:179 ../../mod/settings.php:649
    +#: ../../mod/webpages.php:183 ../../mod/photos.php:1126
     msgid "Delete"
     msgstr "Eliminar"
     
    @@ -258,7 +258,7 @@ msgid "Delete this item?"
     msgstr "¿Borrar este elemento?"
     
     #: ../../include/js_strings.php:6 ../../include/ItemObject.php:696
    -#: ../../mod/photos.php:1047 ../../mod/photos.php:1165
    +#: ../../mod/photos.php:1044 ../../mod/photos.php:1162
     msgid "Comment"
     msgstr "Comentar"
     
    @@ -331,17 +331,17 @@ msgstr "Describir (opcional)"
     #: ../../mod/poke.php:171 ../../mod/profiles.php:675
     #: ../../mod/connedit.php:715 ../../mod/fsuggest.php:108
     #: ../../mod/sources.php:104 ../../mod/sources.php:138
    -#: ../../mod/import.php:527 ../../mod/photos.php:637 ../../mod/photos.php:1008
    -#: ../../mod/photos.php:1048 ../../mod/photos.php:1166 ../../mod/thing.php:313
    +#: ../../mod/import.php:527 ../../mod/invite.php:142 ../../mod/thing.php:313
     #: ../../mod/thing.php:359 ../../mod/import_items.php:122
    -#: ../../mod/pdledit.php:58 ../../mod/admin.php:435 ../../mod/admin.php:802
    -#: ../../mod/admin.php:966 ../../mod/admin.php:1103 ../../mod/admin.php:1297
    -#: ../../mod/admin.php:1382 ../../mod/settings.php:586
    +#: ../../mod/pdledit.php:58 ../../mod/admin.php:442 ../../mod/admin.php:809
    +#: ../../mod/admin.php:973 ../../mod/admin.php:1110 ../../mod/admin.php:1304
    +#: ../../mod/admin.php:1389 ../../mod/settings.php:586
     #: ../../mod/settings.php:698 ../../mod/settings.php:726
     #: ../../mod/settings.php:749 ../../mod/settings.php:834
     #: ../../mod/settings.php:1023 ../../mod/appman.php:99 ../../mod/locs.php:116
    -#: ../../mod/invite.php:142 ../../mod/xchan.php:11 ../../mod/chat.php:184
    -#: ../../mod/chat.php:213 ../../mod/mail.php:372 ../../mod/events.php:461
    +#: ../../mod/xchan.php:11 ../../mod/photos.php:637 ../../mod/photos.php:1005
    +#: ../../mod/photos.php:1045 ../../mod/photos.php:1163 ../../mod/chat.php:184
    +#: ../../mod/chat.php:213 ../../mod/mail.php:380 ../../mod/events.php:461
     #: ../../mod/events.php:658 ../../mod/mitem.php:231
     #: ../../view/theme/redbasic/php/config.php:99
     msgid "Submit"
    @@ -669,8 +669,8 @@ msgid "Visible to specific connections."
     msgstr "Visible para conexiones específicas."
     
     #: ../../include/items.php:4319 ../../mod/filestorage.php:27
    -#: ../../mod/thing.php:86 ../../mod/admin.php:127 ../../mod/admin.php:1005
    -#: ../../mod/admin.php:1210 ../../mod/display.php:36 ../../mod/viewsrc.php:20
    +#: ../../mod/thing.php:86 ../../mod/admin.php:127 ../../mod/admin.php:1012
    +#: ../../mod/admin.php:1217 ../../mod/display.php:36 ../../mod/viewsrc.php:20
     msgid "Item not found."
     msgstr "Elemento no encontrado."
     
    @@ -696,36 +696,6 @@ msgstr "Conexión: %s"
     msgid "Connection not found."
     msgstr "Conexión no encontrada"
     
    -#: ../../include/network.php:630
    -msgid "view full size"
    -msgstr "Ver en el tamaño original"
    -
    -#: ../../include/network.php:1608 ../../include/enotify.php:57
    -msgid "$Projectname Notification"
    -msgstr "Notificación de $Projectname"
    -
    -#: ../../include/network.php:1609 ../../include/enotify.php:58
    -msgid "$projectname"
    -msgstr "$projectname"
    -
    -#: ../../include/network.php:1611 ../../include/enotify.php:60
    -msgid "Thank You,"
    -msgstr "Gracias,"
    -
    -#: ../../include/network.php:1613 ../../include/enotify.php:62
    -#, php-format
    -msgid "%s Administrator"
    -msgstr "%s Administrador"
    -
    -#: ../../include/network.php:1655 ../../include/account.php:316
    -#: ../../include/account.php:343 ../../include/account.php:403
    -msgid "Administrator"
    -msgstr "Administrador"
    -
    -#: ../../include/network.php:1669
    -msgid "No Subject"
    -msgstr "Sin asunto"
    -
     #: ../../include/event.php:22 ../../include/bb2diaspora.php:471
     #: ../../include/text.php:1392
     msgid "l F d, Y \\@ g:i A"
    @@ -741,7 +711,7 @@ msgstr "Comienza:"
     msgid "Finishes:"
     msgstr "Finaliza:"
     
    -#: ../../include/event.php:52 ../../include/identity.php:1004
    +#: ../../include/event.php:52 ../../include/identity.php:998
     #: ../../include/bb2diaspora.php:493 ../../include/text.php:1407
     #: ../../mod/directory.php:304
     msgid "Location:"
    @@ -836,206 +806,206 @@ msgstr "El canal solicitado no está disponible."
     msgid "Requested profile is not available."
     msgstr "El perfil solicitado no está disponible."
     
    -#: ../../include/identity.php:966 ../../mod/profiles.php:782
    +#: ../../include/identity.php:960 ../../mod/profiles.php:782
     msgid "Change profile photo"
     msgstr "Cambiar la foto del perfil"
     
    -#: ../../include/identity.php:972
    +#: ../../include/identity.php:966
     msgid "Profiles"
     msgstr "Perfiles"
     
    -#: ../../include/identity.php:972
    +#: ../../include/identity.php:966
     msgid "Manage/edit profiles"
     msgstr "Administrar/editar perfiles"
     
    -#: ../../include/identity.php:973 ../../mod/profiles.php:783
    +#: ../../include/identity.php:967 ../../mod/profiles.php:783
     msgid "Create New Profile"
     msgstr "Crear un nuevo perfil"
     
    -#: ../../include/identity.php:976 ../../include/nav.php:90
    +#: ../../include/identity.php:970 ../../include/nav.php:90
     msgid "Edit Profile"
     msgstr "Editar el perfil"
     
    -#: ../../include/identity.php:988 ../../mod/profiles.php:794
    +#: ../../include/identity.php:982 ../../mod/profiles.php:794
     msgid "Profile Image"
     msgstr "Imagen del perfil"
     
    -#: ../../include/identity.php:991
    +#: ../../include/identity.php:985
     msgid "visible to everybody"
     msgstr "visible para cualquiera"
     
    -#: ../../include/identity.php:992 ../../mod/profiles.php:677
    +#: ../../include/identity.php:986 ../../mod/profiles.php:677
     #: ../../mod/profiles.php:798
     msgid "Edit visibility"
     msgstr "Editar visibilidad"
     
    -#: ../../include/identity.php:1008 ../../include/identity.php:1248
    +#: ../../include/identity.php:1002 ../../include/identity.php:1242
     msgid "Gender:"
     msgstr "Género:"
     
    -#: ../../include/identity.php:1009 ../../include/identity.php:1292
    +#: ../../include/identity.php:1003 ../../include/identity.php:1286
     msgid "Status:"
     msgstr "Estado:"
     
    -#: ../../include/identity.php:1010 ../../include/identity.php:1303
    +#: ../../include/identity.php:1004 ../../include/identity.php:1297
     msgid "Homepage:"
     msgstr "Página personal:"
     
    -#: ../../include/identity.php:1011
    +#: ../../include/identity.php:1005
     msgid "Online Now"
     msgstr "Ahora en línea"
     
    -#: ../../include/identity.php:1095 ../../include/identity.php:1173
    +#: ../../include/identity.php:1089 ../../include/identity.php:1167
     #: ../../mod/ping.php:318
     msgid "g A l F d"
     msgstr "g A l d F"
     
    -#: ../../include/identity.php:1096 ../../include/identity.php:1174
    +#: ../../include/identity.php:1090 ../../include/identity.php:1168
     msgid "F d"
     msgstr "d F"
     
    -#: ../../include/identity.php:1141 ../../include/identity.php:1213
    +#: ../../include/identity.php:1135 ../../include/identity.php:1207
     #: ../../mod/ping.php:341
     msgid "[today]"
     msgstr "[hoy]"
     
    -#: ../../include/identity.php:1152
    +#: ../../include/identity.php:1146
     msgid "Birthday Reminders"
     msgstr "Recordatorios de cumpleaños"
     
    -#: ../../include/identity.php:1153
    +#: ../../include/identity.php:1147
     msgid "Birthdays this week:"
     msgstr "Cumpleaños de esta semana:"
     
    -#: ../../include/identity.php:1206
    +#: ../../include/identity.php:1200
     msgid "[No description]"
     msgstr "[Sin descripción]"
     
    -#: ../../include/identity.php:1224
    +#: ../../include/identity.php:1218
     msgid "Event Reminders"
     msgstr "Recordatorios de eventos"
     
    -#: ../../include/identity.php:1225
    +#: ../../include/identity.php:1219
     msgid "Events this week:"
     msgstr "Eventos de esta semana:"
     
    -#: ../../include/identity.php:1238 ../../include/identity.php:1355
    +#: ../../include/identity.php:1232 ../../include/identity.php:1349
     #: ../../include/apps.php:138 ../../mod/profperm.php:112
     msgid "Profile"
     msgstr "Perfil"
     
    -#: ../../include/identity.php:1246 ../../mod/settings.php:1029
    +#: ../../include/identity.php:1240 ../../mod/settings.php:1029
     msgid "Full Name:"
     msgstr "Nombre completo:"
     
    -#: ../../include/identity.php:1253
    +#: ../../include/identity.php:1247
     msgid "Like this channel"
     msgstr "Me gusta este canal"
     
    -#: ../../include/identity.php:1264 ../../include/taxonomy.php:414
    +#: ../../include/identity.php:1258 ../../include/taxonomy.php:414
     #: ../../include/conversation.php:1721 ../../include/ItemObject.php:179
    -#: ../../mod/photos.php:1086
    +#: ../../mod/photos.php:1083
     msgctxt "noun"
     msgid "Like"
     msgid_plural "Likes"
     msgstr[0] "Me gusta"
     msgstr[1] "Me gusta"
     
    -#: ../../include/identity.php:1277
    +#: ../../include/identity.php:1271
     msgid "j F, Y"
     msgstr "j F Y"
     
    -#: ../../include/identity.php:1278
    +#: ../../include/identity.php:1272
     msgid "j F"
     msgstr "j F"
     
    -#: ../../include/identity.php:1285
    +#: ../../include/identity.php:1279
     msgid "Birthday:"
     msgstr "Cumpleaños:"
     
    -#: ../../include/identity.php:1289 ../../mod/directory.php:299
    +#: ../../include/identity.php:1283 ../../mod/directory.php:299
     msgid "Age:"
     msgstr "Edad:"
     
    -#: ../../include/identity.php:1298
    +#: ../../include/identity.php:1292
     #, php-format
     msgid "for %1$d %2$s"
     msgstr "por %1$d %2$s"
     
    -#: ../../include/identity.php:1301 ../../mod/profiles.php:699
    +#: ../../include/identity.php:1295 ../../mod/profiles.php:699
     msgid "Sexual Preference:"
     msgstr "Orientación sexual:"
     
    -#: ../../include/identity.php:1305 ../../mod/profiles.php:701
    +#: ../../include/identity.php:1299 ../../mod/profiles.php:701
     #: ../../mod/directory.php:315
     msgid "Hometown:"
     msgstr "Ciudad de origen:"
     
    -#: ../../include/identity.php:1307
    +#: ../../include/identity.php:1301
     msgid "Tags:"
     msgstr "Etiquetas:"
     
    -#: ../../include/identity.php:1309 ../../mod/profiles.php:702
    +#: ../../include/identity.php:1303 ../../mod/profiles.php:702
     msgid "Political Views:"
     msgstr "Posición política:"
     
    -#: ../../include/identity.php:1311
    +#: ../../include/identity.php:1305
     msgid "Religion:"
     msgstr "Religión:"
     
    -#: ../../include/identity.php:1313 ../../mod/directory.php:317
    +#: ../../include/identity.php:1307 ../../mod/directory.php:317
     msgid "About:"
     msgstr "Sobre mí:"
     
    -#: ../../include/identity.php:1315
    +#: ../../include/identity.php:1309
     msgid "Hobbies/Interests:"
     msgstr "Aficciones/Intereses:"
     
    -#: ../../include/identity.php:1317 ../../mod/profiles.php:705
    +#: ../../include/identity.php:1311 ../../mod/profiles.php:705
     msgid "Likes:"
     msgstr "Me gusta:"
     
    -#: ../../include/identity.php:1319 ../../mod/profiles.php:706
    +#: ../../include/identity.php:1313 ../../mod/profiles.php:706
     msgid "Dislikes:"
     msgstr "No me gusta:"
     
    -#: ../../include/identity.php:1321
    +#: ../../include/identity.php:1315
     msgid "Contact information and Social Networks:"
     msgstr "Información de contacto y redes sociales:"
     
    -#: ../../include/identity.php:1323
    +#: ../../include/identity.php:1317
     msgid "My other channels:"
     msgstr "Mis otros canales:"
     
    -#: ../../include/identity.php:1325
    +#: ../../include/identity.php:1319
     msgid "Musical interests:"
     msgstr "Intereses musicales:"
     
    -#: ../../include/identity.php:1327
    +#: ../../include/identity.php:1321
     msgid "Books, literature:"
     msgstr "Libros, literatura:"
     
    -#: ../../include/identity.php:1329
    +#: ../../include/identity.php:1323
     msgid "Television:"
     msgstr "Televisión:"
     
    -#: ../../include/identity.php:1331
    +#: ../../include/identity.php:1325
     msgid "Film/dance/culture/entertainment:"
     msgstr "Cine/danza/cultura/entretenimiento:"
     
    -#: ../../include/identity.php:1333
    +#: ../../include/identity.php:1327
     msgid "Love/Romance:"
     msgstr "Vida sentimental/amorosa:"
     
    -#: ../../include/identity.php:1335
    +#: ../../include/identity.php:1329
     msgid "Work/employment:"
     msgstr "Trabajo:"
     
    -#: ../../include/identity.php:1337
    +#: ../../include/identity.php:1331
     msgid "School/education:"
     msgstr "Estudios:"
     
    -#: ../../include/identity.php:1357
    +#: ../../include/identity.php:1351
     msgid "Like this thing"
     msgstr "Me gusta esto"
     
    @@ -1074,7 +1044,7 @@ msgstr "me gusta"
     
     #: ../../include/taxonomy.php:328
     msgid "likes"
    -msgstr "le gusta"
    +msgstr "gusta de"
     
     #: ../../include/taxonomy.php:329 ../../include/ItemObject.php:255
     msgid "dislike"
    @@ -1082,7 +1052,7 @@ msgstr "no me gusta"
     
     #: ../../include/taxonomy.php:329
     msgid "dislikes"
    -msgstr "no le gusta"
    +msgstr "no gusta de"
     
     #: ../../include/acl_selectors.php:240
     msgid "Visible to your default audience"
    @@ -1101,13 +1071,13 @@ msgid "Other networks and post services"
     msgstr "Otras redes y servicios de correo"
     
     #: ../../include/acl_selectors.php:249 ../../mod/filestorage.php:147
    -#: ../../mod/photos.php:631 ../../mod/photos.php:1001 ../../mod/thing.php:310
    -#: ../../mod/thing.php:356 ../../mod/chat.php:211
    +#: ../../mod/thing.php:310 ../../mod/thing.php:356 ../../mod/photos.php:631
    +#: ../../mod/photos.php:998 ../../mod/chat.php:211
     msgid "Permissions"
     msgstr "Permisos"
     
     #: ../../include/acl_selectors.php:250 ../../include/ItemObject.php:384
    -#: ../../mod/photos.php:1218
    +#: ../../mod/photos.php:1215
     msgid "Close"
     msgstr "Cerrar"
     
    @@ -1269,7 +1239,7 @@ msgstr "Notas"
     
     #: ../../include/widgets.php:192 ../../include/text.php:868
     #: ../../include/text.php:880 ../../mod/rbmark.php:28 ../../mod/rbmark.php:100
    -#: ../../mod/admin.php:1442 ../../mod/admin.php:1462 ../../mod/filer.php:49
    +#: ../../mod/admin.php:1449 ../../mod/admin.php:1469 ../../mod/filer.php:49
     msgid "Save"
     msgstr "Guardar"
     
    @@ -1362,8 +1332,8 @@ msgid "Channel Sources"
     msgstr "Orígenes de los contenidos del canal"
     
     #: ../../include/widgets.php:554 ../../include/nav.php:202
    -#: ../../include/apps.php:134 ../../mod/admin.php:1064
    -#: ../../mod/admin.php:1264
    +#: ../../include/apps.php:134 ../../mod/admin.php:1071
    +#: ../../mod/admin.php:1271
     msgid "Settings"
     msgstr "Ajustes"
     
    @@ -1499,7 +1469,7 @@ msgstr "Para los administradores"
     msgid "For Developers"
     msgstr "Para los desarrolladores"
     
    -#: ../../include/widgets.php:1214 ../../mod/admin.php:434
    +#: ../../include/widgets.php:1214 ../../mod/admin.php:441
     msgid "Site"
     msgstr "Sitio"
     
    @@ -1507,17 +1477,17 @@ msgstr "Sitio"
     msgid "Accounts"
     msgstr "Cuentas"
     
    -#: ../../include/widgets.php:1216 ../../mod/admin.php:965
    +#: ../../include/widgets.php:1216 ../../mod/admin.php:972
     msgid "Channels"
     msgstr "Canales"
     
    -#: ../../include/widgets.php:1217 ../../mod/admin.php:1062
    -#: ../../mod/admin.php:1102
    +#: ../../include/widgets.php:1217 ../../mod/admin.php:1069
    +#: ../../mod/admin.php:1109
     msgid "Plugins"
     msgstr "Extensiones"
     
    -#: ../../include/widgets.php:1218 ../../mod/admin.php:1262
    -#: ../../mod/admin.php:1296
    +#: ../../include/widgets.php:1218 ../../mod/admin.php:1269
    +#: ../../mod/admin.php:1303
     msgid "Themes"
     msgstr "Temas"
     
    @@ -1534,7 +1504,7 @@ msgid "DB updates"
     msgstr "Actualizaciones de la base de datos"
     
     #: ../../include/widgets.php:1239 ../../include/widgets.php:1245
    -#: ../../mod/admin.php:1381
    +#: ../../mod/admin.php:1388
     msgid "Logs"
     msgstr "Informes"
     
    @@ -1550,12 +1520,12 @@ msgstr "Ajustes de la extensión"
     msgid "User registrations waiting for confirmation"
     msgstr "Registros de usuarios pendientes de confirmación"
     
    -#: ../../include/widgets.php:1325 ../../mod/photos.php:753
    -#: ../../mod/photos.php:1286
    +#: ../../include/widgets.php:1324 ../../mod/photos.php:748
    +#: ../../mod/photos.php:1283
     msgid "View Photo"
     msgstr "Ver foto"
     
    -#: ../../include/widgets.php:1341 ../../mod/photos.php:782
    +#: ../../include/widgets.php:1341 ../../mod/photos.php:779
     msgid "Edit Album"
     msgstr "Editar álbum"
     
    @@ -1757,7 +1727,7 @@ msgstr "Herramienta de afinidad"
     
     #: ../../include/features.php:75
     msgid "Filter stream activity by depth of relationships"
    -msgstr "Filtrar la actividad del flujo por profundidad de relaciones"
    +msgstr "Filtrar el contenido según la profundidad de las relaciones"
     
     #: ../../include/features.php:76
     msgid "Connection Filtering"
    @@ -2170,7 +2140,7 @@ msgstr "foto"
     
     #: ../../include/conversation.php:126 ../../mod/like.php:113
     msgid "channel"
    -msgstr "canal"
    +msgstr "el canal"
     
     #: ../../include/conversation.php:148 ../../include/text.php:1922
     #: ../../mod/like.php:361 ../../mod/subthread.php:83
    @@ -2180,7 +2150,7 @@ msgstr "el mensaje de estado"
     #: ../../include/conversation.php:150 ../../include/text.php:1924
     #: ../../mod/tagger.php:53
     msgid "comment"
    -msgstr "comentario"
    +msgstr "el comentario"
     
     #: ../../include/conversation.php:164 ../../mod/like.php:410
     #, php-format
    @@ -2212,42 +2182,42 @@ msgctxt "mood"
     msgid "%1$s is %2$s"
     msgstr "%1$s está %2$s"
     
    -#: ../../include/conversation.php:574 ../../mod/photos.php:1063
    +#: ../../include/conversation.php:574 ../../mod/photos.php:1060
     msgctxt "title"
     msgid "Likes"
     msgstr "Me gusta"
     
    -#: ../../include/conversation.php:574 ../../mod/photos.php:1063
    +#: ../../include/conversation.php:574 ../../mod/photos.php:1060
     msgctxt "title"
     msgid "Dislikes"
     msgstr "No me gusta"
     
    -#: ../../include/conversation.php:575 ../../mod/photos.php:1064
    +#: ../../include/conversation.php:575 ../../mod/photos.php:1061
     msgctxt "title"
     msgid "Agree"
     msgstr "De acuerdo"
     
    -#: ../../include/conversation.php:575 ../../mod/photos.php:1064
    +#: ../../include/conversation.php:575 ../../mod/photos.php:1061
     msgctxt "title"
     msgid "Disagree"
     msgstr "En desacuerdo"
     
    -#: ../../include/conversation.php:575 ../../mod/photos.php:1064
    +#: ../../include/conversation.php:575 ../../mod/photos.php:1061
     msgctxt "title"
     msgid "Abstain"
     msgstr "Abstención"
     
    -#: ../../include/conversation.php:576 ../../mod/photos.php:1065
    +#: ../../include/conversation.php:576 ../../mod/photos.php:1062
     msgctxt "title"
     msgid "Attending"
     msgstr "Participaré"
     
    -#: ../../include/conversation.php:576 ../../mod/photos.php:1065
    +#: ../../include/conversation.php:576 ../../mod/photos.php:1062
     msgctxt "title"
     msgid "Not attending"
     msgstr "No participaré"
     
    -#: ../../include/conversation.php:576 ../../mod/photos.php:1065
    +#: ../../include/conversation.php:576 ../../mod/photos.php:1062
     msgctxt "title"
     msgid "Might attend"
     msgstr "Quizá participe"
    @@ -2302,8 +2272,8 @@ msgstr "Mostrar en su contexto"
     
     #: ../../include/conversation.php:740 ../../include/conversation.php:1227
     #: ../../include/ItemObject.php:389 ../../mod/editwebpage.php:190
    -#: ../../mod/photos.php:1029 ../../mod/editblock.php:150
    -#: ../../mod/editlayout.php:148 ../../mod/editpost.php:129
    +#: ../../mod/editblock.php:150 ../../mod/editlayout.php:148
    +#: ../../mod/photos.php:1026 ../../mod/editpost.php:129
     msgid "Please wait"
     msgstr "Espere por favor"
     
    @@ -2409,8 +2379,8 @@ msgstr "a %s no le gusta esto."
     msgid "Visible to everybody"
     msgstr "Visible para cualquiera"
     
    -#: ../../include/conversation.php:1155 ../../mod/mail.php:194
    -#: ../../mod/mail.php:308
    +#: ../../include/conversation.php:1155 ../../mod/mail.php:202
    +#: ../../mod/mail.php:316
     msgid "Please enter a link URL:"
     msgstr "Por favor, introduzca la dirección del enlace:"
     
    @@ -2435,21 +2405,21 @@ msgid "Where are you right now?"
     msgstr "¿Donde está ahora?"
     
     #: ../../include/conversation.php:1161 ../../mod/editpost.php:56
    -#: ../../mod/mail.php:195 ../../mod/mail.php:309
    +#: ../../mod/mail.php:203 ../../mod/mail.php:317
     msgid "Expires YYYY-MM-DD HH:MM"
     msgstr "Caduca YYYY-MM-DD HH:MM"
     
     #: ../../include/conversation.php:1169 ../../include/page_widgets.php:40
     #: ../../include/ItemObject.php:706 ../../mod/editwebpage.php:212
    -#: ../../mod/photos.php:1049 ../../mod/editblock.php:171
    -#: ../../mod/webpages.php:188 ../../mod/editpost.php:149
    +#: ../../mod/editblock.php:171 ../../mod/webpages.php:188
    +#: ../../mod/photos.php:1046 ../../mod/editpost.php:149
     #: ../../mod/events.php:458
     msgid "Preview"
     msgstr "Previsualizar"
     
     #: ../../include/conversation.php:1192 ../../mod/blocks.php:154
    -#: ../../mod/photos.php:1028 ../../mod/webpages.php:182
    -#: ../../mod/layouts.php:184
    +#: ../../mod/webpages.php:182 ../../mod/layouts.php:184
    +#: ../../mod/photos.php:1025
     msgid "Share"
     msgstr "Compartir"
     
    @@ -2503,7 +2473,7 @@ msgstr "subir foto"
     
     #: ../../include/conversation.php:1206 ../../mod/editwebpage.php:183
     #: ../../mod/editblock.php:143 ../../mod/editlayout.php:141
    -#: ../../mod/editpost.php:119 ../../mod/mail.php:240 ../../mod/mail.php:370
    +#: ../../mod/editpost.php:119 ../../mod/mail.php:248 ../../mod/mail.php:378
     msgid "Attach file"
     msgstr "Adjuntar fichero"
     
    @@ -2513,7 +2483,7 @@ msgstr "adjuntar fichero"
     
     #: ../../include/conversation.php:1208 ../../mod/editwebpage.php:184
     #: ../../mod/editblock.php:144 ../../mod/editlayout.php:142
    -#: ../../mod/editpost.php:120 ../../mod/mail.php:241 ../../mod/mail.php:371
    +#: ../../mod/editpost.php:120 ../../mod/mail.php:249 ../../mod/mail.php:379
     msgid "Insert web link"
     msgstr "Insertar enlace web"
     
    @@ -2596,7 +2566,7 @@ msgstr "Ejemplo: roberto@ejemplo.com, maría@ejemplo.com"
     
     #: ../../include/conversation.php:1252 ../../mod/editwebpage.php:217
     #: ../../mod/editblock.php:176 ../../mod/editlayout.php:173
    -#: ../../mod/editpost.php:155 ../../mod/mail.php:245 ../../mod/mail.php:375
    +#: ../../mod/editpost.php:155 ../../mod/mail.php:253 ../../mod/mail.php:383
     msgid "Set expiration date"
     msgstr "Configurar fecha de caducidad"
     
    @@ -2605,7 +2575,7 @@ msgid "Set publish date"
     msgstr "Establecer la fecha de publicación"
     
     #: ../../include/conversation.php:1257 ../../include/ItemObject.php:709
    -#: ../../mod/editpost.php:157 ../../mod/mail.php:247 ../../mod/mail.php:377
    +#: ../../mod/editpost.php:157 ../../mod/mail.php:255 ../../mod/mail.php:385
     msgid "Encrypt text"
     msgstr "Cifrar texto"
     
    @@ -2613,8 +2583,8 @@ msgstr "Cifrar texto"
     msgid "OK"
     msgstr "OK"
     
    -#: ../../include/conversation.php:1260 ../../mod/fbrowser.php:82
    -#: ../../mod/fbrowser.php:117 ../../mod/tagrm.php:11 ../../mod/tagrm.php:134
    +#: ../../include/conversation.php:1260 ../../mod/fbrowser.php:77
    +#: ../../mod/fbrowser.php:112 ../../mod/tagrm.php:11 ../../mod/tagrm.php:134
     #: ../../mod/settings.php:587 ../../mod/settings.php:613
     #: ../../mod/editpost.php:160
     msgid "Cancel"
    @@ -2626,7 +2596,7 @@ msgstr "Descubrir"
     
     #: ../../include/conversation.php:1506
     msgid "Imported public streams"
    -msgstr "Flujos públicos importados"
    +msgstr "Contenidos públicos importados"
     
     #: ../../include/conversation.php:1511
     msgid "Commented Order"
    @@ -2655,7 +2625,7 @@ msgstr "Nuevas"
     
     #: ../../include/conversation.php:1538
     msgid "Activity Stream - by date"
    -msgstr "Flujo de actividad - por fecha"
    +msgstr "Contenido - por fecha"
     
     #: ../../include/conversation.php:1544
     msgid "Starred"
    @@ -2673,7 +2643,7 @@ msgstr "Correo basura"
     msgid "Posts flagged as SPAM"
     msgstr "Publicaciones marcadas como basura"
     
    -#: ../../include/conversation.php:1601 ../../mod/admin.php:973
    +#: ../../include/conversation.php:1601 ../../mod/admin.php:980
     msgid "Channel"
     msgstr "Canal"
     
    @@ -2725,13 +2695,13 @@ msgid "Manage Webpages"
     msgstr "Administrar páginas web"
     
     #: ../../include/conversation.php:1697 ../../include/ItemObject.php:175
    -#: ../../include/ItemObject.php:187 ../../mod/photos.php:1082
    -#: ../../mod/photos.php:1094
    +#: ../../include/ItemObject.php:187 ../../mod/photos.php:1079
    +#: ../../mod/photos.php:1091
     msgid "View all"
     msgstr "Ver todo"
     
     #: ../../include/conversation.php:1724 ../../include/ItemObject.php:184
    -#: ../../mod/photos.php:1091
    +#: ../../mod/photos.php:1088
     msgctxt "noun"
     msgid "Dislike"
     msgid_plural "Dislikes"
    @@ -2829,7 +2799,7 @@ msgid "RSS/Atom"
     msgstr "RSS/Atom"
     
     #: ../../include/contact_selectors.php:79 ../../mod/id.php:15
    -#: ../../mod/id.php:16 ../../mod/admin.php:805 ../../mod/admin.php:814
    +#: ../../mod/id.php:16 ../../mod/admin.php:812 ../../mod/admin.php:821
     #: ../../boot.php:1483
     msgid "Email"
     msgstr "Correo electrónico"
    @@ -2907,7 +2877,7 @@ msgstr "%1$s escribió la siguiente %2$s %3$s"
     
     #: ../../include/bbcode.php:259 ../../mod/tagger.php:51
     msgid "post"
    -msgstr "entrada"
    +msgstr "la entrada"
     
     #: ../../include/bbcode.php:547
     msgid "Different viewers will see this text differently"
    @@ -2928,7 +2898,7 @@ msgid_plural "%d invitations available"
     msgstr[0] "%d invitación pendiente"
     msgstr[1] "%d invitaciones disponibles"
     
    -#: ../../include/contact_widgets.php:19 ../../mod/admin.php:439
    +#: ../../include/contact_widgets.php:19 ../../mod/admin.php:446
     msgid "Advanced"
     msgstr "Avanzado"
     
    @@ -2981,6 +2951,23 @@ msgstr[1] "%d conexiones en común"
     msgid "show more"
     msgstr "mostrar más"
     
    +#: ../../include/enotify.php:57 ../../include/network.php:1608
    +msgid "$Projectname Notification"
    +msgstr "Notificación de $Projectname"
    +
    +#: ../../include/enotify.php:58 ../../include/network.php:1609
    +msgid "$projectname"
    +msgstr "$projectname"
    +
    +#: ../../include/enotify.php:60 ../../include/network.php:1611
    +msgid "Thank You,"
    +msgstr "Gracias,"
    +
    +#: ../../include/enotify.php:62 ../../include/network.php:1613
    +#, php-format
    +msgid "%s Administrator"
    +msgstr "%s Administrador"
    +
     #: ../../include/enotify.php:96
     #, php-format
     msgid "%s "
    @@ -3176,19 +3163,19 @@ msgstr "Respuesta incompleta del canal."
     msgid "Channel was deleted and no longer exists."
     msgstr "El canal ha sido eliminado y ya no existe."
     
    -#: ../../include/follow.php:152 ../../include/follow.php:180
    +#: ../../include/follow.php:152 ../../include/follow.php:181
     msgid "Protocol disabled."
     msgstr "Protocolo deshabilitado."
     
    -#: ../../include/follow.php:170
    +#: ../../include/follow.php:171
     msgid "Channel discovery failed."
     msgstr "El intento de acceder al canal ha fallado."
     
    -#: ../../include/follow.php:196
    +#: ../../include/follow.php:197
     msgid "local account not found."
     msgstr "No se ha encontrado la cuenta local."
     
    -#: ../../include/follow.php:220
    +#: ../../include/follow.php:221
     msgid "Cannot connect to yourself."
     msgstr "No puede conectarse consigo mismo."
     
    @@ -3492,7 +3479,7 @@ msgstr "un \"ping\""
     
     #: ../../include/text.php:955
     msgid "pinged"
    -msgstr "avisado/a"
    +msgstr "ha enviado un \"ping\" a"
     
     #: ../../include/text.php:956
     msgid "prod"
    @@ -3500,7 +3487,7 @@ msgstr "una incitación"
     
     #: ../../include/text.php:956
     msgid "prodded"
    -msgstr "ha recibido una incitación"
    +msgstr "ha incitado a"
     
     #: ../../include/text.php:957
     msgid "slap"
    @@ -3508,7 +3495,7 @@ msgstr "una bofetada"
     
     #: ../../include/text.php:957
     msgid "slapped"
    -msgstr "ha recibido una bofetada"
    +msgstr "ha enviado una bofetada a"
     
     #: ../../include/text.php:958
     msgid "finger"
    @@ -3516,7 +3503,7 @@ msgstr "un \"finger\""
     
     #: ../../include/text.php:958
     msgid "fingered"
    -msgstr "ha recibido un \"finger\""
    +msgstr "ha enviado un \"finger\" a"
     
     #: ../../include/text.php:959
     msgid "rebuff"
    @@ -3524,7 +3511,7 @@ msgstr "un rechazo"
     
     #: ../../include/text.php:959
     msgid "rebuffed"
    -msgstr "ha sido rechazado/a"
    +msgstr "ha enviado un rechazo a"
     
     #: ../../include/text.php:969
     msgid "happy"
    @@ -3544,7 +3531,7 @@ msgstr "cansado/a"
     
     #: ../../include/text.php:973
     msgid "perky"
    -msgstr "fresco/a"
    +msgstr "vivaz"
     
     #: ../../include/text.php:974
     msgid "angry"
    @@ -3572,7 +3559,7 @@ msgstr "alegre"
     
     #: ../../include/text.php:980
     msgid "alive"
    -msgstr "vivo/a"
    +msgstr "animado/a"
     
     #: ../../include/text.php:981
     msgid "annoyed"
    @@ -3694,7 +3681,7 @@ msgstr "Modo seguro"
     #: ../../include/dir_fns.php:143 ../../mod/filestorage.php:151
     #: ../../mod/filestorage.php:159 ../../mod/removeme.php:60
     #: ../../mod/connedit.php:635 ../../mod/connedit.php:684 ../../mod/api.php:106
    -#: ../../mod/photos.php:626 ../../mod/admin.php:410 ../../mod/settings.php:577
    +#: ../../mod/admin.php:410 ../../mod/settings.php:577 ../../mod/photos.php:626
     #: ../../mod/menu.php:96 ../../mod/menu.php:153 ../../mod/events.php:447
     #: ../../mod/events.php:448 ../../mod/events.php:457 ../../mod/mitem.php:154
     #: ../../mod/mitem.php:155 ../../mod/mitem.php:228 ../../mod/mitem.php:229
    @@ -3706,8 +3693,8 @@ msgstr "No"
     #: ../../include/dir_fns.php:141 ../../include/dir_fns.php:142
     #: ../../include/dir_fns.php:143 ../../mod/filestorage.php:151
     #: ../../mod/filestorage.php:159 ../../mod/removeme.php:60
    -#: ../../mod/api.php:105 ../../mod/photos.php:626 ../../mod/admin.php:412
    -#: ../../mod/settings.php:577 ../../mod/menu.php:96 ../../mod/menu.php:153
    +#: ../../mod/api.php:105 ../../mod/admin.php:412 ../../mod/settings.php:577
    +#: ../../mod/photos.php:626 ../../mod/menu.php:96 ../../mod/menu.php:153
     #: ../../mod/events.php:447 ../../mod/events.php:448 ../../mod/events.php:457
     #: ../../mod/mitem.php:154 ../../mod/mitem.php:155 ../../mod/mitem.php:228
     #: ../../mod/mitem.php:229 ../../view/theme/redbasic/php/config.php:104
    @@ -3734,7 +3721,7 @@ msgstr "Un grupo suprimido con este nombre ha sido restablecido. Es posi
     msgid "Add new connections to this collection (privacy group)"
     msgstr "Añadir nuevas conexiones a esta colección (privacidad del grupo)"
     
    -#: ../../include/group.php:251 ../../mod/admin.php:814
    +#: ../../include/group.php:251 ../../mod/admin.php:821
     msgid "All Channels"
     msgstr "Todos los canales"
     
    @@ -3766,12 +3753,12 @@ msgstr "Paquete de datos no válido"
     msgid "Unable to verify channel signature"
     msgstr "No ha sido posible de verificar la firma del canal"
     
    -#: ../../include/zot.php:2259
    +#: ../../include/zot.php:2275
     #, php-format
     msgid "Unable to verify site signature for %s"
     msgstr "No ha sido posible de verificar la firma del sitio para %s"
     
    -#: ../../include/zot.php:3586
    +#: ../../include/zot.php:3601
     msgid "invalid target signature"
     msgstr "La firma recibida no es válida"
     
    @@ -3806,6 +3793,19 @@ msgstr "Creado"
     msgid "Edited"
     msgstr "Editado"
     
    +#: ../../include/network.php:630
    +msgid "view full size"
    +msgstr "Ver en el tamaño original"
    +
    +#: ../../include/network.php:1655 ../../include/account.php:316
    +#: ../../include/account.php:343 ../../include/account.php:403
    +msgid "Administrator"
    +msgstr "Administrador"
    +
    +#: ../../include/network.php:1669
    +msgid "No Subject"
    +msgstr "Sin asunto"
    +
     #: ../../include/dba/dba_driver.php:141
     #, php-format
     msgid "Cannot locate DNS info for database server '%s'"
    @@ -3880,11 +3880,11 @@ msgstr "preferidas"
     msgid "Add Tag"
     msgstr "Añadir etiqueta"
     
    -#: ../../include/ItemObject.php:254 ../../mod/photos.php:1026
    +#: ../../include/ItemObject.php:254 ../../mod/photos.php:1023
     msgid "I like this (toggle)"
     msgstr "me gusta (cambiar)"
     
    -#: ../../include/ItemObject.php:255 ../../mod/photos.php:1027
    +#: ../../include/ItemObject.php:255 ../../mod/photos.php:1024
     msgid "I don't like this (toggle)"
     msgstr "No me gusta esto (cambiar)"
     
    @@ -3940,18 +3940,18 @@ msgstr "Añadir al calendario"
     msgid "Mark all seen"
     msgstr "Marcar todo como visto"
     
    -#: ../../include/ItemObject.php:378 ../../mod/photos.php:1212
    +#: ../../include/ItemObject.php:378 ../../mod/photos.php:1209
     msgctxt "noun"
     msgid "Likes"
     msgstr "Me gusta"
     
    -#: ../../include/ItemObject.php:379 ../../mod/photos.php:1213
    +#: ../../include/ItemObject.php:379 ../../mod/photos.php:1210
     msgctxt "noun"
     msgid "Dislikes"
     msgstr "No me gusta"
     
    -#: ../../include/ItemObject.php:694 ../../mod/photos.php:1045
    -#: ../../mod/photos.php:1163
    +#: ../../include/ItemObject.php:694 ../../mod/photos.php:1042
    +#: ../../mod/photos.php:1160
     msgid "This is you"
     msgstr "Este es usted"
     
    @@ -3967,78 +3967,6 @@ msgstr "Insertar enlace"
     msgid "Video"
     msgstr "Vídeo"
     
    -#: ../../include/account.php:27
    -msgid "Not a valid email address"
    -msgstr "Dirección de correo no válida"
    -
    -#: ../../include/account.php:29
    -msgid "Your email domain is not among those allowed on this site"
    -msgstr "Su dirección de correo no pertenece a ninguno de los dominios permitidos en este sitio."
    -
    -#: ../../include/account.php:35
    -msgid "Your email address is already registered at this site."
    -msgstr "Su dirección de correo está ya registrada en este sitio."
    -
    -#: ../../include/account.php:67
    -msgid "An invitation is required."
    -msgstr "Es obligatorio que le inviten."
    -
    -#: ../../include/account.php:71
    -msgid "Invitation could not be verified."
    -msgstr "No se ha podido verificar su invitación."
    -
    -#: ../../include/account.php:121
    -msgid "Please enter the required information."
    -msgstr "Por favor introduzca la información requerida."
    -
    -#: ../../include/account.php:188
    -msgid "Failed to store account information."
    -msgstr "La información de la cuenta no se ha podido guardar."
    -
    -#: ../../include/account.php:248
    -#, php-format
    -msgid "Registration confirmation for %s"
    -msgstr "Confirmación de registro para %s"
    -
    -#: ../../include/account.php:314
    -#, php-format
    -msgid "Registration request at %s"
    -msgstr "Solicitud de registro en %s"
    -
    -#: ../../include/account.php:338
    -msgid "your registration password"
    -msgstr "su contraseña de registro"
    -
    -#: ../../include/account.php:341 ../../include/account.php:401
    -#, php-format
    -msgid "Registration details for %s"
    -msgstr "Detalles del registro de %s"
    -
    -#: ../../include/account.php:410
    -msgid "Account approved."
    -msgstr "Cuenta aprobada."
    -
    -#: ../../include/account.php:449
    -#, php-format
    -msgid "Registration revoked for %s"
    -msgstr "Registro revocado para %s"
    -
    -#: ../../include/account.php:494
    -msgid "Account verified. Please login."
    -msgstr "Cuenta verificada. Por favor, inicie sesión."
    -
    -#: ../../include/account.php:707 ../../include/account.php:709
    -msgid "Click here to upgrade."
    -msgstr "Pulse aquí para actualizar"
    -
    -#: ../../include/account.php:715
    -msgid "This action exceeds the limits set by your subscription plan."
    -msgstr "Esta acción supera los límites establecidos por su plan de suscripción "
    -
    -#: ../../include/account.php:720
    -msgid "This action is not available under your subscription plan."
    -msgstr "Esta acción no está disponible en su plan de suscripción."
    -
     #: ../../include/apps.php:128
     msgid "Site Admin"
     msgstr "Adminstrador del sitio"
    @@ -4099,7 +4027,7 @@ msgstr "Comprar"
     
     #: ../../include/permissions.php:26
     msgid "Can view my normal stream and posts"
    -msgstr "Pueden verse mi flujo de actividad y publicaciones normales"
    +msgstr "Pueden verse mi actividad y publicaciones normales"
     
     #: ../../include/permissions.php:27
     msgid "Can view my default channel profile"
    @@ -4119,7 +4047,7 @@ msgstr "Pueden verse mis páginas web"
     
     #: ../../include/permissions.php:33
     msgid "Can send me their channel stream and posts"
    -msgstr "Me pueden enviar sus entradas y flujo de actividad del canal"
    +msgstr "Me pueden enviar sus entradas y contenidos del canal"
     
     #: ../../include/permissions.php:34
     msgid "Can post on my channel page (\"wall\")"
    @@ -4220,12 +4148,84 @@ msgstr "Repositorio de grupo"
     msgid "Custom/Expert Mode"
     msgstr "Modo personalizado/experto"
     
    -#: ../../include/photo/photo_driver.php:719 ../../mod/photos.php:94
    -#: ../../mod/photos.php:699 ../../mod/profile_photo.php:147
    +#: ../../include/photo/photo_driver.php:719 ../../mod/profile_photo.php:147
     #: ../../mod/profile_photo.php:239 ../../mod/profile_photo.php:379
    +#: ../../mod/photos.php:94 ../../mod/photos.php:699
     msgid "Profile Photos"
     msgstr "Fotos del perfil"
     
    +#: ../../include/account.php:27
    +msgid "Not a valid email address"
    +msgstr "Dirección de correo no válida"
    +
    +#: ../../include/account.php:29
    +msgid "Your email domain is not among those allowed on this site"
    +msgstr "Su dirección de correo no pertenece a ninguno de los dominios permitidos en este sitio."
    +
    +#: ../../include/account.php:35
    +msgid "Your email address is already registered at this site."
    +msgstr "Su dirección de correo está ya registrada en este sitio."
    +
    +#: ../../include/account.php:67
    +msgid "An invitation is required."
    +msgstr "Es obligatorio que le inviten."
    +
    +#: ../../include/account.php:71
    +msgid "Invitation could not be verified."
    +msgstr "No se ha podido verificar su invitación."
    +
    +#: ../../include/account.php:121
    +msgid "Please enter the required information."
    +msgstr "Por favor introduzca la información requerida."
    +
    +#: ../../include/account.php:188
    +msgid "Failed to store account information."
    +msgstr "La información de la cuenta no se ha podido guardar."
    +
    +#: ../../include/account.php:248
    +#, php-format
    +msgid "Registration confirmation for %s"
    +msgstr "Confirmación de registro para %s"
    +
    +#: ../../include/account.php:314
    +#, php-format
    +msgid "Registration request at %s"
    +msgstr "Solicitud de registro en %s"
    +
    +#: ../../include/account.php:338
    +msgid "your registration password"
    +msgstr "su contraseña de registro"
    +
    +#: ../../include/account.php:341 ../../include/account.php:401
    +#, php-format
    +msgid "Registration details for %s"
    +msgstr "Detalles del registro de %s"
    +
    +#: ../../include/account.php:410
    +msgid "Account approved."
    +msgstr "Cuenta aprobada."
    +
    +#: ../../include/account.php:449
    +#, php-format
    +msgid "Registration revoked for %s"
    +msgstr "Registro revocado para %s"
    +
    +#: ../../include/account.php:494
    +msgid "Account verified. Please login."
    +msgstr "Cuenta verificada. Por favor, inicie sesión."
    +
    +#: ../../include/account.php:707 ../../include/account.php:709
    +msgid "Click here to upgrade."
    +msgstr "Pulse aquí para actualizar"
    +
    +#: ../../include/account.php:715
    +msgid "This action exceeds the limits set by your subscription plan."
    +msgstr "Esta acción supera los límites establecidos por su plan de suscripción "
    +
    +#: ../../include/account.php:720
    +msgid "This action is not available under your subscription plan."
    +msgstr "Esta acción no está disponible en su plan de suscripción."
    +
     #: ../../mod/filestorage.php:82
     msgid "Permission Denied."
     msgstr "Permiso denegado"
    @@ -4427,7 +4427,8 @@ msgstr "No se han encontrado perfiles compatibles"
     msgid "OpenID protocol error. No ID returned."
     msgstr "Error del protocolo OpenID. Ningún ID recibido como respuesta."
     
    -#: ../../mod/openid.php:72 ../../mod/openid.php:179 ../../mod/post.php:285
    +#: ../../mod/openid.php:72 ../../mod/openid.php:179
    +#: ../../Zotlabs/Zot/Auth.php:248
     #, php-format
     msgid "Welcome %s. Remote authentication successful."
     msgstr "Bienvenido %s. La identificación desde su servidor se ha llevado a cabo correctamente."
    @@ -4833,7 +4834,7 @@ msgstr "Por favor, lea el fichero \"install/INSTALL.txt\"."
     msgid "System check"
     msgstr "Verificación del sistema"
     
    -#: ../../mod/setup.php:285 ../../mod/photos.php:914 ../../mod/events.php:653
    +#: ../../mod/setup.php:285 ../../mod/photos.php:911 ../../mod/events.php:653
     #: ../../mod/events.php:660
     msgid "Next"
     msgstr "Siguiente"
    @@ -5222,15 +5223,6 @@ msgstr "Mis marcadores"
     msgid "My Connections Bookmarks"
     msgstr "Marcadores de mis conexiones"
     
    -#: ../../mod/home.php:57 ../../mod/home.php:65 ../../mod/siteinfo.php:61
    -msgid "$Projectname"
    -msgstr "$Projectname"
    -
    -#: ../../mod/home.php:75
    -#, php-format
    -msgid "Welcome to %s"
    -msgstr "Bienvenido a %s"
    -
     #: ../../mod/pconfig.php:27 ../../mod/pconfig.php:60
     msgid "This setting requires special processing and editing has been blocked."
     msgstr "Este ajuste necesita de un proceso especial y la edición ha sido bloqueada."
    @@ -5335,7 +5327,7 @@ msgstr "Página personal"
     msgid "Interests"
     msgstr "Intereses"
     
    -#: ../../mod/profiles.php:457 ../../mod/admin.php:974
    +#: ../../mod/profiles.php:457 ../../mod/admin.php:981
     msgid "Address"
     msgstr "Dirección"
     
    @@ -5588,11 +5580,11 @@ msgstr "Actividad reciente"
     msgid "View recent posts and comments"
     msgstr "Ver publicaciones y comentarios recientes"
     
    -#: ../../mod/connedit.php:519 ../../mod/admin.php:811
    +#: ../../mod/connedit.php:519 ../../mod/admin.php:818
     msgid "Unblock"
     msgstr "Desbloquear"
     
    -#: ../../mod/connedit.php:519 ../../mod/admin.php:810
    +#: ../../mod/connedit.php:519 ../../mod/admin.php:817
     msgid "Block"
     msgstr "Bloquear"
     
    @@ -5748,7 +5740,7 @@ msgid ""
     " communication."
     msgstr "(%s) desearía conectar con usted. por favor, apruebe esta conexión para permitir la comunicación."
     
    -#: ../../mod/connedit.php:710 ../../mod/admin.php:807
    +#: ../../mod/connedit.php:710 ../../mod/admin.php:814
     msgid "Approve"
     msgstr "Aprobar"
     
    @@ -6062,7 +6054,7 @@ msgstr "Eliminar etiqueta del elemento."
     msgid "Select a tag to remove: "
     msgstr "Seleccionar una etiqueta para eliminar:"
     
    -#: ../../mod/tagrm.php:133 ../../mod/photos.php:954
    +#: ../../mod/tagrm.php:133 ../../mod/photos.php:951
     msgid "Remove"
     msgstr "Eliminar"
     
    @@ -6331,156 +6323,75 @@ msgid ""
     "only once and leave this page open until finished."
     msgstr "Este proceso puede tardar varios minutos en completarse. Por favor envíe el formulario una sola vez y mantenga esta página abierta hasta que termine."
     
    -#: ../../mod/photos.php:79
    -msgid "Page owner information could not be retrieved."
    -msgstr "La información del propietario de la página no pudo ser recuperada."
    -
    -#: ../../mod/photos.php:100
    -msgid "Album not found."
    -msgstr "Álbum no encontrado."
    -
    -#: ../../mod/photos.php:127
    -msgid "Delete Album"
    -msgstr "Borrar álbum"
    +#: ../../mod/invite.php:25
    +msgid "Total invitation limit exceeded."
    +msgstr "Se ha superado el límite máximo de invitaciones."
     
    -#: ../../mod/photos.php:171 ../../mod/photos.php:1009
    -msgid "Delete Photo"
    -msgstr "Borrar foto"
    +#: ../../mod/invite.php:49
    +#, php-format
    +msgid "%s : Not a valid email address."
    +msgstr "%s : No es una dirección de correo electrónico válida. "
     
    -#: ../../mod/photos.php:501
    -msgid "No photos selected"
    -msgstr "No hay fotos seleccionadas"
    +#: ../../mod/invite.php:59
    +msgid "Please join us on $Projectname"
    +msgstr "Únase a nosotros en $Projectname"
     
    -#: ../../mod/photos.php:550
    -msgid "Access to this item is restricted."
    -msgstr "El acceso a este elemento está restringido."
    +#: ../../mod/invite.php:70
    +msgid "Invitation limit exceeded. Please contact your site administrator."
    +msgstr "Excedido el límite de invitaciones. Por favor, contacte con el Administrador de su sitio."
     
    -#: ../../mod/photos.php:589
    +#: ../../mod/invite.php:75
     #, php-format
    -msgid "%1$.2f MB of %2$.2f MB photo storage used."
    -msgstr "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado."
    +msgid "%s : Message delivery failed."
    +msgstr "%s : Falló el envío del mensaje."
     
    -#: ../../mod/photos.php:592
    +#: ../../mod/invite.php:79
     #, php-format
    -msgid "%1$.2f MB photo storage used."
    -msgstr "%1$.2f MB de almacenamiento de fotos utilizado."
    -
    -#: ../../mod/photos.php:620
    -msgid "Upload Photos"
    -msgstr "Subir fotos"
    -
    -#: ../../mod/photos.php:624
    -msgid "Enter an album name"
    -msgstr "Introducir un nombre de álbum"
    -
    -#: ../../mod/photos.php:625
    -msgid "or select an existing album (doubleclick)"
    -msgstr "o seleccionar uno existente (doble click)"
    -
    -#: ../../mod/photos.php:626
    -msgid "Create a status post for this upload"
    -msgstr "Crear una entrada de estado para esta subida"
    -
    -#: ../../mod/photos.php:627
    -msgid "Caption (optional):"
    -msgstr "Título (opcional):"
    -
    -#: ../../mod/photos.php:628
    -msgid "Description (optional):"
    -msgstr "Descripción (opcional):"
    -
    -#: ../../mod/photos.php:655
    -msgid "Album name could not be decoded"
    -msgstr "El nombre del álbum no ha podido ser descifrado"
    -
    -#: ../../mod/photos.php:699 ../../mod/photos.php:1236
    -#: ../../mod/photos.php:1253
    -msgid "Contact Photos"
    -msgstr "Fotos de contacto"
    -
    -#: ../../mod/photos.php:727
    -msgid "Show Newest First"
    -msgstr "Mostrar lo más reciente primero"
    -
    -#: ../../mod/photos.php:729
    -msgid "Show Oldest First"
    -msgstr "Mostrar lo más antiguo primero"
    -
    -#: ../../mod/photos.php:827
    -msgid "Permission denied. Access to this item may be restricted."
    -msgstr "Permiso denegado. El acceso a este elemento puede estar restringido."
    -
    -#: ../../mod/photos.php:829
    -msgid "Photo not available"
    -msgstr "Foto no disponible"
    -
    -#: ../../mod/photos.php:887
    -msgid "Use as profile photo"
    -msgstr "Usar como foto del perfil"
    -
    -#: ../../mod/photos.php:894
    -msgid "Private Photo"
    -msgstr "Foto privada"
    -
    -#: ../../mod/photos.php:905 ../../mod/events.php:652 ../../mod/events.php:659
    -msgid "Previous"
    -msgstr "Anterior"
    -
    -#: ../../mod/photos.php:909
    -msgid "View Full Size"
    -msgstr "Ver tamaño completo"
    -
    -#: ../../mod/photos.php:988
    -msgid "Edit photo"
    -msgstr "Editar foto"
    -
    -#: ../../mod/photos.php:990
    -msgid "Rotate CW (right)"
    -msgstr "Girar CW (a la derecha)"
    -
    -#: ../../mod/photos.php:991
    -msgid "Rotate CCW (left)"
    -msgstr "Girar CCW (a la izquierda)"
    +msgid "%d message sent."
    +msgid_plural "%d messages sent."
    +msgstr[0] "%d mensajes enviados."
    +msgstr[1] "%d mensajes enviados."
     
    -#: ../../mod/photos.php:994
    -msgid "Enter a new album name"
    -msgstr "Introducir un nuevo nombre de álbum"
    +#: ../../mod/invite.php:98
    +msgid "You have no more invitations available"
    +msgstr "No tiene más invitaciones disponibles"
     
    -#: ../../mod/photos.php:995
    -msgid "or select an existing one (doubleclick)"
    -msgstr "o seleccionar uno (doble click) existente"
    +#: ../../mod/invite.php:129
    +msgid "Send invitations"
    +msgstr "Enviar invitaciones"
     
    -#: ../../mod/photos.php:998
    -msgid "Caption"
    -msgstr "Título"
    +#: ../../mod/invite.php:130
    +msgid "Enter email addresses, one per line:"
    +msgstr "Introduzca las direcciones de correo electrónico, una por línea:"
     
    -#: ../../mod/photos.php:1000
    -msgid "Add a Tag"
    -msgstr "Añadir una etiqueta"
    +#: ../../mod/invite.php:131 ../../mod/mail.php:246
    +msgid "Your message:"
    +msgstr "Su mensaje:"
     
    -#: ../../mod/photos.php:1004
    -msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
    -msgstr "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com"
    +#: ../../mod/invite.php:132
    +msgid "Please join my community on $Projectname."
    +msgstr "Por favor, únase a mi comunidad en $Projectname."
     
    -#: ../../mod/photos.php:1007
    -msgid "Flag as adult in album view"
    -msgstr "Marcar como \"solo para adultos\" en el álbum"
    +#: ../../mod/invite.php:134
    +msgid "You will need to supply this invitation code: "
    +msgstr "Debe proporcionar este código de invitación:"
     
    -#: ../../mod/photos.php:1199
    -msgid "In This Photo:"
    -msgstr "En esta foto:"
    +#: ../../mod/invite.php:135
    +msgid ""
    +"1. Register at any $Projectname location (they are all inter-connected)"
    +msgstr "1. Regístrese en cualquier sitio de $Projectname (están todos interconectados)"
     
    -#: ../../mod/photos.php:1204
    -msgid "Map"
    -msgstr "Mapa"
    +#: ../../mod/invite.php:137
    +msgid "2. Enter my $Projectname network address into the site searchbar."
    +msgstr "2. Introduzca mi dirección $Projectname en la caja de búsqueda del sitio."
     
    -#: ../../mod/photos.php:1292
    -msgid "View Album"
    -msgstr "Ver álbum"
    +#: ../../mod/invite.php:138
    +msgid "or visit "
    +msgstr "o visite "
     
    -#: ../../mod/photos.php:1315
    -msgid "Recent Photos"
    -msgstr "Fotos recientes"
    +#: ../../mod/invite.php:140
    +msgid "3. Click [Connect]"
    +msgstr "3. Pulse [conectar]"
     
     #: ../../mod/probe.php:24 ../../mod/probe.php:30
     #, php-format
    @@ -6793,7 +6704,7 @@ msgstr "Acepto los %s de este sitio"
     msgid "I am over 13 years of age and accept the %s for this website"
     msgstr "Tengo más de 13 años de edad y acepto los %s de este sitio"
     
    -#: ../../mod/register.php:207 ../../mod/admin.php:436
    +#: ../../mod/register.php:207 ../../mod/admin.php:443
     msgid "Registration"
     msgstr "Registro"
     
    @@ -6853,10 +6764,10 @@ msgstr "# clones"
     msgid "Message queues"
     msgstr "Mensajes en cola"
     
    -#: ../../mod/admin.php:198 ../../mod/admin.php:433 ../../mod/admin.php:532
    -#: ../../mod/admin.php:800 ../../mod/admin.php:964 ../../mod/admin.php:1061
    -#: ../../mod/admin.php:1101 ../../mod/admin.php:1261 ../../mod/admin.php:1295
    -#: ../../mod/admin.php:1380
    +#: ../../mod/admin.php:198 ../../mod/admin.php:440 ../../mod/admin.php:539
    +#: ../../mod/admin.php:807 ../../mod/admin.php:971 ../../mod/admin.php:1068
    +#: ../../mod/admin.php:1108 ../../mod/admin.php:1268 ../../mod/admin.php:1302
    +#: ../../mod/admin.php:1387
     msgid "Administration"
     msgstr "Administración"
     
    @@ -6868,7 +6779,7 @@ msgstr "Sumario"
     msgid "Registered accounts"
     msgstr "Cuentas registradas"
     
    -#: ../../mod/admin.php:203 ../../mod/admin.php:536
    +#: ../../mod/admin.php:203 ../../mod/admin.php:543
     msgid "Pending registrations"
     msgstr "Registros pendientes"
     
    @@ -6876,7 +6787,7 @@ msgstr "Registros pendientes"
     msgid "Registered channels"
     msgstr "Canales registrados"
     
    -#: ../../mod/admin.php:205 ../../mod/admin.php:537
    +#: ../../mod/admin.php:205 ../../mod/admin.php:544
     msgid "Active plugins"
     msgstr "Extensiones activas"
     
    @@ -6920,638 +6831,638 @@ msgstr "Mi sitio es un servicio gratuito"
     msgid "My site offers free accounts with optional paid upgrades"
     msgstr "Mi sitio ofrece cuentas gratuitas con opciones extra de pago"
     
    -#: ../../mod/admin.php:437
    +#: ../../mod/admin.php:444
     msgid "File upload"
     msgstr "Fichero subido"
     
    -#: ../../mod/admin.php:438
    +#: ../../mod/admin.php:445
     msgid "Policies"
     msgstr "Políticas"
     
    -#: ../../mod/admin.php:443
    +#: ../../mod/admin.php:450
     msgid "Site name"
     msgstr "Nombre del sitio"
     
    -#: ../../mod/admin.php:444
    +#: ../../mod/admin.php:451
     msgid "Banner/Logo"
     msgstr "Banner/Logo"
     
    -#: ../../mod/admin.php:445
    +#: ../../mod/admin.php:452
     msgid "Administrator Information"
     msgstr "Información del Administrador"
     
    -#: ../../mod/admin.php:445
    +#: ../../mod/admin.php:452
     msgid ""
     "Contact information for site administrators.  Displayed on siteinfo page.  "
     "BBCode can be used here"
     msgstr "Información de contacto de los administradores del sitio. Visible en la página \"siteinfo\". Se puede usar BBCode"
     
    -#: ../../mod/admin.php:446
    +#: ../../mod/admin.php:453
     msgid "System language"
     msgstr "Idioma del sistema"
     
    -#: ../../mod/admin.php:447
    +#: ../../mod/admin.php:454
     msgid "System theme"
     msgstr "Tema gráfico del sistema"
     
    -#: ../../mod/admin.php:447
    +#: ../../mod/admin.php:454
     msgid ""
     "Default system theme - may be over-ridden by user profiles - change theme settings"
     msgstr "Tema del sistema por defecto - se puede cambiar por cada perfil de usuario - modificar los ajustes del tema"
     
    -#: ../../mod/admin.php:448
    +#: ../../mod/admin.php:455
     msgid "Mobile system theme"
     msgstr "Tema del sistema para móviles"
     
    -#: ../../mod/admin.php:448
    +#: ../../mod/admin.php:455
     msgid "Theme for mobile devices"
     msgstr "Tema para dispositivos móviles"
     
    -#: ../../mod/admin.php:450
    +#: ../../mod/admin.php:457
     msgid "Allow Feeds as Connections"
    -msgstr "Permitir flujos RSS como conexiones"
    +msgstr "Permitir contenidos RSS como conexiones"
     
    -#: ../../mod/admin.php:450
    +#: ../../mod/admin.php:457
     msgid "(Heavy system resource usage)"
     msgstr "(Uso intenso de los recursos del sistema)"
     
    -#: ../../mod/admin.php:451
    +#: ../../mod/admin.php:458
     msgid "Maximum image size"
     msgstr "Tamaño máximo de la imagen"
     
    -#: ../../mod/admin.php:451
    +#: ../../mod/admin.php:458
     msgid ""
     "Maximum size in bytes of uploaded images. Default is 0, which means no "
     "limits."
     msgstr "Tamaño máximo en bytes de la imagen subida. Por defecto, es 0, lo que significa que no hay límites."
     
    -#: ../../mod/admin.php:452
    +#: ../../mod/admin.php:459
     msgid "Does this site allow new member registration?"
     msgstr "¿Debe este sitio permitir el registro de nuevos miembros?"
     
    -#: ../../mod/admin.php:453
    +#: ../../mod/admin.php:460
     msgid "Which best describes the types of account offered by this hub?"
     msgstr "¿Cómo describiría el tipo de servicio ofrecido por este servidor?"
     
    -#: ../../mod/admin.php:454
    +#: ../../mod/admin.php:461
     msgid "Register text"
     msgstr "Texto del registro"
     
    -#: ../../mod/admin.php:454
    +#: ../../mod/admin.php:461
     msgid "Will be displayed prominently on the registration page."
     msgstr "Se mostrará de forma destacada en la página de registro."
     
    -#: ../../mod/admin.php:455
    +#: ../../mod/admin.php:462
     msgid "Site homepage to show visitors (default: login box)"
     msgstr "Página personal que se mostrará a los visitantes (por defecto: la página de identificación)"
     
    -#: ../../mod/admin.php:455
    +#: ../../mod/admin.php:462
     msgid ""
     "example: 'public' to show public stream, 'page/sys/home' to show a system "
     "webpage called 'home' or 'include:home.html' to include a file."
     msgstr "ejemplo: 'public' para mostrar contenido público de los usuarios, 'page/sys/home' para mostrar la página web definida como \"home\" o 'include:home.html' para mostrar el contenido de un fichero."
     
    -#: ../../mod/admin.php:456
    +#: ../../mod/admin.php:463
     msgid "Preserve site homepage URL"
     msgstr "Preservar la dirección de la página personal"
     
    -#: ../../mod/admin.php:456
    +#: ../../mod/admin.php:463
     msgid ""
     "Present the site homepage in a frame at the original location instead of "
     "redirecting"
     msgstr "Presenta la página personal del sitio en un marco en la ubicación original, en vez de redirigirla."
     
    -#: ../../mod/admin.php:457
    +#: ../../mod/admin.php:464
     msgid "Accounts abandoned after x days"
     msgstr "Cuentas abandonadas después de x días"
     
    -#: ../../mod/admin.php:457
    +#: ../../mod/admin.php:464
     msgid ""
     "Will not waste system resources polling external sites for abandonded "
     "accounts. Enter 0 for no time limit."
     msgstr "Para evitar consumir recursos del sistema intentando poner al día las cuentas abandonadas. Introduzca 0 para no tener límite de tiempo."
     
    -#: ../../mod/admin.php:458
    +#: ../../mod/admin.php:465
     msgid "Allowed friend domains"
     msgstr "Dominios amigos permitidos"
     
    -#: ../../mod/admin.php:458
    +#: ../../mod/admin.php:465
     msgid ""
     "Comma separated list of domains which are allowed to establish friendships "
     "with this site. Wildcards are accepted. Empty to allow any domains"
     msgstr "Lista separada por comas de dominios a los que está permitido establecer relaciones de amistad con este sitio. Se permiten comodines. Dejar en claro para aceptar cualquier dominio."
     
    -#: ../../mod/admin.php:459
    +#: ../../mod/admin.php:466
     msgid "Allowed email domains"
     msgstr "Se aceptan dominios de correo electrónico"
     
    -#: ../../mod/admin.php:459
    +#: ../../mod/admin.php:466
     msgid ""
     "Comma separated list of domains which are allowed in email addresses for "
     "registrations to this site. Wildcards are accepted. Empty to allow any "
     "domains"
     msgstr "Lista separada por comas de los dominios de los que se acepta una dirección de correo electrónico para registros en este sitio. Se permiten comodines. Dejar en claro para aceptar cualquier dominio. "
     
    -#: ../../mod/admin.php:460
    +#: ../../mod/admin.php:467
     msgid "Not allowed email domains"
     msgstr "No se permiten dominios de correo electrónico"
     
    -#: ../../mod/admin.php:460
    +#: ../../mod/admin.php:467
     msgid ""
     "Comma separated list of domains which are not allowed in email addresses for"
     " registrations to this site. Wildcards are accepted. Empty to allow any "
     "domains, unless allowed domains have been defined."
     msgstr "Lista separada por comas de los dominios de los que no se acepta una dirección de correo electrónico para registros en este sitio. Se permiten comodines. Dejar en claro para no aceptar cualquier dominio, excepto los que se hayan autorizado."
     
    -#: ../../mod/admin.php:461
    +#: ../../mod/admin.php:468
     msgid "Block public"
     msgstr "Bloquear páginas públicas"
     
    -#: ../../mod/admin.php:461
    +#: ../../mod/admin.php:468
     msgid ""
     "Check to block public access to all otherwise public personal pages on this "
     "site unless you are currently logged in."
     msgstr "Activar para bloquear el acceso a todas las páginas públicas personales en este sitio, salvo que estén identificadas en el sistema."
     
    -#: ../../mod/admin.php:462
    +#: ../../mod/admin.php:469
     msgid "Verify Email Addresses"
     msgstr "Verificar las direcciones de correo electrónico"
     
    -#: ../../mod/admin.php:462
    +#: ../../mod/admin.php:469
     msgid ""
     "Check to verify email addresses used in account registration (recommended)."
     msgstr "Activar para la verificación de la dirección de correo electrónico en el registro de una cuenta (recomendado)."
     
    -#: ../../mod/admin.php:463
    +#: ../../mod/admin.php:470
     msgid "Force publish"
     msgstr "Forzar la publicación"
     
    -#: ../../mod/admin.php:463
    +#: ../../mod/admin.php:470
     msgid ""
     "Check to force all profiles on this site to be listed in the site directory."
     msgstr "Intentar forzar todos los perfiles para que sean listados en el directorio de este sitio."
     
    -#: ../../mod/admin.php:464
    -msgid "Disable discovery tab"
    -msgstr "Desactivar la pestaña \"Descubrir\""
    +#: ../../mod/admin.php:471
    +msgid "Import Public Streams"
    +msgstr "Importar contenido público"
     
    -#: ../../mod/admin.php:464
    +#: ../../mod/admin.php:471
     msgid ""
    -"Remove the tab in the network view with public content pulled from sources "
    -"chosen for this site."
    -msgstr "Quitar la pestaña para ver contenido público extraído de las fuentes elegidas por este sitio."
    +"Import and allow access to public content pulled from other sites. Warning: "
    +"this content is unmoderated."
    +msgstr "Importar y permitir acceso al contenido público sacado de otros sitios. Advertencia: este contenido no está moderado, por lo que podría encontrar cosas inapropiadas u ofensivas."
     
    -#: ../../mod/admin.php:465
    +#: ../../mod/admin.php:472
     msgid "login on Homepage"
     msgstr "acceso a la página personal"
     
    -#: ../../mod/admin.php:465
    +#: ../../mod/admin.php:472
     msgid ""
     "Present a login box to visitors on the home page if no other content has "
     "been configured."
     msgstr "Presentar a los visitantes una casilla de identificación en la página de inicio, si no se ha configurado otro tipo de contenido."
     
    -#: ../../mod/admin.php:467
    +#: ../../mod/admin.php:474
     msgid "Directory Server URL"
     msgstr "URL del servidor de directorio"
     
    -#: ../../mod/admin.php:467
    +#: ../../mod/admin.php:474
     msgid "Default directory server"
     msgstr "Servidor de directorio predeterminado"
     
    -#: ../../mod/admin.php:469
    +#: ../../mod/admin.php:476
     msgid "Proxy user"
     msgstr "Usuario del proxy"
     
    -#: ../../mod/admin.php:470
    +#: ../../mod/admin.php:477
     msgid "Proxy URL"
     msgstr "Dirección del proxy"
     
    -#: ../../mod/admin.php:471
    +#: ../../mod/admin.php:478
     msgid "Network timeout"
     msgstr "Tiempo de espera de la red"
     
    -#: ../../mod/admin.php:471
    +#: ../../mod/admin.php:478
     msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
     msgstr "Valor en segundos. Poner a 0 para que no haya tiempo límite (no recomendado)"
     
    -#: ../../mod/admin.php:472
    +#: ../../mod/admin.php:479
     msgid "Delivery interval"
     msgstr "Intervalo de entrega"
     
    -#: ../../mod/admin.php:472
    +#: ../../mod/admin.php:479
     msgid ""
     "Delay background delivery processes by this many seconds to reduce system "
     "load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
     "for large dedicated servers."
     msgstr "Retrasar los procesos de transmisión en segundo plano por esta cantidad de segundos para reducir la carga del sistema. Recomendado: 4-5 para sitios compartidos, 2-3 para servidores virtuales privados, 0-1 para grandes servidores dedicados."
     
    -#: ../../mod/admin.php:473
    +#: ../../mod/admin.php:480
     msgid "Deliveries per process"
     msgstr "Intentos de envío por proceso"
     
    -#: ../../mod/admin.php:473
    +#: ../../mod/admin.php:480
     msgid ""
     "Number of deliveries to attempt in a single operating system process. Adjust"
     " if necessary to tune system performance. Recommend: 1-5."
     msgstr "Numero de envíos a intentar en un único proceso del sistema operativo. Ajustar si es necesario mejorar el rendimiento. Se recomienda: 1-5."
     
    -#: ../../mod/admin.php:474
    +#: ../../mod/admin.php:481
     msgid "Poll interval"
     msgstr "Intervalo de sondeo"
     
    -#: ../../mod/admin.php:474
    +#: ../../mod/admin.php:481
     msgid ""
     "Delay background polling processes by this many seconds to reduce system "
     "load. If 0, use delivery interval."
     msgstr "Retrasar el sondeo en segundo plano, en esta cantidad de segundos, para reducir la carga del sistema. Si es 0, usar el intervalo de transmisión."
     
    -#: ../../mod/admin.php:475
    +#: ../../mod/admin.php:482
     msgid "Maximum Load Average"
     msgstr "Carga media máxima"
     
    -#: ../../mod/admin.php:475
    +#: ../../mod/admin.php:482
     msgid ""
     "Maximum system load before delivery and poll processes are deferred - "
     "default 50."
     msgstr "Carga máxima del sistema antes de que los procesos de transmisión y sondeo se hayan retardado - por defecto, 50."
     
    -#: ../../mod/admin.php:476
    +#: ../../mod/admin.php:483
     msgid "Expiration period in days for imported (matrix/network) content"
     msgstr "Periodo de caducidad en días para el contenido importado (red)"
     
    -#: ../../mod/admin.php:476
    +#: ../../mod/admin.php:483
     msgid "0 for no expiration of imported content"
     msgstr "0 para que no caduque el contenido importado"
     
    -#: ../../mod/admin.php:524
    +#: ../../mod/admin.php:531
     msgid "No server found"
     msgstr "Servidor no encontrado"
     
    -#: ../../mod/admin.php:531 ../../mod/admin.php:814
    +#: ../../mod/admin.php:538 ../../mod/admin.php:821
     msgid "ID"
     msgstr "ID"
     
    -#: ../../mod/admin.php:531
    +#: ../../mod/admin.php:538
     msgid "for channel"
     msgstr "por canal"
     
    -#: ../../mod/admin.php:531
    +#: ../../mod/admin.php:538
     msgid "on server"
     msgstr "en el servidor"
     
    -#: ../../mod/admin.php:531
    +#: ../../mod/admin.php:538
     msgid "Status"
     msgstr "Estado"
     
    -#: ../../mod/admin.php:533
    +#: ../../mod/admin.php:540
     msgid "Server"
     msgstr "Servidor"
     
    -#: ../../mod/admin.php:550
    +#: ../../mod/admin.php:557
     msgid "Update has been marked successful"
     msgstr "La actualización ha sido marcada como exitosa"
     
    -#: ../../mod/admin.php:560
    +#: ../../mod/admin.php:567
     #, php-format
     msgid "Executing %s failed. Check system logs."
     msgstr "La ejecución de %s ha fallado. Mirar en los informes del sistema."
     
    -#: ../../mod/admin.php:563
    +#: ../../mod/admin.php:570
     #, php-format
     msgid "Update %s was successfully applied."
     msgstr "La actualización de %s se ha realizado exitosamente."
     
    -#: ../../mod/admin.php:567
    +#: ../../mod/admin.php:574
     #, php-format
     msgid "Update %s did not return a status. Unknown if it succeeded."
     msgstr "La actualización de %s no ha devuelto ningún estado. No se sabe si ha tenido éxito."
     
    -#: ../../mod/admin.php:570
    +#: ../../mod/admin.php:577
     #, php-format
     msgid "Update function %s could not be found."
     msgstr "No se encuentra la función de actualización de %s."
     
    -#: ../../mod/admin.php:586
    +#: ../../mod/admin.php:593
     msgid "No failed updates."
     msgstr "No ha fallado ninguna actualización."
     
    -#: ../../mod/admin.php:590
    +#: ../../mod/admin.php:597
     msgid "Failed Updates"
     msgstr "Han fallado las actualizaciones"
     
    -#: ../../mod/admin.php:592
    +#: ../../mod/admin.php:599
     msgid "Mark success (if update was manually applied)"
     msgstr "Marcar como exitosa (si la actualización se ha hecho manualmente)"
     
    -#: ../../mod/admin.php:593
    +#: ../../mod/admin.php:600
     msgid "Attempt to execute this update step automatically"
     msgstr "Intentar ejecutar este paso de actualización automáticamente"
     
    -#: ../../mod/admin.php:625
    +#: ../../mod/admin.php:632
     msgid "Queue Statistics"
     msgstr "Estadísticas de la cola"
     
    -#: ../../mod/admin.php:626
    +#: ../../mod/admin.php:633
     msgid "Total Entries"
     msgstr "Total de entradas"
     
    -#: ../../mod/admin.php:627
    +#: ../../mod/admin.php:634
     msgid "Priority"
     msgstr "Prioridad"
     
    -#: ../../mod/admin.php:628
    +#: ../../mod/admin.php:635
     msgid "Destination URL"
     msgstr "Dirección de destino"
     
    -#: ../../mod/admin.php:629
    +#: ../../mod/admin.php:636
     msgid "Mark hub permanently offline"
     msgstr "Marcar el servidor como permanentemente fuera de línea"
     
    -#: ../../mod/admin.php:630
    +#: ../../mod/admin.php:637
     msgid "Empty queue for this hub"
     msgstr "Vaciar la cola para este servidor"
     
    -#: ../../mod/admin.php:631
    +#: ../../mod/admin.php:638
     msgid "Last known contact"
     msgstr "Último contacto conocido"
     
    -#: ../../mod/admin.php:667
    +#: ../../mod/admin.php:674
     #, php-format
     msgid "%s account blocked/unblocked"
     msgid_plural "%s account blocked/unblocked"
     msgstr[0] "%s cuenta bloqueada/desbloqueada"
     msgstr[1] "%s cuenta bloqueada/desbloqueada"
     
    -#: ../../mod/admin.php:675
    +#: ../../mod/admin.php:682
     #, php-format
     msgid "%s account deleted"
     msgid_plural "%s accounts deleted"
     msgstr[0] "%s cuentas eliminadas"
     msgstr[1] "%s cuentas eliminadas"
     
    -#: ../../mod/admin.php:711
    +#: ../../mod/admin.php:718
     msgid "Account not found"
     msgstr "Cuenta no encontrada"
     
    -#: ../../mod/admin.php:723
    +#: ../../mod/admin.php:730
     #, php-format
     msgid "Account '%s' deleted"
     msgstr "La cuenta '%s' ha sido eliminada"
     
    -#: ../../mod/admin.php:731
    +#: ../../mod/admin.php:738
     #, php-format
     msgid "Account '%s' blocked"
     msgstr "La cuenta '%s' ha sido bloqueada"
     
    -#: ../../mod/admin.php:739
    +#: ../../mod/admin.php:746
     #, php-format
     msgid "Account '%s' unblocked"
     msgstr "La cuenta '%s' ha sido desbloqueada"
     
    -#: ../../mod/admin.php:801 ../../mod/admin.php:813
    +#: ../../mod/admin.php:808 ../../mod/admin.php:820
     msgid "Users"
     msgstr "Usuarios"
     
    -#: ../../mod/admin.php:803 ../../mod/admin.php:967
    +#: ../../mod/admin.php:810 ../../mod/admin.php:974
     msgid "select all"
     msgstr "seleccionar todo"
     
    -#: ../../mod/admin.php:804
    +#: ../../mod/admin.php:811
     msgid "User registrations waiting for confirm"
     msgstr "Registros de usuario en espera de aprobación"
     
    -#: ../../mod/admin.php:805
    +#: ../../mod/admin.php:812
     msgid "Request date"
     msgstr "Fecha de solicitud"
     
    -#: ../../mod/admin.php:806
    +#: ../../mod/admin.php:813
     msgid "No registrations."
     msgstr "Sin registros."
     
    -#: ../../mod/admin.php:808
    +#: ../../mod/admin.php:815
     msgid "Deny"
     msgstr "Rechazar"
     
    -#: ../../mod/admin.php:814
    +#: ../../mod/admin.php:821
     msgid "Register date"
     msgstr "Fecha de registro"
     
    -#: ../../mod/admin.php:814
    +#: ../../mod/admin.php:821
     msgid "Last login"
     msgstr "Último acceso"
     
    -#: ../../mod/admin.php:814
    +#: ../../mod/admin.php:821
     msgid "Expires"
     msgstr "Caduca"
     
    -#: ../../mod/admin.php:814
    +#: ../../mod/admin.php:821
     msgid "Service Class"
     msgstr "Clase de servicio"
     
    -#: ../../mod/admin.php:816
    +#: ../../mod/admin.php:823
     msgid ""
     "Selected accounts will be deleted!\\n\\nEverything these accounts had posted"
     " on this site will be permanently deleted!\\n\\nAre you sure?"
     msgstr "¡Las cuentas seleccionadas van a ser eliminadas!\\n\\n¡Todo lo que estas cuentas han publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?"
     
    -#: ../../mod/admin.php:817
    +#: ../../mod/admin.php:824
     msgid ""
     "The account {0} will be deleted!\\n\\nEverything this account has posted on "
     "this site will be permanently deleted!\\n\\nAre you sure?"
     msgstr "¡La cuenta {0} va a ser eliminada!\\n\\n¡Todo lo que esta cuenta ha publicado en este sitio será borrado de forma permanente!\\n\\n¿Está seguro de querer hacerlo?"
     
    -#: ../../mod/admin.php:853
    +#: ../../mod/admin.php:860
     #, php-format
     msgid "%s channel censored/uncensored"
     msgid_plural "%s channels censored/uncensored"
     msgstr[0] "%s canales censurados/no censurados"
     msgstr[1] "%s canales censurados/no censurados"
     
    -#: ../../mod/admin.php:862
    +#: ../../mod/admin.php:869
     #, php-format
     msgid "%s channel code allowed/disallowed"
     msgid_plural "%s channels code allowed/disallowed"
     msgstr[0] "%s código permitido/no permitido al canal"
     msgstr[1] "%s código permitido/no permitido al canal"
     
    -#: ../../mod/admin.php:869
    +#: ../../mod/admin.php:876
     #, php-format
     msgid "%s channel deleted"
     msgid_plural "%s channels deleted"
     msgstr[0] "%s canales eliminados"
     msgstr[1] "%s canales eliminados"
     
    -#: ../../mod/admin.php:889
    +#: ../../mod/admin.php:896
     msgid "Channel not found"
     msgstr "Canal no encontrado"
     
    -#: ../../mod/admin.php:900
    +#: ../../mod/admin.php:907
     #, php-format
     msgid "Channel '%s' deleted"
     msgstr "Canal '%s' eliminado"
     
    -#: ../../mod/admin.php:912
    +#: ../../mod/admin.php:919
     #, php-format
     msgid "Channel '%s' censored"
     msgstr "Canal '%s' censurado"
     
    -#: ../../mod/admin.php:912
    +#: ../../mod/admin.php:919
     #, php-format
     msgid "Channel '%s' uncensored"
     msgstr "Canal '%s' no censurado"
     
    -#: ../../mod/admin.php:923
    +#: ../../mod/admin.php:930
     #, php-format
     msgid "Channel '%s' code allowed"
     msgstr "Código permitido al canal '%s'"
     
    -#: ../../mod/admin.php:923
    +#: ../../mod/admin.php:930
     #, php-format
     msgid "Channel '%s' code disallowed"
     msgstr "Código no permitido al canal '%s'"
     
    -#: ../../mod/admin.php:969
    +#: ../../mod/admin.php:976
     msgid "Censor"
     msgstr "Censurar"
     
    -#: ../../mod/admin.php:970
    +#: ../../mod/admin.php:977
     msgid "Uncensor"
     msgstr "No censurar"
     
    -#: ../../mod/admin.php:971
    +#: ../../mod/admin.php:978
     msgid "Allow Code"
     msgstr "Permitir código"
     
    -#: ../../mod/admin.php:972
    +#: ../../mod/admin.php:979
     msgid "Disallow Code"
     msgstr "No permitir código"
     
    -#: ../../mod/admin.php:974
    +#: ../../mod/admin.php:981
     msgid "UID"
     msgstr "UID"
     
    -#: ../../mod/admin.php:976
    +#: ../../mod/admin.php:983
     msgid ""
     "Selected channels will be deleted!\\n\\nEverything that was posted in these "
     "channels on this site will be permanently deleted!\\n\\nAre you sure?"
     msgstr "Los canales seleccionados se eliminarán!\\n\\nTodo lo publicado por estos canales en este sitio se borrarán definitivamente!\\n\\n¿Está seguro de querer hacerlo?"
     
    -#: ../../mod/admin.php:977
    +#: ../../mod/admin.php:984
     msgid ""
     "The channel {0} will be deleted!\\n\\nEverything that was posted in this "
     "channel on this site will be permanently deleted!\\n\\nAre you sure?"
     msgstr "El canal {0} va a ser eliminado!\\n\\nTodo lo publicado por el canal en este sitio se borrará definitivamente!\\n\\n¿Está seguro de querer hacerlo?"
     
    -#: ../../mod/admin.php:1017
    +#: ../../mod/admin.php:1024
     #, php-format
     msgid "Plugin %s disabled."
     msgstr "Extensión %s desactivada."
     
    -#: ../../mod/admin.php:1021
    +#: ../../mod/admin.php:1028
     #, php-format
     msgid "Plugin %s enabled."
     msgstr "Extensión %s activada."
     
    -#: ../../mod/admin.php:1031 ../../mod/admin.php:1234
    +#: ../../mod/admin.php:1038 ../../mod/admin.php:1241
     msgid "Disable"
     msgstr "Desactivar"
     
    -#: ../../mod/admin.php:1034 ../../mod/admin.php:1236
    +#: ../../mod/admin.php:1041 ../../mod/admin.php:1243
     msgid "Enable"
     msgstr "Activar"
     
    -#: ../../mod/admin.php:1063 ../../mod/admin.php:1263
    +#: ../../mod/admin.php:1070 ../../mod/admin.php:1270
     msgid "Toggle"
     msgstr "Cambiar"
     
    -#: ../../mod/admin.php:1071 ../../mod/admin.php:1273
    +#: ../../mod/admin.php:1078 ../../mod/admin.php:1280
     msgid "Author: "
     msgstr "Autor:"
     
    -#: ../../mod/admin.php:1072 ../../mod/admin.php:1274
    +#: ../../mod/admin.php:1079 ../../mod/admin.php:1281
     msgid "Maintainer: "
     msgstr "Mantenedor:"
     
    -#: ../../mod/admin.php:1199
    +#: ../../mod/admin.php:1206
     msgid "No themes found."
     msgstr "No se han encontrado temas."
     
    -#: ../../mod/admin.php:1255
    +#: ../../mod/admin.php:1262
     msgid "Screenshot"
     msgstr "Instantánea de pantalla"
     
    -#: ../../mod/admin.php:1301
    +#: ../../mod/admin.php:1308
     msgid "[Experimental]"
     msgstr "[Experimental]"
     
    -#: ../../mod/admin.php:1302
    +#: ../../mod/admin.php:1309
     msgid "[Unsupported]"
     msgstr "[No soportado]"
     
    -#: ../../mod/admin.php:1326
    +#: ../../mod/admin.php:1333
     msgid "Log settings updated."
     msgstr "Actualizado el informe de configuraciones."
     
    -#: ../../mod/admin.php:1383
    +#: ../../mod/admin.php:1390
     msgid "Clear"
     msgstr "Vaciar"
     
    -#: ../../mod/admin.php:1389
    +#: ../../mod/admin.php:1396
     msgid "Debugging"
     msgstr "Depuración"
     
    -#: ../../mod/admin.php:1390
    +#: ../../mod/admin.php:1397
     msgid "Log file"
     msgstr "Fichero de informe"
     
    -#: ../../mod/admin.php:1390
    +#: ../../mod/admin.php:1397
     msgid ""
     "Must be writable by web server. Relative to your Red top-level directory."
     msgstr "Debe tener permisos de escritura por el servidor web. La ruta es relativa al directorio de instalación de Hubzilla."
     
    -#: ../../mod/admin.php:1391
    +#: ../../mod/admin.php:1398
     msgid "Log level"
     msgstr "Nivel de depuración"
     
    -#: ../../mod/admin.php:1437
    +#: ../../mod/admin.php:1444
     msgid "New Profile Field"
     msgstr "Nuevo campo en el perfil"
     
    -#: ../../mod/admin.php:1438 ../../mod/admin.php:1458
    +#: ../../mod/admin.php:1445 ../../mod/admin.php:1465
     msgid "Field nickname"
     msgstr "Alias del campo"
     
    -#: ../../mod/admin.php:1438 ../../mod/admin.php:1458
    +#: ../../mod/admin.php:1445 ../../mod/admin.php:1465
     msgid "System name of field"
     msgstr "Nombre del campo en el sistema"
     
    -#: ../../mod/admin.php:1439 ../../mod/admin.php:1459
    +#: ../../mod/admin.php:1446 ../../mod/admin.php:1466
     msgid "Input type"
     msgstr "Tipo de entrada"
     
    -#: ../../mod/admin.php:1440 ../../mod/admin.php:1460
    +#: ../../mod/admin.php:1447 ../../mod/admin.php:1467
     msgid "Field Name"
     msgstr "Nombre del campo"
     
    -#: ../../mod/admin.php:1440 ../../mod/admin.php:1460
    +#: ../../mod/admin.php:1447 ../../mod/admin.php:1467
     msgid "Label on profile pages"
     msgstr "Etiqueta a mostrar en la página del perfil"
     
    -#: ../../mod/admin.php:1441 ../../mod/admin.php:1461
    +#: ../../mod/admin.php:1448 ../../mod/admin.php:1468
     msgid "Help text"
     msgstr "Texto de ayuda"
     
    -#: ../../mod/admin.php:1441 ../../mod/admin.php:1461
    +#: ../../mod/admin.php:1448 ../../mod/admin.php:1468
     msgid "Additional info (optional)"
     msgstr "Información adicional (opcional)"
     
    -#: ../../mod/admin.php:1451
    +#: ../../mod/admin.php:1458
     msgid "Field definition not found"
     msgstr "Definición del campo no encontrada"
     
    -#: ../../mod/admin.php:1457
    +#: ../../mod/admin.php:1464
     msgid "Edit Profile Field"
     msgstr "Modificar el campo del perfil"
     
    @@ -8270,75 +8181,14 @@ msgstr "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio
     msgid "Use this form to drop the location if the hub is no longer operating."
     msgstr "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo."
     
    -#: ../../mod/invite.php:25
    -msgid "Total invitation limit exceeded."
    -msgstr "Se ha superado el límite máximo de invitaciones."
    -
    -#: ../../mod/invite.php:49
    -#, php-format
    -msgid "%s : Not a valid email address."
    -msgstr "%s : No es una dirección de correo electrónico válida. "
    -
    -#: ../../mod/invite.php:76
    -msgid "Please join us on $Projectname"
    -msgstr "Únase a nosotros en $Projectname"
    -
    -#: ../../mod/invite.php:87
    -msgid "Invitation limit exceeded. Please contact your site administrator."
    -msgstr "Excedido el límite de invitaciones. Por favor, contacte con el Administrador de su sitio."
    -
    -#: ../../mod/invite.php:92
    -#, php-format
    -msgid "%s : Message delivery failed."
    -msgstr "%s : Falló el envío del mensaje."
    +#: ../../mod/home.php:57 ../../mod/home.php:65 ../../mod/siteinfo.php:61
    +msgid "$Projectname"
    +msgstr "$Projectname"
     
    -#: ../../mod/invite.php:96
    +#: ../../mod/home.php:75
     #, php-format
    -msgid "%d message sent."
    -msgid_plural "%d messages sent."
    -msgstr[0] "%d mensajes enviados."
    -msgstr[1] "%d mensajes enviados."
    -
    -#: ../../mod/invite.php:115
    -msgid "You have no more invitations available"
    -msgstr "No tiene más invitaciones disponibles"
    -
    -#: ../../mod/invite.php:129
    -msgid "Send invitations"
    -msgstr "Enviar invitaciones"
    -
    -#: ../../mod/invite.php:130
    -msgid "Enter email addresses, one per line:"
    -msgstr "Introduzca las direcciones de correo electrónico, una por línea:"
    -
    -#: ../../mod/invite.php:131 ../../mod/mail.php:238
    -msgid "Your message:"
    -msgstr "Su mensaje:"
    -
    -#: ../../mod/invite.php:132
    -msgid "Please join my community on $Projectname."
    -msgstr "Por favor, únase a mi comunidad en $Projectname."
    -
    -#: ../../mod/invite.php:134
    -msgid "You will need to supply this invitation code: "
    -msgstr "Debe proporcionar este código de invitación:"
    -
    -#: ../../mod/invite.php:135
    -msgid ""
    -"1. Register at any $Projectname location (they are all inter-connected)"
    -msgstr "1. Regístrese en cualquier sitio de $Projectname (están todos interconectados)"
    -
    -#: ../../mod/invite.php:137
    -msgid "2. Enter my $Projectname network address into the site searchbar."
    -msgstr "2. Introduzca mi dirección $Projectname en la caja de búsqueda del sitio."
    -
    -#: ../../mod/invite.php:138
    -msgid "or visit "
    -msgstr "o visite "
    -
    -#: ../../mod/invite.php:140
    -msgid "3. Click [Connect]"
    -msgstr "3. Pulse [conectar]"
    +msgid "Welcome to %s"
    +msgstr "Bienvenido a %s"
     
     #: ../../mod/regmod.php:11
     msgid "Please login."
    @@ -8368,6 +8218,158 @@ msgstr "Permisos insuficientes. Petición redirigida a la página del perfil."
     msgid "Item not available."
     msgstr "Elemento no disponible"
     
    +#: ../../mod/photos.php:79
    +msgid "Page owner information could not be retrieved."
    +msgstr "La información del propietario de la página no pudo ser recuperada."
    +
    +#: ../../mod/photos.php:100
    +msgid "Album not found."
    +msgstr "Álbum no encontrado."
    +
    +#: ../../mod/photos.php:127
    +msgid "Delete Album"
    +msgstr "Borrar álbum"
    +
    +#: ../../mod/photos.php:171 ../../mod/photos.php:1006
    +msgid "Delete Photo"
    +msgstr "Borrar foto"
    +
    +#: ../../mod/photos.php:501
    +msgid "No photos selected"
    +msgstr "No hay fotos seleccionadas"
    +
    +#: ../../mod/photos.php:550
    +msgid "Access to this item is restricted."
    +msgstr "El acceso a este elemento está restringido."
    +
    +#: ../../mod/photos.php:589
    +#, php-format
    +msgid "%1$.2f MB of %2$.2f MB photo storage used."
    +msgstr "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado."
    +
    +#: ../../mod/photos.php:592
    +#, php-format
    +msgid "%1$.2f MB photo storage used."
    +msgstr "%1$.2f MB de almacenamiento de fotos utilizado."
    +
    +#: ../../mod/photos.php:620
    +msgid "Upload Photos"
    +msgstr "Subir fotos"
    +
    +#: ../../mod/photos.php:624
    +msgid "Enter an album name"
    +msgstr "Introducir un nombre de álbum"
    +
    +#: ../../mod/photos.php:625
    +msgid "or select an existing album (doubleclick)"
    +msgstr "o seleccionar uno existente (doble click)"
    +
    +#: ../../mod/photos.php:626
    +msgid "Create a status post for this upload"
    +msgstr "Crear una entrada de estado para esta subida"
    +
    +#: ../../mod/photos.php:627
    +msgid "Caption (optional):"
    +msgstr "Título (opcional):"
    +
    +#: ../../mod/photos.php:628
    +msgid "Description (optional):"
    +msgstr "Descripción (opcional):"
    +
    +#: ../../mod/photos.php:655
    +msgid "Album name could not be decoded"
    +msgstr "El nombre del álbum no ha podido ser descifrado"
    +
    +#: ../../mod/photos.php:699 ../../mod/photos.php:1233
    +#: ../../mod/photos.php:1250
    +msgid "Contact Photos"
    +msgstr "Fotos de contacto"
    +
    +#: ../../mod/photos.php:722
    +msgid "Show Newest First"
    +msgstr "Mostrar lo más reciente primero"
    +
    +#: ../../mod/photos.php:724
    +msgid "Show Oldest First"
    +msgstr "Mostrar lo más antiguo primero"
    +
    +#: ../../mod/photos.php:824
    +msgid "Permission denied. Access to this item may be restricted."
    +msgstr "Permiso denegado. El acceso a este elemento puede estar restringido."
    +
    +#: ../../mod/photos.php:826
    +msgid "Photo not available"
    +msgstr "Foto no disponible"
    +
    +#: ../../mod/photos.php:884
    +msgid "Use as profile photo"
    +msgstr "Usar como foto del perfil"
    +
    +#: ../../mod/photos.php:891
    +msgid "Private Photo"
    +msgstr "Foto privada"
    +
    +#: ../../mod/photos.php:902 ../../mod/events.php:652 ../../mod/events.php:659
    +msgid "Previous"
    +msgstr "Anterior"
    +
    +#: ../../mod/photos.php:906
    +msgid "View Full Size"
    +msgstr "Ver tamaño completo"
    +
    +#: ../../mod/photos.php:985
    +msgid "Edit photo"
    +msgstr "Editar foto"
    +
    +#: ../../mod/photos.php:987
    +msgid "Rotate CW (right)"
    +msgstr "Girar CW (a la derecha)"
    +
    +#: ../../mod/photos.php:988
    +msgid "Rotate CCW (left)"
    +msgstr "Girar CCW (a la izquierda)"
    +
    +#: ../../mod/photos.php:991
    +msgid "Enter a new album name"
    +msgstr "Introducir un nuevo nombre de álbum"
    +
    +#: ../../mod/photos.php:992
    +msgid "or select an existing one (doubleclick)"
    +msgstr "o seleccionar uno (doble click) existente"
    +
    +#: ../../mod/photos.php:995
    +msgid "Caption"
    +msgstr "Título"
    +
    +#: ../../mod/photos.php:997
    +msgid "Add a Tag"
    +msgstr "Añadir una etiqueta"
    +
    +#: ../../mod/photos.php:1001
    +msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
    +msgstr "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com"
    +
    +#: ../../mod/photos.php:1004
    +msgid "Flag as adult in album view"
    +msgstr "Marcar como \"solo para adultos\" en el álbum"
    +
    +#: ../../mod/photos.php:1196
    +msgid "In This Photo:"
    +msgstr "En esta foto:"
    +
    +#: ../../mod/photos.php:1201
    +msgid "Map"
    +msgstr "Mapa"
    +
    +#: ../../mod/photos.php:1289
    +msgid "View Album"
    +msgstr "Ver álbum"
    +
    +#: ../../mod/photos.php:1300 ../../mod/photos.php:1313
    +#: ../../mod/photos.php:1314
    +msgid "Recent Photos"
    +msgstr "Fotos recientes"
    +
     #: ../../mod/lockview.php:37
     msgid "Remote privacy information not available."
     msgstr "La información privada remota no está disponible."
    @@ -8757,95 +8759,89 @@ msgstr "El título del menú tal como será visto por los demás"
     msgid "Allow bookmarks"
     msgstr "Permitir marcadores"
     
    -#: ../../mod/mail.php:33
    +#: ../../mod/mail.php:34
     msgid "Unable to lookup recipient."
     msgstr "Imposible asociar a un destinatario."
     
    -#: ../../mod/mail.php:41
    +#: ../../mod/mail.php:42
     msgid "Unable to communicate with requested channel."
     msgstr "Imposible comunicar con el canal solicitado."
     
    -#: ../../mod/mail.php:48
    +#: ../../mod/mail.php:49
     msgid "Cannot verify requested channel."
     msgstr "No se puede verificar el canal solicitado."
     
    -#: ../../mod/mail.php:74
    +#: ../../mod/mail.php:75
     msgid "Selected channel has private message restrictions. Send failed."
     msgstr "El canal seleccionado tiene restricciones sobre los mensajes privados. El envío falló."
     
    -#: ../../mod/mail.php:132
    +#: ../../mod/mail.php:140
     msgid "Messages"
     msgstr "Mensajes"
     
    -#: ../../mod/mail.php:167
    +#: ../../mod/mail.php:175
     msgid "Message recalled."
     msgstr "Mensaje revocado."
     
    -#: ../../mod/mail.php:180
    +#: ../../mod/mail.php:188
     msgid "Conversation removed."
     msgstr "Conversación eliminada."
     
    -#: ../../mod/mail.php:223
    +#: ../../mod/mail.php:231
     msgid "Requested channel is not in this network"
     msgstr "El canal solicitado no existe en esta red"
     
    -#: ../../mod/mail.php:231
    +#: ../../mod/mail.php:239
     msgid "Send Private Message"
     msgstr "Enviar un mensaje privado"
     
    -#: ../../mod/mail.php:232 ../../mod/mail.php:362
    +#: ../../mod/mail.php:240 ../../mod/mail.php:370
     msgid "To:"
     msgstr "Para:"
     
    -#: ../../mod/mail.php:235 ../../mod/mail.php:364
    +#: ../../mod/mail.php:243 ../../mod/mail.php:372
     msgid "Subject:"
     msgstr "Asunto:"
     
    -#: ../../mod/mail.php:242
    +#: ../../mod/mail.php:250
     msgid "Send"
     msgstr "Enviar"
     
    -#: ../../mod/mail.php:334
    +#: ../../mod/mail.php:342
     msgid "Delete message"
     msgstr "Borrar mensaje"
     
    -#: ../../mod/mail.php:335
    +#: ../../mod/mail.php:343
     msgid "Delivery report"
     msgstr "Informe de transmisión"
     
    -#: ../../mod/mail.php:336
    +#: ../../mod/mail.php:344
     msgid "Recall message"
     msgstr "Revocar el mensaje"
     
    -#: ../../mod/mail.php:338
    +#: ../../mod/mail.php:346
     msgid "Message has been recalled."
     msgstr "El mensaje ha sido revocado."
     
    -#: ../../mod/mail.php:355
    +#: ../../mod/mail.php:363
     msgid "Delete Conversation"
     msgstr "Eliminar conversación"
     
    -#: ../../mod/mail.php:357
    +#: ../../mod/mail.php:365
     msgid ""
     "No secure communications available. You may be able to "
     "respond from the sender's profile page."
     msgstr "Comunicación segura no disponible. Pero puede responder desde la página del perfil del remitente."
     
    -#: ../../mod/mail.php:361
    +#: ../../mod/mail.php:369
     msgid "Send Reply"
     msgstr "Responder"
     
    -#: ../../mod/mail.php:366
    +#: ../../mod/mail.php:374
     #, php-format
     msgid "Your message for %s (%s):"
     msgstr "Su mensaje para %s (%s):"
     
    -#: ../../mod/post.php:234
    -msgid ""
    -"Remote authentication blocked. You are logged into this site locally. Please"
    -" logout and retry."
    -msgstr "La autenticación desde su servidor está bloqueada. Ha iniciado sesión localmente. Por favor, salga de la sesión y vuelva a intentarlo."
    -
     #: ../../mod/service_limits.php:19
     msgid "No service class restrictions found."
     msgstr "No se han encontrado restricciones sobre esta clase de servicio."
    @@ -9382,3 +9378,9 @@ msgstr "Las tareas del Planificador/Cron no están funcionando."
     #, php-format
     msgid "[hubzilla] Cron tasks not running on %s"
     msgstr "[hubzilla] Las tareas de Cron no están funcionando en %s"
    +
    +#: ../../Zotlabs/Zot/Auth.php:140
    +msgid ""
    +"Remote authentication blocked. You are logged into this site locally. Please"
    +" logout and retry."
    +msgstr "La autenticación desde su servidor está bloqueada. Ha iniciado sesión localmente. Por favor, salga de la sesión y vuelva a intentarlo."
    diff --git a/view/es/hstrings.php b/view/es/hstrings.php
    index 6b73063b8..2fc5fb861 100644
    --- a/view/es/hstrings.php
    +++ b/view/es/hstrings.php
    @@ -143,13 +143,6 @@ $a->strings["Collection is empty."] = "La colección está vacía.";
     $a->strings["Collection: %s"] = "Colección: %s";
     $a->strings["Connection: %s"] = "Conexión: %s";
     $a->strings["Connection not found."] = "Conexión no encontrada";
    -$a->strings["view full size"] = "Ver en el tamaño original";
    -$a->strings["\$Projectname Notification"] = "Notificación de \$Projectname";
    -$a->strings["\$projectname"] = "\$projectname";
    -$a->strings["Thank You,"] = "Gracias,";
    -$a->strings["%s Administrator"] = "%s Administrador";
    -$a->strings["Administrator"] = "Administrador";
    -$a->strings["No Subject"] = "Sin asunto";
     $a->strings["l F d, Y \\@ g:i A"] = "l d de F, Y \\@ G:i";
     $a->strings["Starts:"] = "Comienza:";
     $a->strings["Finishes:"] = "Finaliza:";
    @@ -232,9 +225,9 @@ $a->strings["has"] = "tiene";
     $a->strings["want"] = "quiero";
     $a->strings["wants"] = "quiere";
     $a->strings["like"] = "me gusta";
    -$a->strings["likes"] = "le gusta";
    +$a->strings["likes"] = "gusta de";
     $a->strings["dislike"] = "no me gusta";
    -$a->strings["dislikes"] = "no le gusta";
    +$a->strings["dislikes"] = "no gusta de";
     $a->strings["Visible to your default audience"] = "Visible para su público predeterminado.";
     $a->strings["Show"] = "Mostrar";
     $a->strings["Don't show"] = "No mostrar";
    @@ -395,7 +388,7 @@ $a->strings["Enable tab to display only Network posts that you've interacted on"
     $a->strings["Network New Tab"] = "Contenido nuevo";
     $a->strings["Enable tab to display all new Network activity"] = "Habilitar una pestaña en la que se muestre solo el contenido nuevo";
     $a->strings["Affinity Tool"] = "Herramienta de afinidad";
    -$a->strings["Filter stream activity by depth of relationships"] = "Filtrar la actividad del flujo por profundidad de relaciones";
    +$a->strings["Filter stream activity by depth of relationships"] = "Filtrar el contenido según la profundidad de las relaciones";
     $a->strings["Connection Filtering"] = "Filtrado de conexiones";
     $a->strings["Filter incoming posts from connections based on keywords/content"] = "Filtrar publicaciones entrantes de conexiones por palabras clave o contenido";
     $a->strings["Suggest Channels"] = "Sugerir canales";
    @@ -493,9 +486,9 @@ $a->strings["%1\$s's birthday"] = "Cumpleaños de %1\$s";
     $a->strings["Happy Birthday %1\$s"] = "Feliz cumpleaños %1\$s";
     $a->strings["Public Timeline"] = "Cronología pública";
     $a->strings["photo"] = "foto";
    -$a->strings["channel"] = "canal";
    +$a->strings["channel"] = "el canal";
     $a->strings["status"] = "el mensaje de estado";
    -$a->strings["comment"] = "comentario";
    +$a->strings["comment"] = "el comentario";
     $a->strings["%1\$s likes %2\$s's %3\$s"] = "a %1\$s le gusta %3\$s de %2\$s";
     $a->strings["%1\$s doesn't like %2\$s's %3\$s"] = "a %1\$s no le gusta %3\$s de %2\$s";
     $a->strings["%1\$s is now connected with %2\$s"] = "%1\$s ahora está conectado/a con %2\$s";
    @@ -596,14 +589,14 @@ $a->strings["Encrypt text"] = "Cifrar texto";
     $a->strings["OK"] = "OK";
     $a->strings["Cancel"] = "Cancelar";
     $a->strings["Discover"] = "Descubrir";
    -$a->strings["Imported public streams"] = "Flujos públicos importados";
    +$a->strings["Imported public streams"] = "Contenidos públicos importados";
     $a->strings["Commented Order"] = "Comentarios recientes";
     $a->strings["Sort by Comment Date"] = "Ordenar por fecha de comentario";
     $a->strings["Posted Order"] = "Publicaciones recientes";
     $a->strings["Sort by Post Date"] = "Ordenar por fecha de publicación";
     $a->strings["Posts that mention or involve you"] = "Publicaciones que le mencionan o involucran";
     $a->strings["New"] = "Nuevas";
    -$a->strings["Activity Stream - by date"] = "Flujo de actividad - por fecha";
    +$a->strings["Activity Stream - by date"] = "Contenido - por fecha";
     $a->strings["Starred"] = "Preferidas";
     $a->strings["Favourite Posts"] = "Publicaciones favoritas";
     $a->strings["Spam"] = "Correo basura";
    @@ -677,7 +670,7 @@ $a->strings["layout"] = "disposición";
     $a->strings["block"] = "bloque";
     $a->strings["menu"] = "menú";
     $a->strings["%1\$s wrote the following %2\$s %3\$s"] = "%1\$s escribió la siguiente %2\$s %3\$s";
    -$a->strings["post"] = "entrada";
    +$a->strings["post"] = "la entrada";
     $a->strings["Different viewers will see this text differently"] = "Visitantes diferentes verán este texto de forma distinta";
     $a->strings["$1 spoiler"] = "$1 spoiler";
     $a->strings["$1 wrote:"] = "$1 escribió";
    @@ -700,6 +693,10 @@ $a->strings["%d connection in common"] = array(
     	1 => "%d conexiones en común",
     );
     $a->strings["show more"] = "mostrar más";
    +$a->strings["\$Projectname Notification"] = "Notificación de \$Projectname";
    +$a->strings["\$projectname"] = "\$projectname";
    +$a->strings["Thank You,"] = "Gracias,";
    +$a->strings["%s Administrator"] = "%s Administrador";
     $a->strings["%s "] = "%s ";
     $a->strings["[Hubzilla:Notify] New mail received at %s"] = "[Hubzilla:Aviso] Nuevo mensaje en %s";
     $a->strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s le ha enviado un nuevo mensaje privado en %3\$s.";
    @@ -819,27 +816,27 @@ $a->strings["%d Connection"] = array(
     $a->strings["View Connections"] = "Ver conexiones";
     $a->strings["poke"] = "un toque";
     $a->strings["ping"] = "un \"ping\"";
    -$a->strings["pinged"] = "avisado/a";
    +$a->strings["pinged"] = "ha enviado un \"ping\" a";
     $a->strings["prod"] = "una incitación";
    -$a->strings["prodded"] = "ha recibido una incitación";
    +$a->strings["prodded"] = "ha incitado a";
     $a->strings["slap"] = "una bofetada";
    -$a->strings["slapped"] = "ha recibido una bofetada";
    +$a->strings["slapped"] = "ha enviado una bofetada a";
     $a->strings["finger"] = "un \"finger\"";
    -$a->strings["fingered"] = "ha recibido un \"finger\"";
    +$a->strings["fingered"] = "ha enviado un \"finger\" a";
     $a->strings["rebuff"] = "un rechazo";
    -$a->strings["rebuffed"] = "ha sido rechazado/a";
    +$a->strings["rebuffed"] = "ha enviado un rechazo a";
     $a->strings["happy"] = "feliz";
     $a->strings["sad"] = "triste";
     $a->strings["mellow"] = "amable";
     $a->strings["tired"] = "cansado/a";
    -$a->strings["perky"] = "fresco/a";
    +$a->strings["perky"] = "vivaz";
     $a->strings["angry"] = "enfadado/a";
     $a->strings["stupified"] = "estupefacto/a";
     $a->strings["puzzled"] = "perplejo/a";
     $a->strings["interested"] = "interesado/a";
     $a->strings["bitter"] = "amargado/a";
     $a->strings["cheerful"] = "alegre";
    -$a->strings["alive"] = "vivo/a";
    +$a->strings["alive"] = "animado/a";
     $a->strings["annoyed"] = "molesto/a";
     $a->strings["anxious"] = "ansioso/a";
     $a->strings["cranky"] = "de mal humor";
    @@ -892,6 +889,9 @@ $a->strings["Page Link"] = "Vínculo de la página";
     $a->strings["Title"] = "Título";
     $a->strings["Created"] = "Creado";
     $a->strings["Edited"] = "Editado";
    +$a->strings["view full size"] = "Ver en el tamaño original";
    +$a->strings["Administrator"] = "Administrador";
    +$a->strings["No Subject"] = "Sin asunto";
     $a->strings["Cannot locate DNS info for database server '%s'"] = "No se ha podido localizar información de DNS para el servidor de base de datos “%s”";
     $a->strings["Image exceeds website size limit of %lu bytes"] = "La imagen excede el límite de %lu bytes del sitio";
     $a->strings["Image file is empty."] = "El fichero de imagen está vacío. ";
    @@ -933,23 +933,6 @@ $a->strings["This is you"] = "Este es usted";
     $a->strings["Image"] = "Imagen";
     $a->strings["Insert Link"] = "Insertar enlace";
     $a->strings["Video"] = "Vídeo";
    -$a->strings["Not a valid email address"] = "Dirección de correo no válida";
    -$a->strings["Your email domain is not among those allowed on this site"] = "Su dirección de correo no pertenece a ninguno de los dominios permitidos en este sitio.";
    -$a->strings["Your email address is already registered at this site."] = "Su dirección de correo está ya registrada en este sitio.";
    -$a->strings["An invitation is required."] = "Es obligatorio que le inviten.";
    -$a->strings["Invitation could not be verified."] = "No se ha podido verificar su invitación.";
    -$a->strings["Please enter the required information."] = "Por favor introduzca la información requerida.";
    -$a->strings["Failed to store account information."] = "La información de la cuenta no se ha podido guardar.";
    -$a->strings["Registration confirmation for %s"] = "Confirmación de registro para %s";
    -$a->strings["Registration request at %s"] = "Solicitud de registro en %s";
    -$a->strings["your registration password"] = "su contraseña de registro";
    -$a->strings["Registration details for %s"] = "Detalles del registro de %s";
    -$a->strings["Account approved."] = "Cuenta aprobada.";
    -$a->strings["Registration revoked for %s"] = "Registro revocado para %s";
    -$a->strings["Account verified. Please login."] = "Cuenta verificada. Por favor, inicie sesión.";
    -$a->strings["Click here to upgrade."] = "Pulse aquí para actualizar";
    -$a->strings["This action exceeds the limits set by your subscription plan."] = "Esta acción supera los límites establecidos por su plan de suscripción ";
    -$a->strings["This action is not available under your subscription plan."] = "Esta acción no está disponible en su plan de suscripción.";
     $a->strings["Site Admin"] = "Adminstrador del sitio";
     $a->strings["Address Book"] = "Libreta de direcciones";
     $a->strings["Mood"] = "Estado de ánimo";
    @@ -964,12 +947,12 @@ $a->strings["Profile Photo"] = "Foto del perfil";
     $a->strings["Update"] = "Actualizar";
     $a->strings["Install"] = "Instalar";
     $a->strings["Purchase"] = "Comprar";
    -$a->strings["Can view my normal stream and posts"] = "Pueden verse mi flujo de actividad y publicaciones normales";
    +$a->strings["Can view my normal stream and posts"] = "Pueden verse mi actividad y publicaciones normales";
     $a->strings["Can view my default channel profile"] = "Puede verse mi perfil de canal predeterminado.";
     $a->strings["Can view my connections"] = "Pueden verse mis conexiones";
     $a->strings["Can view my file storage and photos"] = "Pueden verse mi repositorio de ficheros y mis fotos";
     $a->strings["Can view my webpages"] = "Pueden verse mis páginas web";
    -$a->strings["Can send me their channel stream and posts"] = "Me pueden enviar sus entradas y flujo de actividad del canal";
    +$a->strings["Can send me their channel stream and posts"] = "Me pueden enviar sus entradas y contenidos del canal";
     $a->strings["Can post on my channel page (\"wall\")"] = "Pueden crearse entradas en mi página de inicio del canal (“muro”)";
     $a->strings["Can comment on or like my posts"] = "Pueden publicarse comentarios en mis publicaciones o marcar mis entradas con 'me gusta'.";
     $a->strings["Can send me private mail messages"] = "Se me pueden enviar mensajes privados";
    @@ -995,6 +978,23 @@ $a->strings["Celebrity/Soapbox"] = "Página para fans";
     $a->strings["Group Repository"] = "Repositorio de grupo";
     $a->strings["Custom/Expert Mode"] = "Modo personalizado/experto";
     $a->strings["Profile Photos"] = "Fotos del perfil";
    +$a->strings["Not a valid email address"] = "Dirección de correo no válida";
    +$a->strings["Your email domain is not among those allowed on this site"] = "Su dirección de correo no pertenece a ninguno de los dominios permitidos en este sitio.";
    +$a->strings["Your email address is already registered at this site."] = "Su dirección de correo está ya registrada en este sitio.";
    +$a->strings["An invitation is required."] = "Es obligatorio que le inviten.";
    +$a->strings["Invitation could not be verified."] = "No se ha podido verificar su invitación.";
    +$a->strings["Please enter the required information."] = "Por favor introduzca la información requerida.";
    +$a->strings["Failed to store account information."] = "La información de la cuenta no se ha podido guardar.";
    +$a->strings["Registration confirmation for %s"] = "Confirmación de registro para %s";
    +$a->strings["Registration request at %s"] = "Solicitud de registro en %s";
    +$a->strings["your registration password"] = "su contraseña de registro";
    +$a->strings["Registration details for %s"] = "Detalles del registro de %s";
    +$a->strings["Account approved."] = "Cuenta aprobada.";
    +$a->strings["Registration revoked for %s"] = "Registro revocado para %s";
    +$a->strings["Account verified. Please login."] = "Cuenta verificada. Por favor, inicie sesión.";
    +$a->strings["Click here to upgrade."] = "Pulse aquí para actualizar";
    +$a->strings["This action exceeds the limits set by your subscription plan."] = "Esta acción supera los límites establecidos por su plan de suscripción ";
    +$a->strings["This action is not available under your subscription plan."] = "Esta acción no está disponible en su plan de suscripción.";
     $a->strings["Permission Denied."] = "Permiso denegado";
     $a->strings["File not found."] = "Fichero no encontrado.";
     $a->strings["Edit file permissions"] = "Modificar los permisos del fichero";
    @@ -1214,8 +1214,6 @@ $a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for t
     $a->strings["Bookmark added"] = "Marcador añadido";
     $a->strings["My Bookmarks"] = "Mis marcadores";
     $a->strings["My Connections Bookmarks"] = "Marcadores de mis conexiones";
    -$a->strings["\$Projectname"] = "\$Projectname";
    -$a->strings["Welcome to %s"] = "Bienvenido a %s";
     $a->strings["This setting requires special processing and editing has been blocked."] = "Este ajuste necesita de un proceso especial y la edición ha sido bloqueada.";
     $a->strings["Configuration Editor"] = "Editor de configuración";
     $a->strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Atención: El cambio de algunos ajustes puede volver inutilizable su canal. Por favor, abandone la página excepto que esté seguro y sepa cómo usar correctamente esta característica.";
    @@ -1477,43 +1475,25 @@ $a->strings["For either option, please choose whether to make this hub your new
     $a->strings["Make this hub my primary location"] = "Convertir este servidor en mi ubicación primaria";
     $a->strings["Import existing posts if possible (experimental - limited by available memory"] = "Importar el contenido publicado si es posible (experimental - limitado por la memoria disponible";
     $a->strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Este proceso puede tardar varios minutos en completarse. Por favor envíe el formulario una sola vez y mantenga esta página abierta hasta que termine.";
    -$a->strings["Page owner information could not be retrieved."] = "La información del propietario de la página no pudo ser recuperada.";
    -$a->strings["Album not found."] = "Álbum no encontrado.";
    -$a->strings["Delete Album"] = "Borrar álbum";
    -$a->strings["Delete Photo"] = "Borrar foto";
    -$a->strings["No photos selected"] = "No hay fotos seleccionadas";
    -$a->strings["Access to this item is restricted."] = "El acceso a este elemento está restringido.";
    -$a->strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado.";
    -$a->strings["%1$.2f MB photo storage used."] = "%1$.2f MB de almacenamiento de fotos utilizado.";
    -$a->strings["Upload Photos"] = "Subir fotos";
    -$a->strings["Enter an album name"] = "Introducir un nombre de álbum";
    -$a->strings["or select an existing album (doubleclick)"] = "o seleccionar uno existente (doble click)";
    -$a->strings["Create a status post for this upload"] = "Crear una entrada de estado para esta subida";
    -$a->strings["Caption (optional):"] = "Título (opcional):";
    -$a->strings["Description (optional):"] = "Descripción (opcional):";
    -$a->strings["Album name could not be decoded"] = "El nombre del álbum no ha podido ser descifrado";
    -$a->strings["Contact Photos"] = "Fotos de contacto";
    -$a->strings["Show Newest First"] = "Mostrar lo más reciente primero";
    -$a->strings["Show Oldest First"] = "Mostrar lo más antiguo primero";
    -$a->strings["Permission denied. Access to this item may be restricted."] = "Permiso denegado. El acceso a este elemento puede estar restringido.";
    -$a->strings["Photo not available"] = "Foto no disponible";
    -$a->strings["Use as profile photo"] = "Usar como foto del perfil";
    -$a->strings["Private Photo"] = "Foto privada";
    -$a->strings["Previous"] = "Anterior";
    -$a->strings["View Full Size"] = "Ver tamaño completo";
    -$a->strings["Edit photo"] = "Editar foto";
    -$a->strings["Rotate CW (right)"] = "Girar CW (a la derecha)";
    -$a->strings["Rotate CCW (left)"] = "Girar CCW (a la izquierda)";
    -$a->strings["Enter a new album name"] = "Introducir un nuevo nombre de álbum";
    -$a->strings["or select an existing one (doubleclick)"] = "o seleccionar uno (doble click) existente";
    -$a->strings["Caption"] = "Título";
    -$a->strings["Add a Tag"] = "Añadir una etiqueta";
    -$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com";
    -$a->strings["Flag as adult in album view"] = "Marcar como \"solo para adultos\" en el álbum";
    -$a->strings["In This Photo:"] = "En esta foto:";
    -$a->strings["Map"] = "Mapa";
    -$a->strings["View Album"] = "Ver álbum";
    -$a->strings["Recent Photos"] = "Fotos recientes";
    +$a->strings["Total invitation limit exceeded."] = "Se ha superado el límite máximo de invitaciones.";
    +$a->strings["%s : Not a valid email address."] = "%s : No es una dirección de correo electrónico válida. ";
    +$a->strings["Please join us on \$Projectname"] = "Únase a nosotros en \$Projectname";
    +$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "Excedido el límite de invitaciones. Por favor, contacte con el Administrador de su sitio.";
    +$a->strings["%s : Message delivery failed."] = "%s : Falló el envío del mensaje.";
    +$a->strings["%d message sent."] = array(
    +	0 => "%d mensajes enviados.",
    +	1 => "%d mensajes enviados.",
    +);
    +$a->strings["You have no more invitations available"] = "No tiene más invitaciones disponibles";
    +$a->strings["Send invitations"] = "Enviar invitaciones";
    +$a->strings["Enter email addresses, one per line:"] = "Introduzca las direcciones de correo electrónico, una por línea:";
    +$a->strings["Your message:"] = "Su mensaje:";
    +$a->strings["Please join my community on \$Projectname."] = "Por favor, únase a mi comunidad en \$Projectname.";
    +$a->strings["You will need to supply this invitation code: "] = "Debe proporcionar este código de invitación:";
    +$a->strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Regístrese en cualquier sitio de \$Projectname (están todos interconectados)";
    +$a->strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Introduzca mi dirección \$Projectname en la caja de búsqueda del sitio.";
    +$a->strings["or visit "] = "o visite ";
    +$a->strings["3. Click [Connect]"] = "3. Pulse [conectar]";
     $a->strings["Fetching URL returns error: %1\$s"] = "Al intentar obtener la dirección, retorna el error: %1\$s";
     $a->strings["Image uploaded but image cropping failed."] = "Imagen actualizada, pero el recorte de la imagen ha fallado. ";
     $a->strings["Image resize failed."] = "El ajuste del tamaño de la imagen ha fallado.";
    @@ -1628,7 +1608,7 @@ $a->strings["System theme"] = "Tema gráfico del sistema";
     $a->strings["Default system theme - may be over-ridden by user profiles - change theme settings"] = "Tema del sistema por defecto - se puede cambiar por cada perfil de usuario - modificar los ajustes del tema";
     $a->strings["Mobile system theme"] = "Tema del sistema para móviles";
     $a->strings["Theme for mobile devices"] = "Tema para dispositivos móviles";
    -$a->strings["Allow Feeds as Connections"] = "Permitir flujos RSS como conexiones";
    +$a->strings["Allow Feeds as Connections"] = "Permitir contenidos RSS como conexiones";
     $a->strings["(Heavy system resource usage)"] = "(Uso intenso de los recursos del sistema)";
     $a->strings["Maximum image size"] = "Tamaño máximo de la imagen";
     $a->strings["Maximum size in bytes of uploaded images. Default is 0, which means no limits."] = "Tamaño máximo en bytes de la imagen subida. Por defecto, es 0, lo que significa que no hay límites.";
    @@ -1654,8 +1634,8 @@ $a->strings["Verify Email Addresses"] = "Verificar las direcciones de correo ele
     $a->strings["Check to verify email addresses used in account registration (recommended)."] = "Activar para la verificación de la dirección de correo electrónico en el registro de una cuenta (recomendado).";
     $a->strings["Force publish"] = "Forzar la publicación";
     $a->strings["Check to force all profiles on this site to be listed in the site directory."] = "Intentar forzar todos los perfiles para que sean listados en el directorio de este sitio.";
    -$a->strings["Disable discovery tab"] = "Desactivar la pestaña \"Descubrir\"";
    -$a->strings["Remove the tab in the network view with public content pulled from sources chosen for this site."] = "Quitar la pestaña para ver contenido público extraído de las fuentes elegidas por este sitio.";
    +$a->strings["Import Public Streams"] = "Importar contenido público";
    +$a->strings["Import and allow access to public content pulled from other sites. Warning: this content is unmoderated."] = "Importar y permitir acceso al contenido público sacado de otros sitios. Advertencia: este contenido no está moderado, por lo que podría encontrar cosas inapropiadas u ofensivas.";
     $a->strings["login on Homepage"] = "acceso a la página personal";
     $a->strings["Present a login box to visitors on the home page if no other content has been configured."] = "Presentar a los visitantes una casilla de identificación en la página de inicio, si no se ha configurado otro tipo de contenido.";
     $a->strings["Directory Server URL"] = "URL del servidor de directorio";
    @@ -1946,25 +1926,8 @@ $a->strings["Sync now"] = "Sincronizar ahora";
     $a->strings["Please wait several minutes between consecutive operations."] = "Por favor, espere algunos minutos entre operaciones consecutivas.";
     $a->strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Cuando sea posible, elimine una ubicación iniciando sesión en el sitio web o \"hub\" y borrando su canal.";
     $a->strings["Use this form to drop the location if the hub is no longer operating."] = "Utilice este formulario para eliminar la dirección si el \"hub\" no está funcionando desde hace tiempo.";
    -$a->strings["Total invitation limit exceeded."] = "Se ha superado el límite máximo de invitaciones.";
    -$a->strings["%s : Not a valid email address."] = "%s : No es una dirección de correo electrónico válida. ";
    -$a->strings["Please join us on \$Projectname"] = "Únase a nosotros en \$Projectname";
    -$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "Excedido el límite de invitaciones. Por favor, contacte con el Administrador de su sitio.";
    -$a->strings["%s : Message delivery failed."] = "%s : Falló el envío del mensaje.";
    -$a->strings["%d message sent."] = array(
    -	0 => "%d mensajes enviados.",
    -	1 => "%d mensajes enviados.",
    -);
    -$a->strings["You have no more invitations available"] = "No tiene más invitaciones disponibles";
    -$a->strings["Send invitations"] = "Enviar invitaciones";
    -$a->strings["Enter email addresses, one per line:"] = "Introduzca las direcciones de correo electrónico, una por línea:";
    -$a->strings["Your message:"] = "Su mensaje:";
    -$a->strings["Please join my community on \$Projectname."] = "Por favor, únase a mi comunidad en \$Projectname.";
    -$a->strings["You will need to supply this invitation code: "] = "Debe proporcionar este código de invitación:";
    -$a->strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Regístrese en cualquier sitio de \$Projectname (están todos interconectados)";
    -$a->strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Introduzca mi dirección \$Projectname en la caja de búsqueda del sitio.";
    -$a->strings["or visit "] = "o visite ";
    -$a->strings["3. Click [Connect]"] = "3. Pulse [conectar]";
    +$a->strings["\$Projectname"] = "\$Projectname";
    +$a->strings["Welcome to %s"] = "Bienvenido a %s";
     $a->strings["Please login."] = "Por favor, inicie sesión.";
     $a->strings["Xchan Lookup"] = "Búsqueda de canales";
     $a->strings["Lookup xchan beginning with (or webbie): "] = "Buscar un canal (o un \"webbie\") que comience por:";
    @@ -1972,6 +1935,43 @@ $a->strings["Not found."] = "No encontrado.";
     $a->strings["You must be logged in to see this page."] = "Debe haber iniciado sesión para poder ver esta página.";
     $a->strings["Insufficient permissions.  Request redirected to profile page."] = "Permisos insuficientes. Petición redirigida a la página del perfil.";
     $a->strings["Item not available."] = "Elemento no disponible";
    +$a->strings["Page owner information could not be retrieved."] = "La información del propietario de la página no pudo ser recuperada.";
    +$a->strings["Album not found."] = "Álbum no encontrado.";
    +$a->strings["Delete Album"] = "Borrar álbum";
    +$a->strings["Delete Photo"] = "Borrar foto";
    +$a->strings["No photos selected"] = "No hay fotos seleccionadas";
    +$a->strings["Access to this item is restricted."] = "El acceso a este elemento está restringido.";
    +$a->strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB de %2$.2f MB de almacenamiento de fotos utilizado.";
    +$a->strings["%1$.2f MB photo storage used."] = "%1$.2f MB de almacenamiento de fotos utilizado.";
    +$a->strings["Upload Photos"] = "Subir fotos";
    +$a->strings["Enter an album name"] = "Introducir un nombre de álbum";
    +$a->strings["or select an existing album (doubleclick)"] = "o seleccionar uno existente (doble click)";
    +$a->strings["Create a status post for this upload"] = "Crear una entrada de estado para esta subida";
    +$a->strings["Caption (optional):"] = "Título (opcional):";
    +$a->strings["Description (optional):"] = "Descripción (opcional):";
    +$a->strings["Album name could not be decoded"] = "El nombre del álbum no ha podido ser descifrado";
    +$a->strings["Contact Photos"] = "Fotos de contacto";
    +$a->strings["Show Newest First"] = "Mostrar lo más reciente primero";
    +$a->strings["Show Oldest First"] = "Mostrar lo más antiguo primero";
    +$a->strings["Permission denied. Access to this item may be restricted."] = "Permiso denegado. El acceso a este elemento puede estar restringido.";
    +$a->strings["Photo not available"] = "Foto no disponible";
    +$a->strings["Use as profile photo"] = "Usar como foto del perfil";
    +$a->strings["Private Photo"] = "Foto privada";
    +$a->strings["Previous"] = "Anterior";
    +$a->strings["View Full Size"] = "Ver tamaño completo";
    +$a->strings["Edit photo"] = "Editar foto";
    +$a->strings["Rotate CW (right)"] = "Girar CW (a la derecha)";
    +$a->strings["Rotate CCW (left)"] = "Girar CCW (a la izquierda)";
    +$a->strings["Enter a new album name"] = "Introducir un nuevo nombre de álbum";
    +$a->strings["or select an existing one (doubleclick)"] = "o seleccionar uno (doble click) existente";
    +$a->strings["Caption"] = "Título";
    +$a->strings["Add a Tag"] = "Añadir una etiqueta";
    +$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Ejemplos: @eva, @Carmen_Osuna, @jaime@ejemplo.com";
    +$a->strings["Flag as adult in album view"] = "Marcar como \"solo para adultos\" en el álbum";
    +$a->strings["In This Photo:"] = "En esta foto:";
    +$a->strings["Map"] = "Mapa";
    +$a->strings["View Album"] = "Ver álbum";
    +$a->strings["Recent Photos"] = "Fotos recientes";
     $a->strings["Remote privacy information not available."] = "La información privada remota no está disponible.";
     $a->strings["Visible to:"] = "Visible para:";
     $a->strings["Export Channel"] = "Exportar el canal";
    @@ -2082,7 +2082,6 @@ $a->strings["Delete Conversation"] = "Eliminar conversación";
     $a->strings["No secure communications available. You may be able to respond from the sender's profile page."] = "Comunicación segura no disponible. Pero puede responder desde la página del perfil del remitente.";
     $a->strings["Send Reply"] = "Responder";
     $a->strings["Your message for %s (%s):"] = "Su mensaje para %s (%s):";
    -$a->strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "La autenticación desde su servidor está bloqueada. Ha iniciado sesión localmente. Por favor, salga de la sesión y vuelva a intentarlo.";
     $a->strings["No service class restrictions found."] = "No se han encontrado restricciones sobre esta clase de servicio.";
     $a->strings["Version %s"] = "Versión %s";
     $a->strings["Installed plugins/addons/apps:"] = "Extensiones/Aplicaciones instaladas:";
    @@ -2213,3 +2212,4 @@ $a->strings["Website SSL certificate is not valid. Please correct."] = "El certi
     $a->strings["[hubzilla] Website SSL error for %s"] = "[hubzilla] Error SSL del sitio web en %s";
     $a->strings["Cron/Scheduled tasks not running."] = "Las tareas del Planificador/Cron no están funcionando.";
     $a->strings["[hubzilla] Cron tasks not running on %s"] = "[hubzilla] Las tareas de Cron no están funcionando en %s";
    +$a->strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "La autenticación desde su servidor está bloqueada. Ha iniciado sesión localmente. Por favor, salga de la sesión y vuelva a intentarlo.";
    diff --git a/view/nl/hmessages.po b/view/nl/hmessages.po
    index c26eddc02..d12514ea0 100644
    --- a/view/nl/hmessages.po
    +++ b/view/nl/hmessages.po
    @@ -8,8 +8,8 @@ msgid ""
     msgstr ""
     "Project-Id-Version: Redmatrix\n"
     "Report-Msgid-Bugs-To: \n"
    -"POT-Creation-Date: 2015-12-04 00:03-0800\n"
    -"PO-Revision-Date: 2015-12-07 13:18+0000\n"
    +"POT-Creation-Date: 2015-12-11 00:03-0800\n"
    +"PO-Revision-Date: 2015-12-12 15:58+0000\n"
     "Last-Translator: jeroenpraat \n"
     "Language-Team: Dutch (http://www.transifex.com/Friendica/red-matrix/language/nl/)\n"
     "MIME-Version: 1.0\n"
    @@ -18,7 +18,7 @@ msgstr ""
     "Language: nl\n"
     "Plural-Forms: nplurals=2; plural=(n != 1);\n"
     
    -#: ../../include/Contact.php:101 ../../include/identity.php:953
    +#: ../../include/Contact.php:101 ../../include/identity.php:947
     #: ../../include/widgets.php:137 ../../include/widgets.php:175
     #: ../../include/conversation.php:953 ../../mod/match.php:64
     #: ../../mod/directory.php:318 ../../mod/suggest.php:52
    @@ -77,25 +77,25 @@ msgstr "Chatkanaal niet gevonden"
     #: ../../mod/editwebpage.php:125 ../../mod/profile.php:64
     #: ../../mod/profile.php:72 ../../mod/api.php:26 ../../mod/api.php:31
     #: ../../mod/fsuggest.php:78 ../../mod/sources.php:66
    -#: ../../mod/notifications.php:66 ../../mod/photos.php:70
    -#: ../../mod/profile_photo.php:341 ../../mod/profile_photo.php:354
    -#: ../../mod/thing.php:271 ../../mod/thing.php:291 ../../mod/thing.php:328
    -#: ../../mod/editblock.php:65 ../../mod/network.php:12
    -#: ../../mod/pdledit.php:21 ../../mod/register.php:72
    +#: ../../mod/notifications.php:66 ../../mod/invite.php:13
    +#: ../../mod/invite.php:87 ../../mod/profile_photo.php:341
    +#: ../../mod/profile_photo.php:354 ../../mod/thing.php:271
    +#: ../../mod/thing.php:291 ../../mod/thing.php:328 ../../mod/editblock.php:65
    +#: ../../mod/network.php:12 ../../mod/pdledit.php:21 ../../mod/register.php:72
     #: ../../mod/editlayout.php:63 ../../mod/editlayout.php:87
     #: ../../mod/settings.php:568 ../../mod/webpages.php:69
     #: ../../mod/appman.php:66 ../../mod/layouts.php:69 ../../mod/layouts.php:76
    -#: ../../mod/layouts.php:87 ../../mod/locs.php:83 ../../mod/invite.php:13
    -#: ../../mod/invite.php:104 ../../mod/regmod.php:17 ../../mod/channel.php:100
    -#: ../../mod/channel.php:214 ../../mod/channel.php:254
    -#: ../../mod/editpost.php:13 ../../mod/chat.php:94 ../../mod/chat.php:99
    -#: ../../mod/viewsrc.php:14 ../../mod/authtest.php:13
    -#: ../../mod/connections.php:29 ../../mod/manage.php:6 ../../mod/menu.php:74
    -#: ../../mod/mail.php:118 ../../mod/service_limits.php:7
    -#: ../../mod/suggest.php:26 ../../mod/events.php:260 ../../mod/message.php:16
    -#: ../../mod/block.php:22 ../../mod/block.php:72 ../../mod/mitem.php:111
    -#: ../../mod/sharedwithme.php:7 ../../mod/viewconnections.php:22
    -#: ../../mod/viewconnections.php:27 ../../index.php:182 ../../index.php:365
    +#: ../../mod/layouts.php:87 ../../mod/locs.php:83 ../../mod/regmod.php:17
    +#: ../../mod/channel.php:100 ../../mod/channel.php:214
    +#: ../../mod/channel.php:254 ../../mod/photos.php:70 ../../mod/editpost.php:13
    +#: ../../mod/chat.php:94 ../../mod/chat.php:99 ../../mod/viewsrc.php:14
    +#: ../../mod/authtest.php:13 ../../mod/connections.php:29
    +#: ../../mod/manage.php:6 ../../mod/menu.php:74 ../../mod/mail.php:126
    +#: ../../mod/service_limits.php:7 ../../mod/suggest.php:26
    +#: ../../mod/events.php:260 ../../mod/message.php:16 ../../mod/block.php:22
    +#: ../../mod/block.php:72 ../../mod/mitem.php:111 ../../mod/sharedwithme.php:7
    +#: ../../mod/viewconnections.php:22 ../../mod/viewconnections.php:27
    +#: ../../index.php:182 ../../index.php:365
     msgid "Permission denied."
     msgstr "Toegang geweigerd"
     
    @@ -149,16 +149,16 @@ msgstr "Planning-postvak IN"
     msgid "Schedule Outbox"
     msgstr "Planning-postvak UIT"
     
    -#: ../../include/RedDAV/RedBrowser.php:164 ../../include/widgets.php:1331
    +#: ../../include/RedDAV/RedBrowser.php:164 ../../include/widgets.php:1330
     #: ../../include/conversation.php:1027 ../../include/apps.php:360
    -#: ../../include/apps.php:415 ../../mod/photos.php:759
    -#: ../../mod/photos.php:1198
    +#: ../../include/apps.php:415 ../../mod/photos.php:754
    +#: ../../mod/photos.php:1195
     msgid "Unknown"
     msgstr "Onbekend"
     
     #: ../../include/RedDAV/RedBrowser.php:226 ../../include/conversation.php:1629
     #: ../../include/nav.php:93 ../../include/apps.php:135
    -#: ../../mod/fbrowser.php:114
    +#: ../../mod/fbrowser.php:109
     msgid "Files"
     msgstr "Bestanden"
     
    @@ -179,12 +179,12 @@ msgstr "Aanmaken"
     
     #: ../../include/RedDAV/RedBrowser.php:231
     #: ../../include/RedDAV/RedBrowser.php:305 ../../include/widgets.php:1343
    -#: ../../mod/photos.php:784 ../../mod/photos.php:1317
    -#: ../../mod/profile_photo.php:453
    +#: ../../mod/profile_photo.php:453 ../../mod/photos.php:781
    +#: ../../mod/photos.php:1316
     msgid "Upload"
     msgstr "Uploaden"
     
    -#: ../../include/RedDAV/RedBrowser.php:235 ../../mod/admin.php:974
    +#: ../../include/RedDAV/RedBrowser.php:235 ../../mod/admin.php:981
     #: ../../mod/settings.php:588 ../../mod/settings.php:614
     #: ../../mod/sharedwithme.php:95
     msgid "Name"
    @@ -219,10 +219,10 @@ msgstr "Bewerken"
     #: ../../include/RedDAV/RedBrowser.php:241 ../../include/conversation.php:657
     #: ../../include/ItemObject.php:120 ../../include/apps.php:260
     #: ../../mod/group.php:173 ../../mod/blocks.php:155 ../../mod/connedit.php:551
    -#: ../../mod/editwebpage.php:223 ../../mod/photos.php:1129
    -#: ../../mod/thing.php:258 ../../mod/editblock.php:181 ../../mod/admin.php:809
    -#: ../../mod/admin.php:968 ../../mod/editlayout.php:179
    -#: ../../mod/settings.php:649 ../../mod/webpages.php:183
    +#: ../../mod/editwebpage.php:223 ../../mod/thing.php:258
    +#: ../../mod/editblock.php:181 ../../mod/admin.php:816 ../../mod/admin.php:975
    +#: ../../mod/editlayout.php:179 ../../mod/settings.php:649
    +#: ../../mod/webpages.php:183 ../../mod/photos.php:1126
     msgid "Delete"
     msgstr "Verwijderen"
     
    @@ -253,7 +253,7 @@ msgid "Delete this item?"
     msgstr "Dit item verwijderen?"
     
     #: ../../include/js_strings.php:6 ../../include/ItemObject.php:696
    -#: ../../mod/photos.php:1047 ../../mod/photos.php:1165
    +#: ../../mod/photos.php:1044 ../../mod/photos.php:1162
     msgid "Comment"
     msgstr "Reactie"
     
    @@ -326,17 +326,17 @@ msgstr "Omschrijving (optioneel)"
     #: ../../mod/poke.php:171 ../../mod/profiles.php:675
     #: ../../mod/connedit.php:715 ../../mod/fsuggest.php:108
     #: ../../mod/sources.php:104 ../../mod/sources.php:138
    -#: ../../mod/import.php:527 ../../mod/photos.php:637 ../../mod/photos.php:1008
    -#: ../../mod/photos.php:1048 ../../mod/photos.php:1166 ../../mod/thing.php:313
    +#: ../../mod/import.php:527 ../../mod/invite.php:142 ../../mod/thing.php:313
     #: ../../mod/thing.php:359 ../../mod/import_items.php:122
    -#: ../../mod/pdledit.php:58 ../../mod/admin.php:435 ../../mod/admin.php:802
    -#: ../../mod/admin.php:966 ../../mod/admin.php:1103 ../../mod/admin.php:1297
    -#: ../../mod/admin.php:1382 ../../mod/settings.php:586
    +#: ../../mod/pdledit.php:58 ../../mod/admin.php:442 ../../mod/admin.php:809
    +#: ../../mod/admin.php:973 ../../mod/admin.php:1110 ../../mod/admin.php:1304
    +#: ../../mod/admin.php:1389 ../../mod/settings.php:586
     #: ../../mod/settings.php:698 ../../mod/settings.php:726
     #: ../../mod/settings.php:749 ../../mod/settings.php:834
     #: ../../mod/settings.php:1023 ../../mod/appman.php:99 ../../mod/locs.php:116
    -#: ../../mod/invite.php:142 ../../mod/xchan.php:11 ../../mod/chat.php:184
    -#: ../../mod/chat.php:213 ../../mod/mail.php:372 ../../mod/events.php:461
    +#: ../../mod/xchan.php:11 ../../mod/photos.php:637 ../../mod/photos.php:1005
    +#: ../../mod/photos.php:1045 ../../mod/photos.php:1163 ../../mod/chat.php:184
    +#: ../../mod/chat.php:213 ../../mod/mail.php:380 ../../mod/events.php:461
     #: ../../mod/events.php:658 ../../mod/mitem.php:231
     #: ../../view/theme/redbasic/php/config.php:99
     msgid "Submit"
    @@ -664,8 +664,8 @@ msgid "Visible to specific connections."
     msgstr "Voor specifieke connecties zichtbaar."
     
     #: ../../include/items.php:4319 ../../mod/filestorage.php:27
    -#: ../../mod/thing.php:86 ../../mod/admin.php:127 ../../mod/admin.php:1005
    -#: ../../mod/admin.php:1210 ../../mod/display.php:36 ../../mod/viewsrc.php:20
    +#: ../../mod/thing.php:86 ../../mod/admin.php:127 ../../mod/admin.php:1012
    +#: ../../mod/admin.php:1217 ../../mod/display.php:36 ../../mod/viewsrc.php:20
     msgid "Item not found."
     msgstr "Item niet gevonden."
     
    @@ -691,36 +691,6 @@ msgstr "Connectie: %s"
     msgid "Connection not found."
     msgstr "Connectie niet gevonden."
     
    -#: ../../include/network.php:630
    -msgid "view full size"
    -msgstr "volledige grootte tonen"
    -
    -#: ../../include/network.php:1608 ../../include/enotify.php:57
    -msgid "$Projectname Notification"
    -msgstr "$Projectname-notificatie"
    -
    -#: ../../include/network.php:1609 ../../include/enotify.php:58
    -msgid "$projectname"
    -msgstr "$projectname"
    -
    -#: ../../include/network.php:1611 ../../include/enotify.php:60
    -msgid "Thank You,"
    -msgstr "Bedankt,"
    -
    -#: ../../include/network.php:1613 ../../include/enotify.php:62
    -#, php-format
    -msgid "%s Administrator"
    -msgstr "Beheerder %s"
    -
    -#: ../../include/network.php:1655 ../../include/account.php:316
    -#: ../../include/account.php:343 ../../include/account.php:403
    -msgid "Administrator"
    -msgstr "Beheerder"
    -
    -#: ../../include/network.php:1669
    -msgid "No Subject"
    -msgstr "Geen onderwerp"
    -
     #: ../../include/event.php:22 ../../include/bb2diaspora.php:471
     #: ../../include/text.php:1392
     msgid "l F d, Y \\@ g:i A"
    @@ -736,7 +706,7 @@ msgstr "Start:"
     msgid "Finishes:"
     msgstr "Einde:"
     
    -#: ../../include/event.php:52 ../../include/identity.php:1004
    +#: ../../include/event.php:52 ../../include/identity.php:998
     #: ../../include/bb2diaspora.php:493 ../../include/text.php:1407
     #: ../../mod/directory.php:304
     msgid "Location:"
    @@ -831,206 +801,206 @@ msgstr "Opgevraagd kanaal is niet beschikbaar."
     msgid "Requested profile is not available."
     msgstr "Opgevraagd profiel is niet beschikbaar"
     
    -#: ../../include/identity.php:966 ../../mod/profiles.php:782
    +#: ../../include/identity.php:960 ../../mod/profiles.php:782
     msgid "Change profile photo"
     msgstr "Profielfoto veranderen"
     
    -#: ../../include/identity.php:972
    +#: ../../include/identity.php:966
     msgid "Profiles"
     msgstr "Profielen"
     
    -#: ../../include/identity.php:972
    +#: ../../include/identity.php:966
     msgid "Manage/edit profiles"
     msgstr "Profielen beheren/bewerken"
     
    -#: ../../include/identity.php:973 ../../mod/profiles.php:783
    +#: ../../include/identity.php:967 ../../mod/profiles.php:783
     msgid "Create New Profile"
     msgstr "Nieuw profiel aanmaken"
     
    -#: ../../include/identity.php:976 ../../include/nav.php:90
    +#: ../../include/identity.php:970 ../../include/nav.php:90
     msgid "Edit Profile"
     msgstr "Profiel bewerken"
     
    -#: ../../include/identity.php:988 ../../mod/profiles.php:794
    +#: ../../include/identity.php:982 ../../mod/profiles.php:794
     msgid "Profile Image"
     msgstr "Profielfoto"
     
    -#: ../../include/identity.php:991
    +#: ../../include/identity.php:985
     msgid "visible to everybody"
     msgstr "Voor iedereen zichtbaar"
     
    -#: ../../include/identity.php:992 ../../mod/profiles.php:677
    +#: ../../include/identity.php:986 ../../mod/profiles.php:677
     #: ../../mod/profiles.php:798
     msgid "Edit visibility"
     msgstr "Zichtbaarheid bewerken"
     
    -#: ../../include/identity.php:1008 ../../include/identity.php:1248
    +#: ../../include/identity.php:1002 ../../include/identity.php:1242
     msgid "Gender:"
     msgstr "Geslacht:"
     
    -#: ../../include/identity.php:1009 ../../include/identity.php:1292
    +#: ../../include/identity.php:1003 ../../include/identity.php:1286
     msgid "Status:"
     msgstr "Status:"
     
    -#: ../../include/identity.php:1010 ../../include/identity.php:1303
    +#: ../../include/identity.php:1004 ../../include/identity.php:1297
     msgid "Homepage:"
     msgstr "Homepagina:"
     
    -#: ../../include/identity.php:1011
    +#: ../../include/identity.php:1005
     msgid "Online Now"
     msgstr "Nu online"
     
    -#: ../../include/identity.php:1095 ../../include/identity.php:1173
    +#: ../../include/identity.php:1089 ../../include/identity.php:1167
     #: ../../mod/ping.php:318
     msgid "g A l F d"
     msgstr "G:i, l d F"
     
    -#: ../../include/identity.php:1096 ../../include/identity.php:1174
    +#: ../../include/identity.php:1090 ../../include/identity.php:1168
     msgid "F d"
     msgstr "d F"
     
    -#: ../../include/identity.php:1141 ../../include/identity.php:1213
    +#: ../../include/identity.php:1135 ../../include/identity.php:1207
     #: ../../mod/ping.php:341
     msgid "[today]"
     msgstr "[vandaag]"
     
    -#: ../../include/identity.php:1152
    +#: ../../include/identity.php:1146
     msgid "Birthday Reminders"
     msgstr "Verjaardagsherinneringen"
     
    -#: ../../include/identity.php:1153
    +#: ../../include/identity.php:1147
     msgid "Birthdays this week:"
     msgstr "Verjaardagen deze week:"
     
    -#: ../../include/identity.php:1206
    +#: ../../include/identity.php:1200
     msgid "[No description]"
     msgstr "[Geen omschrijving]"
     
    -#: ../../include/identity.php:1224
    +#: ../../include/identity.php:1218
     msgid "Event Reminders"
     msgstr "Herinneringen"
     
    -#: ../../include/identity.php:1225
    +#: ../../include/identity.php:1219
     msgid "Events this week:"
     msgstr "Gebeurtenissen deze week:"
     
    -#: ../../include/identity.php:1238 ../../include/identity.php:1355
    +#: ../../include/identity.php:1232 ../../include/identity.php:1349
     #: ../../include/apps.php:138 ../../mod/profperm.php:112
     msgid "Profile"
     msgstr "Profiel"
     
    -#: ../../include/identity.php:1246 ../../mod/settings.php:1029
    +#: ../../include/identity.php:1240 ../../mod/settings.php:1029
     msgid "Full Name:"
     msgstr "Volledige naam:"
     
    -#: ../../include/identity.php:1253
    +#: ../../include/identity.php:1247
     msgid "Like this channel"
     msgstr "Vind dit kanaal leuk"
     
    -#: ../../include/identity.php:1264 ../../include/taxonomy.php:414
    +#: ../../include/identity.php:1258 ../../include/taxonomy.php:414
     #: ../../include/conversation.php:1721 ../../include/ItemObject.php:179
    -#: ../../mod/photos.php:1086
    +#: ../../mod/photos.php:1083
     msgctxt "noun"
     msgid "Like"
     msgid_plural "Likes"
     msgstr[0] "vindt dit leuk"
     msgstr[1] "vinden dit leuk"
     
    -#: ../../include/identity.php:1277
    +#: ../../include/identity.php:1271
     msgid "j F, Y"
     msgstr "F j Y"
     
    -#: ../../include/identity.php:1278
    +#: ../../include/identity.php:1272
     msgid "j F"
     msgstr "F j"
     
    -#: ../../include/identity.php:1285
    +#: ../../include/identity.php:1279
     msgid "Birthday:"
     msgstr "Geboortedatum:"
     
    -#: ../../include/identity.php:1289 ../../mod/directory.php:299
    +#: ../../include/identity.php:1283 ../../mod/directory.php:299
     msgid "Age:"
     msgstr "Leeftijd:"
     
    -#: ../../include/identity.php:1298
    +#: ../../include/identity.php:1292
     #, php-format
     msgid "for %1$d %2$s"
     msgstr "voor %1$d %2$s"
     
    -#: ../../include/identity.php:1301 ../../mod/profiles.php:699
    +#: ../../include/identity.php:1295 ../../mod/profiles.php:699
     msgid "Sexual Preference:"
     msgstr "Seksuele voorkeur:"
     
    -#: ../../include/identity.php:1305 ../../mod/profiles.php:701
    +#: ../../include/identity.php:1299 ../../mod/profiles.php:701
     #: ../../mod/directory.php:315
     msgid "Hometown:"
     msgstr "Oorspronkelijk uit:"
     
    -#: ../../include/identity.php:1307
    +#: ../../include/identity.php:1301
     msgid "Tags:"
     msgstr "Tags:"
     
    -#: ../../include/identity.php:1309 ../../mod/profiles.php:702
    +#: ../../include/identity.php:1303 ../../mod/profiles.php:702
     msgid "Political Views:"
     msgstr "Politieke overtuigingen:"
     
    -#: ../../include/identity.php:1311
    +#: ../../include/identity.php:1305
     msgid "Religion:"
     msgstr "Religie:"
     
    -#: ../../include/identity.php:1313 ../../mod/directory.php:317
    +#: ../../include/identity.php:1307 ../../mod/directory.php:317
     msgid "About:"
     msgstr "Over:"
     
    -#: ../../include/identity.php:1315
    +#: ../../include/identity.php:1309
     msgid "Hobbies/Interests:"
     msgstr "Hobby's/interesses:"
     
    -#: ../../include/identity.php:1317 ../../mod/profiles.php:705
    +#: ../../include/identity.php:1311 ../../mod/profiles.php:705
     msgid "Likes:"
     msgstr "Houdt van:"
     
    -#: ../../include/identity.php:1319 ../../mod/profiles.php:706
    +#: ../../include/identity.php:1313 ../../mod/profiles.php:706
     msgid "Dislikes:"
     msgstr "Houdt niet van:"
     
    -#: ../../include/identity.php:1321
    +#: ../../include/identity.php:1315
     msgid "Contact information and Social Networks:"
     msgstr "Contactinformatie en sociale netwerken:"
     
    -#: ../../include/identity.php:1323
    +#: ../../include/identity.php:1317
     msgid "My other channels:"
     msgstr "Mijn andere kanalen"
     
    -#: ../../include/identity.php:1325
    +#: ../../include/identity.php:1319
     msgid "Musical interests:"
     msgstr "Muzikale interesses:"
     
    -#: ../../include/identity.php:1327
    +#: ../../include/identity.php:1321
     msgid "Books, literature:"
     msgstr "Boeken, literatuur:"
     
    -#: ../../include/identity.php:1329
    +#: ../../include/identity.php:1323
     msgid "Television:"
     msgstr "Televisie:"
     
    -#: ../../include/identity.php:1331
    +#: ../../include/identity.php:1325
     msgid "Film/dance/culture/entertainment:"
     msgstr "Films/dansen/cultuur/vermaak:"
     
    -#: ../../include/identity.php:1333
    +#: ../../include/identity.php:1327
     msgid "Love/Romance:"
     msgstr "Liefde/romantiek:"
     
    -#: ../../include/identity.php:1335
    +#: ../../include/identity.php:1329
     msgid "Work/employment:"
     msgstr "Werk/beroep:"
     
    -#: ../../include/identity.php:1337
    +#: ../../include/identity.php:1331
     msgid "School/education:"
     msgstr "School/opleiding:"
     
    -#: ../../include/identity.php:1357
    +#: ../../include/identity.php:1351
     msgid "Like this thing"
     msgstr "Vind dit ding leuk"
     
    @@ -1096,13 +1066,13 @@ msgid "Other networks and post services"
     msgstr "Andere netwerken en diensten"
     
     #: ../../include/acl_selectors.php:249 ../../mod/filestorage.php:147
    -#: ../../mod/photos.php:631 ../../mod/photos.php:1001 ../../mod/thing.php:310
    -#: ../../mod/thing.php:356 ../../mod/chat.php:211
    +#: ../../mod/thing.php:310 ../../mod/thing.php:356 ../../mod/photos.php:631
    +#: ../../mod/photos.php:998 ../../mod/chat.php:211
     msgid "Permissions"
     msgstr "Permissies"
     
     #: ../../include/acl_selectors.php:250 ../../include/ItemObject.php:384
    -#: ../../mod/photos.php:1218
    +#: ../../mod/photos.php:1215
     msgid "Close"
     msgstr "Sluiten"
     
    @@ -1264,7 +1234,7 @@ msgstr "Aantekeningen"
     
     #: ../../include/widgets.php:192 ../../include/text.php:868
     #: ../../include/text.php:880 ../../mod/rbmark.php:28 ../../mod/rbmark.php:100
    -#: ../../mod/admin.php:1442 ../../mod/admin.php:1462 ../../mod/filer.php:49
    +#: ../../mod/admin.php:1449 ../../mod/admin.php:1469 ../../mod/filer.php:49
     msgid "Save"
     msgstr "Opslaan"
     
    @@ -1357,8 +1327,8 @@ msgid "Channel Sources"
     msgstr "Kanaalbronnen"
     
     #: ../../include/widgets.php:554 ../../include/nav.php:202
    -#: ../../include/apps.php:134 ../../mod/admin.php:1064
    -#: ../../mod/admin.php:1264
    +#: ../../include/apps.php:134 ../../mod/admin.php:1071
    +#: ../../mod/admin.php:1271
     msgid "Settings"
     msgstr "Instellingen"
     
    @@ -1494,7 +1464,7 @@ msgstr "Voor beheerders"
     msgid "For Developers"
     msgstr "Voor ontwikkelaars"
     
    -#: ../../include/widgets.php:1214 ../../mod/admin.php:434
    +#: ../../include/widgets.php:1214 ../../mod/admin.php:441
     msgid "Site"
     msgstr "Hub-instellingen"
     
    @@ -1502,17 +1472,17 @@ msgstr "Hub-instellingen"
     msgid "Accounts"
     msgstr "Accounts"
     
    -#: ../../include/widgets.php:1216 ../../mod/admin.php:965
    +#: ../../include/widgets.php:1216 ../../mod/admin.php:972
     msgid "Channels"
     msgstr "Kanalen"
     
    -#: ../../include/widgets.php:1217 ../../mod/admin.php:1062
    -#: ../../mod/admin.php:1102
    +#: ../../include/widgets.php:1217 ../../mod/admin.php:1069
    +#: ../../mod/admin.php:1109
     msgid "Plugins"
     msgstr "Plug-ins"
     
    -#: ../../include/widgets.php:1218 ../../mod/admin.php:1262
    -#: ../../mod/admin.php:1296
    +#: ../../include/widgets.php:1218 ../../mod/admin.php:1269
    +#: ../../mod/admin.php:1303
     msgid "Themes"
     msgstr "Thema's"
     
    @@ -1529,7 +1499,7 @@ msgid "DB updates"
     msgstr "Database-updates"
     
     #: ../../include/widgets.php:1239 ../../include/widgets.php:1245
    -#: ../../mod/admin.php:1381
    +#: ../../mod/admin.php:1388
     msgid "Logs"
     msgstr "Logboeken"
     
    @@ -1545,12 +1515,12 @@ msgstr "Plug-in-opties"
     msgid "User registrations waiting for confirmation"
     msgstr "Accounts die op goedkeuring wachten"
     
    -#: ../../include/widgets.php:1325 ../../mod/photos.php:753
    -#: ../../mod/photos.php:1286
    +#: ../../include/widgets.php:1324 ../../mod/photos.php:748
    +#: ../../mod/photos.php:1283
     msgid "View Photo"
     msgstr "Foto weergeven"
     
    -#: ../../include/widgets.php:1341 ../../mod/photos.php:782
    +#: ../../include/widgets.php:1341 ../../mod/photos.php:779
     msgid "Edit Album"
     msgstr "Album bewerken"
     
    @@ -2207,42 +2177,42 @@ msgctxt "mood"
     msgid "%1$s is %2$s"
     msgstr "%1$s is %2$s"
     
    -#: ../../include/conversation.php:574 ../../mod/photos.php:1063
    +#: ../../include/conversation.php:574 ../../mod/photos.php:1060
     msgctxt "title"
     msgid "Likes"
     msgstr "vinden dit leuk"
     
    -#: ../../include/conversation.php:574 ../../mod/photos.php:1063
    +#: ../../include/conversation.php:574 ../../mod/photos.php:1060
     msgctxt "title"
     msgid "Dislikes"
     msgstr "vinden dit niet leuk"
     
    -#: ../../include/conversation.php:575 ../../mod/photos.php:1064
    +#: ../../include/conversation.php:575 ../../mod/photos.php:1061
     msgctxt "title"
     msgid "Agree"
     msgstr "eens"
     
    -#: ../../include/conversation.php:575 ../../mod/photos.php:1064
    +#: ../../include/conversation.php:575 ../../mod/photos.php:1061
     msgctxt "title"
     msgid "Disagree"
     msgstr "oneens"
     
    -#: ../../include/conversation.php:575 ../../mod/photos.php:1064
    +#: ../../include/conversation.php:575 ../../mod/photos.php:1061
     msgctxt "title"
     msgid "Abstain"
     msgstr "onthoudingen"
     
    -#: ../../include/conversation.php:576 ../../mod/photos.php:1065
    +#: ../../include/conversation.php:576 ../../mod/photos.php:1062
     msgctxt "title"
     msgid "Attending"
     msgstr "aanwezig"
     
    -#: ../../include/conversation.php:576 ../../mod/photos.php:1065
    +#: ../../include/conversation.php:576 ../../mod/photos.php:1062
     msgctxt "title"
     msgid "Not attending"
     msgstr "niet aanwezig"
     
    -#: ../../include/conversation.php:576 ../../mod/photos.php:1065
    +#: ../../include/conversation.php:576 ../../mod/photos.php:1062
     msgctxt "title"
     msgid "Might attend"
     msgstr "mogelijk aanwezig"
    @@ -2297,8 +2267,8 @@ msgstr "In context bekijken"
     
     #: ../../include/conversation.php:740 ../../include/conversation.php:1227
     #: ../../include/ItemObject.php:389 ../../mod/editwebpage.php:190
    -#: ../../mod/photos.php:1029 ../../mod/editblock.php:150
    -#: ../../mod/editlayout.php:148 ../../mod/editpost.php:129
    +#: ../../mod/editblock.php:150 ../../mod/editlayout.php:148
    +#: ../../mod/photos.php:1026 ../../mod/editpost.php:129
     msgid "Please wait"
     msgstr "Even wachten"
     
    @@ -2404,8 +2374,8 @@ msgstr "%s vinden dit niet leuk."
     msgid "Visible to everybody"
     msgstr "Voor iedereen zichtbaar"
     
    -#: ../../include/conversation.php:1155 ../../mod/mail.php:194
    -#: ../../mod/mail.php:308
    +#: ../../include/conversation.php:1155 ../../mod/mail.php:202
    +#: ../../mod/mail.php:316
     msgid "Please enter a link URL:"
     msgstr "Vul een internetadres/URL in:"
     
    @@ -2430,21 +2400,21 @@ msgid "Where are you right now?"
     msgstr "Waar bevind je je op dit moment?"
     
     #: ../../include/conversation.php:1161 ../../mod/editpost.php:56
    -#: ../../mod/mail.php:195 ../../mod/mail.php:309
    +#: ../../mod/mail.php:203 ../../mod/mail.php:317
     msgid "Expires YYYY-MM-DD HH:MM"
     msgstr "Verloopt op DD-MM-YYYY om HH:MM"
     
     #: ../../include/conversation.php:1169 ../../include/page_widgets.php:40
     #: ../../include/ItemObject.php:706 ../../mod/editwebpage.php:212
    -#: ../../mod/photos.php:1049 ../../mod/editblock.php:171
    -#: ../../mod/webpages.php:188 ../../mod/editpost.php:149
    +#: ../../mod/editblock.php:171 ../../mod/webpages.php:188
    +#: ../../mod/photos.php:1046 ../../mod/editpost.php:149
     #: ../../mod/events.php:458
     msgid "Preview"
     msgstr "Voorvertoning"
     
     #: ../../include/conversation.php:1192 ../../mod/blocks.php:154
    -#: ../../mod/photos.php:1028 ../../mod/webpages.php:182
    -#: ../../mod/layouts.php:184
    +#: ../../mod/webpages.php:182 ../../mod/layouts.php:184
    +#: ../../mod/photos.php:1025
     msgid "Share"
     msgstr "Delen"
     
    @@ -2498,7 +2468,7 @@ msgstr "foto uploaden"
     
     #: ../../include/conversation.php:1206 ../../mod/editwebpage.php:183
     #: ../../mod/editblock.php:143 ../../mod/editlayout.php:141
    -#: ../../mod/editpost.php:119 ../../mod/mail.php:240 ../../mod/mail.php:370
    +#: ../../mod/editpost.php:119 ../../mod/mail.php:248 ../../mod/mail.php:378
     msgid "Attach file"
     msgstr "Bestand toevoegen"
     
    @@ -2508,7 +2478,7 @@ msgstr "bestand toevoegen"
     
     #: ../../include/conversation.php:1208 ../../mod/editwebpage.php:184
     #: ../../mod/editblock.php:144 ../../mod/editlayout.php:142
    -#: ../../mod/editpost.php:120 ../../mod/mail.php:241 ../../mod/mail.php:371
    +#: ../../mod/editpost.php:120 ../../mod/mail.php:249 ../../mod/mail.php:379
     msgid "Insert web link"
     msgstr "Weblink invoegen"
     
    @@ -2591,7 +2561,7 @@ msgstr "Voorbeeld: bob@voorbeeld.nl, mary@voorbeeld.be"
     
     #: ../../include/conversation.php:1252 ../../mod/editwebpage.php:217
     #: ../../mod/editblock.php:176 ../../mod/editlayout.php:173
    -#: ../../mod/editpost.php:155 ../../mod/mail.php:245 ../../mod/mail.php:375
    +#: ../../mod/editpost.php:155 ../../mod/mail.php:253 ../../mod/mail.php:383
     msgid "Set expiration date"
     msgstr "Verloopdatum instellen"
     
    @@ -2600,7 +2570,7 @@ msgid "Set publish date"
     msgstr "Publicatiedatum instellen"
     
     #: ../../include/conversation.php:1257 ../../include/ItemObject.php:709
    -#: ../../mod/editpost.php:157 ../../mod/mail.php:247 ../../mod/mail.php:377
    +#: ../../mod/editpost.php:157 ../../mod/mail.php:255 ../../mod/mail.php:385
     msgid "Encrypt text"
     msgstr "Tekst versleutelen"
     
    @@ -2608,8 +2578,8 @@ msgstr "Tekst versleutelen"
     msgid "OK"
     msgstr "OK"
     
    -#: ../../include/conversation.php:1260 ../../mod/fbrowser.php:82
    -#: ../../mod/fbrowser.php:117 ../../mod/tagrm.php:11 ../../mod/tagrm.php:134
    +#: ../../include/conversation.php:1260 ../../mod/fbrowser.php:77
    +#: ../../mod/fbrowser.php:112 ../../mod/tagrm.php:11 ../../mod/tagrm.php:134
     #: ../../mod/settings.php:587 ../../mod/settings.php:613
     #: ../../mod/editpost.php:160
     msgid "Cancel"
    @@ -2668,7 +2638,7 @@ msgstr "Spam"
     msgid "Posts flagged as SPAM"
     msgstr "Berichten gemarkeerd als SPAM"
     
    -#: ../../include/conversation.php:1601 ../../mod/admin.php:973
    +#: ../../include/conversation.php:1601 ../../mod/admin.php:980
     msgid "Channel"
     msgstr "Kanaal"
     
    @@ -2720,13 +2690,13 @@ msgid "Manage Webpages"
     msgstr "Webpagina's beheren"
     
     #: ../../include/conversation.php:1697 ../../include/ItemObject.php:175
    -#: ../../include/ItemObject.php:187 ../../mod/photos.php:1082
    -#: ../../mod/photos.php:1094
    +#: ../../include/ItemObject.php:187 ../../mod/photos.php:1079
    +#: ../../mod/photos.php:1091
     msgid "View all"
     msgstr "Toon alles"
     
     #: ../../include/conversation.php:1724 ../../include/ItemObject.php:184
    -#: ../../mod/photos.php:1091
    +#: ../../mod/photos.php:1088
     msgctxt "noun"
     msgid "Dislike"
     msgid_plural "Dislikes"
    @@ -2824,7 +2794,7 @@ msgid "RSS/Atom"
     msgstr "RSS/Atom"
     
     #: ../../include/contact_selectors.php:79 ../../mod/id.php:15
    -#: ../../mod/id.php:16 ../../mod/admin.php:805 ../../mod/admin.php:814
    +#: ../../mod/id.php:16 ../../mod/admin.php:812 ../../mod/admin.php:821
     #: ../../boot.php:1483
     msgid "Email"
     msgstr "E-mail"
    @@ -2923,7 +2893,7 @@ msgid_plural "%d invitations available"
     msgstr[0] "%d uitnodiging beschikbaar"
     msgstr[1] "%d uitnodigingen beschikbaar"
     
    -#: ../../include/contact_widgets.php:19 ../../mod/admin.php:439
    +#: ../../include/contact_widgets.php:19 ../../mod/admin.php:446
     msgid "Advanced"
     msgstr "Geavanceerd"
     
    @@ -2976,6 +2946,23 @@ msgstr[1] "%d gemeenschappelijke connecties"
     msgid "show more"
     msgstr "meer connecties weergeven"
     
    +#: ../../include/enotify.php:57 ../../include/network.php:1608
    +msgid "$Projectname Notification"
    +msgstr "$Projectname-notificatie"
    +
    +#: ../../include/enotify.php:58 ../../include/network.php:1609
    +msgid "$projectname"
    +msgstr "$projectname"
    +
    +#: ../../include/enotify.php:60 ../../include/network.php:1611
    +msgid "Thank You,"
    +msgstr "Bedankt,"
    +
    +#: ../../include/enotify.php:62 ../../include/network.php:1613
    +#, php-format
    +msgid "%s Administrator"
    +msgstr "Beheerder %s"
    +
     #: ../../include/enotify.php:96
     #, php-format
     msgid "%s "
    @@ -3171,19 +3158,19 @@ msgstr "Antwoord van het kanaal op afstand was niet volledig."
     msgid "Channel was deleted and no longer exists."
     msgstr "Kanaal is verwijderd en bestaat niet meer."
     
    -#: ../../include/follow.php:152 ../../include/follow.php:180
    +#: ../../include/follow.php:152 ../../include/follow.php:181
     msgid "Protocol disabled."
     msgstr "Protocol uitgeschakeld."
     
    -#: ../../include/follow.php:170
    +#: ../../include/follow.php:171
     msgid "Channel discovery failed."
     msgstr "Kanaal ontdekken mislukt."
     
    -#: ../../include/follow.php:196
    +#: ../../include/follow.php:197
     msgid "local account not found."
     msgstr "lokale account niet gevonden."
     
    -#: ../../include/follow.php:220
    +#: ../../include/follow.php:221
     msgid "Cannot connect to yourself."
     msgstr "Kan niet met jezelf verbinden"
     
    @@ -3689,7 +3676,7 @@ msgstr "Veilig zoeken"
     #: ../../include/dir_fns.php:143 ../../mod/filestorage.php:151
     #: ../../mod/filestorage.php:159 ../../mod/removeme.php:60
     #: ../../mod/connedit.php:635 ../../mod/connedit.php:684 ../../mod/api.php:106
    -#: ../../mod/photos.php:626 ../../mod/admin.php:410 ../../mod/settings.php:577
    +#: ../../mod/admin.php:410 ../../mod/settings.php:577 ../../mod/photos.php:626
     #: ../../mod/menu.php:96 ../../mod/menu.php:153 ../../mod/events.php:447
     #: ../../mod/events.php:448 ../../mod/events.php:457 ../../mod/mitem.php:154
     #: ../../mod/mitem.php:155 ../../mod/mitem.php:228 ../../mod/mitem.php:229
    @@ -3701,8 +3688,8 @@ msgstr "Nee"
     #: ../../include/dir_fns.php:141 ../../include/dir_fns.php:142
     #: ../../include/dir_fns.php:143 ../../mod/filestorage.php:151
     #: ../../mod/filestorage.php:159 ../../mod/removeme.php:60
    -#: ../../mod/api.php:105 ../../mod/photos.php:626 ../../mod/admin.php:412
    -#: ../../mod/settings.php:577 ../../mod/menu.php:96 ../../mod/menu.php:153
    +#: ../../mod/api.php:105 ../../mod/admin.php:412 ../../mod/settings.php:577
    +#: ../../mod/photos.php:626 ../../mod/menu.php:96 ../../mod/menu.php:153
     #: ../../mod/events.php:447 ../../mod/events.php:448 ../../mod/events.php:457
     #: ../../mod/mitem.php:154 ../../mod/mitem.php:155 ../../mod/mitem.php:228
     #: ../../mod/mitem.php:229 ../../view/theme/redbasic/php/config.php:104
    @@ -3729,7 +3716,7 @@ msgstr "Een verwijderde collectie met deze naam is gereactiveerd. Bestaande item
     msgid "Add new connections to this collection (privacy group)"
     msgstr "Voeg nieuwe connecties aan deze collectie toe (privacy-groep)"
     
    -#: ../../include/group.php:251 ../../mod/admin.php:814
    +#: ../../include/group.php:251 ../../mod/admin.php:821
     msgid "All Channels"
     msgstr "Alle kanalen"
     
    @@ -3761,12 +3748,12 @@ msgstr "Datapakket ongeldig"
     msgid "Unable to verify channel signature"
     msgstr "Kanaalkenmerk kon niet worden geverifieerd.  "
     
    -#: ../../include/zot.php:2259
    +#: ../../include/zot.php:2275
     #, php-format
     msgid "Unable to verify site signature for %s"
     msgstr "Hubkenmerk voor %s kon niet worden geverifieerd"
     
    -#: ../../include/zot.php:3586
    +#: ../../include/zot.php:3601
     msgid "invalid target signature"
     msgstr "ongeldig doelkenmerk"
     
    @@ -3801,6 +3788,19 @@ msgstr "Aangemaakt"
     msgid "Edited"
     msgstr "Bewerkt"
     
    +#: ../../include/network.php:630
    +msgid "view full size"
    +msgstr "volledige grootte tonen"
    +
    +#: ../../include/network.php:1655 ../../include/account.php:316
    +#: ../../include/account.php:343 ../../include/account.php:403
    +msgid "Administrator"
    +msgstr "Beheerder"
    +
    +#: ../../include/network.php:1669
    +msgid "No Subject"
    +msgstr "Geen onderwerp"
    +
     #: ../../include/dba/dba_driver.php:141
     #, php-format
     msgid "Cannot locate DNS info for database server '%s'"
    @@ -3875,11 +3875,11 @@ msgstr "met ster"
     msgid "Add Tag"
     msgstr "Tag toevoegen"
     
    -#: ../../include/ItemObject.php:254 ../../mod/photos.php:1026
    +#: ../../include/ItemObject.php:254 ../../mod/photos.php:1023
     msgid "I like this (toggle)"
     msgstr "Vind ik leuk"
     
    -#: ../../include/ItemObject.php:255 ../../mod/photos.php:1027
    +#: ../../include/ItemObject.php:255 ../../mod/photos.php:1024
     msgid "I don't like this (toggle)"
     msgstr "Vind ik niet leuk"
     
    @@ -3935,18 +3935,18 @@ msgstr "Aan agenda toevoegen"
     msgid "Mark all seen"
     msgstr "Markeer alles als bekeken"
     
    -#: ../../include/ItemObject.php:378 ../../mod/photos.php:1212
    +#: ../../include/ItemObject.php:378 ../../mod/photos.php:1209
     msgctxt "noun"
     msgid "Likes"
     msgstr "vinden dit leuk"
     
    -#: ../../include/ItemObject.php:379 ../../mod/photos.php:1213
    +#: ../../include/ItemObject.php:379 ../../mod/photos.php:1210
     msgctxt "noun"
     msgid "Dislikes"
     msgstr "vinden dit niet leuk"
     
    -#: ../../include/ItemObject.php:694 ../../mod/photos.php:1045
    -#: ../../mod/photos.php:1163
    +#: ../../include/ItemObject.php:694 ../../mod/photos.php:1042
    +#: ../../mod/photos.php:1160
     msgid "This is you"
     msgstr "Dit ben jij"
     
    @@ -3962,78 +3962,6 @@ msgstr "Link invoegen"
     msgid "Video"
     msgstr "Video"
     
    -#: ../../include/account.php:27
    -msgid "Not a valid email address"
    -msgstr "Geen geldig e-mailadres"
    -
    -#: ../../include/account.php:29
    -msgid "Your email domain is not among those allowed on this site"
    -msgstr "Jouw e-maildomein is op deze hub niet toegestaan"
    -
    -#: ../../include/account.php:35
    -msgid "Your email address is already registered at this site."
    -msgstr "Jouw e-mailadres is al op deze hub geregistreerd."
    -
    -#: ../../include/account.php:67
    -msgid "An invitation is required."
    -msgstr "Een uitnodiging is vereist"
    -
    -#: ../../include/account.php:71
    -msgid "Invitation could not be verified."
    -msgstr "Uitnodiging kon niet geverifieerd worden"
    -
    -#: ../../include/account.php:121
    -msgid "Please enter the required information."
    -msgstr "Vul de vereiste informatie in."
    -
    -#: ../../include/account.php:188
    -msgid "Failed to store account information."
    -msgstr "Account-informatie kon niet opgeslagen worden."
    -
    -#: ../../include/account.php:248
    -#, php-format
    -msgid "Registration confirmation for %s"
    -msgstr "Registratiebevestiging voor %s"
    -
    -#: ../../include/account.php:314
    -#, php-format
    -msgid "Registration request at %s"
    -msgstr "Registratiebevestiging voor %s"
    -
    -#: ../../include/account.php:338
    -msgid "your registration password"
    -msgstr "jouw registratiewachtwoord"
    -
    -#: ../../include/account.php:341 ../../include/account.php:401
    -#, php-format
    -msgid "Registration details for %s"
    -msgstr "Registratiegegevens voor %s"
    -
    -#: ../../include/account.php:410
    -msgid "Account approved."
    -msgstr "Account goedgekeurd"
    -
    -#: ../../include/account.php:449
    -#, php-format
    -msgid "Registration revoked for %s"
    -msgstr "Registratie ingetrokken voor %s"
    -
    -#: ../../include/account.php:494
    -msgid "Account verified. Please login."
    -msgstr "Account is geverifieerd. Je kan inloggen."
    -
    -#: ../../include/account.php:707 ../../include/account.php:709
    -msgid "Click here to upgrade."
    -msgstr "Klik hier om te upgraden."
    -
    -#: ../../include/account.php:715
    -msgid "This action exceeds the limits set by your subscription plan."
    -msgstr "Deze handeling overschrijdt de beperkingen die voor jouw abonnement gelden."
    -
    -#: ../../include/account.php:720
    -msgid "This action is not available under your subscription plan."
    -msgstr "Deze handeling is niet mogelijk met jouw abonnement."
    -
     #: ../../include/apps.php:128
     msgid "Site Admin"
     msgstr "Hubbeheerder"
    @@ -4215,12 +4143,84 @@ msgstr "Groepsopslag"
     msgid "Custom/Expert Mode"
     msgstr "Expertmodus/handmatig aanpassen"
     
    -#: ../../include/photo/photo_driver.php:719 ../../mod/photos.php:94
    -#: ../../mod/photos.php:699 ../../mod/profile_photo.php:147
    +#: ../../include/photo/photo_driver.php:719 ../../mod/profile_photo.php:147
     #: ../../mod/profile_photo.php:239 ../../mod/profile_photo.php:379
    +#: ../../mod/photos.php:94 ../../mod/photos.php:699
     msgid "Profile Photos"
     msgstr "Profielfoto's"
     
    +#: ../../include/account.php:27
    +msgid "Not a valid email address"
    +msgstr "Geen geldig e-mailadres"
    +
    +#: ../../include/account.php:29
    +msgid "Your email domain is not among those allowed on this site"
    +msgstr "Jouw e-maildomein is op deze hub niet toegestaan"
    +
    +#: ../../include/account.php:35
    +msgid "Your email address is already registered at this site."
    +msgstr "Jouw e-mailadres is al op deze hub geregistreerd."
    +
    +#: ../../include/account.php:67
    +msgid "An invitation is required."
    +msgstr "Een uitnodiging is vereist"
    +
    +#: ../../include/account.php:71
    +msgid "Invitation could not be verified."
    +msgstr "Uitnodiging kon niet geverifieerd worden"
    +
    +#: ../../include/account.php:121
    +msgid "Please enter the required information."
    +msgstr "Vul de vereiste informatie in."
    +
    +#: ../../include/account.php:188
    +msgid "Failed to store account information."
    +msgstr "Account-informatie kon niet opgeslagen worden."
    +
    +#: ../../include/account.php:248
    +#, php-format
    +msgid "Registration confirmation for %s"
    +msgstr "Registratiebevestiging voor %s"
    +
    +#: ../../include/account.php:314
    +#, php-format
    +msgid "Registration request at %s"
    +msgstr "Registratiebevestiging voor %s"
    +
    +#: ../../include/account.php:338
    +msgid "your registration password"
    +msgstr "jouw registratiewachtwoord"
    +
    +#: ../../include/account.php:341 ../../include/account.php:401
    +#, php-format
    +msgid "Registration details for %s"
    +msgstr "Registratiegegevens voor %s"
    +
    +#: ../../include/account.php:410
    +msgid "Account approved."
    +msgstr "Account goedgekeurd"
    +
    +#: ../../include/account.php:449
    +#, php-format
    +msgid "Registration revoked for %s"
    +msgstr "Registratie ingetrokken voor %s"
    +
    +#: ../../include/account.php:494
    +msgid "Account verified. Please login."
    +msgstr "Account is geverifieerd. Je kan inloggen."
    +
    +#: ../../include/account.php:707 ../../include/account.php:709
    +msgid "Click here to upgrade."
    +msgstr "Klik hier om te upgraden."
    +
    +#: ../../include/account.php:715
    +msgid "This action exceeds the limits set by your subscription plan."
    +msgstr "Deze handeling overschrijdt de beperkingen die voor jouw abonnement gelden."
    +
    +#: ../../include/account.php:720
    +msgid "This action is not available under your subscription plan."
    +msgstr "Deze handeling is niet mogelijk met jouw abonnement."
    +
     #: ../../mod/filestorage.php:82
     msgid "Permission Denied."
     msgstr "Toegang geweigerd"
    @@ -4422,7 +4422,8 @@ msgstr "Geen overeenkomsten"
     msgid "OpenID protocol error. No ID returned."
     msgstr "OpenID-protocolfout. Geen ID terugontvangen."
     
    -#: ../../mod/openid.php:72 ../../mod/openid.php:179 ../../mod/post.php:285
    +#: ../../mod/openid.php:72 ../../mod/openid.php:179
    +#: ../../Zotlabs/Zot/Auth.php:248
     #, php-format
     msgid "Welcome %s. Remote authentication successful."
     msgstr "Welkom %s. Authenticatie op afstand geslaagd."
    @@ -4828,7 +4829,7 @@ msgstr "Please see the file \"install/INSTALL.txt\"."
     msgid "System check"
     msgstr "System check"
     
    -#: ../../mod/setup.php:285 ../../mod/photos.php:914 ../../mod/events.php:653
    +#: ../../mod/setup.php:285 ../../mod/photos.php:911 ../../mod/events.php:653
     #: ../../mod/events.php:660
     msgid "Next"
     msgstr "Volgende"
    @@ -5217,15 +5218,6 @@ msgstr "Mijn bladwijzers"
     msgid "My Connections Bookmarks"
     msgstr "Bladwijzers van mijn connecties"
     
    -#: ../../mod/home.php:57 ../../mod/home.php:65 ../../mod/siteinfo.php:61
    -msgid "$Projectname"
    -msgstr "$Projectname"
    -
    -#: ../../mod/home.php:75
    -#, php-format
    -msgid "Welcome to %s"
    -msgstr "Welkom op %s"
    -
     #: ../../mod/pconfig.php:27 ../../mod/pconfig.php:60
     msgid "This setting requires special processing and editing has been blocked."
     msgstr "Deze instelling vereist een speciaal proces  en bewerken is geblokkeerd."
    @@ -5330,7 +5322,7 @@ msgstr "Homepage"
     msgid "Interests"
     msgstr "Interesses"
     
    -#: ../../mod/profiles.php:457 ../../mod/admin.php:974
    +#: ../../mod/profiles.php:457 ../../mod/admin.php:981
     msgid "Address"
     msgstr "Kanaaladres"
     
    @@ -5583,11 +5575,11 @@ msgstr "Kanaal-activiteit"
     msgid "View recent posts and comments"
     msgstr "Recente berichten en reacties weergeven"
     
    -#: ../../mod/connedit.php:519 ../../mod/admin.php:811
    +#: ../../mod/connedit.php:519 ../../mod/admin.php:818
     msgid "Unblock"
     msgstr "Deblokkeren"
     
    -#: ../../mod/connedit.php:519 ../../mod/admin.php:810
    +#: ../../mod/connedit.php:519 ../../mod/admin.php:817
     msgid "Block"
     msgstr "Blokkeren"
     
    @@ -5743,7 +5735,7 @@ msgid ""
     " communication."
     msgstr "(%s) wil met jou verbinden. Keur dit connectieverzoek goed om onderling te kunnen communiceren."
     
    -#: ../../mod/connedit.php:710 ../../mod/admin.php:807
    +#: ../../mod/connedit.php:710 ../../mod/admin.php:814
     msgid "Approve"
     msgstr "Goedkeuren"
     
    @@ -6057,7 +6049,7 @@ msgstr "Verwijder item-tag"
     msgid "Select a tag to remove: "
     msgstr "Kies een tag om te verwijderen"
     
    -#: ../../mod/tagrm.php:133 ../../mod/photos.php:954
    +#: ../../mod/tagrm.php:133 ../../mod/photos.php:951
     msgid "Remove"
     msgstr "Verwijderen"
     
    @@ -6326,156 +6318,75 @@ msgid ""
     "only once and leave this page open until finished."
     msgstr "Dit proces kan enkele minuten in beslag nemen. Klik maar één keer op opslaan en verlaat deze pagina niet alvorens het proces is voltooid."
     
    -#: ../../mod/photos.php:79
    -msgid "Page owner information could not be retrieved."
    -msgstr "Informatie over de pagina-eigenaar werd niet ontvangen."
    -
    -#: ../../mod/photos.php:100
    -msgid "Album not found."
    -msgstr "Album niet gevonden."
    -
    -#: ../../mod/photos.php:127
    -msgid "Delete Album"
    -msgstr "Verwijder album"
    +#: ../../mod/invite.php:25
    +msgid "Total invitation limit exceeded."
    +msgstr "Limiet voor aantal uitnodigingen overschreden."
     
    -#: ../../mod/photos.php:171 ../../mod/photos.php:1009
    -msgid "Delete Photo"
    -msgstr "Verwijder foto"
    +#: ../../mod/invite.php:49
    +#, php-format
    +msgid "%s : Not a valid email address."
    +msgstr "%s : Geen geldig e-mailadres."
     
    -#: ../../mod/photos.php:501
    -msgid "No photos selected"
    -msgstr "Geen foto's geselecteerd"
    +#: ../../mod/invite.php:59
    +msgid "Please join us on $Projectname"
    +msgstr "Uitnodiging voor $Projectname"
     
    -#: ../../mod/photos.php:550
    -msgid "Access to this item is restricted."
    -msgstr "Toegang tot dit item is beperkt."
    +#: ../../mod/invite.php:70
    +msgid "Invitation limit exceeded. Please contact your site administrator."
    +msgstr "Limiet voor aantal uitnodigingen overschreden. Neem contact op met je hub-beheerder."
     
    -#: ../../mod/photos.php:589
    +#: ../../mod/invite.php:75
     #, php-format
    -msgid "%1$.2f MB of %2$.2f MB photo storage used."
    -msgstr "%1$.2f MB van %2$.2f MB aan foto-opslag gebruikt."
    +msgid "%s : Message delivery failed."
    +msgstr "%s: Aflevering bericht mislukt."
     
    -#: ../../mod/photos.php:592
    +#: ../../mod/invite.php:79
     #, php-format
    -msgid "%1$.2f MB photo storage used."
    -msgstr "%1$.2f MB aan foto-opslag gebruikt."
    -
    -#: ../../mod/photos.php:620
    -msgid "Upload Photos"
    -msgstr "Foto's uploaden"
    -
    -#: ../../mod/photos.php:624
    -msgid "Enter an album name"
    -msgstr "Vul een albumnaam in"
    -
    -#: ../../mod/photos.php:625
    -msgid "or select an existing album (doubleclick)"
    -msgstr "of kies een bestaand album (dubbelklikken)"
    -
    -#: ../../mod/photos.php:626
    -msgid "Create a status post for this upload"
    -msgstr "Plaats een bericht voor deze upload."
    -
    -#: ../../mod/photos.php:627
    -msgid "Caption (optional):"
    -msgstr "Bijschrift (optioneel):"
    -
    -#: ../../mod/photos.php:628
    -msgid "Description (optional):"
    -msgstr "Omschrijving (optioneel):"
    -
    -#: ../../mod/photos.php:655
    -msgid "Album name could not be decoded"
    -msgstr "Albumnaam kon niet gedecodeerd worden"
    -
    -#: ../../mod/photos.php:699 ../../mod/photos.php:1236
    -#: ../../mod/photos.php:1253
    -msgid "Contact Photos"
    -msgstr "Connectiefoto's"
    -
    -#: ../../mod/photos.php:727
    -msgid "Show Newest First"
    -msgstr "Nieuwste eerst weergeven"
    -
    -#: ../../mod/photos.php:729
    -msgid "Show Oldest First"
    -msgstr "Oudste eerst weergeven"
    -
    -#: ../../mod/photos.php:827
    -msgid "Permission denied. Access to this item may be restricted."
    -msgstr "Toegang geweigerd. Toegang tot dit item kan zijn beperkt."
    -
    -#: ../../mod/photos.php:829
    -msgid "Photo not available"
    -msgstr "Foto niet aanwezig"
    -
    -#: ../../mod/photos.php:887
    -msgid "Use as profile photo"
    -msgstr "Als profielfoto gebruiken"
    -
    -#: ../../mod/photos.php:894
    -msgid "Private Photo"
    -msgstr "Privéfoto"
    -
    -#: ../../mod/photos.php:905 ../../mod/events.php:652 ../../mod/events.php:659
    -msgid "Previous"
    -msgstr "Vorige"
    -
    -#: ../../mod/photos.php:909
    -msgid "View Full Size"
    -msgstr "Volledige grootte weergeven"
    -
    -#: ../../mod/photos.php:988
    -msgid "Edit photo"
    -msgstr "Foto bewerken"
    -
    -#: ../../mod/photos.php:990
    -msgid "Rotate CW (right)"
    -msgstr "Draai met de klok mee (naar rechts)"
    -
    -#: ../../mod/photos.php:991
    -msgid "Rotate CCW (left)"
    -msgstr "Draai tegen de klok in (naar links)"
    +msgid "%d message sent."
    +msgid_plural "%d messages sent."
    +msgstr[0] "%d bericht verzonden."
    +msgstr[1] "%d berichten verzonden."
     
    -#: ../../mod/photos.php:994
    -msgid "Enter a new album name"
    -msgstr "Vul een nieuwe albumnaam in"
    +#: ../../mod/invite.php:98
    +msgid "You have no more invitations available"
    +msgstr "Je hebt geen uitnodigingen meer beschikbaar"
     
    -#: ../../mod/photos.php:995
    -msgid "or select an existing one (doubleclick)"
    -msgstr "of kies een bestaand album (dubbelklikken)"
    +#: ../../mod/invite.php:129
    +msgid "Send invitations"
    +msgstr "Uitnodigingen verzenden"
     
    -#: ../../mod/photos.php:998
    -msgid "Caption"
    -msgstr "Bijschrift"
    +#: ../../mod/invite.php:130
    +msgid "Enter email addresses, one per line:"
    +msgstr "Voer e-mailadressen in, één per regel:"
     
    -#: ../../mod/photos.php:1000
    -msgid "Add a Tag"
    -msgstr "Tag toevoegen"
    +#: ../../mod/invite.php:131 ../../mod/mail.php:246
    +msgid "Your message:"
    +msgstr "Jouw bericht:"
     
    -#: ../../mod/photos.php:1004
    -msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
    -msgstr "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl"
    +#: ../../mod/invite.php:132
    +msgid "Please join my community on $Projectname."
    +msgstr "Hierbij nodig ik je uit om mij, en andere vrienden en kennissen, op $Projectname te vergezellen. Lees meer over $Projectname  op https://redmatrix.me."
     
    -#: ../../mod/photos.php:1007
    -msgid "Flag as adult in album view"
    -msgstr "Markeer als voor volwassenen in albumweergave"
    +#: ../../mod/invite.php:134
    +msgid "You will need to supply this invitation code: "
    +msgstr "Je moet deze uitnodigingscode opgeven: "
     
    -#: ../../mod/photos.php:1199
    -msgid "In This Photo:"
    -msgstr "Op deze foto:"
    +#: ../../mod/invite.php:135
    +msgid ""
    +"1. Register at any $Projectname location (they are all inter-connected)"
    +msgstr "1. Registreer je op een willekeurige $Projectname-hub (ze zijn allemaal onderling met elkaar verbonden):"
     
    -#: ../../mod/photos.php:1204
    -msgid "Map"
    -msgstr "Kaart"
    +#: ../../mod/invite.php:137
    +msgid "2. Enter my $Projectname network address into the site searchbar."
    +msgstr "2. Nadat je bent ingelogd en een kanaal hebt aangemaakt kan je mijn $Projectname-kanaaladres in het zoekveld invullen:"
     
    -#: ../../mod/photos.php:1292
    -msgid "View Album"
    -msgstr "Album weergeven"
    +#: ../../mod/invite.php:138
    +msgid "or visit "
    +msgstr "of bezoek "
     
    -#: ../../mod/photos.php:1315
    -msgid "Recent Photos"
    -msgstr "Recente foto's"
    +#: ../../mod/invite.php:140
    +msgid "3. Click [Connect]"
    +msgstr "3. Klik op [+ Verbinden]"
     
     #: ../../mod/probe.php:24 ../../mod/probe.php:30
     #, php-format
    @@ -6788,7 +6699,7 @@ msgstr "Ik accepteer de %s van deze $Projectname-hub"
     msgid "I am over 13 years of age and accept the %s for this website"
     msgstr "Ik accepteer de %s van deze $Projectname-hub"
     
    -#: ../../mod/register.php:207 ../../mod/admin.php:436
    +#: ../../mod/register.php:207 ../../mod/admin.php:443
     msgid "Registration"
     msgstr "Registratie"
     
    @@ -6848,10 +6759,10 @@ msgstr "# klonen"
     msgid "Message queues"
     msgstr "Berichtenwachtrij"
     
    -#: ../../mod/admin.php:198 ../../mod/admin.php:433 ../../mod/admin.php:532
    -#: ../../mod/admin.php:800 ../../mod/admin.php:964 ../../mod/admin.php:1061
    -#: ../../mod/admin.php:1101 ../../mod/admin.php:1261 ../../mod/admin.php:1295
    -#: ../../mod/admin.php:1380
    +#: ../../mod/admin.php:198 ../../mod/admin.php:440 ../../mod/admin.php:539
    +#: ../../mod/admin.php:807 ../../mod/admin.php:971 ../../mod/admin.php:1068
    +#: ../../mod/admin.php:1108 ../../mod/admin.php:1268 ../../mod/admin.php:1302
    +#: ../../mod/admin.php:1387
     msgid "Administration"
     msgstr "Beheer"
     
    @@ -6863,7 +6774,7 @@ msgstr "Samenvatting"
     msgid "Registered accounts"
     msgstr "Geregistreerde accounts"
     
    -#: ../../mod/admin.php:203 ../../mod/admin.php:536
    +#: ../../mod/admin.php:203 ../../mod/admin.php:543
     msgid "Pending registrations"
     msgstr "Accounts die op goedkeuring wachten"
     
    @@ -6871,7 +6782,7 @@ msgstr "Accounts die op goedkeuring wachten"
     msgid "Registered channels"
     msgstr "Geregistreerde kanalen"
     
    -#: ../../mod/admin.php:205 ../../mod/admin.php:537
    +#: ../../mod/admin.php:205 ../../mod/admin.php:544
     msgid "Active plugins"
     msgstr "Ingeschakelde plug-ins"
     
    @@ -6915,638 +6826,638 @@ msgstr "Mijn $Projectname-hub kent alleen gratis toegang"
     msgid "My site offers free accounts with optional paid upgrades"
     msgstr "Mijn $Projectname-hub biedt gratis accounts aan met betaalde uitbreidingen als optie"
     
    -#: ../../mod/admin.php:437
    +#: ../../mod/admin.php:444
     msgid "File upload"
     msgstr "Bestand uploaden"
     
    -#: ../../mod/admin.php:438
    +#: ../../mod/admin.php:445
     msgid "Policies"
     msgstr "Beleid"
     
    -#: ../../mod/admin.php:443
    +#: ../../mod/admin.php:450
     msgid "Site name"
     msgstr "Naam van deze $Projectname-hub"
     
    -#: ../../mod/admin.php:444
    +#: ../../mod/admin.php:451
     msgid "Banner/Logo"
     msgstr "Banner/logo"
     
    -#: ../../mod/admin.php:445
    +#: ../../mod/admin.php:452
     msgid "Administrator Information"
     msgstr "Informatie over de beheerder van deze hub"
     
    -#: ../../mod/admin.php:445
    +#: ../../mod/admin.php:452
     msgid ""
     "Contact information for site administrators.  Displayed on siteinfo page.  "
     "BBCode can be used here"
     msgstr "Contactinformatie voor hub-beheerders. Getoond op pagina met hub-informatie. Er kan hier bbcode gebruikt worden."
     
    -#: ../../mod/admin.php:446
    +#: ../../mod/admin.php:453
     msgid "System language"
     msgstr "Standaardtaal"
     
    -#: ../../mod/admin.php:447
    +#: ../../mod/admin.php:454
     msgid "System theme"
     msgstr "Standaardthema"
     
    -#: ../../mod/admin.php:447
    +#: ../../mod/admin.php:454
     msgid ""
     "Default system theme - may be over-ridden by user profiles - change theme settings"
     msgstr "Standaardthema voor $Projectname-hub (kan door lid veranderd worden) - verander thema-instellingen"
     
    -#: ../../mod/admin.php:448
    +#: ../../mod/admin.php:455
     msgid "Mobile system theme"
     msgstr "Standaardthema voor mobiel"
     
    -#: ../../mod/admin.php:448
    +#: ../../mod/admin.php:455
     msgid "Theme for mobile devices"
     msgstr "Thema voor mobiele apparaten"
     
    -#: ../../mod/admin.php:450
    +#: ../../mod/admin.php:457
     msgid "Allow Feeds as Connections"
     msgstr "Sta feeds toe als connecties"
     
    -#: ../../mod/admin.php:450
    +#: ../../mod/admin.php:457
     msgid "(Heavy system resource usage)"
     msgstr "(sterk negatieve invloed op systeembronnen hub)"
     
    -#: ../../mod/admin.php:451
    +#: ../../mod/admin.php:458
     msgid "Maximum image size"
     msgstr "Maximale grootte van afbeeldingen"
     
    -#: ../../mod/admin.php:451
    +#: ../../mod/admin.php:458
     msgid ""
     "Maximum size in bytes of uploaded images. Default is 0, which means no "
     "limits."
     msgstr "Maximale grootte in bytes voor afbeeldingen die worden geüpload. Standaard is 0, wat geen limiet betekend."
     
    -#: ../../mod/admin.php:452
    +#: ../../mod/admin.php:459
     msgid "Does this site allow new member registration?"
     msgstr "Staat deze hub nieuwe accounts toe?"
     
    -#: ../../mod/admin.php:453
    +#: ../../mod/admin.php:460
     msgid "Which best describes the types of account offered by this hub?"
     msgstr "Wat voor soort accounts biedt deze $Projectname-hub aan? Kies wat het meest in de buurt komt."
     
    -#: ../../mod/admin.php:454
    +#: ../../mod/admin.php:461
     msgid "Register text"
     msgstr "Tekst tijdens registratie"
     
    -#: ../../mod/admin.php:454
    +#: ../../mod/admin.php:461
     msgid "Will be displayed prominently on the registration page."
     msgstr "Tekst dat op de pagina voor het registreren van nieuwe accounts wordt getoond."
     
    -#: ../../mod/admin.php:455
    +#: ../../mod/admin.php:462
     msgid "Site homepage to show visitors (default: login box)"
     msgstr "Homepagina van deze hub die aan bezoekers wordt getoond (standaard: inlogformulier)"
     
    -#: ../../mod/admin.php:455
    +#: ../../mod/admin.php:462
     msgid ""
     "example: 'public' to show public stream, 'page/sys/home' to show a system "
     "webpage called 'home' or 'include:home.html' to include a file."
     msgstr "voorbeeld: 'public' om de openbare stream te tonen, 'page/sys/home' om de webpagina 'home' van het systeemkanaal te tonen of 'include:home.html' om een gewoon bestand te gebruiken."
     
    -#: ../../mod/admin.php:456
    +#: ../../mod/admin.php:463
     msgid "Preserve site homepage URL"
     msgstr "Behoudt de URL van de hub (/)"
     
    -#: ../../mod/admin.php:456
    +#: ../../mod/admin.php:463
     msgid ""
     "Present the site homepage in a frame at the original location instead of "
     "redirecting"
     msgstr "Toon de homepagina van de hub in een frame op de oorspronkelijke locatie (/), i.p.v. een doorverwijzing naar een andere locatie (bv. .../home.html)"
     
    -#: ../../mod/admin.php:457
    +#: ../../mod/admin.php:464
     msgid "Accounts abandoned after x days"
     msgstr "Accounts als verlaten beschouwen na zoveel aantal dagen:"
     
    -#: ../../mod/admin.php:457
    +#: ../../mod/admin.php:464
     msgid ""
     "Will not waste system resources polling external sites for abandonded "
     "accounts. Enter 0 for no time limit."
     msgstr "Zal geen systeembronnen verspillen door polling van externe hubs voor verlaten accounts. Vul 0 in voor geen tijdslimiet."
     
    -#: ../../mod/admin.php:458
    +#: ../../mod/admin.php:465
     msgid "Allowed friend domains"
     msgstr "Toegestane domeinen"
     
    -#: ../../mod/admin.php:458
    +#: ../../mod/admin.php:465
     msgid ""
     "Comma separated list of domains which are allowed to establish friendships "
     "with this site. Wildcards are accepted. Empty to allow any domains"
     msgstr "Komma-gescheiden lijst van domeinen waarvan kanalen connecties kunnen aangaan met kanalen op deze $Projectname-hub. Wildcards zijn toegestaan.\nLaat leeg om alle domeinen toe te laten."
     
    -#: ../../mod/admin.php:459
    +#: ../../mod/admin.php:466
     msgid "Allowed email domains"
     msgstr "Toegestane e-maildomeinen"
     
    -#: ../../mod/admin.php:459
    +#: ../../mod/admin.php:466
     msgid ""
     "Comma separated list of domains which are allowed in email addresses for "
     "registrations to this site. Wildcards are accepted. Empty to allow any "
     "domains"
     msgstr "Door komma's gescheiden lijst met e-maildomeinen waarvan e-mailadressen op deze hub mogen registeren. Wildcards zijn toegestaan. Laat leeg om alle domeinen toe te laten."
     
    -#: ../../mod/admin.php:460
    +#: ../../mod/admin.php:467
     msgid "Not allowed email domains"
     msgstr "Niet toegestane e-maildomeinen"
     
    -#: ../../mod/admin.php:460
    +#: ../../mod/admin.php:467
     msgid ""
     "Comma separated list of domains which are not allowed in email addresses for"
     " registrations to this site. Wildcards are accepted. Empty to allow any "
     "domains, unless allowed domains have been defined."
     msgstr "Door komma's gescheiden lijst met e-maildomeinen waarvan e-mailadressen niet op deze hub mogen registeren. Wildcards zijn toegestaan. Laat leeg om alle domeinen toe te staan, tenzij er toegestane domeinen zijn ingesteld. "
     
    -#: ../../mod/admin.php:461
    +#: ../../mod/admin.php:468
     msgid "Block public"
     msgstr "Openbare toegang blokkeren"
     
    -#: ../../mod/admin.php:461
    +#: ../../mod/admin.php:468
     msgid ""
     "Check to block public access to all otherwise public personal pages on this "
     "site unless you are currently logged in."
     msgstr "Vink dit aan om alle normaliter openbare persoonlijke pagina's op deze hub alleen toegankelijk te maken voor ingelogde leden."
     
    -#: ../../mod/admin.php:462
    +#: ../../mod/admin.php:469
     msgid "Verify Email Addresses"
     msgstr "E-mailadres verifieren"
     
    -#: ../../mod/admin.php:462
    +#: ../../mod/admin.php:469
     msgid ""
     "Check to verify email addresses used in account registration (recommended)."
     msgstr "Inschakelen om e-mailadressen te verifiëren die tijdens de accountregistratie worden gebruikt (aanbevolen)."
     
    -#: ../../mod/admin.php:463
    +#: ../../mod/admin.php:470
     msgid "Force publish"
     msgstr "Dwing kanaalvermelding af"
     
    -#: ../../mod/admin.php:463
    +#: ../../mod/admin.php:470
     msgid ""
     "Check to force all profiles on this site to be listed in the site directory."
     msgstr "Vink dit aan om af te dwingen dat alle kanalen op deze hub in de kanalengids worden vermeld."
     
    -#: ../../mod/admin.php:464
    -msgid "Disable discovery tab"
    -msgstr "Ontdekkingstab"
    +#: ../../mod/admin.php:471
    +msgid "Import Public Streams"
    +msgstr "Openbare streams importeren"
     
    -#: ../../mod/admin.php:464
    +#: ../../mod/admin.php:471
     msgid ""
    -"Remove the tab in the network view with public content pulled from sources "
    -"chosen for this site."
    -msgstr "Verwijder de tab in de matrix-weergave waarin zich een selectie aan openbare berichten bevindt, die automatisch voor deze hub zijn uitgekozen."
    +"Import and allow access to public content pulled from other sites. Warning: "
    +"this content is unmoderated."
    +msgstr "Toegang verlenen tot openbare berichten die vanuit andere hubs worden geïmporteerd. Waarschuwing: de inhoud van deze berichten wordt niet gemodereerd."
     
    -#: ../../mod/admin.php:465
    +#: ../../mod/admin.php:472
     msgid "login on Homepage"
     msgstr "Inlogformulier op de homepagina"
     
    -#: ../../mod/admin.php:465
    +#: ../../mod/admin.php:472
     msgid ""
     "Present a login box to visitors on the home page if no other content has "
     "been configured."
     msgstr "Toon een inlogformulier voor bezoekers op de homepagina wanneer geen andere inhoud is geconfigureerd. "
     
    -#: ../../mod/admin.php:467
    +#: ../../mod/admin.php:474
     msgid "Directory Server URL"
     msgstr "Server-URL voor de kanalengids"
     
    -#: ../../mod/admin.php:467
    +#: ../../mod/admin.php:474
     msgid "Default directory server"
     msgstr "Standaardserver voor de kanalengids"
     
    -#: ../../mod/admin.php:469
    +#: ../../mod/admin.php:476
     msgid "Proxy user"
     msgstr "Gebruikersnaam proxy"
     
    -#: ../../mod/admin.php:470
    +#: ../../mod/admin.php:477
     msgid "Proxy URL"
     msgstr "URL proxy"
     
    -#: ../../mod/admin.php:471
    +#: ../../mod/admin.php:478
     msgid "Network timeout"
     msgstr "Netwerktimeout"
     
    -#: ../../mod/admin.php:471
    +#: ../../mod/admin.php:478
     msgid "Value is in seconds. Set to 0 for unlimited (not recommended)."
     msgstr "Waarde is in seconden. Zet op 0 voor onbeperkt (niet aanbevolen)"
     
    -#: ../../mod/admin.php:472
    +#: ../../mod/admin.php:479
     msgid "Delivery interval"
     msgstr "Afleveringsinterval"
     
    -#: ../../mod/admin.php:472
    +#: ../../mod/admin.php:479
     msgid ""
     "Delay background delivery processes by this many seconds to reduce system "
     "load. Recommend: 4-5 for shared hosts, 2-3 for virtual private servers. 0-1 "
     "for large dedicated servers."
     msgstr "Vertraag de achtergrondprocessen voor het afleveren met een aantal seconden om de systeembelasting te verminderen. Aanbevolen: 4-5 voor shared hosts, 2-3 voor virtual private servers (VPS) en 0-1 voor grote dedicated servers."
     
    -#: ../../mod/admin.php:473
    +#: ../../mod/admin.php:480
     msgid "Deliveries per process"
     msgstr "Leveringen per serverproces"
     
    -#: ../../mod/admin.php:473
    +#: ../../mod/admin.php:480
     msgid ""
     "Number of deliveries to attempt in a single operating system process. Adjust"
     " if necessary to tune system performance. Recommend: 1-5."
     msgstr "Aantal leveringen die aan één serverproces worden meegegeven. Pas dit aan wanneer het nodig is om systeemprestaties te verbeteren. Aangeraden: 1-5"
     
    -#: ../../mod/admin.php:474
    +#: ../../mod/admin.php:481
     msgid "Poll interval"
     msgstr "Poll-interval"
     
    -#: ../../mod/admin.php:474
    +#: ../../mod/admin.php:481
     msgid ""
     "Delay background polling processes by this many seconds to reduce system "
     "load. If 0, use delivery interval."
     msgstr "De achtergrondprocessen voor het afleveren met zoveel seconden vertragen om de systeembelasting te verminderen. 0 om de afleveringsinterval te gebruiken."
     
    -#: ../../mod/admin.php:475
    +#: ../../mod/admin.php:482
     msgid "Maximum Load Average"
     msgstr "Maximaal gemiddelde systeembelasting"
     
    -#: ../../mod/admin.php:475
    +#: ../../mod/admin.php:482
     msgid ""
     "Maximum system load before delivery and poll processes are deferred - "
     "default 50."
     msgstr "Maximale systeembelasting voordat de afleverings- en polllingsprocessen worden uitgesteld. Standaard is 50."
     
    -#: ../../mod/admin.php:476
    +#: ../../mod/admin.php:483
     msgid "Expiration period in days for imported (matrix/network) content"
     msgstr "Aantal dagen waarna geïmporteerde inhoud uit iemands matrix/netwerk-pagina wordt verwijderd."
     
    -#: ../../mod/admin.php:476
    +#: ../../mod/admin.php:483
     msgid "0 for no expiration of imported content"
     msgstr "Dit geldt alleen voor inhoud van andere kanalen, dus niet voor iemands eigen kanaal. 0 voor het niet verwijderen van geïmporteerde inhoud."
     
    -#: ../../mod/admin.php:524
    +#: ../../mod/admin.php:531
     msgid "No server found"
     msgstr "Geen hub gevonden"
     
    -#: ../../mod/admin.php:531 ../../mod/admin.php:814
    +#: ../../mod/admin.php:538 ../../mod/admin.php:821
     msgid "ID"
     msgstr "ID"
     
    -#: ../../mod/admin.php:531
    +#: ../../mod/admin.php:538
     msgid "for channel"
     msgstr "voor kanaal"
     
    -#: ../../mod/admin.php:531
    +#: ../../mod/admin.php:538
     msgid "on server"
     msgstr "op hub"
     
    -#: ../../mod/admin.php:531
    +#: ../../mod/admin.php:538
     msgid "Status"
     msgstr "Status"
     
    -#: ../../mod/admin.php:533
    +#: ../../mod/admin.php:540
     msgid "Server"
     msgstr "Hubbeheer"
     
    -#: ../../mod/admin.php:550
    +#: ../../mod/admin.php:557
     msgid "Update has been marked successful"
     msgstr "Update is als succesvol gemarkeerd"
     
    -#: ../../mod/admin.php:560
    +#: ../../mod/admin.php:567
     #, php-format
     msgid "Executing %s failed. Check system logs."
     msgstr "Uitvoeren van %s is mislukt. Controleer systeemlogboek."
     
    -#: ../../mod/admin.php:563
    +#: ../../mod/admin.php:570
     #, php-format
     msgid "Update %s was successfully applied."
     msgstr "Update %s was geslaagd."
     
    -#: ../../mod/admin.php:567
    +#: ../../mod/admin.php:574
     #, php-format
     msgid "Update %s did not return a status. Unknown if it succeeded."
     msgstr "Update %s gaf geen melding. Het is daarom niet bekend of deze geslaagd is."
     
    -#: ../../mod/admin.php:570
    +#: ../../mod/admin.php:577
     #, php-format
     msgid "Update function %s could not be found."
     msgstr "Update-functie %s kon niet gevonden worden."
     
    -#: ../../mod/admin.php:586
    +#: ../../mod/admin.php:593
     msgid "No failed updates."
     msgstr "Geen mislukte updates."
     
    -#: ../../mod/admin.php:590
    +#: ../../mod/admin.php:597
     msgid "Failed Updates"
     msgstr "Mislukte updates"
     
    -#: ../../mod/admin.php:592
    +#: ../../mod/admin.php:599
     msgid "Mark success (if update was manually applied)"
     msgstr "Markeer als geslaagd (wanneer de update handmatig was uitgevoerd)"
     
    -#: ../../mod/admin.php:593
    +#: ../../mod/admin.php:600
     msgid "Attempt to execute this update step automatically"
     msgstr "Poging om deze stap van de update automatisch uit te voeren."
     
    -#: ../../mod/admin.php:625
    +#: ../../mod/admin.php:632
     msgid "Queue Statistics"
     msgstr "Wachtrij-statistieken"
     
    -#: ../../mod/admin.php:626
    +#: ../../mod/admin.php:633
     msgid "Total Entries"
     msgstr "Aantal vermeldingen"
     
    -#: ../../mod/admin.php:627
    +#: ../../mod/admin.php:634
     msgid "Priority"
     msgstr "Prioriteit"
     
    -#: ../../mod/admin.php:628
    +#: ../../mod/admin.php:635
     msgid "Destination URL"
     msgstr "Doel-URL"
     
    -#: ../../mod/admin.php:629
    +#: ../../mod/admin.php:636
     msgid "Mark hub permanently offline"
     msgstr "Hub als permanent offline markeren"
     
    -#: ../../mod/admin.php:630
    +#: ../../mod/admin.php:637
     msgid "Empty queue for this hub"
     msgstr "Berichtenwachtrij voor deze hub legen"
     
    -#: ../../mod/admin.php:631
    +#: ../../mod/admin.php:638
     msgid "Last known contact"
     msgstr "Voor het laatst contact"
     
    -#: ../../mod/admin.php:667
    +#: ../../mod/admin.php:674
     #, php-format
     msgid "%s account blocked/unblocked"
     msgid_plural "%s account blocked/unblocked"
     msgstr[0] "%s account geblokkeerd/gedeblokkeerd"
     msgstr[1] "%s accounts geblokkeerd/gedeblokkeerd"
     
    -#: ../../mod/admin.php:675
    +#: ../../mod/admin.php:682
     #, php-format
     msgid "%s account deleted"
     msgid_plural "%s accounts deleted"
     msgstr[0] "%s account verwijderd"
     msgstr[1] "%s accounts verwijderd"
     
    -#: ../../mod/admin.php:711
    +#: ../../mod/admin.php:718
     msgid "Account not found"
     msgstr "Account niet gevonden"
     
    -#: ../../mod/admin.php:723
    +#: ../../mod/admin.php:730
     #, php-format
     msgid "Account '%s' deleted"
     msgstr "Account '%s' verwijderd"
     
    -#: ../../mod/admin.php:731
    +#: ../../mod/admin.php:738
     #, php-format
     msgid "Account '%s' blocked"
     msgstr "Account '%s' geblokkeerd"
     
    -#: ../../mod/admin.php:739
    +#: ../../mod/admin.php:746
     #, php-format
     msgid "Account '%s' unblocked"
     msgstr "Account '%s' gedeblokkeerd"
     
    -#: ../../mod/admin.php:801 ../../mod/admin.php:813
    +#: ../../mod/admin.php:808 ../../mod/admin.php:820
     msgid "Users"
     msgstr "Accounts"
     
    -#: ../../mod/admin.php:803 ../../mod/admin.php:967
    +#: ../../mod/admin.php:810 ../../mod/admin.php:974
     msgid "select all"
     msgstr "alles selecteren"
     
    -#: ../../mod/admin.php:804
    +#: ../../mod/admin.php:811
     msgid "User registrations waiting for confirm"
     msgstr "Accounts die op goedkeuring wachten"
     
    -#: ../../mod/admin.php:805
    +#: ../../mod/admin.php:812
     msgid "Request date"
     msgstr "Tijd/datum verzoek"
     
    -#: ../../mod/admin.php:806
    +#: ../../mod/admin.php:813
     msgid "No registrations."
     msgstr "Geen verzoeken."
     
    -#: ../../mod/admin.php:808
    +#: ../../mod/admin.php:815
     msgid "Deny"
     msgstr "Afkeuren"
     
    -#: ../../mod/admin.php:814
    +#: ../../mod/admin.php:821
     msgid "Register date"
     msgstr "Geregistreerd"
     
    -#: ../../mod/admin.php:814
    +#: ../../mod/admin.php:821
     msgid "Last login"
     msgstr "Laatste keer ingelogd"
     
    -#: ../../mod/admin.php:814
    +#: ../../mod/admin.php:821
     msgid "Expires"
     msgstr "Verloopt"
     
    -#: ../../mod/admin.php:814
    +#: ../../mod/admin.php:821
     msgid "Service Class"
     msgstr "Abonnementen"
     
    -#: ../../mod/admin.php:816
    +#: ../../mod/admin.php:823
     msgid ""
     "Selected accounts will be deleted!\\n\\nEverything these accounts had posted"
     " on this site will be permanently deleted!\\n\\nAre you sure?"
     msgstr "Geselecteerde accounts (met bijbehorende kanalen) worden verwijderd!\\n\\nAlles wat deze accounts op deze hub hebben gepubliceerd wordt definitief verwijderd!\\n\\Weet je het zeker?"
     
    -#: ../../mod/admin.php:817
    +#: ../../mod/admin.php:824
     msgid ""
     "The account {0} will be deleted!\\n\\nEverything this account has posted on "
     "this site will be permanently deleted!\\n\\nAre you sure?"
     msgstr "Account {0} (met bijbehorende kanalen) wordt verwijderd !\\n\\nAlles wat dit account op deze hub heeft gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
     
    -#: ../../mod/admin.php:853
    +#: ../../mod/admin.php:860
     #, php-format
     msgid "%s channel censored/uncensored"
     msgid_plural "%s channels censored/uncensored"
     msgstr[0] "%s kanaal gecensureerd/ongecensureerd"
     msgstr[1] "%s kanalen gecensureerd/ongecensureerd"
     
    -#: ../../mod/admin.php:862
    +#: ../../mod/admin.php:869
     #, php-format
     msgid "%s channel code allowed/disallowed"
     msgid_plural "%s channels code allowed/disallowed"
     msgstr[0] "Scripts toegestaan/niet toegestaan voor %s kanaal"
     msgstr[1] "Scripts toegestaan/niet toegestaan voor %s kanalen"
     
    -#: ../../mod/admin.php:869
    +#: ../../mod/admin.php:876
     #, php-format
     msgid "%s channel deleted"
     msgid_plural "%s channels deleted"
     msgstr[0] "%s kanaal verwijderd"
     msgstr[1] "%s kanalen verwijderd"
     
    -#: ../../mod/admin.php:889
    +#: ../../mod/admin.php:896
     msgid "Channel not found"
     msgstr "Kanaal niet gevonden"
     
    -#: ../../mod/admin.php:900
    +#: ../../mod/admin.php:907
     #, php-format
     msgid "Channel '%s' deleted"
     msgstr "Kanaal '%s' verwijderd"
     
    -#: ../../mod/admin.php:912
    +#: ../../mod/admin.php:919
     #, php-format
     msgid "Channel '%s' censored"
     msgstr "Kanaal '%s' gecensureerd"
     
    -#: ../../mod/admin.php:912
    +#: ../../mod/admin.php:919
     #, php-format
     msgid "Channel '%s' uncensored"
     msgstr "Kanaal '%s' ongecensureerd"
     
    -#: ../../mod/admin.php:923
    +#: ../../mod/admin.php:930
     #, php-format
     msgid "Channel '%s' code allowed"
     msgstr "Scripts toegestaan voor kanaal '%s'"
     
    -#: ../../mod/admin.php:923
    +#: ../../mod/admin.php:930
     #, php-format
     msgid "Channel '%s' code disallowed"
     msgstr "Scripts niet toegestaan voor kanaal '%s'"
     
    -#: ../../mod/admin.php:969
    +#: ../../mod/admin.php:976
     msgid "Censor"
     msgstr "Censureren"
     
    -#: ../../mod/admin.php:970
    +#: ../../mod/admin.php:977
     msgid "Uncensor"
     msgstr "Niet censureren"
     
    -#: ../../mod/admin.php:971
    +#: ../../mod/admin.php:978
     msgid "Allow Code"
     msgstr "Scripts toestaan"
     
    -#: ../../mod/admin.php:972
    +#: ../../mod/admin.php:979
     msgid "Disallow Code"
     msgstr "Scripts niet toestaan"
     
    -#: ../../mod/admin.php:974
    +#: ../../mod/admin.php:981
     msgid "UID"
     msgstr "UID"
     
    -#: ../../mod/admin.php:976
    +#: ../../mod/admin.php:983
     msgid ""
     "Selected channels will be deleted!\\n\\nEverything that was posted in these "
     "channels on this site will be permanently deleted!\\n\\nAre you sure?"
     msgstr "Geselecteerde kanalen worden verwijderd!\\n\\nAlles wat in deze kanalen op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
     
    -#: ../../mod/admin.php:977
    +#: ../../mod/admin.php:984
     msgid ""
     "The channel {0} will be deleted!\\n\\nEverything that was posted in this "
     "channel on this site will be permanently deleted!\\n\\nAre you sure?"
     msgstr "Kanaal {0} wordt verwijderd!\\n\\nAlles wat in dit kanaal op deze hub werd gepubliceerd wordt definitief verwijderd!\\n\\nWeet je het zeker?"
     
    -#: ../../mod/admin.php:1017
    +#: ../../mod/admin.php:1024
     #, php-format
     msgid "Plugin %s disabled."
     msgstr "Plug-in %s uitgeschakeld."
     
    -#: ../../mod/admin.php:1021
    +#: ../../mod/admin.php:1028
     #, php-format
     msgid "Plugin %s enabled."
     msgstr "Plug-in %s ingeschakeld"
     
    -#: ../../mod/admin.php:1031 ../../mod/admin.php:1234
    +#: ../../mod/admin.php:1038 ../../mod/admin.php:1241
     msgid "Disable"
     msgstr "Uitschakelen"
     
    -#: ../../mod/admin.php:1034 ../../mod/admin.php:1236
    +#: ../../mod/admin.php:1041 ../../mod/admin.php:1243
     msgid "Enable"
     msgstr "Inschakelen"
     
    -#: ../../mod/admin.php:1063 ../../mod/admin.php:1263
    +#: ../../mod/admin.php:1070 ../../mod/admin.php:1270
     msgid "Toggle"
     msgstr "Omschakelen"
     
    -#: ../../mod/admin.php:1071 ../../mod/admin.php:1273
    +#: ../../mod/admin.php:1078 ../../mod/admin.php:1280
     msgid "Author: "
     msgstr "Auteur: "
     
    -#: ../../mod/admin.php:1072 ../../mod/admin.php:1274
    +#: ../../mod/admin.php:1079 ../../mod/admin.php:1281
     msgid "Maintainer: "
     msgstr "Beheerder: "
     
    -#: ../../mod/admin.php:1199
    +#: ../../mod/admin.php:1206
     msgid "No themes found."
     msgstr "Geen thema's gevonden"
     
    -#: ../../mod/admin.php:1255
    +#: ../../mod/admin.php:1262
     msgid "Screenshot"
     msgstr "Schermafdruk"
     
    -#: ../../mod/admin.php:1301
    +#: ../../mod/admin.php:1308
     msgid "[Experimental]"
     msgstr "[Experimenteel]"
     
    -#: ../../mod/admin.php:1302
    +#: ../../mod/admin.php:1309
     msgid "[Unsupported]"
     msgstr "[Niet ondersteund]"
     
    -#: ../../mod/admin.php:1326
    +#: ../../mod/admin.php:1333
     msgid "Log settings updated."
     msgstr "Logboek-instellingen bijgewerkt."
     
    -#: ../../mod/admin.php:1383
    +#: ../../mod/admin.php:1390
     msgid "Clear"
     msgstr "Leegmaken"
     
    -#: ../../mod/admin.php:1389
    +#: ../../mod/admin.php:1396
     msgid "Debugging"
     msgstr "Debuggen"
     
    -#: ../../mod/admin.php:1390
    +#: ../../mod/admin.php:1397
     msgid "Log file"
     msgstr "Logbestand"
     
    -#: ../../mod/admin.php:1390
    +#: ../../mod/admin.php:1397
     msgid ""
     "Must be writable by web server. Relative to your Red top-level directory."
     msgstr "Moet door de webserver beschrijfbaar zijn. Relatief ten opzichte van de bovenste map van je $Projectname-installatie."
     
    -#: ../../mod/admin.php:1391
    +#: ../../mod/admin.php:1398
     msgid "Log level"
     msgstr "Logniveau"
     
    -#: ../../mod/admin.php:1437
    +#: ../../mod/admin.php:1444
     msgid "New Profile Field"
     msgstr "Nieuw profielveld"
     
    -#: ../../mod/admin.php:1438 ../../mod/admin.php:1458
    +#: ../../mod/admin.php:1445 ../../mod/admin.php:1465
     msgid "Field nickname"
     msgstr "Bijnaam voor veld"
     
    -#: ../../mod/admin.php:1438 ../../mod/admin.php:1458
    +#: ../../mod/admin.php:1445 ../../mod/admin.php:1465
     msgid "System name of field"
     msgstr "Systeemnaam voor veld"
     
    -#: ../../mod/admin.php:1439 ../../mod/admin.php:1459
    +#: ../../mod/admin.php:1446 ../../mod/admin.php:1466
     msgid "Input type"
     msgstr "Invoertype"
     
    -#: ../../mod/admin.php:1440 ../../mod/admin.php:1460
    +#: ../../mod/admin.php:1447 ../../mod/admin.php:1467
     msgid "Field Name"
     msgstr "Veldnaam"
     
    -#: ../../mod/admin.php:1440 ../../mod/admin.php:1460
    +#: ../../mod/admin.php:1447 ../../mod/admin.php:1467
     msgid "Label on profile pages"
     msgstr "Tekstlabel voor op profielpagina's"
     
    -#: ../../mod/admin.php:1441 ../../mod/admin.php:1461
    +#: ../../mod/admin.php:1448 ../../mod/admin.php:1468
     msgid "Help text"
     msgstr "Helptekst"
     
    -#: ../../mod/admin.php:1441 ../../mod/admin.php:1461
    +#: ../../mod/admin.php:1448 ../../mod/admin.php:1468
     msgid "Additional info (optional)"
     msgstr "Extra informatie (optioneel)"
     
    -#: ../../mod/admin.php:1451
    +#: ../../mod/admin.php:1458
     msgid "Field definition not found"
     msgstr "Velddefinitie niet gevonden"
     
    -#: ../../mod/admin.php:1457
    +#: ../../mod/admin.php:1464
     msgid "Edit Profile Field"
     msgstr "Profielveld bewerken"
     
    @@ -8265,75 +8176,14 @@ msgstr "Wij adviseren, wanneer dit (nog) mogelijk is, de locatie te verwijderen
     msgid "Use this form to drop the location if the hub is no longer operating."
     msgstr "Gebruik dit formulier om de locatie te verwijderen wanneer de hub van de kloon niet meer operationeel is."
     
    -#: ../../mod/invite.php:25
    -msgid "Total invitation limit exceeded."
    -msgstr "Limiet voor aantal uitnodigingen overschreden."
    -
    -#: ../../mod/invite.php:49
    -#, php-format
    -msgid "%s : Not a valid email address."
    -msgstr "%s : Geen geldig e-mailadres."
    -
    -#: ../../mod/invite.php:76
    -msgid "Please join us on $Projectname"
    -msgstr "Uitnodiging voor $Projectname"
    -
    -#: ../../mod/invite.php:87
    -msgid "Invitation limit exceeded. Please contact your site administrator."
    -msgstr "Limiet voor aantal uitnodigingen overschreden. Neem contact op met je hub-beheerder."
    -
    -#: ../../mod/invite.php:92
    -#, php-format
    -msgid "%s : Message delivery failed."
    -msgstr "%s: Aflevering bericht mislukt."
    +#: ../../mod/home.php:57 ../../mod/home.php:65 ../../mod/siteinfo.php:61
    +msgid "$Projectname"
    +msgstr "$Projectname"
     
    -#: ../../mod/invite.php:96
    +#: ../../mod/home.php:75
     #, php-format
    -msgid "%d message sent."
    -msgid_plural "%d messages sent."
    -msgstr[0] "%d bericht verzonden."
    -msgstr[1] "%d berichten verzonden."
    -
    -#: ../../mod/invite.php:115
    -msgid "You have no more invitations available"
    -msgstr "Je hebt geen uitnodigingen meer beschikbaar"
    -
    -#: ../../mod/invite.php:129
    -msgid "Send invitations"
    -msgstr "Uitnodigingen verzenden"
    -
    -#: ../../mod/invite.php:130
    -msgid "Enter email addresses, one per line:"
    -msgstr "Voer e-mailadressen in, één per regel:"
    -
    -#: ../../mod/invite.php:131 ../../mod/mail.php:238
    -msgid "Your message:"
    -msgstr "Jouw bericht:"
    -
    -#: ../../mod/invite.php:132
    -msgid "Please join my community on $Projectname."
    -msgstr "Hierbij nodig ik je uit om mij, en andere vrienden en kennissen, op $Projectname te vergezellen. Lees meer over $Projectname  op https://redmatrix.me."
    -
    -#: ../../mod/invite.php:134
    -msgid "You will need to supply this invitation code: "
    -msgstr "Je moet deze uitnodigingscode opgeven: "
    -
    -#: ../../mod/invite.php:135
    -msgid ""
    -"1. Register at any $Projectname location (they are all inter-connected)"
    -msgstr "1. Registreer je op een willekeurige $Projectname-hub (ze zijn allemaal onderling met elkaar verbonden):"
    -
    -#: ../../mod/invite.php:137
    -msgid "2. Enter my $Projectname network address into the site searchbar."
    -msgstr "2. Nadat je bent ingelogd en een kanaal hebt aangemaakt kan je mijn $Projectname-kanaaladres in het zoekveld invullen:"
    -
    -#: ../../mod/invite.php:138
    -msgid "or visit "
    -msgstr "of bezoek "
    -
    -#: ../../mod/invite.php:140
    -msgid "3. Click [Connect]"
    -msgstr "3. Klik op [+ Verbinden]"
    +msgid "Welcome to %s"
    +msgstr "Welkom op %s"
     
     #: ../../mod/regmod.php:11
     msgid "Please login."
    @@ -8363,6 +8213,158 @@ msgstr "Onvoldoende permissies.  Doorgestuurd naar profielpagina."
     msgid "Item not available."
     msgstr "Item is niet aanwezig."
     
    +#: ../../mod/photos.php:79
    +msgid "Page owner information could not be retrieved."
    +msgstr "Informatie over de pagina-eigenaar werd niet ontvangen."
    +
    +#: ../../mod/photos.php:100
    +msgid "Album not found."
    +msgstr "Album niet gevonden."
    +
    +#: ../../mod/photos.php:127
    +msgid "Delete Album"
    +msgstr "Verwijder album"
    +
    +#: ../../mod/photos.php:171 ../../mod/photos.php:1006
    +msgid "Delete Photo"
    +msgstr "Verwijder foto"
    +
    +#: ../../mod/photos.php:501
    +msgid "No photos selected"
    +msgstr "Geen foto's geselecteerd"
    +
    +#: ../../mod/photos.php:550
    +msgid "Access to this item is restricted."
    +msgstr "Toegang tot dit item is beperkt."
    +
    +#: ../../mod/photos.php:589
    +#, php-format
    +msgid "%1$.2f MB of %2$.2f MB photo storage used."
    +msgstr "%1$.2f MB van %2$.2f MB aan foto-opslag gebruikt."
    +
    +#: ../../mod/photos.php:592
    +#, php-format
    +msgid "%1$.2f MB photo storage used."
    +msgstr "%1$.2f MB aan foto-opslag gebruikt."
    +
    +#: ../../mod/photos.php:620
    +msgid "Upload Photos"
    +msgstr "Foto's uploaden"
    +
    +#: ../../mod/photos.php:624
    +msgid "Enter an album name"
    +msgstr "Vul een albumnaam in"
    +
    +#: ../../mod/photos.php:625
    +msgid "or select an existing album (doubleclick)"
    +msgstr "of kies een bestaand album (dubbelklikken)"
    +
    +#: ../../mod/photos.php:626
    +msgid "Create a status post for this upload"
    +msgstr "Plaats een bericht voor deze upload."
    +
    +#: ../../mod/photos.php:627
    +msgid "Caption (optional):"
    +msgstr "Bijschrift (optioneel):"
    +
    +#: ../../mod/photos.php:628
    +msgid "Description (optional):"
    +msgstr "Omschrijving (optioneel):"
    +
    +#: ../../mod/photos.php:655
    +msgid "Album name could not be decoded"
    +msgstr "Albumnaam kon niet gedecodeerd worden"
    +
    +#: ../../mod/photos.php:699 ../../mod/photos.php:1233
    +#: ../../mod/photos.php:1250
    +msgid "Contact Photos"
    +msgstr "Connectiefoto's"
    +
    +#: ../../mod/photos.php:722
    +msgid "Show Newest First"
    +msgstr "Nieuwste eerst weergeven"
    +
    +#: ../../mod/photos.php:724
    +msgid "Show Oldest First"
    +msgstr "Oudste eerst weergeven"
    +
    +#: ../../mod/photos.php:824
    +msgid "Permission denied. Access to this item may be restricted."
    +msgstr "Toegang geweigerd. Toegang tot dit item kan zijn beperkt."
    +
    +#: ../../mod/photos.php:826
    +msgid "Photo not available"
    +msgstr "Foto niet aanwezig"
    +
    +#: ../../mod/photos.php:884
    +msgid "Use as profile photo"
    +msgstr "Als profielfoto gebruiken"
    +
    +#: ../../mod/photos.php:891
    +msgid "Private Photo"
    +msgstr "Privéfoto"
    +
    +#: ../../mod/photos.php:902 ../../mod/events.php:652 ../../mod/events.php:659
    +msgid "Previous"
    +msgstr "Vorige"
    +
    +#: ../../mod/photos.php:906
    +msgid "View Full Size"
    +msgstr "Volledige grootte weergeven"
    +
    +#: ../../mod/photos.php:985
    +msgid "Edit photo"
    +msgstr "Foto bewerken"
    +
    +#: ../../mod/photos.php:987
    +msgid "Rotate CW (right)"
    +msgstr "Draai met de klok mee (naar rechts)"
    +
    +#: ../../mod/photos.php:988
    +msgid "Rotate CCW (left)"
    +msgstr "Draai tegen de klok in (naar links)"
    +
    +#: ../../mod/photos.php:991
    +msgid "Enter a new album name"
    +msgstr "Vul een nieuwe albumnaam in"
    +
    +#: ../../mod/photos.php:992
    +msgid "or select an existing one (doubleclick)"
    +msgstr "of kies een bestaand album (dubbelklikken)"
    +
    +#: ../../mod/photos.php:995
    +msgid "Caption"
    +msgstr "Bijschrift"
    +
    +#: ../../mod/photos.php:997
    +msgid "Add a Tag"
    +msgstr "Tag toevoegen"
    +
    +#: ../../mod/photos.php:1001
    +msgid "Example: @bob, @Barbara_Jensen, @jim@example.com"
    +msgstr "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl"
    +
    +#: ../../mod/photos.php:1004
    +msgid "Flag as adult in album view"
    +msgstr "Markeer als voor volwassenen in albumweergave"
    +
    +#: ../../mod/photos.php:1196
    +msgid "In This Photo:"
    +msgstr "Op deze foto:"
    +
    +#: ../../mod/photos.php:1201
    +msgid "Map"
    +msgstr "Kaart"
    +
    +#: ../../mod/photos.php:1289
    +msgid "View Album"
    +msgstr "Album weergeven"
    +
    +#: ../../mod/photos.php:1300 ../../mod/photos.php:1313
    +#: ../../mod/photos.php:1314
    +msgid "Recent Photos"
    +msgstr "Recente foto's"
    +
     #: ../../mod/lockview.php:37
     msgid "Remote privacy information not available."
     msgstr "Privacy-informatie op afstand niet beschikbaar."
    @@ -8752,95 +8754,89 @@ msgstr "Titel van menu zoals anderen dat zien."
     msgid "Allow bookmarks"
     msgstr "Bladwijzers toestaan"
     
    -#: ../../mod/mail.php:33
    +#: ../../mod/mail.php:34
     msgid "Unable to lookup recipient."
     msgstr "Niet in staat om ontvanger op te zoeken."
     
    -#: ../../mod/mail.php:41
    +#: ../../mod/mail.php:42
     msgid "Unable to communicate with requested channel."
     msgstr "Niet in staat om met het aangevraagde kanaal te communiceren."
     
    -#: ../../mod/mail.php:48
    +#: ../../mod/mail.php:49
     msgid "Cannot verify requested channel."
     msgstr "Kan opgevraagd kanaal niet verifieren"
     
    -#: ../../mod/mail.php:74
    +#: ../../mod/mail.php:75
     msgid "Selected channel has private message restrictions. Send failed."
     msgstr "Gekozen kanaal heeft restricties voor privéberichten. Verzenden mislukt."
     
    -#: ../../mod/mail.php:132
    +#: ../../mod/mail.php:140
     msgid "Messages"
     msgstr "Berichten"
     
    -#: ../../mod/mail.php:167
    +#: ../../mod/mail.php:175
     msgid "Message recalled."
     msgstr "Bericht ingetrokken."
     
    -#: ../../mod/mail.php:180
    +#: ../../mod/mail.php:188
     msgid "Conversation removed."
     msgstr "Conversatie verwijderd"
     
    -#: ../../mod/mail.php:223
    +#: ../../mod/mail.php:231
     msgid "Requested channel is not in this network"
     msgstr "Opgevraagd kanaal is niet in dit netwerk beschikbaar"
     
    -#: ../../mod/mail.php:231
    +#: ../../mod/mail.php:239
     msgid "Send Private Message"
     msgstr "Privébericht versturen"
     
    -#: ../../mod/mail.php:232 ../../mod/mail.php:362
    +#: ../../mod/mail.php:240 ../../mod/mail.php:370
     msgid "To:"
     msgstr "Aan:"
     
    -#: ../../mod/mail.php:235 ../../mod/mail.php:364
    +#: ../../mod/mail.php:243 ../../mod/mail.php:372
     msgid "Subject:"
     msgstr "Onderwerp:"
     
    -#: ../../mod/mail.php:242
    +#: ../../mod/mail.php:250
     msgid "Send"
     msgstr "Verzenden"
     
    -#: ../../mod/mail.php:334
    +#: ../../mod/mail.php:342
     msgid "Delete message"
     msgstr "Bericht verwijderen"
     
    -#: ../../mod/mail.php:335
    +#: ../../mod/mail.php:343
     msgid "Delivery report"
     msgstr "Afleveringsrapport"
     
    -#: ../../mod/mail.php:336
    +#: ../../mod/mail.php:344
     msgid "Recall message"
     msgstr "Bericht intrekken"
     
    -#: ../../mod/mail.php:338
    +#: ../../mod/mail.php:346
     msgid "Message has been recalled."
     msgstr "Bericht is ingetrokken."
     
    -#: ../../mod/mail.php:355
    +#: ../../mod/mail.php:363
     msgid "Delete Conversation"
     msgstr "Verwijder conversatie"
     
    -#: ../../mod/mail.php:357
    +#: ../../mod/mail.php:365
     msgid ""
     "No secure communications available. You may be able to "
     "respond from the sender's profile page."
     msgstr "Geen veilige communicatie beschikbaar. Mogelijk kan je reageren op de kanaalpagina van de afzender."
     
    -#: ../../mod/mail.php:361
    +#: ../../mod/mail.php:369
     msgid "Send Reply"
     msgstr "Antwoord versturen"
     
    -#: ../../mod/mail.php:366
    +#: ../../mod/mail.php:374
     #, php-format
     msgid "Your message for %s (%s):"
     msgstr "Jouw privébericht aan %s (%s):"
     
    -#: ../../mod/post.php:234
    -msgid ""
    -"Remote authentication blocked. You are logged into this site locally. Please"
    -" logout and retry."
    -msgstr "Authenticatie op afstand geblokkeerd. Je bent lokaal op deze hub ingelogd. Uitloggen en opnieuw proberen."
    -
     #: ../../mod/service_limits.php:19
     msgid "No service class restrictions found."
     msgstr "Geen abonnementsbeperkingen gevonden."
    @@ -9377,3 +9373,9 @@ msgstr "Cron is niet actief"
     #, php-format
     msgid "[hubzilla] Cron tasks not running on %s"
     msgstr "[hubzilla] Cron-taken zijn niet actief op %s"
    +
    +#: ../../Zotlabs/Zot/Auth.php:140
    +msgid ""
    +"Remote authentication blocked. You are logged into this site locally. Please"
    +" logout and retry."
    +msgstr "Authenticatie op afstand geblokkeerd. Je bent lokaal op deze hub ingelogd. Uitloggen en opnieuw proberen."
    diff --git a/view/nl/hstrings.php b/view/nl/hstrings.php
    index 839bf7e3b..76bb7ddc2 100644
    --- a/view/nl/hstrings.php
    +++ b/view/nl/hstrings.php
    @@ -143,13 +143,6 @@ $a->strings["Collection is empty."] = "Collectie is leeg";
     $a->strings["Collection: %s"] = "Collectie: %s";
     $a->strings["Connection: %s"] = "Connectie: %s";
     $a->strings["Connection not found."] = "Connectie niet gevonden.";
    -$a->strings["view full size"] = "volledige grootte tonen";
    -$a->strings["\$Projectname Notification"] = "\$Projectname-notificatie";
    -$a->strings["\$projectname"] = "\$projectname";
    -$a->strings["Thank You,"] = "Bedankt,";
    -$a->strings["%s Administrator"] = "Beheerder %s";
    -$a->strings["Administrator"] = "Beheerder";
    -$a->strings["No Subject"] = "Geen onderwerp";
     $a->strings["l F d, Y \\@ g:i A"] = "l d F Y \\@ G:i";
     $a->strings["Starts:"] = "Start:";
     $a->strings["Finishes:"] = "Einde:";
    @@ -700,6 +693,10 @@ $a->strings["%d connection in common"] = array(
     	1 => "%d gemeenschappelijke connecties",
     );
     $a->strings["show more"] = "meer connecties weergeven";
    +$a->strings["\$Projectname Notification"] = "\$Projectname-notificatie";
    +$a->strings["\$projectname"] = "\$projectname";
    +$a->strings["Thank You,"] = "Bedankt,";
    +$a->strings["%s Administrator"] = "Beheerder %s";
     $a->strings["%s "] = "%s ";
     $a->strings["[Hubzilla:Notify] New mail received at %s"] = "[Hubzilla:Notificatie] Nieuw privébericht ontvangen op %s";
     $a->strings["%1\$s, %2\$s sent you a new private message at %3\$s."] = "%1\$s, %2\$s zond jou een nieuw privébericht om %3\$s.";
    @@ -892,6 +889,9 @@ $a->strings["Page Link"] = "Paginalink";
     $a->strings["Title"] = "Titel";
     $a->strings["Created"] = "Aangemaakt";
     $a->strings["Edited"] = "Bewerkt";
    +$a->strings["view full size"] = "volledige grootte tonen";
    +$a->strings["Administrator"] = "Beheerder";
    +$a->strings["No Subject"] = "Geen onderwerp";
     $a->strings["Cannot locate DNS info for database server '%s'"] = "Kan DNS-informatie voor databaseserver '%s' niet vinden";
     $a->strings["Image exceeds website size limit of %lu bytes"] = "Afbeelding is groter dan op deze hub toegestane limiet van %lu bytes";
     $a->strings["Image file is empty."] = "Afbeeldingsbestand is leeg";
    @@ -933,23 +933,6 @@ $a->strings["This is you"] = "Dit ben jij";
     $a->strings["Image"] = "Afbeelding";
     $a->strings["Insert Link"] = "Link invoegen";
     $a->strings["Video"] = "Video";
    -$a->strings["Not a valid email address"] = "Geen geldig e-mailadres";
    -$a->strings["Your email domain is not among those allowed on this site"] = "Jouw e-maildomein is op deze hub niet toegestaan";
    -$a->strings["Your email address is already registered at this site."] = "Jouw e-mailadres is al op deze hub geregistreerd.";
    -$a->strings["An invitation is required."] = "Een uitnodiging is vereist";
    -$a->strings["Invitation could not be verified."] = "Uitnodiging kon niet geverifieerd worden";
    -$a->strings["Please enter the required information."] = "Vul de vereiste informatie in.";
    -$a->strings["Failed to store account information."] = "Account-informatie kon niet opgeslagen worden.";
    -$a->strings["Registration confirmation for %s"] = "Registratiebevestiging voor %s";
    -$a->strings["Registration request at %s"] = "Registratiebevestiging voor %s";
    -$a->strings["your registration password"] = "jouw registratiewachtwoord";
    -$a->strings["Registration details for %s"] = "Registratiegegevens voor %s";
    -$a->strings["Account approved."] = "Account goedgekeurd";
    -$a->strings["Registration revoked for %s"] = "Registratie ingetrokken voor %s";
    -$a->strings["Account verified. Please login."] = "Account is geverifieerd. Je kan inloggen.";
    -$a->strings["Click here to upgrade."] = "Klik hier om te upgraden.";
    -$a->strings["This action exceeds the limits set by your subscription plan."] = "Deze handeling overschrijdt de beperkingen die voor jouw abonnement gelden.";
    -$a->strings["This action is not available under your subscription plan."] = "Deze handeling is niet mogelijk met jouw abonnement.";
     $a->strings["Site Admin"] = "Hubbeheerder";
     $a->strings["Address Book"] = "Connecties";
     $a->strings["Mood"] = "Stemming";
    @@ -995,6 +978,23 @@ $a->strings["Celebrity/Soapbox"] = "Beroemdheid/alleen volgen";
     $a->strings["Group Repository"] = "Groepsopslag";
     $a->strings["Custom/Expert Mode"] = "Expertmodus/handmatig aanpassen";
     $a->strings["Profile Photos"] = "Profielfoto's";
    +$a->strings["Not a valid email address"] = "Geen geldig e-mailadres";
    +$a->strings["Your email domain is not among those allowed on this site"] = "Jouw e-maildomein is op deze hub niet toegestaan";
    +$a->strings["Your email address is already registered at this site."] = "Jouw e-mailadres is al op deze hub geregistreerd.";
    +$a->strings["An invitation is required."] = "Een uitnodiging is vereist";
    +$a->strings["Invitation could not be verified."] = "Uitnodiging kon niet geverifieerd worden";
    +$a->strings["Please enter the required information."] = "Vul de vereiste informatie in.";
    +$a->strings["Failed to store account information."] = "Account-informatie kon niet opgeslagen worden.";
    +$a->strings["Registration confirmation for %s"] = "Registratiebevestiging voor %s";
    +$a->strings["Registration request at %s"] = "Registratiebevestiging voor %s";
    +$a->strings["your registration password"] = "jouw registratiewachtwoord";
    +$a->strings["Registration details for %s"] = "Registratiegegevens voor %s";
    +$a->strings["Account approved."] = "Account goedgekeurd";
    +$a->strings["Registration revoked for %s"] = "Registratie ingetrokken voor %s";
    +$a->strings["Account verified. Please login."] = "Account is geverifieerd. Je kan inloggen.";
    +$a->strings["Click here to upgrade."] = "Klik hier om te upgraden.";
    +$a->strings["This action exceeds the limits set by your subscription plan."] = "Deze handeling overschrijdt de beperkingen die voor jouw abonnement gelden.";
    +$a->strings["This action is not available under your subscription plan."] = "Deze handeling is niet mogelijk met jouw abonnement.";
     $a->strings["Permission Denied."] = "Toegang geweigerd";
     $a->strings["File not found."] = "Bestand niet gevonden.";
     $a->strings["Edit file permissions"] = "Bestandsrechten bewerken";
    @@ -1214,8 +1214,6 @@ $a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for t
     $a->strings["Bookmark added"] = "Bladwijzer toegevoegd";
     $a->strings["My Bookmarks"] = "Mijn bladwijzers";
     $a->strings["My Connections Bookmarks"] = "Bladwijzers van mijn connecties";
    -$a->strings["\$Projectname"] = "\$Projectname";
    -$a->strings["Welcome to %s"] = "Welkom op %s";
     $a->strings["This setting requires special processing and editing has been blocked."] = "Deze instelling vereist een speciaal proces  en bewerken is geblokkeerd.";
     $a->strings["Configuration Editor"] = "Configuratiebewerker";
     $a->strings["Warning: Changing some settings could render your channel inoperable. Please leave this page unless you are comfortable with and knowledgeable about how to correctly use this feature."] = "Waarschuwing: het veranderen van sommige instellingen kunnen jouw kanaal onklaar maken. Verlaat deze pagina, tenzij je weet waar je mee bezig bent en voldoende kennis bezit over hoe je deze functies moet gebruiken. ";
    @@ -1477,43 +1475,25 @@ $a->strings["For either option, please choose whether to make this hub your new
     $a->strings["Make this hub my primary location"] = "Stel deze hub als mijn primaire locatie in";
     $a->strings["Import existing posts if possible (experimental - limited by available memory"] = "Importeer bestaande berichten wanneer mogelijk (experimenteel - afhankelijk van beschikbaar servergeheugen)";
     $a->strings["This process may take several minutes to complete. Please submit the form only once and leave this page open until finished."] = "Dit proces kan enkele minuten in beslag nemen. Klik maar één keer op opslaan en verlaat deze pagina niet alvorens het proces is voltooid.";
    -$a->strings["Page owner information could not be retrieved."] = "Informatie over de pagina-eigenaar werd niet ontvangen.";
    -$a->strings["Album not found."] = "Album niet gevonden.";
    -$a->strings["Delete Album"] = "Verwijder album";
    -$a->strings["Delete Photo"] = "Verwijder foto";
    -$a->strings["No photos selected"] = "Geen foto's geselecteerd";
    -$a->strings["Access to this item is restricted."] = "Toegang tot dit item is beperkt.";
    -$a->strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB van %2$.2f MB aan foto-opslag gebruikt.";
    -$a->strings["%1$.2f MB photo storage used."] = "%1$.2f MB aan foto-opslag gebruikt.";
    -$a->strings["Upload Photos"] = "Foto's uploaden";
    -$a->strings["Enter an album name"] = "Vul een albumnaam in";
    -$a->strings["or select an existing album (doubleclick)"] = "of kies een bestaand album (dubbelklikken)";
    -$a->strings["Create a status post for this upload"] = "Plaats een bericht voor deze upload.";
    -$a->strings["Caption (optional):"] = "Bijschrift (optioneel):";
    -$a->strings["Description (optional):"] = "Omschrijving (optioneel):";
    -$a->strings["Album name could not be decoded"] = "Albumnaam kon niet gedecodeerd worden";
    -$a->strings["Contact Photos"] = "Connectiefoto's";
    -$a->strings["Show Newest First"] = "Nieuwste eerst weergeven";
    -$a->strings["Show Oldest First"] = "Oudste eerst weergeven";
    -$a->strings["Permission denied. Access to this item may be restricted."] = "Toegang geweigerd. Toegang tot dit item kan zijn beperkt.";
    -$a->strings["Photo not available"] = "Foto niet aanwezig";
    -$a->strings["Use as profile photo"] = "Als profielfoto gebruiken";
    -$a->strings["Private Photo"] = "Privéfoto";
    -$a->strings["Previous"] = "Vorige";
    -$a->strings["View Full Size"] = "Volledige grootte weergeven";
    -$a->strings["Edit photo"] = "Foto bewerken";
    -$a->strings["Rotate CW (right)"] = "Draai met de klok mee (naar rechts)";
    -$a->strings["Rotate CCW (left)"] = "Draai tegen de klok in (naar links)";
    -$a->strings["Enter a new album name"] = "Vul een nieuwe albumnaam in";
    -$a->strings["or select an existing one (doubleclick)"] = "of kies een bestaand album (dubbelklikken)";
    -$a->strings["Caption"] = "Bijschrift";
    -$a->strings["Add a Tag"] = "Tag toevoegen";
    -$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl";
    -$a->strings["Flag as adult in album view"] = "Markeer als voor volwassenen in albumweergave";
    -$a->strings["In This Photo:"] = "Op deze foto:";
    -$a->strings["Map"] = "Kaart";
    -$a->strings["View Album"] = "Album weergeven";
    -$a->strings["Recent Photos"] = "Recente foto's";
    +$a->strings["Total invitation limit exceeded."] = "Limiet voor aantal uitnodigingen overschreden.";
    +$a->strings["%s : Not a valid email address."] = "%s : Geen geldig e-mailadres.";
    +$a->strings["Please join us on \$Projectname"] = "Uitnodiging voor \$Projectname";
    +$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "Limiet voor aantal uitnodigingen overschreden. Neem contact op met je hub-beheerder.";
    +$a->strings["%s : Message delivery failed."] = "%s: Aflevering bericht mislukt.";
    +$a->strings["%d message sent."] = array(
    +	0 => "%d bericht verzonden.",
    +	1 => "%d berichten verzonden.",
    +);
    +$a->strings["You have no more invitations available"] = "Je hebt geen uitnodigingen meer beschikbaar";
    +$a->strings["Send invitations"] = "Uitnodigingen verzenden";
    +$a->strings["Enter email addresses, one per line:"] = "Voer e-mailadressen in, één per regel:";
    +$a->strings["Your message:"] = "Jouw bericht:";
    +$a->strings["Please join my community on \$Projectname."] = "Hierbij nodig ik je uit om mij, en andere vrienden en kennissen, op \$Projectname te vergezellen. Lees meer over \$Projectname  op https://redmatrix.me.";
    +$a->strings["You will need to supply this invitation code: "] = "Je moet deze uitnodigingscode opgeven: ";
    +$a->strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Registreer je op een willekeurige \$Projectname-hub (ze zijn allemaal onderling met elkaar verbonden):";
    +$a->strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Nadat je bent ingelogd en een kanaal hebt aangemaakt kan je mijn \$Projectname-kanaaladres in het zoekveld invullen:";
    +$a->strings["or visit "] = "of bezoek ";
    +$a->strings["3. Click [Connect]"] = "3. Klik op [+ Verbinden]";
     $a->strings["Fetching URL returns error: %1\$s"] = "Ophalen URL gaf een foutmelding terug: %1\$s";
     $a->strings["Image uploaded but image cropping failed."] = "Afbeelding geüpload, maar afbeelding kon niet worden bijgesneden. ";
     $a->strings["Image resize failed."] = "Afbeelding kon niet van grootte veranderd worden.";
    @@ -1654,8 +1634,8 @@ $a->strings["Verify Email Addresses"] = "E-mailadres verifieren";
     $a->strings["Check to verify email addresses used in account registration (recommended)."] = "Inschakelen om e-mailadressen te verifiëren die tijdens de accountregistratie worden gebruikt (aanbevolen).";
     $a->strings["Force publish"] = "Dwing kanaalvermelding af";
     $a->strings["Check to force all profiles on this site to be listed in the site directory."] = "Vink dit aan om af te dwingen dat alle kanalen op deze hub in de kanalengids worden vermeld.";
    -$a->strings["Disable discovery tab"] = "Ontdekkingstab";
    -$a->strings["Remove the tab in the network view with public content pulled from sources chosen for this site."] = "Verwijder de tab in de matrix-weergave waarin zich een selectie aan openbare berichten bevindt, die automatisch voor deze hub zijn uitgekozen.";
    +$a->strings["Import Public Streams"] = "Openbare streams importeren";
    +$a->strings["Import and allow access to public content pulled from other sites. Warning: this content is unmoderated."] = "Toegang verlenen tot openbare berichten die vanuit andere hubs worden geïmporteerd. Waarschuwing: de inhoud van deze berichten wordt niet gemodereerd.";
     $a->strings["login on Homepage"] = "Inlogformulier op de homepagina";
     $a->strings["Present a login box to visitors on the home page if no other content has been configured."] = "Toon een inlogformulier voor bezoekers op de homepagina wanneer geen andere inhoud is geconfigureerd. ";
     $a->strings["Directory Server URL"] = "Server-URL voor de kanalengids";
    @@ -1946,25 +1926,8 @@ $a->strings["Sync now"] = "Nu synchroniseren";
     $a->strings["Please wait several minutes between consecutive operations."] = "Wacht enkele minuten tussen opeenvolgende handelingen.";
     $a->strings["When possible, drop a location by logging into that website/hub and removing your channel."] = "Wij adviseren, wanneer dit (nog) mogelijk is, de locatie te verwijderen door op de hub van de kloon in te loggen en het kanaal daar te verwijderen.";
     $a->strings["Use this form to drop the location if the hub is no longer operating."] = "Gebruik dit formulier om de locatie te verwijderen wanneer de hub van de kloon niet meer operationeel is.";
    -$a->strings["Total invitation limit exceeded."] = "Limiet voor aantal uitnodigingen overschreden.";
    -$a->strings["%s : Not a valid email address."] = "%s : Geen geldig e-mailadres.";
    -$a->strings["Please join us on \$Projectname"] = "Uitnodiging voor \$Projectname";
    -$a->strings["Invitation limit exceeded. Please contact your site administrator."] = "Limiet voor aantal uitnodigingen overschreden. Neem contact op met je hub-beheerder.";
    -$a->strings["%s : Message delivery failed."] = "%s: Aflevering bericht mislukt.";
    -$a->strings["%d message sent."] = array(
    -	0 => "%d bericht verzonden.",
    -	1 => "%d berichten verzonden.",
    -);
    -$a->strings["You have no more invitations available"] = "Je hebt geen uitnodigingen meer beschikbaar";
    -$a->strings["Send invitations"] = "Uitnodigingen verzenden";
    -$a->strings["Enter email addresses, one per line:"] = "Voer e-mailadressen in, één per regel:";
    -$a->strings["Your message:"] = "Jouw bericht:";
    -$a->strings["Please join my community on \$Projectname."] = "Hierbij nodig ik je uit om mij, en andere vrienden en kennissen, op \$Projectname te vergezellen. Lees meer over \$Projectname  op https://redmatrix.me.";
    -$a->strings["You will need to supply this invitation code: "] = "Je moet deze uitnodigingscode opgeven: ";
    -$a->strings["1. Register at any \$Projectname location (they are all inter-connected)"] = "1. Registreer je op een willekeurige \$Projectname-hub (ze zijn allemaal onderling met elkaar verbonden):";
    -$a->strings["2. Enter my \$Projectname network address into the site searchbar."] = "2. Nadat je bent ingelogd en een kanaal hebt aangemaakt kan je mijn \$Projectname-kanaaladres in het zoekveld invullen:";
    -$a->strings["or visit "] = "of bezoek ";
    -$a->strings["3. Click [Connect]"] = "3. Klik op [+ Verbinden]";
    +$a->strings["\$Projectname"] = "\$Projectname";
    +$a->strings["Welcome to %s"] = "Welkom op %s";
     $a->strings["Please login."] = "Inloggen.";
     $a->strings["Xchan Lookup"] = "Xchan opzoeken";
     $a->strings["Lookup xchan beginning with (or webbie): "] = "Zoek een xchan (of webbie) die begint met:";
    @@ -1972,6 +1935,43 @@ $a->strings["Not found."] = "Niet gevonden.";
     $a->strings["You must be logged in to see this page."] = "Je moet zijn ingelogd om deze pagina te kunnen bekijken.";
     $a->strings["Insufficient permissions.  Request redirected to profile page."] = "Onvoldoende permissies.  Doorgestuurd naar profielpagina.";
     $a->strings["Item not available."] = "Item is niet aanwezig.";
    +$a->strings["Page owner information could not be retrieved."] = "Informatie over de pagina-eigenaar werd niet ontvangen.";
    +$a->strings["Album not found."] = "Album niet gevonden.";
    +$a->strings["Delete Album"] = "Verwijder album";
    +$a->strings["Delete Photo"] = "Verwijder foto";
    +$a->strings["No photos selected"] = "Geen foto's geselecteerd";
    +$a->strings["Access to this item is restricted."] = "Toegang tot dit item is beperkt.";
    +$a->strings["%1$.2f MB of %2$.2f MB photo storage used."] = "%1$.2f MB van %2$.2f MB aan foto-opslag gebruikt.";
    +$a->strings["%1$.2f MB photo storage used."] = "%1$.2f MB aan foto-opslag gebruikt.";
    +$a->strings["Upload Photos"] = "Foto's uploaden";
    +$a->strings["Enter an album name"] = "Vul een albumnaam in";
    +$a->strings["or select an existing album (doubleclick)"] = "of kies een bestaand album (dubbelklikken)";
    +$a->strings["Create a status post for this upload"] = "Plaats een bericht voor deze upload.";
    +$a->strings["Caption (optional):"] = "Bijschrift (optioneel):";
    +$a->strings["Description (optional):"] = "Omschrijving (optioneel):";
    +$a->strings["Album name could not be decoded"] = "Albumnaam kon niet gedecodeerd worden";
    +$a->strings["Contact Photos"] = "Connectiefoto's";
    +$a->strings["Show Newest First"] = "Nieuwste eerst weergeven";
    +$a->strings["Show Oldest First"] = "Oudste eerst weergeven";
    +$a->strings["Permission denied. Access to this item may be restricted."] = "Toegang geweigerd. Toegang tot dit item kan zijn beperkt.";
    +$a->strings["Photo not available"] = "Foto niet aanwezig";
    +$a->strings["Use as profile photo"] = "Als profielfoto gebruiken";
    +$a->strings["Private Photo"] = "Privéfoto";
    +$a->strings["Previous"] = "Vorige";
    +$a->strings["View Full Size"] = "Volledige grootte weergeven";
    +$a->strings["Edit photo"] = "Foto bewerken";
    +$a->strings["Rotate CW (right)"] = "Draai met de klok mee (naar rechts)";
    +$a->strings["Rotate CCW (left)"] = "Draai tegen de klok in (naar links)";
    +$a->strings["Enter a new album name"] = "Vul een nieuwe albumnaam in";
    +$a->strings["or select an existing one (doubleclick)"] = "of kies een bestaand album (dubbelklikken)";
    +$a->strings["Caption"] = "Bijschrift";
    +$a->strings["Add a Tag"] = "Tag toevoegen";
    +$a->strings["Example: @bob, @Barbara_Jensen, @jim@example.com"] = "Voorbeeld: @bob, @Barbara_Jansen, @jan@voorbeeld.nl";
    +$a->strings["Flag as adult in album view"] = "Markeer als voor volwassenen in albumweergave";
    +$a->strings["In This Photo:"] = "Op deze foto:";
    +$a->strings["Map"] = "Kaart";
    +$a->strings["View Album"] = "Album weergeven";
    +$a->strings["Recent Photos"] = "Recente foto's";
     $a->strings["Remote privacy information not available."] = "Privacy-informatie op afstand niet beschikbaar.";
     $a->strings["Visible to:"] = "Zichtbaar voor:";
     $a->strings["Export Channel"] = "Kanaal exporteren";
    @@ -2082,7 +2082,6 @@ $a->strings["Delete Conversation"] = "Verwijder conversatie";
     $a->strings["No secure communications available. You may be able to respond from the sender's profile page."] = "Geen veilige communicatie beschikbaar. Mogelijk kan je reageren op de kanaalpagina van de afzender.";
     $a->strings["Send Reply"] = "Antwoord versturen";
     $a->strings["Your message for %s (%s):"] = "Jouw privébericht aan %s (%s):";
    -$a->strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Authenticatie op afstand geblokkeerd. Je bent lokaal op deze hub ingelogd. Uitloggen en opnieuw proberen.";
     $a->strings["No service class restrictions found."] = "Geen abonnementsbeperkingen gevonden.";
     $a->strings["Version %s"] = "Versie %s";
     $a->strings["Installed plugins/addons/apps:"] = "Ingeschakelde plug-ins/add-ons/apps:";
    @@ -2213,3 +2212,4 @@ $a->strings["Website SSL certificate is not valid. Please correct."] = "Het SSL-
     $a->strings["[hubzilla] Website SSL error for %s"] = "[hubzilla] Probleem met SSL-certificaat voor %s";
     $a->strings["Cron/Scheduled tasks not running."] = "Cron is niet actief";
     $a->strings["[hubzilla] Cron tasks not running on %s"] = "[hubzilla] Cron-taken zijn niet actief op %s";
    +$a->strings["Remote authentication blocked. You are logged into this site locally. Please logout and retry."] = "Authenticatie op afstand geblokkeerd. Je bent lokaal op deze hub ingelogd. Uitloggen en opnieuw proberen.";
    -- 
    cgit v1.2.3
    
    
    From fb5ac37ca25cd75f1590491c3a8fff440d3c1632 Mon Sep 17 00:00:00 2001
    From: jeroenpraat 
    Date: Sat, 12 Dec 2015 17:30:02 +0100
    Subject: That script is taken from someone else without any contribution
     (http://blog.strictly-software.com/2013/07/apache-performance-tuning-bash-script.html).
     Also the English is very bad. Anyway, I've replaced it with some general tips
     that all web admins should know.
    
    ---
     install/INSTALL.txt | 17 +++--------------
     1 file changed, 3 insertions(+), 14 deletions(-)
    
    diff --git a/install/INSTALL.txt b/install/INSTALL.txt
    index 361153e59..b1f940908 100644
    --- a/install/INSTALL.txt
    +++ b/install/INSTALL.txt
    @@ -382,19 +382,8 @@ stuff on your server that might access MySQL, and Hubzilla's poller which
     needs MySQL access, too. A good setting for a medium-sized hub might be to
     keep MySQL's max_connections at 100 and set mpm_prefork's
     MaxRequestWorkers to 70.
    -------------------------------------------------------------------------
    -For Calculate Automatic according to your server resources and configure 
    -mod_prefork you can Install and Execute ApacheTune 
    -
    -Home Page: https://github.com/royalterra/apache2tune
    -
    -git clone https://github.com/royalterra/apache2tune.git
    -
    -cd apache2tune
    -
    -chmod +x Apache2tune.sh
    -
    -Please Read the Documentation of Apache2tune
    -./Apache2tune.sh
     
    +Here are you can read more information about Apache performance tuning:
    +https://httpd.apache.org/docs/2.4/misc/perf-tuning.html
     
    +There are tons of scripts to help you with fine-tuning your Apache installation. Just search with your favorite search engine 'apache fine-tuning script'.
    -- 
    cgit v1.2.3
    
    
    From 7244dfce1d935e033c70f4d00c3084cebf97d619 Mon Sep 17 00:00:00 2001
    From: jeroenpraat 
    Date: Sat, 12 Dec 2015 17:32:29 +0100
    Subject: Typos
    
    ---
     install/INSTALL.txt | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/install/INSTALL.txt b/install/INSTALL.txt
    index b1f940908..8ca74c23b 100644
    --- a/install/INSTALL.txt
    +++ b/install/INSTALL.txt
    @@ -383,7 +383,7 @@ needs MySQL access, too. A good setting for a medium-sized hub might be to
     keep MySQL's max_connections at 100 and set mpm_prefork's
     MaxRequestWorkers to 70.
     
    -Here are you can read more information about Apache performance tuning:
    +Here you can read more about Apache performance tuning:
     https://httpd.apache.org/docs/2.4/misc/perf-tuning.html
     
     There are tons of scripts to help you with fine-tuning your Apache installation. Just search with your favorite search engine 'apache fine-tuning script'.
    -- 
    cgit v1.2.3
    
    
    From bb0e4044bf08bbac9d73a3e3b75d74c33dcacd7f Mon Sep 17 00:00:00 2001
    From: redmatrix 
    Date: Sun, 13 Dec 2015 15:35:45 -0800
    Subject: remove the unqualified "OAuth" namespace from the project. We need to
     reference either OAuth1 or OAuth2.
    
    ---
     boot.php                 |   9 +++-
     include/api.php          |   8 ++--
     include/api_auth.php     |   2 +-
     include/oauth.php        |  20 ++++----
     library/OAuth1.php       | 118 +++++++++++++++++++++++------------------------
     library/twitteroauth.php |  24 +++++-----
     mod/api.php              |  22 ++++-----
     version.inc              |   2 +-
     8 files changed, 103 insertions(+), 102 deletions(-)
    
    diff --git a/boot.php b/boot.php
    index c6397c06a..8ab4556d2 100755
    --- a/boot.php
    +++ b/boot.php
    @@ -704,11 +704,18 @@ class App {
     		'smarty3' => '}}'
     	);
     
    +	// These represent the URL which was used to access the page
    +
     	private $scheme;
     	private $hostname;
    -	private $baseurl;
     	private $path;
     
    +	// This is our standardised URL - regardless of what was used
    +	// to access the page
    +
    +	private $baseurl;
    +
    +
     	/**
     	 * App constructor.
     	 */
    diff --git a/include/api.php b/include/api.php
    index fd6883f44..9c31f994f 100644
    --- a/include/api.php
    +++ b/include/api.php
    @@ -2311,12 +2311,12 @@ require_once('include/api_auth.php');
     	function api_oauth_request_token(&$a, $type){
     		try{
     			$oauth = new ZotOAuth1();
    -			$req = OAuthRequest::from_request();
    +			$req = OAuth1Request::from_request();
     			logger('Req: ' . var_export($req,true),LOGGER_DATA);
     			$r = $oauth->fetch_request_token($req);
     		}catch(Exception $e){
     			logger('oauth_exception: ' . print_r($e->getMessage(),true));
    -			echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage()); 
    +			echo "error=". OAuth1Util::urlencode_rfc3986($e->getMessage()); 
     			killme();
     		}
     		echo $r;
    @@ -2326,10 +2326,10 @@ require_once('include/api_auth.php');
     	function api_oauth_access_token(&$a, $type){
     		try{
     			$oauth = new ZotOAuth1();
    -			$req = OAuthRequest::from_request();
    +			$req = OAuth1Request::from_request();
     			$r = $oauth->fetch_access_token($req);
     		}catch(Exception $e){
    -			echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage()); killme();
    +			echo "error=". OAuth1Util::urlencode_rfc3986($e->getMessage()); killme();
     		}
     		echo $r;
     		killme();			
    diff --git a/include/api_auth.php b/include/api_auth.php
    index e3697adb0..26a9df8d4 100644
    --- a/include/api_auth.php
    +++ b/include/api_auth.php
    @@ -13,7 +13,7 @@ function api_login(&$a){
     	// login with oauth
     	try {
     		$oauth = new ZotOAuth1();
    -		$req = OAuthRequest::from_request();
    +		$req = OAuth1Request::from_request();
     
     		list($consumer,$token) = $oauth->verify_request($req);
     
    diff --git a/include/oauth.php b/include/oauth.php
    index 4e5e4ecf8..f3d144158 100644
    --- a/include/oauth.php
    +++ b/include/oauth.php
    @@ -13,7 +13,7 @@ require_once("library/OAuth1.php");
     
     //require_once("library/oauth2-php/lib/OAuth2.inc");
     
    -class ZotOAuthDataStore extends OAuthDataStore {
    +class ZotOAuth1DataStore extends OAuth1DataStore {
     
     	function gen_token(){
     		return md5(base64_encode(pack('N6', mt_rand(), mt_rand(), mt_rand(), mt_rand(), mt_rand(), uniqid())));
    @@ -28,7 +28,7 @@ class ZotOAuthDataStore extends OAuthDataStore {
     
     		if($r) {
     			get_app()->set_oauth_key($consumer_key);
    -			return new OAuthConsumer($r[0]['client_id'],$r[0]['pw'],$r[0]['redirect_uri']);
    +			return new OAuth1Consumer($r[0]['client_id'],$r[0]['pw'],$r[0]['redirect_uri']);
     		}
     		return null;
     	}
    @@ -44,7 +44,7 @@ class ZotOAuthDataStore extends OAuthDataStore {
     		);
     
     		if (count($r)){
    -			$ot=new OAuthToken($r[0]['id'],$r[0]['secret']);
    +			$ot=new OAuth1Token($r[0]['id'],$r[0]['secret']);
     			$ot->scope=$r[0]['scope'];
     			$ot->expires = $r[0]['expires'];
     			$ot->uid = $r[0]['uid'];
    @@ -62,7 +62,7 @@ class ZotOAuthDataStore extends OAuthDataStore {
     		);
     
     		if (count($r))
    -			return new OAuthToken($r[0]['id'],$r[0]['secret']);
    +			return new OAuth1Token($r[0]['id'],$r[0]['secret']);
     		return null;
     	}
     
    @@ -88,7 +88,7 @@ class ZotOAuthDataStore extends OAuthDataStore {
     
     		if(! $r)
     			return null;
    -		return new OAuthToken($key,$sec);
    +		return new OAuth1Token($key,$sec);
     	}
     
     	function new_access_token($token, $consumer, $verifier = null) {
    @@ -119,7 +119,7 @@ class ZotOAuthDataStore extends OAuthDataStore {
     				intval($uverifier));
     
     			if ($r)
    -				$ret = new OAuthToken($key,$sec);		
    +				$ret = new OAuth1Token($key,$sec);		
     		}
     		
     		
    @@ -138,12 +138,12 @@ class ZotOAuthDataStore extends OAuthDataStore {
     	}
     }
     
    -class ZotOAuth1 extends OAuthServer {
    +class ZotOAuth1 extends OAuth1Server {
     
     	function __construct() {
    -		parent::__construct(new ZotOAuthDataStore());
    -		$this->add_signature_method(new OAuthSignatureMethod_PLAINTEXT());
    -		$this->add_signature_method(new OAuthSignatureMethod_HMAC_SHA1());
    +		parent::__construct(new ZotOAuth1DataStore());
    +		$this->add_signature_method(new OAuth1SignatureMethod_PLAINTEXT());
    +		$this->add_signature_method(new OAuth1SignatureMethod_HMAC_SHA1());
     	}
     	
     	function loginUser($uid){
    diff --git a/library/OAuth1.php b/library/OAuth1.php
    index b790655af..0a6b20b0a 100644
    --- a/library/OAuth1.php
    +++ b/library/OAuth1.php
    @@ -3,11 +3,11 @@
     
     /* Generic exception class
      */
    -class OAuthException extends Exception {
    +class OAuth1Exception extends Exception {
       // pass
     }
     
    -class OAuthConsumer {
    +class OAuth1Consumer {
       public $key;
       public $secret;
     
    @@ -18,11 +18,11 @@ class OAuthConsumer {
       }
     
       function __toString() {
    -    return "OAuthConsumer[key=$this->key,secret=$this->secret]";
    +    return "OAuth1Consumer[key=$this->key,secret=$this->secret]";
       }
     }
     
    -class OAuthToken {
    +class OAuth1Token {
       // access tokens and request tokens
       public $key;
       public $secret;
    @@ -46,9 +46,9 @@ class OAuthToken {
        */
       function to_string() {
         return "oauth_token=" .
    -           OAuthUtil::urlencode_rfc3986($this->key) .
    +           OAuth1Util::urlencode_rfc3986($this->key) .
                "&oauth_token_secret=" .
    -           OAuthUtil::urlencode_rfc3986($this->secret);
    +           OAuth1Util::urlencode_rfc3986($this->secret);
       }
     
       function __toString() {
    @@ -60,7 +60,7 @@ class OAuthToken {
      * A class for implementing a Signature Method
      * See section 9 ("Signing Requests") in the spec
      */
    -abstract class OAuthSignatureMethod {
    +abstract class OAuth1SignatureMethod {
       /**
        * Needs to return the name of the Signature Method (ie HMAC-SHA1)
        * @return string
    @@ -70,20 +70,20 @@ abstract class OAuthSignatureMethod {
       /**
        * Build up the signature
        * NOTE: The output of this function MUST NOT be urlencoded.
    -   * the encoding is handled in OAuthRequest when the final
    +   * the encoding is handled in OAuth1Request when the final
        * request is serialized
    -   * @param OAuthRequest $request
    -   * @param OAuthConsumer $consumer
    -   * @param OAuthToken $token
    +   * @param OAuth1Request $request
    +   * @param OAuth1Consumer $consumer
    +   * @param OAuth1Token $token
        * @return string
        */
       abstract public function build_signature($request, $consumer, $token);
     
       /**
        * Verifies that a given signature is correct
    -   * @param OAuthRequest $request
    -   * @param OAuthConsumer $consumer
    -   * @param OAuthToken $token
    +   * @param OAuth1Request $request
    +   * @param OAuth1Consumer $consumer
    +   * @param OAuth1Token $token
        * @param string $signature
        * @return bool
        */
    @@ -101,7 +101,7 @@ abstract class OAuthSignatureMethod {
      * character (ASCII code 38) even if empty.
      *   - Chapter 9.2 ("HMAC-SHA1")
      */
    -class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod {
    +class OAuth1SignatureMethod_HMAC_SHA1 extends OAuth1SignatureMethod {
       function get_name() {
         return "HMAC-SHA1";
       }
    @@ -115,7 +115,7 @@ class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod {
           ($token) ? $token->secret : ""
         );
     
    -    $key_parts = OAuthUtil::urlencode_rfc3986($key_parts);
    +    $key_parts = OAuth1Util::urlencode_rfc3986($key_parts);
         $key = implode('&', $key_parts);
     
     
    @@ -129,7 +129,7 @@ class OAuthSignatureMethod_HMAC_SHA1 extends OAuthSignatureMethod {
      * over a secure channel such as HTTPS. It does not use the Signature Base String.
      *   - Chapter 9.4 ("PLAINTEXT")
      */
    -class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod {
    +class OAuth1SignatureMethod_PLAINTEXT extends OAuth1SignatureMethod {
       public function get_name() {
         return "PLAINTEXT";
       }
    @@ -141,7 +141,7 @@ class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod {
        *   - Chapter 9.4.1 ("Generating Signatures")
        *
        * Please note that the second encoding MUST NOT happen in the SignatureMethod, as
    -   * OAuthRequest handles this!
    +   * OAuth1Request handles this!
        */
       public function build_signature($request, $consumer, $token) {
         $key_parts = array(
    @@ -149,7 +149,7 @@ class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod {
           ($token) ? $token->secret : ""
         );
     
    -    $key_parts = OAuthUtil::urlencode_rfc3986($key_parts);
    +    $key_parts = OAuth1Util::urlencode_rfc3986($key_parts);
         $key = implode('&', $key_parts);
         $request->base_string = $key;
     
    @@ -165,7 +165,7 @@ class OAuthSignatureMethod_PLAINTEXT extends OAuthSignatureMethod {
      * specification.
      *   - Chapter 9.3 ("RSA-SHA1")
      */
    -abstract class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod {
    +abstract class OAuth1SignatureMethod_RSA_SHA1 extends OAuth1SignatureMethod {
       public function get_name() {
         return "RSA-SHA1";
       }
    @@ -224,7 +224,7 @@ abstract class OAuthSignatureMethod_RSA_SHA1 extends OAuthSignatureMethod {
       }
     }
     
    -class OAuthRequest {
    +class OAuth1Request {
       private $parameters;
       private $http_method;
       private $http_url;
    @@ -235,7 +235,7 @@ class OAuthRequest {
     
       function __construct($http_method, $http_url, $parameters=NULL) {
         @$parameters or $parameters = array();
    -    $parameters = array_merge( OAuthUtil::parse_parameters(parse_url($http_url, PHP_URL_QUERY)), $parameters);
    +    $parameters = array_merge( OAuth1Util::parse_parameters(parse_url($http_url, PHP_URL_QUERY)), $parameters);
         $this->parameters = $parameters;
         $this->http_method = $http_method;
         $this->http_url = $http_url;
    @@ -262,10 +262,10 @@ class OAuthRequest {
         // parsed parameter-list
         if (!$parameters) {
           // Find request headers
    -      $request_headers = OAuthUtil::get_headers();
    +      $request_headers = OAuth1Util::get_headers();
     
           // Parse the query-string to find GET parameters
    -      $parameters = OAuthUtil::parse_parameters($_SERVER['QUERY_STRING']);
    +      $parameters = OAuth1Util::parse_parameters($_SERVER['QUERY_STRING']);
     
           // It's a POST request of the proper content-type, so parse POST
           // parameters and add those overriding any duplicates from GET
    @@ -274,7 +274,7 @@ class OAuthRequest {
                          "application/x-www-form-urlencoded")
               ) {
     
    -        $post_data = OAuthUtil::parse_parameters(
    +        $post_data = OAuth1Util::parse_parameters(
               file_get_contents(self::$POST_INPUT)
             );
             $parameters = array_merge($parameters, $post_data);
    @@ -283,7 +283,7 @@ class OAuthRequest {
           // We have a Authorization-header with OAuth data. Parse the header
           // and add those overriding any duplicates from GET or POST
           if (@substr($request_headers['Authorization'], 0, 6) == "OAuth ") {
    -        $header_parameters = OAuthUtil::split_header(
    +        $header_parameters = OAuth1Util::split_header(
               $request_headers['Authorization']
             );
             $parameters = array_merge($parameters, $header_parameters);
    @@ -296,7 +296,7 @@ class OAuthRequest {
         $http_url =  substr($http_url, 0, strpos($http_url,$parameters['q'])+strlen($parameters['q']));
         unset( $parameters['q'] );
         
    -    return new OAuthRequest($http_method, $http_url, $parameters);
    +    return new OAuth1Request($http_method, $http_url, $parameters);
       }
     
       /**
    @@ -304,16 +304,16 @@ class OAuthRequest {
        */
       public static function from_consumer_and_token($consumer, $token, $http_method, $http_url, $parameters=NULL) {
         @$parameters or $parameters = array();
    -    $defaults = array("oauth_version" => OAuthRequest::$version,
    -                      "oauth_nonce" => OAuthRequest::generate_nonce(),
    -                      "oauth_timestamp" => OAuthRequest::generate_timestamp(),
    +    $defaults = array("oauth_version" => OAuth1Request::$version,
    +                      "oauth_nonce" => OAuth1Request::generate_nonce(),
    +                      "oauth_timestamp" => OAuth1Request::generate_timestamp(),
                           "oauth_consumer_key" => $consumer->key);
         if ($token)
           $defaults['oauth_token'] = $token->key;
     
         $parameters = array_merge($defaults, $parameters);
     
    -    return new OAuthRequest($http_method, $http_url, $parameters);
    +    return new OAuth1Request($http_method, $http_url, $parameters);
       }
     
       public function set_parameter($name, $value, $allow_duplicates = true) {
    @@ -357,7 +357,7 @@ class OAuthRequest {
           unset($params['oauth_signature']);
         }
     
    -    return OAuthUtil::build_http_query($params);
    +    return OAuth1Util::build_http_query($params);
       }
     
       /**
    @@ -374,7 +374,7 @@ class OAuthRequest {
           $this->get_signable_parameters()
         );
     
    -    $parts = OAuthUtil::urlencode_rfc3986($parts);
    +    $parts = OAuth1Util::urlencode_rfc3986($parts);
     
         return implode('&', $parts);
       }
    @@ -423,7 +423,7 @@ class OAuthRequest {
        * builds the data one would send in a POST request
        */
       public function to_postdata() {
    -    return OAuthUtil::build_http_query($this->parameters);
    +    return OAuth1Util::build_http_query($this->parameters);
       }
     
       /**
    @@ -432,7 +432,7 @@ class OAuthRequest {
       public function to_header($realm=null) {
         $first = true;
     	if($realm) {
    -      $out = 'Authorization: OAuth realm="' . OAuthUtil::urlencode_rfc3986($realm) . '"';
    +      $out = 'Authorization: OAuth realm="' . OAuth1Util::urlencode_rfc3986($realm) . '"';
           $first = false;
         } else
           $out = 'Authorization: OAuth';
    @@ -441,12 +441,12 @@ class OAuthRequest {
         foreach ($this->parameters as $k => $v) {
           if (substr($k, 0, 5) != "oauth") continue;
           if (is_array($v)) {
    -        throw new OAuthException('Arrays not supported in headers');
    +        throw new OAuth1Exception('Arrays not supported in headers');
           }
           $out .= ($first) ? ' ' : ',';
    -      $out .= OAuthUtil::urlencode_rfc3986($k) .
    +      $out .= OAuth1Util::urlencode_rfc3986($k) .
                   '="' .
    -              OAuthUtil::urlencode_rfc3986($v) .
    +              OAuth1Util::urlencode_rfc3986($v) .
                   '"';
           $first = false;
         }
    @@ -491,7 +491,7 @@ class OAuthRequest {
       }
     }
     
    -class OAuthServer {
    +class OAuth1Server {
       protected $timestamp_threshold = 300; // in seconds, five minutes
       protected $version = '1.0';             // hi blaine
       protected $signature_methods = array();
    @@ -572,7 +572,7 @@ class OAuthServer {
           $version = '1.0';
         }
         if ($version !== $this->version) {
    -      throw new OAuthException("OAuth version '$version' not supported");
    +      throw new OAuth1Exception("OAuth1 version '$version' not supported");
         }
         return $version;
       }
    @@ -587,12 +587,12 @@ class OAuthServer {
         if (!$signature_method) {
           // According to chapter 7 ("Accessing Protected Ressources") the signature-method
           // parameter is required, and we can't just fallback to PLAINTEXT
    -      throw new OAuthException('No signature method parameter. This parameter is required');
    +      throw new OAuth1Exception('No signature method parameter. This parameter is required');
         }
     
         if (!in_array($signature_method,
                       array_keys($this->signature_methods))) {
    -      throw new OAuthException(
    +      throw new OAuth1Exception(
             "Signature method '$signature_method' not supported " .
             "try one of the following: " .
             implode(", ", array_keys($this->signature_methods))
    @@ -607,12 +607,12 @@ class OAuthServer {
       private function get_consumer(&$request) {
         $consumer_key = @$request->get_parameter("oauth_consumer_key");
         if (!$consumer_key) {
    -      throw new OAuthException("Invalid consumer key");
    +      throw new OAuth1Exception("Invalid consumer key");
         }
     
         $consumer = $this->data_store->lookup_consumer($consumer_key);
         if (!$consumer) {
    -      throw new OAuthException("Invalid consumer");
    +      throw new OAuth1Exception("Invalid consumer");
         }
     
         return $consumer;
    @@ -627,7 +627,7 @@ class OAuthServer {
           $consumer, $token_type, $token_field
         );
         if (!$token) {
    -      throw new OAuthException("Invalid $token_type token: $token_field");
    +      throw new OAuth1Exception("Invalid $token_type token: $token_field");
         }
         return $token;
       }
    @@ -656,7 +656,7 @@ class OAuthServer {
     	
     
         if (!$valid_sig) {
    -      throw new OAuthException("Invalid signature");
    +      throw new OAuth1Exception("Invalid signature");
         }
       }
     
    @@ -665,14 +665,14 @@ class OAuthServer {
        */
       private function check_timestamp($timestamp) {
         if( ! $timestamp )
    -      throw new OAuthException(
    +      throw new OAuth1Exception(
             'Missing timestamp parameter. The parameter is required'
           );
         
         // verify that timestamp is recentish
         $now = time();
         if (abs($now - $timestamp) > $this->timestamp_threshold) {
    -      throw new OAuthException(
    +      throw new OAuth1Exception(
             "Expired timestamp, yours $timestamp, ours $now"
           );
         }
    @@ -683,7 +683,7 @@ class OAuthServer {
        */
       private function check_nonce($consumer, $token, $nonce, $timestamp) {
         if( ! $nonce )
    -      throw new OAuthException(
    +      throw new OAuth1Exception(
             'Missing nonce parameter. The parameter is required'
           );
     
    @@ -695,13 +695,13 @@ class OAuthServer {
           $timestamp
         );
         if ($found) {
    -      throw new OAuthException("Nonce already used: $nonce");
    +      throw new OAuth1Exception("Nonce already used: $nonce");
         }
       }
     
     }
     
    -class OAuthDataStore {
    +class OAuth1DataStore {
       function lookup_consumer($consumer_key) {
         // implement me
       }
    @@ -727,10 +727,10 @@ class OAuthDataStore {
     
     }
     
    -class OAuthUtil {
    +class OAuth1Util {
       public static function urlencode_rfc3986($input) {
       if (is_array($input)) {
    -    return array_map(array('OAuthUtil', 'urlencode_rfc3986'), $input);
    +    return array_map(array('OAuth1Util', 'urlencode_rfc3986'), $input);
       } else if (is_scalar($input)) {
         return str_replace(
           '+',
    @@ -762,7 +762,7 @@ class OAuthUtil {
           $header_name = $matches[2][0];
           $header_content = (isset($matches[5])) ? $matches[5][0] : $matches[4][0];
           if (preg_match('/^oauth_/', $header_name) || !$only_allow_oauth_parameters) {
    -        $params[$header_name] = OAuthUtil::urldecode_rfc3986($header_content);
    +        $params[$header_name] = OAuth1Util::urldecode_rfc3986($header_content);
           }
           $offset = $match[1] + strlen($match[0]);
         }
    @@ -834,8 +834,8 @@ class OAuthUtil {
         $parsed_parameters = array();
         foreach ($pairs as $pair) {
           $split = explode('=', $pair, 2);
    -      $parameter = OAuthUtil::urldecode_rfc3986($split[0]);
    -      $value = isset($split[1]) ? OAuthUtil::urldecode_rfc3986($split[1]) : '';
    +      $parameter = OAuth1Util::urldecode_rfc3986($split[0]);
    +      $value = isset($split[1]) ? OAuth1Util::urldecode_rfc3986($split[1]) : '';
     
           if (isset($parsed_parameters[$parameter])) {
             // We have already recieved parameter(s) with this name, so add to the list
    @@ -859,8 +859,8 @@ class OAuthUtil {
         if (!$params) return '';
     
         // Urlencode both keys and values
    -    $keys = OAuthUtil::urlencode_rfc3986(array_keys($params));
    -    $values = OAuthUtil::urlencode_rfc3986(array_values($params));
    +    $keys = OAuth1Util::urlencode_rfc3986(array_keys($params));
    +    $values = OAuth1Util::urlencode_rfc3986(array_values($params));
         $params = array_combine($keys, $values);
     
         // Parameters are sorted by name, using lexicographical byte value ordering.
    @@ -885,5 +885,3 @@ class OAuthUtil {
         return implode('&', $pairs);
       }
     }
    -
    -?>
    diff --git a/library/twitteroauth.php b/library/twitteroauth.php
    index a40949534..d6fb1b3a2 100644
    --- a/library/twitteroauth.php
    +++ b/library/twitteroauth.php
    @@ -6,8 +6,8 @@
      * The first PHP Library to support OAuth for Twitter's REST API.
      */
     
    -/* Load OAuth lib. You can find it at http://oauth.net */
    -if(!class_exists('OAuthException'))
    +/* Load OAuth1 lib. You can find it at http://oauth.net */
    +if(!class_exists('OAuth1Exception'))
     	require_once('library/OAuth1.php');
     
     /**
    @@ -58,10 +58,10 @@ class TwitterOAuth {
        * construct TwitterOAuth object
        */
       function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) {
    -    $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1();
    -    $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret);
    +    $this->sha1_method = new OAuth1SignatureMethod_HMAC_SHA1();
    +    $this->consumer = new OAuth1Consumer($consumer_key, $consumer_secret);
         if (!empty($oauth_token) && !empty($oauth_token_secret)) {
    -      $this->token = new OAuthConsumer($oauth_token, $oauth_token_secret);
    +      $this->token = new OAuth1Consumer($oauth_token, $oauth_token_secret);
         } else {
           $this->token = NULL;
         }
    @@ -79,8 +79,8 @@ class TwitterOAuth {
           $parameters['oauth_callback'] = $oauth_callback;
         } 
         $request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters);
    -    $token = OAuthUtil::parse_parameters($request);
    -    $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
    +    $token = OAuth1Util::parse_parameters($request);
    +    $this->token = new OAuth1Consumer($token['oauth_token'], $token['oauth_token_secret']);
         return $token;
       }
     
    @@ -115,8 +115,8 @@ class TwitterOAuth {
           $parameters['oauth_verifier'] = $oauth_verifier;
         }
         $request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters);
    -    $token = OAuthUtil::parse_parameters($request);
    -    $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
    +    $token = OAuth1Util::parse_parameters($request);
    +    $this->token = new OAuth1Consumer($token['oauth_token'], $token['oauth_token_secret']);
         return $token;
       }
     
    @@ -135,8 +135,8 @@ class TwitterOAuth {
         $parameters['x_auth_password'] = $password;
         $parameters['x_auth_mode'] = 'client_auth';
         $request = $this->oAuthRequest($this->accessTokenURL(), 'POST', $parameters);
    -    $token = OAuthUtil::parse_parameters($request);
    -    $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
    +    $token = OAuth1Util::parse_parameters($request);
    +    $this->token = new OAuth1Consumer($token['oauth_token'], $token['oauth_token_secret']);
         return $token;
       }
     
    @@ -180,7 +180,7 @@ class TwitterOAuth {
         if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0) {
           $url = "{$this->host}{$url}.{$this->format}";
         }
    -    $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);
    +    $request = OAuth1Request::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);
         $request->sign_request($this->sha1_method, $this->consumer, $this->token);
         switch ($method) {
         case 'GET':
    diff --git a/mod/api.php b/mod/api.php
    index 08978ee96..232349292 100644
    --- a/mod/api.php
    +++ b/mod/api.php
    @@ -35,42 +35,40 @@ function api_post(&$a) {
     }
     
     function api_content(&$a) {
    -	if ($a->cmd=='api/oauth/authorize'){
    +	if($a->cmd=='api/oauth/authorize'){
    +
     		/* 
     		 * api/oauth/authorize interact with the user. return a standard page
     		 */
     		
     		$a->page['template'] = "minimal";
    -		
    -		
    +				
     		// get consumer/client from request token
     		try {
    -			$request = OAuthRequest::from_request();
    +			$request = OAuth1Request::from_request();
     		} catch(Exception $e) {
     			echo "
    "; var_dump($e); killme();
     		}
     		
     		
    -		if (x($_POST,'oauth_yes')){
    +		if(x($_POST,'oauth_yes')){
     		
     			$app = oauth_get_client($request);
     			if (is_null($app)) return "Invalid request. Unknown token.";
    -			$consumer = new OAuthConsumer($app['client_id'], $app['pw'], $app['redirect_uri']);
    +			$consumer = new OAuth1Consumer($app['client_id'], $app['pw'], $app['redirect_uri']);
     
     			$verifier = md5($app['secret'].local_channel());
     			set_config("oauth", $verifier, local_channel());
     			
     			
    -			if ($consumer->callback_url!=null) {
    +			if($consumer->callback_url!=null) {
     				$params = $request->get_parameters();
     				$glue="?";
     				if (strstr($consumer->callback_url,$glue)) $glue="?";
    -				goaway($consumer->callback_url.$glue."oauth_token=".OAuthUtil::urlencode_rfc3986($params['oauth_token'])."&oauth_verifier=".OAuthUtil::urlencode_rfc3986($verifier));
    +				goaway($consumer->callback_url . $glue . "oauth_token=" . OAuth1Util::urlencode_rfc3986($params['oauth_token']) . "&oauth_verifier=" . OAuth1Util::urlencode_rfc3986($verifier));
     				killme();
     			}
    -			
    -			
    -			
    +						
     			$tpl = get_markup_template("oauth_authorize_done.tpl");
     			$o = replace_macros($tpl, array(
     				'$title' => t('Authorize application connection'),
    @@ -79,8 +77,6 @@ function api_content(&$a) {
     			));
     		
     			return $o;
    -		
    -		
     		}
     		
     		
    diff --git a/version.inc b/version.inc
    index 42838e2e7..45b65f0e2 100644
    --- a/version.inc
    +++ b/version.inc
    @@ -1 +1 @@
    -2015-12-11.1243
    +2015-12-13.1245
    -- 
    cgit v1.2.3
    
    
    From fdd2da905a27fab838aa34ef7baf0ee2c5c3c5f7 Mon Sep 17 00:00:00 2001
    From: redmatrix 
    Date: Sun, 13 Dec 2015 19:15:42 -0800
    Subject: more work on api media uploads
    
    ---
     include/api.php     | 25 ++++++++++++++++++-------
     include/attach.php  |  2 +-
     include/photos.php  |  2 +-
     mod/wall_attach.php | 28 +++++++++++++++++-----------
     4 files changed, 37 insertions(+), 20 deletions(-)
    
    diff --git a/include/api.php b/include/api.php
    index 9c31f994f..f37e0669f 100644
    --- a/include/api.php
    +++ b/include/api.php
    @@ -855,13 +855,24 @@ require_once('include/api_auth.php');
     			$_REQUEST['type'] = 'wall';
     		
     			if(x($_FILES,'media')) {
    -				$_FILES['userfile'] = $_FILES['media'];
    -				// upload the image if we have one
    -				$_REQUEST['silent']='1'; //tell wall_upload function to return img info instead of echo
    -				require_once('mod/wall_attach.php');
    -				$media = wall_attach_post($a);
    -				if(strlen($media)>0)
    -					$_REQUEST['body'] .= "\n\n".$media;
    +				$num_uploads = count($_FILES['media']['name']);
    +				for($x = 0; $x < $num_uploads; $x ++) {
    +					$_FILES['userfile'] = array();
    +					$_FILES['userfile']['name'] = $_FILES['media']['name'][$x];
    +					$_FILES['userfile']['type'] = $_FILES['media']['type'][$x];
    +					$_FILES['userfile']['tmp_name'] = $_FILES['media']['tmp_name'][$x];
    +					$_FILES['userfile']['error'] = $_FILES['media']['error'][$x];
    +					$_FILES['userfile']['size'] = $_FILES['media']['size'][$x];
    +
    +					// upload each image if we have any
    +					$_REQUEST['silent']='1'; //tell wall_upload function to return img info instead of echo
    +					require_once('mod/wall_attach.php');
    +					$a->data['api_info'] = $user_info;
    +					$media = wall_attach_post($a);
    +
    +					if(strlen($media)>0)
    +						$_REQUEST['body'] .= "\n\n" . $media;
    +				}
     			}
     		}
     
    diff --git a/include/attach.php b/include/attach.php
    index 36b971712..20e8b7444 100644
    --- a/include/attach.php
    +++ b/include/attach.php
    @@ -430,7 +430,7 @@ function attach_store($channel, $observer_hash, $options = '', $arr = null) {
     			$observer = $x[0];
     	}
     
    -	logger('arr: ' . print_r($arr,true));
    +	logger('arr: ' . print_r($arr,true), LOGGER_DATA);
     
     	if(! perm_is_allowed($channel_id,$observer_hash, 'write_storage')) {
     		$ret['message'] = t('Permission denied.');
    diff --git a/include/photos.php b/include/photos.php
    index c7360a956..798b89b54 100644
    --- a/include/photos.php
    +++ b/include/photos.php
    @@ -377,7 +377,7 @@ function photo_upload($channel, $observer, $args) {
     		$arr['item_thread_top'] = 1;
     		$arr['item_private']    = intval($acl->is_private());
     		$arr['plink']           = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $arr['mid'];
    -		$arr['body']		= (($object) ? $args['body'] : $body . "\r\n" . $args['body']);
    +		$arr['body']		= (($args['body']) ? $body . "\r\n" . $args['body'] : $body);
     
     
     		// this one is tricky because the item and the photo have the same permissions, those of the photo.
    diff --git a/mod/wall_attach.php b/mod/wall_attach.php
    index 8677c2b83..f52a4f2e5 100644
    --- a/mod/wall_attach.php
    +++ b/mod/wall_attach.php
    @@ -6,14 +6,16 @@ require_once('include/photos.php');
     
     function wall_attach_post(&$a) {
     
    -	if(argc() > 1)
    -		$channel = get_channel_by_nick(argv(1));
    -	elseif($_FILES['media']) {
    -		require_once('include/api.php');
    -		$user_info = api_get_user($a);
    +	$using_api = false;
    +
    +	if($a->data['api_info'] && array_key_exists('media',$_FILES)) {
    +		$using_api = true;
    +		$user_info = $a->data['api_info'];
     		$nick = $user_info['screen_name'];
     		$channel = get_channel_by_nick($user_info['screen_name']);
    -    }
    +	}
    +	elseif(argc() > 1)
    +		$channel = get_channel_by_nick(argv(1));
     
     	if(! $channel)
     		killme();
    @@ -49,12 +51,16 @@ function wall_attach_post(&$a) {
     	}
     
     	if(intval($r['data']['is_photo'])) {
    -		echo "\n\n" . $r['body'] . "\n\n";
    -		if($using_api)
    -			return;
    -		killme();
    +		$s = "\n\n" . $r['body'] . "\n\n";
    +	}
    +	else {
    +		$s =  "\n\n" . '[attachment]' . $r['data']['hash'] . ',' . $r['data']['revision'] . '[/attachment]' . "\n";
     	}
    -	echo  "\n\n" . '[attachment]' . $r['data']['hash'] . ',' . $r['data']['revision'] . '[/attachment]' . "\n";
    +
    +	if($using_api)
    +		return $s;
    +
    +	echo $s;
     	killme();
     
     }
    -- 
    cgit v1.2.3
    
    
    From dcf7946673fd57325fc848df8f8cea7a84cc35b6 Mon Sep 17 00:00:00 2001
    From: redmatrix 
    Date: Mon, 14 Dec 2015 02:34:18 -0800
    Subject: revert include/photos.php:L380
    
    ---
     include/photos.php | 2 +-
     version.inc        | 2 +-
     2 files changed, 2 insertions(+), 2 deletions(-)
    
    diff --git a/include/photos.php b/include/photos.php
    index 798b89b54..15aa8ee17 100644
    --- a/include/photos.php
    +++ b/include/photos.php
    @@ -377,7 +377,7 @@ function photo_upload($channel, $observer, $args) {
     		$arr['item_thread_top'] = 1;
     		$arr['item_private']    = intval($acl->is_private());
     		$arr['plink']           = z_root() . '/channel/' . $channel['channel_address'] . '/?f=&mid=' . $arr['mid'];
    -		$arr['body']		= (($args['body']) ? $body . "\r\n" . $args['body'] : $body);
    +		$arr['body']		    = (($object) ? $args['body'] : $body . "\r\n" . $args['body']);	
     
     
     		// this one is tricky because the item and the photo have the same permissions, those of the photo.
    diff --git a/version.inc b/version.inc
    index 45b65f0e2..e71192c92 100644
    --- a/version.inc
    +++ b/version.inc
    @@ -1 +1 @@
    -2015-12-13.1245
    +2015-12-14.1246
    -- 
    cgit v1.2.3