aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Zotlabs/Module/Cover_photo.php1
-rw-r--r--Zotlabs/Module/Import.php61
-rw-r--r--Zotlabs/Module/Photo.php70
-rw-r--r--Zotlabs/Module/Profile_photo.php1
-rw-r--r--doc/context/fr/mail/help.html10
-rw-r--r--doc/context/fr/photos/help.html6
-rw-r--r--doc/context/fr/profile/help.html6
-rw-r--r--doc/context/fr/settings/account/help.html18
-rw-r--r--doc/context/fr/settings/channel/help.html18
-rw-r--r--doc/context/fr/settings/tokens20
-rw-r--r--doc/context/fr/webpages/help.html8
-rw-r--r--include/attach.php39
-rwxr-xr-xinclude/dba/dba_driver.php25
-rw-r--r--include/import.php7
-rw-r--r--include/network.php11
-rw-r--r--view/css/mod_import.css37
-rwxr-xr-xview/tpl/channel_import.tpl61
-rwxr-xr-xview/tpl/cover_photo.tpl3
-rwxr-xr-xview/tpl/profile_photo.tpl4
19 files changed, 258 insertions, 148 deletions
diff --git a/Zotlabs/Module/Cover_photo.php b/Zotlabs/Module/Cover_photo.php
index d76c1b408..76e80156c 100644
--- a/Zotlabs/Module/Cover_photo.php
+++ b/Zotlabs/Module/Cover_photo.php
@@ -355,6 +355,7 @@ class Cover_photo extends \Zotlabs\Web\Controller {
$o .= replace_macros($tpl,array(
'$user' => \App::$channel['channel_address'],
+ '$info' => t('Your cover photo may be visible to anybody on the internet'),
'$existing' => get_cover_photo(local_channel(),'array',PHOTO_RES_COVER_850),
'$lbl_upfile' => t('Upload File:'),
'$lbl_profiles' => t('Select a profile:'),
diff --git a/Zotlabs/Module/Import.php b/Zotlabs/Module/Import.php
index 81c405f00..d031bf16b 100644
--- a/Zotlabs/Module/Import.php
+++ b/Zotlabs/Module/Import.php
@@ -6,6 +6,7 @@ require_once('include/zot.php');
require_once('include/channel.php');
require_once('include/import.php');
require_once('include/perm_upgrade.php');
+require_once('library/urlify/URLify.php');
/**
@@ -38,6 +39,7 @@ class Import extends \Zotlabs\Web\Controller {
$filename = basename($_FILES['filename']['name']);
$filesize = intval($_FILES['filename']['size']);
$filetype = $_FILES['filename']['type'];
+ $newname = trim(strtolower($_REQUEST['newname']));
// import channel from file
if($src) {
@@ -146,7 +148,20 @@ class Import extends \Zotlabs\Web\Controller {
}
}
- $channel = import_channel($data['channel'], $account_id, $seize);
+ if($newname) {
+ $x = false;
+
+ if(get_config('system','unicode_usernames')) {
+ $x = punify(mb_strtolower($newname));
+ }
+
+ if((! $x) || strlen($x) > 64) {
+ $x = strtolower(\URLify::transliterate($newname));
+ }
+ $newname = $x;
+ }
+
+ $channel = import_channel($data['channel'], $account_id, $seize, $newname);
}
else {
$moving = false;
@@ -363,11 +378,27 @@ class Import extends \Zotlabs\Web\Controller {
continue;
}
- abook_store_lowlevel($abook);
+ $r = q("select abook_id from abook where abook_xchan = '%s' and abook_channel = %d limit 1",
+ dbesc($abook['abook_xchan']),
+ intval($channel['channel_id'])
+ );
+ if($r) {
+ foreach($abook as $k => $v) {
+ $r = q("UPDATE abook SET " . TQUOT . "%s" . TQUOT . " = '%s' WHERE abook_xchan = '%s' AND abook_channel = %d",
+ dbesc($k),
+ dbesc($v),
+ dbesc($abook['abook_xchan']),
+ intval($channel['channel_id'])
+ );
+ }
+ }
+ else {
+ abook_store_lowlevel($abook);
- $friends ++;
- if(intval($abook['abook_feed']))
- $feeds ++;
+ $friends ++;
+ if(intval($abook['abook_feed']))
+ $feeds ++;
+ }
translate_abook_perms_inbound($channel,$abook_copy);
@@ -516,16 +547,20 @@ class Import extends \Zotlabs\Web\Controller {
'$desc' => t('Use this form to import an existing channel from a different server/hub. You may retrieve the channel identity from the old server/hub via the network or provide an export file.'),
'$label_filename' => t('File to Upload'),
'$choice' => t('Or provide the old server/hub details'),
- '$label_old_address' => t('Your old identity address (xyz@example.com)'),
- '$label_old_email' => t('Your old login email address'),
- '$label_old_pass' => t('Your old login password'),
+
+ '$old_address' => [ 'old_address', t('Your old identity address (xyz@example.com)'), '', ''],
+ '$email' => [ 'email', t('Your old login email address'), '', '' ],
+ '$password' => [ 'password', t('Your old login password'), '', '' ],
+ '$import_posts' => [ 'import_posts', t('Import a few months of posts if possible (limited by available memory'), false, '', [ t('No'), t('Yes') ]],
+
'$common' => t('For either option, please choose whether to make this hub your new primary address, or whether your old location should continue this role. You will be able to post from either location, but only one can be marked as the primary location for files, photos, and media.'),
- '$label_import_primary' => t('Make this hub my primary location'),
- '$label_import_moving' => t('Move this channel (disable all previous locations)'),
- '$label_import_posts' => t('Import a few months of posts if possible (limited by available memory'),
+
+ '$make_primary' => [ 'make_primary', t('Make this hub my primary location'), false, '', [ t('No'), t('Yes') ] ],
+ '$moving' => [ 'moving', t('Move this channel (disable all previous locations)'), false, '', [ t('No'), t('Yes') ] ],
+ '$newname' => [ 'newname', t('Use this channel nickname instead of the one provided'), '', t('Leave blank to keep your existing channel nickname. You will be randomly assigned a similar nickname if either name is already allocated on this site.')],
+
'$pleasewait' => t('This process may take several minutes to complete. Please submit the form only once and leave this page open until finished.'),
- '$email' => '',
- '$pass' => '',
+
'$form_security_token' => get_form_security_token('channel_import'),
'$submit' => t('Submit')
));
diff --git a/Zotlabs/Module/Photo.php b/Zotlabs/Module/Photo.php
index 8a110f925..b3171fe75 100644
--- a/Zotlabs/Module/Photo.php
+++ b/Zotlabs/Module/Photo.php
@@ -127,69 +127,45 @@ class Photo extends \Zotlabs\Web\Controller {
}
}
- $r = q("SELECT uid FROM photo WHERE resource_id = '%s' AND imgscale = %d LIMIT 1",
+ $r = q("SELECT uid, photo_usage FROM photo WHERE resource_id = '%s' AND imgscale = %d LIMIT 1",
dbesc($photo),
intval($resolution)
);
if($r) {
-
- $allowed = (($r[0]['uid']) ? perm_is_allowed($r[0]['uid'],$observer_xchan,'view_storage') : true);
-
- $sql_extra = permissions_sql($r[0]['uid']);
- if(! $sql_extra)
- $sql_extra = ' and true ';
-
- // Only check permissions on normal photos. Those photos we don't check includes
- // profile photos, xchan photos (which are also profile photos), 'thing' photos,
- // and cover photos
-
- $sql_extra = " and (( photo_usage = 0 $sql_extra ) or photo_usage != 0 )";
+ $allowed = (-1);
+ if(intval($r[0]['photo_usage'])) {
+ $allowed = 1;
+ if(intval($r[0]['photo_usage']) === PHOTO_COVER)
+ if($resolution < PHOTO_RES_COVER_1200)
+ $allowed = (-1);
+ if(intval($r[0]['photo_usage']) === PHOTO_PROFILE)
+ if(! in_array($resolution,[4,5,6]))
+ $allowed = (-1);
+ }
+ if($allowed === (-1))
+ $allowed = attach_can_view($r[0]['uid'],$observer_xchan,$photo);
+
$channel = channelx_by_n($r[0]['uid']);
// Now we'll see if we can access the photo
- $r = q("SELECT * FROM photo WHERE resource_id = '%s' AND imgscale = %d $sql_extra LIMIT 1",
+ $e = q("SELECT * FROM photo WHERE resource_id = '%s' AND imgscale = %d $sql_extra LIMIT 1",
dbesc($photo),
intval($resolution)
);
- // viewing cover photos is allowed unless a plugin chooses to block it.
-
- if($r && intval($r[0]['photo_usage']) === PHOTO_COVER && $resolution >= PHOTO_RES_COVER_1200)
- $allowed = 1;
-
- $d = [ 'imgscale' => $resolution, 'resource_id' => $photo, 'photo' => $r, 'allowed' => $allowed ];
- call_hooks('get_photo',$d);
+ $exists = (($e) ? true : false);
- $resolution = $d['imgscale'];
- $photo = $d['resource_id'];
- $r = $d['photo'];
- $allowed = $d['allowed'];
-
- if($r && $allowed) {
- $data = dbunescbin($r[0]['content']);
- $mimetype = $r[0]['mimetype'];
- if(intval($r[0]['os_storage'])) {
+ if($exists && $allowed) {
+ $data = dbunescbin($e[0]['content']);
+ $mimetype = $e[0]['mimetype'];
+ if(intval($e[0]['os_storage'])) {
$streaming = $data;
}
}
else {
-
- // Does the picture exist? It may be a remote person with no credentials,
- // but who should otherwise be able to view it. Show a default image to let
- // them know permissions was denied. It may be possible to view the image
- // through an authenticated profile visit.
- // There won't be many completely unauthorised people seeing this because
- // they won't have the photo link, so there's a reasonable chance that the person
- // might be able to obtain permission to view it.
-
- $r = q("SELECT * FROM photo WHERE resource_id = '%s' AND imgscale = %d LIMIT 1",
- dbesc($photo),
- intval($resolution)
- );
-
- if($r) {
+ if(! $allowed) {
logger('mod_photo: forbidden. ' . \App::$query_string);
$observer = \App::get_observer();
logger('mod_photo: observer = ' . (($observer) ? $observer['xchan_addr'] : '(not authenticated)'));
@@ -201,9 +177,6 @@ class Photo extends \Zotlabs\Web\Controller {
}
}
-
-
-
if(! isset($data)) {
if(isset($resolution)) {
switch($resolution) {
@@ -295,7 +268,6 @@ class Photo extends \Zotlabs\Web\Controller {
}
killme();
- // NOTREACHED
}
}
diff --git a/Zotlabs/Module/Profile_photo.php b/Zotlabs/Module/Profile_photo.php
index 2ce8686b9..751c4338f 100644
--- a/Zotlabs/Module/Profile_photo.php
+++ b/Zotlabs/Module/Profile_photo.php
@@ -451,6 +451,7 @@ class Profile_photo extends \Zotlabs\Web\Controller {
$o .= replace_macros($tpl,array(
'$user' => \App::$channel['channel_address'],
+ '$info' => ((count($profiles) > 1) ? t('Your default profile photo is visible to anybody on the internet. Profile photos for alternate profiles will inherit the permissions of the profile') : t('Your profile photo is visible to anybody on the internet and may be distributed to other websites.')),
'$importfile' => (($importing) ? \App::$data['importfile'] : ''),
'$lbl_upfile' => t('Upload File:'),
'$lbl_profiles' => t('Select a profile:'),
diff --git a/doc/context/fr/mail/help.html b/doc/context/fr/mail/help.html
new file mode 100644
index 000000000..fcf4eff21
--- /dev/null
+++ b/doc/context/fr/mail/help.html
@@ -0,0 +1,10 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Les messages affichés dans courrier privé ne sont visibles que pour vous et le destinataire unique.</dd>
+ <dt>Vue combinée</dt>
+ <dd>Les conversations complètes peuvent être visualisées dans un fil continu en sélectionnant <b>Vue combinée </b>. Les conversations disponibles sont affichées sous le menu dans le panneau latéral.</dd>
+ <dt>Boîte de réception/Boîte d'envoi</dt>
+ <dd>Les messages individuels envoyés sont visualisés en sélectionnant <b>Boîte d'envoi</b>, et les messages entrants sont visualisés en utilisant le filtre <b>Boîte de réception</b>.</dd>
+ <dt>Nouveau message.</dt>
+ <dd>Les messages individuels ont des rapports de livraison qui peuvent être visualisés à l'aide du menu déroulant. Les messages peuvent également être rappelés à partir du même menu, ce qui peut empêcher le destinataire de voir le message <i>s'il ne l'a pas déjà lu</i>.</dd>
+</dl>
diff --git a/doc/context/fr/photos/help.html b/doc/context/fr/photos/help.html
new file mode 100644
index 000000000..8609e9849
--- /dev/null
+++ b/doc/context/fr/photos/help.html
@@ -0,0 +1,6 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Cette page affiche les albums photos du canal. Les images visibles pour l'observateur dépendent des permissions d'images individuelles.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Cliquez pour mettre en évidence l'élément...">Onglets de contenu du canal</a></dt>
+ <dd>Les onglets de contenu du canal sont des liens vers d'autres contenus publiés par le canal. L'onglet <b>A propos</b> permet d'accéder au profil de canal. L'onglet <b>Photos</b> permet d'accéder aux galeries de photos des chaînes. L'onglet <b>Fichiers</b> permet d'accéder aux fichiers généraux partagés publiés par le canal.</dd>
+</dl>
diff --git a/doc/context/fr/profile/help.html b/doc/context/fr/profile/help.html
new file mode 100644
index 000000000..26559db6f
--- /dev/null
+++ b/doc/context/fr/profile/help.html
@@ -0,0 +1,6 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Ceci est la page de profil d'un canal. Il affiche typiquement des informations décrivant le canal. Si le canal représente une personne dans un réseau social, par exemple, le profil peut fournir des informations de contact et d'autres détails personnels sur la personne. Les canaux peuvent avoir plusieurs profils, où le profil affiché dépend de l'observateur.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#tabs-collapse-1", 0); return false;' title="Cliquez pour mettre en évidence l'élément...">Onglets de contenu du canal</a></dt>
+ <dd>Les onglets de contenu du canal sont des liens vers d'autres contenus publiés par le canal. L'onglet <b>A propos</b> permet d'accéder au profil de canal. L'onglet <b>Photos</b> permet d'accéder aux galeries de photos des chaînes. L'onglet <b>Fichiers</b> permet d'accéder aux fichiers généraux partagés publiés par le canal.</dd>
+</dl>
diff --git a/doc/context/fr/settings/account/help.html b/doc/context/fr/settings/account/help.html
new file mode 100644
index 000000000..ed8e7f374
--- /dev/null
+++ b/doc/context/fr/settings/account/help.html
@@ -0,0 +1,18 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>
+ Une fois que vous avez enregistré un <i>compte</i> dans la matrice, vous avez également créé un <i>profil</i> et un <i>canal</i>.
+ </dd>
+ <dt>Compte</dt>
+ <dd>
+ Vous avez <i>un compte</i>. Il contient votre compte de courriel et votre mot de passe. Avec votre compte, vous accédez à votre profil et votre canal. Pensez à votre compte comme la façon dont vous vous authentifiez sur un site Hubzilla. Il vous permet de faire des choses, comme créer des profils et des canaux avec lesquels vous pouvez vous connecter à d'autres personnes.
+ </dd>
+ <dt>Profile</dt>
+ <dd>
+ Vous vous êtes sûrement inscrit à d'autres services Internet, comme les forums ou les communautés en ligne. Pour chacun d'entre eux, vous avez fourni des informations sur vous-même, telles que la date de naissance, le pays, l'âge et autres. Contrairement à d'autres services, Hubzilla vous offre l'avantage de créer <i>plus de profils</i>. Vous pouvez ainsi faire la distinction entre les profils qui s'adressent à tous (votre profil public) et vos collègues de travail, votre famille et votre partenaire. Pensez à votre profil comme étant l'information de base sur vous-même que vous donnez aux autres.
+ </dd>
+ <dt>Channel</dt>
+ <dd>
+ Lors de l'enregistrement, vous avez créé votre premier <i>canal</i>. Oui, en plus de plusieurs profils, vous pouvez avoir plusieurs canaux. Cela pourrait être un peu confus au début, mais mettons les choses au clair. Vous avez déjà créé un canal. Vous pouvez utiliser celui-ci pour le public, pour communiquer avec les gens sur la vie de tous les jours. Mais vous êtes peut-être un lecteur de livres passionné et beaucoup de gens s'ennuient. Ainsi, vous ouvrez un <i>second canal </i> juste pour les amateurs de livres, où vous pouvez tous parler de livres autant que vous le souhaitez. Il s'agit évidemment d'un nouveau flux de messages, avec un nouveau profil (ou nouveaux profils) et des contacts complètement différents. Certaines connexions peuvent exister dans les deux canaux, mais il y en aura qui sont exclusives à l'un d'entre eux. Vous-même vous changez entre les deux comme vous le feriez dans la vie réelle lorsque vous parlez à des gens que vous rencontrez dans la rue ou à des gens que vous rencontrez pour parler de livres spécifiquement. Vous pouvez même vous connecter à vous-même, ou mieux : à votre autre canal <i class="fa fa-smile-o" aria-hidden="true"></i> <i>.<br/>Penser un canal comme différents espaces dédiés à différents sujets où vous rencontrez différentes personnes.</i>.
+ </dd>
+</dl>
diff --git a/doc/context/fr/settings/channel/help.html b/doc/context/fr/settings/channel/help.html
new file mode 100644
index 000000000..ed8e7f374
--- /dev/null
+++ b/doc/context/fr/settings/channel/help.html
@@ -0,0 +1,18 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>
+ Une fois que vous avez enregistré un <i>compte</i> dans la matrice, vous avez également créé un <i>profil</i> et un <i>canal</i>.
+ </dd>
+ <dt>Compte</dt>
+ <dd>
+ Vous avez <i>un compte</i>. Il contient votre compte de courriel et votre mot de passe. Avec votre compte, vous accédez à votre profil et votre canal. Pensez à votre compte comme la façon dont vous vous authentifiez sur un site Hubzilla. Il vous permet de faire des choses, comme créer des profils et des canaux avec lesquels vous pouvez vous connecter à d'autres personnes.
+ </dd>
+ <dt>Profile</dt>
+ <dd>
+ Vous vous êtes sûrement inscrit à d'autres services Internet, comme les forums ou les communautés en ligne. Pour chacun d'entre eux, vous avez fourni des informations sur vous-même, telles que la date de naissance, le pays, l'âge et autres. Contrairement à d'autres services, Hubzilla vous offre l'avantage de créer <i>plus de profils</i>. Vous pouvez ainsi faire la distinction entre les profils qui s'adressent à tous (votre profil public) et vos collègues de travail, votre famille et votre partenaire. Pensez à votre profil comme étant l'information de base sur vous-même que vous donnez aux autres.
+ </dd>
+ <dt>Channel</dt>
+ <dd>
+ Lors de l'enregistrement, vous avez créé votre premier <i>canal</i>. Oui, en plus de plusieurs profils, vous pouvez avoir plusieurs canaux. Cela pourrait être un peu confus au début, mais mettons les choses au clair. Vous avez déjà créé un canal. Vous pouvez utiliser celui-ci pour le public, pour communiquer avec les gens sur la vie de tous les jours. Mais vous êtes peut-être un lecteur de livres passionné et beaucoup de gens s'ennuient. Ainsi, vous ouvrez un <i>second canal </i> juste pour les amateurs de livres, où vous pouvez tous parler de livres autant que vous le souhaitez. Il s'agit évidemment d'un nouveau flux de messages, avec un nouveau profil (ou nouveaux profils) et des contacts complètement différents. Certaines connexions peuvent exister dans les deux canaux, mais il y en aura qui sont exclusives à l'un d'entre eux. Vous-même vous changez entre les deux comme vous le feriez dans la vie réelle lorsque vous parlez à des gens que vous rencontrez dans la rue ou à des gens que vous rencontrez pour parler de livres spécifiquement. Vous pouvez même vous connecter à vous-même, ou mieux : à votre autre canal <i class="fa fa-smile-o" aria-hidden="true"></i> <i>.<br/>Penser un canal comme différents espaces dédiés à différents sujets où vous rencontrez différentes personnes.</i>.
+ </dd>
+</dl>
diff --git a/doc/context/fr/settings/tokens b/doc/context/fr/settings/tokens
new file mode 100644
index 000000000..6be17a615
--- /dev/null
+++ b/doc/context/fr/settings/tokens
@@ -0,0 +1,20 @@
+<dl class="dl-horizontal">
+ <dt><a href="/help/member/member_guide#Guest_Access_Tokens">Jetons d'accès invités</a></dt>
+ <dd>
+ Afin de faciliter le partage de ressources privées avec des non-membres ou des membres de nœuds de fédération à découverte d'identification limitée, Hubzilla devrait fournir aux membres un mécanisme pour créer et gérer des logins temporaires (&laquo;jetables&raquo;), alias &laquo;Zot Access Tokens&raquo;. Ces jetons/accréditations peuvent être utilisés pour s'authentifier sur un site hubzilla dans le seul but d'accéder à des ressources privilégiées ou contrôlées (fichiers, photos, posts, pages web, salons de discussion, etc.
+ </dd>
+ <dt>Créer un jeton</dt>
+ <dd>
+ Le formulaire à créer/éditer accepte trois paramètres, un nom lisible par l'homme, un mot de passe ou un jeton d'accès, et une expiration facultative. Une fois expiré, le jeton d'accès n'est plus valide, ne peut plus être utilisé et sera automatiquement supprimé de la liste des comptes temporaires. Le champ mot de passe dans les formulaires de création/édition affiche le texte du jeton d'accès et non un mot de passe masqué.
+ </dd>
+ <dt>Partager un jeton</dt>
+ <dd>
+ Nous ne spécifions pas de mécanismes pour partager ces jetons avec d'autres. Toute méthode de communication peut être utilisée. Tous les jetons que vous avez créés sont ajoutés au sélecteur de liste de contrôle d'accès et peuvent être utilisés partout où des listes de contrôle d'accès sont fournies.
+
+ <b>Exemple</b> : Un visiteur arrive sur votre site. Elle a un jeton d'accès que vous lui avez fourni et tente de visiter l'un de vos albums photos (qui ne peut être visionné que par vous-même et une identité temporaire). La permission est refusée.
+
+ Le visiteur sélectionne maintenant &laquo;Login&raquo; dans la barre de navigation du menu. Ceci présente une page de connexion. Elle entre le nom et le mot de passe que vous lui avez fournis, et elle peut maintenant voir l'album photo restreint.
+
+ Alternativement, vous pouvez partager un lien vers un fichier protégé en ajoutant un paramètre &laquo;&zat=abc123&raquo; à l'URL, où la chaîne &laquo;abc123&raquo; est la clé d'accès ou le mot de passe pour la connexion temporaire. Aucune autre négociation n'est nécessaire et le dossier est présenté.
+ </dd>
+</dl>
diff --git a/doc/context/fr/webpages/help.html b/doc/context/fr/webpages/help.html
new file mode 100644
index 000000000..c9d34c08f
--- /dev/null
+++ b/doc/context/fr/webpages/help.html
@@ -0,0 +1,8 @@
+<dl class="dl-horizontal">
+ <dt>Informations de base</dt>
+ <dd>Vous pouvez créer des sites Web modulaires, conscients de l'identité, composés d'éléments partageables.</dd>
+ <dt>Pages</dt>
+ <dd>Cette page énumère vos "pages", qui sont assignées des URLs où les gens peuvent visiter votre site. La structure des pages est généralement décrite par une <b>mise en page </b> associée , et leur contenu est construit à partir d'une collection de <b>blocs</b>.</dd>
+ <dt><a href='#' onclick='contextualHelpFocus("#website-portation-tools", 1); return false;' title="Cliquez pour mettre en évidence l'élément...">Outils de portage de site Web</a></dt>
+ <dd>Les outils de portation de site Web vous permettent d'importer/exporter plusieurs éléments de pages Web (pages, mises en page, mises en page, blocs). Vous pouvez <b>importer </b> soit à partir d'un fichier zip téléchargé, soit à partir d'un dossier de fichiers cloud existant. Vous pouvez <b>exporter </b> vers un fichier zip contenant un groupe choisi d'éléments de page Web sous une forme compatible avec l'outil d'importation, ou vous pouvez exporter directement vers un dossier de fichiers dans le cloud. <a target="_blank" href="help/webpages">en savoir plus...</a></dd>
+</dl>
diff --git a/include/attach.php b/include/attach.php
index 27bf0218a..0d2b43b58 100644
--- a/include/attach.php
+++ b/include/attach.php
@@ -266,14 +266,12 @@ function attach_by_hash($hash, $observer_hash, $rev = 0) {
return $ret;
}
- if(! perm_is_allowed($r[0]['uid'], $observer_hash, 'view_storage')) {
+ if(! attach_can_view($r[0]['uid'], $observer_hash, $hash)) {
$ret['message'] = t('Permission denied.');
return $ret;
}
- $sql_extra = permissions_sql($r[0]['uid'],$observer_hash);
-
- // Now we'll see if we can access the attachment
+ // We've already checked for existence and permissions
$r = q("SELECT * FROM attach WHERE hash = '%s' and uid = %d $sql_extra LIMIT 1",
dbesc($hash),
@@ -281,20 +279,12 @@ function attach_by_hash($hash, $observer_hash, $rev = 0) {
);
if(! $r) {
- $ret['message'] = t('Permission denied.');
+ $ret['message'] = t('Unknown error.');
return $ret;
}
$r[0]['content'] = dbunescbin($r[0]['content']);
- if($r[0]['folder']) {
- $x = attach_can_view_folder($r[0]['uid'],$observer_hash,$r[0]['folder']);
- if(! $x) {
- $ret['message'] = t('Permission denied.');
- return $ret;
- }
- }
-
$ret['success'] = true;
$ret['data'] = $r[0];
@@ -302,6 +292,29 @@ function attach_by_hash($hash, $observer_hash, $rev = 0) {
}
+function attach_can_view($uid,$ob_hash,$resource) {
+
+ $sql_extra = permissions_sql($uid,$ob_hash);
+ $hash = $resource;
+
+ if(! perm_is_allowed($uid,$ob_hash,'view_storage')) {
+ return false;
+ }
+
+ $r = q("select folder from attach where hash = '%s' and uid = %d $sql_extra",
+ dbesc($hash),
+ intval($uid)
+ );
+ if(! $r) {
+ return false;
+ }
+
+ return attach_can_view_folder($uid,$ob_hash,$r[0]['folder']);
+
+}
+
+
+
function attach_can_view_folder($uid,$ob_hash,$folder_hash) {
$sql_extra = permissions_sql($uid,$ob_hash);
diff --git a/include/dba/dba_driver.php b/include/dba/dba_driver.php
index b3298b673..9e9f24bb3 100755
--- a/include/dba/dba_driver.php
+++ b/include/dba/dba_driver.php
@@ -460,3 +460,28 @@ function db_logger($s,$level = LOGGER_NORMAL,$syslog = LOG_INFO) {
\DBA::$logging = false;
\DBA::$dba->debug = $saved;
}
+
+
+function db_columns($table) {
+
+ if($table) {
+ if(ACTIVE_DBTYPE === DBTYPE_POSTGRES) {
+ $r = q("SELECT column_name as field FROM information_schema.columns WHERE table_schema = 'public' AND table_name = '%s'",
+ dbesc($table)
+ );
+ if($r) {
+ return ids_to_array($r,'field');
+ }
+ }
+ else {
+ $r = q("show columns in %s",
+ dbesc($table)
+ );
+ if($r) {
+ return ids_to_array($r,'Field');
+ }
+ }
+ }
+
+ return [];
+} \ No newline at end of file
diff --git a/include/import.php b/include/import.php
index 0d3fb8c32..ae6a0ab6a 100644
--- a/include/import.php
+++ b/include/import.php
@@ -14,7 +14,7 @@ require_once('include/perm_upgrade.php');
* @param int $seize
* @return boolean|array
*/
-function import_channel($channel, $account_id, $seize) {
+function import_channel($channel, $account_id, $seize, $newname = '') {
if(! array_key_exists('channel_system',$channel)) {
$channel['channel_system'] = (($channel['channel_pageflags'] & 0x1000) ? 1 : 0);
@@ -30,6 +30,11 @@ function import_channel($channel, $account_id, $seize) {
$channel['channel_hash'] = make_xchan_hash($channel['channel_guid'],$channel['channel_guid_sig']);
+ if($newname) {
+ $channel['channel_address'] = $newname;
+ }
+
+
// Check for duplicate channels
$r = q("select * from channel where (channel_guid = '%s' or channel_hash = '%s' or channel_address = '%s' ) limit 1",
diff --git a/include/network.php b/include/network.php
index 72f1dacaf..8b7490a8a 100644
--- a/include/network.php
+++ b/include/network.php
@@ -648,6 +648,7 @@ function parse_xml_string($s, $strict = true) {
libxml_use_internal_errors(true);
+
$x = @simplexml_load_string($s2);
if($x === false) {
logger('libxml: parse: error: ' . $s2, LOGGER_DATA);
@@ -661,6 +662,16 @@ function parse_xml_string($s, $strict = true) {
return $x;
}
+
+function sxml2array ( $xmlObject, $out = array () )
+{
+ foreach ( (array) $xmlObject as $index => $node )
+ $out[$index] = ( is_object ( $node ) ) ? sxml2array ( $node ) : $node;
+
+ return $out;
+}
+
+
/**
* @brief Scales an external image.
*
diff --git a/view/css/mod_import.css b/view/css/mod_import.css
deleted file mode 100644
index 8b988b324..000000000
--- a/view/css/mod_import.css
+++ /dev/null
@@ -1,37 +0,0 @@
-h2 {
- margin-left: 15%;
- margin-top: 8%;
-}
-
-#import-channel-form {
- font-size: 1.4em;
- margin-left: 15%;
- margin-top: 5%;
- width: 50%;
-}
-
-
-
-#import-channel-form .descriptive-paragraph {
- color: #888;
- margin-left: 20px;
- margin-bottom: 25px;
-}
-
-.import-label {
- float: left;
- width: 275px;
-}
-
-.import-input {
- float: left;
- width: 275px;
- padding: 5px;
-}
-
-
-.import-field-end {
- clear: both;
- margin-bottom: 20px;
-}
-
diff --git a/view/tpl/channel_import.tpl b/view/tpl/channel_import.tpl
index baffe9b06..c7cbb1742 100755
--- a/view/tpl/channel_import.tpl
+++ b/view/tpl/channel_import.tpl
@@ -1,43 +1,36 @@
-<h2>{{$title}}</h2>
+<div class="generic-content-wrapper">
+ <div class="section-title-wrapper">
+ <h2>{{$title}}</h2>
+ <div class="clear"></div>
+ </div>
+ <div class="section-content-wrapper">
-<form action="import" method="post" enctype="multipart/form-data" id="import-channel-form">
- <input type="hidden" name="form_security_token" value="{{$form_security_token}}">
- <div id="import-desc" class="descriptive-paragraph">{{$desc}}</div>
+ <form action="import" method="post" enctype="multipart/form-data" id="import-channel-form">
+ <input type="hidden" name="form_security_token" value="{{$form_security_token}}">
+ <div id="import-desc" class="section-content-info-wrapper">{{$desc}}</div>
- <label for="import-filename" id="label-import-filename" class="import-label" >{{$label_filename}}</label>
- <input type="file" name="filename" id="import-filename" class="import-input" value="" />
- <div id="import-filename-end" class="import-field-end"></div>
+ <label for="import-filename" id="label-import-filename" class="import-label" >{{$label_filename}}</label>
+ <input type="file" name="filename" id="import-filename" class="import-input" value="" />
+ <div id="import-filename-end" class="import-field-end"></div>
- <div id="import-choice" class="descriptive-paragraph">{{$choice}}</div>
+ <div id="import-choice" class="section-content-info-wrapper">{{$choice}}</div>
- <label for="import-old-address" id="label-import-old-address" class="import-label" >{{$label_old_address}}</label>
- <input type="text" name="old_address" id="import-old-address" class="import-input" value="" />
- <div id="import-old-address-end" class="import-field-end"></div>
+ {{include file="field_input.tpl" field=$old_address}}
+ {{include file="field_input.tpl" field=$email}}
+ {{include file="field_password.tpl" field=$password}}
+ {{include file="field_checkbox.tpl" field=$import_posts}}
- <label for="import-old-email" id="label-import-old-email" class="import-label" >{{$label_old_email}}</label>
- <input type="text" name="email" id="import-old-email" class="import-input" value="{{$email}}" />
- <div id="import-old-email-end" class="import-field-end"></div>
+ <div id="import-common-desc" class="section-content-info-wrapper">{{$common}}</div>
- <label for="import-old-pass" id="label-import-old-pass" class="import-label" >{{$label_old_pass}}</label>
- <input type="password" name="password" id="import-old-pass" class="import-input" value="{{$pass}}" />
- <div id="import-old-pass-end" class="import-field-end"></div>
+ {{include file="field_checkbox.tpl" field=$make_primary}}
+ {{include file="field_checkbox.tpl" field=$moving}}
+ {{include file="field_input.tpl" field=$newname}}
- <input type="checkbox" name="import_posts" id="import-posts" value="1" />
- <label for="import-posts" id="label-import-posts">{{$label_import_posts}}</label>
- <div id="import-posts-end" class="import-field-end"></div>
+ <div id="import-common-desc" class="section-content-info-wrapper">{{$pleasewait}}</div>
- <div id="import-common-desc" class="descriptive-paragraph">{{$common}}</div>
+ <input type="submit" class="btn btn-primary" name="submit" id="import-submit-button" value="{{$submit}}" />
+ <div id="import-submit-end" class="import-field-end"></div>
- <input type="checkbox" name="make_primary" id="import-make-primary" value="1" />
- <label for="import-make-primary" id="label-import-make-primary">{{$label_import_primary}}</label>
- <div id="import-make-primary-end" class="import-field-end"></div>
-
- <input type="checkbox" name="moving" id="import-moving" value="1" />
- <label for="import-moving" id="label-import-moving">{{$label_import_moving}}</label>
- <div id="import-moving-end" class="import-field-end"></div>
-
- <input type="submit" name="submit" id="import-submit-button" value="{{$submit}}" />
- <div id="import-submit-end" class="import-field-end"></div>
-
- <div id="import-common-desc" class="descriptive-paragraph">{{$pleasewait}}</div>
-</form>
+ </form>
+ </div>
+</div>
diff --git a/view/tpl/cover_photo.tpl b/view/tpl/cover_photo.tpl
index 92efcdf02..5a5bf2286 100755
--- a/view/tpl/cover_photo.tpl
+++ b/view/tpl/cover_photo.tpl
@@ -86,6 +86,9 @@
<h2>{{$title}}</h2>
</div>
<div class="section-content-wrapper">
+ {{if $info}}
+ <div class="section-content-warning-wrapper">{{$info}}</div>
+ {{/if}}
{{if $existing}}
<img class="cover-photo-review" style="max-width: 100%;" src="{{$existing.url}}" alt="{{t('Cover Photo')}}" />
{{/if}}
diff --git a/view/tpl/profile_photo.tpl b/view/tpl/profile_photo.tpl
index e48d05330..819502df5 100755
--- a/view/tpl/profile_photo.tpl
+++ b/view/tpl/profile_photo.tpl
@@ -94,7 +94,9 @@
<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
<div id="profile-photo-upload-wrapper">
-
+ {{if $info}}
+ <div class="section-content-warning-wrapper">{{$info}}</div>
+ {{/if}}
{{if $importfile}}
<input type="hidden" name="importfile" value="{{$importfile}}">
{{else}}