Merge https://github.com/friendica/friendica into pull
This commit is contained in:
commit
9f4b897261
2
boot.php
2
boot.php
|
@ -11,7 +11,7 @@ require_once('include/cache.php');
|
|||
define ( 'FRIENDICA_PLATFORM', 'Friendica');
|
||||
define ( 'FRIENDICA_VERSION', '3.0.1363' );
|
||||
define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
|
||||
define ( 'DB_UPDATE_VERSION', 1147 );
|
||||
define ( 'DB_UPDATE_VERSION', 1148 );
|
||||
|
||||
define ( 'EOL', "<br />\r\n" );
|
||||
define ( 'ATOM_TIME', 'Y-m-d\TH:i:s\Z' );
|
||||
|
|
|
@ -944,12 +944,14 @@ CREATE TABLE IF NOT EXISTS `session` (
|
|||
|
||||
CREATE TABLE IF NOT EXISTS `sign` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`iid` int(10) unsigned NOT NULL,
|
||||
`iid` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`retract_iid` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`signed_text` mediumtext NOT NULL,
|
||||
`signature` text NOT NULL,
|
||||
`signer` char(255) NOT NULL,
|
||||
PRIMARY KEY (`id`),
|
||||
KEY `iid` (`iid`)
|
||||
KEY `iid` (`iid`),
|
||||
KEY `retract_iid` (`retract_iid`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
|
||||
|
||||
-- --------------------------------------------------------
|
||||
|
|
|
@ -113,6 +113,7 @@ function delivery_run($argv, $argc){
|
|||
$uid = $r[0]['uid'];
|
||||
$updated = $r[0]['edited'];
|
||||
|
||||
// The following seems superfluous. We've already checked for "if (! intval($r[0]['parent']))" a few lines up
|
||||
if(! $parent_id)
|
||||
continue;
|
||||
|
||||
|
@ -508,17 +509,17 @@ function delivery_run($argv, $argc){
|
|||
// unsupported
|
||||
break;
|
||||
}
|
||||
elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) {
|
||||
logger('delivery: diaspora retract: ' . $loc);
|
||||
// diaspora delete,
|
||||
elseif(($target_item['deleted']) && ($target_item['uri'] === $target_item['parent-uri'])) {
|
||||
// top-level retraction
|
||||
logger('delivery: diaspora retract: ' . $loc);
|
||||
|
||||
diaspora_send_retraction($target_item,$owner,$contact,$public_message);
|
||||
break;
|
||||
}
|
||||
elseif($target_item['parent'] != $target_item['id']) {
|
||||
elseif($target_item['uri'] !== $target_item['parent-uri']) {
|
||||
// we are the relay - send comments, likes and relayable_retractions to our conversants
|
||||
logger('delivery: diaspora relay: ' . $loc);
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
193
include/diaspora.php
Normal file → Executable file
193
include/diaspora.php
Normal file → Executable file
|
@ -83,6 +83,9 @@ function diaspora_dispatch($importer,$msg) {
|
|||
elseif($xmlbase->signed_retraction) {
|
||||
$ret = diaspora_signed_retraction($importer,$xmlbase->signed_retraction,$msg);
|
||||
}
|
||||
elseif($xmlbase->relayable_retraction) {
|
||||
$ret = diaspora_signed_retraction($importer,$xmlbase->relayable_retraction,$msg);
|
||||
}
|
||||
elseif($xmlbase->photo) {
|
||||
$ret = diaspora_photo($importer,$xmlbase->photo,$msg);
|
||||
}
|
||||
|
@ -677,7 +680,7 @@ function diaspora_post($importer,$xml) {
|
|||
return;
|
||||
}
|
||||
|
||||
// allocate a guid on our system - we aren't fixing any collisions.
|
||||
// allocate a guid on our system - we aren't fixing any collisions.
|
||||
// we're ignoring them
|
||||
|
||||
$g = q("select * from guid where guid = '%s' limit 1",
|
||||
|
@ -844,7 +847,7 @@ function diaspora_reshare($importer,$xml) {
|
|||
$prefix = '♲ ' . $details . "\n";
|
||||
|
||||
|
||||
// allocate a guid on our system - we aren't fixing any collisions.
|
||||
// allocate a guid on our system - we aren't fixing any collisions.
|
||||
// we're ignoring them
|
||||
|
||||
$g = q("select * from guid where guid = '%s' limit 1",
|
||||
|
@ -948,7 +951,7 @@ function diaspora_asphoto($importer,$xml) {
|
|||
return;
|
||||
}
|
||||
|
||||
// allocate a guid on our system - we aren't fixing any collisions.
|
||||
// allocate a guid on our system - we aren't fixing any collisions.
|
||||
// we're ignoring them
|
||||
|
||||
$g = q("select * from guid where guid = '%s' limit 1",
|
||||
|
@ -1602,22 +1605,28 @@ function diaspora_like($importer,$xml,$msg) {
|
|||
logger('diaspora_like: duplicate like: ' . $guid);
|
||||
return;
|
||||
}
|
||||
// Note: I don't think "Like" objects with positive = "false" are ever actually used
|
||||
// It looks like "RelayableRetractions" are used for "unlike" instead
|
||||
if($positive === 'false') {
|
||||
q("UPDATE `item` SET `deleted` = 1 WHERE `id` = %d AND `uid` = %d LIMIT 1",
|
||||
logger('diaspora_like: received a like with positive set to "false"...ignoring');
|
||||
/* q("UPDATE `item` SET `deleted` = 1 WHERE `id` = %d AND `uid` = %d LIMIT 1",
|
||||
intval($r[0]['id']),
|
||||
intval($importer['uid'])
|
||||
);
|
||||
);*/
|
||||
// FIXME
|
||||
// send notification via proc_run()
|
||||
return;
|
||||
}
|
||||
}
|
||||
// Note: I don't think "Like" objects with positive = "false" are ever actually used
|
||||
// It looks like "RelayableRetractions" are used for "unlike" instead
|
||||
if($positive === 'false') {
|
||||
logger('diaspora_like: unlike received with no corresponding like');
|
||||
logger('diaspora_like: received a like with positive set to "false"');
|
||||
logger('diaspora_like: unlike received with no corresponding like...ignoring');
|
||||
return;
|
||||
}
|
||||
|
||||
$author_signed_data = $guid . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $diaspora_handle;
|
||||
$signed_data = $guid . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $diaspora_handle;
|
||||
|
||||
$author_signature = base64_decode($author_signature);
|
||||
|
||||
|
@ -1635,20 +1644,20 @@ function diaspora_like($importer,$xml,$msg) {
|
|||
}
|
||||
}
|
||||
|
||||
if(! rsa_verify($author_signed_data,$author_signature,$key,'sha256')) {
|
||||
if(! rsa_verify($signed_data,$author_signature,$key,'sha256')) {
|
||||
logger('diaspora_like: verification failed.');
|
||||
return;
|
||||
}
|
||||
|
||||
if($parent_author_signature) {
|
||||
|
||||
$owner_signed_data = $guid . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $diaspora_handle;
|
||||
//$owner_signed_data = $guid . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $diaspora_handle;
|
||||
|
||||
$parent_author_signature = base64_decode($parent_author_signature);
|
||||
|
||||
$key = $msg['key'];
|
||||
|
||||
if(! rsa_verify($owner_signed_data,$parent_author_signature,$key,'sha256')) {
|
||||
if(! rsa_verify($signed_data,$parent_author_signature,$key,'sha256')) {
|
||||
logger('diaspora_like: owner verification failed.');
|
||||
return;
|
||||
}
|
||||
|
@ -1783,38 +1792,89 @@ function diaspora_signed_retraction($importer,$xml,$msg) {
|
|||
$type = notags(unxmlify($xml->target_type));
|
||||
$sig = notags(unxmlify($xml->target_author_signature));
|
||||
|
||||
$parent_author_signature = (($xml->parent_author_signature) ? notags(unxmlify($xml->parent_author_signature)) : '');
|
||||
|
||||
$contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle);
|
||||
if(! $contact) {
|
||||
logger('diaspora_signed_retraction: no contact');
|
||||
return;
|
||||
}
|
||||
|
||||
// this may not yet work for comments. Need to see how the relaying works
|
||||
// and figure out who signs it.
|
||||
|
||||
|
||||
$signed_data = $guid . ';' . $type ;
|
||||
|
||||
$sig = base64_decode($sig);
|
||||
$sig_decode = base64_decode($sig);
|
||||
|
||||
$key = $msg['key'];
|
||||
if(strcasecmp($diaspora_handle,$msg['author']) == 0) {
|
||||
$person = $contact;
|
||||
$key = $msg['key'];
|
||||
}
|
||||
else {
|
||||
$person = find_diaspora_person_by_handle($diaspora_handle);
|
||||
|
||||
if(! rsa_verify($signed_data,$sig,$key,'sha256')) {
|
||||
logger('diaspora_signed_retraction: owner verification failed.' . print_r($msg,true));
|
||||
if(is_array($person) && x($person,'pubkey'))
|
||||
$key = $person['pubkey'];
|
||||
else {
|
||||
logger('diaspora_signed_retraction: unable to find author details');
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(! rsa_verify($signed_data,$sig_decode,$key,'sha256')) {
|
||||
logger('diaspora_signed_retraction: retraction-owner verification failed.' . print_r($msg,true));
|
||||
return;
|
||||
}
|
||||
|
||||
if($type === 'StatusMessage') {
|
||||
if($parent_author_signature) {
|
||||
$parent_author_signature = base64_decode($parent_author_signature);
|
||||
|
||||
$key = $msg['key'];
|
||||
|
||||
if(! rsa_verify($signed_data,$parent_author_signature,$key,'sha256')) {
|
||||
logger('diaspora_signed_retraction: failed to verify person relaying the retraction (e.g. owner of a post relaying a retracted comment');
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if($type === 'StatusMessage' || $type === 'Comment' || $type === 'Like') {
|
||||
$r = q("select * from item where guid = '%s' and uid = %d and not file like '%%[%%' limit 1",
|
||||
dbesc($guid),
|
||||
intval($importer['uid'])
|
||||
);
|
||||
if(count($r)) {
|
||||
if(link_compare($r[0]['author-link'],$contact['url'])) {
|
||||
q("update item set `deleted` = 1, `changed` = '%s' where `id` = %d limit 1",
|
||||
q("update item set `deleted` = 1, `edited` = '%s', `changed` = '%s', `body` = '' , `title` = '' where `id` = %d limit 1",
|
||||
dbesc(datetime_convert()),
|
||||
dbesc(datetime_convert()),
|
||||
intval($r[0]['id'])
|
||||
);
|
||||
|
||||
// Now check if the retraction needs to be relayed by us
|
||||
//
|
||||
// The first item in the `item` table with the parent id is the parent. However, MySQL doesn't always
|
||||
// return the items ordered by `item`.`id`, in which case the wrong item is chosen as the parent.
|
||||
// The only item with `parent` and `id` as the parent id is the parent item.
|
||||
$p = q("select origin from item where parent = %d and id = %d limit 1",
|
||||
$r[0]['parent'],
|
||||
$r[0]['parent']
|
||||
);
|
||||
if(count($p)) {
|
||||
if(($p[0]['origin']) && (! $parent_author_signature)) {
|
||||
q("insert into sign (`retract_iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
|
||||
$r[0]['id'],
|
||||
dbesc($signed_data),
|
||||
dbesc($sig),
|
||||
dbesc($diaspora_handle)
|
||||
);
|
||||
|
||||
// the existence of parent_author_signature would have meant the parent_author or owner
|
||||
// is already relaying.
|
||||
logger('diaspora_signed_retraction: relaying relayable_retraction');
|
||||
|
||||
proc_run('php','include/notifier.php','relayable_retraction',$r[0]['id']);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2071,7 +2131,11 @@ function diaspora_send_followup($item,$owner,$contact,$public_batch = false) {
|
|||
$tpl = get_markup_template('diaspora_like.tpl');
|
||||
$like = true;
|
||||
$target_type = 'Post';
|
||||
$positive = (($item['deleted']) ? 'false' : 'true');
|
||||
// $positive = (($item['deleted']) ? 'false' : 'true');
|
||||
$positive = 'true';
|
||||
|
||||
if(($item['deleted']))
|
||||
logger('diaspora_send_followup: received deleted "like". Those should go to diaspora_send_retraction');
|
||||
}
|
||||
else {
|
||||
$tpl = get_markup_template('diaspora_comment.tpl');
|
||||
|
@ -2111,7 +2175,7 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
|
|||
|
||||
|
||||
$a = get_app();
|
||||
$myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
|
||||
$myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
|
||||
$theiraddr = $contact['addr'];
|
||||
|
||||
|
||||
|
@ -2127,29 +2191,35 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
|
|||
else
|
||||
return;
|
||||
|
||||
if($item['verb'] === ACTIVITY_LIKE) {
|
||||
$like = false;
|
||||
$relay_retract = false;
|
||||
$sql_sign_id = 'iid';
|
||||
if( $item['deleted']) {
|
||||
$tpl = get_markup_template('diaspora_relayable_retraction.tpl');
|
||||
$relay_retract = true;
|
||||
$sql_sign_id = 'retract_iid';
|
||||
$target_type = ( ($item['verb'] === ACTIVITY_LIKE) ? 'Like' : 'Comment');
|
||||
}
|
||||
elseif($item['verb'] === ACTIVITY_LIKE) {
|
||||
$tpl = get_markup_template('diaspora_like_relay.tpl');
|
||||
$like = true;
|
||||
$target_type = 'Post';
|
||||
$positive = (($item['deleted']) ? 'false' : 'true');
|
||||
// $positive = (($item['deleted']) ? 'false' : 'true');
|
||||
$positive = 'true';
|
||||
}
|
||||
else {
|
||||
$tpl = get_markup_template('diaspora_comment_relay.tpl');
|
||||
$like = false;
|
||||
}
|
||||
|
||||
$body = $item['body'];
|
||||
|
||||
$text = html_entity_decode(bb2diaspora($body));
|
||||
|
||||
// fetch the original signature if somebody sent the post to us to relay
|
||||
// If we are relaying for a reply originating on our own account, there wasn't a 'send to relay'
|
||||
// action. It wasn't needed. In that case create the original signature and the
|
||||
// owner (parent author) signature
|
||||
// comments from other networks will be relayed under our name, with a brief
|
||||
// preamble to describe what's happening and noting the real author
|
||||
|
||||
$r = q("select * from sign where iid = %d limit 1",
|
||||
// fetch the original signature if the relayable was created by a Diaspora
|
||||
// or DFRN user. Relayables for other networks are not supported.
|
||||
|
||||
$r = q("select * from sign where " . $sql_sign_id . " = %d limit 1",
|
||||
intval($item['id'])
|
||||
);
|
||||
if(count($r)) {
|
||||
|
@ -2160,6 +2230,12 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
|
|||
}
|
||||
else {
|
||||
|
||||
// Author signature information (for likes, comments, and retractions of likes or comments,
|
||||
// whether from Diaspora or Friendica) must be placed in the `sign` table before this
|
||||
// function is called
|
||||
logger('diaspora_send_relay: original author signature not found, cannot send relayable');
|
||||
return;
|
||||
/*
|
||||
$itemcontact = q("select * from contact where `id` = %d limit 1",
|
||||
intval($item['contact-id'])
|
||||
);
|
||||
|
@ -2168,29 +2244,40 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
|
|||
$prefix = sprintf( t('[Relayed] Comment authored by %s from network %s'),
|
||||
'['. $item['author-name'] . ']' . '(' . $item['author-link'] . ')',
|
||||
network_to_name($itemcontact['network'])) . "\n";
|
||||
// "$body" was assigned to "$text" above. It isn't used after that, so I don't think
|
||||
// the following change will do anything
|
||||
$body = $prefix . $body;
|
||||
|
||||
// I think this comment will fail upon reaching Diaspora, because "$signed_text" is not defined
|
||||
}
|
||||
}
|
||||
else {
|
||||
// I'm confused about this "else." Since it sets "$handle = $myaddr," it seems like it should be for the case
|
||||
// where the top-level post owner commented on his own post, i.e. "$itemcontact[0]['self']" is true. But it's
|
||||
// positioned to be for the case where "count($itemcontact)" is 0.
|
||||
|
||||
$handle = $myaddr;
|
||||
|
||||
if($like)
|
||||
$signed_text = $item['guid'] . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $myaddr;
|
||||
$signed_text = $item['guid'] . ';' . $target_type . ';' . $parent_guid . ';' . $positive . ';' . $handle;
|
||||
elseif($relay_retract)
|
||||
$signed_text = $item['guid'] . ';' . $target_type;
|
||||
else
|
||||
$signed_text = $item['guid'] . ';' . $parent_guid . ';' . $text . ';' . $myaddr;
|
||||
$signed_text = $item['guid'] . ';' . $parent_guid . ';' . $text . ';' . $handle;
|
||||
|
||||
$authorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256'));
|
||||
|
||||
q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
|
||||
q("insert into sign (`" . $sql_sign_id . "`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
|
||||
intval($item['id']),
|
||||
dbesc($signed_text),
|
||||
dbesc(base64_encode($authorsig)),
|
||||
dbesc($myaddr)
|
||||
dbesc($authorsig),
|
||||
dbesc($handle)
|
||||
);
|
||||
$handle = $myaddr;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
// sign it
|
||||
// sign it with the top-level owner's signature
|
||||
|
||||
$parentauthorsig = base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256'));
|
||||
|
||||
|
@ -2198,14 +2285,15 @@ function diaspora_send_relay($item,$owner,$contact,$public_batch = false) {
|
|||
'$guid' => xmlify($item['guid']),
|
||||
'$parent_guid' => xmlify($parent_guid),
|
||||
'$target_type' =>xmlify($target_type),
|
||||
'$authorsig' => xmlify($orig_sign['signature']),
|
||||
'$authorsig' => xmlify($authorsig),
|
||||
'$parentsig' => xmlify($parentauthorsig),
|
||||
'$body' => xmlify($text),
|
||||
'$positive' => xmlify($positive),
|
||||
'$handle' => xmlify($handle)
|
||||
));
|
||||
|
||||
logger('diaspora_relay_comment: base message: ' . $msg, LOGGER_DATA);
|
||||
logger('diaspora_send_relay: base message: ' . $msg, LOGGER_DATA);
|
||||
|
||||
|
||||
$slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)));
|
||||
|
||||
|
@ -2220,14 +2308,25 @@ function diaspora_send_retraction($item,$owner,$contact,$public_batch = false) {
|
|||
$a = get_app();
|
||||
$myaddr = $owner['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
|
||||
|
||||
$signed_text = $item['guid'] . ';' . 'StatusMessage';
|
||||
// Check whether the retraction is for a top-level post or whether it's a relayable
|
||||
if( $item['uri'] !== $item['parent-uri'] ) {
|
||||
|
||||
$tpl = get_markup_template('diaspora_relay_retraction.tpl');
|
||||
$target_type = (($item['verb'] === ACTIVITY_LIKE) ? 'Like' : 'Comment');
|
||||
}
|
||||
else {
|
||||
|
||||
$tpl = get_markup_template('diaspora_signed_retract.tpl');
|
||||
$target_type = 'StatusMessage';
|
||||
}
|
||||
|
||||
$signed_text = $item['guid'] . ';' . $target_type;
|
||||
|
||||
$tpl = get_markup_template('diaspora_signed_retract.tpl');
|
||||
$msg = replace_macros($tpl, array(
|
||||
'$guid' => $item['guid'],
|
||||
'$type' => 'StatusMessage',
|
||||
'$handle' => $myaddr,
|
||||
'$signature' => base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256'))
|
||||
'$guid' => xmlify($item['guid']),
|
||||
'$type' => xmlify($target_type),
|
||||
'$handle' => xmlify($myaddr),
|
||||
'$signature' => xmlify(base64_encode(rsa_sign($signed_text,$owner['uprvkey'],'sha256')))
|
||||
));
|
||||
|
||||
$slap = 'xml=' . urlencode(urlencode(diaspora_msg_build($msg,$owner,$contact,$owner['uprvkey'],$contact['pubkey'],$public_batch)));
|
||||
|
@ -2351,3 +2450,5 @@ function diaspora_transmit($owner,$contact,$slap,$public_batch) {
|
|||
|
||||
return(($return_code) ? $return_code : (-1));
|
||||
}
|
||||
|
||||
|
||||
|
|
37
include/items.php
Normal file → Executable file
37
include/items.php
Normal file → Executable file
|
@ -3278,7 +3278,42 @@ function drop_item($id,$interactive = true) {
|
|||
q("UPDATE `item` SET `last-child` = 1 WHERE `id` = %d LIMIT 1",
|
||||
intval($r[0]['id'])
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Add a relayable_retraction signature for Diaspora. Note that we can't add a target_author_signature
|
||||
// if the comment was deleted by a remote user. That should be ok, because if a remote user is deleting
|
||||
// the comment, that means we're the home of the post, and Diaspora will only
|
||||
// check the parent_author_signature of retractions that it doesn't have to relay further
|
||||
//
|
||||
// I don't think this function gets called for an "unlike," but I'll check anyway
|
||||
$signed_text = $item['guid'] . ';' . ( ($item['verb'] === ACTIVITY_LIKE) ? 'Like' : 'Comment');
|
||||
|
||||
if(local_user() == $item['uid']) {
|
||||
|
||||
$handle = $a->user['nickname'] . '@' . substr($a->get_baseurl(), strpos($a->get_baseurl(),'://') + 3);
|
||||
$authorsig = base64_encode(rsa_sign($signed_text,$a->user['prvkey'],'sha256'));
|
||||
}
|
||||
else {
|
||||
$r = q("SELECT `nick`, `url` FROM `contact` WHERE `id` = '%d' LIMIT 1",
|
||||
$item['contact-id']
|
||||
);
|
||||
if(count($r)) {
|
||||
// The below handle only works for NETWORK_DFRN. I think that's ok, because this function
|
||||
// only handles DFRN deletes
|
||||
$handle_baseurl_start = strpos($r['url'],'://') + 3;
|
||||
$handle_baseurl_length = strpos($r['url'],'/profile') - $handle_baseurl_start;
|
||||
$handle = $r['nick'] . '@' . substr($r['url'], $handle_baseurl_start, $handle_baseurl_length);
|
||||
$authorsig = '';
|
||||
}
|
||||
}
|
||||
|
||||
if(isset($handle))
|
||||
q("insert into sign (`retract_iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
|
||||
intval($item['id']),
|
||||
dbesc($signed_text),
|
||||
dbesc($authorsig),
|
||||
dbesc($handle)
|
||||
);
|
||||
}
|
||||
$drop_id = intval($item['id']);
|
||||
|
||||
|
|
|
@ -125,6 +125,7 @@ function notifier_run($argv, $argc){
|
|||
$uid = $r[0]['uid'];
|
||||
$updated = $r[0]['edited'];
|
||||
|
||||
// The following seems superfluous. We've already checked for "if (! intval($r[0]['parent']))" a few lines up
|
||||
if(! $parent_id)
|
||||
return;
|
||||
|
||||
|
@ -596,7 +597,7 @@ function notifier_run($argv, $argc){
|
|||
break;
|
||||
case NETWORK_OSTATUS:
|
||||
|
||||
// Do not send to otatus if we are not configured to send to public networks
|
||||
// Do not send to ostatus 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'))
|
||||
|
@ -737,18 +738,19 @@ function notifier_run($argv, $argc){
|
|||
// unsupported
|
||||
break;
|
||||
}
|
||||
elseif(($target_item['deleted']) && ($target_item['verb'] !== ACTIVITY_LIKE)) {
|
||||
// diaspora delete,
|
||||
elseif(($target_item['deleted']) && (($target_item['uri'] === $target_item['parent-uri']) || $followup)) {
|
||||
// send both top-level retractions and relayable retractions for owner to relay
|
||||
diaspora_send_retraction($target_item,$owner,$contact);
|
||||
break;
|
||||
}
|
||||
elseif($followup) {
|
||||
// send comments, likes and retractions of likes to owner to relay
|
||||
// send comments and likes to owner to relay
|
||||
diaspora_send_followup($target_item,$owner,$contact);
|
||||
break;
|
||||
}
|
||||
elseif($target_item['parent'] != $target_item['id']) {
|
||||
// we are the relay - send comments, likes and unlikes to our conversants
|
||||
elseif($target_item['uri'] !== $target_item['parent-uri']) {
|
||||
// we are the relay - send comments, likes and relayable_retractions
|
||||
// (of comments and likes) to our conversants
|
||||
diaspora_send_relay($target_item,$owner,$contact);
|
||||
break;
|
||||
}
|
||||
|
@ -858,6 +860,13 @@ function notifier_run($argv, $argc){
|
|||
|
||||
}
|
||||
|
||||
// If the item was deleted, clean up the `sign` table
|
||||
if($target_item['deleted']) {
|
||||
$r = q("DELETE FROM sign where `retract_iid` = %d",
|
||||
intval($target_item['id'])
|
||||
);
|
||||
}
|
||||
|
||||
logger('notifier: calling hooks', LOGGER_DEBUG);
|
||||
|
||||
if($normal_mode)
|
||||
|
|
10
mod/item.php
10
mod/item.php
|
@ -737,16 +737,16 @@ function item_post(&$a) {
|
|||
if($datarray['verb'] === ACTIVITY_LIKE)
|
||||
$signed_text = $datarray['guid'] . ';' . 'Post' . ';' . $parent_item['guid'] . ';' . 'true' . ';' . $myaddr;
|
||||
else
|
||||
$signed_text = $datarray['guid'] . ';' . $parent_item['guid'] . ';' . $signed_body . ';' . $myaddr;
|
||||
$signed_text = $datarray['guid'] . ';' . $parent_item['guid'] . ';' . $signed_body . ';' . $myaddr;
|
||||
|
||||
$authorsig = base64_encode(rsa_sign($signed_text,$a->user['prvkey'],'sha256'));
|
||||
|
||||
q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
|
||||
intval($post_id),
|
||||
dbesc($signed_text),
|
||||
dbesc(base64_encode($authorsig)),
|
||||
dbesc($myaddr)
|
||||
);
|
||||
dbesc($signed_text),
|
||||
dbesc(base64_encode($authorsig)),
|
||||
dbesc($myaddr)
|
||||
);
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
|
125
mod/like.php
Normal file → Executable file
125
mod/like.php
Normal file → Executable file
|
@ -104,7 +104,8 @@ function like_content(&$a) {
|
|||
return;
|
||||
}
|
||||
|
||||
$r = q("SELECT `id` FROM `item` WHERE `verb` = '%s' AND `deleted` = 0
|
||||
|
||||
$r = q("SELECT * FROM `item` WHERE `verb` = '%s' AND `deleted` = 0
|
||||
AND `contact-id` = %d AND ( `parent` = '%s' OR `parent-uri` = '%s') LIMIT 1",
|
||||
dbesc($activity),
|
||||
intval($contact['id']),
|
||||
|
@ -112,13 +113,70 @@ function like_content(&$a) {
|
|||
dbesc($item_id)
|
||||
);
|
||||
if(count($r)) {
|
||||
$like_item = $r[0];
|
||||
|
||||
// Already voted, undo it
|
||||
$r = q("UPDATE `item` SET `deleted` = 1, `changed` = '%s' WHERE `id` = %d LIMIT 1",
|
||||
dbesc(datetime_convert()),
|
||||
intval($r[0]['id'])
|
||||
intval($like_item['id'])
|
||||
);
|
||||
|
||||
proc_run('php',"include/notifier.php","like","$post_id");
|
||||
// Clean up the `sign` table
|
||||
$r = q("DELETE FROM `sign` WHERE `iid` = %d",
|
||||
intval($like_item['id'])
|
||||
);
|
||||
|
||||
// Save the author information for the unlike in case we need to relay to Diaspora
|
||||
// Note that we can only create a signature for a user of the local server. We don't have
|
||||
// a key for remote users. That is ok, because if a remote user is "unlike"ing a post, it
|
||||
// means we are the relay, and for relayable_retractions, Diaspora
|
||||
// only checks the parent_author_signature if it doesn't have to relay further
|
||||
//
|
||||
// If $item['resource-id'] exists, it means the item is a photo. Diaspora doesn't support
|
||||
// likes on photos, so don't bother.
|
||||
|
||||
if(($activity === ACTIVITY_LIKE) && (! $item['resource-id'])) {
|
||||
$signed_text = $like_item['guid'] . ';' . 'Like';
|
||||
|
||||
if( $contact['network'] === NETWORK_DIASPORA)
|
||||
$diaspora_handle = $contact['addr'];
|
||||
else { // Only works for NETWORK_DFRN
|
||||
$contact_baseurl_start = strpos($contact['url'],'://') + 3;
|
||||
$contact_baseurl_length = strpos($contact['url'],'/profile') - $contact_baseurl_start;
|
||||
$contact_baseurl = substr($contact['url'], $contact_baseurl_start, $contact_baseurl_length);
|
||||
$diaspora_handle = $contact['nick'] . '@' . $contact_baseurl;
|
||||
|
||||
// Get contact's private key if he's a user of the local Friendica server
|
||||
$r = q("SELECT `contact`.`uid` FROM `contact` WHERE `url` = '%s' AND `self` = 1 LIMIT 1",
|
||||
dbesc($contact['url'])
|
||||
);
|
||||
|
||||
if( $r) {
|
||||
$contact_uid = $r['uid'];
|
||||
$r = q("SELECT prvkey FROM user WHERE uid = %d LIMIT 1",
|
||||
intval($contact_uid)
|
||||
);
|
||||
|
||||
if( $r)
|
||||
$authorsig = base64_encode(rsa_sign($signed_text,$r['prvkey'],'sha256'));
|
||||
}
|
||||
}
|
||||
|
||||
if(! isset($authorsig))
|
||||
$authorsig = '';
|
||||
|
||||
q("insert into sign (`retract_iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
|
||||
intval($like_item['id']),
|
||||
dbesc($signed_text),
|
||||
dbesc($authorsig),
|
||||
dbesc($diaspora_handle)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// proc_run('php',"include/notifier.php","like","$post_id"); // $post_id isn't defined here!
|
||||
$like_item_id = $like_item['id'];
|
||||
proc_run('php',"include/notifier.php","like","$like_item_id");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -191,6 +249,65 @@ EOT;
|
|||
);
|
||||
}
|
||||
|
||||
|
||||
// Save the author information for the like in case we need to relay to Diaspora
|
||||
// Note that we can only create a signature for a user of the local server. We don't have
|
||||
// a key for remote users. That is ok, because if a remote user is "unlike"ing a post, it
|
||||
// means we are the relay, and for relayable_retractions, Diaspora
|
||||
// only checks the parent_author_signature if it doesn't have to relay further
|
||||
|
||||
if(($activity === ACTIVITY_LIKE) && ($post_type === t('status'))) {
|
||||
if( $contact['network'] === NETWORK_DIASPORA)
|
||||
$diaspora_handle = $contact['addr'];
|
||||
else { // Only works for NETWORK_DFRN
|
||||
$contact_baseurl_start = strpos($contact['url'],'://') + 3;
|
||||
$contact_baseurl_length = strpos($contact['url'],'/profile') - $contact_baseurl_start;
|
||||
$contact_baseurl = substr($contact['url'], $contact_baseurl_start, $contact_baseurl_length);
|
||||
$diaspora_handle = $contact['nick'] . '@' . $contact_baseurl;
|
||||
|
||||
// Get contact's private key if he's a user of the local Friendica server
|
||||
$r = q("SELECT `contact`.`uid` FROM `contact` WHERE `url` = '%s' AND `self` = 1 LIMIT 1",
|
||||
dbesc($contact['url'])
|
||||
);
|
||||
|
||||
if( $r) {
|
||||
$contact_uid = $r['uid'];
|
||||
$r = q("SELECT prvkey FROM user WHERE uid = %d LIMIT 1",
|
||||
intval($contact_uid)
|
||||
);
|
||||
|
||||
if( $r)
|
||||
$contact_uprvkey = $r['prvkey'];
|
||||
}
|
||||
}
|
||||
|
||||
$r = q("SELECT guid, parent FROM `item` WHERE id = %d LIMIT 1",
|
||||
intval($post_id)
|
||||
);
|
||||
if( $r) {
|
||||
$p = q("SELECT guid FROM `item` WHERE id = %d AND parent = %d LIMIT 1",
|
||||
intval($r[0]['parent']),
|
||||
intval($r[0]['parent'])
|
||||
);
|
||||
if( $p) {
|
||||
$signed_text = $r[0]['guid'] . ';Post;' . $p[0]['guid'] . ';true;' . $diaspora_handle;
|
||||
|
||||
if(isset($contact_uprvkey))
|
||||
$authorsig = base64_encode(rsa_sign($signed_text,$contact_uprvkey,'sha256'));
|
||||
else
|
||||
$authorsig = '';
|
||||
|
||||
q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
|
||||
intval($post_id),
|
||||
dbesc($signed_text),
|
||||
dbesc($authorsig),
|
||||
dbesc($diaspora_handle)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$arr['id'] = $post_id;
|
||||
|
||||
call_hooks('post_local_end', $arr);
|
||||
|
@ -199,4 +316,4 @@ EOT;
|
|||
|
||||
killme();
|
||||
// return; // NOTREACHED
|
||||
}
|
||||
}
|
||||
|
|
|
@ -211,7 +211,8 @@ function message_content(&$a) {
|
|||
'$parent' => '',
|
||||
'$upload' => t('Upload photo'),
|
||||
'$insert' => t('Insert web link'),
|
||||
'$wait' => t('Please wait')
|
||||
'$wait' => t('Please wait'),
|
||||
'$submit' => t('Submit')
|
||||
));
|
||||
|
||||
return $o;
|
||||
|
|
14
update.php
14
update.php
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
|
||||
define( 'UPDATE_VERSION' , 1147 );
|
||||
define( 'UPDATE_VERSION' , 1148 );
|
||||
|
||||
/**
|
||||
*
|
||||
|
@ -1137,8 +1137,8 @@ INDEX ( `username` )
|
|||
}
|
||||
|
||||
function update_1133() {
|
||||
q("ALTER TABLE `user` ADD `unkmail` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `blocktags` , ADD INDEX ( `unkmail` ) ");
|
||||
q("ALTER TABLE `user` ADD `cntunkmail` INT NOT NULL DEFAULT '10' AFTER `unkmail` , ADD INDEX ( `cntunkmail` ) ");
|
||||
q("ALTER TABLE `user` ADD `unkmail` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `blocktags` , ADD INDEX ( `unkmail` ) ");
|
||||
q("ALTER TABLE `user` ADD `cntunkmail` INT NOT NULL DEFAULT '10' AFTER `unkmail` , ADD INDEX ( `cntunkmail` ) ");
|
||||
q("ALTER TABLE `mail` ADD `unknown` TINYINT( 1 ) NOT NULL DEFAULT '0' AFTER `replied` , ADD INDEX ( `unknown` ) ");
|
||||
}
|
||||
|
||||
|
@ -1274,4 +1274,12 @@ function update_1146() {
|
|||
return UPDATE_SUCCESS ;
|
||||
}
|
||||
|
||||
function update_1147() {
|
||||
$r1 = q("ALTER TABLE `sign` ALTER `iid` SET DEFAULT '0'");
|
||||
$r2 = q("ALTER TABLE `sign` ADD `retract_iid` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `iid`");
|
||||
$r3 = q("ALTER TABLE `sign` ADD INDEX ( `retract_iid` )");
|
||||
if((! $r1) || (! $r2) || (! $r3))
|
||||
return UPDATE_FAILED ;
|
||||
return UPDATE_SUCCESS ;
|
||||
}
|
||||
|
||||
|
|
1655
view/de/messages.po
1655
view/de/messages.po
File diff suppressed because it is too large
Load diff
|
@ -98,6 +98,7 @@ $a->strings["Private Message"] = "Private Nachricht";
|
|||
$a->strings["View Full Size"] = "Betrachte Originalgröße";
|
||||
$a->strings["Tags: "] = "Tags: ";
|
||||
$a->strings["[Remove any tag]"] = "[Tag entfernen]";
|
||||
$a->strings["Rotate CW"] = "Im Uhrzeigersinn rotieren";
|
||||
$a->strings["New album name"] = "Name des neuen Albums";
|
||||
$a->strings["Caption"] = "Bildunterschrift";
|
||||
$a->strings["Add a Tag"] = "Tag hinzufügen";
|
||||
|
@ -166,6 +167,7 @@ $a->strings["Failed to update contact record."] = "Aktualisierung der Kontaktdat
|
|||
$a->strings["Your introduction has been sent."] = "Deine Kontaktanfrage wurde gesendet.";
|
||||
$a->strings["Please login to confirm introduction."] = "Bitte melde dich an, um die Kontaktanfrage zu bestätigen.";
|
||||
$a->strings["Incorrect identity currently logged in. Please login to <strong>this</strong> profile."] = "Momentan bist du mit einer anderen Identität angemeldet. Bitte melde Dich mit <strong>diesem</strong> Profil an.";
|
||||
$a->strings["Hide this contact"] = "Verberge diese Kontakt";
|
||||
$a->strings["Welcome home %s."] = "Willkommen zurück %s.";
|
||||
$a->strings["Please confirm your introduction/connection request to %s."] = "Bitte bestätige deine Kontaktanfrage bei %s.";
|
||||
$a->strings["Confirm"] = "Bestätigen";
|
||||
|
@ -185,18 +187,14 @@ $a->strings[" - please do not use this form. Instead, enter %s into your Diaspo
|
|||
$a->strings["Your Identity Address:"] = "Adresse deines Profils:";
|
||||
$a->strings["Submit Request"] = "Anfrage abschicken";
|
||||
$a->strings["Friendica Social Communications Server - Setup"] = "Friendica-Server für soziale Netzwerke – Setup";
|
||||
$a->strings["Database connection"] = "Datenbankverbindung";
|
||||
$a->strings["Could not connect to database."] = "Verbindung zur Datenbank gescheitert";
|
||||
$a->strings["Could not create table."] = "Konnte Tabelle nicht erstellen.";
|
||||
$a->strings["Your Friendica site database has been installed."] = "Die Datenbank deiner Friendica Seite wurde installiert.";
|
||||
$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "WICHTIG: Du musst [manuell] einen Cronjob (o.ä.) für den Poller einrichten.";
|
||||
$a->strings["Please see the file \"INSTALL.txt\"."] = "Lies bitte die \"INSTALL.txt\".";
|
||||
$a->strings["Proceed to registration"] = "Mit der Registrierung fortfahren";
|
||||
$a->strings["Proceed with Installation"] = "Mit der Installation fortfahren";
|
||||
$a->strings["You may need to import the file \"database.sql\" manually using phpmyadmin or mysql."] = "Möglicherweise musst du die Datei \"database.sql\" manuell mit phpmyadmin oder mysql importieren.";
|
||||
$a->strings["Database import failed."] = "Import der Datenbank schlug fehl.";
|
||||
$a->strings["Please see the file \"INSTALL.txt\"."] = "Lies bitte die \"INSTALL.txt\".";
|
||||
$a->strings["System check"] = "Systemtest";
|
||||
$a->strings["Check again"] = "Noch einmal testen";
|
||||
$a->strings["Database connection"] = "Datenbankverbindung";
|
||||
$a->strings["In order to install Friendica we need to know how to connect to your database."] = "Um Friendica installieren zu können, müssen wir wissen, wie wir zu deiner Datenbank Kontakt aufnehmen können.";
|
||||
$a->strings["Please contact your hosting provider or site administrator if you have questions about these settings."] = "Bitte kontaktiere den Hosting Provider oder den Administrator der Seite, falls du Fragen zu diesen Einstellungen haben solltest.";
|
||||
$a->strings["The database you specify below should already exist. If it does not, please create it before continuing."] = "Die Datenbank, die du unten angibst, sollte bereits existieren. Ist dies noch nicht der Fall, erzeuge sie bitte bevor du mit der Installation fortfährst.";
|
||||
|
@ -209,8 +207,9 @@ $a->strings["Your account email address must match this in order to use the web
|
|||
$a->strings["Please select a default timezone for your website"] = "Bitte wähle die Standardzeitzone deiner Webseite";
|
||||
$a->strings["Site settings"] = "Server-Einstellungen";
|
||||
$a->strings["Could not find a command line version of PHP in the web server PATH."] = "Konnte keine Kommandozeilenversion von PHP im PATH des Servers finden.";
|
||||
$a->strings["If you don't have a command line version of PHP installed on server, you will not be able to run background polling via cron. See <a href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>"] = "Wenn du keine Kommandozeilen Version von PHP auf deinem Server installiert hast, kannst du keine Hintergrundprozesse via cron starten. Siehe <a href='http://friendica.com/node/27'>'Activating scheduled tasks'</a>";
|
||||
$a->strings["PHP executable path"] = "Pfad zu PHP";
|
||||
$a->strings["Enter full path to php executable"] = "Kompletter Pfad zum PHP-Executable";
|
||||
$a->strings["Enter full path to php executable. You can leave this blank to continue the installation."] = "Gib den kompletten Pfad zur ausführbaren Datei von PHP an. Du kannst diesen Feld auch frei lassen und mit der Installation fortfahren.";
|
||||
$a->strings["Command line PHP"] = "Kommandozeilen-PHP";
|
||||
$a->strings["The command line version of PHP on your system does not have \"register_argc_argv\" enabled."] = "Die Kommandozeilenversion von PHP auf deinem System hat \"register_argc_argv\" nicht aktiviert.";
|
||||
$a->strings["This is required for message delivery to work."] = "Dies wird für die Auslieferung von Nachrichten benötigt.";
|
||||
|
@ -232,11 +231,15 @@ $a->strings["Error: mysqli PHP module required but not installed."] = "Fehler: D
|
|||
$a->strings["Error: mb_string PHP module required but not installed."] = "Fehler: mb_string PHP Module wird benötigt ist aber nicht installiert.";
|
||||
$a->strings["The web installer needs to be able to create a file called \".htconfig.php\ in the top folder of your web server and it is unable to do so."] = "Der Installationswizard muss in der Lage sein, eine Datei im Stammverzeichnis deines Webservers anzulegen, ist allerdings derzeit nicht in der Lage, dies zu tun.";
|
||||
$a->strings["This is most often a permission setting, as the web server may not be able to write files in your folder - even if you can."] = "In den meisten Fällen ist dies ein Problem mit den Schreibrechten, der Webserver könnte keine Schreiberlaubnis haben, selbst wenn du sie hast.";
|
||||
$a->strings["Please check with your site documentation or support people to see if this situation can be corrected."] = "Bitte überprüfe die Einstellungen und frage im Zweifelsfall dein Support Team, um diese Situation zu beheben.";
|
||||
$a->strings["If not, you may be required to perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Sollte dies nicht möglich sein, musst du die Installation manuell durchführen. Lies dazu bitte in der Datei \"INSTALL.txt\".";
|
||||
$a->strings["At the end of this procedure, we will give you a text to save in a file named .htconfig.php in your Friendica top folder."] = "Nachdem du alles ausgefüllt hast, erhältst du einen Text, den du in eine Datei namens .htconfig.php in deinem Friendica-Wurzelverzeichnis kopieren musst.";
|
||||
$a->strings["You can alternatively skip this procedure and perform a manual installation. Please see the file \"INSTALL.txt\" for instructions."] = "Alternativ kannst du diesen Schritt aber auch überspringen und die Installation manuell durchführen. Eine Anleitung dazu (Englisch) findest du in der Datei INSTALL.txt.";
|
||||
$a->strings[".htconfig.php is writable"] = "Schreibrechte auf .htconfig.php";
|
||||
$a->strings["Url rewrite in .htaccess is not working. Check your server configuration."] = "Umschreiben der URLs in der .htaccess funktioniert nicht. Überprüfe die Konfiguration des Servers.";
|
||||
$a->strings["Url rewrite is working"] = "URL rewrite funktioniert";
|
||||
$a->strings["The database configuration file \".htconfig.php\" could not be written. Please use the enclosed text to create a configuration file in your web server root."] = "Die Konfigurationsdatei \".htconfig.php\" konnte nicht angelegt werden. Bitte verwende den angefügten Text, um die Datei im Stammverzeichnis deiner Friendica-Installation zu erzeugen.";
|
||||
$a->strings["Errors encountered creating database tables."] = "Fehler aufgetreten während der Erzeugung der Datenbanktabellen.";
|
||||
$a->strings["<h1>What next</h1>"] = "<h1>Wie geht es weiter?</h1>";
|
||||
$a->strings["IMPORTANT: You will need to [manually] setup a scheduled task for the poller."] = "WICHTIG: Du musst [manuell] einen Cronjob (o.ä.) für den Poller einrichten.";
|
||||
$a->strings["l F d, Y \\@ g:i A"] = "l F d, Y \\@ g:i A";
|
||||
$a->strings["Time Conversion"] = "Zeitumrechnung";
|
||||
$a->strings["Friendika provides this service for sharing events with other networks and friends in unknown timezones."] = "Friendica bietet diese Funktion an, um das Teilen von Events mit den Kontakten zu vereinfachen, deren Zeitzone nicht ermittelt werden kann.";
|
||||
|
@ -403,8 +406,8 @@ $a->strings[" Please use a shorter name."] = " Bitte verwende einen kürzeren Na
|
|||
$a->strings[" Name too short."] = " Name ist zu kurz.";
|
||||
$a->strings[" Not valid email."] = " Keine gültige E-Mail.";
|
||||
$a->strings[" Cannot change to that email."] = "Ändern der E-Mail nicht möglich. ";
|
||||
$a->strings["Private forum has no privacy permissions. Using default privacy group."] = "";
|
||||
$a->strings["Private forum has no privacy permissions and no default privacy group."] = "";
|
||||
$a->strings["Private forum has no privacy permissions. Using default privacy group."] = "Für das private Forum sind keine Zugriffsrechte eingestellt. Die voreingestellte Gruppe für neue Kontakte wird benutzt.";
|
||||
$a->strings["Private forum has no privacy permissions and no default privacy group."] = "Für das private Forum sind keine Zugriffsrechte eingestellt, und es gibt keine voreingestellte Gruppe für neue Kontakte.";
|
||||
$a->strings["Settings updated."] = "Einstellungen aktualisiert.";
|
||||
$a->strings["Add application"] = "Programm hinzufügen";
|
||||
$a->strings["Consumer Key"] = "Consumer Key";
|
||||
|
@ -446,16 +449,16 @@ $a->strings["Minimum of 10 seconds, no maximum"] = "Minimal 10 Sekunden, kein Ma
|
|||
$a->strings["Number of items to display on the network page:"] = "Zahl der Beiträge, die pro Netzwerkseite angezeigt werden sollen: ";
|
||||
$a->strings["Maximum of 100 items"] = "Maximal 100 Beiträge";
|
||||
$a->strings["Don't show emoticons"] = "Keine Smilies anzeigen";
|
||||
$a->strings["Normal Account"] = "Normaler Account";
|
||||
$a->strings["Normal Account Page"] = "Normale Account Seite";
|
||||
$a->strings["This account is a normal personal profile"] = "Dieser Account ist ein normales persönliches Profil";
|
||||
$a->strings["Soapbox Account"] = "Sandkasten-Account";
|
||||
$a->strings["Soapbox Page"] = "Sandkasten Seite";
|
||||
$a->strings["Automatically approve all connection/friend requests as read-only fans"] = "Kontaktanfragen werden automatisch als Nurlese-Fans akzeptiert";
|
||||
$a->strings["Community/Celebrity Account"] = "Gemeinschafts-/Promi-Account";
|
||||
$a->strings["Community Forum/Celebrity Account"] = "Gemeinschafts Forum / Promi Konto";
|
||||
$a->strings["Automatically approve all connection/friend requests as read-write fans"] = "Kontaktanfragen werden automatisch als Lese-und-Schreib-Fans akzeptiert";
|
||||
$a->strings["Automatic Friend Account"] = "Automatischer Freundesaccount";
|
||||
$a->strings["Automatic Friend Page"] = "Automatische Freunde Seite";
|
||||
$a->strings["Automatically approve all connection/friend requests as friends"] = "Kontaktanfragen werden automatisch als Freund akzeptiert";
|
||||
$a->strings["Private Forum"] = "";
|
||||
$a->strings["Private forum - approved members only [Experimental]"] = "";
|
||||
$a->strings["Private Forum [Experimental]"] = "Privates Forum [Versuchsstadium]";
|
||||
$a->strings["Private forum - approved members only"] = "Privates Forum - Ausschließlich für Mitglieder";
|
||||
$a->strings["OpenID:"] = "OpenID:";
|
||||
$a->strings["(Optional) Allow this OpenID to login to this account."] = "(Optional) Erlaube die Anmeldung für diesen Account mit dieser OpenID.";
|
||||
$a->strings["Publish your default profile in your local site directory?"] = "Veröffentliche dein Standardprofil im Verzeichnis der lokalen Seite?";
|
||||
|
@ -477,6 +480,7 @@ $a->strings["Expire posts:"] = "Beiträge verfallen lassen:";
|
|||
$a->strings["Expire personal notes:"] = "Persönliche Notizen verfallen lassen:";
|
||||
$a->strings["Expire starred posts:"] = "Markierte Beiträge verfallen lassen:";
|
||||
$a->strings["Expire photos:"] = "Fotos verfallen lassen:";
|
||||
$a->strings["Only expire posts by others:"] = "Nur Beiträge anderer verfallen";
|
||||
$a->strings["Account Settings"] = "Account-Einstellungen";
|
||||
$a->strings["Password Settings"] = "Passwort-Einstellungen";
|
||||
$a->strings["New Password:"] = "Neues Passwort:";
|
||||
|
@ -507,7 +511,8 @@ $a->strings["Someone writes a followup comment"] = "– jemand auch einen Kommen
|
|||
$a->strings["You receive a private message"] = "– du eine private Nachricht erhältst";
|
||||
$a->strings["You receive a friend suggestion"] = "- du eine Empfehlung erhältst";
|
||||
$a->strings["You are tagged in a post"] = "- du in einem Beitrag erwähnt wurdest";
|
||||
$a->strings["Advanced Page Settings"] = "Erweiterte Seiten-Einstellungen";
|
||||
$a->strings["Advanced Account/Page Type Settings"] = "";
|
||||
$a->strings["Change the behaviour of this account for special situations"] = "Ändere das Verhalten deines Accounts für spezielle Situationen.";
|
||||
$a->strings["Manage Identities and/or Pages"] = "Verwalte Identitäten und/oder Seiten";
|
||||
$a->strings["Toggle between different identities or community/group pages which share your account details or which you have been granted \"manage\" permissions"] = "Wechsle zwischen verschiedenen Identitäten oder Gemeinschafts-/Gruppen-Seiten, die deine Zugangsdetails teilen oder zu denen du \"Manage\" Befugnisse bekommen hast.";
|
||||
$a->strings["Select an identity to manage: "] = "Wähle eine Identität zum Verwalten: ";
|
||||
|
@ -590,22 +595,6 @@ $a->strings["Visible To"] = "Sichtbar für";
|
|||
$a->strings["All Contacts (with secure profile access)"] = "Alle Kontakte (mit gesichertem Profilzugriff)";
|
||||
$a->strings["No contacts."] = "Keine Kontakte.";
|
||||
$a->strings["View Contacts"] = "Kontakte anzeigen";
|
||||
$a->strings["An invitation is required."] = "Du benötigst eine Einladung.";
|
||||
$a->strings["Invitation could not be verified."] = "Die Einladung konnte nicht überprüft werden.";
|
||||
$a->strings["Invalid OpenID url"] = "Ungültige OpenID URL";
|
||||
$a->strings["Please enter the required information."] = "Bitte trage die erforderlichen Informationen ein.";
|
||||
$a->strings["Please use a shorter name."] = "Bitte verwende einen kürzeren Namen.";
|
||||
$a->strings["Name too short."] = "Der Name ist zu kurz.";
|
||||
$a->strings["That doesn't appear to be your full (First Last) name."] = "Das scheint nicht dein kompletter Name (Vor- und Nachname) zu sein.";
|
||||
$a->strings["Your email domain is not among those allowed on this site."] = "Die Domain deiner E-Mail Adresse ist auf dieser Seite nicht erlaubt.";
|
||||
$a->strings["Not a valid email address."] = "Keine gültige E-Mail-Adresse.";
|
||||
$a->strings["Cannot use that email."] = "Konnte diese E-Mail-Adresse nicht verwenden.";
|
||||
$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "Dein Spitzname darf nur aus Buchstaben und Zahlen (\"a-z\",\"0-9\", \"_\" und \"-\") bestehen, außerdem muss er mit einem Buchstaben beginnen.";
|
||||
$a->strings["Nickname is already registered. Please choose another."] = "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen.";
|
||||
$a->strings["Nickname was once registered here and may not be re-used. Please choose another."] = "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen.";
|
||||
$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "FATALER FEHLER: Sicherheitsschlüssel konnten nicht erzeugt werden.";
|
||||
$a->strings["An error occurred during registration. Please try again."] = "Wärend der Anmeldung ist ein Fehler aufgetreten. Bitte versuche es noch einmal.";
|
||||
$a->strings["An error occurred creating your default profile. Please try again."] = "Bei der Erstellung des Standardprofils ist ein Fehler aufgetreten. Bitte versuche es noch einmal.";
|
||||
$a->strings["Registration details for %s"] = "Details der Registration von %s";
|
||||
$a->strings["Registration successful. Please check your email for further instructions."] = "Registrierung erfolgreich. Eine E-Mail mit weiteren Anweisungen wurde an dich gesendet.";
|
||||
$a->strings["Failed to send email message. Here is the message that failed."] = "Konnte die E-Mail nicht versenden. Hier ist die Nachricht, die nicht gesendet werden konnte.";
|
||||
|
@ -688,9 +677,13 @@ $a->strings["Users"] = "Nutzer";
|
|||
$a->strings["Plugins"] = "Plugins";
|
||||
$a->strings["Themes"] = "Themen";
|
||||
$a->strings["DB updates"] = "DB Updates";
|
||||
$a->strings["Software Update"] = "Software Update";
|
||||
$a->strings["Logs"] = "Protokolle";
|
||||
$a->strings["User registrations waiting for confirmation"] = "Nutzeranmeldungen die auf Bestätigung warten";
|
||||
$a->strings["Normal Account"] = "Normaler Account";
|
||||
$a->strings["Soapbox Account"] = "Sandkasten-Account";
|
||||
$a->strings["Community/Celebrity Account"] = "Gemeinschafts-/Promi-Account";
|
||||
$a->strings["Automatic Friend Account"] = "Automatischer Freundesaccount";
|
||||
$a->strings["Message queues"] = "Nachrichten-Warteschlangen";
|
||||
$a->strings["Administration"] = "Administration";
|
||||
$a->strings["Summary"] = "Zusammenfassung";
|
||||
$a->strings["Registered users"] = "Registrierte Nutzer";
|
||||
|
@ -830,7 +823,7 @@ $a->strings["{0} mentioned you in a post"] = "{0} hat dich in einem Beitrag erw
|
|||
$a->strings["Contacts who are not members of a group"] = "Kontakte, die keiner Gruppe zugewiesen sind";
|
||||
$a->strings["OpenID protocol error. No ID returned."] = "OpenID Protokollfehler. Keine ID zurückgegeben.";
|
||||
$a->strings["Account not found and OpenID registration is not permitted on this site."] = "Account wurde nicht gefunden und OpenID Registrierung auf diesem Server nicht gestattet.";
|
||||
$a->strings["Login failed."] = "Annmeldung fehlgeschlagen.";
|
||||
$a->strings["Login failed."] = "Anmeldung fehlgeschlagen.";
|
||||
$a->strings["Connect URL missing."] = "Connect-URL fehlt";
|
||||
$a->strings["This site is not configured to allow communications with other networks."] = "Diese Seite ist so konfiguriert, dass keine Kommunikation mit anderen Netzwerken erfolgen kann.";
|
||||
$a->strings["No compatible communication protocols or feeds were discovered."] = "Es wurden keine kompatiblen Kommunikationsprotokolle oder Feeds gefunden.";
|
||||
|
@ -860,12 +853,13 @@ $a->strings["Gender"] = "Geschlecht";
|
|||
$a->strings["Sexual Preference"] = "Sexuelle Vorlieben";
|
||||
$a->strings["Homepage"] = "Webseite";
|
||||
$a->strings["Interests"] = "Interessen";
|
||||
$a->strings["Address"] = "Adresse";
|
||||
$a->strings["Location"] = "Wohnort";
|
||||
$a->strings["Profile updated."] = "Profil aktualisiert.";
|
||||
$a->strings[" and "] = " und ";
|
||||
$a->strings["public profile"] = "öffentliches Profil";
|
||||
$a->strings["%1\$s changed %2\$s to “%3\$s”"] = "%1\$s hat %2\$s geändert auf “%3\$s”";
|
||||
$a->strings[" - Visit %1\$s's %2\$s"] = "";
|
||||
$a->strings[" - Visit %1\$s's %2\$s"] = " – %1\$ss %2\$s besuchen";
|
||||
$a->strings["%1\$s has an updated %2\$s, changing %3\$s."] = "%1\$s hat folgendes aktualisiert %2\$s, verändert wurde %3\$s.";
|
||||
$a->strings["Profile deleted."] = "Profil gelöscht.";
|
||||
$a->strings["Profile-"] = "Profil-";
|
||||
|
@ -890,6 +884,7 @@ $a->strings["Region/State:"] = "Region/Bundesstaat:";
|
|||
$a->strings["<span class=\"heart\">♥</span> Marital Status:"] = "<span class=\"heart\">♥</span> Beziehungsstatus:";
|
||||
$a->strings["Who: (if applicable)"] = "Wer: (falls anwendbar)";
|
||||
$a->strings["Examples: cathy123, Cathy Williams, cathy@example.com"] = "Beispiele: cathy123, Cathy Williams, cathy@example.com";
|
||||
$a->strings["Since [date]:"] = "Seit [Datum]:";
|
||||
$a->strings["Sexual Preference:"] = "Sexuelle Vorlieben:";
|
||||
$a->strings["Homepage URL:"] = "Adresse der Homepage:";
|
||||
$a->strings["Political Views:"] = "Politische Ansichten:";
|
||||
|
@ -1099,12 +1094,15 @@ $a->strings["Drupal site URL"] = "URL der Drupal Seite";
|
|||
$a->strings["Drupal site uses clean URLS"] = "Drupal Seite verwendet bereinigte URLs";
|
||||
$a->strings["Post to Drupal by default"] = "Veröffentliche öffentliche Beiträge standardmäßig bei Drupal";
|
||||
$a->strings["Post from Friendica"] = "Beitrag via Friendica";
|
||||
$a->strings["Startpage Settings"] = "Startseiten-Einstellungen";
|
||||
$a->strings["Home page to load after login - leave blank for profile wall"] = "Seite, die nach dem Anmelden geladen werden soll. Leer = Pinnwand";
|
||||
$a->strings["Examples: "network" or "notifications/system""] = "Beispiele: network, notifications/system";
|
||||
$a->strings["Geonames settings updated."] = "Geonames Einstellungen aktualisiert";
|
||||
$a->strings["Geonames Settings"] = "Geonames Einstellungen";
|
||||
$a->strings["Enable Geonames Plugin"] = "Geonames Plugin aktivieren";
|
||||
$a->strings["Your account on %s will expire in a few days."] = "Dein Konto auf %s wird in ein paar Tagen verfallen.";
|
||||
$a->strings["Your Friendica account is about to expire."] = "";
|
||||
$a->strings["Hi %1\$s,\n\nYour account on %2\$s will expire in less than five days. You may keep your account by logging in at least once every 30 days"] = "";
|
||||
$a->strings["Your Friendica account is about to expire."] = "Dein Friendica-Account wird in Kürze auslaufen.";
|
||||
$a->strings["Hi %1\$s,\n\nYour account on %2\$s will expire in less than five days. You may keep your account by logging in at least once every 30 days"] = "Hallo %1\$s,\n\ndein Account auf %2\$s wird in weniger als fünf Tagen auslaufen. Du kannst das verhindern, indem du dich mindestens einmal alle 30 Tage anmeldest.";
|
||||
$a->strings["Upload a file"] = "Datei hochladen";
|
||||
$a->strings["Drop files here to upload"] = "Ziehe Dateien hierher, um sie hochzuladen";
|
||||
$a->strings["Failed"] = "Fehlgeschlagen";
|
||||
|
@ -1223,8 +1221,8 @@ $a->strings["WordPress username"] = "WordPress-Benutzername";
|
|||
$a->strings["WordPress password"] = "WordPress-Passwort";
|
||||
$a->strings["WordPress API URL"] = "WordPress-API-URL";
|
||||
$a->strings["Post to WordPress by default"] = "Standardmäßig auf WordPress veröffentlichen";
|
||||
$a->strings["Provide a backlink to the Friendica post"] = "";
|
||||
$a->strings["Read the original post and comment stream on Friendica"] = "";
|
||||
$a->strings["Provide a backlink to the Friendica post"] = "Einen zurück zum Friendica-Beitrag hinzufügen";
|
||||
$a->strings["Read the original post and comment stream on Friendica"] = "Den Original-Beitrag samt Kommentaren bei Friendica lesen";
|
||||
$a->strings["\"Show more\" Settings"] = "\"Mehr zeigen\" Einstellungen";
|
||||
$a->strings["Enable Show More"] = "Aktiviere \"Mehr zeigen\"";
|
||||
$a->strings["Cutting posts after how much characters"] = "Begrenze Beiträge nach einer bestimmten Anzahl an Buchstaben";
|
||||
|
@ -1318,6 +1316,7 @@ $a->strings["j F"] = "j F";
|
|||
$a->strings["Birthday:"] = "Geburtstag:";
|
||||
$a->strings["Age:"] = "Alter:";
|
||||
$a->strings["Status:"] = "Status:";
|
||||
$a->strings["for %1\$d %2\$s"] = "für %1\$d %2\$s";
|
||||
$a->strings["Homepage:"] = "Homepage:";
|
||||
$a->strings["Tags:"] = "Tags";
|
||||
$a->strings["Religion:"] = "Religion:";
|
||||
|
@ -1458,7 +1457,7 @@ $a->strings["view full size"] = "Volle Größe anzeigen";
|
|||
$a->strings["Embedded content"] = "Eingebetteter Inhalt";
|
||||
$a->strings["Embedding disabled"] = "Einbettungen deaktiviert";
|
||||
$a->strings["A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name."] = "Eine gelöschte Gruppe mit diesem Namen wurde wiederbelebt. Bestehende Berechtigungseinstellungen <strong>könnten</strong> auf diese Gruppe oder zukünftige Mitglieder angewandt werden. Falls du dies nicht möchtest, erstelle bitte eine andere Gruppe mit einem anderen Namen.";
|
||||
$a->strings["Default privacy group for new contacts"] = "";
|
||||
$a->strings["Default privacy group for new contacts"] = "Voreingestellte Gruppe für neue Kontakte";
|
||||
$a->strings["Everybody"] = "Alle Kontakte";
|
||||
$a->strings["edit"] = "bearbeiten";
|
||||
$a->strings["Groups"] = "Gruppen";
|
||||
|
@ -1581,6 +1580,22 @@ $a->strings["A new person is sharing with you at "] = "Eine neue Person teilt mi
|
|||
$a->strings["You have a new follower at "] = "Du hast einen neuen Kontakt auf ";
|
||||
$a->strings["image/photo"] = "Bild/Foto";
|
||||
$a->strings["link"] = "Verweis";
|
||||
$a->strings["An invitation is required."] = "Du benötigst eine Einladung.";
|
||||
$a->strings["Invitation could not be verified."] = "Die Einladung konnte nicht überprüft werden.";
|
||||
$a->strings["Invalid OpenID url"] = "Ungültige OpenID URL";
|
||||
$a->strings["Please enter the required information."] = "Bitte trage die erforderlichen Informationen ein.";
|
||||
$a->strings["Please use a shorter name."] = "Bitte verwende einen kürzeren Namen.";
|
||||
$a->strings["Name too short."] = "Der Name ist zu kurz.";
|
||||
$a->strings["That doesn't appear to be your full (First Last) name."] = "Das scheint nicht dein kompletter Name (Vor- und Nachname) zu sein.";
|
||||
$a->strings["Your email domain is not among those allowed on this site."] = "Die Domain deiner E-Mail Adresse ist auf dieser Seite nicht erlaubt.";
|
||||
$a->strings["Not a valid email address."] = "Keine gültige E-Mail-Adresse.";
|
||||
$a->strings["Cannot use that email."] = "Konnte diese E-Mail-Adresse nicht verwenden.";
|
||||
$a->strings["Your \"nickname\" can only contain \"a-z\", \"0-9\", \"-\", and \"_\", and must also begin with a letter."] = "Dein Spitzname darf nur aus Buchstaben und Zahlen (\"a-z\",\"0-9\", \"_\" und \"-\") bestehen, außerdem muss er mit einem Buchstaben beginnen.";
|
||||
$a->strings["Nickname is already registered. Please choose another."] = "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen.";
|
||||
$a->strings["Nickname was once registered here and may not be re-used. Please choose another."] = "Dieser Spitzname ist bereits vergeben. Bitte wähle einen anderen.";
|
||||
$a->strings["SERIOUS ERROR: Generation of security keys failed."] = "FATALER FEHLER: Sicherheitsschlüssel konnten nicht erzeugt werden.";
|
||||
$a->strings["An error occurred during registration. Please try again."] = "Wärend der Anmeldung ist ein Fehler aufgetreten. Bitte versuche es noch einmal.";
|
||||
$a->strings["An error occurred creating your default profile. Please try again."] = "Bei der Erstellung des Standardprofils ist ein Fehler aufgetreten. Bitte versuche es noch einmal.";
|
||||
$a->strings["Welcome "] = "Willkommen ";
|
||||
$a->strings["Please upload a profile photo."] = "Bitte lade ein Profilbild hoch.";
|
||||
$a->strings["Welcome back "] = "Willkommen zurück ";
|
||||
|
|
4
view/diaspora_like_relay.tpl
Normal file → Executable file
4
view/diaspora_like_relay.tpl
Normal file → Executable file
|
@ -5,9 +5,9 @@
|
|||
<target_type>$target_type</target_type>
|
||||
<parent_guid>$parent_guid</parent_guid>
|
||||
<parent_author_signature>$parentsig</parent_author_signature>
|
||||
<author_signature>$authrosig</author_signature>
|
||||
<author_signature>$authorsig</author_signature>
|
||||
<positive>$positive</positive>
|
||||
<diaspora_handle>$handle</diaspora_handle>
|
||||
</like>
|
||||
</post>
|
||||
</XML>
|
||||
</XML>
|
||||
|
|
10
view/diaspora_relay_retraction.tpl
Normal file
10
view/diaspora_relay_retraction.tpl
Normal file
|
@ -0,0 +1,10 @@
|
|||
<XML>
|
||||
<post>
|
||||
<relayable_retraction>
|
||||
<target_type>$type</target_type>
|
||||
<target_guid>$guid</target_guid>
|
||||
<target_author_signature>$signature</target_author_signature>
|
||||
<sender_handle>$handle</sender_handle>
|
||||
</relayable_retraction>
|
||||
</post>
|
||||
</XML>
|
11
view/diaspora_relayable_retraction.tpl
Executable file
11
view/diaspora_relayable_retraction.tpl
Executable file
|
@ -0,0 +1,11 @@
|
|||
<XML>
|
||||
<post>
|
||||
<relayable_retraction>
|
||||
<target_type>$target_type</target_type>
|
||||
<target_guid>$guid</target_guid>
|
||||
<parent_author_signature>$parentsig</parent_author_signature>
|
||||
<target_author_signature>$authorsig</target_author_signature>
|
||||
<sender_handle>$handle</sender_handle>
|
||||
</relayable_retraction>
|
||||
</post>
|
||||
</XML>
|
|
@ -17,7 +17,7 @@ $select
|
|||
|
||||
|
||||
<div id="prvmail-submit-wrapper" >
|
||||
<input type="submit" id="prvmail-submit" name="submit" value="Submit" tabindex="13" />
|
||||
<input type="submit" id="prvmail-submit" name="submit" value="$submit" tabindex="13" />
|
||||
<div id="prvmail-upload-wrapper" >
|
||||
<div id="prvmail-upload" class="icon border camera" title="$upload" ></div>
|
||||
</div>
|
||||
|
|
|
@ -98,7 +98,7 @@ $group_select
|
|||
|
||||
|
||||
<div class="settings-submit-wrapper" >
|
||||
<input type="submit" name="submit" class="settings-submit" value="Submit" />
|
||||
<input type="submit" name="submit" class="settings-submit" value="$submit" />
|
||||
</div>
|
||||
|
||||
|
||||
|
|
|
@ -243,6 +243,18 @@
|
|||
.icon.s48.language {
|
||||
background-image: url("icons/language.png");
|
||||
}
|
||||
.icon.on {
|
||||
background-image: url("icons/addon_on.png");
|
||||
min-width: 16px;
|
||||
height: 16px;
|
||||
background-position: 0px 0px;
|
||||
}
|
||||
.icon.off {
|
||||
background-image: url("icons/addon_off.png");
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background-position: 0px 0px;
|
||||
}
|
||||
/* global */
|
||||
body {
|
||||
font-family: Liberation Sans, helvetica, arial, clean, sans-serif;
|
||||
|
@ -255,8 +267,7 @@ body {
|
|||
h4 {
|
||||
font-size: 1.1em;
|
||||
}
|
||||
a,
|
||||
a:link {
|
||||
a, a:link {
|
||||
color: #005c94;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
@ -478,8 +489,7 @@ nav #nav-site-linkmenu .menu-popup {
|
|||
right: 0px;
|
||||
left: auto;
|
||||
}
|
||||
nav #nav-notifications-linkmenu.on .icon.s22.notify,
|
||||
nav #nav-notifications-linkmenu.selected .icon.s22.notify {
|
||||
nav #nav-notifications-linkmenu.on .icon.s22.notify, nav #nav-notifications-linkmenu.selected .icon.s22.notify {
|
||||
background-image: url("../../../images/icons/22/notify_on.png");
|
||||
}
|
||||
nav #nav-apps-link.selected {
|
||||
|
@ -668,15 +678,11 @@ aside #profiles-menu {
|
|||
height: 48px;
|
||||
}
|
||||
/* group member */
|
||||
#contact-edit-drop-link,
|
||||
.mail-list-delete-wrapper,
|
||||
.group-delete-wrapper {
|
||||
#contact-edit-drop-link, .mail-list-delete-wrapper, .group-delete-wrapper {
|
||||
float: right;
|
||||
margin-right: 50px;
|
||||
}
|
||||
#contact-edit-drop-link .drophide,
|
||||
.mail-list-delete-wrapper .drophide,
|
||||
.group-delete-wrapper .drophide {
|
||||
#contact-edit-drop-link .drophide, .mail-list-delete-wrapper .drophide, .group-delete-wrapper .drophide {
|
||||
background-image: url('../../../images/icons/22/delete.png');
|
||||
display: block;
|
||||
width: 22px;
|
||||
|
@ -685,9 +691,7 @@ aside #profiles-menu {
|
|||
position: relative;
|
||||
top: -50px;
|
||||
}
|
||||
#contact-edit-drop-link .drop,
|
||||
.mail-list-delete-wrapper .drop,
|
||||
.group-delete-wrapper .drop {
|
||||
#contact-edit-drop-link .drop, .mail-list-delete-wrapper .drop, .group-delete-wrapper .drop {
|
||||
background-image: url('../../../images/icons/22/delete.png');
|
||||
display: block;
|
||||
width: 22px;
|
||||
|
@ -817,8 +821,7 @@ section {
|
|||
display: table;
|
||||
width: 750px;
|
||||
}
|
||||
.wall-item-container .wall-item-item,
|
||||
.wall-item-container .wall-item-bottom {
|
||||
.wall-item-container .wall-item-item, .wall-item-container .wall-item-bottom {
|
||||
display: table-row;
|
||||
}
|
||||
.wall-item-container .wall-item-bottom {
|
||||
|
@ -856,13 +859,11 @@ section {
|
|||
.wall-item-container .wall-item-content img {
|
||||
max-width: 710px;
|
||||
}
|
||||
.wall-item-container .wall-item-links,
|
||||
.wall-item-container .wall-item-actions {
|
||||
.wall-item-container .wall-item-links, .wall-item-container .wall-item-actions {
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.wall-item-container .wall-item-links .icon,
|
||||
.wall-item-container .wall-item-actions .icon {
|
||||
.wall-item-container .wall-item-links .icon, .wall-item-container .wall-item-actions .icon {
|
||||
opacity: 0.5;
|
||||
-webkit-transition: all 0.2s ease-in-out;
|
||||
-moz-transition: all 0.2s ease-in-out;
|
||||
|
@ -870,8 +871,7 @@ section {
|
|||
-ms-transition: all 0.2s ease-in-out;
|
||||
transition: all 0.2s ease-in-out;
|
||||
}
|
||||
.wall-item-container .wall-item-links .icon:hover,
|
||||
.wall-item-container .wall-item-actions .icon:hover {
|
||||
.wall-item-container .wall-item-links .icon:hover, .wall-item-container .wall-item-actions .icon:hover {
|
||||
opacity: 1;
|
||||
-webkit-transition: all 0.2s ease-in-out;
|
||||
-moz-transition: all 0.2s ease-in-out;
|
||||
|
@ -1015,6 +1015,9 @@ section {
|
|||
opacity: 0.5;
|
||||
}
|
||||
.wwto {
|
||||
position: absolute !important;
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
background: #FFFFFF;
|
||||
border: 2px solid #364e59;
|
||||
height: 25px;
|
||||
|
@ -1245,9 +1248,7 @@ section {
|
|||
height: 18px;
|
||||
}*/
|
||||
/** acl **/
|
||||
#photo-edit-perms-select,
|
||||
#photos-upload-permissions-wrapper,
|
||||
#profile-jot-acl-wrapper {
|
||||
#photo-edit-perms-select, #photos-upload-permissions-wrapper, #profile-jot-acl-wrapper {
|
||||
display: block!important;
|
||||
}
|
||||
#acl-wrapper {
|
||||
|
@ -1406,12 +1407,10 @@ ul.tabs li .active {
|
|||
float: left;
|
||||
width: 200px;
|
||||
}
|
||||
.field input,
|
||||
.field textarea {
|
||||
.field input, .field textarea {
|
||||
width: 400px;
|
||||
}
|
||||
.field input[type="checkbox"],
|
||||
.field input[type="radio"] {
|
||||
.field input[type="checkbox"], .field input[type="radio"] {
|
||||
width: auto;
|
||||
}
|
||||
.field textarea {
|
||||
|
@ -1642,15 +1641,13 @@ ul.tabs li .active {
|
|||
transition: all 0.2s ease-in-out;
|
||||
}
|
||||
/* theme screenshot */
|
||||
.screenshot,
|
||||
#theme-preview {
|
||||
.screenshot, #theme-preview {
|
||||
position: absolute;
|
||||
width: 202px;
|
||||
left: 70%;
|
||||
top: 50px;
|
||||
}
|
||||
.screenshot img,
|
||||
#theme-preview img {
|
||||
.screenshot img, #theme-preview img {
|
||||
width: 200px;
|
||||
height: 150px;
|
||||
}
|
||||
|
@ -1663,3 +1660,77 @@ footer {
|
|||
margin-top: 25px;
|
||||
clear: both;
|
||||
}
|
||||
/**
|
||||
* ADMIN
|
||||
*/
|
||||
#pending-update {
|
||||
float: right;
|
||||
color: #ffffff;
|
||||
font-weight: bold;
|
||||
background-color: #FF0000;
|
||||
padding: 0em 0.3em;
|
||||
}
|
||||
#adminpage dl {
|
||||
clear: left;
|
||||
margin-bottom: 2px;
|
||||
padding-bottom: 2px;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
#adminpage dt {
|
||||
width: 200px;
|
||||
float: left;
|
||||
font-weight: bold;
|
||||
}
|
||||
#adminpage dd {
|
||||
margin-left: 200px;
|
||||
}
|
||||
#adminpage h3 {
|
||||
border-bottom: 1px solid #cccccc;
|
||||
}
|
||||
#adminpage .field label {
|
||||
font-weight: bold;
|
||||
}
|
||||
#adminpage .submit {
|
||||
clear: left;
|
||||
text-align: right;
|
||||
}
|
||||
#adminpage #pluginslist {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
#adminpage .plugin {
|
||||
list-style: none;
|
||||
display: block;
|
||||
border: 1px solid #888888;
|
||||
padding: 1em;
|
||||
margin-bottom: 5px;
|
||||
clear: left;
|
||||
}
|
||||
#adminpage .plugin .desc {
|
||||
margin-left: 2.5em;
|
||||
}
|
||||
#adminpage .toggleplugin {
|
||||
float: left;
|
||||
margin-right: 1em;
|
||||
}
|
||||
#adminpage table {
|
||||
width: 100%;
|
||||
border-bottom: 1px solid #000000;
|
||||
margin: 5px 0px;
|
||||
}
|
||||
#adminpage table th {
|
||||
text-align: left;
|
||||
}
|
||||
#adminpage td .icon {
|
||||
float: left;
|
||||
}
|
||||
#adminpage table#users img {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
#adminpage table tr:hover {
|
||||
background-color: #bbc7d7;
|
||||
}
|
||||
#adminpage .selectall {
|
||||
text-align: right;
|
||||
}
|
||||
|
|
|
@ -243,6 +243,18 @@
|
|||
.icon.s48.language {
|
||||
background-image: url("icons/language.png");
|
||||
}
|
||||
.icon.on {
|
||||
background-image: url("icons/addon_on.png");
|
||||
min-width: 16px;
|
||||
height: 16px;
|
||||
background-position: 0px 0px;
|
||||
}
|
||||
.icon.off {
|
||||
background-image: url("icons/addon_off.png");
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background-position: 0px 0px;
|
||||
}
|
||||
/* global */
|
||||
body {
|
||||
font-family: Liberation Sans, helvetica, arial, clean, sans-serif;
|
||||
|
@ -255,8 +267,7 @@ body {
|
|||
h4 {
|
||||
font-size: 1.1em;
|
||||
}
|
||||
a,
|
||||
a:link {
|
||||
a, a:link {
|
||||
color: #009100;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
@ -478,8 +489,7 @@ nav #nav-site-linkmenu .menu-popup {
|
|||
right: 0px;
|
||||
left: auto;
|
||||
}
|
||||
nav #nav-notifications-linkmenu.on .icon.s22.notify,
|
||||
nav #nav-notifications-linkmenu.selected .icon.s22.notify {
|
||||
nav #nav-notifications-linkmenu.on .icon.s22.notify, nav #nav-notifications-linkmenu.selected .icon.s22.notify {
|
||||
background-image: url("../../../images/icons/22/notify_on.png");
|
||||
}
|
||||
nav #nav-apps-link.selected {
|
||||
|
@ -668,15 +678,11 @@ aside #profiles-menu {
|
|||
height: 48px;
|
||||
}
|
||||
/* group member */
|
||||
#contact-edit-drop-link,
|
||||
.mail-list-delete-wrapper,
|
||||
.group-delete-wrapper {
|
||||
#contact-edit-drop-link, .mail-list-delete-wrapper, .group-delete-wrapper {
|
||||
float: right;
|
||||
margin-right: 50px;
|
||||
}
|
||||
#contact-edit-drop-link .drophide,
|
||||
.mail-list-delete-wrapper .drophide,
|
||||
.group-delete-wrapper .drophide {
|
||||
#contact-edit-drop-link .drophide, .mail-list-delete-wrapper .drophide, .group-delete-wrapper .drophide {
|
||||
background-image: url('../../../images/icons/22/delete.png');
|
||||
display: block;
|
||||
width: 22px;
|
||||
|
@ -685,9 +691,7 @@ aside #profiles-menu {
|
|||
position: relative;
|
||||
top: -50px;
|
||||
}
|
||||
#contact-edit-drop-link .drop,
|
||||
.mail-list-delete-wrapper .drop,
|
||||
.group-delete-wrapper .drop {
|
||||
#contact-edit-drop-link .drop, .mail-list-delete-wrapper .drop, .group-delete-wrapper .drop {
|
||||
background-image: url('../../../images/icons/22/delete.png');
|
||||
display: block;
|
||||
width: 22px;
|
||||
|
@ -817,8 +821,7 @@ section {
|
|||
display: table;
|
||||
width: 750px;
|
||||
}
|
||||
.wall-item-container .wall-item-item,
|
||||
.wall-item-container .wall-item-bottom {
|
||||
.wall-item-container .wall-item-item, .wall-item-container .wall-item-bottom {
|
||||
display: table-row;
|
||||
}
|
||||
.wall-item-container .wall-item-bottom {
|
||||
|
@ -856,13 +859,11 @@ section {
|
|||
.wall-item-container .wall-item-content img {
|
||||
max-width: 710px;
|
||||
}
|
||||
.wall-item-container .wall-item-links,
|
||||
.wall-item-container .wall-item-actions {
|
||||
.wall-item-container .wall-item-links, .wall-item-container .wall-item-actions {
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
}
|
||||
.wall-item-container .wall-item-links .icon,
|
||||
.wall-item-container .wall-item-actions .icon {
|
||||
.wall-item-container .wall-item-links .icon, .wall-item-container .wall-item-actions .icon {
|
||||
opacity: 0.5;
|
||||
-webkit-transition: all 0.2s ease-in-out;
|
||||
-moz-transition: all 0.2s ease-in-out;
|
||||
|
@ -870,8 +871,7 @@ section {
|
|||
-ms-transition: all 0.2s ease-in-out;
|
||||
transition: all 0.2s ease-in-out;
|
||||
}
|
||||
.wall-item-container .wall-item-links .icon:hover,
|
||||
.wall-item-container .wall-item-actions .icon:hover {
|
||||
.wall-item-container .wall-item-links .icon:hover, .wall-item-container .wall-item-actions .icon:hover {
|
||||
opacity: 1;
|
||||
-webkit-transition: all 0.2s ease-in-out;
|
||||
-moz-transition: all 0.2s ease-in-out;
|
||||
|
@ -1015,6 +1015,9 @@ section {
|
|||
opacity: 0.5;
|
||||
}
|
||||
.wwto {
|
||||
position: absolute !important;
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
background: #FFFFFF;
|
||||
border: 2px solid #364e59;
|
||||
height: 25px;
|
||||
|
@ -1245,9 +1248,7 @@ section {
|
|||
height: 18px;
|
||||
}*/
|
||||
/** acl **/
|
||||
#photo-edit-perms-select,
|
||||
#photos-upload-permissions-wrapper,
|
||||
#profile-jot-acl-wrapper {
|
||||
#photo-edit-perms-select, #photos-upload-permissions-wrapper, #profile-jot-acl-wrapper {
|
||||
display: block!important;
|
||||
}
|
||||
#acl-wrapper {
|
||||
|
@ -1406,12 +1407,10 @@ ul.tabs li .active {
|
|||
float: left;
|
||||
width: 200px;
|
||||
}
|
||||
.field input,
|
||||
.field textarea {
|
||||
.field input, .field textarea {
|
||||
width: 400px;
|
||||
}
|
||||
.field input[type="checkbox"],
|
||||
.field input[type="radio"] {
|
||||
.field input[type="checkbox"], .field input[type="radio"] {
|
||||
width: auto;
|
||||
}
|
||||
.field textarea {
|
||||
|
@ -1642,15 +1641,13 @@ ul.tabs li .active {
|
|||
transition: all 0.2s ease-in-out;
|
||||
}
|
||||
/* theme screenshot */
|
||||
.screenshot,
|
||||
#theme-preview {
|
||||
.screenshot, #theme-preview {
|
||||
position: absolute;
|
||||
width: 202px;
|
||||
left: 70%;
|
||||
top: 50px;
|
||||
}
|
||||
.screenshot img,
|
||||
#theme-preview img {
|
||||
.screenshot img, #theme-preview img {
|
||||
width: 200px;
|
||||
height: 150px;
|
||||
}
|
||||
|
@ -1663,3 +1660,77 @@ footer {
|
|||
margin-top: 25px;
|
||||
clear: both;
|
||||
}
|
||||
/**
|
||||
* ADMIN
|
||||
*/
|
||||
#pending-update {
|
||||
float: right;
|
||||
color: #ffffff;
|
||||
font-weight: bold;
|
||||
background-color: #FF0000;
|
||||
padding: 0em 0.3em;
|
||||
}
|
||||
#adminpage dl {
|
||||
clear: left;
|
||||
margin-bottom: 2px;
|
||||
padding-bottom: 2px;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
#adminpage dt {
|
||||
width: 200px;
|
||||
float: left;
|
||||
font-weight: bold;
|
||||
}
|
||||
#adminpage dd {
|
||||
margin-left: 200px;
|
||||
}
|
||||
#adminpage h3 {
|
||||
border-bottom: 1px solid #cccccc;
|
||||
}
|
||||
#adminpage .field label {
|
||||
font-weight: bold;
|
||||
}
|
||||
#adminpage .submit {
|
||||
clear: left;
|
||||
text-align: right;
|
||||
}
|
||||
#adminpage #pluginslist {
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
}
|
||||
#adminpage .plugin {
|
||||
list-style: none;
|
||||
display: block;
|
||||
border: 1px solid #888888;
|
||||
padding: 1em;
|
||||
margin-bottom: 5px;
|
||||
clear: left;
|
||||
}
|
||||
#adminpage .plugin .desc {
|
||||
margin-left: 2.5em;
|
||||
}
|
||||
#adminpage .toggleplugin {
|
||||
float: left;
|
||||
margin-right: 1em;
|
||||
}
|
||||
#adminpage table {
|
||||
width: 100%;
|
||||
border-bottom: 1px solid #000000;
|
||||
margin: 5px 0px;
|
||||
}
|
||||
#adminpage table th {
|
||||
text-align: left;
|
||||
}
|
||||
#adminpage td .icon {
|
||||
float: left;
|
||||
}
|
||||
#adminpage table#users img {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
#adminpage table tr:hover {
|
||||
background-color: #bbc7d7;
|
||||
}
|
||||
#adminpage .selectall {
|
||||
text-align: right;
|
||||
}
|
||||
|
|
|
@ -21,7 +21,8 @@
|
|||
&.type-text { background-image: url("../../../images/icons/@{size}/text.png"); }
|
||||
|
||||
&.language { background-image: url("icons/language.png"); }
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@ -59,5 +60,17 @@
|
|||
.icons(48);
|
||||
}
|
||||
|
||||
&.on {
|
||||
background-image: url("icons/addon_on.png");
|
||||
min-width:16px;
|
||||
height: 16px;
|
||||
background-position: 0px 0px;
|
||||
}
|
||||
&.off {
|
||||
background-image: url("icons/addon_off.png");
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background-position: 0px 0px;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
BIN
view/theme/quattro/icons/addon_off.png
Normal file
BIN
view/theme/quattro/icons/addon_off.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 438 B |
BIN
view/theme/quattro/icons/addon_on.png
Normal file
BIN
view/theme/quattro/icons/addon_on.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 428 B |
|
@ -1152,3 +1152,64 @@ footer { height: 100px; display: table-row; }
|
|||
clear: both;
|
||||
}
|
||||
|
||||
/**
|
||||
* ADMIN
|
||||
*/
|
||||
#pending-update {
|
||||
float:right;
|
||||
color: #ffffff;
|
||||
font-weight: bold;
|
||||
background-color: #FF0000;
|
||||
padding: 0em 0.3em;
|
||||
|
||||
}
|
||||
#adminpage dl {
|
||||
clear: left;
|
||||
margin-bottom: 2px;
|
||||
padding-bottom: 2px;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
#adminpage dt {
|
||||
width: 200px;
|
||||
float: left;
|
||||
font-weight: bold;
|
||||
}
|
||||
#adminpage dd {
|
||||
margin-left: 200px;
|
||||
}
|
||||
|
||||
#adminpage h3 {
|
||||
border-bottom: 1px solid #cccccc;
|
||||
}
|
||||
#adminpage .field label {
|
||||
font-weight: bold;
|
||||
}
|
||||
#adminpage .submit {
|
||||
clear:left;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
#adminpage #pluginslist {
|
||||
margin: 0px; padding: 0px;
|
||||
}
|
||||
#adminpage .plugin {
|
||||
list-style: none;
|
||||
display: block;
|
||||
border: 1px solid #888888;
|
||||
padding: 1em;
|
||||
margin-bottom: 5px;
|
||||
clear: left;
|
||||
}
|
||||
#adminpage .plugin .desc { margin-left: 2.5em;}
|
||||
#adminpage .toggleplugin {
|
||||
float:left;
|
||||
margin-right: 1em;
|
||||
}
|
||||
|
||||
#adminpage table {width:100%; border-bottom: 1px solid #000000; margin: 5px 0px;}
|
||||
#adminpage table th { text-align: left;}
|
||||
#adminpage td .icon { float: left;}
|
||||
#adminpage table#users img { width: 16px; height: 16px; }
|
||||
#adminpage table tr:hover { background-color: #bbc7d7; }
|
||||
#adminpage .selectall { text-align: right; }
|
||||
|
||||
|
|
Loading…
Reference in a new issue