diff options
-rw-r--r-- | LICENSE | 2 | ||||
-rw-r--r-- | doc/de/features.bb | 127 | ||||
-rw-r--r-- | doc/de/main.bb | 2 | ||||
-rwxr-xr-x | include/items.php | 2 | ||||
-rw-r--r-- | include/notifier.php | 1 | ||||
-rw-r--r-- | include/text.php | 30 | ||||
-rw-r--r-- | mod/acl.php | 3 | ||||
-rw-r--r-- | mod/search_ac.php | 48 | ||||
-rw-r--r-- | version.inc | 2 | ||||
-rw-r--r-- | view/js/autocomplete.js | 44 | ||||
-rw-r--r-- | view/js/mod_network.js | 2 |
11 files changed, 186 insertions, 77 deletions
@@ -1,4 +1,4 @@ -Copyright (c) 2010-2014 RedMatrix +Copyright (c) 2010-2015 RedMatrix All rights reserved. Permission is hereby granted, free of charge, to any person obtaining a copy diff --git a/doc/de/features.bb b/doc/de/features.bb index 41dee301a..766c28612 100644 --- a/doc/de/features.bb +++ b/doc/de/features.bb @@ -1,6 +1,6 @@ -[size=large][b]Features der Red-Matrix[/b][/size] +[size=large][b]Features der Redmatrix[/b][/size] -Die Red-Matrix ist ein Allzweck-Kommunikationsnetzwerk mit einigen einzigartigen Features. Sie wurde für eine große Bandbreite von Nutzern entwickelt, von Nutzern sozialer Netzwerke über technisch nicht interessierte Blogger bis hin zu PHP-Experten und erfahrenen Systemadministratoren. +Die Redmatrix ist ein Allzweck-Kommunikationsnetzwerk mit einigen einzigartigen Features. Sie wurde für eine große Bandbreite von Nutzern entwickelt, von Nutzern sozialer Netzwerke über technisch nicht interessierte Blogger bis hin zu PHP-Experten und erfahrenen Systemadministratoren. Diese Seite listet einige der Kern-Features von Red auf, die in der offiziellen Distribution enthalten sind. Wie immer bei freier Open-Source-Software sind den Möglichkeiten keine Grenzen gesetzt. Beliebige Erweiterungen, Addons, Themes und Konfigurationen sind möglich. @@ -10,7 +10,7 @@ Eines der Design-Ziele von Red ist einfache Kommunikations über das Web, ohne d [b]Beziehungs-Tool[/b] -Wenn Du in der Red-Matrix einen Kontakt hinzufügst (und das Beziehungs-Tool aktiviert hast), hast Du die Möglichkeit, einen „Grad der Freundschaft“ zu bestimmen. Bespiel: Wenn Du ein Blog eines Bekannten hinzufügst, könntest Du ihm den Freundschaftsgrad „Bekannte“ (Acquaintances) geben. +Wenn Du in der Redmatrix einen Kontakt hinzufügst (und das Beziehungs-Tool aktiviert hast), hast Du die Möglichkeit, einen „Grad der Freundschaft“ zu bestimmen. Bespiel: Wenn Du ein Blog eines Bekannten hinzufügst, könntest Du ihm den Freundschaftsgrad „Bekannte“ (Acquaintances) geben. [img]https://friendicared.net/photo/b07b0262e3146325508b81a9d1ae4a1e-0.png[/img] @@ -26,37 +26,107 @@ Wenn Du Inhalte mit anderen teilst, hast Du die Option, den Zugriff darauf einzu Diese Nachricht kann dann nur vom Absender und den eingestellten Empfängern betrachtet werden. Mit anderen Worten, sie erscheint nicht öffentlich auf einer Pinnwand. -[b]Verschlüsselung privater Nachrichten[/b] +Solche Zugriffsrechte gibt es bei Beiträgen, Fotos, Terminen, Webseiten, Chat-Räumen und Dateien. + +[b]Ein Passwort für alle Redmatrix-Server (Single Sign-on)[/b] + +Zugriffsrechte funktionieren in der gesamten Redmatrix mit allen Kanälen. Die meisten Links, die innerhalb der Redmatrix verlinken, enthalten deine Identität (zid), so dass der Zielserver Dich direkt anmelden kann. Du kannst Dich aber auch so auf jedem Redmatrix-Server mit Deinem Redmatrix-Identität anmelden und erhältst dann Zugriff auf die Inhalte, die für Dich freigegeben sind. + +Du loggst Dich nur einmal auf Deinem Heimatserver ein. Ab dann funktioniert die Authentifizierung gegenüber anderen Redmatrix-Servern „magisch“ von selbst. + +[b]Dateiablage (Cloud) mit WebDAV-Zugriff[/b] + +Du kannst in Deinem persönlichen Speicherbereich Dateien hochladen und ihn sogar als Verzeichnis von Deinem lokalen Betriebssystem anzeigen lassen (via WebDAV). Die Dateien können über Zugriffsrechte bestimmten Redmatrix-Mitgliedern (und den Mitgliedern mancher anderer Netze) zugänglich gemacht oder auch komplett öffentlich zur Verfügung gestellt werden. + +[b]Fotoalben[/b] + +Stelle Deine Fotos online in Alben zur Verfügung. Auch hier kann der Zugriff über die Zugriffsrechte eingeschränkt werden. + +[b]Terminkalender[/b] + +Im eingebauten Terminkalender kannst Du Termine erstellen und verwalten. Auch hier greifen die Zugriffsrechte für andere. Termine können im vcalendar/iCal-Format exportiert und mit anderen geteilt werden. Wenn Deine Kontakte ihren Geburtstag in ihr Profil eingetragen haben, werden diese Geburtstage automatisch zu Deinem Kalender hinzugefügt – mit entsprechender Anpassung der Zeitzone, so dass Du nie zu früh oder zu spät gratulierst. + +[b]Chat-Räume[/b] -Öffentliche Nachrichten werden in der Red-Matrix nicht verschlüsselt, bevor sie Deinen Server verlassen, und sie werden auch im Klartext in der Datenbank gespeichert. +Du kannst Chaträume erstellen und über die Zugriffsrechte nur bestimmten Nutzern öffnen. Die Nachrichten sind sicherer verschlüsselt als es normalerweise bei Jabber/XMPP, IRC und anderen Instant Messengern üblich ist. Über Plugins ist es aber auch möglich, andere IM-Dienste aus der Redmatrix heraus zu nutzen. + +[b]Erstellen von Webseiten[/b] + +In der Redmatrix gibt es Werkzeuge für „Content Management“, mit denen Du einfache Webseiten erstellen kannst, aber auch komplexe Layouts, Menüs, Blöcke und Widgets. Auch hier greifen die Zugriffsrechte, so dass die entstandenen Seiten nur von denen betrachtet werden können, denen Du das Recht dazu eingeräumt hast. + +[b]Apps[/b] + +Redmatrix-Mitglieder könnnen Apps erstellen und verteilen. Anders als bei anderen Systemen, bei denen man an den System-Anbieter gebunden ist, werden diese Apps komplett vom App-Anbieter kontrolliert, der auf Wunsch seine eigene Zugriffskontrolle und ein Bezahlsystem einbauen kann. Die meisten Apps in der Redmatrix sind kostenlos. Sie sind sehr einfach und ohne große Programmierkenntnisse zu erstellen. + +[b]Layout[/b] + +Das Seiten-Layout basiert auf eine Beschreibungssprache namens Comanche. Die Redmatrix ist selbst in Comanche-Layouts verfasst, die man verändern kann. Dadurch ist eine sehr starke Anpassung an die eigenen Bedürfnisse möglich, wie man sie so in Multi-User-Umgebungen normalerweise nicht findet. + +[b]Lesezeichen[/b] + +Du kannst Lesezeichen teilen, speichern und verwalten, direkt aus den Unterhaltungen mit anderen heraus. + +[b]Verschlüsselung privater Nachrichten[/b] -Nachrichten mit eingeschränktem Empfängerkreis werden jedoch mit einem symmetrischen 256-bit-AES-CBC-Schlüssel verschlüsselt, der seinerseits mit Public-Key-Kryptografie auf Basis von 4096-bittigen RSA-Schlüsseln geschützt (nochmal verschlüsselt) wird, die mit dem sendenden Kanal verbunden sind. +Nachrichten mit eingeschränktem Empfängerkreis werden mit einem symmetrischen 256-bit-AES-CBC-Schlüssel verschlüsselt, der seinerseits mit Public-Key-Kryptografie auf Basis von 4096-bittigen RSA-Schlüsseln geschützt (nochmal verschlüsselt) wird, die mit dem sendenden Kanal verbunden sind. Diese Nachrichten werden auch auf anderen Red-Servern verschlüsselt gespeichert. Jeder Red-Kanal hat seinen eigenes 4096-bit-RSA-Schlüsselpaar, das erzeugt wird, wenn der Kanal erstellt wird. +Zusätzlich können Nachrichten mit Ende-zu-Ende-Verschlüsselung versehen werden, so dass weder Redmatrix-Server-Administratoren noch ISPs irgendetwas mitlesen können, solange sie nicht über das Passwort verfügen. + +Komplett öffentliche Nachrichten werden weder in der Datenbank noch bei der Übertragung verschlüsselt (abgesehen ggfs. von SSL). + +Private Nachrichten können gelöscht (zurückgezogen) werden, aber es kann natürlich nicht garantiert werden, dass der Empfänger sie nicht schon gelesen hat. + +Alle Nachrichten können mit einem „Verfallsdatum“ versehen werden. Zu diesem Zeitpunkt werden sie dann von den Servern der Empfänger gelöscht. + +[b]Verbindung zu anderen Diensten[/b] + +Neben Plugins, die das „crossposten“ zu diversen anderen Netzwerk erlauben, wird der Import von RSS/Atom-Feeds nativ unterstützt, auch, um mit diesen Inhalten spezielle Kanäle zu erstellen. Außerdem kann über das Diaspora-Protokoll mit Kontakten in den Netzwerken Friendica und Diaspora kommuniziert werden. Diese Unterstützung ist als experimentell eingestuft, da diese Netzwerke nicht die gleichen Möglichkeiten wie die Redmatrix in Sachen Privatsphäre und Verschlüsselung bieten, so dass Kommunikation mit ihnen zu Privatsphäreproblemen führen könnte. + +Weiterhin wird OpenID auf experimenteller Ebene unterstützt und kann bei den Zugriffsrechten genutzt werden, um Inhalte für per OpenID authentifizierte Nutzer freizugeben. An dieser Funktion wird noch gearbeitet. + +Die Inhalte von Kanälen können als Quellen für andere Kanäle dienen (wenn der Kanalinhaber das erlaubt), so dass Themen-Kanäle mit den Inhalten von zwei oder mehr Kanälen erstellt werden können. + +[b]Sammlungen[/b] + +„Sammlungen“ sind unsere Implementation von Privatsphäregruppen, ähnlich den „Kreisen“ bei Google+ und den „Aspekten“ bei Diaspora. Sammlungen können zur Filterung der angezeigten Nachrichten genutzt werden (nur Threads anzeigen, die von einem Mitglied dieser Sammlung gestartet wurden), aber auch zum Setzen von Zugriffsrechten. + +[b]Verzeichnisdienste[/b] + +Wir stellen einfachen Zugriff auf ein Mitgliederverzeichnis zur Verfügung, samt einer dezentralen Möglichkeit, sich neue Kontakte basierend auf den eigenen vorschlagen zu lassen. Die Verzeichnis-Server sind normale Redmatrix-Server, bei denen der Administrator sich entschieden hat, sie auch als Verzeichnis agieren zu lassen. Das benötigt mehr Ressourcen als eine normale Redmatrix-Installation, deshalb ist das nicht voreingestellt. Die Verzeichnis-Server synchronisieren sich miteinander, so dass (abgesehen von einer gewissen Verzögerung bis zur nächsten Synchronisation) all Verzeichnis-Server aktuelle Informationen über das gesamte Netzwerk bereitstellen können. + [b]TLS/SSL[/b] -Red-Server, die TLS/SSL benutzen, verschlüsseln ihre Kommunikation vom Server zum Nutzer mit SSL. Nach den aktuellen Enthüllungen über das Umgehen von Verschlüsselung durch NSA, GHCQ und andere Dienste, sollte man jedoch nicht mehr savon ausgehen, dass diese Verbindungen nicht mitgelesen werden können. +Red-Server, die TLS/SSL benutzen, verschlüsseln ihre Kommunikation vom Server zum Nutzer mit SSL. Nach den aktuellen Enthüllungen über das Umgehen von Verschlüsselung durch NSA, GHCQ und andere Dienste, sollte man jedoch nicht mehr davon ausgehen, dass diese Verbindungen nicht mitgelesen werden können. [b]Kanal-Einstellungen[/b] -Für jeden Kanal kannst Du detaillierte Zugriffseinstellungen für verschiedenste Aspekte der Kommunikation festlegen. Unter den „Sicherheits- und Privatsphäre-Einstellungen“ kann für jeden Punkt auf der linken Seite eine von 5-6 möglichen Optionen aus dem Menü gewählt werden. +Wenn ein Kanal erstellt wird, muss eine bestimmte Zugriffsrechte-Kategorie (z.B. öffentliches Forum oder privater Kanal für soziales Netzwerken) ausgewählt werden, die dafür sorgt, dass sinnvolle Privatsphäre-Einstellungen für diese Art von Kanal ausgewählt werden. + +Wenn Du die Experten-Kategorie wählst, kannst Du detaillierte Zugriffseinstellungen für verschiedenste Aspekte der Kommunikation festlegen. Unter den „Sicherheits- und Privatsphäre-Einstellungen“ kann für jeden Punkt auf der linken Seite eine von 7-8 möglichen Optionen aus dem Menü gewählt werden. Daneben gibt es diverse weitere Einstellmöglichkeiten zum Thema Privatsphäre. [img]https://friendicared.net/photo/0f5be8da282858edd645b0a1a6626491.png[/img] -Die Optionen sind: +Die Optionen für die einzelnen Punkte (z.B., wer Deine normalen Beiträge sehen kann) sind: [ul][*]Niemand außer Du selbst [*]Nur die, denen Du es explizit erlaubst -[*]All Deine Kontakte -[*]Jeder auf diesem Server +[*]Angenommene Verbindungen +[*]Beliebige Verbindungen +[*]Jeder auf diesem Website [*]Alle Red-Nutzer +[*]Jeder authentifizierte [*]Jeder im Internet[/ul] +[b]Private und öffentliche Foren[/b] + +Foren sind Kanäle, in denen mehrere Nutzer als Autoren fungieren können; eine Nachricht eines entsprechend berechtigten Nutzers an das Forum wird an alle Foren-Mitglieder verteilt. Es gibt momentan zwei Arten, um auf diese Weise an ein Forum zu posten: 1) Direktes Posten auf der Kanal-Seite des Forums („wall-to-wall post“) oder 2) über @mention-Tags. Jeder kann Foren erstellen, und sie können für beliebige Zwecke genutzt werden. Das Kanal-Verzeichnis ermöglicht es, direkt nach öffentlichen Foren zu suchen. Private Foren können meist nur von den Mitgliedern beschickt und gelesen werden. + [b]Klone[/b] -Konten in der Red-Matrix werden auch als [i]nomadische Identitäten[/i] bezeichnet (eine ausführliche Erklärung dazu gibt es unter [url=[baseurl]/help/what_is_zot]What is Zot?[/url]). Nomadisch, weil bei anderen Diensten die Identität eines Nutzers an den Server oder die Plattform gebunden ist, auf der er ursprünglich erstellt wurde. Ein Facebook- oder Gmail-Konto ist and diese Dienste gekettet. Er funktioniert nicht ohne Facebook.com bzw. Gmail.com. +Konten in der Redmatrix werden auch als [i]nomadische Identitäten[/i] bezeichnet (eine ausführliche Erklärung dazu gibt es unter [url=[baseurl]/help/what_is_zot]What is Zot?[/url]). Nomadisch, weil bei anderen Diensten die Identität eines Nutzers an den Server oder die Plattform gebunden ist, auf der er ursprünglich erstellt wurde. Ein Facebook- oder Gmail-Konto ist and diese Dienste gekettet. Er funktioniert nicht ohne Facebook.com bzw. Gmail.com. -Bei Red ist das anders. Sagen wir, Du hast eine Red-Indentität namens tina@red.com. Die kannst Du auf einen anderen Server klonen, mit dem gleichen oder einem anderen Namen, zum Beispiel lebtEwig@matrixserver.info. +Bei Red ist das anders. Sagen wir, Du hast eine Red-Indentität namens tina@redhub.com. Die kannst Du auf einen anderen Server klonen, mit dem gleichen oder einem anderen Namen, zum Beispiel lebtEwig@matrixserver.info. Beide Kanäle sind jetzt miteinander synchronisiert, das heißt, dass alle Kontakte und Einstellungen auf dem Klon immer die gleichen sind wie auf dem ursprünglichen Kanal. Es ist egal, ob Du eine Nachricht von dort aus oder vom Klon aus schickst. Alle Nachrichten sind in beiden Klonen vorhanden. @@ -64,12 +134,15 @@ Das ist ein ziemlich revolutionäres Feature, wenn man sich einige Szenarien daz [ul][*]Was passiert, wenn ein Server, auf dem sich Deine Identität befindet, plötzlich offline ist? Ohne Klone ist der Nutzer nicht in der Lage zu kommunzieren, bis der Server wieder online ist. Mit Klonen loggst Du Dich einfach bei Deinem geklonten Kanal ein und lebst glücklich bis an Dein Ende. [*]Der Administrator Deines Red-Servers kann es sich nicht länger leisten, seinen für alle kostenlosen Server zu bezahlen. Er gibt bekannt, dass der Server in zwei Wochen vom Netz gehen wird. Zeit genug, um Deine Red-Kanäle auf andere Server zu klonen und somit Verbindungen und Freunde zu behalten. -[*]Was, wenn Dein Kanal staatlicher Zensur unterliegt? Dein Server-Admin wird gezwungen, Dein Konto und alle damit verbundenen Kanäle und Daten zu löschen. Durch Klone bietet die Red-Matrix Zensur-Resistenz. Wenn Du willst, kannst Du hunderte von Klonen haben, alle mit unterschiedlichen Namen und auf unterschiedlichen Servern überall im Internet.[/ul] +[*]Was, wenn Dein Kanal staatlicher Zensur unterliegt? Dein Server-Admin wird gezwungen, Dein Konto und alle damit verbundenen Kanäle und Daten zu löschen. Durch Klone bietet die Redmatrix Zensur-Resistenz. Wenn Du willst, kannst Du hunderte von Klonen haben, alle mit unterschiedlichen Namen und auf unterschiedlichen Servern überall im Internet.[/ul] + +Red bietet interessante, neue Möglichkeiten in Bezug auf die Privatsphäre. Mehr dazu unter „Tipps und Tricks zur privaten Kommunikation“. -Red bietet interessante, neue Möglichkeiten in Bezug auf die Privatsphäre. Mehr dazu bald unter „Tipps und Tricks zur privaten Kommunikation“. +Klone unterliegen einigen Restriktionen. Eine vollständige Erklärung zum Klonen von Identitäten gibt es unter „Klone“. -Klone unterliegen einigen Restriktionen. Eine vollständige Erklärung zum Klonen von Identitäten gibt es bald unter „Klone“. +[b]Mehrere Profile[/b] +Jeder Kanal kann beliebig viele Profile mit unterschiedlichen Informationen definieren. Dann kannst Du einstellen, wer von Deinen Kontakten welches Profil zu sehen bekommt. Das Default-Profil ist für alle anderen zu sehen und kann so auf nur wenige Informationen beschränkt werden, während Freunde und Bekannte mehr zu sehen bekommen. [b]Kanal-Backups[/b] @@ -79,28 +152,34 @@ Solche Backups sind ein Weg, um Klone zu erstellen, und können genutzt werden, [b]Löschen von Konten[/b] -Konten und Kanäle können sofort gelöscht werden, indem Du einfach auf einen Link klickst. Das wars. Alle damit verbundenen Inhalte werden sofort aus der Matrix gelöscht (inklusiver aller Beiträge und sonstiger Inhalte, die von dem gelöschten Konto/Kanal erzeugt wurden). +Konten und Kanäle können sofort gelöscht werden, indem Du einfach auf einen Link klickst. Das wars. Alle damit verbundenen Inhalte werden aus der Matrix gelöscht (inklusiver aller Beiträge und sonstiger Inhalte, die von dem gelöschten Konto/Kanal erzeugt wurden). Je nach Anzahl Deiner Verbindungen kann es etwas dauern, bis die Inhalte auch von allen Servern Deiner Kontakte gelöscht werden, aber die Löschung wird so schnell wie sinnvoll möglich durchgeführt. [h2]Erstellen von Inhalten[/h2] [b]Beiträge schreiben[/b] -Red unterstützt diverse verschiedene Wege, um Inhalte zu erstellen, von einem grafischen Text-Editor über verschieden Markup-Sprachen bis hin zu reinem HTML. +Red unterstützt diverse verschiedene Wege, um Inhalte mit Auszeichnung (z.B. fett, kursiv, farbig etc.) zu erstellen. Voreinstellung ist die Redmatrix-Variante von BBCode (wie in vielen Web-Foren) mit einigen Ergänzungen, die nur hier funktionieren. Du kannst auch Markdown benutzen, wenn Dir das leichter fällt. Bis vor kurzem konnte auch ein grafischer Editor eingesetzt werden, der jedoch große Probleme aufwies und deshalb entfernt wurde. Wir suchen gerade nach einer Alternative. -Mit Red geliefert wird TinyMCE, ein WYSIWYG-Editor, der in den Einstellungen eingeschaltet werden kann. Ist er nicht aktiviert, können normale Beiträge mit BBCode (wie in Foren) formatiert werden. - -Webseiten können außerdem in HTML, Markdown und Plain Text erstellt werden. +Webseiten können neben BBCode und Markdown auch in HTML und Plain Text erstellt werden. [b]Inhalte löschen[/b] -Alle Inhalte in der Matrix bleiben unter der Kontroller des Nutzers (bzw. Kanals), der sie ursprünglich erstellt hat. Alle Beiträge können jederzeit gelöscht werden, egal, ob sie auf dem Heimat-Server des Nutzers oder auf einem anderen Server erstellt wurden, an dem der Nutzer via Zot angemeldet war. +Alle Inhalte in der Redmatrix bleiben unter der Kontrolle des Mitglieds (bzw. Kanals), der sie ursprünglich erstellt hat. Alle Beiträge können jederzeit gelöscht werden, egal, ob sie auf dem Heimat-Server des Nutzers oder auf einem anderen Server erstellt wurden, an dem der Nutzer via Zot angemeldet war. [b]Medien[/b] Genau wie jedes andere Blog-System, soziale Netzwerk oder Mikro-Blogging-Dienst unterstützt Red das Hochladen von Dateien, das Einbetten von Bildern und Videos und das Verlinken von Seiten. -[b]Vorschau[/b] +[b]Vorschau/Editieren[/b] + +Vor dem Absenden kann eine Vorschau von Beiträgen betrachtet werden. Außerdem können Beiträge auch nach dem Absenden noch verändert werden. + +[b]Redmatrix erweitern[/b] + +Die Redmatrix kann auf vielerlei Art erweitert werden: Durch Server-Anpassung, persönliche Anpassung, setzen von Optionen, Themes und Addons/Plugins. + +[b]API[/b] -Vor dem Absenden kann eine Vorschau von Beiträgen betrachtet werden. +Es existiert eine API, die von beliebigen Programmen/Apps und Diensten genutzt werden kann. Sie basiert auf der ursprünglichen Twitter-API (für die es hunderte von Tools und Apps gibt). Sie wird aktuell erweitert, um Zugriff auf Möglichkeiten zu gewähren, die es nur in der Redmatrix gibt. Authentifikation erfolgt über Login/Passwort oder OAuth. Eine Client-Registrierung für OAuth-Applikationen ist möglich. #include doc/macros/main_footer.bb; diff --git a/doc/de/main.bb b/doc/de/main.bb index f16016124..1106b750c 100644 --- a/doc/de/main.bb +++ b/doc/de/main.bb @@ -53,6 +53,7 @@ Zot ist das großartige neue Kommunikationsprotokoll, das extra für die Red-Mat [zrl=[baseurl]/help/Creating-Templates]Vorlagen erstellen mit Comanche[/zrl] [zrl=[baseurl]/help/Widgets]Widgets, die Teil der Standardinstallation sind[/zrl] [zrl=[baseurl]/help/plugins]Plugins[/zrl] +[zrl=[baseurl]/help/doco]Selbst Dokumentation beisteuern[/zrl] [zrl=[baseurl]/help/DerivedTheme1]Einen Theme basierend auf einem anderen erstellen[/zrl] [zrl=[baseurl]/help/schema_development]Schemata[/zrl] [zrl=[baseurl]/help/Translations]Übersetzungen[/zrl] @@ -66,6 +67,7 @@ Zot ist das großartige neue Kommunikationsprotokoll, das extra für die Red-Mat [zrl=[baseurl]/help/to_do_code]To-Do-Liste für Entwickler[/zrl] [zrl=[baseurl]/help/roadmap]Roadmap für Version 3[/zrl] [zrl=[baseurl]/help/git_for_non_developers]Git für Nicht-Entwickler[/zrl] +[zrl=[baseurl]/help/dev_beginner]Schritt-für-Schritt-Einführung für neue Entwickler[/zrl] [size=large][b]Häufig gestellte Fragen für Entwickler[/b][/size] [zrl=[baseurl]/help/faq_developers]FAQ für Entwickler[/zrl] diff --git a/include/items.php b/include/items.php index c488e1953..e2534528a 100755 --- a/include/items.php +++ b/include/items.php @@ -3183,7 +3183,7 @@ function mail_store($arr) { $arr['account_id'] = ((x($arr,'account_id')) ? intval($arr['account_id']) : 0); $arr['mid'] = ((x($arr,'mid')) ? notags(trim($arr['mid'])) : random_string()); $arr['from_xchan'] = ((x($arr,'from_xchan')) ? notags(trim($arr['from_xchan'])) : ''); - $arr['to_xchan'] = ((x($arr,'to_xchan')) ? notags(trim($arr['to_xchan'])) : ''); + $arr['to_xchan'] = ((x($arr,'to_xchan')) ? notags(trim($arr['to_xchan'])) : ''); $arr['created'] = ((x($arr,'created') !== false) ? datetime_convert('UTC','UTC',$arr['created']) : datetime_convert()); $arr['expires'] = ((x($arr,'expires') !== false) ? datetime_convert('UTC','UTC',$arr['expires']) : NULL_DATE); $arr['title'] = ((x($arr,'title')) ? notags(trim($arr['title'])) : ''); diff --git a/include/notifier.php b/include/notifier.php index e1eb0c554..06ef7bc94 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -165,6 +165,7 @@ function notifier_run($argv, $argc){ } xchan_mail_query($message[0]); $uid = $message[0]['channel_id']; + $recipients[] = $message[0]['from_xchan']; // include clones $recipients[] = $message[0]['to_xchan']; $item = $message[0]; diff --git a/include/text.php b/include/text.php index edcd087a6..e0bf393e5 100644 --- a/include/text.php +++ b/include/text.php @@ -6,8 +6,8 @@ require_once("include/smarty.php"); /** * This is our template processor - * - * @param string|FriendicaSmarty $s the string requiring macro substitution, + * + * @param string|FriendicaSmarty $s the string requiring macro substitution, * or an instance of FriendicaSmarty * @param array $r key value pairs (search => replace) * @return string substituted string @@ -17,10 +17,10 @@ function replace_macros($s,$r) { $arr = array('template' => $s, 'params' => $r); call_hooks('replace_macros', $arr); - + $t = $a->template_engine(); $output = $t->replace_macros($arr['template'],$arr['params']); - + return $output; } @@ -40,7 +40,7 @@ function random_string($size = 64,$type = RANDOM_STRING_HEX) { } /** - * This is our primary input filter. + * This is our primary input filter. * * The high bit hack only involved some old IE browser, forget which (IE5/Mac?) * that had an XSS attack vector due to stripping the high-bit on an 8-bit character @@ -105,7 +105,7 @@ function z_input_filter($channel_id,$s,$type = 'text/bbcode') { return purify_html($s); return escape_tags($s); - + } @@ -316,23 +316,23 @@ function paginate(&$a) { if($a->pager['total'] > $a->pager['itemspage']) { $o .= '<div class="pager">'; - if($a->pager['page'] != 1) + if($a->pager['page'] != 1) $o .= '<span class="pager_prev">'."<a href=\"$url".'&page='.($a->pager['page'] - 1).'">' . t('prev') . '</a></span> '; $o .= "<span class=\"pager_first\"><a href=\"$url"."&page=1\">" . t('first') . "</a></span> "; - $numpages = $a->pager['total'] / $a->pager['itemspage']; + $numpages = $a->pager['total'] / $a->pager['itemspage']; $numstart = 1; - $numstop = $numpages; + $numstop = $numpages; - if($numpages > 14) { - $numstart = (($pagenum > 7) ? ($pagenum - 7) : 1); - $numstop = (($pagenum > ($numpages - 7)) ? $numpages : ($numstart + 14)); - } + if($numpages > 14) { + $numstart = (($pagenum > 7) ? ($pagenum - 7) : 1); + $numstop = (($pagenum > ($numpages - 7)) ? $numpages : ($numstart + 14)); + } for($i = $numstart; $i <= $numstop; $i++){ - if($i == $a->pager['page']) + if($i == $a->pager['page']) $o .= '<span class="pager_current">'.(($i < 10) ? ' '.$i : $i); else $o .= "<span class=\"pager_n\"><a href=\"$url"."&page=$i\">".(($i < 10) ? ' '.$i : $i)."</a>"; @@ -350,7 +350,7 @@ function paginate(&$a) { $lastpage = (($numpages > intval($numpages)) ? intval($numpages)+1 : $numpages); $o .= "<span class=\"pager_last\"><a href=\"$url"."&page=$lastpage\">" . t('last') . "</a></span> "; - if(($a->pager['total'] - ($a->pager['itemspage'] * $a->pager['page'])) > 0) + if(($a->pager['total'] - ($a->pager['itemspage'] * $a->pager['page'])) > 0) $o .= '<span class="pager_next">'."<a href=\"$url"."&page=".($a->pager['page'] + 1).'">' . t('next') . '</a></span>'; $o .= '</div>'."\r\n"; } diff --git a/mod/acl.php b/mod/acl.php index f575db55b..d406942c3 100644 --- a/mod/acl.php +++ b/mod/acl.php @@ -293,9 +293,10 @@ function navbar_complete(&$a) { $url = $directory['url'] . '/dirsearch'; } + $count = (x($_REQUEST,'count')?$_REQUEST['count']:100); if($url) { $query = $url . '?f=' ; - $query .= '&name=' . urlencode($search) . '&limit=50' . (($address) ? '&address=' . urlencode($search) : ''); + $query .= '&name=' . urlencode($search) . "&limit=$count" . (($address) ? '&address=' . urlencode($search) : ''); $x = z_fetch_url($query); if($x['success']) { diff --git a/mod/search_ac.php b/mod/search_ac.php index 36da21376..b4f5c9600 100644 --- a/mod/search_ac.php +++ b/mod/search_ac.php @@ -1,8 +1,9 @@ <?php +// Autocomplete for saved searches. Should probably be put in the same place as the other autocompletes function search_ac_init(&$a){ if(!local_user()) - return ""; + killme(); $start = (x($_REQUEST,'start')?$_REQUEST['start']:0); @@ -13,17 +14,6 @@ function search_ac_init(&$a){ $search = $_REQUEST['query']; } - - $sql_extra = ''; - - $x = array(); - $x['query'] = $search; - $x['photos'] = array(); - $x['links'] = array(); - $x['suggestions'] = array(); - $x['data'] = array(); - - // Priority to people searches if ($search) { @@ -32,18 +22,23 @@ function search_ac_init(&$a){ } - $r = q("SELECT `abook_id`, `xchan_name`, `xchan_photo_s`, `xchan_url` FROM `abook` left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d + $r = q("SELECT `abook_id`, `xchan_name`, `xchan_photo_s`, `xchan_url`, `xchan_addr` FROM `abook` left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d $people_sql_extra ORDER BY `xchan_name` ASC ", intval(local_user()) ); + $results = array(); if($r) { foreach($r as $g) { - $x['photos'][] = $g['xchan_photo_s']; - $x['links'][] = $g['xchan_url']; - $x['suggestions'][] = '@' . $g['xchan_name']; - $x['data'][] = 'cid=' . intval($g['abook_id']); + $results[] = array( + "photo" => $g['xchan_photo_s'], + "name" => '@'.$g['xchan_name'], + "id" => $g['abook_id'], + "link" => $g['xchan_url'], + "label" => '', + "nick" => '', + ); } } @@ -53,15 +48,24 @@ function search_ac_init(&$a){ if(count($r)) { foreach($r as $g) { - $x['photos'][] = $a->get_baseurl() . '/images/hashtag.png'; - $x['links'][] = $g['url']; - $x['suggestions'][] = '#' . $g['term']; - $x['data'][] = intval($g['tid']); + $results[] = array( + "photo" => $a->get_baseurl() . '/images/hashtag.png', + "name" => '#'.$g['term'], + "id" => $g['tid'], + "link" => $g['url'], + "label" => '', + "nick" => '', + ); } } header("content-type: application/json"); - echo json_encode($x); + $o = array( + 'start' => $start, + 'count' => $count, + 'items' => $results, + ); + echo json_encode($o); logger('search_ac: ' . print_r($x,true)); diff --git a/version.inc b/version.inc index dcc95694a..2105acfc6 100644 --- a/version.inc +++ b/version.inc @@ -1 +1 @@ -2015-01-07.912 +2015-01-08.913 diff --git a/view/js/autocomplete.js b/view/js/autocomplete.js index 8572cf708..40a9cd4c8 100644 --- a/view/js/autocomplete.js +++ b/view/js/autocomplete.js @@ -5,11 +5,16 @@ */ function contact_search(term, callback, backend_url, type, extra_channels) { // Check if there is a cached result that contains the same information we would get with a full server-side search - // Assume type hasn't changed - for(t in contact_search.cache) { - if(term.indexOf(t) >= 0) { // A more broad search has been performed already, so use those results + + var bt = backend_url+type; + if(!(bt in contact_search.cache)) contact_search.cache[bt] = {}; + + var lterm = term.toLowerCase(); // Ignore case + for(t in contact_search.cache[bt]) { + if(lterm.indexOf(t) >= 0) { // A more broad search has been performed already, so use those results // Filter old results locally - var matching = contact_search.cache[t].filter(function (x) { return (x.name.indexOf(term) >= 0 || x.nick.indexOf(term) >= 0); }); + var matching = contact_search.cache[bt][t].filter(function (x) { return (x.name.toLowerCase().indexOf(lterm) >= 0 || x.nick.toLowerCase().indexOf(lterm) >= 0); }); + matching.unshift({taggable:false, text: term, replace: term}); callback(matching); return; } @@ -33,20 +38,34 @@ function contact_search(term, callback, backend_url, type, extra_channels) { success:function(data){ // Cache results if we got them all (more information would not improve results) // data.count represents the maximum number of items - if(data.items.length < data.count) { - contact_search.cache[term] = data.items; + if(data.items.length -1 < data.count) { + contact_search.cache[bt][lterm] = data.items; } - callback(data.items); + var items = data.items.slice(0); + items.unshift({taggable:false, text: term, replace: term}); + callback(items); }, }).fail(function () {callback([]); }); // Callback must be invoked even if something went wrong. } contact_search.cache = {}; + function contact_format(item) { - return "<div class='{0}' title='{4}'><img src='{1}'>{2} ({3})</div>".format(item.taggable, item.photo, item.name, ((item.label) ? item.nick + ' ' + item.label : item.nick), item.link ) + // Show contact information if not explicitly told to show something else + if(typeof item.text === 'undefined') { + var desc = ((item.label) ? item.nick + ' ' + item.label : item.nick) + if(desc) desc = ' ('+desc+')'; + return "<div class='{0}' title='{4}'><img src='{1}'>{2}{3}</div>".format(item.taggable, item.photo, item.name, desc, item.link) + } + else + return "<div>"+item.text+"</div>" } function editor_replace(item) { + if(typeof item.replace !== 'undefined') { + return '$1$2'+item.replace; + } + // $2 ensures that prefix (@,@!) is preserved var id = item.id; // 16 chars of hash should be enough. Full hash could be used if it can be done in a visually appealing way. @@ -57,6 +76,9 @@ function editor_replace(item) { } function basic_replace(item) { + if(typeof item.replace !== 'undefined') + return '$1'+item.replace; + return '$1'+item.name+' '; } @@ -88,7 +110,7 @@ function submit_form(e) { replace: function(item) { return "$1"+item['text'] + ' '; }, } this.attr('autocomplete','off'); - this.textcomplete([contacts,smilies],{className:'acpopup'}); + this.textcomplete([contacts,smilies],{className:'acpopup',zIndex:1050}); }; })( jQuery ); @@ -107,7 +129,7 @@ function submit_form(e) { template: contact_format, } this.attr('autocomplete','off'); - var a = this.textcomplete([contacts],{className:'acpopup',maxCount:100}); + var a = this.textcomplete([contacts],{className:'acpopup',maxCount:100,zIndex: 1050}); a.on('textComplete:select', function(e,value,strategy) { submit_form(this); }); @@ -130,7 +152,7 @@ function submit_form(e) { } this.attr('autocomplete','off'); - var a = this.textcomplete([contacts],{className:'acpopup'}); + var a = this.textcomplete([contacts],{className:'acpopup',zIndex:1050}); if(autosubmit) a.on('textComplete:select', function(e,value,strategy) { submit_form(this); }); diff --git a/view/js/mod_network.js b/view/js/mod_network.js index 1b7ccdc0a..cbdb82c75 100644 --- a/view/js/mod_network.js +++ b/view/js/mod_network.js @@ -1,5 +1,5 @@ $(document).ready(function() { - $("#search-text").contact_autocomplete(baseurl + '/acl'); + $("#search-text").contact_autocomplete(baseurl + '/search_ac'); $('.jslider-scale ins').addClass('hidden-xs'); }); |