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

This commit is contained in:
zottel 2016-05-17 07:56:39 +02:00
commit dc78ab1c77
48 changed files with 12955 additions and 12780 deletions

View File

@ -1,3 +1,52 @@
Hubzilla 1.6
Cleanup and standardise the interfaces to the "jot" editor
Router re-written to support calling class object methods as controllers
All existing modules (160+) re-written as object classes
Plugin hook interface adapted to call static class methods
Context help improved dramatically with content for the most accessed pages.
Reverted a compatibility change to support GNU-social events. We copied their feed format and their feed format is wrong (XML namespace collisions).
Provide a querystring attribute to CSS/JS resources to avoid caching issues when our code changes (which is often).
Fix javascript detection and allow either positive or negative detection.
Refactor the plugin hook registration procedure, provide 'unregister all' ability.
Fix RSD (Real Simple Discovery) which has been broken for some time.
Update smarty library to 3.1.29
Update jquery.textcomplete to 1.3.4
Update font-awesome to 4.6.1
Update SabreDAV to 3.0 (PHP version requirements prevent us from pushing it further at this time)
Help text added to cmdline utilities config and pconfig
Reworking of the database logging facility to avoid the rare but troublesome recursion when the log facility needed to query the DB internally to obtain config parameters.
Implement singleton delivery (emulate nomadic identity to singleton networks and services)
Fix empty album name in photo activities when photo is stored in top level folder.
Allow engineering units to be used in service class data size restrictions (400M, 1G, etc.)
Lots of work on bbcode auto-completion
Admin interface provided to manage external resource repositories
Oembed security reworked. Now all sources are filtered by default unless blocked.
Remove the date-string version and use only STD_VERSION
Add categories and categorisation filtering and the ability to edit all apps (including system apps) for a given channel
Ensure the ability to translate names of all system apps (except those provided in addons)
Provide ability to add categories to content from channel sources
Lots of work on the presentation of the ACL widget to enhance usability and intuitiveness
Allow somebody to follow a channel from a pasted redress containing a Unicode lookalike of the @ sign.
Add conditional syntax to Comanche (if/then/else)
Convert Comanche to an object class
Removed IE6 compatibility code
Explicitly close DB on shutdown/exit instead of allowing it to close naturally
Allowed delayed publish of webpages
Show current repository versions of master and dev on admin page and warn if your installation has fallen behind master
Provide some extra security checks to import data and files to prevent mischief
Block CalDAV/CardDAV namespace reserved words from being used as a channel nickname/redress since Sabre is somewhat inflexible in this regard
Plugins:
Diaspora
markdown translator work needed to eradicate the Diaspora Comment Virus.
upgrade all inbound paths with the most recent protocol changes (several of these)
convert 'diaspora_meta' (Diaspora Comment Virus) to iconfig and eradicate from sites with Diaspora disabled
implement social relay and allow following tags
upgrade statistics.json to NodeInfo. Currently hubzilla sites are tagged as 'redmatrix' because the NodeInfo schema lacks extensibility and project names are used to designate protocol compatibility rather than protocol names.
Std-embeds
New addon to allow a handful of corporate providers to run unfiltered embed code (youtube, vimeo, soundcloud)
Various:
upgrade font-awesome icons and adapt a few addons to Objects and the new hook interface and new controller interface
Hubzilla 1.4
[This list may appear brief, but encompasses a huge amount of re-writing and re-factoring
of the internal code structure to gain long-term performance and stability and provide a standard

View File

@ -1733,6 +1733,19 @@ class Admin extends \Zotlabs\Web\Controller {
} else {
json_return_and_die(array('message' => 'No repo name provided.', 'success' => false));
}
$extendDir = __DIR__ . '/../../store/git/sys/extend';
$addonDir = $extendDir . '/addon';
if (!file_exists($extendDir)) {
if (!mkdir($extendDir, 0770, true)) {
logger('Error creating extend folder: ' . $extendDir);
json_return_and_die(array('message' => 'Error creating extend folder: ' . $extendDir, 'success' => false));
} else {
if (!symlink(__DIR__ . '/../../extend/addon', $addonDir)) {
logger('Error creating symlink to addon folder: ' . $addonDir);
json_return_and_die(array('message' => 'Error creating symlink to addon folder: ' . $addonDir, 'success' => false));
}
}
}
$repoDir = __DIR__ . '/../../store/git/sys/extend/addon/' . $repoName;
if (!is_dir($repoDir)) {
logger('Repo directory does not exist: ' . $repoDir);
@ -1758,6 +1771,19 @@ class Admin extends \Zotlabs\Web\Controller {
} else {
json_return_and_die(array('message' => 'No repo name provided.', 'success' => false));
}
$extendDir = __DIR__ . '/../../store/git/sys/extend';
$addonDir = $extendDir . '/addon';
if (!file_exists($extendDir)) {
if (!mkdir($extendDir, 0770, true)) {
logger('Error creating extend folder: ' . $extendDir);
json_return_and_die(array('message' => 'Error creating extend folder: ' . $extendDir, 'success' => false));
} else {
if (!symlink(__DIR__ . '/../../extend/addon', $addonDir)) {
logger('Error creating symlink to addon folder: ' . $addonDir);
json_return_and_die(array('message' => 'Error creating symlink to addon folder: ' . $addonDir, 'success' => false));
}
}
}
$repoDir = __DIR__ . '/../../store/git/sys/extend/addon/' . $repoName;
if (!is_dir($repoDir)) {
logger('Repo directory does not exist: ' . $repoDir);

View File

@ -8,7 +8,6 @@ require_once('include/widgets.php');
class Comanche {
@ -95,7 +94,7 @@ class Comanche {
$cnt = preg_match_all("/\[region=(.*?)\](.*?)\[\/region\]/ism", $s, $matches, PREG_SET_ORDER);
if($cnt) {
foreach($matches as $mtch) {
\App::$layout['region_' . $mtch[1]] = $this->region($mtch[2]);
\App::$layout['region_' . $mtch[1]] = $this->region($mtch[2],$mtch[1]);
}
}
}
@ -320,7 +319,9 @@ class Comanche {
}
function region($s) {
function region($s,$region_name) {
$s = str_replace('$region',$region_name,$s);
$matches = array();

View File

@ -73,6 +73,9 @@ class BasicAuth extends DAV\Auth\Backend\AbstractBasic {
protected $timezone = '';
public $module_disabled = false;
/**
* @brief Validates a username and password.
*
@ -92,7 +95,7 @@ class BasicAuth extends DAV\Auth\Backend\AbstractBasic {
intval($record['account_id']),
intval($record['account_default_channel'])
);
if ($r) {
if($r && $this->check_module_access($r[0]['channel_id'])) {
return $this->setAuthenticated($r[0]);
}
}
@ -109,13 +112,17 @@ class BasicAuth extends DAV\Auth\Backend\AbstractBasic {
if ((($record['account_flags'] == ACCOUNT_OK) || ($record['account_flags'] == ACCOUNT_UNVERIFIED))
&& (hash('whirlpool', $record['account_salt'] . $password) === $record['account_password'])) {
logger('password verified for ' . $username);
return $this->setAuthenticated($r[0]);
if($this->check_module_access($r[0]['channel_id']))
return $this->setAuthenticated($r[0]);
}
}
}
}
$error = 'password failed for ' . $username;
if($this->module_disabled)
$error = 'module not enabled for ' . $username;
else
$error = 'password failed for ' . $username;
logger($error);
log_failed_login($error);
@ -139,6 +146,17 @@ class BasicAuth extends DAV\Auth\Backend\AbstractBasic {
return true;
}
protected function check_module_access($channel_id) {
if($channel_id && \App::$module === 'cdav') {
$x = get_pconfig($channel_id,'cdav','enabled');
if(! $x) {
$this->module_disabled = true;
return false;
}
}
return true;
}
/**
* Sets the channel_name from the currently logged-in channel.
*

View File

@ -13,10 +13,10 @@ namespace Zotlabs\Web;
class Session {
private static $handler = null;
private static $session_started = false;
private $handler = null;
private $session_started = false;
function init() {
public function init() {
$gc_probability = 50;
@ -29,7 +29,8 @@ class Session {
*/
$handler = new \Zotlabs\Web\SessionHandler();
self::$handler = $handler;
$this->handler = $handler;
$x = session_set_save_handler($handler,false);
if(! $x)
@ -38,11 +39,12 @@ class Session {
// Force cookies to be secure (https only) if this site is SSL enabled.
// Must be done before session_start().
$arr = session_get_cookie_params();
session_set_cookie_params(
((isset($arr['lifetime'])) ? $arr['lifetime'] : 0),
((isset($arr['path'])) ? $arr['path'] : '/'),
((isset($arr['domain'])) ? $arr['domain'] : App::get_hostname()),
(($arr['domain']) ? $arr['domain'] : \App::get_hostname()),
((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') ? true : false),
((isset($arr['httponly'])) ? $arr['httponly'] : true)
);
@ -51,9 +53,9 @@ class Session {
}
function start() {
public function start() {
session_start();
self::$session_started = true;
$this->session_started = true;
}
/**
@ -62,8 +64,8 @@ class Session {
* @return void
*/
function nuke() {
self::new_cookie(0); // 0 means delete on browser exit
public function nuke() {
$this->new_cookie(0); // 0 means delete on browser exit
if($_SESSION && count($_SESSION)) {
foreach($_SESSION as $k => $v) {
unset($_SESSION[$k]);
@ -71,48 +73,52 @@ class Session {
}
}
function new_cookie($xtime) {
public function new_cookie($xtime) {
$newxtime = (($xtime> 0) ? (time() + $xtime) : 0);
$old_sid = session_id();
if(self::$handler && self::$session_started) {
$arr = session_get_cookie_params();
if($this->handler && $this->session_started) {
session_regenerate_id(true);
// force SessionHandler record creation with the new session_id
// which occurs as a side effect of read()
self::$handler->read(session_id());
$this->handler->read(session_id());
}
else
logger('no session handler');
if (x($_COOKIE, 'jsdisabled')) {
setcookie('jsdisabled', $_COOKIE['jsdisabled'], $newxtime);
setcookie('jsdisabled', $_COOKIE['jsdisabled'], $newxtime, '/', \App::get_hostname(),((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') ? true : false),((isset($arr['httponly'])) ? $arr['httponly'] : true));
}
setcookie(session_name(),session_id(),$newxtime);
setcookie(session_name(),session_id(),$newxtime, '/', \App::get_hostname(),((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') ? true : false),((isset($arr['httponly'])) ? $arr['httponly'] : true));
$arr = array('expire' => $xtime);
call_hooks('new_cookie', $arr);
}
function extend_cookie() {
public function extend_cookie() {
$arr = session_get_cookie_params();
// if there's a long-term cookie, extend it
$xtime = (($_SESSION['remember_me']) ? (60 * 60 * 24 * 365) : 0 );
if($xtime)
setcookie(session_name(),session_id(),(time() + $xtime));
setcookie(session_name(),session_id(),(time() + $xtime), '/', \App::get_hostname(),((isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on') ? true : false),((isset($arr['httponly'])) ? $arr['httponly'] : true));
$arr = array('expire' => $xtime);
call_hooks('extend_cookie', $arr);
}
function return_check() {
public function return_check() {
// check a returning visitor against IP changes.
// If the change results in being blocked from re-entry with the current cookie
@ -152,7 +158,7 @@ class Session {
// check any difference at all
logger('Session address changed. Paranoid setting in effect, blocking session. '
. $_SESSION['addr'] . ' != ' . $_SERVER['REMOTE_ADDR']);
self::nuke();
$this->nuke();
goaway(z_root());
break;
}

View File

@ -632,6 +632,19 @@ class ZotlabsAutoloader {
return TRUE;
}
}
$arr = explode('\\',$className);
if($arr && count($arr) > 1) {
if(! $arr[0])
$arr = array_shift($arr);
$filename = 'addon/' . lcfirst($arr[0]) . '/' . $arr[1] . ((count($arr) === 2) ? '.php' : '/' . $arr[2] . ".php");
if (file_exists($filename)) {
include($filename);
if (class_exists($className)) {
return TRUE;
}
}
}
return FALSE;
}
}
@ -687,6 +700,7 @@ class App {
private static $perms = null; // observer permissions
private static $widgets = array(); // widgets for this page
public static $session = null;
public static $groups;
public static $language;
public static $langsave;
@ -1656,7 +1670,8 @@ function goaway($s) {
function shutdown() {
global $db;
$db->close();
if(is_object($db) && $db->connected)
$db->close();
}
/**

View File

@ -2,10 +2,12 @@
[list=1]
[*] abcjsplugin - Create musical scores in your posts
[*] adultphotoflag - prevents nsfw photos from being displayed in public albums
[*] b2tbtn - provide button to go directly to top of page if you are scrolled a long way down
[*] bbmath - use complex math expressions in your posts
[*] bookmarker - replace #^ with bookmark link in posts
[*] buglink - provide a bug reporting icon in the lower-left corner of every page
[*] calc - a scientific calculator
[*] cdav - CalDAV/CardDAV server
[*] chess - cross domain identity aware interactive chess games
[*] chords - generate fingering charts and alternatives for every known guitar chord
[*] custom_home - set a custom page as the hub start page
@ -13,18 +15,24 @@
[*] diaspora - Diaspora protocol emulator
[*] diaspost - crosspost to a Diaspora account (different from the Diaspora protocol emulator)
[*] dirstats - show some interesting statistics generated by the driectory server
[*] docs - alternate documentation pages
[*] donate - provides a project donation page
[*] dwpost - crosspost to Dreamwidth
[*] embedphotos - tool to embed photos from your albums in a post
[*] extcron - use an external cron service to run your hub's scheduled tasks
[*] flattrwidget - provides a "Flattr Us" button
[*] flip - create upside down text
[*] fortunate - displays random quote (fortune cookie). Requires setting up a fortune server.
[*] friendica - Friendica (DFRN) protocol. Under development.
[*] frphotos - import photo albums from Friendica
[*] gnusoc - GNU-Social (OStatus) protocol. Under development.
[*] hexit - headecimal conversion tool
[*] hubwall - send an admin email to all hub accounts
[*] ijpost - crosspost to Insanejournal
[*] irc - connect to IRC chatrooms
[*] jappixmini - XMPP chat
[*] jsupload - (recommended) upload multiple photos to photo albums at once.
[*] jsupload - upload multiple photos to photo albums at once.
[*] keepout - prevents nearly all use of site when not logged in, more restrictive than 'block public' setting
[*] ldapauth - login via account on LDAP or Windows Active Directory domain
[*] libertree - crosspost to Libertree
[*] likebanner - create a "like us on red#matrix" banner image
@ -32,6 +40,7 @@
[*] logrot - logfile rotation utility
[*] mahjongg - Chinese puzzle game
[*] mailhost - when using multiple channel clones, select one to receive email notifications
[*] metatag - provide SEO friendly pages
[*] mayan_places - set location field to a random city in the Mayan world
[*] morechoice - additional gender/sexual-preference choices for profiles (not safe for work)
[*] moremoods - Additional mood options
@ -60,6 +69,7 @@
[*] startpage - set a personal preferred page to redirect after logging in.
[*] statistics_json - Diaspora statistics generator
[*] statusnet - GNU-social and StatusNet crosspost [zrl=[baseurl]/help/addons_gnusocial]Posting To Gnu Social[/zrl]
[*] std_embeds - allow unfiltered embeds for popular providers like youtube, vimeo and soundcloud
[*] superblock - Highly recommended - completely block an offensive channel from your stream
[*] testdrive - Turns your hub into a test drive site with accounts that expire after a trail period.
[*] tictac - 3D tic-tac-toe

1
doc/context/es-es Symbolic link
View File

@ -0,0 +1 @@
es

View File

@ -1,36 +1,9 @@
<html>
<head>
<meta content="text/html; charset=windows-1252" http-equiv="content-type">
</head>
<body>
<dl class="dl-horizontal">
<dt>General</dt>
<dd><span id="result_box" class="" lang="es"><span>Esta página</span> <span>le
permite ajustar</span> <span>los parámetros de los informes del
sistema (logs)</span> <span>y para</span> <span>ver uno</span> <span>existente</span><span
class="">.</span></span></dd>
<dd>Esta página le permite ajustar los parámetros de los informes del sistema (logs) y para ver uno existente.</dd>
<dt>Ajustes de los informes (logs)</dt>
<dd><span id="result_box" class="" lang="es"><span>Cuando se habilita la</span>
<span>opción de depuración</span><span>,</span> el <span>sistema de</span>
<span>información</span> <span class="">comenzará</span> a <span>añadir
</span>los informes (logs) <span>en el archivo especificado</span> <span>en
el cuadro</span> <span>"</span><span>Fichero de informes</span><span>"</span>
<span>(la </span><span class="">ruta es relativa</span> <span class="">al
directorio raíz del servidor</span><span>,</span> <span>por
ejemplo,</span> <span>/</span><span>var</span> <span>/</span><span>www</span><span
class="">)</span><span>.</span> <span>Tenga en cuenta que</span> <span
class="">este archivo</span> <span class="">tiene que</span> <span
class="">ser modificable por el</span> <span>servidor web</span><span>.</span></span></dd>
<dt>Nivel de depuración</dt>
<dd><span id="result_box" class="" lang="es"><span>La opción de</span> <span>nivel
de depuración</span> <span>le permite establecer</span> <span>la
cantidad de información</span> <span>que se</span> <span>anexa al
fichero de informes (logs)</span><span>.</span> <span>Advertencia</span><span>:</span>
<span>El aumento de</span> <span>este nivel</span> <span>puede
aumentar</span> <span>rápidamente el tamaño</span> <span>de este
fichero hasta en más de</span><span></span> <span>100 MB</span><span>,
especialmente</span> <span>en</span> <span>los hubs</span> <span>con</span>
<span>más que unos pocos</span> <span>miembros</span><span class="">.</span></span></dd>
<dd>Cuando se habilita la opción de depuración, el sistema de información comenzará a añadir los informes (logs) en el archivo especificado en el cuadro "Fichero de informes"
(la ruta es relativa al directorio raíz del servidor, por ejemplo, /var /www). Tenga en cuenta que este archivo tiene que ser modificable por el servidor web.</dd>
<dt>Nivel de depuración</dt>
<dd>La opción de nivel de depuración le permite establecer la cantidad de información que se anexa al fichero de informes (logs). Advertencia: El aumento de este nivel puede aumentar rápidamente el tamaño de este fichero hasta en más de 100 MB, especialmente en los hubs con más que unos pocos miembros.</dd>
</dl>
</body>
</html>

View File

@ -1,17 +1,4 @@
<html>
<head>
<meta content="text/html; charset=windows-1252" http-equiv="content-type">
</head>
<body>
<dl class="dl-horizontal">
<dt>General</dt>
<dd><span id="result_box" class="" lang="es"><span>Las estadísticas</span>
<span>de la cola muestran</span> <span>cuántos</span> <span>mensajes</span>
<span>están en</span> <span>la cola</span> <span>para su entrega a</span>
<span>otros hubs</span><span>.</span> <span class="">La prioridad</span>
<span>está relacionada con</span> <span>la cantidad de veces</span>
que <span>la entrega</span> <span>se ha intentado</span><span>, sin
éxito</span><span>.</span></span></dd>
<dd>Las estadísticas de la cola muestran cuántos mensajes están en la cola para su entrega a otros hubs. La prioridad está relacionada con la cantidad de veces que la entrega se ha intentado, sin éxito.</dd>
</dl>
</body>
</html>

View File

@ -1,17 +1,4 @@
<html>
<head>
<meta content="text/html; charset=windows-1252" http-equiv="content-type">
</head>
<body>
<dl class="dl-horizontal">
<dt>General</dt>
<dd><span id="result_box" class="" lang="es"><span>Esta página</span> <span>contiene</span>
<span class="">varios ajustes</span> </span><span id="result_box" class=""
lang="es"><span>para el administrador</span> </span><span id="result_box"
class="" lang="es"><span class="">relacionados con la seguridad</span>.
<span>Para</span> <span class="">guardar los cambios que</span> <span
class="">realice en</span> <span>estos ajustes</span><span>, debe
pulsar</span> <span class="">el botón Enviar.</span></span></dd>
<dd>Esta página contiene varios ajustes para el administrador relacionados con la seguridad. Para guardar los cambios que realice en estos ajustes, debe pulsar el botón "Enviar".</dd>
</dl>
</body>
</html>

View File

@ -1,35 +1,8 @@
<html>
<head>
<meta content="text/html; charset=windows-1252" http-equiv="content-type">
</head>
<body>
<dl class="dl-horizontal">
<dt>General</dt>
<dd><span id="result_box" class="" lang="es"><span>Esta</span> <span>es
la</span> <span>página principal de un</span> <span>canal.</span>
<span>Es similar</span> <span>al "muro" del perfil </span><span></span><span></span><span></span>
<span>de una persona</span> <span>en un contexto</span> de <span>red
social</span><span>.</span> <span>Las entradas</span> <span>creadas
por</span> <span>el canal</span> <span>se</span> <span>muestran
de acuerdo con</span> <span>los permisos de visualización</span> <span
class="">del observador</span><span>.</span></span></dd>
<dt>Crear una entrada</dt>
<dd><span id="result_box" class="" lang="es"><span>Si tiene permiso</span>
<span>para crear</span> <span>entradas en</span> <span>la página del
canal</span><span>,</span> <span>a continuación,</span> <span>podrá
ver el</span> <span>editor de entradas</span> <span>en la parte
superior</span><span class="">.</span></span></dd>
<dt><a href="#" onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;'
title="Pulsar sobre el elemento resaltado...">Pestañas de los
contenidos del canal</a></dt>
<dd><span id="result_box" class="" lang="es"><span>Las</span> <span>pestañas</span>
<span>de los contenidos</span> <span>del canal</span> <span>son</span>
<span>enlaces a otros contenidos</span> <span>publicados por el</span>
<span>canal.</span> La pestaña "<span style="font-weight: bold;">Mi
perfil</span>" enlaza con el perfil del canal. La pestaña "<span style="font-weight: bold;">Fotos</span>"
enlaza con las galerías de fotos. La pestaña "<span style="font-weight: bold;">Ficheros</span>"
enlaza con los ficheros de cualquier tipo compartidos por el canal.<span
class=""></span></span></dd>
</dl>
</body>
</html>
<dt>General</dt>
<dd>Esta es la página principal de un canal. Es similar al "muro" del perfil de una persona en un contexto de red social. Las entradas creadas por el canal se muestran de acuerdo con los permisos de visualización
del observador.</dd>
<dt>Crear una entrada</dt>
<dd>Si tiene permiso para crear entradas en la página del canal, a continuación, podrá ver el editor de entradas en la parte superior.</dd>
<dt><a href="#" onclick="contextualHelpFocus(&quot;#tabs-collapse-1&quot;, 0); return false;">Pestañas de los contenidos del canal</a></dt>
<dd>Las pestañas de los contenidos del canal son enlaces a otros contenidos publicados por el canal. La pestaña "<b>Mi perfil</b>" enlaza con el perfil del canal. La pestaña "<b>Fotos</b>" enlaza con las galerías
de fotos. La pestaña "<b>Ficheros</b>" enlaza con los ficheros de cualquier tipo compartidos por el canal.</dd>

View File

@ -1,30 +1,8 @@
<html>
<head>
<meta content="text/html; charset=windows-1252" http-equiv="content-type">
</head>
<body>
<dl class="dl-horizontal">
<dt>General</dt>
<dd><span id="result_box" class="" lang="es"><span>Creación y uso de</span>
<span>salas de chat para</span> <span>comunicarse en tiempo</span> <span>real,
utilizando</span> <span class="">el sistema de</span> <span>permisos</span>
<span>Hubzilla</span> <span>estándar para el</span> <span>control de
acceso a</span> <span class="">la sala de chat</span><span>.</span></span></dd>
<dt>Create una nueva sala de chat</dt>
<dd><span id="result_box" class="" lang="es"><span>Utilice</span> <span>el
botón</span> <span>"</span><span class="">Crear" para</span> <span>crear
una nueva</span> <span class="">sala de chat</span><span>.</span> <span
class="">Introduzca un nombre y</span> <span class="">cuánto tiempo
se deben conservar los mensajes.</span><span class=""></span></span></dd>
<dd>Creación y uso de salas de chat para comunicarse en tiempo real, utilizando el sistema de permisos estándar de Hubzilla para el control de acceso a la sala de chat.</dd>
<dt>Crear una nueva sala de chat</dt>
<dd>Utilice el botón "Crear" para crear una nueva sala de chat. Introduzca un nombre y cuánto tiempo se deben conservar los mensajes.</dd>
<dt>Chatear</dt>
<dd><span id="result_box" class="" lang="es"><span>Introduzca su mensaje
en</span> <span>el cuadro de mensaje</span> <span>y pulse</span> <span>"Enviar".</span>
<span>Se puede establecer un</span> <span>estado</span> <span>seleccionando
el</span> <span>botón de menú</span> <span>sala de chat</span> <span>junto
al botón</span> <span>Enviar.</span> <span>Si hay otras personas</span>
<span>"en la sala</span><span>",</span> <span>serán visibles en</span>
<span>el panel lateral</span>, <span>en</span><span></span> <span>"</span><span
class="">Miembros del chat</span><span>"</span><span class="">.</span></span></dd>
<dd>Introduzca su mensaje en el cuadro de mensaje y pulse "Enviar". Se puede establecer un estado seleccionando el botón de menú sala de chat junto al botón "Enviar". Si hay otras personas en la sala, serán visibles en el panel lateral, en "Miembros del chat".</dd>
</dl>
</body>
</html>

View File

@ -1,30 +1,7 @@
<html>
<head>
<meta content="text/html; charset=windows-1252" http-equiv="content-type">
</head>
<body>
<dl class="dl-horizontal">
<dt>General</dt>
<dd><span id="result_box" class="" lang="es"><span>Esta página</span> <span>muestra
los ficheros en la</span> <span>"nube"</span> <span>de un canal</span><span>.</span>
<span>Los</span> <span>archivos visibles</span> <span>para el
observador</span> <span>dependen de</span> <span>los permisos de
archivo</span> <span>individuales</span> <span>establecidas por</span>
<span>el propietario del canal</span><span>.</span> <span>Si tiene
permiso</span> <span>para crear</span> <span>o</span> <span>cargar
ficheros,</span> <span>verá</span> <span>botones de control</span>
<span>por encima de la</span> <span class="">lista de ficheros.</span></span></dd>
<dt><a href="#" onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;'
title="Pulsar en el elemento resaltado...">Pestañas de los contenidos
del canal<br>
</a></dt>
<dd><span id="result_box" class="" lang="es"><span>Las</span> <span>pestañas</span>
<span>de los contenidos</span> <span>del canal</span> <span>son</span>
<span>enlaces a otros contenidos</span> <span>publicados por el</span>
<span>canal.</span> La pestaña "<span style="font-weight: bold;">Mi
perfil</span>" enlaza con el perfil del canal. La pestaña "<span style="font-weight: bold;">Fotos</span>"
enlaza con las galerías de fotos. La pestaña "Ficheros" enlaza con los
ficheros de cualquier tipo compartidos por el canal.</span></dd>
<dd>Esta página muestra los ficheros en la "nube" de un canal. Los archivos visibles para el observador dependen de los permisos de archivo individuales establecidas por
el propietario del canal. Si tiene permiso para crear o cargar ficheros, verá botones de control por encima de la lista de ficheros.</dd>
<dt><a href="#" onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Pulsar en el elemento resaltado...">Pestañas de los contenidos del canal</a></dt>
<dd>Las pestañas de los contenidos del canal son enlaces a otros contenidos publicados por el canal. La pestaña "<b>Mi perfil</b>" enlaza con el perfil del canal. La pestaña "<b>Fotos</b>" enlaza con las galerías de fotos. La pestaña "<b>Ficheros</b>" enlaza con los ficheros de cualquier tipo compartidos por el canal.</dd>
</dl>
</body>
</html>

View File

@ -1,8 +1,15 @@
<dl class="dl-horizontal">
<dt>General</dt>
<dd>This page displays a list of all this channel's connections. The list can be <a href='#' onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Click to highlight element...">sorted and filtered using the menu button beside the search button</a>. </dd>
<dt>Connection Details</dt>
<dd>Each list entry shows the details of a specific connection. A translucent avatar image indicates an archived connection.</dd>
<dt>Connection Status</dt>
<dd>A connection can be in different states: <ul><li>Archived</li><li>Ignored</li><li>Blocked</li><li>Hidden</li></ul></dd>
</dl>
<dl class="dl-horizontal">
<dt>General</dt>
<dd>Esta página muestra una lista de todas las conexiones de este canal. La lista se puede <a href="#" onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Pulsar sobre el elemento resaltado...">ordenar y filtrar usando el botón de menú al lado del botón de búsqueda</a>.</dd>
<dt>Detalles de la conexión</dt>
<dd>Cada entrada de la lista muestra los detalles de una conexión específica. Una imagen de avatar translúcida indica una conexión archivada.</dd>
<dt>Estado de la conexión</dt>
<dd>Una conexión puede estar en diferentes estados:
<ul>
<li>Archivada</li>
<li>Ignorada</li>
<li>Bloqueada</li>
<li>Oculta</li>
</ul>
</dd>
</dl>

View File

@ -1,24 +1,10 @@
<html>
<head>
<meta content="text/html; charset=windows-1252" http-equiv="content-type">
</head>
<body>
<dl class="dl-horizontal">
<dt>General</dt>
<dd><span id="result_box" class="" lang="es"><span>Esta página</span> <span>muestra
una lista de</span> <span>todas</span> <span>las conexiones</span>
<span class="">de este canal</span><span class="">.</span> <span class="">La</span>
<span class="">lista se puede&nbsp;</span></span><a href="#" onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;'
title="Pulsar sobre el elemento resaltado...">ordenar y filtrar usando
el botón de menú al lado del botón de búsqueda</a>. </dd>
<dt>Detalles de la conexión</dt>
<dd><span id="result_box" class="" lang="es"><span>Cada</span> <span>entrada
de la lista</span> <span>muestra los</span> <span>detalles de una
conexión</span> <span>específica</span><span>.</span> <span>Una</span>
<span>imagen de avatar</span> <span>translúcida</span> <span>indica
una conexión</span> <span class="">archivada.</span></span></dd>
<dt>Estado de la conexión</dt>
<dd>Una conexión puede estar en diferentes estados:
<dd>Esta página muestra una lista de todas las conexiones de este canal. La lista se puede&nbsp;<a href="#" onclick='contextualHelpFocus(".section-title-wrapper", 0); return false;' title="Pulsar sobre el elemento resaltado...">ordenar y filtrar usando el botón de menú al lado del botón de búsqueda</a>. </dd>
<dt>Detalles de la conexión</dt>
<dd>Cada entrada de la lista muestra los detalles de una conexión específica. Una imagen de avatar translúcida indica una conexión archivada.</dd>
<dt>Estado de la conexión</dt>
<dd>Una conexión puede estar en diferentes estados:
<ul>
<li>Archivada</li>
<li>Ignorada</li>
@ -27,5 +13,3 @@
</ul>
</dd>
</dl>
</body>
</html>

View File

@ -1,23 +1,8 @@
<html>
<head>
<meta content="text/html; charset=windows-1252" http-equiv="content-type">
</head>
<body>
<dl class="dl-horizontal">
<dt>General</dt>
<dd><span id="result_box" class="" lang="es"><span>Esta página</span> <span>muestra
un calendario</span> <span>de eventos tanto</span> <span>de su
propiedad como</span> <span class="">compartido con usted</span> <span
class="">desde otros canales.</span></span></dd>
<dt><a href="#" onclick='contextualHelpFocus("#title", 0); return false;'
title="Pulsar en el elemento resaltado...">Vistas del calendario</a></dt>
<dd><span id="result_box" class="" lang="es"><span>El calendario</span> <span>se
puede mostrar en</span> <span>modo mensual</span><span>, semanal o</span>
diario<span> usando</span> <span>las opciones del</span> <span class="">panel
lateral</span><span class="">.</span></span></dd>
<dd>Esta página muestra un calendario de eventos tanto de su propiedad como compartido con usted desde otros canales.</dd>
<dt><a href="#" onclick='contextualHelpFocus("#title", 0); return false;' title="Pulsar en el elemento resaltado...">Vistas del calendario</a></dt>
<dd>El calendario se puede mostrar en modo mensual, semanal o diario usando las opciones del panel lateral.</dd>
<dt>Exportar/Importar</dt>
<dd>Exportar o importar eventos del calendario usando el formato estándar
de los ficheros de iCalendar (.ics).</dd>
<dd>Exportar o importar eventos del calendario usando el formato estándar de los ficheros de iCalendar (.ics).</dd>
</dl>
</body>
</html>

View File

@ -1,38 +1,10 @@
<html>
<head>
<meta content="text/html; charset=windows-1252" http-equiv="content-type">
</head>
<body>
<dl class="dl-horizontal">
<dt>General</dt>
<dd><span id="result_box" class="" lang="es"><span>Los mensajes que
aparecen</span> <span>en</span> <span>el correo privado</span> <span>son</span>
<span>visibles sólo para</span> <span>usted y un</span> <span class="">único
destinatario.</span></span></dd>
<dd>Los mensajes que aparecen en el correo privado son visibles sólo para usted y un único destinatario.</dd>
<dt>Vista combinada</dt>
<dd><span id="result_box" class="" lang="es"><span>Las conversaciones</span>
<span>completas</span> <span>se pueden ver en</span> <span>un hilo
continuo</span> <span>seleccionando</span><span></span> "<span><span
style="font-weight: bold;">Vista combinada</span>"</span><span>.</span>
<span>Las conversaciones</span> <span>disponibles se muestran</span>
<span>debajo del menú</span> <span>en el</span> <span class="">panel
lateral</span><span class="">.</span></span></dd>
<dd>Las conversaciones completas se pueden ver en un hilo continuo seleccionando "<b>Vista combinada</b>". Las conversaciones disponibles se muestran debajo del menú en el panel lateral.</dd>
<dt>Bandeja de entrada/Bandeja de salida</dt>
<dd>Los mensajes individuales enviados son visibles seleccionando la <span
style="font-weight: bold;">Bandeja de salida</span> y los mensajes
recibidos se pueden ver usando el filtro de la <span style="font-weight: bold;">Bandeja
de entrada</span>.<br>
</dd>
<dd>Los mensajes individuales enviados son visibles seleccionando la <b>Bandeja de salida</b> y los mensajes recibidos se pueden ver usando el filtro de la <b>Bandeja de entrada.</b></dd>
<dt>Mensaje nuevo</dt>
<dd><span id="result_box" class="" lang="es"><span>Los mensajes
individuales</span> <span>tienen</span> <span>informes de entrega</span>
<span>que se pueden ver</span> <span>usando</span> <span>el menú</span>
<span>desplegable.</span> <span>Los mensajes también</span> <span>se
pueden revocar</span> <span>desde el mismo menú</span><span>, lo
que puede</span> <span>evitar que el destinatario</span> <span>vea
el mensaje</span><span>, <span style="font-style: italic;">si</span></span><span
style="font-style: italic;"> <span>aún no lo ha</span> </span><span
class=""><span style="font-style: italic;">leído</span>.</span></span></dd>
</dl>
</body>
</html>
<dd>Los mensajes individuales tienen informes de entrega que se pueden ver usando el menú desplegable. Los mensajes también se pueden revocar desde el mismo menú, lo que puede evitar que el destinatario vea el mensaje, <i>si aún no lo ha leído</i>.</dd>
</dl>

View File

@ -1,71 +1,12 @@
<html>
<head>
<meta content="text/html; charset=windows-1252" http-equiv="content-type">
</head>
<body>
<dl class="dl-horizontal">
<dt>General</dt>
<dd><span id="result_box" class="" lang="es"><span>La</span> <span>página
de</span> <span>Mi red muestra</span> <span>un flujo</span> <span>de</span>
<span>entradas</span> <span>y conversaciones</span><span>,</span> <span>normalmente</span>
<span>ordenadas según la</span> <span>actualización más reciente</span><span>.</span>
<span>Esta página</span> <span>es</span> <span>altamente
personalizable</span><span class="">.</span></span></dd>
<dt><a href="#" onclick='contextualHelpFocus("#profile-jot-wrapper", 0); return false;'
title="Pulsar sobre el elemento resaltado...">Crear una entrada<br>
</a></dt>
<dd><span id="result_box" class="" lang="es"><span>En la parte superior</span>
<span>de la</span> <span>página hay un</span> <span>cuadro de texto
que</span> <span>dice</span> <span>"</span><span style="font-weight: bold;">Compartir</span><span>"</span><span>.</span>
<span>Al hacer clic en</span> <span>esta casilla</span> <span>se
abre</span> <span>un nuevo</span> <span>editor de entradas</span><span>.</span>
<span>El</span> <span>editor de entradas</span> <span>es
personalizable</span><span>,</span> <span>pero el</span> <span>editor
básico</span> <span>proporciona</span> <span>campos para</span> <span>el
cuerpo de la publicación y un</span><span></span> <span>título</span>
<span>opcional.</span> <span>Los botones que hay debajo de la</span>
<span>zona de</span> <span>texto, a la izquierda,</span> <span>proporcionan</span>
<span>accesos directos para el</span> <span><span style="font-weight: bold;">Formato</span>
de texto</span> <span>y para&nbsp; insertar</span> <span>enlaces</span><span>,
imágenes y</span> <span>otros</span> <span>datos en</span> <span>la
entrada</span><span>.</span> <span>Los</span> <span>botones a la
derecha</span> <span>proporcionan una</span> <span class="">vista
previa del</span> <span class="">mensaje</span><span class="">,</span>
<span>los ajustes</span><span> de permisos</span> <span>de la entrada</span><span>,</span>
<span>y</span> <span>un botón <span style="font-weight: bold;">Enviar</span></span>
<span>para publicarla</span><span></span><span>.</span></span></dd>
<dt><a href="#" onclick='contextualHelpFocus("#group-sidebar", 1); return false;'
title="Pulsar sobre el elemento resaltado...">Grupos de canales<br>
</a></dt>
<dd><span id="result_box" class="" lang="es"><span>Los</span> <span>grupos
de canales</span> <span>que ha creado</span> <span>se muestran en
el</span> <span>panel lateral</span><span>.</span> <span class="">Seleccionándolos,
se</span><span class=""> filtran</span> <span class="">las entradas</span>
<span></span><span>creadas por</span> <span>los canales incluidos en
el</span> <span>grupo elegido</span><span class="">.</span></span></dd>
<dt><a href="#" onclick='$("#dbtn-acl").click(); return false;' title="Pulsar sobre el elemento resaltado...">Permisos
de una entrada<br>
</a></dt>
<dd><span id="result_box" class="" lang="es"><span>La lista</span> <span>de
control de acceso</span> <span>(</span><span>ACL) es</span> <span>lo
que se utiliza</span> <span>para establecer</span> <span>quién
puede ver su</span> <span>nueva entrada</span><span>.</span> <span>Al
pulsar el</span> <span>botón ACL</span>, <span>al lado del</span>
<span>botón Enviar,</span> <span>se mostrará</span> <span>un cuadro
de diálogo</span> <span>en</span> <span>el que puede seleccionar</span>
<span>qué canales</span> <span>y /</span> <span>o</span> <span>grupos
de canales</span> <span>pueden ver el</span> <span>mensaje</span><span>.</span>
<span>También puede seleccionar</span> <span>a quién se le niega</span>
<span>el acceso explícitamente</span><span>.</span> <span>Por ejemplo</span><span>,
digamos que usted</span> <span>está planeando</span> <span>una
fiesta sorpresa para</span> <span>un amigo</span><span>.</span> <span>Puede
enviar un</span> <span>mensaje</span> <span>de invitación</span> <span>a</span>
<span>todos los miembros de</span> <span>su grupo de</span> <span style="font-weight: bold;">Amigos</span><span>,
excepto el</span> <span>amigo al que quiere sorprender</span><span
class="">.</span> <span class="">En este caso,</span> <span>"se
mostrará"&nbsp;</span> <span>al grupo de</span> <span>amigos, pero</span>
<span>"</span><span>no se mostrará</span><span>"</span> <span>a esa
única</span><span class=""> persona.</span></span></dd>
<dd>La página de "Mi red" muestra un flujo de entradas y conversaciones, normalmente ordenadas según la actualización más reciente. Esta página es altamente personalizable.</dd>
<dt><a href="#" onclick='contextualHelpFocus("#profile-jot-wrapper", 0); return false;' title="Pulsar sobre el elemento resaltado...">Crear una entrada</a></dt>
<dd>En la parte superior de la página hay un cuadro de texto que dice "<b>Compartir</b>". Al hacer clic en esta casilla se abre un nuevo editor de entradas. El editor de entradas es personalizable, pero el editor básico proporciona campos para el cuerpo de la publicación y un título opcional. Los botones que hay debajo de la zona de texto, a la izquierda, proporcionan
accesos directos para el <b>Formato</b> de texto y para&nbsp; insertar enlaces, imágenes y otros datos en la entrada. Los botones a la derecha proporcionan una vista previa del mensaje, los ajustes de permisos de la entrada, y un botón <b>Enviar</b> para publicarla.</dd>
<dt><a href="#" onclick='contextualHelpFocus("#group-sidebar", 1); return false;' title="Pulsar sobre el elemento resaltado...">Grupos de canales</a></dt>
<dd>Los grupos de canales que ha creado se muestran en el panel lateral. Seleccionándolos, se filtran las entradas creadas por los canales incluidos en el grupo elegido.</dd>
<dt><a href="#" onclick='$("#dbtn-acl").click(); return false;' title="Pulsar sobre el elemento resaltado...">Permisos de una entrada</a></dt>
<dd>La lista de control de acceso (ACL) es lo que se utiliza para establecer quién puede ver su nueva entrada. Al pulsar el botón ACL, al lado del botón Enviar, se mostrará un cuadro de diálogo en el que puede seleccionar qué canales y / o grupos de canales pueden ver el mensaje. También puede seleccionar a quién se le niega el acceso explícitamente. Por ejemplo,di gamos que usted está planeando una
fiesta sorpresa para un amigo. Puede enviar un mensaje de invitación a todos los miembros de su grupo de <b>Amigos</b>, excepto el amigo al que quiere sorprender. En este caso, "se mostrará" al grupo de amigos, pero "no se mostrará" a esa única persona.</dd>
</dl>
</body>
</html>

View File

@ -1,27 +1,6 @@
<html>
<head>
<meta content="text/html; charset=windows-1252" http-equiv="content-type">
</head>
<body>
<dl class="dl-horizontal">
<dt>General</dt>
<dd><span id="result_box" class="" lang="es"><span>Esta página</span> <span>muestra</span>
<span class="">los álbumes de fotos</span> <span class="">de un canal</span><span>.</span>
<span>Las</span> <span>imágenes visibles</span> <span class="">para
el observador</span> <span class="">dependen de</span> <span class="">los
permisos</span> <span class="">individuales de cada imagen</span><span
class="">.</span></span></dd>
<dt><a href="#" onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;'
title="Pulsar sobre el elemento resaltado...">Pestañas de los
contenidos del canal<br>
</a></dt>
<dd><span id="result_box" class="" lang="es"><span>Las</span> <span>pestañas</span>
<span>de los contenidos</span> <span>del canal</span> <span>son</span>
<span>enlaces a otros contenidos</span> <span>publicados por el</span>
<span>canal.</span> La pestaña "<span style="font-weight: bold;">Mi
perfil</span>" enlaza con el perfil del canal. La pestaña "<span style="font-weight: bold;">Fotos</span>"
enlaza con las galerías de fotos. La pestaña "<span style="font-weight: bold;">Ficheros</span>"
enlaza con los ficheros de cualquier tipo compartidos por el canal.</span></dd>
<dd>Esta página muestra los álbumes de fotos de un canal. Las imágenes visibles para el observador dependen de los permisos individuales de cada imagen.</dd>
<dt><a href="#" onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Pulsar sobre el elemento resaltado...">Pestañas de los contenidos del canal</a></dt>
<dd>Las pestañas de los contenidos del canal son enlaces a otros contenidos publicados por el canal. La pestaña "<b>Mi perfil</b>" enlaza con el perfil del canal. La pestaña "<b>Fotos</b>" enlaza con las galerías de fotos. La pestaña "<b>Ficheros</b>" enlaza con los ficheros de cualquier tipo compartidos por el canal.</dd>
</dl>
</body>
</html>

View File

@ -1,32 +1,6 @@
<html>
<head>
<meta content="text/html; charset=windows-1252" http-equiv="content-type">
</head>
<body>
<dl class="dl-horizontal">
<dt>General</dt>
<dd><span id="result_box" class="" lang="es"><span>Esta</span> <span>es
la página de</span> <span>perfil</span> <span>de un canal</span><span>.</span>
<span>Por lo general</span> <span>muestra</span> la <span>información
que describe el</span> <span>canal.</span> <span>Si el canal</span>
<span>representa a una persona</span> <span>en una red social</span><span>,
por ejemplo</span><span>, el perfil</span> <span>podría
proporcionar</span> <span>información de contacto y</span> <span>otros</span>
<span>datos personales</span><span></span><span>.</span> <span>Los
canales pueden</span> <span>tener varios perfiles</span><span>,</span>
<span>en cuyo caso el</span> <span>perfil que se muestra</span> <span
class="">depende del observador</span><span>.</span></span></dd>
<dt><a href="#" onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;'
title="Pulsar sobre el elemento resaltado...">Pestañas de los
contenidos del canal<br>
</a></dt>
<dd><span id="result_box" class="" lang="es"><span>Las</span> <span>pestañas</span>
<span>de los contenidos</span> <span>del canal</span> <span>son</span>
<span>enlaces a otros contenidos</span> <span>publicados por el</span>
<span>canal.</span> La pestaña "<span style="font-weight: bold;">Mi
perfil</span>" enlaza con el perfil del canal. La pestaña "<span style="font-weight: bold;">Fotos</span>"
enlaza con las galerías de fotos. La pestaña "<span style="font-weight: bold;">Ficheros</span>"
enlaza con los ficheros de cualquier tipo compartidos por el canal.</span></dd>
<dd>Esta es la página de perfil de un canal. Por lo general muestra la información que describe el canal. Si el canal representa a una persona en una red social, por ejemplo, el perfil podría proporcionar información de contacto y otros datos personales. Los canales pueden tener varios perfiles, en cuyo caso el perfil que se muestra depende del observador.</dd>
<dt><a href="#" onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Pulsar sobre el elemento resaltado...">Pestañas de los contenidos del canal</a></dt>
<dd>Las pestañas de los contenidos del canal son enlaces a otros contenidos publicados por el canal. La pestaña "Mi perfil" enlaza con el perfil del canal. La pestaña "Fotos" nlaza con las galerías de fotos. La pestaña "Ficheros" enlaza con los ficheros de cualquier tipo compartidos por el canal.</dd>
</dl>
</body>
</html>

View File

@ -389,7 +389,7 @@ function channel_remove($channel_id, $local = true, $unset_session=false) {
proc_run('php','include/directory.php',$channel_id);
if($channel_id == local_channel() && $unset_session) {
\Zotlabs\Web\Session::nuke();
App::$session->nuke();
goaway(z_root());
}

View File

@ -271,7 +271,8 @@ function populate_acl($defaults = null,$show_jotnets = true, $emptyACL_descripti
'$showall' => $showall_caption,
'$showallOrigin' => $showall_origin,
'$showallIcon' => $showall_icon,
'$showlimited' => t("Limit access:"),
'$select_label' => t('Who can see this'),
'$showlimited' => t('Custom selection'),
'$showlimitedDesc' => t('Select "Show" to allow viewing. "Don\'t show" lets you override and limit the scope of "Show".'),
'$show' => t("Show"),
'$hide' => t("Don't show"),

View File

@ -486,7 +486,7 @@ require_once('include/api_auth.php');
function api_account_logout(&$a, $type){
require_once('include/auth.php');
\Zotlabs\Web\Session::nuke();
App::$session->nuke();
return api_apply_template("user", $type, array('$user' => null));
}

View File

@ -101,7 +101,7 @@ if((isset($_SESSION)) && (x($_SESSION, 'authenticated')) &&
// process logout request
$args = array('channel_id' => local_channel());
call_hooks('logging_out', $args);
\Zotlabs\Web\Session::nuke();
App::$session->nuke();
info( t('Logged out.') . EOL);
goaway(z_root());
}
@ -117,7 +117,7 @@ if((isset($_SESSION)) && (x($_SESSION, 'authenticated')) &&
intval(ACCOUNT_ROLE_ADMIN)
);
if($x) {
\Zotlabs\Web\Session::new_cookie(60 * 60 * 24); // one day
App::$session->new_cookie(60 * 60 * 24); // one day
$_SESSION['last_login_date'] = datetime_convert();
unset($_SESSION['visitor_id']); // no longer a visitor
authenticate_success($x[0], true, true);
@ -141,7 +141,7 @@ if((isset($_SESSION)) && (x($_SESSION, 'authenticated')) &&
if(x($_SESSION, 'uid') || x($_SESSION, 'account_id')) {
Zotlabs\Web\Session::return_check();
App::$session->return_check();
$r = q("select * from account where account_id = %d limit 1",
intval($_SESSION['account_id'])
@ -155,14 +155,14 @@ if((isset($_SESSION)) && (x($_SESSION, 'authenticated')) &&
}
if(strcmp(datetime_convert('UTC','UTC','now - 12 hours'), $_SESSION['last_login_date']) > 0 ) {
$_SESSION['last_login_date'] = datetime_convert();
Zotlabs\Web\Session::extend_cookie();
App::$session->extend_cookie();
$login_refresh = true;
}
authenticate_success($r[0], false, false, false, $login_refresh);
}
else {
$_SESSION['account_id'] = 0;
\Zotlabs\Web\Session::nuke();
App::$session->nuke();
goaway(z_root());
}
} // end logged in user returning
@ -170,7 +170,7 @@ if((isset($_SESSION)) && (x($_SESSION, 'authenticated')) &&
else {
if(isset($_SESSION)) {
\Zotlabs\Web\Session::nuke();
App::$session->nuke();
}
// handle a fresh login request
@ -242,11 +242,11 @@ else {
if($_POST['remember_me']) {
$_SESSION['remember_me'] = 1;
\Zotlabs\Web\Session::new_cookie(31449600); // one year
App::$session->new_cookie(31449600); // one year
}
else {
$_SESSION['remember_me'] = 0;
\Zotlabs\Web\Session::new_cookie(0); // 0 means delete on browser exit
App::$session->new_cookie(0); // 0 means delete on browser exit
}
// if we haven't failed up this point, log them in.

View File

@ -30,7 +30,8 @@ function cli_startup() {
unset($db_host, $db_port, $db_user, $db_pass, $db_data, $db_type);
};
\Zotlabs\Web\Session::init();
App::$session = new Zotlabs\Web\Session();
App::$session->init();
load_config('system');

View File

@ -25,23 +25,31 @@ function dba_factory($server, $port,$user,$pass,$db,$dbtype,$install = false) {
$dba = null;
$dbtype = intval($dbtype);
$set_port = $port;
if($dbtype == DBTYPE_POSTGRES) {
require_once('include/dba/dba_postgres.php');
if(is_null($port)) $port = 5432;
$dba = new dba_postgres($server, $port, $user, $pass, $db, $install);
if(is_null($port)) $set_port = 5432;
$dba = new dba_postgres($server, $set_port, $user, $pass, $db, $install);
} else {
if(class_exists('mysqli')) {
if (is_null($port)) $port = ini_get("mysqli.default_port");
if (is_null($port)) $set_port = ini_get("mysqli.default_port");
require_once('include/dba/dba_mysqli.php');
$dba = new dba_mysqli($server, $port,$user,$pass,$db,$install);
$dba = new dba_mysqli($server, $set_port,$user,$pass,$db,$install);
} else {
if (is_null($port)) $port = "3306";
if (is_null($port)) $set_port = "3306";
require_once('include/dba/dba_mysql.php');
$dba = new dba_mysql($server, $port,$user,$pass,$db,$install);
$dba = new dba_mysql($server, $set_port,$user,$pass,$db,$install);
}
}
if(is_object($dba) && $dba->connected) {
$dns = (($dbtype == DBTYPE_POSTGRES) ? 'postgres' : 'mysql')
. ':host=' . $server . (is_null($port) ? '' : ';port=' . $port)
. ';dbname=' . $db;
$dba->pdo_set(array($dns,$user,$pass));
}
define('NULL_DATE', $dba->get_null_date());
define('ACTIVE_DBTYPE', $dbtype);
return $dba;
@ -60,6 +68,7 @@ abstract class dba_driver {
const UTC_NOW = 'UTC_TIMESTAMP()';
protected $db;
protected $pdo = array();
public $debug = 0;
public $connected = false;
@ -183,6 +192,15 @@ abstract class dba_driver {
function unescapebin($str) {
return $str;
}
function pdo_set($x) {
$this->pdo = $x;
}
function pdo_get() {
return $this->pdo;
}
} // end abstract dba_driver class

1316
include/feedutils.php Normal file

File diff suppressed because it is too large Load Diff

View File

@ -21,7 +21,7 @@ function import_channel($channel, $account_id, $seize) {
dbesc($channel['channel_address'])
);
if(($r) || (check_webbie(array($channel['channel_hash'])) !== $channel['channel_hash'])) {
if(($r) || (check_webbie(array($channel['channel_address'])) !== $channel['channel_address'])) {
if($r[0]['channel_guid'] === $channel['channel_guid'] || $r[0]['channel_hash'] === $channel['channel_hash']) {
logger('mod_import: duplicate channel. ', print_r($channel,true));
notice( t('Cannot create a duplicate channel identifier on this system. Import failed.') . EOL);
@ -90,7 +90,6 @@ function import_channel($channel, $account_id, $seize) {
set_default_login_identity($account_id,$channel['channel_id'],false);
logger('import step 1');
$_SESSION['import_step'] = 1;
ref_session_write(session_id(), serialize($_SESSION));
return $channel;
}

File diff suppressed because it is too large Load Diff

View File

@ -1168,6 +1168,10 @@ function discover_by_webbie($webbie) {
if(! $x)
$probe_old = true;
if((! $dfrn) && (! $has_salmon))
$probe_old = true;
if($probe_old) {
$y = old_webfinger($webbie);
if($y) {

View File

@ -1953,6 +1953,16 @@ function remove_community_tag($sender, $arr, $uid) {
*/
function update_imported_item($sender, $item, $orig, $uid) {
// If this is a comment being updated, remove any privacy information
// so that item_store_update will set it from the original.
if($item['mid'] !== $item['parent_mid']) {
unset($item['allow_cid']);
unset($item['allow_gid']);
unset($item['deny_cid']);
unset($item['deny_gid']);
unset($item['item_private']);
}
$x = item_store_update($item);

View File

@ -62,7 +62,8 @@ if(! App::$install) {
load_config('system');
load_config('feature');
\Zotlabs\Web\Session::init();
App::$session = new \Zotlabs\Web\Session();
App::$session->init();
load_hooks();
call_hooks('init_1');
@ -84,7 +85,13 @@ if(! App::$install) {
*
*/
\Zotlabs\Web\Session::start();
if(App::$session) {
App::$session->start();
}
else {
session_start();
register_shutdown_function('session_write_close');
}
/**
* Language was set earlier, but we can over-ride it in the session.
@ -136,12 +143,6 @@ else
nav_set_selected('nothing');
$arr = array('app_menu' => App::get_apps());
call_hooks('app_menu', $arr);
App::set_apps($arr['app_menu']);
$Router = new Zotlabs\Web\Router($a);
/* initialise content region */

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -11,30 +11,44 @@ function ACL(backend_url, preset) {
that.deny_cid = (preset[2] || []);
that.deny_gid = (preset[3] || []);
that.group_uids = [];
that.nw = 4; //items per row. should be calulated from #acl-list.width
that.info = $("#acl-info");
that.list = $("#acl-list");
that.list_content = $("#acl-list-content");
that.item_tpl = unescape($(".acl-list-item[rel=acl-template]").html());
that.showall = $("#acl-showall");
that.showlimited = $("#acl-showlimited");
that.acl_select = $("#acl-select");
that.preset = preset;
that.self = [];
// set the initial ACL lists in case the enclosing form gets submitted before the ajax loader completes.
that.on_submit();
if (preset.length === 0) that.showall.removeClass("btn-default").addClass("btn-warning");
/*events*/
$(document).ready(function() {
that.showall.click(that.on_showall);
that.showlimited.click(that.on_showlimited);
$(document).on('click','.acl-button-show',that.on_button_show);
$(document).on('click','.acl-button-hide',that.on_button_hide);
$("#acl-search").keypress(that.on_search);
/* startup! */
that.get(0,15000);
that.on_submit();
that.acl_select.change(function(event) {
var option = that.acl_select.val();
if(option == 'option1') { // public
that.on_showall(event);
}
if(option == 'option2') { // restricted
that.on_showlimited(event);
}
});
$(document).on('click','.acl-button-show',that.on_button_show);
$(document).on('click','.acl-button-hide',that.on_button_hide);
$("#acl-search").keypress(that.on_search);
/* startup! */
that.get(0,15000);
that.on_submit();
});
}
@ -73,15 +87,9 @@ ACL.prototype.on_search = function(event) {
};
ACL.prototype.on_showall = function(event) {
// preventDefault() isn't called here as we want state changes from update_view() to be applied to the radiobutton
event.stopPropagation();
if (that.showall.hasClass("btn-warning")) {
return false;
}
that.showall.removeClass("btn-default").addClass("btn-warning");
that.allow_cid = [];
that.allow_gid = [];
that.deny_cid = [];
@ -94,11 +102,22 @@ ACL.prototype.on_showall = function(event) {
};
ACL.prototype.on_showlimited = function(event) {
// Prevent the radiobutton from being selected, as the showlimited radiobutton
// option is selected only by selecting show or hide options on channels or groups.
event.preventDefault();
// preventDefault() isn't called here as we want state changes from update_view() to be applied to the radiobutton
event.stopPropagation();
return false;
if(that.preset[0].length === 0 && that.preset[1].length === 0 && that.preset[2].length === 0 && that.preset[3].length === 0) {
that.preset[0] = [that.self[0]];
}
that.allow_cid = (that.preset[0] || []);
that.allow_gid = (that.preset[1] || []);
that.deny_cid = (that.preset[2] || []);
that.deny_gid = (that.preset[3] || []);
that.update_view();
that.on_submit();
return true; // return true so that state changes from update_view() will be applied
}
ACL.prototype.on_selectall = function(event) {
@ -199,29 +218,26 @@ ACL.prototype.set_deny = function(itemid) {
that.update_view();
};
ACL.prototype.update_radiobuttons = function(isPublic) {
that.showall.prop('checked', isPublic);
that.showlimited.prop('checked', !isPublic);
that.showlimited.prop('disabled', isPublic);
ACL.prototype.update_select = function(isPublic) {
that.showall.prop('selected', isPublic);
that.showlimited.prop('selected', !isPublic);
};
ACL.prototype.update_view = function() {
if (that.allow_gid.length === 0 && that.allow_cid.length === 0 &&
that.deny_gid.length === 0 && that.deny_cid.length === 0) {
// btn-warning indicates that the permissions are public, it was chosen because
// that.showall used to be a normal button, which btn-warning is a bootstrap style for.
that.showall.removeClass("btn-default").addClass("btn-warning");
that.update_radiobuttons(true);
if (that.allow_gid.length === 0 && that.allow_cid.length === 0 && that.deny_gid.length === 0 && that.deny_cid.length === 0) {
that.list.hide(); //hide acl-list
that.info.show(); //show acl-info
that.update_select(true);
/* jot acl */
$('#jot-perms-icon, #dialog-perms-icon').removeClass('fa-lock').addClass('fa-unlock');
$('#jot-public').show();
$('.profile-jot-net input').attr('disabled', false);
/* jot acl */
$('#jot-perms-icon, #dialog-perms-icon').removeClass('fa-lock').addClass('fa-unlock');
$('#jot-public').show();
$('.profile-jot-net input').attr('disabled', false);
} else {
that.showall.removeClass("btn-warning").addClass("btn-default");
that.update_radiobuttons(false);
that.list.show(); //show acl-list
that.info.hide(); //hide acl-info
that.update_select(false);
/* jot acl */
$('#jot-perms-icon, #dialog-perms-icon').removeClass('fa-unlock').addClass('fa-lock');
@ -300,12 +316,11 @@ ACL.prototype.get = function(start, count, search) {
};
ACL.prototype.populate = function(data) {
var height = Math.ceil(data.items.length / that.nw) * 42;
that.list_content.height(height);
$(data.items).each(function(){
html = "<div class='acl-list-item {4} {7} {5}' title='{6}' id='{2}{3}'>"+that.item_tpl+"</div>";
html = html.format(this.photo, this.name, this.type, this.xid, '', this.self, this.link, this.taggable);
if (this.uids !== undefined) that.group_uids[this.xid] = this.uids;
if (this.self === 'abook-self') that.self[0] = this.xid;
//console.log(html);
that.list_content.append(html);
});

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -333,6 +333,15 @@ input {
text-decoration: none;
}
.section-content-info-wrapper {
color: #fff;
background-color: #43488A;
}
.section-content-info-wrapper a {
color: #fff;
}
.btn, #event-edit-form .btn, input.directory-rating-submit {
border: 1px solid #FFF;
color: #FFF;
@ -450,7 +459,7 @@ a:hover > .fa-trash-o {
.navbar-inverse .navbar-toggle .icon-bar {
background-color: #FFF;
}
.navbar-inverse .navbar-toggle .fa-arrow-circle-down, .navbar-inverse .navbar-toggle .fa-arrow-circle-right, .navbar-inverse .navbar-toggle .fa-arrow-circle-up, .navbar-inverse .navbar-toggle .fa-arrow-circle-left {
.navbar-inverse .navbar-toggle .fa-arrow-circle-down, .navbar-inverse .navbar-toggle .fa-arrow-circle-right, .navbar-inverse .navbar-toggle .fa-arrow-circle-up, .navbar-inverse .navbar-toggle .fa-arrow-circle-left, .navbar-inverse .navbar-toggle .fa-question-circle {
color: #FFF;
}
.navbar-inverse .navbar-toggle:hover .fa-arrow-circle-down, .navbar-inverse .navbar-toggle:focus .fa-arrow-circle-down, .navbar-inverse .navbar-toggle:hover .fa-arrow-circle-right, .navbar-inverse .navbar-toggle:focus .fa-arrow-circle-right, .navbar-inverse .navbar-toggle:hover .fa-arrow-circle-up, .navbar-inverse .navbar-toggle:focus .fa-arrow-circle-up, .navbar-inverse .navbar-toggle:hover .fa-arrow-circle-left, .navbar-inverse .navbar-toggle:focus .fa-arrow-circle-left {

View File

@ -63,7 +63,7 @@
background-image: linear-gradient(to bottom, #1E1E1E 0px, #1E1E1E 100%);
}
.alert-info {
.alert-info, .section-content-info-wrapper {
color: #CCC;
background-color:#333;
border-color: #444;
@ -79,16 +79,35 @@
color: #fff;
}
#acl-showall {
color: #fff;
#acl-select {
background-color:#333;
border: 1px solid #444;
color: #FFF;
}
#acl-showall {
color: #FFF;
}
#acl-list {
border: 1px solid #333;
border: 1px solid #444;
}
#acl-search-wrapper {
border-bottom: 1px solid #444;
}
.acl-list-item {
border: 1px solid #333;
border: 1px solid #222;
color: #CCC;
background-color:#333;
}
.abook-self {
border: 1px solid #222;
color: #555;
background-color:#111;
}
.modal-content {
@ -312,7 +331,7 @@ pre {
background-image: none;
}
.open .dropdown-toggle.btn-default {
.open .dropdown-toggle.btn-default, .open .dropdown-toggle.btn-default:focus {
color: #ccc;
background-color: #222;
border-color: #222;

View File

@ -51,8 +51,21 @@
background-image: linear-gradient(to bottom, #fff 0px, #fff 100%);
}
#acl-select {
border: 1px solid #000;
color: #000;
}
.acl-list-item {
border: 1px solid #000;
background-color: #FFF;
}
.abook-self {
background-color: #fff;
border: 1px solid #EEE;
color: #ccc;
background-color: #EEE;
}
.acl-button-show,
@ -60,18 +73,10 @@
color: #000;
}
#acl-showall {
color: #000;
}
#acl-list {
border: 1px solid #fff;
}
.acl-list-item {
border: 1px solid #fff;
}
.modal-content {
background-color: #fff;
}

View File

@ -51,8 +51,30 @@
background-image: linear-gradient(to bottom, #000 0px, #000 100%);
}
.section-content-info-wrapper {
color: #50f148;
background-color:#000;
border: 1px solid #143D12 !important;
}
.modal-header {
border-bottom: 1px solid #143D12;
}
.modal-footer {
border-top: 1px solid #143D12;
}
#acl-select {
background-color: #000;
border: 1px solid #143D12;
color: #50f148;
}
.abook-self {
background-color: #000;
color: #333;
background-color: #000 !important;
border: 1px solid #111;
}
.acl-button-show,
@ -60,16 +82,18 @@
color: #fff;
}
#acl-showall {
color: #fff;
#acl-list {
border: 1px solid #143D12;
}
#acl-list {
border: 1px solid #000;
#acl-search-wrapper {
border-bottom: 1px solid #143D12;
}
.acl-list-item {
border: 1px solid #000;
border: 1px solid #111;
background-color:#111;
}
.modal-content {
@ -267,7 +291,7 @@ pre {
background-image: none;
}
.open .dropdown-toggle.btn-default {
.open .dropdown-toggle.btn-default, .open .dropdown-toggle.btn-default:focus {
color: #50f148;
background-color: #000;
border-color: #143D12;

View File

@ -47,8 +47,30 @@
background-image: linear-gradient(to bottom, #000 0px, #000 100%);
}
.section-content-info-wrapper {
color: #fff;
background-color:#000;
border: 1px solid #fff !important;
}
.modal-header {
border-bottom: 1px solid #000;
}
.modal-footer {
border-top: 1px solid #000;
}
#acl-select {
background-color: #000;
border: 1px solid #fff;
color: #fff;
}
.abook-self {
background-color: #000;
color: #333;
background-color: #111 !important;
border: 1px solid #111;
}
.acl-button-show,
@ -56,16 +78,17 @@
color: #fff;
}
#acl-showall {
color: #fff;
#acl-list {
border: 1px solid #000;
}
#acl-list {
border: 1px solid #000;
#acl-search-wrapper {
border-bottom: 1px solid #000;
}
.acl-list-item {
border: 1px solid #000;
border: 1px solid #fff;
background-color:#000;
}
.modal-content {
@ -246,10 +269,10 @@ pre {
background-image: none;
}
.open .dropdown-toggle.btn-default {
.open .dropdown-toggle.btn-default, .open .dropdown-toggle.btn-default:focus {
color: #fff;
background-color: #000;
border-color: #000;
border-color: #fff;
}
.preview {

View File

@ -12,6 +12,18 @@
{{if $aclModalDesc}}
<div id="acl-dialog-description" class="section-content-info-wrapper">{{$aclModalDesc}}</div>
{{/if}}
<label for="acl-select">{{$select_label}}</label>
<select id="acl-select" name="optionsRadios" class="form-control form-group">
<option id="acl-showall" value="option1" selected>{{$showall}}</option>
<option id="acl-showlimited" value="option2">{{$showlimited}}</option>
</select>
{{if $showallOrigin}}
<div id="acl-info" class="form-group">
<i class="fa fa-info-circle"></i>&nbsp;{{$showallOrigin}}
</div>
{{/if}}
{{if $jotnets}}
<div class="jotnets-wrapper" role="tab" id="jotnets-wrapper">
<a data-toggle="collapse" class="btn btn-block btn-default" href="#jotnets-collapse" aria-expanded="false" aria-controls="jotnets-collapse">{{$jnetModalTitle}} <span class="caret"></span></a>
@ -21,25 +33,8 @@
<div class="clear"></div>
</div>
{{/if}}
<div id="acl-wrapper">
<div id="acl-radiowrapper-showall" class="radio">
<label>
<input id="acl-showall" type="radio" name="optionsRadios" value="option1" checked>
{{if $showallIcon}}
<i class="fa {{$showallIcon}}"></i>
{{/if}}
<span id="acl-showall-caption">{{$showall}}</span>
</label>
{{if $showallOrigin}}
&nbsp;<a id="acl-info-icon" role="button" tabindex="0" class="fa fa-info-circle" data-trigger="focus" data-toggle="popover" data-placement="top" data-content="{{$showallOrigin}}"></a>
{{/if}}
</div>
<div id="acl-radiowrapper-showlimited" class="radio">
<label>
<input id="acl-showlimited" type="radio" name="optionsRadios" style="readonly" value="option2">
<span id=acl-showlimited-caption>{{$showlimited}}</span>
</label>
</div>
<div id="acl-list">
<div id="acl-search-wrapper">
<input type="text" id="acl-search" placeholder="&#xf002; {{$search}}">

File diff suppressed because one or more lines are too long