diff --git a/doc/addons.bb b/doc/addons.bb
index 9927a2956..6fa9510f5 100644
--- a/doc/addons.bb
+++ b/doc/addons.bb
@@ -49,7 +49,7 @@
[*] nsabait - add random terrorism related hashtags to your posts
[*] nsfw - Highly recommended plugin to collpase posts with inappropriate content
[*] openclipatar - choose a profile photo from hundreds of royalty free images
-[*] openid - OpenID authentication and OpenID server
+[*] openid - OpenID authentication and OpenID server. Your OpenID URL is [observer.baseurl]/id/[observer.webname]
[*] openstreetmap - render locations and maps using OpenStreetMap
[*] pageheader - display text at the top of every page on the site
[*] phpmailer - alternate mail delivery system with more configurability
diff --git a/doc/bbcode.html b/doc/bbcode.html
index 7a2c969eb..36f40d3f4 100644
--- a/doc/bbcode.html
+++ b/doc/bbcode.html
@@ -78,6 +78,7 @@ or
[dl terms="b"]
[*= First element term] First element descript
[observer.baseurl] website of observer
[observer.url] channel URL of observer
[observer.name] name of observer
+[observer.webname] short name in the url of the observer
[observer.address] address (zot-id) of observer
[observer.photo] profile photo of observer
diff --git a/doc/features.bb b/doc/features.bb
index 3daf403c3..578af6050 100644
--- a/doc/features.bb
+++ b/doc/features.bb
@@ -134,6 +134,7 @@ The options are:
- Anybody on this website.
- Anybody in this network.
- Anybody authenticated.
+ - Specific people you provide a Guest Access Token to in order to access a specific item.
- Anybody on the Internet.
diff --git a/doc/permissions.bb b/doc/permissions.bb
index 0721c763d..64690d608 100644
--- a/doc/permissions.bb
+++ b/doc/permissions.bb
@@ -32,6 +32,8 @@ We highly recommend that you use the "typical social network" settings when you
[*= Anybody authenticated ] This is similar to "anybody in this network" except that it can include anybody who can authenticate by any means - and therefore [i]may[/i] include visitors from other networks.
+ [*=Guest Access Token] This allows you to share a file, folder, photo, album, or channel with a specific person or group of people. They don't need to be Hubzilla members. You can set an expiration for the Access Token.
+
[*= Anybody on the internet ] Completely public. This permission will be approved for anybody at all.
[/dl]
[*= The individual permissions are:]
diff --git a/include/widgets.php b/include/widgets.php
index 86f0305df..3dc555b46 100644
--- a/include/widgets.php
+++ b/include/widgets.php
@@ -899,32 +899,86 @@ function widget_chatroom_members() {
function widget_wiki_list($arr) {
- require_once("include/wiki.php");
- $channel = null;
- if (argc() < 2 && local_channel()) {
- // This should not occur because /wiki should redirect to /wiki/channel ...
- $channel = \App::get_channel();
- } else {
- $channel = channelx_by_nick(argv(1)); // Channel being viewed by observer
- }
- if (!$channel) {
+ require_once("include/wiki.php");
+ $channel = null;
+ if (argc() < 2 && local_channel()) {
+ // This should not occur because /wiki should redirect to /wiki/channel ...
+ $channel = \App::get_channel();
+ } else {
+ $channel = channelx_by_nick(argv(1)); // Channel being viewed by observer
+ }
+ if (!$channel) {
+ return '';
+ }
+ // init() should have forced the URL to redirect to /wiki/channel so assume argc() > 1
+ $nick = argv(1);
+ $owner = channelx_by_nick($nick); // The channel who owns the wikis being viewed
+ // Determine if the observer is the channel owner so the ACL dialog can be populated
+ if (local_channel() === intval($owner['channel_id'])) {
+
+ // Obtain the default permission settings of the channel
+ $owner_acl = array(
+ 'allow_cid' => $owner['channel_allow_cid'],
+ 'allow_gid' => $owner['channel_allow_gid'],
+ 'deny_cid' => $owner['channel_deny_cid'],
+ 'deny_gid' => $owner['channel_deny_gid']
+ );
+ // Initialize the ACL to the channel default permissions
+ $x = array(
+ 'lockstate' => (( $owner['channel_allow_cid'] ||
+ $owner['channel_allow_gid'] ||
+ $owner['channel_deny_cid'] ||
+ $owner['channel_deny_gid']) ? 'lock' : 'unlock'
+ ),
+ 'acl' => populate_acl($owner_acl),
+ 'allow_cid' => acl2json($owner_acl['allow_cid']),
+ 'allow_gid' => acl2json($owner_acl['allow_gid']),
+ 'deny_cid' => acl2json($owner_acl['deny_cid']),
+ 'deny_gid' => acl2json($owner_acl['deny_gid']),
+ 'bang' => ''
+ );
+ } else {
+ // Not the channel owner
+ $owner_acl = $x = array();
+ }
+ if(argc()>1) {
+ $activeWikiURLname = argv(2);
+ } else {
+ $activeWikiURLname = '';
+ }
+ logger($activeWikiURLname, LOGGER_DEBUG);
+ $wikis = wiki_list($channel, get_observer_hash());
+ foreach($wikis['wikis'] as &$w) {
+ if($w['urlName'] === $activeWikiURLname) {
+ $w['active'] = true;
+ } else {
+ $w['active'] = false;
+ }
+ }
+ if ($wikis) {
+ return replace_macros(get_markup_template('wikilist.tpl'), array(
+ '$header' => t('Wiki List'),
+ '$channel' => $channel['channel_address'],
+ '$wikis' => $wikis['wikis'],
+ // If the observer is the local channel owner, show the wiki controls
+ '$owner' => ((local_channel() && local_channel() === intval(\App::$profile['uid'])) ? true : false),
+ '$edit' => t('Edit'),
+ '$download' => t('Download'),
+ '$view' => t('View'),
+ '$addnew' => t('Create new wiki'),
+ '$create' => t('Create'),
+ '$wikiName' => array('wikiName', t('Wiki name'), '', ''),
+ '$lockstate' => $x['lockstate'],
+ '$acl' => $x['acl'],
+ '$allow_cid' => $x['allow_cid'],
+ '$allow_gid' => $x['allow_gid'],
+ '$deny_cid' => $x['deny_cid'],
+ '$deny_gid' => $x['deny_gid'],
+ '$bang' => $x['bang'],
+ '$notify' => t('Send notification')
+ ));
+ }
return '';
- }
- $wikis = wiki_list($channel, get_observer_hash());
- if ($wikis) {
- return replace_macros(get_markup_template('wikilist.tpl'), array(
- '$header' => t('Wiki List'),
- '$channel' => $channel['channel_address'],
- '$wikis' => $wikis['wikis'],
- // If the observer is the local channel owner, show the wiki controls
- '$owner' => ((local_channel() && local_channel() === intval(\App::$profile['uid'])) ? true : false),
- '$edit' => t('Edit'),
- '$download' => t('Download'),
- '$view' => t('View'),
- '$addnew' => t('Add new wiki')
- ));
- }
- return '';
}
function widget_wiki_pages($arr) {
diff --git a/view/theme/redbasic/css/style.css b/view/theme/redbasic/css/style.css
index a7ce3af38..f71fe8ea8 100644
--- a/view/theme/redbasic/css/style.css
+++ b/view/theme/redbasic/css/style.css
@@ -2025,11 +2025,17 @@ dl.bb-dl > dd > li {
}
.embed-photo-selected-photo {
- border-color: blue;
- border-style: solid;
- border-width: 5px;
+ border-color: blue;
+ border-style: solid;
+ border-width: 5px;
}
#wiki-preview img {
- max-width: 100%;
+ max-width: 100%;
+}
+
+.sub-menu {
+ margin-top: 10px;
+ padding-left: 15px;
+ border-left: 3px solid #ccc;
}
diff --git a/view/tpl/wiki.tpl b/view/tpl/wiki.tpl
index 54d501396..4eefb3189 100644
--- a/view/tpl/wiki.tpl
+++ b/view/tpl/wiki.tpl
@@ -43,47 +43,7 @@
:
-
-