diff --git a/boot.php b/boot.php index f9bfa7551..7174b6822 100644 --- a/boot.php +++ b/boot.php @@ -9,9 +9,9 @@ require_once('include/nav.php'); require_once('include/cache.php'); define ( 'FRIENDICA_PLATFORM', 'Friendica'); -define ( 'FRIENDICA_VERSION', '3.0.1343' ); +define ( 'FRIENDICA_VERSION', '3.0.1346' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); -define ( 'DB_UPDATE_VERSION', 1143 ); +define ( 'DB_UPDATE_VERSION', 1144 ); define ( 'EOL', "
\r\n" ); define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' ); diff --git a/convert_innodb.sql b/convert_innodb.sql new file mode 100644 index 000000000..9eeb67fe8 --- /dev/null +++ b/convert_innodb.sql @@ -0,0 +1,19 @@ + + +ALTER TABLE `profile` DROP INDEX `pub_keywords` ; +ALTER TABLE `profile` DROP INDEX `prv_keywords` ; + +ALTER TABLE `item` DROP INDEX `title` ; +ALTER TABLE `item` DROP INDEX `body` ; +ALTER TABLE `item` DROP INDEX `allow_cid` ; +ALTER TABLE `item` DROP INDEX `allow_gid` ; +ALTER TABLE `item` DROP INDEX `deny_cid` ; +ALTER TABLE `item` DROP INDEX `deny_gid` ; +ALTER TABLE `item` DROP INDEX `tag` ; +ALTER TABLE `item` DROP INDEX `file` ; + + +SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;') +FROM information_schema.tables +WHERE engine = 'MyISAM'; + diff --git a/database.sql b/database.sql index cf086796a..ed97cd4aa 100644 --- a/database.sql +++ b/database.sql @@ -1028,6 +1028,7 @@ CREATE TABLE IF NOT EXISTS `user` ( `account_expires_on` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `expire_notification_sent` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `service_class` char(32) NOT NULL, + `def_gid` int(11) NOT NULL DEFAULT '0', `allow_cid` mediumtext NOT NULL, `allow_gid` mediumtext NOT NULL, `deny_cid` mediumtext NOT NULL, diff --git a/include/delivery.php b/include/delivery.php index 5f84a548a..1cee2d697 100644 --- a/include/delivery.php +++ b/include/delivery.php @@ -38,164 +38,167 @@ function delivery_run($argv, $argc){ $cmd = $argv[1]; $item_id = intval($argv[2]); - $contact_id = intval($argv[3]); - // Some other process may have delivered this item already. + for($x = 3; $x < $argc; $x ++) { - $r = q("select * from deliverq where cmd = '%s' and item = %d and contact = %d limit 1", - dbesc($cmd), - dbesc($item_id), - dbesc($contact_id) - ); - if(! count($r)) { - return; - } + $contact_id = intval($argv[x]); - $maxsysload = intval(get_config('system','maxloadavg')); - if($maxsysload < 1) - $maxsysload = 50; - if(function_exists('sys_getloadavg')) { - $load = sys_getloadavg(); - if(intval($load[0]) > $maxsysload) { - logger('system: load ' . $load . ' too high. Delivery deferred to next queue run.'); - return; - } - } + // Some other process may have delivered this item already. - // It's ours to deliver. Remove it from the queue. - - q("delete from deliverq where cmd = '%s' and item = %d and contact = %d limit 1", - dbesc($cmd), - dbesc($item_id), - dbesc($contact_id) - ); - - if((! $item_id) || (! $contact_id)) - return; - - $expire = false; - $top_level = false; - $recipients = array(); - $url_recipients = array(); - - $normal_mode = true; - - $recipients[] = $contact_id; - - if($cmd === 'expire') { - $normal_mode = false; - $expire = true; - $items = q("SELECT * FROM `item` WHERE `uid` = %d AND `wall` = 1 - AND `deleted` = 1 AND `changed` > UTC_TIMESTAMP() - INTERVAL 30 MINUTE", - intval($item_id) + $r = q("select * from deliverq where cmd = '%s' and item = %d and contact = %d limit 1", + dbesc($cmd), + dbesc($item_id), + dbesc($contact_id) ); - $uid = $item_id; - $item_id = 0; - if(! count($items)) - return; - } - else { + if(! count($r)) { + continue; + } - // find ancestors - $r = q("SELECT * FROM `item` WHERE `id` = %d and visible = 1 and moderated = 0 LIMIT 1", - intval($item_id) - ); - - if((! count($r)) || (! intval($r[0]['parent']))) { - return; + $maxsysload = intval(get_config('system','maxloadavg')); + if($maxsysload < 1) + $maxsysload = 50; + if(function_exists('sys_getloadavg')) { + $load = sys_getloadavg(); + if(intval($load[0]) > $maxsysload) { + logger('system: load ' . $load . ' too high. Delivery deferred to next queue run.'); + return; + } } - $target_item = $r[0]; - $parent_id = intval($r[0]['parent']); - $uid = $r[0]['uid']; - $updated = $r[0]['edited']; + // It's ours to deliver. Remove it from the queue. - if(! $parent_id) - return; - - - $items = q("SELECT `item`.*, `sign`.`signed_text`,`sign`.`signature`,`sign`.`signer` - FROM `item` LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` WHERE `parent` = %d and visible = 1 and moderated = 0 ORDER BY `id` ASC", - intval($parent_id) + q("delete from deliverq where cmd = '%s' and item = %d and contact = %d limit 1", + dbesc($cmd), + dbesc($item_id), + dbesc($contact_id) ); - if(! count($items)) { - return; - } + if((! $item_id) || (! $contact_id)) + continue; - $icontacts = null; - $contacts_arr = array(); - foreach($items as $item) - if(! in_array($item['contact-id'],$contacts_arr)) - $contacts_arr[] = intval($item['contact-id']); - if(count($contacts_arr)) { - $str_contacts = implode(',',$contacts_arr); - $icontacts = q("SELECT * FROM `contact` - WHERE `id` IN ( $str_contacts ) " + $expire = false; + $top_level = false; + $recipients = array(); + $url_recipients = array(); + + $normal_mode = true; + + $recipients[] = $contact_id; + + if($cmd === 'expire') { + $normal_mode = false; + $expire = true; + $items = q("SELECT * FROM `item` WHERE `uid` = %d AND `wall` = 1 + AND `deleted` = 1 AND `changed` > UTC_TIMESTAMP() - INTERVAL 30 MINUTE", + intval($item_id) ); + $uid = $item_id; + $item_id = 0; + if(! count($items)) + continue; } - if( ! ($icontacts && count($icontacts))) - return; + else { - // avoid race condition with deleting entries + // find ancestors + $r = q("SELECT * FROM `item` WHERE `id` = %d and visible = 1 and moderated = 0 LIMIT 1", + intval($item_id) + ); - if($items[0]['deleted']) { + if((! count($r)) || (! intval($r[0]['parent']))) { + continue; + } + + $target_item = $r[0]; + $parent_id = intval($r[0]['parent']); + $uid = $r[0]['uid']; + $updated = $r[0]['edited']; + + if(! $parent_id) + continue; + + + $items = q("SELECT `item`.*, `sign`.`signed_text`,`sign`.`signature`,`sign`.`signer` + FROM `item` LEFT JOIN `sign` ON `sign`.`iid` = `item`.`id` WHERE `parent` = %d and visible = 1 and moderated = 0 ORDER BY `id` ASC", + intval($parent_id) + ); + + if(! count($items)) { + continue; + } + + $icontacts = null; + $contacts_arr = array(); foreach($items as $item) - $item['deleted'] = 1; + if(! in_array($item['contact-id'],$contacts_arr)) + $contacts_arr[] = intval($item['contact-id']); + if(count($contacts_arr)) { + $str_contacts = implode(',',$contacts_arr); + $icontacts = q("SELECT * FROM `contact` + WHERE `id` IN ( $str_contacts ) " + ); + } + if( ! ($icontacts && count($icontacts))) + continue; + + // avoid race condition with deleting entries + + if($items[0]['deleted']) { + foreach($items as $item) + $item['deleted'] = 1; + } + + if((count($items) == 1) && ($items[0]['uri'] === $items[0]['parent-uri'])) { + logger('delivery: top level post'); + $top_level = true; + } } - if((count($items) == 1) && ($items[0]['uri'] === $items[0]['parent-uri'])) { - logger('delivery: top level post'); - $top_level = true; - } - } + $r = q("SELECT `contact`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`, + `user`.`timezone`, `user`.`nickname`, `user`.`sprvkey`, `user`.`spubkey`, + `user`.`page-flags`, `user`.`prvnets` + FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid` + WHERE `contact`.`uid` = %d AND `contact`.`self` = 1 LIMIT 1", + intval($uid) + ); - $r = q("SELECT `contact`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`, - `user`.`timezone`, `user`.`nickname`, `user`.`sprvkey`, `user`.`spubkey`, - `user`.`page-flags`, `user`.`prvnets` - FROM `contact` LEFT JOIN `user` ON `user`.`uid` = `contact`.`uid` - WHERE `contact`.`uid` = %d AND `contact`.`self` = 1 LIMIT 1", - intval($uid) - ); + if(! count($r)) + continue; - if(! count($r)) - return; + $owner = $r[0]; - $owner = $r[0]; + $walltowall = ((($top_level) && ($owner['id'] != $items[0]['contact-id'])) ? true : false); - $walltowall = ((($top_level) && ($owner['id'] != $items[0]['contact-id'])) ? true : false); + $public_message = true; - $public_message = true; + // fill this in with a single salmon slap if applicable - // fill this in with a single salmon slap if applicable + $slap = ''; - $slap = ''; + require_once('include/group.php'); - require_once('include/group.php'); + $parent = $items[0]; - $parent = $items[0]; + // This is IMPORTANT!!!! - // This is IMPORTANT!!!! + // We will only send a "notify owner to relay" or followup message if the referenced post + // originated on our system by virtue of having our hostname somewhere + // in the URI, AND it was a comment (not top_level) AND the parent originated elsewhere. + // if $parent['wall'] == 1 we will already have the parent message in our array + // and we will relay the whole lot. + + // expire sends an entire group of expire messages and cannot be forwarded. + // However the conversation owner will be a part of the conversation and will + // be notified during this run. + // Other DFRN conversation members will be alerted during polled updates. - // We will only send a "notify owner to relay" or followup message if the referenced post - // originated on our system by virtue of having our hostname somewhere - // in the URI, AND it was a comment (not top_level) AND the parent originated elsewhere. - // if $parent['wall'] == 1 we will already have the parent message in our array - // and we will relay the whole lot. - - // expire sends an entire group of expire messages and cannot be forwarded. - // However the conversation owner will be a part of the conversation and will - // be notified during this run. - // Other DFRN conversation members will be alerted during polled updates. - - // Diaspora members currently are not notified of expirations, and other networks have - // either limited or no ability to process deletions. We should at least fix Diaspora - // by stringing togther an array of retractions and sending them onward. + // Diaspora members currently are not notified of expirations, and other networks have + // either limited or no ability to process deletions. We should at least fix Diaspora + // by stringing togther an array of retractions and sending them onward. - $localhost = $a->get_hostname(); - if(strpos($localhost,':')) - $localhost = substr($localhost,0,strpos($localhost,':')); + $localhost = $a->get_hostname(); + if(strpos($localhost,':')) + $localhost = substr($localhost,0,strpos($localhost,':')); /** * @@ -205,174 +208,71 @@ function delivery_run($argv, $argc){ * */ - if((! $top_level) && ($parent['wall'] == 0) && (! $expire) && (stristr($target_item['uri'],$localhost))) { - logger('relay denied for delivery agent.'); + if((! $top_level) && ($parent['wall'] == 0) && (! $expire) && (stristr($target_item['uri'],$localhost))) { + logger('relay denied for delivery agent.'); - /* no relay allowed for direct contact delivery */ - return; - } + /* no relay allowed for direct contact delivery */ + continue; + } - if((strlen($parent['allow_cid'])) - || (strlen($parent['allow_gid'])) - || (strlen($parent['deny_cid'])) - || (strlen($parent['deny_gid']))) { - $public_message = false; // private recipients, not public - } + if((strlen($parent['allow_cid'])) + || (strlen($parent['allow_gid'])) + || (strlen($parent['deny_cid'])) + || (strlen($parent['deny_gid']))) { + $public_message = false; // private recipients, not public + } - $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `blocked` = 0 AND `pending` = 0", - intval($contact_id) - ); + $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `blocked` = 0 AND `pending` = 0", + intval($contact_id) + ); - if(count($r)) - $contact = $r[0]; + if(count($r)) + $contact = $r[0]; - $hubxml = feed_hublinks(); + $hubxml = feed_hublinks(); - logger('notifier: slaps: ' . print_r($slaps,true), LOGGER_DATA); + logger('notifier: slaps: ' . print_r($slaps,true), LOGGER_DATA); - require_once('include/salmon.php'); + require_once('include/salmon.php'); - if($contact['self']) - return; + if($contact['self']) + continue; - $deliver_status = 0; + $deliver_status = 0; - switch($contact['network']) { + switch($contact['network']) { - case NETWORK_DFRN : - logger('notifier: dfrndelivery: ' . $contact['name']); + case NETWORK_DFRN : + logger('notifier: dfrndelivery: ' . $contact['name']); - $feed_template = get_markup_template('atom_feed.tpl'); - $mail_template = get_markup_template('atom_mail.tpl'); + $feed_template = get_markup_template('atom_feed.tpl'); + $mail_template = get_markup_template('atom_mail.tpl'); - $atom = ''; + $atom = ''; - $birthday = feed_birthday($owner['uid'],$owner['timezone']); + $birthday = feed_birthday($owner['uid'],$owner['timezone']); - if(strlen($birthday)) - $birthday = '' . xmlify($birthday) . ''; + if(strlen($birthday)) + $birthday = '' . xmlify($birthday) . ''; - $atom .= replace_macros($feed_template, array( - '$version' => xmlify(FRIENDICA_VERSION), - '$feed_id' => xmlify($a->get_baseurl() . '/profile/' . $owner['nickname'] ), - '$feed_title' => xmlify($owner['name']), - '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', $updated . '+00:00' , ATOM_TIME)) , - '$hub' => $hubxml, - '$salmon' => '', // private feed, we don't use salmon here - '$name' => xmlify($owner['name']), - '$profile_page' => xmlify($owner['url']), - '$photo' => xmlify($owner['photo']), - '$thumb' => xmlify($owner['thumb']), - '$picdate' => xmlify(datetime_convert('UTC','UTC',$owner['avatar-date'] . '+00:00' , ATOM_TIME)) , - '$uridate' => xmlify(datetime_convert('UTC','UTC',$owner['uri-date'] . '+00:00' , ATOM_TIME)) , - '$namdate' => xmlify(datetime_convert('UTC','UTC',$owner['name-date'] . '+00:00' , ATOM_TIME)) , - '$birthday' => $birthday, - '$community' => (($owner['page-flags'] == PAGE_COMMUNITY) ? '1' : '') - )); - - foreach($items as $item) { - if(! $item['parent']) - continue; - - // private emails may be in included in public conversations. Filter them. - if(($public_message) && $item['private']) - continue; - - $item_contact = get_item_contact($item,$icontacts); - if(! $item_contact) - continue; - - if($normal_mode) { - if($item_id == $item['id'] || $item['id'] == $item['parent']) - $atom .= atom_entry($item,'text',null,$owner,true); - } - else - $atom .= atom_entry($item,'text',null,$owner,true); - - } - - $atom .= '' . "\r\n"; - - logger('notifier: ' . $atom, LOGGER_DATA); - $basepath = implode('/', array_slice(explode('/',$contact['url']),0,3)); - - // perform local delivery if we are on the same site - - if(link_compare($basepath,$a->get_baseurl())) { - - $nickname = basename($contact['url']); - if($contact['issued-id']) - $sql_extra = sprintf(" AND `dfrn-id` = '%s' ", dbesc($contact['issued-id'])); - else - $sql_extra = sprintf(" AND `issued-id` = '%s' ", dbesc($contact['dfrn-id'])); - - $x = q("SELECT `contact`.*, `contact`.`uid` AS `importer_uid`, - `contact`.`pubkey` AS `cpubkey`, - `contact`.`prvkey` AS `cprvkey`, - `contact`.`thumb` AS `thumb`, - `contact`.`url` as `url`, - `contact`.`name` as `senderName`, - `user`.* - FROM `contact` - LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid` - WHERE `contact`.`blocked` = 0 AND `contact`.`pending` = 0 - AND `contact`.`network` = '%s' AND `user`.`nickname` = '%s' - $sql_extra - AND `user`.`account_expired` = 0 LIMIT 1", - dbesc(NETWORK_DFRN), - dbesc($nickname) - ); - - if(count($x)) { - if($owner['page-flags'] == PAGE_COMMUNITY && ! $x[0]['writable']) { - q("update contact set writable = 1 where id = %d limit 1", - intval($x[0]['id']) - ); - $x[0]['writable'] = 1; - } - - $ssl_policy = get_config('system','ssl_policy'); - fix_contact_ssl_policy($x[0],$ssl_policy); - - // If we are setup as a soapbox we aren't accepting input from this person - - if($x[0]['page-flags'] == PAGE_SOAPBOX) - break; - - require_once('library/simplepie/simplepie.inc'); - logger('mod-delivery: local delivery'); - local_delivery($x[0],$atom); - break; - } - } - - if(! was_recently_delayed($contact['id'])) - $deliver_status = dfrn_deliver($owner,$contact,$atom); - else - $deliver_status = (-1); - - logger('notifier: dfrn_delivery returns ' . $deliver_status); - - if($deliver_status == (-1)) { - logger('notifier: delivery failed: queuing message'); - add_to_queue($contact['id'],NETWORK_DFRN,$atom); - } - break; - - case NETWORK_OSTATUS : - - // Do not send to otatus if we are not configured to send to public networks - if($owner['prvnets']) - break; - if(get_config('system','ostatus_disabled') || get_config('system','dfrn_only')) - break; - - // only send salmon if public - e.g. if it's ok to notify - // a public hub, it's ok to send a salmon - - if(($public_message) && (! $expire)) { - $slaps = array(); + $atom .= replace_macros($feed_template, array( + '$version' => xmlify(FRIENDICA_VERSION), + '$feed_id' => xmlify($a->get_baseurl() . '/profile/' . $owner['nickname'] ), + '$feed_title' => xmlify($owner['name']), + '$feed_updated' => xmlify(datetime_convert('UTC', 'UTC', $updated . '+00:00' , ATOM_TIME)) , + '$hub' => $hubxml, + '$salmon' => '', // private feed, we don't use salmon here + '$name' => xmlify($owner['name']), + '$profile_page' => xmlify($owner['url']), + '$photo' => xmlify($owner['photo']), + '$thumb' => xmlify($owner['thumb']), + '$picdate' => xmlify(datetime_convert('UTC','UTC',$owner['avatar-date'] . '+00:00' , ATOM_TIME)) , + '$uridate' => xmlify(datetime_convert('UTC','UTC',$owner['uri-date'] . '+00:00' , ATOM_TIME)) , + '$namdate' => xmlify(datetime_convert('UTC','UTC',$owner['name-date'] . '+00:00' , ATOM_TIME)) , + '$birthday' => $birthday, + '$community' => (($owner['page-flags'] == PAGE_COMMUNITY) ? '1' : '') + )); foreach($items as $item) { if(! $item['parent']) @@ -386,156 +286,260 @@ function delivery_run($argv, $argc){ if(! $item_contact) continue; - if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire)) - $slaps[] = atom_entry($item,'html',null,$owner,true); + if($normal_mode) { + if($item_id == $item['id'] || $item['id'] == $item['parent']) + $atom .= atom_entry($item,'text',null,$owner,true); + } + else + $atom .= atom_entry($item,'text',null,$owner,true); + } - logger('notifier: slapdelivery: ' . $contact['name']); - foreach($slaps as $slappy) { - if($contact['notify']) { - if(! was_recently_delayed($contact['id'])) - $deliver_status = slapper($owner,$contact['notify'],$slappy); - else - $deliver_status = (-1); + $atom .= '' . "\r\n"; + + logger('notifier: ' . $atom, LOGGER_DATA); + $basepath = implode('/', array_slice(explode('/',$contact['url']),0,3)); - if($deliver_status == (-1)) { - // queue message for redelivery - add_to_queue($contact['id'],NETWORK_OSTATUS,$slappy); + // perform local delivery if we are on the same site + + if(link_compare($basepath,$a->get_baseurl())) { + + $nickname = basename($contact['url']); + if($contact['issued-id']) + $sql_extra = sprintf(" AND `dfrn-id` = '%s' ", dbesc($contact['issued-id'])); + else + $sql_extra = sprintf(" AND `issued-id` = '%s' ", dbesc($contact['dfrn-id'])); + + $x = q("SELECT `contact`.*, `contact`.`uid` AS `importer_uid`, + `contact`.`pubkey` AS `cpubkey`, + `contact`.`prvkey` AS `cprvkey`, + `contact`.`thumb` AS `thumb`, + `contact`.`url` as `url`, + `contact`.`name` as `senderName`, + `user`.* + FROM `contact` + LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid` + WHERE `contact`.`blocked` = 0 AND `contact`.`pending` = 0 + AND `contact`.`network` = '%s' AND `user`.`nickname` = '%s' + $sql_extra + AND `user`.`account_expired` = 0 LIMIT 1", + dbesc(NETWORK_DFRN), + dbesc($nickname) + ); + + if(count($x)) { + if($owner['page-flags'] == PAGE_COMMUNITY && ! $x[0]['writable']) { + q("update contact set writable = 1 where id = %d limit 1", + intval($x[0]['id']) + ); + $x[0]['writable'] = 1; + } + + $ssl_policy = get_config('system','ssl_policy'); + fix_contact_ssl_policy($x[0],$ssl_policy); + + // If we are setup as a soapbox we aren't accepting input from this person + + if($x[0]['page-flags'] == PAGE_SOAPBOX) + break; + + require_once('library/simplepie/simplepie.inc'); + logger('mod-delivery: local delivery'); + local_delivery($x[0],$atom); + break; + } + } + + if(! was_recently_delayed($contact['id'])) + $deliver_status = dfrn_deliver($owner,$contact,$atom); + else + $deliver_status = (-1); + + logger('notifier: dfrn_delivery returns ' . $deliver_status); + + if($deliver_status == (-1)) { + logger('notifier: delivery failed: queuing message'); + add_to_queue($contact['id'],NETWORK_DFRN,$atom); + } + break; + + case NETWORK_OSTATUS : + + // Do not send to otatus if we are not configured to send to public networks + if($owner['prvnets']) + break; + if(get_config('system','ostatus_disabled') || get_config('system','dfrn_only')) + break; + + // only send salmon if public - e.g. if it's ok to notify + // a public hub, it's ok to send a salmon + + if(($public_message) && (! $expire)) { + $slaps = array(); + + foreach($items as $item) { + if(! $item['parent']) + continue; + + // private emails may be in included in public conversations. Filter them. + if(($public_message) && $item['private']) + continue; + + $item_contact = get_item_contact($item,$icontacts); + if(! $item_contact) + continue; + + if(($top_level) && ($public_message) && ($item['author-link'] === $item['owner-link']) && (! $expire)) + $slaps[] = atom_entry($item,'html',null,$owner,true); + } + + logger('notifier: slapdelivery: ' . $contact['name']); + foreach($slaps as $slappy) { + if($contact['notify']) { + if(! was_recently_delayed($contact['id'])) + $deliver_status = slapper($owner,$contact['notify'],$slappy); + else + $deliver_status = (-1); + + if($deliver_status == (-1)) { + // queue message for redelivery + add_to_queue($contact['id'],NETWORK_OSTATUS,$slappy); + } } } } - } - break; - - case NETWORK_MAIL : - case NETWORK_MAIL2: - - if(get_config('system','dfrn_only')) - break; - // WARNING: does not currently convert to RFC2047 header encodings, etc. - - $addr = $contact['addr']; - if(! strlen($addr)) break; - if($cmd === 'wall-new' || $cmd === 'comment-new') { + case NETWORK_MAIL : + case NETWORK_MAIL2: - $it = null; - if($cmd === 'wall-new') - $it = $items[0]; - else { - $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1", - intval($argv[2]), + if(get_config('system','dfrn_only')) + break; + // WARNING: does not currently convert to RFC2047 header encodings, etc. + + $addr = $contact['addr']; + if(! strlen($addr)) + break; + + if($cmd === 'wall-new' || $cmd === 'comment-new') { + + $it = null; + if($cmd === 'wall-new') + $it = $items[0]; + else { + $r = q("SELECT * FROM `item` WHERE `id` = %d AND `uid` = %d LIMIT 1", + intval($argv[2]), + intval($uid) + ); + if(count($r)) + $it = $r[0]; + } + if(! $it) + break; + + + $local_user = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($uid) ); - if(count($r)) - $it = $r[0]; - } - if(! $it) - break; + if(! count($local_user)) + break; + $reply_to = ''; + $r1 = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1", + intval($uid) + ); + if($r1 && $r1[0]['reply_to']) + $reply_to = $r1[0]['reply_to']; - $local_user = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", - intval($uid) - ); - if(! count($local_user)) - break; - - $reply_to = ''; - $r1 = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1", - intval($uid) - ); - if($r1 && $r1[0]['reply_to']) - $reply_to = $r1[0]['reply_to']; + $subject = (($it['title']) ? email_header_encode($it['title'],'UTF-8') : t("\x28no subject\x29")) ; - $subject = (($it['title']) ? email_header_encode($it['title'],'UTF-8') : t("\x28no subject\x29")) ; + // only expose our real email address to true friends - // only expose our real email address to true friends + if(($contact['rel'] == CONTACT_IS_FRIEND) && (! $contact['blocked'])) + $headers = 'From: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . $local_user[0]['email'] . '>' . "\n"; + else + $headers = 'From: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . t('noreply') . '@' . $a->get_hostname() . '>' . "\n"; - if(($contact['rel'] == CONTACT_IS_FRIEND) && (! $contact['blocked'])) - $headers = 'From: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . $local_user[0]['email'] . '>' . "\n"; - else - $headers = 'From: ' . email_header_encode($local_user[0]['username'],'UTF-8') . ' <' . t('noreply') . '@' . $a->get_hostname() . '>' . "\n"; + if($reply_to) + $headers .= 'Reply-to: ' . $reply_to . "\n"; - if($reply_to) - $headers .= 'Reply-to: ' . $reply_to . "\n"; + // for testing purposes: Collect exported mails + // $file = tempnam("/tmp/friendica/", "mail-out-"); + // file_put_contents($file, json_encode($it)); + + $headers .= 'Message-Id: <' . iri2msgid($it['uri']). '>' . "\n"; - // for testing purposes: Collect exported mails - // $file = tempnam("/tmp/friendica/", "mail-out-"); - // file_put_contents($file, json_encode($it)); + //logger("Mail: uri: ".$it['uri']." parent-uri ".$it['parent-uri'], LOGGER_DEBUG); + //logger("Mail: Data: ".print_r($it, true), LOGGER_DEBUG); + //logger("Mail: Data: ".print_r($it, true), LOGGER_DATA); - $headers .= 'Message-Id: <' . iri2msgid($it['uri']). '>' . "\n"; + if($it['uri'] !== $it['parent-uri']) { + $headers .= 'References: <' . iri2msgid($it['parent-uri']) . '>' . "\n"; + if(!strlen($it['title'])) { + $r = q("SELECT `title` FROM `item` WHERE `parent-uri` = '%s' LIMIT 1", + dbesc($it['parent-uri'])); - //logger("Mail: uri: ".$it['uri']." parent-uri ".$it['parent-uri'], LOGGER_DEBUG); - //logger("Mail: Data: ".print_r($it, true), LOGGER_DEBUG); - //logger("Mail: Data: ".print_r($it, true), LOGGER_DATA); - - if($it['uri'] !== $it['parent-uri']) { - $headers .= 'References: <' . iri2msgid($it['parent-uri']) . '>' . "\n"; - if(!strlen($it['title'])) { - $r = q("SELECT `title` FROM `item` WHERE `parent-uri` = '%s' LIMIT 1", - dbesc($it['parent-uri'])); - - if(count($r) AND ($r[0]['title'] != '')) - $subject = $r[0]['title']; + if(count($r) AND ($r[0]['title'] != '')) + $subject = $r[0]['title']; + } + if(strncasecmp($subject,'RE:',3)) + $subject = 'Re: '.$subject; } - if(strncasecmp($subject,'RE:',3)) - $subject = 'Re: '.$subject; + email_send($addr, $subject, $headers, $it); } - email_send($addr, $subject, $headers, $it); - } - break; - - case NETWORK_DIASPORA : - if($public_message) - $loc = 'public batch ' . $contact['batch']; - else - $loc = $contact['name']; - - logger('delivery: diaspora batch deliver: ' . $loc); - - if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) break; - if((! $contact['pubkey']) && (! $public_message)) + case NETWORK_DIASPORA : + if($public_message) + $loc = 'public batch ' . $contact['batch']; + else + $loc = $contact['name']; + + logger('delivery: diaspora batch deliver: ' . $loc); + + if(get_config('system','dfrn_only') || (! get_config('system','diaspora_enabled')) || (! $normal_mode)) + break; + + if((! $contact['pubkey']) && (! $public_message)) + break; + + if($target_item['verb'] === ACTIVITY_DISLIKE) { + // unsupported + break; + } + elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) { + logger('delivery: diaspora retract: ' . $loc); + // diaspora delete, + diaspora_send_retraction($target_item,$owner,$contact,$public_message); + break; + } + elseif($target_item['parent'] != $target_item['id']) { + + logger('delivery: diaspora relay: ' . $loc); + + // we are the relay - send comments, likes and unlikes to our conversants + diaspora_send_relay($target_item,$owner,$contact,$public_message); + break; + } + elseif(($top_level) && (! $walltowall)) { + // currently no workable solution for sending walltowall + logger('delivery: diaspora status: ' . $loc); + diaspora_send_status($target_item,$owner,$contact,$public_message); + break; + } + + logger('delivery: diaspora unknown mode: ' . $contact['name']); + break; - if($target_item['verb'] === ACTIVITY_DISLIKE) { - // unsupported + case NETWORK_FEED : + case NETWORK_FACEBOOK : + if(get_config('system','dfrn_only')) + break; + default: break; - } - elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) { - logger('delivery: diaspora retract: ' . $loc); - // diaspora delete, - diaspora_send_retraction($target_item,$owner,$contact,$public_message); - break; - } - elseif($target_item['parent'] != $target_item['id']) { - - logger('delivery: diaspora relay: ' . $loc); - - // we are the relay - send comments, likes and unlikes to our conversants - diaspora_send_relay($target_item,$owner,$contact,$public_message); - break; - } - elseif(($top_level) && (! $walltowall)) { - // currently no workable solution for sending walltowall - logger('delivery: diaspora status: ' . $loc); - diaspora_send_status($target_item,$owner,$contact,$public_message); - break; - } - - logger('delivery: diaspora unknown mode: ' . $contact['name']); - - break; - - case NETWORK_FEED : - case NETWORK_FACEBOOK : - if(get_config('system','dfrn_only')) - break; - default: - break; + } } return; diff --git a/include/diaspora.php b/include/diaspora.php index 2051de5fc..3f2cdf8e4 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -569,6 +569,14 @@ function diaspora_request($importer,$xml) { return; } + $g = q("select def_gid from user where uid = %d limit 1", + intval($importer['uid']) + ); + if($g && intval($g[0]['def_gid'])) { + require_once('include/group.php'); + group_add_member($importer['uid'],'',$contact_record['id'],$g[0]['def_gid']); + } + if($importer['page-flags'] == PAGE_NORMAL) { $hash = random_string() . (string) time(); // Generate a confirm_key diff --git a/include/group.php b/include/group.php index edb547de6..854ac06a9 100644 --- a/include/group.php +++ b/include/group.php @@ -97,8 +97,9 @@ function group_rmv_member($uid,$name,$member) { } -function group_add_member($uid,$name,$member) { - $gid = group_byname($uid,$name); +function group_add_member($uid,$name,$member,$gid = 0) { + if(! $gid) + $gid = group_byname($uid,$name); if((! $gid) || (! $uid) || (! $member)) return false; @@ -154,6 +155,32 @@ function group_public_members($gid) { } +function mini_group_select($uid,$gid = 0) { + + $grps = array(); + $o = ''; + + $r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC", + intval($uid) + ); + $grps[] = array('name' => '', 'id' => '0', 'selected' => ''); + if(count($r)) { + foreach($r as $rr) { + $grps[] = array('name' => $rr['name'], 'id' => $rr['id'], 'selected' => (($gid == $rr['id']) ? 'true' : '')); + } + + } + logger('groups: ' . print_r($grps,true)); + + $o = replace_macros(get_markup_template('group_selection.tpl'), array( + '$label' => t('Default privacy group for new contacts'), + '$groups' => $grps + )); + return $o; +} + + + function group_side($every="contacts",$each="group",$edit = false, $group_id = 0, $cid = 0) { diff --git a/include/items.php b/include/items.php index 129499967..91c9056fe 100644 --- a/include/items.php +++ b/include/items.php @@ -959,6 +959,8 @@ function tag_deliver($uid,$item_id) { return; $community_page = (($u[0]['page-flags'] == PAGE_COMMUNITY) ? true : false); + $prvgroup = (($u[0]['page-flags'] == PAGE_PRVGROUP) ? true : false); + $i = q("select * from item where id = %d and uid = %d limit 1", intval($item_id), @@ -1008,9 +1010,10 @@ function tag_deliver($uid,$item_id) { 'otype' => 'item' )); - if(! $community_page) + if((! $community_page) && (! prvgroup)) return; + // tgroup delivery - setup a second delivery chain // prevent delivery looping - only proceed // if the message originated elsewhere and is a top-level post @@ -1031,8 +1034,11 @@ function tag_deliver($uid,$item_id) { $private = ($u[0]['allow_cid'] || $u[0]['allow_gid'] || $u[0]['deny_cid'] || $u[0]['deny_gid']) ? 1 : 0; - q("update item set wall = 1, origin = 1, forum_mode = 1, `owner-name` = '%s', `owner-link` = '%s', `owner-avatar` = '%s', + $forum_mode = (($prvgroup) ? 2 : 1); + + q("update item set wall = 1, origin = 1, forum_mode = %d, `owner-name` = '%s', `owner-link` = '%s', `owner-avatar` = '%s', `private` = %d, `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s' where id = %d limit 1", + intval($forum_mode), dbesc($c[0]['name']), dbesc($c[0]['url']), dbesc($c[0]['thumb']), @@ -2194,7 +2200,7 @@ function local_delivery($importer,$data) { if($is_reply) { $community = false; - if($importer['page-flags'] == PAGE_COMMUNITY) { + if($importer['page-flags'] == PAGE_COMMUNITY || $importer['page-flags'] == PAGE_PRVGROUP ) { $sql_extra = ''; $community = true; logger('local_delivery: possible community reply'); @@ -2221,8 +2227,8 @@ function local_delivery($importer,$data) { if($r && count($r)) $is_a_remote_comment = true; - // Does this have the characteristics of a community comment? - // If it's a reply to a wall post on a community page it's a + // Does this have the characteristics of a community or private group comment? + // If it's a reply to a wall post on a community/prvgroup page it's a // valid community comment. Also forum_mode makes it valid for sure. // If neither, it's not. @@ -2711,6 +2717,12 @@ function new_follower($importer,$contact,$datarray,$item,$sharing = false) { ); $a = get_app(); if(count($r)) { + + if(intval($r[0]['def_gid'])) { + require_once('include/group.php'); + group_add_member($r[0]['uid'],'',$contact_record['id'],$r[0]['def_gid']); + } + if(($r[0]['notify-flags'] & NOTIFY_INTRO) && ($r[0]['page-flags'] == PAGE_NORMAL)) { $email_tpl = get_intltext_template('follow_notify_eml.tpl'); $email = replace_macros($email_tpl, array( diff --git a/include/network.php b/include/network.php index 27a45ec40..eeb2460d1 100644 --- a/include/network.php +++ b/include/network.php @@ -876,3 +876,167 @@ function fix_contact_ssl_policy(&$contact,$new_policy) { } } + + +/** + * xml2array() will convert the given XML text to an array in the XML structure. + * Link: http://www.bin-co.com/php/scripts/xml2array/ + * Portions significantly re-written by mike@macgirvin.com for Friendica (namespaces, lowercase tags, get_attribute default changed, more...) + * Arguments : $contents - The XML text + * $namespaces - true or false include namespace information in the returned array as array elements. + * $get_attributes - 1 or 0. If this is 1 the function will get the attributes as well as the tag values - this results in a different array structure in the return value. + * $priority - Can be 'tag' or 'attribute'. This will change the way the resulting array sturcture. For 'tag', the tags are given more importance. + * Return: The parsed XML in an array form. Use print_r() to see the resulting array structure. + * Examples: $array = xml2array(file_get_contents('feed.xml')); + * $array = xml2array(file_get_contents('feed.xml', true, 1, 'attribute')); + */ + +function xml2array($contents, $namespaces = true, $get_attributes=1, $priority = 'attribute') { + if(!$contents) return array(); + + if(!function_exists('xml_parser_create')) { + logger('xml2array: parser function missing'); + return array(); + } + + + libxml_use_internal_errors(true); + libxml_clear_errors(); + + if($namespaces) + $parser = @xml_parser_create_ns("UTF-8",':'); + else + $parser = @xml_parser_create(); + + if(! $parser) { + logger('xml2array: xml_parser_create: no resource'); + return array(); + } + + xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8"); + // http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss + xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); + xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); + @xml_parse_into_struct($parser, trim($contents), $xml_values); + @xml_parser_free($parser); + + if(! $xml_values) { + logger('xml2array: libxml: parse error: ' . $contents, LOGGER_DATA); + foreach(libxml_get_errors() as $err) + logger('libxml: parse: ' . $err->code . " at " . $err->line . ":" . $err->column . " : " . $err->message, LOGGER_DATA); + libxml_clear_errors(); + return; + } + + //Initializations + $xml_array = array(); + $parents = array(); + $opened_tags = array(); + $arr = array(); + + $current = &$xml_array; // Reference + + // Go through the tags. + $repeated_tag_index = array(); // Multiple tags with same name will be turned into an array + foreach($xml_values as $data) { + unset($attributes,$value); // Remove existing values, or there will be trouble + + // This command will extract these variables into the foreach scope + // tag(string), type(string), level(int), attributes(array). + extract($data); // We could use the array by itself, but this cooler. + + $result = array(); + $attributes_data = array(); + + if(isset($value)) { + if($priority == 'tag') $result = $value; + else $result['value'] = $value; // Put the value in a assoc array if we are in the 'Attribute' mode + } + + //Set the attributes too. + if(isset($attributes) and $get_attributes) { + foreach($attributes as $attr => $val) { + if($priority == 'tag') $attributes_data[$attr] = $val; + else $result['@attributes'][$attr] = $val; // Set all the attributes in a array called 'attr' + } + } + + // See tag status and do the needed. + if($namespaces && strpos($tag,':')) { + $namespc = substr($tag,0,strrpos($tag,':')); + $tag = strtolower(substr($tag,strlen($namespc)+1)); + $result['@namespace'] = $namespc; + } + $tag = strtolower($tag); + + if($type == "open") { // The starting of the tag '' + $parent[$level-1] = &$current; + if(!is_array($current) or (!in_array($tag, array_keys($current)))) { // Insert New tag + $current[$tag] = $result; + if($attributes_data) $current[$tag. '_attr'] = $attributes_data; + $repeated_tag_index[$tag.'_'.$level] = 1; + + $current = &$current[$tag]; + + } else { // There was another element with the same tag name + + if(isset($current[$tag][0])) { // If there is a 0th element it is already an array + $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result; + $repeated_tag_index[$tag.'_'.$level]++; + } else { // This section will make the value an array if multiple tags with the same name appear together + $current[$tag] = array($current[$tag],$result); // This will combine the existing item and the new item together to make an array + $repeated_tag_index[$tag.'_'.$level] = 2; + + if(isset($current[$tag.'_attr'])) { // The attribute of the last(0th) tag must be moved as well + $current[$tag]['0_attr'] = $current[$tag.'_attr']; + unset($current[$tag.'_attr']); + } + + } + $last_item_index = $repeated_tag_index[$tag.'_'.$level]-1; + $current = &$current[$tag][$last_item_index]; + } + + } elseif($type == "complete") { // Tags that ends in 1 line '' + //See if the key is already taken. + if(!isset($current[$tag])) { //New Key + $current[$tag] = $result; + $repeated_tag_index[$tag.'_'.$level] = 1; + if($priority == 'tag' and $attributes_data) $current[$tag. '_attr'] = $attributes_data; + + } else { // If taken, put all things inside a list(array) + if(isset($current[$tag][0]) and is_array($current[$tag])) { // If it is already an array... + + // ...push the new element into that array. + $current[$tag][$repeated_tag_index[$tag.'_'.$level]] = $result; + + if($priority == 'tag' and $get_attributes and $attributes_data) { + $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data; + } + $repeated_tag_index[$tag.'_'.$level]++; + + } else { // If it is not an array... + $current[$tag] = array($current[$tag],$result); //...Make it an array using using the existing value and the new value + $repeated_tag_index[$tag.'_'.$level] = 1; + if($priority == 'tag' and $get_attributes) { + if(isset($current[$tag.'_attr'])) { // The attribute of the last(0th) tag must be moved as well + + $current[$tag]['0_attr'] = $current[$tag.'_attr']; + unset($current[$tag.'_attr']); + } + + if($attributes_data) { + $current[$tag][$repeated_tag_index[$tag.'_'.$level] . '_attr'] = $attributes_data; + } + } + $repeated_tag_index[$tag.'_'.$level]++; // 0 and 1 indexes are already taken + } + } + + } elseif($type == 'close') { // End of tag '' + $current = &$parent[$level-1]; + } + } + + return($xml_array); +} diff --git a/include/notifier.php b/include/notifier.php index 6ce281372..8b904dbcd 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -220,7 +220,7 @@ function notifier_run($argv, $argc){ } - if(($cmd === 'uplink') && (intval($parent['forum_mode'])) && (! $top_level)) { + if(($cmd === 'uplink') && (intval($parent['forum_mode']) == 1) && (! $top_level)) { $relay_to_owner = true; } @@ -265,10 +265,10 @@ function notifier_run($argv, $argc){ $deny_people = expand_acl($parent['deny_cid']); $deny_groups = expand_groups(expand_acl($parent['deny_gid'])); - // if our parent is a forum, uplink to the origional author causing - // a delivery fork + // if our parent is a public forum (forum_mode == 1), uplink to the origional author causing + // a delivery fork. private groups (forum_mode == 2) do not uplink - if(intval($parent['forum_mode']) && (! $top_level) && ($cmd !== 'uplink')) { + if((intval($parent['forum_mode']) == 1) && (! $top_level) && ($cmd !== 'uplink')) { proc_run('php','include/notifier','uplink',$item_id); } @@ -478,6 +478,12 @@ function notifier_run($argv, $argc){ } } + $deliveries_per_process = intval(get_config('system','delivery_batch_count')); + if($deliveries_per_process <= 0) + $deliveries_per_process = 1; + + $this_batch = array(); + foreach($r as $contact) { if($contact['self']) continue; @@ -486,6 +492,7 @@ function notifier_run($argv, $argc){ // we will deliver single recipient types of message and email receipients here. if((! $mail) && (! $fsuggest) && (! $followup)) { + // deliveries per process not yet implemented, 1 delivery per process. proc_run('php','include/delivery.php',$cmd,$item_id,$contact['id']); if($interval) @time_sleep_until(microtime(true) + (float) $interval); diff --git a/mod/dfrn_confirm.php b/mod/dfrn_confirm.php index 2b25095fd..227d72cbf 100644 --- a/mod/dfrn_confirm.php +++ b/mod/dfrn_confirm.php @@ -500,6 +500,16 @@ function dfrn_confirm_post(&$a,$handsfree = null) { } } } + + + $g = q("select def_gid from user where uid = %d limit 1", + intval($uid) + ); + if($contact && $g && intval($g[0]['def_gid'])) { + require_once('include/group.php'); + group_add_member($uid,'',$contact[0]['id'],$g[0]['def_gid']); + } + // Let's send our user to the contact editor in case they want to // do anything special with this new friend. diff --git a/mod/dfrn_request.php b/mod/dfrn_request.php index 2169c494c..b809929d7 100644 --- a/mod/dfrn_request.php +++ b/mod/dfrn_request.php @@ -370,6 +370,14 @@ function dfrn_request_post(&$a) { if(count($r)) { $contact_id = $r[0]['id']; + $g = q("select def_gid from user where uid = %d limit 1", + intval($uid) + ); + if($g && intval($g[0]['def_gid'])) { + require_once('include/group.php'); + group_add_member($uid,'',$contact_id,$g[0]['def_gid']); + } + $photo = avatar_img($addr); $r = q("UPDATE `contact` SET diff --git a/mod/follow.php b/mod/follow.php index 4a7f99bf0..cdecd5f2a 100644 --- a/mod/follow.php +++ b/mod/follow.php @@ -109,6 +109,7 @@ function follow_init(&$a) { dbesc($ret['poll']) ); + if(count($r)) { // update contact if($r[0]['rel'] == CONTACT_IS_FOLLOWER || ($network === NETWORK_DIASPORA && $r[0]['rel'] == CONTACT_IS_SHARING)) { @@ -165,6 +166,15 @@ function follow_init(&$a) { $contact = $r[0]; $contact_id = $r[0]['id']; + + $g = q("select def_gid from user where uid = %d limit 1", + intval($uid) + ); + if($g && intval($g[0]['def_gid'])) { + require_once('include/group.php'); + group_add_member($uid,'',$contact_id,$g[0]['def_gid']); + } + require_once("Photo.php"); $photos = import_profile_photo($ret['photo'],$uid,$contact_id); diff --git a/mod/photo.php b/mod/photo.php index 1d38fe8e4..3cd8250a9 100644 --- a/mod/photo.php +++ b/mod/photo.php @@ -28,6 +28,8 @@ function photo_init(&$a) { } }*/ + $prvcachecontrol = false; + switch($a->argc) { case 4: $person = $a->argv[3]; @@ -134,6 +136,7 @@ function photo_init(&$a) { ); if(count($r)) { $data = file_get_contents('images/nosign.jpg'); + $prvcachecontrol = true; } } } @@ -179,8 +182,22 @@ function photo_init(&$a) { } header("Content-type: image/jpeg"); - header("Expires: " . gmdate("D, d M Y H:i:s", time() + (3600*24)) . " GMT"); - header("Cache-Control: max-age=" . (3600*24)); + + if($prvcachecontrol) { + + // it is a private photo that they have no permission to view. + // tell the browser not to cache it, in case they authenticate + // and subsequently have permission to see it + + header("Cache-Control: no-store, no-cache, must-revalidate"); + + } + else { + + header("Expires: " . gmdate("D, d M Y H:i:s", time() + (3600*24)) . " GMT"); + header("Cache-Control: max-age=" . (3600*24)); + + } echo $data; killme(); // NOTREACHED diff --git a/mod/profiles.php b/mod/profiles.php index c72a233c2..26fc88765 100644 --- a/mod/profiles.php +++ b/mod/profiles.php @@ -329,7 +329,7 @@ function profile_activity($changed, $value) { if($t == 1 && strlen($value)) { $message = sprintf( t('%1$s changed %2$s to “%3$s”'), $A, $changes, $value); - $message .= "\n\n" . sprintf( t(" - Visit %1$s\'s %2$s"), $A, $prof); + $message .= "\n\n" . sprintf( t(' - Visit %1$s\'s %2$s'), $A, $prof); } else $message = sprintf( t('%1$s has an updated %2$s, changing %3$s.'), $A, $prof, $changes); diff --git a/mod/search.php b/mod/search.php index d467764b0..635c87b70 100644 --- a/mod/search.php +++ b/mod/search.php @@ -96,6 +96,12 @@ function search_content(&$a) { $o .= search($search,'search-box','/search',((local_user()) ? true : false)); + + if(strpos($search,'#') === 0) { + $tag = true; + $search = substr($search,1); + } + if(! $search) return $o; diff --git a/mod/settings.php b/mod/settings.php index 5f5b2ab2e..40fa55eea 100644 --- a/mod/settings.php +++ b/mod/settings.php @@ -330,6 +330,7 @@ function settings_post(&$a) { $openid = ((x($_POST,'openid_url')) ? notags(trim($_POST['openid_url'])) : ''); $maxreq = ((x($_POST,'maxreq')) ? intval($_POST['maxreq']) : 0); $expire = ((x($_POST,'expire')) ? intval($_POST['expire']) : 0); + $def_gid = ((x($_POST,'group-selection')) ? intval($_POST['group-selection']) : 0); $expire_items = ((x($_POST,'expire_items')) ? intval($_POST['expire_items']) : 0); @@ -355,7 +356,6 @@ function settings_post(&$a) { $post_joingroup = (($_POST['post_joingroup'] == 1) ? 1: 0); $post_profilechange = (($_POST['post_profilechange'] == 1) ? 1: 0); - $notify = 0; if(x($_POST,'notify1')) @@ -441,7 +441,20 @@ function settings_post(&$a) { set_pconfig(local_user(),'system','post_profilechange', $post_profilechange); - $r = q("UPDATE `user` SET `username` = '%s', `email` = '%s', `openid` = '%s', `timezone` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', `notify-flags` = %d, `page-flags` = %d, `default-location` = '%s', `allow_location` = %d, `maxreq` = %d, `expire` = %d, `openidserver` = '%s', `blockwall` = %d, `hidewall` = %d, `blocktags` = %d, `unkmail` = %d, `cntunkmail` = %d WHERE `uid` = %d LIMIT 1", + if($page_flags == PAGE_PRVGROUP) { + $hidewall = 1; + if((! str_contact_allow) && (! str_group_allow) && (! str_contact_deny) && (! $str_group_deny)) { + if($def_gid) { + info( t('Private forum has no privacy permissions. Using default privacy group.'). EOL); + $str_group_allow = '<' . $def_gid . '>'; + } + else { + notice( t('Private forum has no privacy permissions and no default privacy group.') . EOL); + } + } + } + + $r = q("UPDATE `user` SET `username` = '%s', `email` = '%s', `openid` = '%s', `timezone` = '%s', `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s', `notify-flags` = %d, `page-flags` = %d, `default-location` = '%s', `allow_location` = %d, `maxreq` = %d, `expire` = %d, `openidserver` = '%s', `def_gid` = %d, `blockwall` = %d, `hidewall` = %d, `blocktags` = %d, `unkmail` = %d, `cntunkmail` = %d WHERE `uid` = %d LIMIT 1", dbesc($username), dbesc($email), dbesc($openid), @@ -457,6 +470,7 @@ function settings_post(&$a) { intval($maxreq), intval($expire), dbesc($openidserver), + intval($def_gid), intval($blockwall), intval($hidewall), intval($blocktags), @@ -833,6 +847,13 @@ function settings_content(&$a) { '$page_freelove' => array('page-flags', t('Automatic Friend Account'), PAGE_FREELOVE, t('Automatically approve all connection/friend requests as friends'), ($a->user['page-flags'] == PAGE_FREELOVE)), + + '$page_prvgroup' => array('page-flags', t('Private Forum'), PAGE_PRVGROUP, + t('Private forum - approved members only [Experimental]'), + ($a->user['page-flags'] == PAGE_PRVGROUP)), + + '$experimental' => ( (intval(get_config('system','prvgroup_testing'))) ? 'true' : ''), + )); $noid = get_config('system','no_openid'); @@ -934,6 +955,9 @@ function settings_content(&$a) { 'photos' => array('expire_photos', t("Expire photos:"), $expire_photos, '', array(t('No'),t('Yes'))), ); + require_once('include/group.php'); + $group_select = mini_group_select(local_user(),$a->user['def_gid']); + $o .= replace_macros($stpl,array( '$ptitle' => t('Account Settings'), @@ -941,7 +965,6 @@ function settings_content(&$a) { '$baseurl' => $a->get_baseurl(true), '$uid' => local_user(), '$form_security_token' => get_form_security_token("settings"), - '$nickname_block' => $prof_addr, '$h_pass' => t('Password Settings'), @@ -968,6 +991,10 @@ function settings_content(&$a) { '$suggestme' => $suggestme, '$blockwall'=> $blockwall, // array('blockwall', t('Allow friends to post to your profile page:'), !$blockwall, ''), '$blocktags'=> $blocktags, // array('blocktags', t('Allow friends to tag your posts:'), !$blocktags, ''), + + '$group_select' => $group_select, + + '$expire' => $expire_arr, '$profile_in_dir' => $profile_in_dir, diff --git a/update.php b/update.php index e363aa942..f25d16f9d 100644 --- a/update.php +++ b/update.php @@ -1,6 +1,6 @@ \n" "Language-Team: LANGUAGE \n" @@ -39,8 +39,8 @@ msgstr "" #: ../../mod/api.php:31 ../../mod/photos.php:130 ../../mod/photos.php:865 #: ../../mod/editpost.php:10 ../../mod/install.php:171 #: ../../mod/notifications.php:66 ../../mod/contacts.php:125 -#: ../../mod/settings.php:104 ../../mod/settings.php:521 -#: ../../mod/settings.php:526 ../../mod/manage.php:86 ../../mod/network.php:6 +#: ../../mod/settings.php:104 ../../mod/settings.php:535 +#: ../../mod/settings.php:540 ../../mod/manage.php:86 ../../mod/network.php:6 #: ../../mod/notes.php:20 ../../mod/wallmessage.php:9 #: ../../mod/wallmessage.php:33 ../../mod/wallmessage.php:79 #: ../../mod/wallmessage.php:103 ../../mod/attach.php:33 @@ -54,8 +54,8 @@ msgstr "" #: ../../mod/follow.php:8 ../../mod/display.php:138 ../../mod/profiles.php:7 #: ../../mod/profiles.php:365 ../../mod/delegate.php:6 #: ../../mod/suggest.php:28 ../../mod/invite.php:13 ../../mod/invite.php:81 -#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:495 -#: ../../include/items.php:3202 ../../index.php:306 +#: ../../mod/dfrn_confirm.php:53 ../../addon/facebook/facebook.php:503 +#: ../../include/items.php:3214 ../../index.php:306 msgid "Permission denied." msgstr "" @@ -84,8 +84,8 @@ msgstr "" msgid "Return to contact editor" msgstr "" -#: ../../mod/crepair.php:148 ../../mod/settings.php:541 -#: ../../mod/settings.php:567 ../../mod/admin.php:643 ../../mod/admin.php:652 +#: ../../mod/crepair.php:148 ../../mod/settings.php:555 +#: ../../mod/settings.php:581 ../../mod/admin.php:643 ../../mod/admin.php:652 msgid "Name" msgstr "" @@ -127,12 +127,12 @@ msgstr "" #: ../../mod/photos.php:1273 ../../mod/photos.php:1304 #: ../../mod/install.php:251 ../../mod/install.php:289 #: ../../mod/localtime.php:45 ../../mod/contacts.php:322 -#: ../../mod/settings.php:539 ../../mod/settings.php:685 -#: ../../mod/settings.php:746 ../../mod/settings.php:940 +#: ../../mod/settings.php:553 ../../mod/settings.php:699 +#: ../../mod/settings.php:760 ../../mod/settings.php:964 #: ../../mod/manage.php:109 ../../mod/group.php:85 ../../mod/admin.php:404 #: ../../mod/admin.php:640 ../../mod/admin.php:776 ../../mod/admin.php:975 #: ../../mod/admin.php:1062 ../../mod/profiles.php:534 -#: ../../mod/invite.php:119 ../../addon/facebook/facebook.php:597 +#: ../../mod/invite.php:119 ../../addon/facebook/facebook.php:605 #: ../../addon/yourls/yourls.php:76 ../../addon/ljpost/ljpost.php:93 #: ../../addon/nsfw/nsfw.php:57 ../../addon/planets/planets.php:158 #: ../../addon/uhremotestorage/uhremotestorage.php:89 @@ -279,8 +279,8 @@ msgid "Share this event" msgstr "" #: ../../mod/tagrm.php:11 ../../mod/tagrm.php:94 -#: ../../mod/dfrn_request.php:818 ../../mod/settings.php:540 -#: ../../mod/settings.php:566 ../../addon/js_upload/js_upload.php:45 +#: ../../mod/dfrn_request.php:826 ../../mod/settings.php:554 +#: ../../mod/settings.php:580 ../../addon/js_upload/js_upload.php:45 msgid "Cancel" msgstr "" @@ -323,24 +323,24 @@ msgid "" "and/or create new posts for you?" msgstr "" -#: ../../mod/api.php:105 ../../mod/dfrn_request.php:806 -#: ../../mod/settings.php:854 ../../mod/settings.php:860 -#: ../../mod/settings.php:868 ../../mod/settings.php:872 -#: ../../mod/settings.php:877 ../../mod/settings.php:883 -#: ../../mod/settings.php:889 ../../mod/settings.php:895 -#: ../../mod/settings.php:931 ../../mod/settings.php:932 -#: ../../mod/settings.php:933 ../../mod/settings.php:934 +#: ../../mod/api.php:105 ../../mod/dfrn_request.php:814 +#: ../../mod/settings.php:875 ../../mod/settings.php:881 +#: ../../mod/settings.php:889 ../../mod/settings.php:893 +#: ../../mod/settings.php:898 ../../mod/settings.php:904 +#: ../../mod/settings.php:910 ../../mod/settings.php:916 +#: ../../mod/settings.php:952 ../../mod/settings.php:953 +#: ../../mod/settings.php:954 ../../mod/settings.php:955 #: ../../mod/register.php:532 ../../mod/profiles.php:511 msgid "Yes" msgstr "" -#: ../../mod/api.php:106 ../../mod/dfrn_request.php:807 -#: ../../mod/settings.php:854 ../../mod/settings.php:860 -#: ../../mod/settings.php:868 ../../mod/settings.php:872 -#: ../../mod/settings.php:877 ../../mod/settings.php:883 -#: ../../mod/settings.php:889 ../../mod/settings.php:895 -#: ../../mod/settings.php:931 ../../mod/settings.php:932 -#: ../../mod/settings.php:933 ../../mod/settings.php:934 +#: ../../mod/api.php:106 ../../mod/dfrn_request.php:815 +#: ../../mod/settings.php:875 ../../mod/settings.php:881 +#: ../../mod/settings.php:889 ../../mod/settings.php:893 +#: ../../mod/settings.php:898 ../../mod/settings.php:904 +#: ../../mod/settings.php:910 ../../mod/settings.php:916 +#: ../../mod/settings.php:952 ../../mod/settings.php:953 +#: ../../mod/settings.php:954 ../../mod/settings.php:955 #: ../../mod/register.php:533 ../../mod/profiles.php:512 msgid "No" msgstr "" @@ -398,7 +398,7 @@ msgstr "" #: ../../mod/photos.php:528 ../../mod/like.php:127 ../../mod/tagger.php:70 #: ../../addon/communityhome/communityhome.php:163 #: ../../view/theme/diabook/theme.php:565 ../../include/text.php:1305 -#: ../../include/diaspora.php:1654 ../../include/conversation.php:53 +#: ../../include/diaspora.php:1662 ../../include/conversation.php:53 #: ../../include/conversation.php:126 msgid "photo" msgstr "" @@ -426,7 +426,7 @@ msgid "Image upload failed." msgstr "" #: ../../mod/photos.php:759 ../../mod/community.php:16 -#: ../../mod/dfrn_request.php:732 ../../mod/viewcontacts.php:17 +#: ../../mod/dfrn_request.php:740 ../../mod/viewcontacts.php:17 #: ../../mod/display.php:7 ../../mod/search.php:71 ../../mod/directory.php:29 msgid "Public access denied." msgstr "" @@ -554,8 +554,8 @@ msgstr "" msgid "Preview" msgstr "" -#: ../../mod/photos.php:1331 ../../mod/settings.php:602 -#: ../../mod/settings.php:683 ../../mod/group.php:168 ../../mod/admin.php:647 +#: ../../mod/photos.php:1331 ../../mod/settings.php:616 +#: ../../mod/settings.php:697 ../../mod/group.php:168 ../../mod/admin.php:647 #: ../../include/conversation.php:321 ../../include/conversation.php:587 msgid "Delete" msgstr "" @@ -625,7 +625,7 @@ msgstr "" msgid "Post to Email" msgstr "" -#: ../../mod/editpost.php:95 ../../mod/settings.php:601 +#: ../../mod/editpost.php:95 ../../mod/settings.php:615 #: ../../include/conversation.php:574 msgid "Edit" msgstr "" @@ -694,19 +694,19 @@ msgstr "" msgid "This introduction has already been accepted." msgstr "" -#: ../../mod/dfrn_request.php:117 ../../mod/dfrn_request.php:487 +#: ../../mod/dfrn_request.php:117 ../../mod/dfrn_request.php:495 msgid "Profile location is not valid or does not contain profile information." msgstr "" -#: ../../mod/dfrn_request.php:122 ../../mod/dfrn_request.php:492 +#: ../../mod/dfrn_request.php:122 ../../mod/dfrn_request.php:500 msgid "Warning: profile location has no identifiable owner name." msgstr "" -#: ../../mod/dfrn_request.php:124 ../../mod/dfrn_request.php:494 +#: ../../mod/dfrn_request.php:124 ../../mod/dfrn_request.php:502 msgid "Warning: profile location has no profile photo." msgstr "" -#: ../../mod/dfrn_request.php:127 ../../mod/dfrn_request.php:497 +#: ../../mod/dfrn_request.php:127 ../../mod/dfrn_request.php:505 #, php-format msgid "%d required parameter was not found at the given location" msgid_plural "%d required parameters were not found at the given location" @@ -750,128 +750,128 @@ msgstr "" msgid "This account has not been configured for email. Request failed." msgstr "" -#: ../../mod/dfrn_request.php:432 +#: ../../mod/dfrn_request.php:440 msgid "Unable to resolve your name at the provided location." msgstr "" -#: ../../mod/dfrn_request.php:445 +#: ../../mod/dfrn_request.php:453 msgid "You have already introduced yourself here." msgstr "" -#: ../../mod/dfrn_request.php:449 +#: ../../mod/dfrn_request.php:457 #, php-format msgid "Apparently you are already friends with %s." msgstr "" -#: ../../mod/dfrn_request.php:470 +#: ../../mod/dfrn_request.php:478 msgid "Invalid profile URL." msgstr "" -#: ../../mod/dfrn_request.php:476 ../../mod/follow.php:23 +#: ../../mod/dfrn_request.php:484 ../../mod/follow.php:23 msgid "Disallowed profile URL." msgstr "" -#: ../../mod/dfrn_request.php:545 ../../mod/contacts.php:102 +#: ../../mod/dfrn_request.php:553 ../../mod/contacts.php:102 msgid "Failed to update contact record." msgstr "" -#: ../../mod/dfrn_request.php:566 +#: ../../mod/dfrn_request.php:574 msgid "Your introduction has been sent." msgstr "" -#: ../../mod/dfrn_request.php:619 +#: ../../mod/dfrn_request.php:627 msgid "Please login to confirm introduction." msgstr "" -#: ../../mod/dfrn_request.php:633 +#: ../../mod/dfrn_request.php:641 msgid "" "Incorrect identity currently logged in. Please login to this profile." msgstr "" -#: ../../mod/dfrn_request.php:645 +#: ../../mod/dfrn_request.php:653 #, php-format msgid "Welcome home %s." msgstr "" -#: ../../mod/dfrn_request.php:646 +#: ../../mod/dfrn_request.php:654 #, php-format msgid "Please confirm your introduction/connection request to %s." msgstr "" -#: ../../mod/dfrn_request.php:647 +#: ../../mod/dfrn_request.php:655 msgid "Confirm" msgstr "" -#: ../../mod/dfrn_request.php:688 ../../include/items.php:2717 +#: ../../mod/dfrn_request.php:696 ../../include/items.php:2729 msgid "[Name Withheld]" msgstr "" -#: ../../mod/dfrn_request.php:781 +#: ../../mod/dfrn_request.php:789 msgid "" "Please enter your 'Identity Address' from one of the following supported " "communications networks:" msgstr "" -#: ../../mod/dfrn_request.php:797 +#: ../../mod/dfrn_request.php:805 msgid "Connect as an email follower (Coming soon)" msgstr "" -#: ../../mod/dfrn_request.php:799 +#: ../../mod/dfrn_request.php:807 msgid "" "If you are not yet a member of the free social web, follow this link to find a public Friendica site " "and join us today." msgstr "" -#: ../../mod/dfrn_request.php:802 +#: ../../mod/dfrn_request.php:810 msgid "Friend/Connection Request" msgstr "" -#: ../../mod/dfrn_request.php:803 +#: ../../mod/dfrn_request.php:811 msgid "" "Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, " "testuser@identi.ca" msgstr "" -#: ../../mod/dfrn_request.php:804 +#: ../../mod/dfrn_request.php:812 msgid "Please answer the following:" msgstr "" -#: ../../mod/dfrn_request.php:805 +#: ../../mod/dfrn_request.php:813 #, php-format msgid "Does %s know you?" msgstr "" -#: ../../mod/dfrn_request.php:808 +#: ../../mod/dfrn_request.php:816 msgid "Add a personal note:" msgstr "" -#: ../../mod/dfrn_request.php:810 ../../include/contact_selectors.php:76 +#: ../../mod/dfrn_request.php:818 ../../include/contact_selectors.php:76 msgid "Friendica" msgstr "" -#: ../../mod/dfrn_request.php:811 +#: ../../mod/dfrn_request.php:819 msgid "StatusNet/Federated Social Web" msgstr "" -#: ../../mod/dfrn_request.php:812 ../../mod/settings.php:636 +#: ../../mod/dfrn_request.php:820 ../../mod/settings.php:650 #: ../../include/contact_selectors.php:80 msgid "Diaspora" msgstr "" -#: ../../mod/dfrn_request.php:813 +#: ../../mod/dfrn_request.php:821 #, php-format msgid "" " - please do not use this form. Instead, enter %s into your Diaspora search " "bar." msgstr "" -#: ../../mod/dfrn_request.php:814 +#: ../../mod/dfrn_request.php:822 msgid "Your Identity Address:" msgstr "" -#: ../../mod/dfrn_request.php:817 +#: ../../mod/dfrn_request.php:825 msgid "Submit Request" msgstr "" @@ -1688,10 +1688,10 @@ msgstr "" #: ../../mod/lostpass.php:45 ../../mod/lostpass.php:107 #: ../../mod/register.php:388 ../../mod/register.php:442 -#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:742 -#: ../../addon/facebook/facebook.php:680 -#: ../../addon/facebook/facebook.php:1170 -#: ../../addon/testdrive/testdrive.php:58 ../../include/items.php:2726 +#: ../../mod/regmod.php:54 ../../mod/dfrn_confirm.php:752 +#: ../../addon/facebook/facebook.php:688 +#: ../../addon/facebook/facebook.php:1178 +#: ../../addon/testdrive/testdrive.php:58 ../../include/items.php:2738 #: ../../boot.php:696 msgid "Administrator" msgstr "" @@ -1784,7 +1784,7 @@ msgstr "" msgid "Missing some important data!" msgstr "" -#: ../../mod/settings.php:134 ../../mod/settings.php:565 +#: ../../mod/settings.php:134 ../../mod/settings.php:579 msgid "Update" msgstr "" @@ -1828,7 +1828,15 @@ msgstr "" msgid " Cannot change to that email." msgstr "" -#: ../../mod/settings.php:468 ../../addon/facebook/facebook.php:480 +#: ../../mod/settings.php:448 +msgid "Private forum has no privacy permissions. Using default privacy group." +msgstr "" + +#: ../../mod/settings.php:452 +msgid "Private forum has no privacy permissions and no default privacy group." +msgstr "" + +#: ../../mod/settings.php:482 ../../addon/facebook/facebook.php:488 #: ../../addon/impressum/impressum.php:77 #: ../../addon/openstreetmap/openstreetmap.php:80 #: ../../addon/mathjax/mathjax.php:66 ../../addon/piwik/piwik.php:105 @@ -1836,409 +1844,417 @@ msgstr "" msgid "Settings updated." msgstr "" -#: ../../mod/settings.php:538 ../../mod/settings.php:564 -#: ../../mod/settings.php:600 +#: ../../mod/settings.php:552 ../../mod/settings.php:578 +#: ../../mod/settings.php:614 msgid "Add application" msgstr "" -#: ../../mod/settings.php:542 ../../mod/settings.php:568 +#: ../../mod/settings.php:556 ../../mod/settings.php:582 #: ../../addon/statusnet/statusnet.php:555 msgid "Consumer Key" msgstr "" -#: ../../mod/settings.php:543 ../../mod/settings.php:569 +#: ../../mod/settings.php:557 ../../mod/settings.php:583 #: ../../addon/statusnet/statusnet.php:554 msgid "Consumer Secret" msgstr "" -#: ../../mod/settings.php:544 ../../mod/settings.php:570 +#: ../../mod/settings.php:558 ../../mod/settings.php:584 msgid "Redirect" msgstr "" -#: ../../mod/settings.php:545 ../../mod/settings.php:571 +#: ../../mod/settings.php:559 ../../mod/settings.php:585 msgid "Icon url" msgstr "" -#: ../../mod/settings.php:556 +#: ../../mod/settings.php:570 msgid "You can't edit this application." msgstr "" -#: ../../mod/settings.php:599 +#: ../../mod/settings.php:613 msgid "Connected Apps" msgstr "" -#: ../../mod/settings.php:603 +#: ../../mod/settings.php:617 msgid "Client key starts with" msgstr "" -#: ../../mod/settings.php:604 +#: ../../mod/settings.php:618 msgid "No name" msgstr "" -#: ../../mod/settings.php:605 +#: ../../mod/settings.php:619 msgid "Remove authorization" msgstr "" -#: ../../mod/settings.php:616 +#: ../../mod/settings.php:630 msgid "No Plugin settings configured" msgstr "" -#: ../../mod/settings.php:624 ../../addon/widgets/widgets.php:123 +#: ../../mod/settings.php:638 ../../addon/widgets/widgets.php:123 msgid "Plugin Settings" msgstr "" -#: ../../mod/settings.php:636 ../../mod/settings.php:637 +#: ../../mod/settings.php:650 ../../mod/settings.php:651 #, php-format msgid "Built-in support for %s connectivity is %s" msgstr "" -#: ../../mod/settings.php:636 ../../mod/settings.php:637 +#: ../../mod/settings.php:650 ../../mod/settings.php:651 msgid "enabled" msgstr "" -#: ../../mod/settings.php:636 ../../mod/settings.php:637 +#: ../../mod/settings.php:650 ../../mod/settings.php:651 msgid "disabled" msgstr "" -#: ../../mod/settings.php:637 +#: ../../mod/settings.php:651 msgid "StatusNet" msgstr "" -#: ../../mod/settings.php:667 +#: ../../mod/settings.php:681 msgid "Connector Settings" msgstr "" -#: ../../mod/settings.php:672 +#: ../../mod/settings.php:686 msgid "Email/Mailbox Setup" msgstr "" -#: ../../mod/settings.php:673 +#: ../../mod/settings.php:687 msgid "" "If you wish to communicate with email contacts using this service " "(optional), please specify how to connect to your mailbox." msgstr "" -#: ../../mod/settings.php:674 +#: ../../mod/settings.php:688 msgid "Last successful email check:" msgstr "" -#: ../../mod/settings.php:675 +#: ../../mod/settings.php:689 msgid "Email access is disabled on this site." msgstr "" -#: ../../mod/settings.php:676 +#: ../../mod/settings.php:690 msgid "IMAP server name:" msgstr "" -#: ../../mod/settings.php:677 +#: ../../mod/settings.php:691 msgid "IMAP port:" msgstr "" -#: ../../mod/settings.php:678 +#: ../../mod/settings.php:692 msgid "Security:" msgstr "" -#: ../../mod/settings.php:678 ../../mod/settings.php:683 +#: ../../mod/settings.php:692 ../../mod/settings.php:697 msgid "None" msgstr "" -#: ../../mod/settings.php:679 +#: ../../mod/settings.php:693 msgid "Email login name:" msgstr "" -#: ../../mod/settings.php:680 +#: ../../mod/settings.php:694 msgid "Email password:" msgstr "" -#: ../../mod/settings.php:681 +#: ../../mod/settings.php:695 msgid "Reply-to address:" msgstr "" -#: ../../mod/settings.php:682 +#: ../../mod/settings.php:696 msgid "Send public posts to all email contacts:" msgstr "" -#: ../../mod/settings.php:683 +#: ../../mod/settings.php:697 msgid "Action after import:" msgstr "" -#: ../../mod/settings.php:683 +#: ../../mod/settings.php:697 msgid "Mark as seen" msgstr "" -#: ../../mod/settings.php:683 +#: ../../mod/settings.php:697 msgid "Move to folder" msgstr "" -#: ../../mod/settings.php:684 +#: ../../mod/settings.php:698 msgid "Move to folder:" msgstr "" -#: ../../mod/settings.php:744 +#: ../../mod/settings.php:758 msgid "Display Settings" msgstr "" -#: ../../mod/settings.php:750 +#: ../../mod/settings.php:764 msgid "Display Theme:" msgstr "" -#: ../../mod/settings.php:751 +#: ../../mod/settings.php:765 msgid "Update browser every xx seconds" msgstr "" -#: ../../mod/settings.php:751 +#: ../../mod/settings.php:765 msgid "Minimum of 10 seconds, no maximum" msgstr "" -#: ../../mod/settings.php:752 +#: ../../mod/settings.php:766 msgid "Number of items to display on the network page:" msgstr "" -#: ../../mod/settings.php:752 +#: ../../mod/settings.php:766 msgid "Maximum of 100 items" msgstr "" -#: ../../mod/settings.php:753 +#: ../../mod/settings.php:767 msgid "Don't show emoticons" msgstr "" -#: ../../mod/settings.php:821 ../../mod/admin.php:180 ../../mod/admin.php:621 +#: ../../mod/settings.php:835 ../../mod/admin.php:180 ../../mod/admin.php:621 msgid "Normal Account" msgstr "" -#: ../../mod/settings.php:822 +#: ../../mod/settings.php:836 msgid "This account is a normal personal profile" msgstr "" -#: ../../mod/settings.php:825 ../../mod/admin.php:181 ../../mod/admin.php:622 +#: ../../mod/settings.php:839 ../../mod/admin.php:181 ../../mod/admin.php:622 msgid "Soapbox Account" msgstr "" -#: ../../mod/settings.php:826 +#: ../../mod/settings.php:840 msgid "Automatically approve all connection/friend requests as read-only fans" msgstr "" -#: ../../mod/settings.php:829 ../../mod/admin.php:182 ../../mod/admin.php:623 +#: ../../mod/settings.php:843 ../../mod/admin.php:182 ../../mod/admin.php:623 msgid "Community/Celebrity Account" msgstr "" -#: ../../mod/settings.php:830 +#: ../../mod/settings.php:844 msgid "Automatically approve all connection/friend requests as read-write fans" msgstr "" -#: ../../mod/settings.php:833 ../../mod/admin.php:183 ../../mod/admin.php:624 +#: ../../mod/settings.php:847 ../../mod/admin.php:183 ../../mod/admin.php:624 msgid "Automatic Friend Account" msgstr "" -#: ../../mod/settings.php:834 +#: ../../mod/settings.php:848 msgid "Automatically approve all connection/friend requests as friends" msgstr "" -#: ../../mod/settings.php:844 +#: ../../mod/settings.php:851 +msgid "Private Forum" +msgstr "" + +#: ../../mod/settings.php:852 +msgid "Private forum - approved members only [Experimental]" +msgstr "" + +#: ../../mod/settings.php:865 msgid "OpenID:" msgstr "" -#: ../../mod/settings.php:844 +#: ../../mod/settings.php:865 msgid "(Optional) Allow this OpenID to login to this account." msgstr "" -#: ../../mod/settings.php:854 +#: ../../mod/settings.php:875 msgid "Publish your default profile in your local site directory?" msgstr "" -#: ../../mod/settings.php:860 +#: ../../mod/settings.php:881 msgid "Publish your default profile in the global social directory?" msgstr "" -#: ../../mod/settings.php:868 +#: ../../mod/settings.php:889 msgid "Hide your contact/friend list from viewers of your default profile?" msgstr "" -#: ../../mod/settings.php:872 +#: ../../mod/settings.php:893 msgid "Hide your profile details from unknown viewers?" msgstr "" -#: ../../mod/settings.php:877 +#: ../../mod/settings.php:898 msgid "Allow friends to post to your profile page?" msgstr "" -#: ../../mod/settings.php:883 +#: ../../mod/settings.php:904 msgid "Allow friends to tag your posts?" msgstr "" -#: ../../mod/settings.php:889 +#: ../../mod/settings.php:910 msgid "Allow us to suggest you as a potential friend to new members?" msgstr "" -#: ../../mod/settings.php:895 +#: ../../mod/settings.php:916 msgid "Permit unknown people to send you private mail?" msgstr "" -#: ../../mod/settings.php:906 +#: ../../mod/settings.php:927 msgid "Profile is not published." msgstr "" -#: ../../mod/settings.php:912 ../../mod/profile_photo.php:211 +#: ../../mod/settings.php:933 ../../mod/profile_photo.php:211 msgid "or" msgstr "" -#: ../../mod/settings.php:917 +#: ../../mod/settings.php:938 msgid "Your Identity Address is" msgstr "" -#: ../../mod/settings.php:928 +#: ../../mod/settings.php:949 msgid "Automatically expire posts after this many days:" msgstr "" -#: ../../mod/settings.php:928 +#: ../../mod/settings.php:949 msgid "If empty, posts will not expire. Expired posts will be deleted" msgstr "" -#: ../../mod/settings.php:929 +#: ../../mod/settings.php:950 msgid "Advanced expiration settings" msgstr "" -#: ../../mod/settings.php:930 +#: ../../mod/settings.php:951 msgid "Advanced Expiration" msgstr "" -#: ../../mod/settings.php:931 +#: ../../mod/settings.php:952 msgid "Expire posts:" msgstr "" -#: ../../mod/settings.php:932 +#: ../../mod/settings.php:953 msgid "Expire personal notes:" msgstr "" -#: ../../mod/settings.php:933 +#: ../../mod/settings.php:954 msgid "Expire starred posts:" msgstr "" -#: ../../mod/settings.php:934 +#: ../../mod/settings.php:955 msgid "Expire photos:" msgstr "" -#: ../../mod/settings.php:938 +#: ../../mod/settings.php:962 msgid "Account Settings" msgstr "" -#: ../../mod/settings.php:947 +#: ../../mod/settings.php:970 msgid "Password Settings" msgstr "" -#: ../../mod/settings.php:948 +#: ../../mod/settings.php:971 msgid "New Password:" msgstr "" -#: ../../mod/settings.php:949 +#: ../../mod/settings.php:972 msgid "Confirm:" msgstr "" -#: ../../mod/settings.php:949 +#: ../../mod/settings.php:972 msgid "Leave password fields blank unless changing" msgstr "" -#: ../../mod/settings.php:953 +#: ../../mod/settings.php:976 msgid "Basic Settings" msgstr "" -#: ../../mod/settings.php:954 ../../include/profile_advanced.php:15 +#: ../../mod/settings.php:977 ../../include/profile_advanced.php:15 msgid "Full Name:" msgstr "" -#: ../../mod/settings.php:955 +#: ../../mod/settings.php:978 msgid "Email Address:" msgstr "" -#: ../../mod/settings.php:956 +#: ../../mod/settings.php:979 msgid "Your Timezone:" msgstr "" -#: ../../mod/settings.php:957 +#: ../../mod/settings.php:980 msgid "Default Post Location:" msgstr "" -#: ../../mod/settings.php:958 +#: ../../mod/settings.php:981 msgid "Use Browser Location:" msgstr "" -#: ../../mod/settings.php:961 +#: ../../mod/settings.php:984 msgid "Security and Privacy Settings" msgstr "" -#: ../../mod/settings.php:963 +#: ../../mod/settings.php:986 msgid "Maximum Friend Requests/Day:" msgstr "" -#: ../../mod/settings.php:963 ../../mod/settings.php:978 +#: ../../mod/settings.php:986 ../../mod/settings.php:1005 msgid "(to prevent spam abuse)" msgstr "" -#: ../../mod/settings.php:964 +#: ../../mod/settings.php:987 msgid "Default Post Permissions" msgstr "" -#: ../../mod/settings.php:965 +#: ../../mod/settings.php:988 msgid "(click to open/close)" msgstr "" -#: ../../mod/settings.php:978 +#: ../../mod/settings.php:1005 msgid "Maximum private messages per day from unknown people:" msgstr "" -#: ../../mod/settings.php:981 +#: ../../mod/settings.php:1008 msgid "Notification Settings" msgstr "" -#: ../../mod/settings.php:982 +#: ../../mod/settings.php:1009 msgid "By default post a status message when:" msgstr "" -#: ../../mod/settings.php:983 +#: ../../mod/settings.php:1010 msgid "accepting a friend request" msgstr "" -#: ../../mod/settings.php:984 +#: ../../mod/settings.php:1011 msgid "joining a forum/community" msgstr "" -#: ../../mod/settings.php:985 +#: ../../mod/settings.php:1012 msgid "making an interesting profile change" msgstr "" -#: ../../mod/settings.php:986 +#: ../../mod/settings.php:1013 msgid "Send a notification email when:" msgstr "" -#: ../../mod/settings.php:987 +#: ../../mod/settings.php:1014 msgid "You receive an introduction" msgstr "" -#: ../../mod/settings.php:988 +#: ../../mod/settings.php:1015 msgid "Your introductions are confirmed" msgstr "" -#: ../../mod/settings.php:989 +#: ../../mod/settings.php:1016 msgid "Someone writes on your profile wall" msgstr "" -#: ../../mod/settings.php:990 +#: ../../mod/settings.php:1017 msgid "Someone writes a followup comment" msgstr "" -#: ../../mod/settings.php:991 +#: ../../mod/settings.php:1018 msgid "You receive a private message" msgstr "" -#: ../../mod/settings.php:992 +#: ../../mod/settings.php:1019 msgid "You receive a friend suggestion" msgstr "" -#: ../../mod/settings.php:993 +#: ../../mod/settings.php:1020 msgid "You are tagged in a post" msgstr "" -#: ../../mod/settings.php:996 +#: ../../mod/settings.php:1023 msgid "Advanced Page Settings" msgstr "" @@ -2268,7 +2284,7 @@ msgstr "" msgid "Saved Searches" msgstr "" -#: ../../mod/network.php:92 ../../include/group.php:217 +#: ../../mod/network.php:92 ../../include/group.php:244 msgid "add" msgstr "" @@ -2357,7 +2373,7 @@ msgid "Personal Notes" msgstr "" #: ../../mod/notes.php:63 ../../mod/filer.php:30 -#: ../../addon/facebook/facebook.php:748 +#: ../../addon/facebook/facebook.php:756 #: ../../addon/privacy_image_cache/privacy_image_cache.php:147 #: ../../include/text.php:652 msgid "Save" @@ -2784,19 +2800,19 @@ msgid "People Search" msgstr "" #: ../../mod/like.php:127 ../../mod/tagger.php:70 -#: ../../addon/facebook/facebook.php:1564 +#: ../../addon/facebook/facebook.php:1572 #: ../../addon/communityhome/communityhome.php:158 #: ../../addon/communityhome/communityhome.php:167 #: ../../view/theme/diabook/theme.php:560 -#: ../../view/theme/diabook/theme.php:569 ../../include/diaspora.php:1654 +#: ../../view/theme/diabook/theme.php:569 ../../include/diaspora.php:1662 #: ../../include/conversation.php:48 ../../include/conversation.php:57 #: ../../include/conversation.php:121 ../../include/conversation.php:130 msgid "status" msgstr "" -#: ../../mod/like.php:144 ../../addon/facebook/facebook.php:1568 +#: ../../mod/like.php:144 ../../addon/facebook/facebook.php:1576 #: ../../addon/communityhome/communityhome.php:172 -#: ../../view/theme/diabook/theme.php:574 ../../include/diaspora.php:1670 +#: ../../view/theme/diabook/theme.php:574 ../../include/diaspora.php:1678 #: ../../include/conversation.php:65 #, php-format msgid "%1$s likes %2$s's %3$s" @@ -2809,7 +2825,7 @@ msgstr "" #: ../../mod/notice.php:15 ../../mod/viewsrc.php:15 ../../mod/admin.php:156 #: ../../mod/admin.php:684 ../../mod/admin.php:883 ../../mod/display.php:37 -#: ../../mod/display.php:142 ../../include/items.php:3084 +#: ../../mod/display.php:142 ../../include/items.php:3096 msgid "Item not found." msgstr "" @@ -3719,11 +3735,11 @@ msgid "" "notifications from you." msgstr "" -#: ../../mod/follow.php:160 +#: ../../mod/follow.php:161 msgid "Unable to retrieve contact information." msgstr "" -#: ../../mod/follow.php:206 +#: ../../mod/follow.php:216 msgid "following" msgstr "" @@ -4233,129 +4249,129 @@ msgstr "" msgid "%1$s is now friends with %2$s" msgstr "" -#: ../../mod/dfrn_confirm.php:554 +#: ../../mod/dfrn_confirm.php:564 #, php-format msgid "No user record found for '%s' " msgstr "" -#: ../../mod/dfrn_confirm.php:564 +#: ../../mod/dfrn_confirm.php:574 msgid "Our site encryption key is apparently messed up." msgstr "" -#: ../../mod/dfrn_confirm.php:575 +#: ../../mod/dfrn_confirm.php:585 msgid "Empty site URL was provided or URL could not be decrypted by us." msgstr "" -#: ../../mod/dfrn_confirm.php:596 +#: ../../mod/dfrn_confirm.php:606 msgid "Contact record was not found for you on our site." msgstr "" -#: ../../mod/dfrn_confirm.php:610 +#: ../../mod/dfrn_confirm.php:620 #, php-format msgid "Site public key not available in contact record for URL %s." msgstr "" -#: ../../mod/dfrn_confirm.php:630 +#: ../../mod/dfrn_confirm.php:640 msgid "" "The ID provided by your system is a duplicate on our system. It should work " "if you try again." msgstr "" -#: ../../mod/dfrn_confirm.php:641 +#: ../../mod/dfrn_confirm.php:651 msgid "Unable to set your contact credentials on our system." msgstr "" -#: ../../mod/dfrn_confirm.php:706 +#: ../../mod/dfrn_confirm.php:716 msgid "Unable to update your contact profile details on our system" msgstr "" -#: ../../mod/dfrn_confirm.php:740 +#: ../../mod/dfrn_confirm.php:750 #, php-format msgid "Connection accepted at %s" msgstr "" -#: ../../mod/dfrn_confirm.php:789 +#: ../../mod/dfrn_confirm.php:799 #, php-format msgid "%1$s has joined %2$s" msgstr "" -#: ../../addon/facebook/facebook.php:501 +#: ../../addon/facebook/facebook.php:509 msgid "Facebook disabled" msgstr "" -#: ../../addon/facebook/facebook.php:506 +#: ../../addon/facebook/facebook.php:514 msgid "Updating contacts" msgstr "" -#: ../../addon/facebook/facebook.php:529 +#: ../../addon/facebook/facebook.php:537 msgid "Facebook API key is missing." msgstr "" -#: ../../addon/facebook/facebook.php:536 +#: ../../addon/facebook/facebook.php:544 msgid "Facebook Connect" msgstr "" -#: ../../addon/facebook/facebook.php:542 +#: ../../addon/facebook/facebook.php:550 msgid "Install Facebook connector for this account." msgstr "" -#: ../../addon/facebook/facebook.php:549 +#: ../../addon/facebook/facebook.php:557 msgid "Remove Facebook connector" msgstr "" -#: ../../addon/facebook/facebook.php:554 +#: ../../addon/facebook/facebook.php:562 msgid "" "Re-authenticate [This is necessary whenever your Facebook password is " "changed.]" msgstr "" -#: ../../addon/facebook/facebook.php:561 +#: ../../addon/facebook/facebook.php:569 msgid "Post to Facebook by default" msgstr "" -#: ../../addon/facebook/facebook.php:567 +#: ../../addon/facebook/facebook.php:575 msgid "" "Facebook friend linking has been disabled on this site. The following " "settings will have no effect." msgstr "" -#: ../../addon/facebook/facebook.php:571 +#: ../../addon/facebook/facebook.php:579 msgid "" "Facebook friend linking has been disabled on this site. If you disable it, " "you will be unable to re-enable it." msgstr "" -#: ../../addon/facebook/facebook.php:574 +#: ../../addon/facebook/facebook.php:582 msgid "Link all your Facebook friends and conversations on this website" msgstr "" -#: ../../addon/facebook/facebook.php:576 +#: ../../addon/facebook/facebook.php:584 msgid "" "Facebook conversations consist of your profile wall and your friend " "stream." msgstr "" -#: ../../addon/facebook/facebook.php:577 +#: ../../addon/facebook/facebook.php:585 msgid "On this website, your Facebook friend stream is only visible to you." msgstr "" -#: ../../addon/facebook/facebook.php:578 +#: ../../addon/facebook/facebook.php:586 msgid "" "The following settings determine the privacy of your Facebook profile wall " "on this website." msgstr "" -#: ../../addon/facebook/facebook.php:582 +#: ../../addon/facebook/facebook.php:590 msgid "" "On this website your Facebook profile wall conversations will only be " "visible to you" msgstr "" -#: ../../addon/facebook/facebook.php:587 +#: ../../addon/facebook/facebook.php:595 msgid "Do not import your Facebook profile wall conversations" msgstr "" -#: ../../addon/facebook/facebook.php:589 +#: ../../addon/facebook/facebook.php:597 msgid "" "If you choose to link conversations and leave both of these boxes unchecked, " "your Facebook profile wall will be merged with your profile wall on this " @@ -4363,120 +4379,120 @@ msgid "" "who may see the conversations." msgstr "" -#: ../../addon/facebook/facebook.php:594 +#: ../../addon/facebook/facebook.php:602 msgid "Comma separated applications to ignore" msgstr "" -#: ../../addon/facebook/facebook.php:678 +#: ../../addon/facebook/facebook.php:686 msgid "Problems with Facebook Real-Time Updates" msgstr "" -#: ../../addon/facebook/facebook.php:706 +#: ../../addon/facebook/facebook.php:714 #: ../../include/contact_selectors.php:81 msgid "Facebook" msgstr "" -#: ../../addon/facebook/facebook.php:707 +#: ../../addon/facebook/facebook.php:715 msgid "Facebook Connector Settings" msgstr "" -#: ../../addon/facebook/facebook.php:722 +#: ../../addon/facebook/facebook.php:730 msgid "Facebook API Key" msgstr "" -#: ../../addon/facebook/facebook.php:732 +#: ../../addon/facebook/facebook.php:740 msgid "" "Error: it appears that you have specified the App-ID and -Secret in your ." "htconfig.php file. As long as they are specified there, they cannot be set " "using this form.

" msgstr "" -#: ../../addon/facebook/facebook.php:737 +#: ../../addon/facebook/facebook.php:745 msgid "" "Error: the given API Key seems to be incorrect (the application access token " "could not be retrieved)." msgstr "" -#: ../../addon/facebook/facebook.php:739 +#: ../../addon/facebook/facebook.php:747 msgid "The given API Key seems to work correctly." msgstr "" -#: ../../addon/facebook/facebook.php:741 +#: ../../addon/facebook/facebook.php:749 msgid "" "The correctness of the API Key could not be detected. Somthing strange's " "going on." msgstr "" -#: ../../addon/facebook/facebook.php:744 +#: ../../addon/facebook/facebook.php:752 msgid "App-ID / API-Key" msgstr "" -#: ../../addon/facebook/facebook.php:745 +#: ../../addon/facebook/facebook.php:753 msgid "Application secret" msgstr "" -#: ../../addon/facebook/facebook.php:746 +#: ../../addon/facebook/facebook.php:754 #, php-format msgid "Polling Interval in minutes (minimum %1$s minutes)" msgstr "" -#: ../../addon/facebook/facebook.php:747 +#: ../../addon/facebook/facebook.php:755 msgid "" "Synchronize comments (no comments on Facebook are missed, at the cost of " "increased system load)" msgstr "" -#: ../../addon/facebook/facebook.php:751 +#: ../../addon/facebook/facebook.php:759 msgid "Real-Time Updates" msgstr "" -#: ../../addon/facebook/facebook.php:755 +#: ../../addon/facebook/facebook.php:763 msgid "Real-Time Updates are activated." msgstr "" -#: ../../addon/facebook/facebook.php:756 +#: ../../addon/facebook/facebook.php:764 msgid "Deactivate Real-Time Updates" msgstr "" -#: ../../addon/facebook/facebook.php:758 +#: ../../addon/facebook/facebook.php:766 msgid "Real-Time Updates not activated." msgstr "" -#: ../../addon/facebook/facebook.php:758 +#: ../../addon/facebook/facebook.php:766 msgid "Activate Real-Time Updates" msgstr "" -#: ../../addon/facebook/facebook.php:777 +#: ../../addon/facebook/facebook.php:785 msgid "The new values have been saved." msgstr "" -#: ../../addon/facebook/facebook.php:801 +#: ../../addon/facebook/facebook.php:809 msgid "Post to Facebook" msgstr "" -#: ../../addon/facebook/facebook.php:899 +#: ../../addon/facebook/facebook.php:907 msgid "" "Post to Facebook cancelled because of multi-network access permission " "conflict." msgstr "" -#: ../../addon/facebook/facebook.php:1119 +#: ../../addon/facebook/facebook.php:1127 msgid "View on Friendica" msgstr "" -#: ../../addon/facebook/facebook.php:1152 +#: ../../addon/facebook/facebook.php:1160 msgid "Facebook post failed. Queued for retry." msgstr "" -#: ../../addon/facebook/facebook.php:1192 +#: ../../addon/facebook/facebook.php:1200 msgid "Your Facebook connection became invalid. Please Re-authenticate." msgstr "" -#: ../../addon/facebook/facebook.php:1193 +#: ../../addon/facebook/facebook.php:1201 msgid "Facebook connection became invalid" msgstr "" -#: ../../addon/facebook/facebook.php:1194 +#: ../../addon/facebook/facebook.php:1202 #, php-format msgid "" "Hi %1$s,\n" @@ -5809,7 +5825,7 @@ msgid "j F" msgstr "" #: ../../include/profile_advanced.php:30 ../../include/datetime.php:448 -#: ../../include/items.php:1413 +#: ../../include/items.php:1419 msgid "Birthday:" msgstr "" @@ -6349,15 +6365,15 @@ msgstr "" msgid "Item filed" msgstr "" -#: ../../include/diaspora.php:582 +#: ../../include/diaspora.php:590 msgid "Sharing notification from Diaspora network" msgstr "" -#: ../../include/diaspora.php:1969 +#: ../../include/diaspora.php:1977 msgid "Attachments:" msgstr "" -#: ../../include/diaspora.php:2152 +#: ../../include/diaspora.php:2160 #, php-format msgid "[Relayed] Comment authored by %s from network %s" msgstr "" @@ -6381,27 +6397,31 @@ msgid "" "not what you intended, please create another group with a different name." msgstr "" -#: ../../include/group.php:168 +#: ../../include/group.php:176 +msgid "Default privacy group for new contacts" +msgstr "" + +#: ../../include/group.php:195 msgid "Everybody" msgstr "" -#: ../../include/group.php:191 +#: ../../include/group.php:218 msgid "edit" msgstr "" -#: ../../include/group.php:212 +#: ../../include/group.php:239 msgid "Groups" msgstr "" -#: ../../include/group.php:213 +#: ../../include/group.php:240 msgid "Edit group" msgstr "" -#: ../../include/group.php:214 +#: ../../include/group.php:241 msgid "Create a new group" msgstr "" -#: ../../include/group.php:215 +#: ../../include/group.php:242 msgid "Contacts not in any group" msgstr "" @@ -6876,11 +6896,11 @@ msgstr "" msgid "Please visit %s to approve or reject the suggestion." msgstr "" -#: ../../include/items.php:2724 +#: ../../include/items.php:2736 msgid "A new person is sharing with you at " msgstr "" -#: ../../include/items.php:2724 +#: ../../include/items.php:2736 msgid "You have a new follower at " msgstr "" diff --git a/view/group_selection.tpl b/view/group_selection.tpl new file mode 100644 index 000000000..3809cb994 --- /dev/null +++ b/view/group_selection.tpl @@ -0,0 +1,8 @@ +
+ + +
diff --git a/view/pagetypes.tpl b/view/pagetypes.tpl index d9f873ea0..924fc47ac 100644 --- a/view/pagetypes.tpl +++ b/view/pagetypes.tpl @@ -2,3 +2,6 @@ {{inc field_radio.tpl with $field=$page_soapbox }}{{endinc}} {{inc field_radio.tpl with $field=$page_community }}{{endinc}} {{inc field_radio.tpl with $field=$page_freelove }}{{endinc}} + {{ if $experimental }} + {{inc field_radio.tpl with $field=$page_prvgroup }}{{endinc}} + {{ endif }} \ No newline at end of file diff --git a/view/settings.tpl b/view/settings.tpl index cec3c6f64..556cd3ba3 100644 --- a/view/settings.tpl +++ b/view/settings.tpl @@ -56,9 +56,12 @@ $suggestme $unkmail + {{inc field_input.tpl with $field=$cntunkmail }}{{endinc}} {{inc field_input.tpl with $field=$expire.days }}{{endinc}} + +
$expire.label
@@ -90,6 +93,8 @@ $unkmail
+$group_select +
diff --git a/view/theme/dispy/dark/style.css b/view/theme/dispy/dark/style.css index 60e7db6e1..3bb30be83 100644 --- a/view/theme/dispy/dark/style.css +++ b/view/theme/dispy/dark/style.css @@ -55,9 +55,9 @@ h6{font-size:xx-small;} .action{margin:5px 0;} .tool{margin:5px 0;list-style:none;} #articlemain{width:100%;height:100%;margin:0 auto;} -.button,#profile-listing-desc{width:25%;height:auto;background:#555753;color:#eeeecc;border:2px outset #222321;-o-border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;padding:5px;font-size:smaller;cursor:pointer;}.button.active,#profile-listing-desc.active{-moz-box-shadow:4px 4px 7px 0px #111111;-o-box-shadow:4px 4px 7px 0px #111111;-webkit-box-shadow:4px 4px 7px 0px #111111;-ms-box-shadow:4px 4px 7px 0px #111111;box-shadow:4px 4px 7px 0px #111111;} -.button a,#profile-listing-desc a{color:#eeeecc;font-size:smaller;font-weight:bold;} -[class$="-desc"],[id$="-desc"]{color:#2e2f2e;border:1px outset #eeeecc;-o-border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;margin:3px 10px 7px 0;padding:5px;font-weight:bold;font-size:smaller;} +.button,#profile-listing-desc{color:#eeeecc;padding:5px;cursor:pointer;}.button.active,#profile-listing-desc.active{-moz-box-shadow:4px 4px 7px 0px #111111;-o-box-shadow:4px 4px 7px 0px #111111;-webkit-box-shadow:4px 4px 7px 0px #111111;-ms-box-shadow:4px 4px 7px 0px #111111;box-shadow:4px 4px 7px 0px #111111;} +.button a,#profile-listing-desc a{color:#eeeecc;font-weight:bold;} +[class$="-desc"],[id$="-desc"]{color:#eeeecc;background:#2e2f2e;border:1px outset #eeeecc;-o-border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;margin:3px 10px 7px 0;padding:5px;font-weight:bold;font-size:smaller;} #item-delete-selected-desc{float:left;margin-right:5px;}#item-delete-selected-desc:hover{text-decoration:underline;} .intro-approve-as-friend-desc{margin-top:10px;} .intro-desc{margin-bottom:20px;font-weight:bold;} @@ -395,7 +395,7 @@ div[id$="wrapper"]{height:100%;margin-bottom:1em;}div[id$="wrapper"] br{clear:le #sidebar-group-ul{padding-left:0;} #sidebar-group-list{margin:0 0 5px 0;}#sidebar-group-list li{margin-top:10px;} #sidebar-group-list .icon{display:inline-block;width:12px;height:12px;} -.sidebar-group-element{padding:3px;}.sidebar-group-element:hover{color:#2e2f2e;background:#2e3436;border:1px solid #638ec4;padding:3px;} +.sidebar-group-element{padding:3px;}.sidebar-group-element:hover{color:#eeeecc;background:#2e3436;border:1px solid #638ec4;padding:3px;} #sidebar-new-group{margin:auto;display:inline-block;color:#eeeeee;text-decoration:none;text-align:center;} #peoplefind-sidebar form{margin-bottom:10px;} #sidebar-new-group:hover{} diff --git a/view/theme/dispy/dark/style.less b/view/theme/dispy/dark/style.less index 7634db1d7..4967ac9c2 100644 --- a/view/theme/dispy/dark/style.less +++ b/view/theme/dispy/dark/style.less @@ -282,27 +282,27 @@ h6 { } .button, #profile-listing-desc { - .box(25%, auto); - background: @menu_bg_colour; + // .box(25%, auto); + // background: @menu_bg_colour; color: @main_colour; - .borders(2px, outset, darken(@menu_bg_colour, 20%)); - .rounded_corners; + // .borders(2px, outset, darken(@menu_bg_colour, 20%)); + // .rounded_corners; padding: 5px; - font-size: smaller; + // font-size: smaller; cursor: pointer; &.active { .box_shadow(4px, 4px, 7px); } a { color: @main_colour; - font-size: smaller; + // font-size: smaller; font-weight: bold; } } [class$="-desc"], [id$="-desc"] { - color: @bg_colour; - // background: @main_colour; + color: @main_colour; + background: @bg_colour; .borders(1px, outset, @main_colour); .rounded_corners; // .box_shadow(3px, 3px, 5px); @@ -568,6 +568,9 @@ div.jGrowl div { padding-left: 58px; margin-top: 50px; } + // &.jGrowl-message { + + // } } #nav-notifications-menu { margin: 30px 0 0 -20px; @@ -2349,7 +2352,7 @@ div { .sidebar-group-element { padding: 3px; &:hover { - color: @bg_colour; + color: @main_colour; background: @shiny_colour; .borders(1px, solid, @hover_colour); padding: 3px; diff --git a/view/theme/dispy/light/style.css b/view/theme/dispy/light/style.css index e89ee7d24..1099f0913 100644 --- a/view/theme/dispy/light/style.css +++ b/view/theme/dispy/light/style.css @@ -55,9 +55,9 @@ h6{font-size:xx-small;} .action{margin:5px 0;} .tool{margin:5px 0;list-style:none;} #articlemain{width:100%;height:100%;margin:0 auto;} -.button,#profile-listing-desc{width:25%;height:auto;background:#555753;color:#eeeeec;border:2px outset #222321;-o-border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;padding:5px;font-size:smaller;cursor:pointer;}.button.active,#profile-listing-desc.active{-moz-box-shadow:4px 4px 7px 0px #111111;-o-box-shadow:4px 4px 7px 0px #111111;-webkit-box-shadow:4px 4px 7px 0px #111111;-ms-box-shadow:4px 4px 7px 0px #111111;box-shadow:4px 4px 7px 0px #111111;} -.button a,#profile-listing-desc a{color:#eeeeec;font-size:smaller;font-weight:bold;} -[class$="-desc"],[id$="-desc"]{color:#eeeeec;border:1px outset #eeeeec;-o-border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;margin:3px 10px 7px 0;padding:5px;font-weight:bold;font-size:smaller;} +.button,#profile-listing-desc{color:#111111;padding:5px;cursor:pointer;}.button.active,#profile-listing-desc.active{-moz-box-shadow:4px 4px 7px 0px #111111;-o-box-shadow:4px 4px 7px 0px #111111;-webkit-box-shadow:4px 4px 7px 0px #111111;-ms-box-shadow:4px 4px 7px 0px #111111;box-shadow:4px 4px 7px 0px #111111;} +.button a,#profile-listing-desc a{color:#eeeeec;font-weight:bold;} +[class$="-desc"],[id$="-desc"]{color:#eeeeec;background:#111111;border:1px outset #eeeeec;-o-border-radius:5px;-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;border-radius:5px;margin:3px 10px 7px 0;padding:5px;font-weight:bold;font-size:smaller;} #item-delete-selected-desc{float:left;margin-right:5px;}#item-delete-selected-desc:hover{text-decoration:underline;} .intro-approve-as-friend-desc{margin-top:10px;} .intro-desc{margin-bottom:20px;font-weight:bold;} diff --git a/view/theme/dispy/light/style.less b/view/theme/dispy/light/style.less index 51ffbd1f2..4e1b85031 100644 --- a/view/theme/dispy/light/style.less +++ b/view/theme/dispy/light/style.less @@ -283,27 +283,27 @@ h6 { } .button, #profile-listing-desc { - .box(25%, auto); - background: @menu_bg_colour; - color: @bg_colour; - .borders(2px, outset, darken(@menu_bg_colour, 20%)); - .rounded_corners; + // .box(25%, auto); + // background: @menu_bg_colour; + color: @main_colour; + // .borders(2px, outset, darken(@menu_bg_colour, 20%)); + // .rounded_corners; padding: 5px; - font-size: smaller; + // font-size: smaller; cursor: pointer; &.active { .box_shadow(4px, 4px, 7px); } a { color: @bg_colour; - font-size: smaller; + // font-size: smaller; font-weight: bold; } } [class$="-desc"], [id$="-desc"] { color: @bg_colour; - // background: @main_colour; + background: @main_colour; .borders(1px, outset, @bg_colour); .rounded_corners; // .box_shadow(3px, 3px, 5px); diff --git a/view/theme/duepuntozero/style.css b/view/theme/duepuntozero/style.css index b978c13e5..826acc7ef 100644 --- a/view/theme/duepuntozero/style.css +++ b/view/theme/duepuntozero/style.css @@ -1091,6 +1091,11 @@ input#dfrn-url { overflow: auto; } +.wall-item-content img { + max-width: 700px; +} + + .wall-item-title { float: left; font-weight: bold;