Merge remote-tracking branch 'upstream/develop' into develop

This commit is contained in:
Andy H 2018-11-19 21:54:56 +07:00
commit 735cb7c6c1
17 changed files with 166 additions and 157 deletions

View file

@ -4,71 +4,73 @@ Account - Basics
* [Zur Startseite der Hilfe](help) * [Zur Startseite der Hilfe](help)
**Registrierung** ## Registrierung
Nicht alle Friendica-Knoten bieten die Möglichkeit zur Registrierung. Viele, aber nicht alle Friendica-Knoten (Server) bieten die Möglichkeit zur Registrierung an.
Wenn die Registrierung möglich ist, wird ein "Registrieren"-Link unter dem Login-Feld auf der Startseite angezeigt, der zur Registrierungsseite führt. Falls der Friendica-Knoten, den Du besuchst, keine Registrierung anbietet, oder Du glaubst, dass Dir ein anderer Knoten möglicherweise besser gefällt, dann findest Du hier eine [Liste von öffentlichen Friendica-Knoten](https://dir.friendica.social/servers), aus der Du Dir eine netten Knoten heraussuchen kannst.
Die Stärke unseres Netzwerks ist, dass die verschiedenen Knoten komplett kompatibel zueinander sind.
Wenn der Knoten, den Du besuchst, keine Registrierung anbietet, oder wenn Du glaubst, dass Dir eine andere Seite möglicherweise besser gefällt, dann kannst Du hier eine <a href="https://dir.friendica.social/servers">Liste von öffentlichen Servern (Knoten)</a> finden und den Knoten heraus suchen, der am Besten zu Deinen Anforderungen passt.
Wenn Du Deinen eigenen Server aufsetzen willst, kannst Du das ebenfalls machen. Auf der Startseite des Knotens wird unter dem Login-Feld ein "Registrieren"-Link angezeigt.
Besuche <a href="http://friendi.ca">die Friendica-Webseite</a>, um den Code mit den Installationsanleitungen herunterzuladen. Dieser Link führt dann direkt auf das Registrierungsformular.
Es ist ein einfacher Installationsprozess, den jeder mit ein wenig Erfahrungen im Webseiten-Hosting oder mit grundlegenden Linux-Erfahrungen einfach handhaben kann.
### OpenID
*OpenID* Falls du keine [OpenID-Adresse](https://de.wikipedia.org/wiki/OpenID">OpenID-Adresse) hast, kannst du diesen Punkt ignorieren.
Das erste Feld auf der Registrierungsseite ist für eine OpenID-Adresse. Solltest du eine OpenID Adresse haben, kannst Du sie im ersten Feld eintragen und "Registrieren" klicken.
Wenn Du keine OpenID-Adresse hast oder nicht wünschst, diese zu nutzen, dann lasse das Feld frei.
Wenn Du einen OpenID-Account hast und diesen nutzen willst, gib die Adresse in das Feld ein und klicke auf "Registrieren".
Friendica wird versuchen, so viele Informationen wie möglich von Deinem OpenID-Provider zu übernehmen, um diese in Dein Profil auf dieser Seite einzutragen. Friendica wird versuchen, so viele Informationen wie möglich von Deinem OpenID-Provider zu übernehmen, um diese in Dein Profil auf dieser Seite einzutragen.
*Dein vollständiger Name* ### Dein vollständiger Name
Bitte trage Deinen vollständigen Namen **so ein, wie Du ihn im System anzeigen lassen willst**. Bitte trage bei "vollständiger Name" Deinen **gewünschten Namen** ein, wie er über deinen Beiträgen angezeigt werden soll.
Viele Leute nutzen ihren richtigen Namen hierfür, allerdings besteht für dich keine Pflicht, das auch so zu machen. Du kannst deinen echten Namen eintragen, kannst Dir aber auch einen Namen ausdenken. Einen Zwang zu dem sogenannten Klarnamen gibt es nicht.
*Email-Adresse*
### Email-Adresse
Bitte trage eine richtige Email-Adresse ein. Bitte trage eine richtige Email-Adresse ein.
Deine Email-Adresse wird **niemals** veröffentlicht.
Wir benötigen diese, um Dir Account-Informationen und die Login-Daten zu schicken.
Du erhältst zudem von Zeit zu Zeit Benachrichtigungen über eingegangene Nachrichten oder Punkte, die Deine Aufmerksamkeit benötigen.
Du hast aber auch die Möglichkeit, diese Nachrichten in Deinen Account-Einstellungen komplett abzuschalten.
Du musst nicht Deine Haupt-Email-Adresse sein, jedoch wird eine funktionierende Adresse benötigt.
Ohne dieses kannst Du weder Dein Initialpasswort erhalten, noch Dein Passwort zurücksetzen.
Dies ist die einzige persönliche Information, die korrekt sein muss. Dies ist die einzige persönliche Information, die korrekt sein muss.
Deine Email-Adresse wird **niemals** veröffentlicht.
Wir benötigen diese, um Dir Account-Informationen, das Initialpasswort und die Login-Daten zu schicken. Oder z.B. Dein Passwort zurückzusetzen.
*Spitzname/Nickname* Du erhältst zudem von Zeit zu Zeit Benachrichtigungen über eingegangene Nachrichten oder Punkte, die Deine Aufmerksamkeit benötigen.
Diese Nachrichten sind in den Einstellungen jederzeit an- oder abschaltbar.
Der Spitzname wird benötigt, um eine Webadresse für viele Deiner persönlichen Seiten zu erstellen. ### Spitzname/Nickname
Der Spitzname wird benötigt, um eine Webadresse (Profiladresse) für viele Deiner persönlichen Seiten zu erstellen.
Auch wird dieser wie eine Email-Adresse genutzt, wenn eine Verbindung zu anderen Personen hergestellt werden soll. Auch wird dieser wie eine Email-Adresse genutzt, wenn eine Verbindung zu anderen Personen hergestellt werden soll.
Durch die Art, wie der Spitzname genutzt wird, gibt es bestimmte Einschränkungen. Er darf nur US-ASCII-Textzeichen und Nummern enthalten und er muss zudem mit einem Buchstaben beginnen. Durch die Art, wie der Spitzname genutzt wird, gibt es bestimmte Einschränkungen:
Er muss außerdem einzigartig im System sein.
Dieser Spitzname wird an vielen Stellen genutzt, um Deinen Account zu identifizieren, und kann daher später nicht mehr geändert werden. * **er muss mit einem Buchstaben beginnen**
* **er darf nur US-ASCII-Textzeichen und Nummern enthalten**
* **er muss einzigartig auf diesem Friendica-Knoten sein**
* **er kann später nicht mehr geändert werden**
Dieser Spitzname wird an vielen Stellen genutzt, um Deinen Account zu identifizieren, daher ist es nicht möglich ihn später zu ändern.
*Verzeichnis-Eintrag* ### Verzeichnis-Eintrag
Das Registrierungsformular erlaubt es dir, direkt auszuwählen, ob Du im [Onlineverzeichnis](https://dir.friendica.social/) (Friendica Directory) aufgelistet wirst oder nicht.
Das ist wie ein Telefonbuch und Du entscheidest, ob du darin eingetragen werden möchtest, oder nicht.
* Wir bitten dich, "Ja" zu wählen, damit Andere Dich finden können, so wie Du sie finden kannst
* Wählst Du "Nein", bist Du für Andere *nicht einfach auffindbar*
Das Registrierungsformular erlaubt es dir, direkt auszuwählen, ob Du im Onlineverzeichnis aufgelistet wirst oder nicht.
Das ist wie ein Telefonbuch und Du kannst entscheiden, nicht aufgeführt zu werden.
Wir bitten dich, "Ja" zu wählen, so dass dich andere Leute (Freunde, Familie etc.) finden können.
Wenn Du "Nein" wählst, wirst Du hauptsächlich unsichtbar sein und nur wenige Möglichkeiten zur Interaktion haben.
Was auch immer Du wählst, kann jederzeit nach dem Login in Deinen Account-Einstellungen geändert werden. Was auch immer Du wählst, kann jederzeit nach dem Login in Deinen Account-Einstellungen geändert werden.
*Registrierung* ### Registrierung
Sobald Du die nötigen Informationen eingegeben hast, klicke auf "Registrieren". Sobald Du die nötigen Informationen eingegeben hast, klicke auf "Registrieren".
Eine Email mit den Registrierungsdetails und Deinem Initialpasswort wird an die hinterlegte Email-Adresse geschickt. Eine Email mit den Registrierungsdetails und Deinem Initialpasswort wird an die hinterlegte Email-Adresse geschickt.
Bitte prüfe den Posteingang (inkl. dem Spam-Ordner). Bitte prüfe den Posteingang (inkl. dem Spam-Ordner).
**Login-Seite** ## Login-Seite
Gib auf der "Login"-Seite die Informationen ein, die Du mit der oben genannten Email erhalten hast. Gib auf der "Login"-Seite die Informationen ein, die Du mit der oben genannten Email erhalten hast.
Du kannst entweder Deinen Spitznamen oder die Email-Adresse als Login-Namen nutzen. Du kannst entweder Deinen Spitznamen oder die Email-Adresse als Login-Namen nutzen.
@ -83,25 +85,29 @@ Das Passwort muss genau so geschrieben werden, wie es in der Email steht; Groß-
Falls Du Schwierigkeiten beim Login hast, prüfe bitte, ob z. B. Deine Feststelltaste aktiv ist. Falls Du Schwierigkeiten beim Login hast, prüfe bitte, ob z. B. Deine Feststelltaste aktiv ist.
**Passwort ändern** ### Passwort ändern
Besuche nach Deinem ersten Login bitte die Einstellungsseite und wechsle das Passwort in eines, dass Du Dir merken kannst. Besuche nach Deinem ersten Login bitte die Einstellungsseite und wechsle das Passwort in eines, dass Du Dir merken kannst.
**Der Anfang** ## Die ersten Schritte
### Persönliche Daten exportieren
Du solltest dir als erstes Deinen neu erstellen [Account exportieren](uexport) unter Einstellungen/Persönliche Daten exportieren und an einem sicheren Ort verwahren.
In diesem Export (JSON-Datei) sind enthalten
* Deine Identität, die mit kryptographischen Schlüsseln ausgestattet ist
* Deine Kontakte
Dies ist z.B. dann nützlich wenn du mit deinem Account auf einen anderen Friendica Knoten umziehen willst, oder musst.
### Hilfe für Neulinge
Ein ['Tipp für neue Mitglieder'](newmember)-Link zeigt sich in den ersten beiden Wochen auf Deiner Startseite, um Dir erste Informationen zum Start zu bieten. Ein ['Tipp für neue Mitglieder'](newmember)-Link zeigt sich in den ersten beiden Wochen auf Deiner Startseite, um Dir erste Informationen zum Start zu bieten.
**Persönliche Daten exportieren** ## Schau Dir ebenfalls folgende Seiten an
Du kannst eine Kopie Deiner persönlichen Daten in einer JSON-Datei exportieren.
Gehe hierzu in Deinen Einstellungen auf "Persönliche Daten exportieren".
Dies ist z.B. dann nützlich wenn du mit deinem Account auf einen anderen Friendica Knoten umziehen möchstest.
Ein Grund hierfür könnte sein, dass der Server auf dem dieser Friendica Knoten läuft dauerhaft wegen eines Hardware Problems ausfällt.
**Schau Dir ebenfalls folgende Seiten an**
* [Profile](help/Profiles) * [Profile](help/Profiles)
@ -109,3 +115,10 @@ Ein Grund hierfür könnte sein, dass der Server auf dem dieser Friendica Knoten
* [Account löschen](help/Remove-Account) * [Account löschen](help/Remove-Account)
### Der eigene Friendica-Knoten
Wenn Du Deinen eigenen Friendica-Knoten auf einem Server aufsetzen willst, kannst Du das ebenfalls machen.
Besuche die [Friendica-Webseite](https://friendi.ca), um den Code mit den Installationsanleitungen herunterzuladen.
Es ist ein einfacher Installationsprozess, den jeder mit ein wenig technischen Erfahrungen im Webseiten-Hosting oder mit grundlegenden Linux-Erfahrungen handhaben kann.

View file

@ -769,7 +769,7 @@ function conversation(App $a, array $items, Pager $pager, $mode, $update, $previ
'$mode' => $mode, '$mode' => $mode,
'$user' => $a->user, '$user' => $a->user,
'$threads' => $threads, '$threads' => $threads,
'$dropping' => ($page_dropping && Feature::isEnabled(local_user(), 'multi_delete') ? L10n::t('Delete Selected Items') : False), '$dropping' => ($page_dropping ? L10n::t('Delete Selected Items') : False),
]); ]);
return $o; return $o;
@ -1163,7 +1163,7 @@ function status_editor(App $a, $x, $notes_cid = 0, $popup = false)
'$lockstate' => $x['lockstate'], '$lockstate' => $x['lockstate'],
'$bang' => $x['bang'], '$bang' => $x['bang'],
'$profile_uid' => $x['profile_uid'], '$profile_uid' => $x['profile_uid'],
'$preview' => Feature::isEnabled($x['profile_uid'], 'preview') ? L10n::t('Preview') : '', '$preview' => L10n::t('Preview'),
'$jotplugins' => $jotplugins, '$jotplugins' => $jotplugins,
'$notes_cid' => $notes_cid, '$notes_cid' => $notes_cid,
'$sourceapp' => L10n::t($a->sourcename), '$sourceapp' => L10n::t($a->sourcename),

View file

@ -352,7 +352,7 @@ function drop_item($id, $return = '')
// locate item to be deleted // locate item to be deleted
$fields = ['id', 'uid', 'guid', 'contact-id', 'deleted', 'gravity']; $fields = ['id', 'uid', 'guid', 'contact-id', 'deleted', 'gravity', parent];
$item = Item::selectFirstForUser(local_user(), $fields, ['id' => $id]); $item = Item::selectFirstForUser(local_user(), $fields, ['id' => $id]);
if (!DBA::isResult($item)) { if (!DBA::isResult($item)) {
@ -408,6 +408,11 @@ function drop_item($id, $return = '')
} }
$is_comment = ($item['gravity'] == GRAVITY_COMMENT) ? true : false; $is_comment = ($item['gravity'] == GRAVITY_COMMENT) ? true : false;
$parentitem = null;
if (!empty($item['parent'])){
$fields = ['guid'];
$parentitem = Item::selectFirstForUser(local_user(), $fields, ['id' => $item['parent']]);
}
// delete the item // delete the item
Item::deleteForUser(['id' => $item['id']], local_user()); Item::deleteForUser(['id' => $item['id']], local_user());
@ -417,15 +422,29 @@ function drop_item($id, $return = '')
// removes update_* from return_url to ignore Ajax refresh // removes update_* from return_url to ignore Ajax refresh
$return_url = str_replace("update_", "", $return_url); $return_url = str_replace("update_", "", $return_url);
// if unknown location or top level post called from display // Check if delete a comment
if (empty($return_url) || ((strpos($return_url, 'display') !== false) AND (!$is_comment))) { if ($is_comment) {
// Return to parent guid
if (!empty($parentitem)) {
$a->internalRedirect('display/' . $parentitem['guid']);
//NOTREACHED
}
// In case something goes wrong
else {
$a->internalRedirect('network'); $a->internalRedirect('network');
//NOTREACHED //NOTREACHED
} }
}
else { else {
// if unknown location or deleting top level post called from display
if (empty($return_url) || strpos($return_url, 'display') !== false) {
$a->internalRedirect('network');
//NOTREACHED
} else {
$a->internalRedirect($return_url); $a->internalRedirect($return_url);
//NOTREACHED //NOTREACHED
} }
}
} else { } else {
notice(L10n::t('Permission denied.') . EOL); notice(L10n::t('Permission denied.') . EOL);
$a->internalRedirect('display/' . $item['guid']); $a->internalRedirect('display/' . $item['guid']);

View file

@ -1139,6 +1139,7 @@ function admin_page_site_post(App $a)
$dbclean = ((x($_POST,'dbclean')) ? True : False); $dbclean = ((x($_POST,'dbclean')) ? True : False);
$dbclean_expire_days = ((x($_POST,'dbclean_expire_days')) ? intval($_POST['dbclean_expire_days']) : 0); $dbclean_expire_days = ((x($_POST,'dbclean_expire_days')) ? intval($_POST['dbclean_expire_days']) : 0);
$dbclean_unclaimed = ((x($_POST,'dbclean_unclaimed')) ? intval($_POST['dbclean_unclaimed']) : 0); $dbclean_unclaimed = ((x($_POST,'dbclean_unclaimed')) ? intval($_POST['dbclean_unclaimed']) : 0);
$dbclean_expire_conv = ((x($_POST,'dbclean_expire_conv')) ? intval($_POST['dbclean_expire_conv']) : 0);
$suppress_tags = ((x($_POST,'suppress_tags')) ? True : False); $suppress_tags = ((x($_POST,'suppress_tags')) ? True : False);
$itemcache = ((x($_POST,'itemcache')) ? Strings::escapeTags(trim($_POST['itemcache'])) : ''); $itemcache = ((x($_POST,'itemcache')) ? Strings::escapeTags(trim($_POST['itemcache'])) : '');
$itemcache_duration = ((x($_POST,'itemcache_duration')) ? intval($_POST['itemcache_duration']) : 0); $itemcache_duration = ((x($_POST,'itemcache_duration')) ? intval($_POST['itemcache_duration']) : 0);
@ -1298,6 +1299,7 @@ function admin_page_site_post(App $a)
Config::set('system', 'dbclean', $dbclean); Config::set('system', 'dbclean', $dbclean);
Config::set('system', 'dbclean-expire-days', $dbclean_expire_days); Config::set('system', 'dbclean-expire-days', $dbclean_expire_days);
Config::set('system', 'dbclean_expire_conversation', $dbclean_expire_conv);
if ($dbclean_unclaimed == 0) { if ($dbclean_unclaimed == 0) {
$dbclean_unclaimed = $dbclean_expire_days; $dbclean_unclaimed = $dbclean_expire_days;
@ -1562,6 +1564,7 @@ function admin_page_site(App $a)
'$dbclean' => ['dbclean', L10n::t("Clean database"), Config::get('system','dbclean', false), L10n::t("Remove old remote items, orphaned database records and old content from some other helper tables.")], '$dbclean' => ['dbclean', L10n::t("Clean database"), Config::get('system','dbclean', false), L10n::t("Remove old remote items, orphaned database records and old content from some other helper tables.")],
'$dbclean_expire_days' => ['dbclean_expire_days', L10n::t("Lifespan of remote items"), Config::get('system','dbclean-expire-days', 0), L10n::t("When the database cleanup is enabled, this defines the days after which remote items will be deleted. Own items, and marked or filed items are always kept. 0 disables this behaviour.")], '$dbclean_expire_days' => ['dbclean_expire_days', L10n::t("Lifespan of remote items"), Config::get('system','dbclean-expire-days', 0), L10n::t("When the database cleanup is enabled, this defines the days after which remote items will be deleted. Own items, and marked or filed items are always kept. 0 disables this behaviour.")],
'$dbclean_unclaimed' => ['dbclean_unclaimed', L10n::t("Lifespan of unclaimed items"), Config::get('system','dbclean-expire-unclaimed', 90), L10n::t("When the database cleanup is enabled, this defines the days after which unclaimed remote items (mostly content from the relay) will be deleted. Default value is 90 days. Defaults to the general lifespan value of remote items if set to 0.")], '$dbclean_unclaimed' => ['dbclean_unclaimed', L10n::t("Lifespan of unclaimed items"), Config::get('system','dbclean-expire-unclaimed', 90), L10n::t("When the database cleanup is enabled, this defines the days after which unclaimed remote items (mostly content from the relay) will be deleted. Default value is 90 days. Defaults to the general lifespan value of remote items if set to 0.")],
'$dbclean_expire_conv' => ['dbclean_expire_conv', L10n::t("Lifespan of raw conversation data"), Config::get('system','dbclean_expire_conversation', 90), L10n::t("The conversation data is used for ActivityPub and OStatus, as well as for debug purposes. It should be save to remove it after 14 days, default is 90 days.")],
'$itemcache' => ['itemcache', L10n::t("Path to item cache"), Config::get('system','itemcache'), L10n::t("The item caches buffers generated bbcode and external images.")], '$itemcache' => ['itemcache', L10n::t("Path to item cache"), Config::get('system','itemcache'), L10n::t("The item caches buffers generated bbcode and external images.")],
'$itemcache_duration' => ['itemcache_duration', L10n::t("Cache duration in seconds"), Config::get('system','itemcache_duration'), L10n::t("How long should the cache files be hold? Default value is 86400 seconds \x28One day\x29. To disable the item cache, set the value to -1.")], '$itemcache_duration' => ['itemcache_duration', L10n::t("Cache duration in seconds"), Config::get('system','itemcache_duration'), L10n::t("How long should the cache files be hold? Default value is 86400 seconds \x28One day\x29. To disable the item cache, set the value to -1.")],
'$max_comments' => ['max_comments', L10n::t("Maximum numbers of comments per post"), Config::get('system','max_comments'), L10n::t("How much comments should be shown for each post? Default value is 100.")], '$max_comments' => ['max_comments', L10n::t("Maximum numbers of comments per post"), Config::get('system','max_comments'), L10n::t("How much comments should be shown for each post? Default value is 100.")],

View file

@ -160,9 +160,8 @@ function network_init(App $a)
$a->page['aside'] = ''; $a->page['aside'] = '';
} }
$a->page['aside'] .= (Feature::isEnabled(local_user(), 'groups') ? $a->page['aside'] .= Group::sidebarWidget('network/0', 'network', 'standard', $group_id);
Group::sidebarWidget('network/0', 'network', 'standard', $group_id) : ''); $a->page['aside'] .= ForumManager::widget(local_user(), $cid);
$a->page['aside'] .= (Feature::isEnabled(local_user(), 'forumlist_widget') ? ForumManager::widget(local_user(), $cid) : '');
$a->page['aside'] .= posted_date_widget('network', local_user(), false); $a->page['aside'] .= posted_date_widget('network', local_user(), false);
$a->page['aside'] .= Widget::networks('network', (x($_GET, 'nets') ? $_GET['nets'] : '')); $a->page['aside'] .= Widget::networks('network', (x($_GET, 'nets') ? $_GET['nets'] : ''));
$a->page['aside'] .= saved_searches($search); $a->page['aside'] .= saved_searches($search);
@ -171,10 +170,6 @@ function network_init(App $a)
function saved_searches($search) function saved_searches($search)
{ {
if (!Feature::isEnabled(local_user(), 'savedsearch')) {
return '';
}
$a = get_app(); $a = get_app();
$srchurl = '/network?f=' $srchurl = '/network?f='
@ -993,7 +988,6 @@ function network_tabs(App $a)
], ],
]; ];
if (Feature::isEnabled(local_user(), 'personal_tab')) {
$tabs[] = [ $tabs[] = [
'label' => L10n::t('Personal'), 'label' => L10n::t('Personal'),
'url' => str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&conv=1', 'url' => str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&conv=1',
@ -1002,7 +996,6 @@ function network_tabs(App $a)
'id' => 'personal-tab', 'id' => 'personal-tab',
'accesskey' => 'r', 'accesskey' => 'r',
]; ];
}
if (Feature::isEnabled(local_user(), 'new_tab')) { if (Feature::isEnabled(local_user(), 'new_tab')) {
$tabs[] = [ $tabs[] = [
@ -1026,7 +1019,6 @@ function network_tabs(App $a)
]; ];
} }
if (Feature::isEnabled(local_user(), 'star_posts')) {
$tabs[] = [ $tabs[] = [
'label' => L10n::t('Starred'), 'label' => L10n::t('Starred'),
'url' => str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&star=1', 'url' => str_replace('/new', '', $cmd) . ((x($_GET,'cid')) ? '/?f=&cid=' . $_GET['cid'] : '/?f=') . '&star=1',
@ -1035,7 +1027,6 @@ function network_tabs(App $a)
'id' => 'starred-posts-tab', 'id' => 'starred-posts-tab',
'accesskey' => 'm', 'accesskey' => 'm',
]; ];
}
// save selected tab, but only if not in file mode // save selected tab, but only if not in file mode
if (!x($_GET, 'file')) { if (!x($_GET, 'file')) {

View file

@ -1480,7 +1480,7 @@ function photos_content(App $a)
$likebuttons = Renderer::replaceMacros($like_tpl, [ $likebuttons = Renderer::replaceMacros($like_tpl, [
'$id' => $link_item['id'], '$id' => $link_item['id'],
'$likethis' => L10n::t("I like this \x28toggle\x29"), '$likethis' => L10n::t("I like this \x28toggle\x29"),
'$nolike' => (Feature::isEnabled(local_user(), 'dislike') ? L10n::t("I don't like this \x28toggle\x29") : ''), '$nolike' => L10n::t("I don't like this \x28toggle\x29"),
'$wait' => L10n::t('Please wait'), '$wait' => L10n::t('Please wait'),
'$return_path' => $a->query_string, '$return_path' => $a->query_string,
]); ]);
@ -1607,9 +1607,7 @@ function photos_content(App $a)
} }
} }
$response_verbs = ['like']; $response_verbs = ['like'];
if (Feature::isEnabled($owner_uid, 'dislike')) {
$response_verbs[] = 'dislike'; $response_verbs[] = 'dislike';
}
$responses = get_responses($conv_responses, $response_verbs, '', $link_item); $responses = get_responses($conv_responses, $response_verbs, '', $link_item);
$paginate = $pager->renderFull($total); $paginate = $pager->renderFull($total);

View file

@ -150,7 +150,6 @@ function ping_init(App $a)
} }
if ($network_count) { if ($network_count) {
if (intval(Feature::isEnabled(local_user(), 'groups'))) {
// Find out how unseen network posts are spread across groups // Find out how unseen network posts are spread across groups
$group_counts = Group::countUnseen(); $group_counts = Group::countUnseen();
if (DBA::isResult($group_counts)) { if (DBA::isResult($group_counts)) {
@ -160,9 +159,7 @@ function ping_init(App $a)
} }
} }
} }
}
if (intval(Feature::isEnabled(local_user(), 'forumlist_widget'))) {
$forum_counts = ForumManager::countUnseenItems(); $forum_counts = ForumManager::countUnseenItems();
if (DBA::isResult($forum_counts)) { if (DBA::isResult($forum_counts)) {
foreach ($forum_counts as $forum_count) { foreach ($forum_counts as $forum_count) {
@ -172,7 +169,6 @@ function ping_init(App $a)
} }
} }
} }
}
$intros1 = q( $intros1 = q(
"SELECT `intro`.`id`, `intro`.`datetime`, "SELECT `intro`.`id`, `intro`.`datetime`,

View file

@ -26,9 +26,6 @@ function search_saved_searches() {
$o = ''; $o = '';
$search = ((x($_GET,'search')) ? Strings::escapeTags(trim(rawurldecode($_GET['search']))) : ''); $search = ((x($_GET,'search')) ? Strings::escapeTags(trim(rawurldecode($_GET['search']))) : '');
if (!Feature::isEnabled(local_user(),'savedsearch'))
return $o;
$r = q("SELECT `id`,`term` FROM `search` WHERE `uid` = %d", $r = q("SELECT `id`,`term` FROM `search` WHERE `uid` = %d",
intval(local_user()) intval(local_user())
); );

View file

@ -78,7 +78,7 @@ class ContactSelector
public static function networkToName($network, $profile = "") public static function networkToName($network, $profile = "")
{ {
$nets = [ $nets = [
Protocol::DFRN => L10n::t('Friendica'), Protocol::DFRN => L10n::t('DFRN'),
Protocol::OSTATUS => L10n::t('OStatus'), Protocol::OSTATUS => L10n::t('OStatus'),
Protocol::FEED => L10n::t('RSS/Atom'), Protocol::FEED => L10n::t('RSS/Atom'),
Protocol::MAIL => L10n::t('Email'), Protocol::MAIL => L10n::t('Email'),

View file

@ -86,7 +86,6 @@ class Feature
// Post composition // Post composition
'composition' => [ 'composition' => [
L10n::t('Post Composition Features'), L10n::t('Post Composition Features'),
['preview', L10n::t('Post Preview'), L10n::t('Allow previewing posts and comments before publishing them'), false, Config::get('feature_lock', 'preview', false)],
['aclautomention', L10n::t('Auto-mention Forums'), L10n::t('Add/remove mention when a forum page is selected/deselected in ACL window.'), false, Config::get('feature_lock', 'aclautomention', false)], ['aclautomention', L10n::t('Auto-mention Forums'), L10n::t('Add/remove mention when a forum page is selected/deselected in ACL window.'), false, Config::get('feature_lock', 'aclautomention', false)],
], ],
@ -94,16 +93,12 @@ class Feature
'widgets' => [ 'widgets' => [
L10n::t('Network Sidebar'), L10n::t('Network Sidebar'),
['archives', L10n::t('Archives'), L10n::t('Ability to select posts by date ranges'), false, Config::get('feature_lock', 'archives', false)], ['archives', L10n::t('Archives'), L10n::t('Ability to select posts by date ranges'), false, Config::get('feature_lock', 'archives', false)],
['forumlist_widget', L10n::t('List Forums'), L10n::t('Enable widget to display the forums your are connected with'), true, Config::get('feature_lock', 'forumlist_widget', false)], ['networks', L10n::t('Protocol Filter'), L10n::t('Enable widget to display Network posts only from selected protocols'), false, Config::get('feature_lock', 'networks', false)],
['groups', L10n::t('Group Filter'), L10n::t('Enable widget to display Network posts only from selected group'), false, Config::get('feature_lock', 'groups', false)],
['networks', L10n::t('Network Filter'), L10n::t('Enable widget to display Network posts only from selected network'), false, Config::get('feature_lock', 'networks', false)],
['savedsearch', L10n::t('Saved Searches'), L10n::t('Save search terms for re-use'), false, Config::get('feature_lock', 'savedsearch', false)],
], ],
// Network tabs // Network tabs
'net_tabs' => [ 'net_tabs' => [
L10n::t('Network Tabs'), L10n::t('Network Tabs'),
['personal_tab', L10n::t('Network Personal Tab'), L10n::t('Enable tab to display only Network posts that you\'ve interacted on'), false, Config::get('feature_lock', 'personal_tab', false)],
['new_tab', L10n::t('Network New Tab'), L10n::t("Enable tab to display only new Network posts \x28from the last 12 hours\x29"), false, Config::get('feature_lock', 'new_tab', false)], ['new_tab', L10n::t('Network New Tab'), L10n::t("Enable tab to display only new Network posts \x28from the last 12 hours\x29"), false, Config::get('feature_lock', 'new_tab', false)],
['link_tab', L10n::t('Network Shared Links Tab'), L10n::t('Enable tab to display only Network posts with links in them'), false, Config::get('feature_lock', 'link_tab', false)], ['link_tab', L10n::t('Network Shared Links Tab'), L10n::t('Enable tab to display only Network posts with links in them'), false, Config::get('feature_lock', 'link_tab', false)],
], ],
@ -111,14 +106,7 @@ class Feature
// Item tools // Item tools
'tools' => [ 'tools' => [
L10n::t('Post/Comment Tools'), L10n::t('Post/Comment Tools'),
['multi_delete', L10n::t('Multiple Deletion'), L10n::t('Select and delete multiple posts/comments at once'), false, Config::get('feature_lock', 'multi_delete', false)],
['edit_posts', L10n::t('Edit Sent Posts'), L10n::t('Edit and correct posts and comments after sending'), false, Config::get('feature_lock', 'edit_posts', false)],
['commtag', L10n::t('Tagging'), L10n::t('Ability to tag existing posts'), false, Config::get('feature_lock', 'commtag', false)],
['categories', L10n::t('Post Categories'), L10n::t('Add categories to your posts'), false, Config::get('feature_lock', 'categories', false)], ['categories', L10n::t('Post Categories'), L10n::t('Add categories to your posts'), false, Config::get('feature_lock', 'categories', false)],
['filing', L10n::t('Saved Folders'), L10n::t('Ability to file posts under folders'), false, Config::get('feature_lock', 'filing', false)],
['dislike', L10n::t('Dislike Posts'), L10n::t('Ability to dislike posts/comments'), false, Config::get('feature_lock', 'dislike', false)],
['star_posts', L10n::t('Star Posts'), L10n::t('Ability to mark special posts with a star indicator'), false, Config::get('feature_lock', 'star_posts', false)],
['ignore_posts', L10n::t('Mute Post Notifications'), L10n::t('Ability to mute notifications for a thread'), false, Config::get('feature_lock', 'ignore_posts', false)],
], ],
// Advanced Profile Settings // Advanced Profile Settings

View file

@ -93,10 +93,6 @@ class ForumManager
*/ */
public static function widget($uid, $cid = 0) public static function widget($uid, $cid = 0)
{ {
if (! intval(Feature::isEnabled(local_user(), 'forumlist_widget'))) {
return;
}
$o = ''; $o = '';
//sort by last updated item //sort by last updated item

View file

@ -966,7 +966,7 @@ class HTML
'$action_url' => $url, '$action_url' => $url,
'$search_label' => L10n::t('Search'), '$search_label' => L10n::t('Search'),
'$save_label' => $save_label, '$save_label' => $save_label,
'$savedsearch' => local_user() && Feature::isEnabled(local_user(), 'savedsearch'), '$savedsearch' => 'savedsearch',
'$search_hint' => L10n::t('@name, !forum, #tags, content'), '$search_hint' => L10n::t('@name, !forum, #tags, content'),
'$mode' => $mode '$mode' => $mode
]; ];

View file

@ -155,10 +155,10 @@ class Widget
} }
return Renderer::replaceMacros(Renderer::getMarkupTemplate('nets.tpl'), array( return Renderer::replaceMacros(Renderer::getMarkupTemplate('nets.tpl'), array(
'$title' => L10n::t('Networks'), '$title' => L10n::t('Protocols'),
'$desc' => '', '$desc' => '',
'$sel_all' => (($selected == '') ? 'selected' : ''), '$sel_all' => (($selected == '') ? 'selected' : ''),
'$all' => L10n::t('All Networks'), '$all' => L10n::t('All Protocols'),
'$nets' => $nets, '$nets' => $nets,
'$base' => $baseurl, '$base' => $baseurl,
)); ));
@ -176,10 +176,6 @@ class Widget
return ''; return '';
} }
if (!Feature::isEnabled(local_user(), 'filing')) {
return '';
}
$saved = PConfig::get(local_user(), 'system', 'filetags'); $saved = PConfig::get(local_user(), 'system', 'filetags');
if (!strlen($saved)) { if (!strlen($saved)) {
return; return;

View file

@ -157,6 +157,8 @@ class Post extends BaseObject
$shareable = in_array($conv->getProfileOwner(), [0, local_user()]) && $item['private'] != 1; $shareable = in_array($conv->getProfileOwner(), [0, local_user()]) && $item['private'] != 1;
$edpost = false;
if (local_user()) { if (local_user()) {
if (Strings::compareLink($a->contact['url'], $item['author-link'])) { if (Strings::compareLink($a->contact['url'], $item['author-link'])) {
if ($item["event-id"] != 0) { if ($item["event-id"] != 0) {
@ -166,8 +168,6 @@ class Post extends BaseObject
} }
} }
$dropping = in_array($item['uid'], [0, local_user()]); $dropping = in_array($item['uid'], [0, local_user()]);
} else {
$edpost = false;
} }
// Editing on items of not subscribed users isn't currently possible // Editing on items of not subscribed users isn't currently possible
@ -202,7 +202,7 @@ class Post extends BaseObject
$drop = [ $drop = [
'dropping' => $dropping, 'dropping' => $dropping,
'pagedrop' => ((Feature::isEnabled($conv->getProfileOwner(), 'multi_delete')) ? $item['pagedrop'] : ''), 'pagedrop' => $item['pagedrop'],
'select' => L10n::t('Select'), 'select' => L10n::t('Select'),
'delete' => $delete, 'delete' => $delete,
]; ];
@ -294,13 +294,11 @@ class Post extends BaseObject
'starred' => L10n::t('starred'), 'starred' => L10n::t('starred'),
]; ];
if (Feature::isEnabled($conv->getProfileOwner(), 'commtag')) {
$tagger = [ $tagger = [
'add' => L10n::t("add tag"), 'add' => L10n::t("add tag"),
'class' => "", 'class' => "",
]; ];
} }
}
} else { } else {
$indent = 'comment'; $indent = 'comment';
} }
@ -308,7 +306,7 @@ class Post extends BaseObject
if ($conv->isWritable()) { if ($conv->isWritable()) {
$buttons = [ $buttons = [
'like' => [L10n::t("I like this \x28toggle\x29"), L10n::t("like")], 'like' => [L10n::t("I like this \x28toggle\x29"), L10n::t("like")],
'dislike' => Feature::isEnabled($conv->getProfileOwner(), 'dislike') ? [L10n::t("I don't like this \x28toggle\x29"), L10n::t("dislike")] : '', 'dislike' => [L10n::t("I don't like this \x28toggle\x29"), L10n::t("dislike")],
]; ];
if ($shareable) { if ($shareable) {
$buttons['share'] = [L10n::t('Share this'), L10n::t('share')]; $buttons['share'] = [L10n::t('Share this'), L10n::t('share')];
@ -401,12 +399,12 @@ class Post extends BaseObject
'owner_photo' => $a->removeBaseURL(ProxyUtils::proxifyUrl($item['owner-avatar'], false, ProxyUtils::SIZE_THUMB)), 'owner_photo' => $a->removeBaseURL(ProxyUtils::proxifyUrl($item['owner-avatar'], false, ProxyUtils::SIZE_THUMB)),
'owner_name' => htmlentities($owner_name_e), 'owner_name' => htmlentities($owner_name_e),
'plink' => Item::getPlink($item), 'plink' => Item::getPlink($item),
'edpost' => Feature::isEnabled($conv->getProfileOwner(), 'edit_posts') ? $edpost : '', 'edpost' => $edpost,
'isstarred' => $isstarred, 'isstarred' => $isstarred,
'star' => Feature::isEnabled($conv->getProfileOwner(), 'star_posts') ? $star : '', 'star' => $star,
'ignore' => Feature::isEnabled($conv->getProfileOwner(), 'ignore_posts') ? $ignore : '', 'ignore' => $ignore,
'tagger' => $tagger, 'tagger' => $tagger,
'filer' => Feature::isEnabled($conv->getProfileOwner(), 'filing') ? $filer : '', 'filer' => $filer,
'drop' => $drop, 'drop' => $drop,
'vote' => $buttons, 'vote' => $buttons,
'like' => $responses['like']['output'], 'like' => $responses['like']['output'],
@ -820,7 +818,7 @@ class Post extends BaseObject
'$edurl' => L10n::t('Link'), '$edurl' => L10n::t('Link'),
'$edattach' => L10n::t('Link or Media'), '$edattach' => L10n::t('Link or Media'),
'$prompttext' => L10n::t('Please enter a image/video/audio/webpage URL:'), '$prompttext' => L10n::t('Please enter a image/video/audio/webpage URL:'),
'$preview' => ((Feature::isEnabled($conv->getProfileOwner(), 'preview')) ? L10n::t('Preview') : ''), '$preview' => L10n::t('Preview'),
'$indent' => $indent, '$indent' => $indent,
'$sourceapp' => L10n::t($a->sourcename), '$sourceapp' => L10n::t($a->sourcename),
'$ww' => $conv->getMode() === 'network' ? $ww : '', '$ww' => $conv->getMode() === 'network' ? $ww : '',

View file

@ -1263,10 +1263,11 @@ class OStatus
* @param object $doc XML document * @param object $doc XML document
* @param array $owner Contact data of the poster * @param array $owner Contact data of the poster
* @param string $filter The related feed filter (activity, posts or comments) * @param string $filter The related feed filter (activity, posts or comments)
* @param bool $feed_mode Behave like a regular feed for users if true
* *
* @return object header root element * @return object header root element
*/ */
private static function addHeader(DOMDocument $doc, array $owner, $filter) private static function addHeader(DOMDocument $doc, array $owner, $filter, $feed_mode = false)
{ {
$a = get_app(); $a = get_app();
@ -1283,10 +1284,23 @@ class OStatus
$root->setAttribute("xmlns:mastodon", NAMESPACE_MASTODON); $root->setAttribute("xmlns:mastodon", NAMESPACE_MASTODON);
$title = ''; $title = '';
$selfUri = '/feed/' . $owner["nick"] . '/';
switch ($filter) { switch ($filter) {
case 'activity': $title = L10n::t('%s\'s timeline', $owner['name']); break; case 'activity':
case 'posts' : $title = L10n::t('%s\'s posts' , $owner['name']); break; $title = L10n::t('%s\'s timeline', $owner['name']);
case 'comments': $title = L10n::t('%s\'s comments', $owner['name']); break; $selfUri .= $filter;
break;
case 'posts':
$title = L10n::t('%s\'s posts', $owner['name']);
break;
case 'comments':
$title = L10n::t('%s\'s comments', $owner['name']);
$selfUri .= $filter;
break;
}
if (!$feed_mode) {
$selfUri = "/dfrn_poll/" . $owner["nick"];
} }
$attributes = ["uri" => "https://friendi.ca", "version" => FRIENDICA_VERSION . "-" . DB_UPDATE_VERSION]; $attributes = ["uri" => "https://friendi.ca", "version" => FRIENDICA_VERSION . "-" . DB_UPDATE_VERSION];
@ -1320,8 +1334,7 @@ class OStatus
$attributes = ["href" => System::baseUrl() . "/salmon/" . $owner["nick"], "rel" => "http://salmon-protocol.org/ns/salmon-mention"]; $attributes = ["href" => System::baseUrl() . "/salmon/" . $owner["nick"], "rel" => "http://salmon-protocol.org/ns/salmon-mention"];
XML::addElement($doc, $root, "link", "", $attributes); XML::addElement($doc, $root, "link", "", $attributes);
$attributes = ["href" => System::baseUrl() . "/dfrn_poll/" . $owner["nick"], $attributes = ["href" => System::baseUrl() . $selfUri, "rel" => "self", "type" => "application/atom+xml"];
"rel" => "self", "type" => "application/atom+xml"];
XML::addElement($doc, $root, "link", "", $attributes); XML::addElement($doc, $root, "link", "", $attributes);
if ($owner['account-type'] == Contact::ACCOUNT_TYPE_COMMUNITY) { if ($owner['account-type'] == Contact::ACCOUNT_TYPE_COMMUNITY) {
@ -2206,7 +2219,7 @@ class OStatus
$doc = new DOMDocument('1.0', 'utf-8'); $doc = new DOMDocument('1.0', 'utf-8');
$doc->formatOutput = true; $doc->formatOutput = true;
$root = self::addHeader($doc, $owner, $filter); $root = self::addHeader($doc, $owner, $filter, $feed_mode);
foreach ($items as $item) { foreach ($items as $item) {
if (Config::get('system', 'ostatus_debug')) { if (Config::get('system', 'ostatus_debug')) {

View file

@ -94,7 +94,7 @@ class ApiTest extends DatabaseTest
$this->assertEquals($this->selfUser['id'], $user['uid']); $this->assertEquals($this->selfUser['id'], $user['uid']);
$this->assertEquals($this->selfUser['id'], $user['cid']); $this->assertEquals($this->selfUser['id'], $user['cid']);
$this->assertEquals(1, $user['self']); $this->assertEquals(1, $user['self']);
$this->assertEquals('Friendica', $user['location']); $this->assertEquals('DFRN', $user['location']);
$this->assertEquals($this->selfUser['name'], $user['name']); $this->assertEquals($this->selfUser['name'], $user['name']);
$this->assertEquals($this->selfUser['nick'], $user['screen_name']); $this->assertEquals($this->selfUser['nick'], $user['screen_name']);
$this->assertEquals('dfrn', $user['network']); $this->assertEquals('dfrn', $user['network']);
@ -1289,7 +1289,7 @@ class ApiTest extends DatabaseTest
$result = api_users_show('json'); $result = api_users_show('json');
// We can't use assertSelfUser() here because the user object is missing some properties. // We can't use assertSelfUser() here because the user object is missing some properties.
$this->assertEquals($this->selfUser['id'], $result['user']['cid']); $this->assertEquals($this->selfUser['id'], $result['user']['cid']);
$this->assertEquals('Friendica', $result['user']['location']); $this->assertEquals('DFRN', $result['user']['location']);
$this->assertEquals($this->selfUser['name'], $result['user']['name']); $this->assertEquals($this->selfUser['name'], $result['user']['name']);
$this->assertEquals($this->selfUser['nick'], $result['user']['screen_name']); $this->assertEquals($this->selfUser['nick'], $result['user']['screen_name']);
$this->assertEquals('dfrn', $result['user']['network']); $this->assertEquals('dfrn', $result['user']['network']);
@ -3296,7 +3296,7 @@ class ApiTest extends DatabaseTest
$result = api_account_update_profile('json'); $result = api_account_update_profile('json');
// We can't use assertSelfUser() here because the user object is missing some properties. // We can't use assertSelfUser() here because the user object is missing some properties.
$this->assertEquals($this->selfUser['id'], $result['user']['cid']); $this->assertEquals($this->selfUser['id'], $result['user']['cid']);
$this->assertEquals('Friendica', $result['user']['location']); $this->assertEquals('DFRN', $result['user']['location']);
$this->assertEquals($this->selfUser['nick'], $result['user']['screen_name']); $this->assertEquals($this->selfUser['nick'], $result['user']['screen_name']);
$this->assertEquals('dfrn', $result['user']['network']); $this->assertEquals('dfrn', $result['user']['network']);
$this->assertEquals('new_name', $result['user']['name']); $this->assertEquals('new_name', $result['user']['name']);
@ -3650,7 +3650,7 @@ class ApiTest extends DatabaseTest
$result = api_friendica_profile_show('json'); $result = api_friendica_profile_show('json');
// We can't use assertSelfUser() here because the user object is missing some properties. // We can't use assertSelfUser() here because the user object is missing some properties.
$this->assertEquals($this->selfUser['id'], $result['$result']['friendica_owner']['cid']); $this->assertEquals($this->selfUser['id'], $result['$result']['friendica_owner']['cid']);
$this->assertEquals('Friendica', $result['$result']['friendica_owner']['location']); $this->assertEquals('DFRN', $result['$result']['friendica_owner']['location']);
$this->assertEquals($this->selfUser['name'], $result['$result']['friendica_owner']['name']); $this->assertEquals($this->selfUser['name'], $result['$result']['friendica_owner']['name']);
$this->assertEquals($this->selfUser['nick'], $result['$result']['friendica_owner']['screen_name']); $this->assertEquals($this->selfUser['nick'], $result['$result']['friendica_owner']['screen_name']);
$this->assertEquals('dfrn', $result['$result']['friendica_owner']['network']); $this->assertEquals('dfrn', $result['$result']['friendica_owner']['network']);

View file

@ -142,6 +142,7 @@
{{include file="field_checkbox.tpl" field=$dbclean}} {{include file="field_checkbox.tpl" field=$dbclean}}
{{include file="field_input.tpl" field=$dbclean_expire_days}} {{include file="field_input.tpl" field=$dbclean_expire_days}}
{{include file="field_input.tpl" field=$dbclean_unclaimed}} {{include file="field_input.tpl" field=$dbclean_unclaimed}}
{{include file="field_input.tpl" field=$dbclean_expire_conv}}
<div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div> <div class="submit"><input type="submit" name="page_site" value="{{$submit|escape:'html'}}" /></div>
<h3>{{$worker_title}}</h3> <h3>{{$worker_title}}</h3>