2016-06-14 05:09:22 +00:00
< ? php /** @file */
2016-05-21 18:56:42 +00:00
2016-06-14 05:09:22 +00:00
namespace Zotlabs\Module ;
2016-05-21 18:56:42 +00:00
2017-01-19 01:45:27 +00:00
use \Zotlabs\Lib as Zlib ;
2017-02-25 18:12:41 +00:00
use \Michelf\MarkdownExtra ;
2017-01-19 01:45:27 +00:00
2017-01-20 23:42:15 +00:00
require_once ( 'include/acl_selectors.php' );
require_once ( 'include/conversation.php' );
require_once ( 'include/bbcode.php' );
2016-05-21 18:56:42 +00:00
class Wiki extends \Zotlabs\Web\Controller {
2017-01-19 01:45:27 +00:00
private $wiki = null ;
2016-05-21 18:56:42 +00:00
function init () {
// Determine which channel's wikis to display to the observer
2016-06-03 02:27:26 +00:00
$nick = null ;
if ( argc () > 1 )
$nick = argv ( 1 ); // if the channel name is in the URL, use that
2017-01-19 01:45:27 +00:00
if ( ! $nick && local_channel ()) { // if no channel name was provided, assume the current logged in channel
2016-06-03 02:27:26 +00:00
$channel = \App :: get_channel ();
if ( $channel && $channel [ 'channel_address' ]) {
$nick = $channel [ 'channel_address' ];
goaway ( z_root () . '/wiki/' . $nick );
2016-05-21 18:56:42 +00:00
}
}
2017-01-19 01:45:27 +00:00
if ( ! $nick ) {
notice ( t ( 'Profile Unavailable.' ) . EOL );
goaway ( z_root ());
2016-05-21 18:56:42 +00:00
}
2016-06-27 05:13:59 +00:00
2017-01-19 01:45:27 +00:00
profile_load ( $nick );
2016-05-21 18:56:42 +00:00
}
function get () {
2016-06-30 03:59:00 +00:00
if ( observer_prohibited ( true )) {
return login ();
}
2016-07-01 04:27:59 +00:00
if ( ! feature_enabled ( \App :: $profile_uid , 'wiki' )) {
notice ( t ( 'Not found' ) . EOL );
2017-07-21 08:32:21 +00:00
return ;
2016-07-01 04:27:59 +00:00
}
2016-11-28 14:24:49 +00:00
2016-06-30 03:59:00 +00:00
2017-02-02 02:05:02 +00:00
if ( ! perm_is_allowed ( \App :: $profile_uid , get_observer_hash (), 'view_wiki' )) {
notice ( t ( 'Permission denied.' ) . EOL );
return ;
}
2016-05-31 00:59:54 +00:00
// TODO: Combine the interface configuration into a unified object
// Something like $interface = array('new_page_button' => false, 'new_wiki_button' => false, ...)
2017-01-19 01:45:27 +00:00
2016-05-30 00:16:17 +00:00
$wiki_owner = false ;
2016-05-30 18:59:33 +00:00
$showNewWikiButton = false ;
2016-05-31 00:59:54 +00:00
$pageHistory = array ();
2016-06-03 02:27:26 +00:00
$local_observer = null ;
2016-05-28 02:19:05 +00:00
$resource_id = '' ;
2016-06-03 02:27:26 +00:00
// init() should have forced the URL to redirect to /wiki/channel so assume argc() > 1
2017-01-19 01:45:27 +00:00
2016-06-03 02:27:26 +00:00
$nick = argv ( 1 );
2016-11-16 02:43:26 +00:00
$owner = channelx_by_nick ( $nick ); // The channel who owns the wikis being viewed
if ( ! $owner ) {
notice ( t ( 'Invalid channel' ) . EOL );
2016-06-03 02:27:26 +00:00
goaway ( '/' . argv ( 0 ));
2016-05-30 18:59:33 +00:00
}
2017-01-19 01:45:27 +00:00
$observer_hash = get_observer_hash ();
2016-06-03 02:27:26 +00:00
// Determine if the observer is the channel owner so the ACL dialog can be populated
2016-11-16 02:43:26 +00:00
if ( local_channel () === intval ( $owner [ 'channel_id' ])) {
2016-06-03 02:27:26 +00:00
$wiki_owner = true ;
2017-07-21 08:32:21 +00:00
nav_set_selected ( t ( 'Wiki' ));
2016-06-03 02:27:26 +00:00
// Obtain the default permission settings of the channel
2016-11-16 02:43:26 +00:00
$owner_acl = array (
2017-01-19 01:45:27 +00:00
'allow_cid' => $owner [ 'channel_allow_cid' ],
'allow_gid' => $owner [ 'channel_allow_gid' ],
'deny_cid' => $owner [ 'channel_deny_cid' ],
'deny_gid' => $owner [ 'channel_deny_gid' ]
2016-06-03 02:27:26 +00:00
);
2017-01-19 01:45:27 +00:00
2016-06-03 02:27:26 +00:00
// Initialize the ACL to the channel default permissions
2017-01-19 01:45:27 +00:00
2016-06-03 02:27:26 +00:00
$x = array (
2016-11-16 02:43:26 +00:00
'lockstate' => (( $owner [ 'channel_allow_cid' ] ||
$owner [ 'channel_allow_gid' ] ||
$owner [ 'channel_deny_cid' ] ||
$owner [ 'channel_deny_gid' ])
2016-08-04 10:09:06 +00:00
? 'lock' : 'unlock'
),
2016-11-16 02:43:26 +00:00
'acl' => populate_acl ( $owner_acl ),
'allow_cid' => acl2json ( $owner_acl [ 'allow_cid' ]),
'allow_gid' => acl2json ( $owner_acl [ 'allow_gid' ]),
2017-01-19 01:45:27 +00:00
'deny_cid' => acl2json ( $owner_acl [ 'deny_cid' ]),
'deny_gid' => acl2json ( $owner_acl [ 'deny_gid' ]),
2016-06-03 02:27:26 +00:00
'bang' => ''
);
2017-01-19 01:45:27 +00:00
}
else {
2016-06-03 02:27:26 +00:00
// Not the channel owner
2016-11-16 02:43:26 +00:00
$owner_acl = $x = array ();
2016-06-03 02:27:26 +00:00
}
2016-11-22 10:30:04 +00:00
$is_owner = (( local_channel ()) && ( local_channel () == \App :: $profile [ 'profile_uid' ]) ? true : false );
2017-03-20 16:24:48 +00:00
//$o = profile_tabs($a, $is_owner, \App::$profile['channel_address']);
$o = '' ;
2016-11-22 10:30:04 +00:00
2016-10-22 12:52:26 +00:00
// Download a wiki
2017-01-23 02:48:45 +00:00
/*
2016-11-23 08:47:10 +00:00
if (( argc () > 3 ) && ( argv ( 2 ) === 'download' ) && ( argv ( 3 ) === 'wiki' )) {
2016-11-23 08:41:10 +00:00
$resource_id = argv ( 4 );
2016-11-23 08:47:10 +00:00
2017-01-19 01:45:27 +00:00
$w = Zlib\NativeWiki :: get_wiki ( $owner , $observer_hash , $resource_id );
if ( ! $w [ 'htmlName' ]) {
2016-11-23 08:47:10 +00:00
notice ( t ( 'Error retrieving wiki' ) . EOL );
2016-11-23 08:41:10 +00:00
}
2016-11-23 08:47:10 +00:00
2016-11-23 08:41:10 +00:00
$zip_folder_name = random_string ( 10 );
$zip_folderpath = '/tmp/' . $zip_folder_name ;
2016-11-23 08:47:10 +00:00
if ( ! mkdir ( $zip_folderpath , 0770 , false )) {
2016-11-23 08:41:10 +00:00
logger ( 'Error creating zip file export folder: ' . $zip_folderpath , LOGGER_NORMAL );
notice ( t ( 'Error creating zip file export folder' ) . EOL );
}
2016-11-23 08:47:10 +00:00
2016-11-23 08:41:10 +00:00
$zip_filename = $w [ 'urlName' ];
$zip_filepath = '/tmp/' . $zip_folder_name . '/' . $zip_filename ;
2016-11-23 08:47:10 +00:00
2016-11-23 08:41:10 +00:00
// Generate the zip file
2017-01-19 01:45:27 +00:00
ZLib\ExtendedZip :: zipTree ( $w [ 'path' ], $zip_filepath , \ZipArchive :: CREATE );
2016-11-23 08:47:10 +00:00
2016-11-23 08:41:10 +00:00
// Output the file for download
2016-11-23 09:28:37 +00:00
2016-11-23 08:41:10 +00:00
header ( 'Content-disposition: attachment; filename="' . $zip_filename . '.zip"' );
2016-11-23 09:28:37 +00:00
header ( 'Content-Type: application/zip' );
2016-11-23 08:47:10 +00:00
2016-11-23 08:41:10 +00:00
$success = readfile ( $zip_filepath );
2016-11-23 08:47:10 +00:00
2016-11-23 09:28:37 +00:00
if ( ! $success ) {
2016-11-23 08:41:10 +00:00
logger ( 'Error downloading wiki: ' . $resource_id );
2016-11-23 09:28:37 +00:00
notice ( t ( 'Error downloading wiki: ' . $resource_id ) . EOL );
2016-11-23 08:41:10 +00:00
}
2016-11-23 09:28:37 +00:00
// delete temporary files
rrmdir ( $zip_folderpath );
killme ();
2016-10-22 12:52:26 +00:00
}
2017-01-23 02:48:45 +00:00
*/
2017-01-19 01:45:27 +00:00
switch ( argc ()) {
2016-06-03 02:27:26 +00:00
case 2 :
2017-01-19 01:45:27 +00:00
$wikis = Zlib\NativeWiki :: listwikis ( $owner , get_observer_hash ());
if ( $wikis ) {
2016-11-22 10:30:04 +00:00
$o .= replace_macros ( get_markup_template ( 'wikilist.tpl' ), array (
'$header' => t ( 'Wikis' ),
'$channel' => $owner [ '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' ),
'$create' => t ( 'Create New' ),
'$submit' => t ( 'Submit' ),
'$wikiName' => array ( 'wikiName' , t ( 'Wiki name' )),
2016-11-28 14:24:49 +00:00
'$mimeType' => array ( 'mimeType' , t ( 'Content type' ), '' , '' , [ 'text/markdown' => 'Markdown' , 'text/bbcode' => 'BB Code' ]),
2016-11-22 10:30:04 +00:00
'$name' => t ( 'Name' ),
2016-12-04 14:10:54 +00:00
'$type' => t ( 'Type' ),
2016-11-22 10:30:04 +00:00
'$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' ],
'$notify' => array ( 'postVisible' , t ( 'Create a status post for this wiki' ), '' , '' , array ( t ( 'No' ), t ( 'Yes' )))
));
return $o ;
}
2016-06-03 02:27:26 +00:00
break ;
2017-01-19 01:45:27 +00:00
2016-06-03 02:27:26 +00:00
case 3 :
2017-01-19 01:45:27 +00:00
2016-06-03 02:27:26 +00:00
// /wiki/channel/wiki -> No page was specified, so redirect to Home.md
2017-01-19 01:45:27 +00:00
2016-06-04 22:00:32 +00:00
$wikiUrlName = urlencode ( argv ( 2 ));
2017-01-19 01:45:27 +00:00
goaway ( z_root () . '/' . argv ( 0 ) . '/' . argv ( 1 ) . '/' . $wikiUrlName . '/Home' );
2016-06-03 02:27:26 +00:00
case 4 :
2017-05-23 03:18:47 +00:00
default :
2017-01-19 01:45:27 +00:00
2016-06-03 02:27:26 +00:00
// GET /wiki/channel/wiki/page
// Fetch the wiki info and determine observer permissions
2017-01-19 01:45:27 +00:00
2017-01-26 23:16:41 +00:00
$wikiUrlName = urldecode ( argv ( 2 ));
2017-05-23 03:18:47 +00:00
$page_name = '' ;
$ignore_language = false ;
for ( $x = 3 ; $x < argc (); $x ++ ) {
if ( $page_name === '' && argv ( $x ) === '-' ) {
$ignore_language = true ;
continue ;
}
2017-06-03 15:23:53 +00:00
if ( $page_name ) {
2017-05-23 03:18:47 +00:00
$page_name .= '/' ;
2017-06-03 15:23:53 +00:00
}
$page_name .= argv ( $x );
2017-05-23 03:18:47 +00:00
}
$pageUrlName = urldecode ( $page_name );
$langPageUrlName = urldecode ( \App :: $language . '/' . $page_name );
2016-12-01 10:24:35 +00:00
2017-01-19 01:45:27 +00:00
$w = Zlib\NativeWiki :: exists_by_name ( $owner [ 'channel_id' ], $wikiUrlName );
if ( ! $w [ 'resource_id' ]) {
2016-11-16 02:43:26 +00:00
notice ( t ( 'Wiki not found' ) . EOL );
2017-01-19 01:45:27 +00:00
goaway ( z_root () . '/' . argv ( 0 ) . '/' . argv ( 1 ));
2016-06-03 02:27:26 +00:00
}
2017-01-19 01:45:27 +00:00
2016-06-03 02:27:26 +00:00
$resource_id = $w [ 'resource_id' ];
2017-01-19 01:45:27 +00:00
if ( ! $wiki_owner ) {
2016-06-03 02:27:26 +00:00
// Check for observer permissions
$observer_hash = get_observer_hash ();
2017-01-19 01:45:27 +00:00
$perms = Zlib\NativeWiki :: get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
if ( ! $perms [ 'read' ]) {
2016-11-16 02:43:26 +00:00
notice ( t ( 'Permission denied.' ) . EOL );
2017-01-19 01:45:27 +00:00
goaway ( z_root () . '/' . argv ( 0 ) . '/' . argv ( 1 ));
2016-12-01 10:24:35 +00:00
return ; //not reached
2016-06-03 02:27:26 +00:00
}
2017-01-19 01:45:27 +00:00
$wiki_editor = (( $perms [ 'write' ]) ? true : false );
}
else {
2016-06-08 10:26:27 +00:00
$wiki_editor = true ;
2016-05-30 00:16:17 +00:00
}
2017-01-19 01:45:27 +00:00
2016-06-15 10:25:31 +00:00
$wikiheaderName = urldecode ( $wikiUrlName );
$wikiheaderPage = urldecode ( $pageUrlName );
2017-01-19 01:45:27 +00:00
2016-12-01 10:24:35 +00:00
$renamePage = (( $wikiheaderPage === 'Home' ) ? '' : t ( 'Rename page' ));
2017-05-23 03:18:47 +00:00
$p = [];
2016-12-01 10:24:35 +00:00
2017-05-23 03:18:47 +00:00
if ( ! $ignore_language ) {
$p = Zlib\NativeWikiPage :: get_page_content ( array ( 'channel_id' => $owner [ 'channel_id' ], 'observer_hash' => $observer_hash , 'resource_id' => $resource_id , 'pageUrlName' => $langPageUrlName ));
}
if ( ! ( $p && $p [ 'success' ])) {
$p = Zlib\NativeWikiPage :: get_page_content ( array ( 'channel_id' => $owner [ 'channel_id' ], 'observer_hash' => $observer_hash , 'resource_id' => $resource_id , 'pageUrlName' => $pageUrlName ));
}
if ( ! ( $p && $p [ 'success' ])) {
2017-01-19 01:45:27 +00:00
notice ( t ( 'Error retrieving page content' ) . EOL );
goaway ( z_root () . '/' . argv ( 0 ) . '/' . argv ( 1 ) );
2016-06-03 02:27:26 +00:00
}
2016-11-30 12:30:50 +00:00
$mimeType = $p [ 'mimeType' ];
2017-03-30 13:07:48 +00:00
$sampleContent = (( $mimeType == 'text/bbcode' ) ? '[h3]' . t ( 'New page' ) . '[/h3]' : '### ' . t ( 'New page' ));
2017-02-27 12:52:08 +00:00
2017-03-30 13:07:48 +00:00
$content = (( $p [ 'content' ] == '' ) ? $sampleContent : $p [ 'content' ]);
2017-03-18 23:41:43 +00:00
2016-06-25 19:29:52 +00:00
// Render the Markdown-formatted page content in HTML
2016-11-30 12:30:50 +00:00
if ( $mimeType == 'text/bbcode' ) {
2017-01-19 01:45:27 +00:00
$renderedContent = Zlib\NativeWikiPage :: convert_links ( zidify_links ( smilies ( bbcode ( $content ))), argv ( 0 ) . '/' . argv ( 1 ) . '/' . $wikiUrlName );
2016-11-30 12:30:50 +00:00
}
else {
2017-03-15 00:07:29 +00:00
$content = Zlib\MarkdownSoap :: unescape ( $content );
2017-03-18 23:41:43 +00:00
$html = Zlib\NativeWikiPage :: generate_toc ( zidify_text ( MarkdownExtra :: defaultTransform ( Zlib\NativeWikiPage :: bbcode ( $content ))));
2017-01-19 02:18:37 +00:00
$renderedContent = Zlib\NativeWikiPage :: convert_links ( $html , argv ( 0 ) . '/' . argv ( 1 ) . '/' . $wikiUrlName );
2016-11-30 12:30:50 +00:00
}
2016-06-08 10:26:27 +00:00
$showPageControls = $wiki_editor ;
2016-06-03 02:27:26 +00:00
break ;
2017-05-23 03:18:47 +00:00
// default: // Strip the extraneous URL components
// goaway('/' . argv(0) . '/' . argv(1) . '/' . $wikiUrlName . '/' . $pageUrlName);
2016-05-22 01:55:09 +00:00
}
2016-05-28 18:11:36 +00:00
2017-03-21 02:41:03 +00:00
2016-06-17 10:33:39 +00:00
$wikiModalID = random_string ( 3 );
2016-11-30 12:30:50 +00:00
$wikiModal = replace_macros ( get_markup_template ( 'generic_modal.tpl' ), array (
'$id' => $wikiModalID ,
'$title' => t ( 'Revision Comparison' ),
2016-12-14 10:55:52 +00:00
'$ok' => (( $showPageControls ) ? t ( 'Revert' ) : '' ),
2016-11-30 12:30:50 +00:00
'$cancel' => t ( 'Cancel' )
));
2017-01-19 01:45:27 +00:00
$placeholder = t ( 'Short description of your changes (optional)' );
2016-06-25 11:27:14 +00:00
2016-05-21 18:56:42 +00:00
$o .= replace_macros ( get_markup_template ( 'wiki.tpl' ), array (
2016-06-15 10:25:31 +00:00
'$wikiheaderName' => $wikiheaderName ,
'$wikiheaderPage' => $wikiheaderPage ,
2016-12-01 10:24:35 +00:00
'$renamePage' => $renamePage ,
2016-05-28 18:11:36 +00:00
'$showPageControls' => $showPageControls ,
2016-11-19 02:55:29 +00:00
'$editOrSourceLabel' => (( $showPageControls ) ? t ( 'Edit' ) : t ( 'Source' )),
2016-12-01 10:38:49 +00:00
'$tools_label' => 'Page Tools' ,
2017-06-03 15:23:53 +00:00
'$channel_address' => $owner [ 'channel_address' ],
'$channel_id' => $owner [ 'channel_id' ],
2016-05-28 02:19:05 +00:00
'$resource_id' => $resource_id ,
2016-06-04 19:12:04 +00:00
'$page' => $pageUrlName ,
2016-11-30 12:30:50 +00:00
'$mimeType' => $mimeType ,
2016-05-28 16:33:07 +00:00
'$content' => $content ,
2016-06-25 19:29:52 +00:00
'$renderedContent' => $renderedContent ,
2016-12-01 10:24:35 +00:00
'$pageRename' => array ( 'pageRename' , t ( 'New page name' ), '' , '' ),
2017-01-19 01:45:27 +00:00
'$commitMsg' => array ( 'commitMsg' , '' , '' , '' , '' , 'placeholder="' . $placeholder . '"' ),
2016-06-17 10:33:39 +00:00
'$wikiModal' => $wikiModal ,
'$wikiModalID' => $wikiModalID ,
2016-06-25 11:27:14 +00:00
'$commit' => 'HEAD' ,
'$embedPhotos' => t ( 'Embed image from photo albums' ),
'$embedPhotosModalTitle' => t ( 'Embed an image from your albums' ),
'$embedPhotosModalCancel' => t ( 'Cancel' ),
'$embedPhotosModalOK' => t ( 'OK' ),
'$modalchooseimages' => t ( 'Choose images to embed' ),
'$modalchoosealbum' => t ( 'Choose an album' ),
2016-12-15 09:56:16 +00:00
'$modaldiffalbum' => t ( 'Choose a different album' ),
2016-06-25 11:27:14 +00:00
'$modalerrorlist' => t ( 'Error getting album list' ),
'$modalerrorlink' => t ( 'Error getting photo link' ),
'$modalerroralbum' => t ( 'Error getting album' ),
2016-05-21 18:56:42 +00:00
));
2016-12-01 10:24:35 +00:00
if ( $p [ 'mimeType' ] != 'text/bbcode' )
2017-02-20 00:50:41 +00:00
head_add_js ( '/library/ace/ace.js' ); // Ace Code Editor
2016-12-01 10:24:35 +00:00
2016-05-21 18:56:42 +00:00
return $o ;
}
function post () {
2017-01-19 02:18:37 +00:00
2016-11-30 14:13:06 +00:00
require_once ( 'include/bbcode.php' );
2016-11-16 02:43:26 +00:00
$nick = argv ( 1 );
$owner = channelx_by_nick ( $nick );
$observer_hash = get_observer_hash ();
if ( ! $owner ) {
notice ( t ( 'Permission denied.' ) . EOL );
return ;
}
2016-05-30 00:16:17 +00:00
// /wiki/channel/preview
// Render mardown-formatted text in HTML for preview
2016-05-21 18:56:42 +00:00
if (( argc () > 2 ) && ( argv ( 2 ) === 'preview' )) {
$content = $_POST [ 'content' ];
2016-11-30 12:30:50 +00:00
$resource_id = $_POST [ 'resource_id' ];
2017-01-19 09:02:26 +00:00
$w = Zlib\NativeWiki :: get_wiki ( $owner [ 'channel_id' ], $observer_hash , $resource_id );
2017-01-19 01:45:27 +00:00
$wikiURL = argv ( 0 ) . '/' . argv ( 1 ) . '/' . $w [ 'urlName' ];
2016-11-30 12:30:50 +00:00
$mimeType = $w [ 'mimeType' ];
if ( $mimeType == 'text/bbcode' ) {
2017-01-19 01:45:27 +00:00
$html = Zlib\NativeWikiPage :: convert_links ( zidify_links ( smilies ( bbcode ( $content ))), $wikiURL );
2016-11-30 12:30:50 +00:00
}
else {
2017-03-19 00:00:09 +00:00
2017-03-18 23:41:43 +00:00
$bb = Zlib\NativeWikiPage :: bbcode ( $content );
$x = new ZLib\MarkdownSoap ( $bb );
$md = $x -> clean ();
$md = ZLib\MarkdownSoap :: unescape ( $md );
$html = MarkdownExtra :: defaultTransform ( $md );
$html = Zlib\NativeWikiPage :: generate_toc ( zidify_text ( $html ));
2017-01-19 01:45:27 +00:00
$html = Zlib\NativeWikiPage :: convert_links ( $html , $wikiURL );
2016-11-30 12:30:50 +00:00
}
2016-05-21 18:56:42 +00:00
json_return_and_die ( array ( 'html' => $html , 'success' => true ));
}
// Create a new wiki
2016-05-30 00:16:17 +00:00
// /wiki/channel/create/wiki
2016-05-21 18:56:42 +00:00
if (( argc () > 3 ) && ( argv ( 2 ) === 'create' ) && ( argv ( 3 ) === 'wiki' )) {
2016-11-16 02:43:26 +00:00
2016-06-08 10:26:27 +00:00
// Only the channel owner can create a wiki, at least until we create a
// more detail permissions framework
2016-11-16 02:43:26 +00:00
if ( local_channel () !== intval ( $owner [ 'channel_id' ])) {
goaway ( '/' . argv ( 0 ) . '/' . $nick . '/' );
2016-06-12 11:17:23 +00:00
}
2016-06-04 10:26:41 +00:00
$wiki = array ();
// Generate new wiki info from input name
2017-01-26 23:16:41 +00:00
$wiki [ 'postVisible' ] = (( intval ( $_POST [ 'postVisible' ])) ? 1 : 0 );
$wiki [ 'rawName' ] = $_POST [ 'wikiName' ];
$wiki [ 'htmlName' ] = escape_tags ( $_POST [ 'wikiName' ]);
$wiki [ 'urlName' ] = urlencode ( urlencode ( $_POST [ 'wikiName' ]));
$wiki [ 'mimeType' ] = $_POST [ 'mimeType' ];
2016-11-29 09:33:46 +00:00
2016-06-04 10:26:41 +00:00
if ( $wiki [ 'urlName' ] === '' ) {
2016-11-16 02:43:26 +00:00
notice ( t ( 'Error creating wiki. Invalid name.' ) . EOL );
2016-05-21 23:02:23 +00:00
goaway ( '/wiki' );
2017-03-30 13:07:48 +00:00
return ; //not reached
}
$exists = Zlib\NativeWiki :: exists_by_name ( $owner [ 'channel_id' ], $wiki [ 'urlName' ]);
if ( $exists [ 'id' ]) {
notice ( t ( 'A wiki with this name already exists.' ) . EOL );
goaway ( '/wiki' );
return ; //not reached
2016-05-21 23:02:23 +00:00
}
2016-11-29 09:33:46 +00:00
2016-05-21 18:56:42 +00:00
// Get ACL for permissions
2016-11-16 02:43:26 +00:00
$acl = new \Zotlabs\Access\AccessList ( $owner );
2016-05-24 10:15:42 +00:00
$acl -> set_from_array ( $_POST );
2017-01-19 01:45:27 +00:00
$r = Zlib\NativeWiki :: create_wiki ( $owner , $observer_hash , $wiki , $acl );
if ( $r [ 'success' ]) {
2017-01-25 04:14:58 +00:00
Zlib\NativeWiki :: sync_a_wiki_item ( $owner [ 'channel_id' ], $r [ 'item_id' ], $r [ 'item' ][ 'resource_id' ]);
2017-01-19 01:45:27 +00:00
$homePage = Zlib\NativeWikiPage :: create_page ( $owner [ 'channel_id' ], $observer_hash , 'Home' , $r [ 'item' ][ 'resource_id' ]);
if ( ! $homePage [ 'success' ]) {
2016-11-16 02:43:26 +00:00
notice ( t ( 'Wiki created, but error creating Home page.' ));
2017-01-19 01:45:27 +00:00
goaway ( z_root () . '/wiki/' . $nick . '/' . $wiki [ 'urlName' ]);
2016-05-29 17:33:52 +00:00
}
2017-01-26 23:16:41 +00:00
Zlib\NativeWiki :: sync_a_wiki_item ( $owner [ 'channel_id' ], $homePage [ 'item_id' ], $r [ 'item' ][ 'resource_id' ]);
2017-01-19 01:45:27 +00:00
goaway ( z_root () . '/wiki/' . $nick . '/' . $wiki [ 'urlName' ] . '/' . $homePage [ 'page' ][ 'urlName' ]);
}
else {
notice ( t ( 'Error creating wiki' ));
goaway ( z_root () . '/wiki' );
2016-05-21 18:56:42 +00:00
}
}
2016-05-24 10:15:42 +00:00
// Delete a wiki
if (( argc () > 3 ) && ( argv ( 2 ) === 'delete' ) && ( argv ( 3 ) === 'wiki' )) {
2016-11-16 02:43:26 +00:00
2016-06-08 10:26:27 +00:00
// Only the channel owner can delete a wiki, at least until we create a
// more detail permissions framework
2016-11-16 02:43:26 +00:00
if ( local_channel () !== intval ( $owner [ 'channel_id' ])) {
logger ( 'Wiki delete permission denied.' );
2017-01-19 01:45:27 +00:00
json_return_and_die ( array ( 'message' => t ( 'Wiki delete permission denied.' ), 'success' => false ));
2016-06-25 11:27:14 +00:00
}
2016-05-24 10:15:42 +00:00
$resource_id = $_POST [ 'resource_id' ];
2017-01-19 01:45:27 +00:00
$deleted = Zlib\NativeWiki :: delete_wiki ( $owner [ 'channel_id' ], $observer_hash , $resource_id );
2016-05-24 10:15:42 +00:00
if ( $deleted [ 'success' ]) {
2017-01-25 04:14:58 +00:00
Zlib\NativeWiki :: sync_a_wiki_item ( $owner [ 'channel_id' ], $deleted [ 'item_id' ], $resource_id );
2016-06-08 10:26:27 +00:00
json_return_and_die ( array ( 'message' => '' , 'success' => true ));
2017-01-19 01:45:27 +00:00
}
else {
logger ( 'Error deleting wiki: ' . $resource_id . ' ' . $deleted [ 'message' ]);
json_return_and_die ( array ( 'message' => t ( 'Error deleting wiki' ), 'success' => false ));
2016-05-24 10:15:42 +00:00
}
}
2016-05-28 02:19:05 +00:00
2016-10-22 12:52:26 +00:00
2016-05-28 02:19:05 +00:00
// Create a page
if (( argc () === 4 ) && ( argv ( 2 ) === 'create' ) && ( argv ( 3 ) === 'page' )) {
2016-11-16 02:43:26 +00:00
2016-05-28 02:19:05 +00:00
$resource_id = $_POST [ 'resource_id' ];
2016-06-08 10:26:27 +00:00
// Determine if observer has permission to create a page
2016-11-16 02:43:26 +00:00
2017-01-19 01:45:27 +00:00
$perms = Zlib\NativeWiki :: get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
if ( ! $perms [ 'write' ]) {
2016-11-16 02:43:26 +00:00
logger ( 'Wiki write permission denied. ' . EOL );
json_return_and_die ( array ( 'success' => false ));
2016-05-28 02:19:05 +00:00
}
2016-11-16 02:43:26 +00:00
2017-01-19 01:45:27 +00:00
$name = $_POST [ 'pageName' ]; //Get new page name
if ( urlencode ( escape_tags ( $_POST [ 'pageName' ])) === '' ) {
2016-05-28 02:19:05 +00:00
json_return_and_die ( array ( 'message' => 'Error creating page. Invalid name.' , 'success' => false ));
}
2017-01-19 01:45:27 +00:00
$page = Zlib\NativeWikiPage :: create_page ( $owner [ 'channel_id' ], $observer_hash , $name , $resource_id );
2017-01-25 18:41:47 +00:00
if ( $page [ 'item_id' ]) {
2017-01-19 01:45:27 +00:00
$commit = Zlib\NativeWikiPage :: commit ( array (
'commit_msg' => t ( 'New page created' ),
'resource_id' => $resource_id ,
'channel_id' => $owner [ 'channel_id' ],
'observer_hash' => $observer_hash ,
'pageUrlName' => $name
));
2016-11-24 23:24:15 +00:00
if ( $commit [ 'success' ]) {
2017-01-25 04:14:58 +00:00
Zlib\NativeWiki :: sync_a_wiki_item ( $owner [ 'channel_id' ], $commit [ 'item_id' ], $resource_id );
2017-01-26 23:16:41 +00:00
json_return_and_die ( array ( 'url' => '/' . argv ( 0 ) . '/' . argv ( 1 ) . '/' . urlencode ( $page [ 'wiki' ][ 'urlName' ]) . '/' . urlencode ( $page [ 'page' ][ 'urlName' ]), 'success' => true ));
2017-01-19 01:45:27 +00:00
}
else {
2017-01-26 23:16:41 +00:00
json_return_and_die ( array ( 'message' => 'Error making git commit' , 'url' => '/' . argv ( 0 ) . '/' . argv ( 1 ) . '/' . urlencode ( $page [ 'wiki' ][ 'urlName' ]) . '/' . urlencode ( $page [ 'page' ][ 'urlName' ]), 'success' => false ));
2016-11-24 23:24:15 +00:00
}
2017-01-23 02:48:45 +00:00
2017-01-19 01:45:27 +00:00
}
else {
2016-05-28 02:19:05 +00:00
logger ( 'Error creating page' );
json_return_and_die ( array ( 'message' => 'Error creating page.' , 'success' => false ));
}
}
2016-05-24 10:15:42 +00:00
2016-05-28 11:17:42 +00:00
// Fetch page list for a wiki
2017-01-19 01:45:27 +00:00
if (( argc () === 5 ) && ( argv ( 2 ) === 'get' ) && ( argv ( 3 ) === 'page' ) && ( argv ( 4 ) === 'list' )) {
2016-05-28 11:17:42 +00:00
$resource_id = $_POST [ 'resource_id' ]; // resource_id for wiki in db
2016-11-16 02:43:26 +00:00
2017-01-19 01:45:27 +00:00
$perms = Zlib\NativeWiki :: get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
2016-11-16 02:43:26 +00:00
if ( ! $perms [ 'read' ]) {
logger ( 'Wiki read permission denied.' . EOL );
json_return_and_die ( array ( 'pages' => null , 'message' => 'Permission denied.' , 'success' => false ));
2016-05-28 11:17:42 +00:00
}
2016-11-16 02:43:26 +00:00
2017-03-18 23:41:43 +00:00
// @FIXME - we shouldn't invoke this if it isn't in the PDL or has been over-ridden
$x = new \Zotlabs\Widget\Wiki_pages ();
2017-06-03 15:23:53 +00:00
$page_list_html = $x -> widget ([
'resource_id' => $resource_id ,
'channel_id' => $owner [ 'channel_id' ],
'channel_address' => $owner [ 'channel_address' ],
'refresh' => true
]);
2016-05-28 11:17:42 +00:00
json_return_and_die ( array ( 'pages' => $page_list_html , 'message' => '' , 'success' => true ));
}
2016-05-28 19:11:19 +00:00
// Save a page
if (( argc () === 4 ) && ( argv ( 2 ) === 'save' ) && ( argv ( 3 ) === 'page' )) {
2016-06-08 10:26:27 +00:00
2016-05-28 19:11:19 +00:00
$resource_id = $_POST [ 'resource_id' ];
2016-06-04 19:12:04 +00:00
$pageUrlName = $_POST [ 'name' ];
$pageHtmlName = escape_tags ( $_POST [ 'name' ]);
2016-06-12 11:17:23 +00:00
$content = $_POST [ 'content' ]; //Get new content
2016-06-06 00:30:45 +00:00
$commitMsg = $_POST [ 'commitMsg' ];
if ( $commitMsg === '' ) {
$commitMsg = 'Updated ' . $pageHtmlName ;
}
2016-11-16 02:43:26 +00:00
2016-05-31 00:59:54 +00:00
// Determine if observer has permission to save content
2017-01-19 01:45:27 +00:00
$perms = Zlib\NativeWiki :: get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
if ( ! $perms [ 'write' ]) {
2016-11-16 02:43:26 +00:00
logger ( 'Wiki write permission denied. ' . EOL );
json_return_and_die ( array ( 'success' => false ));
2016-05-28 19:11:19 +00:00
}
2016-06-08 10:26:27 +00:00
2017-01-19 01:45:27 +00:00
$saved = Zlib\NativeWikiPage :: save_page ( array ( 'channel_id' => $owner [ 'channel_id' ], 'observer_hash' => $observer_hash , 'resource_id' => $resource_id , 'pageUrlName' => $pageUrlName , 'content' => $content ));
2016-05-28 19:11:19 +00:00
if ( $saved [ 'success' ]) {
2017-01-19 01:45:27 +00:00
$commit = Zlib\NativeWikiPage :: commit ( array (
'commit_msg' => $commitMsg ,
'pageUrlName' => $pageUrlName ,
'resource_id' => $resource_id ,
'channel_id' => $owner [ 'channel_id' ],
'observer_hash' => $observer_hash ,
'revision' => ( - 1 )
));
2016-05-29 14:18:26 +00:00
if ( $commit [ 'success' ]) {
2017-01-25 04:14:58 +00:00
Zlib\NativeWiki :: sync_a_wiki_item ( $owner [ 'channel_id' ], $commit [ 'item_id' ], $resource_id );
2016-05-29 14:18:26 +00:00
json_return_and_die ( array ( 'message' => 'Wiki git repo commit made' , 'success' => true ));
2017-01-19 01:45:27 +00:00
}
else {
2016-05-29 14:18:26 +00:00
json_return_and_die ( array ( 'message' => 'Error making git commit' , 'success' => false ));
}
2017-01-19 01:45:27 +00:00
}
else {
2016-05-29 14:18:26 +00:00
json_return_and_die ( array ( 'message' => 'Error saving page' , 'success' => false ));
2016-05-28 19:11:19 +00:00
}
}
2016-05-31 00:59:54 +00:00
// Update page history
// /wiki/channel/history/page
if (( argc () === 4 ) && ( argv ( 2 ) === 'history' ) && ( argv ( 3 ) === 'page' )) {
2016-06-08 10:26:27 +00:00
2016-05-31 00:59:54 +00:00
$resource_id = $_POST [ 'resource_id' ];
2016-06-04 19:12:04 +00:00
$pageUrlName = $_POST [ 'name' ];
2016-06-08 10:26:27 +00:00
// Determine if observer has permission to read content
2016-11-16 02:43:26 +00:00
2017-01-19 01:45:27 +00:00
$perms = Zlib\NativeWiki :: get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
if ( ! $perms [ 'read' ]) {
2016-11-16 02:43:26 +00:00
logger ( 'Wiki read permission denied.' . EOL );
json_return_and_die ( array ( 'historyHTML' => '' , 'message' => 'Permission denied.' , 'success' => false ));
2016-05-31 00:59:54 +00:00
}
2016-11-16 02:43:26 +00:00
2017-03-18 23:41:43 +00:00
$historyHTML = \Zotlabs\Lib\NativeWikiPage :: render_page_history ( array (
2016-12-14 10:55:52 +00:00
'resource_id' => $resource_id ,
'pageUrlName' => $pageUrlName ,
2017-01-19 01:45:27 +00:00
'permsWrite' => $perms [ 'write' ]
2016-05-31 00:59:54 +00:00
));
2017-03-18 23:41:43 +00:00
2016-05-31 00:59:54 +00:00
json_return_and_die ( array ( 'historyHTML' => $historyHTML , 'message' => '' , 'success' => true ));
}
2016-06-04 22:00:32 +00:00
// Delete a page
if (( argc () === 4 ) && ( argv ( 2 ) === 'delete' ) && ( argv ( 3 ) === 'page' )) {
2017-01-19 01:45:27 +00:00
2016-06-04 22:00:32 +00:00
$resource_id = $_POST [ 'resource_id' ];
$pageUrlName = $_POST [ 'name' ];
2017-01-19 01:45:27 +00:00
2016-06-04 22:00:32 +00:00
if ( $pageUrlName === 'Home' ) {
2017-01-19 01:45:27 +00:00
json_return_and_die ( array ( 'message' => t ( 'Cannot delete Home' ), 'success' => false ));
2016-06-04 22:00:32 +00:00
}
// Determine if observer has permission to delete pages
2017-01-25 20:21:52 +00:00
// currently just allow page owner
if (( ! local_channel ()) || ( local_channel () != $owner [ 'channel_id' ])) {
logger ( 'Wiki write permission denied. ' . EOL );
json_return_and_die ( array ( 'success' => false ));
}
2016-11-16 02:43:26 +00:00
2017-01-19 01:45:27 +00:00
$perms = Zlib\NativeWiki :: get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
if ( ! $perms [ 'write' ]) {
2016-11-16 02:43:26 +00:00
logger ( 'Wiki write permission denied. ' . EOL );
json_return_and_die ( array ( 'success' => false ));
2016-06-04 22:00:32 +00:00
}
2016-11-16 02:43:26 +00:00
2017-01-19 01:45:27 +00:00
$deleted = Zlib\NativeWikiPage :: delete_page ( array ( 'channel_id' => $owner [ 'channel_id' ], 'observer_hash' => $observer_hash , 'resource_id' => $resource_id , 'pageUrlName' => $pageUrlName ));
2016-06-04 22:00:32 +00:00
if ( $deleted [ 'success' ]) {
2017-01-25 18:41:47 +00:00
Zlib\NativeWiki :: sync_a_wiki_item ( $owner [ 'channel_id' ], $commit [ 'item_id' ], $resource_id );
json_return_and_die ( array ( 'message' => 'Wiki git repo commit made' , 'success' => true ));
2017-01-19 01:45:27 +00:00
}
else {
2016-06-04 22:00:32 +00:00
json_return_and_die ( array ( 'message' => 'Error deleting page' , 'success' => false ));
}
}
2016-06-05 20:32:03 +00:00
// Revert a page
if (( argc () === 4 ) && ( argv ( 2 ) === 'revert' ) && ( argv ( 3 ) === 'page' )) {
2017-01-19 01:45:27 +00:00
2016-06-05 20:32:03 +00:00
$resource_id = $_POST [ 'resource_id' ];
$pageUrlName = $_POST [ 'name' ];
$commitHash = $_POST [ 'commitHash' ];
// Determine if observer has permission to revert pages
2016-11-16 02:43:26 +00:00
2017-01-19 01:45:27 +00:00
$perms = Zlib\NativeWiki :: get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
if ( ! $perms [ 'write' ]) {
2016-11-16 02:43:26 +00:00
logger ( 'Wiki write permission denied.' . EOL );
json_return_and_die ( array ( 'success' => false ));
2016-06-05 20:32:03 +00:00
}
2016-11-16 02:43:26 +00:00
2017-01-19 01:45:27 +00:00
$reverted = Zlib\NativeWikiPage :: revert_page ( array ( 'channel_id' => $owner [ 'channel_id' ], 'observer_hash' => $observer_hash , 'commitHash' => $commitHash , 'resource_id' => $resource_id , 'pageUrlName' => $pageUrlName ));
2016-06-05 20:32:03 +00:00
if ( $reverted [ 'success' ]) {
json_return_and_die ( array ( 'content' => $reverted [ 'content' ], 'message' => '' , 'success' => true ));
} else {
json_return_and_die ( array ( 'content' => '' , 'message' => 'Error reverting page' , 'success' => false ));
}
}
2016-06-17 10:33:39 +00:00
// Compare page revisions
if (( argc () === 4 ) && ( argv ( 2 ) === 'compare' ) && ( argv ( 3 ) === 'page' )) {
$resource_id = $_POST [ 'resource_id' ];
$pageUrlName = $_POST [ 'name' ];
$compareCommit = $_POST [ 'compareCommit' ];
$currentCommit = $_POST [ 'currentCommit' ];
// Determine if observer has permission to revert pages
2016-11-16 02:43:26 +00:00
2017-01-19 01:45:27 +00:00
$perms = Zlib\NativeWiki :: get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
2016-11-16 02:43:26 +00:00
if ( ! $perms [ 'read' ]) {
logger ( 'Wiki read permission denied.' . EOL );
json_return_and_die ( array ( 'success' => false ));
2016-06-17 10:33:39 +00:00
}
2016-11-16 02:43:26 +00:00
2017-01-19 01:45:27 +00:00
$compare = Zlib\NativeWikiPage :: compare_page ( array ( 'channel_id' => $owner [ 'channel_id' ], 'observer_hash' => $observer_hash , 'currentCommit' => $currentCommit , 'compareCommit' => $compareCommit , 'resource_id' => $resource_id , 'pageUrlName' => $pageUrlName ));
2016-06-17 10:33:39 +00:00
if ( $compare [ 'success' ]) {
2017-01-19 01:45:27 +00:00
$diffHTML = '<table class="text-center" width="100%"><tr><td class="lead" width="50%">' . t ( 'Current Revision' ) . '</td><td class="lead" width="50%">' . t ( 'Selected Revision' ) . '</td></tr></table>' . $compare [ 'diff' ];
2016-06-20 17:27:05 +00:00
json_return_and_die ( array ( 'diff' => $diffHTML , 'message' => '' , 'success' => true ));
2016-06-17 10:33:39 +00:00
} else {
json_return_and_die ( array ( 'diff' => '' , 'message' => 'Error comparing page' , 'success' => false ));
}
}
2016-06-15 10:25:31 +00:00
// Rename a page
if (( argc () === 4 ) && ( argv ( 2 ) === 'rename' ) && ( argv ( 3 ) === 'page' )) {
$resource_id = $_POST [ 'resource_id' ];
$pageUrlName = $_POST [ 'oldName' ];
$pageNewName = $_POST [ 'newName' ];
if ( $pageUrlName === 'Home' ) {
json_return_and_die ( array ( 'message' => 'Cannot rename Home' , 'success' => false ));
}
if ( urlencode ( escape_tags ( $pageNewName )) === '' ) {
json_return_and_die ( array ( 'message' => 'Error renaming page. Invalid name.' , 'success' => false ));
}
// Determine if observer has permission to rename pages
2016-11-16 02:43:26 +00:00
2017-01-26 09:46:44 +00:00
$perms = Zlib\NativeWiki :: get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
2017-01-19 01:45:27 +00:00
if ( ! $perms [ 'write' ]) {
2016-11-16 02:43:26 +00:00
logger ( 'Wiki write permission denied. ' . EOL );
json_return_and_die ( array ( 'success' => false ));
2016-06-15 10:25:31 +00:00
}
2016-11-16 02:43:26 +00:00
2017-01-19 01:45:27 +00:00
$renamed = Zlib\NativeWikiPage :: rename_page ( array ( 'channel_id' => $owner [ 'channel_id' ], 'observer_hash' => $observer_hash , 'resource_id' => $resource_id , 'pageUrlName' => $pageUrlName , 'pageNewName' => $pageNewName ));
2017-01-26 09:46:44 +00:00
2016-06-15 10:25:31 +00:00
if ( $renamed [ 'success' ]) {
2017-01-26 09:46:44 +00:00
$commit = Zlib\NativeWikiPage :: commit ( array (
'channel_id' => $owner [ 'channel_id' ],
2017-01-19 01:45:27 +00:00
'commit_msg' => 'Renamed ' . urldecode ( $pageUrlName ) . ' to ' . $renamed [ 'page' ][ 'htmlName' ],
'resource_id' => $resource_id ,
2017-01-26 11:23:59 +00:00
'observer_hash' => $observer_hash ,
2017-01-26 09:46:44 +00:00
'pageUrlName' => $pageNewName
2017-01-19 01:45:27 +00:00
));
2016-06-15 10:25:31 +00:00
if ( $commit [ 'success' ]) {
2017-01-25 04:14:58 +00:00
Zlib\NativeWiki :: sync_a_wiki_item ( $owner [ 'channel_id' ], $commit [ 'item_id' ], $resource_id );
2016-06-15 10:25:31 +00:00
json_return_and_die ( array ( 'name' => $renamed [ 'page' ], 'message' => 'Wiki git repo commit made' , 'success' => true ));
2017-01-19 01:45:27 +00:00
}
else {
2016-06-15 10:25:31 +00:00
json_return_and_die ( array ( 'message' => 'Error making git commit' , 'success' => false ));
}
2017-01-19 01:45:27 +00:00
}
else {
2016-06-15 10:25:31 +00:00
json_return_and_die ( array ( 'message' => 'Error renaming page' , 'success' => false ));
}
}
2016-06-05 20:32:03 +00:00
2016-11-16 02:43:26 +00:00
//notice( t('You must be authenticated.'));
2017-01-19 01:45:27 +00:00
json_return_and_die ( array ( 'message' => t ( 'You must be authenticated.' ), 'success' => false ));
2016-05-21 18:56:42 +00:00
}
}