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

This commit is contained in:
Andrew Manning 2017-02-13 20:38:11 -05:00
commit 69b08a2062
24 changed files with 4616 additions and 4214 deletions

View File

@ -103,7 +103,24 @@ class Acl extends \Zotlabs\Web\Controller {
$contacts = array();
if($type == '' || $type == 'g') {
$r = q("select id, profile_guid, profile_name from profile where is_default = 0 and uid = %d",
intval(local_channel())
);
if($r) {
foreach($r as $rv) {
$groups[] = array(
"type" => "g",
"photo" => "images/twopeople.png",
"name" => t('Profile','acl') . ' ' . $rv['profile_name'],
"id" => 'vp' . $rv['id'],
"xid" => 'vp.' . $rv['profile_guid'],
"uids" => group_get_profile_members_xchan(local_channel(), $rv['id']),
"link" => ''
);
}
}
$r = q("SELECT groups.id, groups.hash, groups.gname
FROM groups, group_member
WHERE groups.deleted = 0 AND groups.uid = %d

View File

@ -245,14 +245,6 @@ class Connedit extends \Zotlabs\Web\Controller {
intval(local_channel())
);
if($orig_record[0]['abook_profile'] != $profile_id) {
//Update profile photo permissions
logger('A new profile was assigned - updating profile photos');
profile_photo_set_profile_perms(local_channel(),$profile_id);
}
if($r)
info( t('Connection updated.') . EOL);
else

View File

@ -32,10 +32,10 @@ class Lockview extends \Zotlabs\Web\Controller {
if(! $item_id)
killme();
if (!in_array($type, array('item','photo','event', 'menu_item', 'chatroom')))
if (! in_array($type, array('item', 'photo', 'attach', 'event', 'menu_item', 'chatroom')))
killme();
//we have different naming in in menu_item table and chatroom table
// we have different naming in in menu_item table and chatroom table
switch($type) {
case 'menu_item':
$id = 'mitem_id';
@ -101,6 +101,22 @@ class Lockview extends \Zotlabs\Web\Controller {
stringify_array_elms($deny_groups,true);
stringify_array_elms($deny_users,true);
$profile_groups = [];
if($allowed_groups) {
foreach($allowed_groups as $g) {
if(substr($g,0,4) === '\'vp.') {
$profile_groups[] = '\'' . substr($g,4);
}
}
}
if(count($profile_groups)) {
$r = q("SELECT profile_name FROM profile WHERE profile_guid IN ( " . implode(', ', $profile_groups) . " )");
if($r)
foreach($r as $rr)
$l[] = '<li><b>' . t('Profile','acl') . ' ' . $rr['profile_name'] . '</b></li>';
}
if(count($allowed_groups)) {
$r = q("SELECT gname FROM groups WHERE hash IN ( " . implode(', ', $allowed_groups) . " )");
if($r)
@ -120,6 +136,25 @@ class Lockview extends \Zotlabs\Web\Controller {
}
}
}
$profile_groups = [];
if($deny_groups) {
foreach($deny_groups as $g) {
if(substr($g,0,4) === '\'vp.') {
$profile_groups[] = '\'' . substr($g,4);
}
}
}
if(count($profile_groups)) {
$r = q("SELECT profile_name FROM profile WHERE profile_guid IN ( " . implode(', ', $profile_groups) . " )");
if($r)
foreach($r as $rr)
$l[] = '<li><b><strike>' . t('Profile','acl') . ' ' . $rr['profile_name'] . '</strike></b></li>';
}
if(count($deny_groups)) {
$r = q("SELECT gname FROM groups WHERE hash IN ( " . implode(', ', $deny_groups) . " )");
if($r)

View File

@ -180,6 +180,10 @@ class Profile_photo extends \Zotlabs\Web\Controller {
dbesc(datetime_convert()),
dbesc($channel['xchan_hash'])
);
photo_profile_setperms(local_channel(),$base_image['resource_id'],$_REQUEST['profile']);
// Similarly, tell the nav bar to bypass the cache and update the avater image.
$_SESSION['reload_avatar'] = true;
@ -188,9 +192,6 @@ class Profile_photo extends \Zotlabs\Web\Controller {
// Update directory in background
\Zotlabs\Daemon\Master::Summon(array('Directory',$channel['channel_id']));
// Now copy profile-permissions to pictures, to prevent privacyleaks by automatically created folder 'Profile Pictures'
profile_photo_set_profile_perms(local_channel(),$_REQUEST['profile']);
}
else
notice( t('Unable to process image') . EOL);
@ -338,7 +339,8 @@ class Profile_photo extends \Zotlabs\Web\Controller {
dbesc($channel['xchan_hash'])
);
profile_photo_set_profile_perms(local_channel()); // Reset default photo permissions to public
photo_profile_setperms(local_channel(),$resource_id,$_REQUEST['profile']);
\Zotlabs\Daemon\Master::Summon(array('Directory',local_channel()));
goaway(z_root() . '/profiles');
}

View File

@ -22,7 +22,7 @@ class Profperm extends \Zotlabs\Web\Controller {
}
function get() {
function get() {
if(! local_channel()) {
notice( t('Permission denied') . EOL);
@ -94,12 +94,8 @@ class Profperm extends \Zotlabs\Web\Controller {
}
//Time to update the permissions on the profile-pictures as well
profile_photo_set_profile_perms(local_channel(),$profile['id']);
$r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash WHERE abook_channel = %d AND abook_profile = '%s'",
$r = q("SELECT * FROM abook left join xchan on abook_xchan = xchan_hash
WHERE abook_channel = %d AND abook_profile = '%s'",
intval(local_channel()),
dbesc($profile['profile_guid'])
);

View File

@ -18,6 +18,7 @@ class Channel {
$role = ((x($_POST,'permissions_role')) ? notags(trim($_POST['permissions_role'])) : '');
$oldrole = get_pconfig(local_channel(),'system','permissions_role');
if(($role != $oldrole) || ($role === 'custom')) {
@ -144,6 +145,7 @@ class Channel {
$post_joingroup = (($_POST['post_joingroup'] == 1) ? 1: 0);
$post_profilechange = (($_POST['post_profilechange'] == 1) ? 1: 0);
$adult = (($_POST['adult'] == 1) ? 1 : 0);
$defpermcat = ((x($_POST,'defpermcat')) ? notags(trim($_POST['defpermcat'])) : 'default');
$cal_first_day = (((x($_POST,'first_day')) && (intval($_POST['first_day']) == 1)) ? 1: 0);
@ -232,6 +234,7 @@ class Channel {
set_pconfig(local_channel(),'system','photo_path',$photo_path);
set_pconfig(local_channel(),'system','attach_path',$attach_path);
set_pconfig(local_channel(),'system','cal_first_day',$cal_first_day);
set_pconfig(local_channel(),'system','default_permcat',$defpermcat);
$r = q("update channel set channel_name = '%s', channel_pageflags = %d, channel_timezone = '%s', channel_location = '%s', channel_notifyflags = %d, channel_max_anon_mail = %d, channel_max_friend_req = %d, channel_expire_days = %d $set_perms where channel_id = %d",
dbesc($username),
@ -411,6 +414,19 @@ class Channel {
'$basepath' => \App::get_hostname()
));
$pcat = new \Zotlabs\Lib\Permcat(local_channel());
$pcatlist = $pcat->listing();
$permcats = [];
if($pcatlist) {
foreach($pcatlist as $pc) {
$permcats[$pc['name']] = $pc['localname'];
}
}
$default_permcat = get_pconfig(local_channel(),'system','default_permcat','default');
$stpl = get_markup_template('settings.tpl');
@ -500,7 +516,8 @@ class Channel {
'$suggestme' => $suggestme,
'$group_select' => $group_select,
'$role' => array('permissions_role' , t('Channel permissions category:'), $permissions_role, '', $perm_roles),
'$defpermcat' => [ 'defpermcat', t('Default Permissions Group'), $default_permcat, '', $permcats ],
'$permcat_enable' => feature_enabled(local_channel(),'permcats'),
'$profile_in_dir' => $profile_in_dir,
'$hide_friends' => $hide_friends,
'$hide_wall' => $hide_wall,

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -0,0 +1,14 @@
<dl class="dl-horizontal">
<dt>General</dt>
<dd>Esta página gestiona qué plugins (también llamados <i>addons</i> o <i>complementos</i>) están instalados.</dd>
<dt>Gestión de los repositorios</dt>
<dd>Si su servidor web tiene los permisos de escritura necesarios, verá un botón etiquetado como <b>Gestión de repositorios</b>,
que abre un panel de control para administrar qué <i>repositorios</i> de plugins están instalados. Estos repositorios están
almacenados en <span style="font-family: monospace;">extend/addon/[nombre del repositorio]/</span>. El repositorio de plugins oficial de Hubzilla
se puede añadir escribiendo la URL del repositorio
<span style="font-family: monospace;">https://github.com/redmatrix/hubzilla-addons.git</span>
y eligiendo un nombre para el repositorio como <b>oficial</b>. Debería ver este repositorio en una lista parecida
a esta:
<br>
<img class="img-responsive" src="doc/context/es-es/admin/plugins/assets/addon_repo_gui_1.png"></dd>
</dl>

View File

@ -0,0 +1,35 @@
<dl class="dl-horizontal">
<dt>General</dt>
<dd>
Al registar <i>cuenta</i> en Hubzilla, también ha creado un <i>perfil</i> y un <i>canal</i>.
</dd>
<dt>Cuenta</dt>
<dd>
Tiene <i>una</i> cuenta. Esta consta de su correo electrónico y su contraseña. Mediante su cuenta, accede a su
perfil y su canal. <i>Piense en su cuenta como la vía para identificarse en un sitio Hubzilla. Le permite
hacer cosas, como crear perfiles y canales a través de los cuelas podrá conectar con otra gente.</i>
</dd>
<dt>Perfil</dt>
<dd>
Usted está registrado, seguramente, con algunos otros servicios de Internet, como foros o comunidades en línea. Para todos ellos
usted proporcionó algún tipo de información sobre usted mismo, tal como su fecha de nacimiento, país, edad y gustos o preferencias. Frente a otros
servicios, Hubzilla le ofrece la ventaja de crear
<i>muchos más perfiles</i>. De esa manera usted puede distinguir entre los perfiles dirigidos especialmente a todo el mundo
(su perfil público), Sus compañeros de trabajo, su familia y su pareja.<i>Piense en su perfil como la información básica
básica que acerca de usted mismo muestra a otra gente,</i>
</dd>
<dt>Canal</dt>
<dd>
Durante el registro, creó su primer <i>canal</i>. Sí, además de los varios perfiles, usted puede tener
varios canales. Esto podría ser un poco confuso al principio, pero vamos a aclarar las cosas. Usted ya ha creado
un canal. Puede usarlo para el público en general, para informar a los demás sobre su vida cotidiana. Pero
Tal vez usted es un ávido lector de libros y muchas personas se aburren con eso. Así que abre un <i>segundo canal</i> sólo
para los amantes de los libros, en el que todos ustedes pueden hablar de libros tanto como quieran. Obviamente, este es un nuevo flujo de
entradas, con un nuevo perfil (...o nuevos perfil<i>es</i>...) y contactos completamente diferentes. Algunas conexiones
pueden existir en ambos canales, pero habrá algunas que estén exclusivamente en uno de los dos. Usted mismo simplemente
cambie entre ambos como cambia de interlocutor en el mundo real cuando habla con varias personas en la calle
o personas con las que se reúne especialmente para hablar de libros. Incluso puede conectarse a sí mismo, o mejor: a su otro
canal. :)<i> Piense en un canal como en diferentes espacios dedicados a diferentes temas en los que puede hablar con diferentes
personas.</i>
</dd>
</dl>

View File

@ -0,0 +1,35 @@
<dl class="dl-horizontal">
<dt>General</dt>
<dd>
Al registar <i>cuenta</i> en Hubzilla, también ha creado un <i>perfil</i> y un <i>canal</i>.
</dd>
<dt>Cuenta</dt>
<dd>
Tiene <i>una</i> cuenta. Esta consta de su correo electrónico y su contraseña. Mediante su cuenta, accede a su
perfil y su canal. <i>Piense en su cuenta como la vía para identificarse en un sitio Hubzilla. Le permite
hacer cosas, como crear perfiles y canales a través de los cuelas podrá conectar con otra gente.</i>
</dd>
<dt>Perfil</dt>
<dd>
Usted está registrado, seguramente, con algunos otros servicios de Internet, como foros o comunidades en línea. Para todos ellos
usted proporcionó algún tipo de información sobre usted mismo, tal como su fecha de nacimiento, país, edad y gustos o preferencias. Frente a otros
servicios, Hubzilla le ofrece la ventaja de crear
<i>muchos más perfiles</i>. De esa manera usted puede distinguir entre los perfiles dirigidos especialmente a todo el mundo
(su perfil público), Sus compañeros de trabajo, su familia y su pareja.<i>Piense en su perfil como la información básica
básica que acerca de usted mismo muestra a otra gente,</i>
</dd>
<dt>Canal</dt>
<dd>
Durante el registro, creó su primer <i>canal</i>. Sí, además de los varios perfiles, usted puede tener
varios canales. Esto podría ser un poco confuso al principio, pero vamos a aclarar las cosas. Usted ya ha creado
un canal. Puede usarlo para el público en general, para informar a los demás sobre su vida cotidiana. Pero
Tal vez usted es un ávido lector de libros y muchas personas se aburren con eso. Así que abre un <i>segundo canal</i> sólo
para los amantes de los libros, en el que todos ustedes pueden hablar de libros tanto como quieran. Obviamente, este es un nuevo flujo de
entradas, con un nuevo perfil (...o nuevos perfil<i>es</i>...) y contactos completamente diferentes. Algunas conexiones
pueden existir en ambos canales, pero habrá algunas que estén exclusivamente en uno de los dos. Usted mismo simplemente
cambie entre ambos como cambia de interlocutor en el mundo real cuando habla con varias personas en la calle
o personas con las que se reúne especialmente para hablar de libros. Incluso puede conectarse a sí mismo, o mejor: a su otro
canal. :)<i> Piense en un canal como en diferentes espacios dedicados a diferentes temas en los que puede hablar con diferentes
personas.</i>
</dd>
</dl>

View File

@ -0,0 +1,35 @@
<dl class="dl-horizontal">
<dt>General</dt>
<dd>
Al registar <i>cuenta</i> en Hubzilla, también ha creado un <i>perfil</i> y un <i>canal</i>.
</dd>
<dt>Cuenta</dt>
<dd>
Tiene <i>una</i> cuenta. Esta consta de su correo electrónico y su contraseña. Mediante su cuenta, accede a su
perfil y su canal. <i>Piense en su cuenta como la vía para identificarse en un sitio Hubzilla. Le permite
hacer cosas, como crear perfiles y canales a través de los cuelas podrá conectar con otra gente.</i>
</dd>
<dt>Perfil</dt>
<dd>
Usted está registrado, seguramente, con algunos otros servicios de Internet, como foros o comunidades en línea. Para todos ellos
usted proporcionó algún tipo de información sobre usted mismo, tal como su fecha de nacimiento, país, edad y gustos o preferencias. Frente a otros
servicios, Hubzilla le ofrece la ventaja de crear
<i>muchos más perfiles</i>. De esa manera usted puede distinguir entre los perfiles dirigidos especialmente a todo el mundo
(su perfil público), Sus compañeros de trabajo, su familia y su pareja.<i>Piense en su perfil como la información básica
básica que acerca de usted mismo muestra a otra gente,</i>
</dd>
<dt>Canal</dt>
<dd>
Durante el registro, creó su primer <i>canal</i>. Sí, además de los varios perfiles, usted puede tener
varios canales. Esto podría ser un poco confuso al principio, pero vamos a aclarar las cosas. Usted ya ha creado
un canal. Puede usarlo para el público en general, para informar a los demás sobre su vida cotidiana. Pero
Tal vez usted es un ávido lector de libros y muchas personas se aburren con eso. Así que abre un <i>segundo canal</i> sólo
para los amantes de los libros, en el que todos ustedes pueden hablar de libros tanto como quieran. Obviamente, este es un nuevo flujo de
entradas, con un nuevo perfil (...o nuevos perfil<i>es</i>...) y contactos completamente diferentes. Algunas conexiones
pueden existir en ambos canales, pero habrá algunas que estén exclusivamente en uno de los dos. Usted mismo simplemente
cambie entre ambos como cambia de interlocutor en el mundo real cuando habla con varias personas en la calle
o personas con las que se reúne especialmente para hablar de libros. Incluso puede conectarse a sí mismo, o mejor: a su otro
canal. :)<i> Piense en un canal como en diferentes espacios dedicados a diferentes temas en los que puede hablar con diferentes
personas.</i>
</dd>
</dl>

View File

@ -0,0 +1,23 @@
<dl class="dl-horizontal">
<dt><a href="/help/member/member_guide#Guest_Access_Tokens">Guest Access Tokens</a></dt>
<dd>
Para facilitar el intercambio de recursos privados con no miembros o miembros de otros nodos federados con una identificación limitada, Hubzilla debe proporcionar a los miembros un mecanismo para crear y administrar inicios de sesión temporales ("desechables"), también conocidos como "Zot Access Tokens". Estos tokens/credenciales se pueden utilizar para autenticarse en un sitio de hubzilla con el único propósito de acceder a recursos privilegiados o de acceso controlado (archivos, fotos, publicaciones, páginas web, salas de chat, etc.).
</dd>
<dt>Crear un token</dt>
<dd>
El formulario para crear / editar acepta tres parámetros, un nombre legible por el usuario, una contraseña o un token de acceso, y un
límite de caducidad opcional. Una vez que ha caducado, el acceso mediante el token deja de ser válido, ya no puede usarse, y será
purgado automáticamente de la lista de cuentas temporales. El campo de la contraseña, en los formularios para crear/editar,
muestra el texto del token de acceso y no una displays the text of the access token and not una contraseña oscurecida.
</dd>
<dt>Compartir un token</dt>
<dd>
No especificamos mecanismos para compartir estos tokens con otros. Se puede usar cualquier método de comunicación. Cualquier token que haya creado se añade al selector de la Lista de Control y puede ser usado por cualquiera que esté en esa lista.
<b>Ejemplo</b>: Una visitante llega a su sitio. Tiene un token de acceso que usted le ha proporcionado e intenta ver uno de sus álbumes de fotos (que está restringido para que solo lo puedan ver usted mismo y una identidad temporal). El permiso es denegado.
La visitante, ahora, selecciona "Iniciar sesión" del menú de la barra de navegación, que muestra la página de inicio de sesión. Ella escribe el nombre y contraseña que usted le ha proporcionado: ahora ya puede ver el álbum privado de fotos.
De forma alternativa, puede compartir un enlace a un fichero protegido, añadiendo un parámetro del tipo "&zat=abc123" a la dirección URL, en el que la cadena "abc123" es el token de acceso o contraseña para el inicio de sesión temporal. No se requiere ninguna negociación posterior: el fichero será mostrado.
</dd>
</dl>

View File

@ -0,0 +1,8 @@
<dl class="dl-horizontal">
<dt>General</dt>
<dd>Puede crear sitios web modulares, con identidad propia, compuestos de elementos compartibles. </dd>
<dt>Páginas</dt>
<dd>Esta página enumera sus "páginas", a las que se asignan URLs en las que la gente pueden visitar su sitio. La estructura de las páginas se describe típicamente mediante una plantilla de diseño <b>asociada</b>, y su contenido se construye a partir de una colección de <b>bloques</b>.</dd>
<dt><a href='#' onclick='contextualHelpFocus("#website-portation-tools", 1); return false;' title="Pulsar para resaltar el elmento...">Herramientas de portabilidad de sitios web</a></dt>
<dd>Las herramientas de portabilidad de sitios web le permiten importar y exportar múltiples elementos de páginas web (páginas, plantillas, bloques). Puede <b>importar</b> tanto de un fichero zip como de una carpeta de ficheros existente en la nube. Puede <b>exportar</b> tanto a un fichero zip que contenga un grupo seleccionado de elementos de páginas web, o exportarlos directamente a una carpeta de ficheros en la nube. <a target="_blank" href="help/webpages">Leer más...</a></dd>
</dl>

View File

@ -174,6 +174,16 @@ function populate_acl($defaults = null,$show_jotnets = true, $emptyACL_descripti
$custom = false;
}
$r = q("SELECT id, profile_guid, profile_name from profile where is_default = 0 and uid = %d order by profile_name",
intval(local_channel())
);
if($r) {
foreach($r as $rv) {
$selected = (($single_group && 'vp.' . $rr['hash'] === $allow_gid[0]) ? ' selected = "selected" ' : '');
$groups .= '<option id="' . 'vp' . $rv['id'] . '" value="' . 'vp.' . $rv['profile_guid'] . '"' . $selected . '>' . t('Profile','acl') . ' ' . $rv['profile_name'] . '</option>' . "\r\n";
}
}
$r = q("SELECT id, hash, gname FROM groups WHERE deleted = 0 AND uid = %d ORDER BY gname ASC",
intval(local_channel())
);

View File

@ -28,29 +28,31 @@ function z_mime_content_type($filename) {
$mime_types = array(
'txt' => 'text/plain',
'htm' => 'text/html',
'txt' => 'text/plain',
'htm' => 'text/html',
'html' => 'text/html',
'php' => 'text/html',
'css' => 'text/css',
'js' => 'application/javascript',
'php' => 'text/html',
'css' => 'text/css',
'md' => 'text/markdown',
'bb' => 'text/bbcode',
'js' => 'application/javascript',
'json' => 'application/json',
'xml' => 'application/xml',
'swf' => 'application/x-shockwave-flash',
'flv' => 'video/x-flv',
'xml' => 'application/xml',
'swf' => 'application/x-shockwave-flash',
'flv' => 'video/x-flv',
'epub' => 'application/epub+zip',
// images
'png' => 'image/png',
'jpe' => 'image/jpeg',
'png' => 'image/png',
'jpe' => 'image/jpeg',
'jpeg' => 'image/jpeg',
'jpg' => 'image/jpeg',
'gif' => 'image/gif',
'bmp' => 'image/bmp',
'ico' => 'image/vnd.microsoft.icon',
'jpg' => 'image/jpeg',
'gif' => 'image/gif',
'bmp' => 'image/bmp',
'ico' => 'image/vnd.microsoft.icon',
'tiff' => 'image/tiff',
'tif' => 'image/tiff',
'svg' => 'image/svg+xml',
'tif' => 'image/tiff',
'svg' => 'image/svg+xml',
'svgz' => 'image/svg+xml',
// archives
@ -61,27 +63,27 @@ function z_mime_content_type($filename) {
'cab' => 'application/vnd.ms-cab-compressed',
// audio/video
'mp3' => 'audio/mpeg',
'wav' => 'audio/wav',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
'ogg' => 'audio/ogg',
'ogv' => 'video/ogg',
'ogx' => 'application/ogg',
'mp3' => 'audio/mpeg',
'wav' => 'audio/wav',
'qt' => 'video/quicktime',
'mov' => 'video/quicktime',
'ogg' => 'audio/ogg',
'ogv' => 'video/ogg',
'ogx' => 'application/ogg',
'flac' => 'audio/flac',
'opus' => 'audio/ogg',
'webm' => 'video/webm',
// 'webm' => 'audio/webm',
'mp4' => 'video/mp4',
// 'mp4' => 'audio/mp4',
'mkv' => 'video/x-matroska',
'mp4' => 'video/mp4',
// 'mp4' => 'audio/mp4',
'mkv' => 'video/x-matroska',
// adobe
'pdf' => 'application/pdf',
'psd' => 'image/vnd.adobe.photoshop',
'ai' => 'application/postscript',
'ai' => 'application/postscript',
'eps' => 'application/postscript',
'ps' => 'application/postscript',
'ps' => 'application/postscript',
// ms office
'doc' => 'application/msword',

View File

@ -227,6 +227,26 @@ function group_get_members_xchan($gid) {
return $ret;
}
function group_get_profile_members_xchan($uid,$gid) {
$ret = [];
if(intval($gid)) {
$r = q("SELECT abook_xchan as xchan from abook left join profile on abook_profile = profile_guid where profile.id = %d and profile.uid = %d",
intval($gid),
intval($uid)
);
if($r) {
foreach($r as $rr) {
$ret[] = $rr['xchan'];
}
}
}
return $ret;
}
function mini_group_select($uid,$group = '') {
$grps = array();
@ -320,20 +340,46 @@ function group_side($every="connections",$each="group",$edit = false, $group_id
return $o;
}
function expand_groups($a) {
if(! (is_array($a) && count($a)))
function expand_groups($g) {
if(! (is_array($g) && count($g)))
return array();
$x = $a;
stringify_array_elms($x,true);
$groups = implode(',', $x);
if($groups)
$r = q("SELECT xchan FROM group_member WHERE gid IN ( select id from groups where hash in ( $groups ))");
$ret = array();
$ret = [];
$x = [];
if($r)
foreach($r as $rr)
$ret[] = $rr['xchan'];
// private profile linked virtual groups
foreach($g as $gv) {
if(substr($gv,0,3) === 'vp.') {
$profile_hash = substr($gv,3);
if($profile_hash) {
$r = q("select abook_xchan from abook where abook_profile = '%s'",
dbesc($profile_hash)
);
if($r) {
foreach($r as $rv) {
$ret[] = $rv['abook_xchan'];
}
}
}
}
else {
$x[] = $gv;
}
}
if($x) {
stringify_array_elms($x,true);
$groups = implode(',', $x);
if($groups) {
$r = q("SELECT xchan FROM group_member WHERE gid IN ( select id from groups where hash in ( $groups ))");
if($r) {
foreach($r as $rr) {
$ret[] = $rr['xchan'];
}
}
}
}
return $ret;
}

View File

@ -718,10 +718,59 @@ function gps2Num($coordPart) {
return floatval($parts[0]) / floatval($parts[1]);
}
function photo_profile_setperms($channel_id,$resource_id,$profile_id) {
if(! $profile_id)
return;
$r = q("select profile_guid, is_default from profile where id = %d and uid = %d limit 1",
dbesc($profile_id),
intval($channel_id)
);
if(! $r)
return;
$is_default = $r[0]['is_default'];
$profile_guid = $r[0]['profile_guid'];
if($is_default) {
$r = q("update photo set allow_cid = '', allow_gid = '', deny_cid = '', deny_gid = ''
where resource_id = '%s' and uid = %d",
dbesc($resource_id),
intval($channel_id)
);
$r = q("update attach set allow_cid = '', allow_gid = '', deny_cid = '', deny_gid = ''
where hash = '%s' and uid = %d",
dbesc($resource_id),
intval($channel_id)
);
}
else {
$r = q("update photo set allow_cid = '', allow_gid = '%s', deny_cid = '', deny_gid = ''
where resource_id = '%s' and uid = %d",
dbesc('<vp.' . $profile_guid . '>'),
dbesc($resource_id),
intval($channel_id)
);
$r = q("update attach set allow_cid = '', allow_gid = '%s', deny_cid = '', deny_gid = ''
where hash = '%s' and uid = %d",
dbesc('<vp.' . $profile_guid . '>'),
dbesc($resource_id),
intval($channel_id)
);
}
}
function profile_photo_set_profile_perms($uid, $profileid = 0) {
$allowcid = '';
if($profileid) {
$allowcid = '';
if($profileid) {
$r = q("SELECT photo, profile_guid, id, is_default, uid
FROM profile WHERE uid = %d and ( profile.id = %d OR profile.profile_guid = '%s') LIMIT 1",
intval($uid),

View File

@ -553,7 +553,21 @@ function check_form_security_token_ForbiddenOnErr($typename = '', $formname = 'f
// var $contact_id = xchan_hash of connection
function init_groups_visitor($contact_id) {
$groups = array();
$groups = [];
// private profiles are treated as a virtual group
$r = q("SELECT abook_profile from abook where abook_xchan = '%s' and abook_profile != '' ",
dbesc($contact_id)
);
if($r) {
foreach($r as $rv) {
$groups[] = 'vp.' . $rv['abook_profile'];
}
}
// physical groups this channel is a member of
$r = q("SELECT hash FROM groups left join group_member on groups.id = group_member.gid WHERE xchan = '%s' ",
dbesc($contact_id)
);

View File

@ -663,7 +663,7 @@ function widget_settings_menu($arr) {
if(feature_enabled(local_channel(),'permcats')) {
$tabs[] = array(
'label' => t('Permission Categories'),
'label' => t('Permission Groups'),
'url' => z_root() . '/settings/permcats',
'selected' => ((argv(1) === 'permcats') ? 'active' : ''),
);

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

@ -252,7 +252,7 @@ header #banner #logo-text {
display: block;
position: fixed;
top: 51px;
width: 100%;
left: 0px;
max-height: 50%;
background: $comment_item_colour;
padding: 20px;

View File

@ -84,6 +84,10 @@
{{include file="field_checkbox.tpl" field=$blocktags}}
{{include file="field_input.tpl" field=$expire}}
</div>
{{if $permcat_enable}}
{{include file="field_select.tpl" field=$defpermcat}}
{{/if}}
{{if $sec_addon}}
{{$sec_addon}}
{{/if}}