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
class Wiki extends \Zotlabs\Web\Controller {
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
if ( ! $nick && local_channel ()) { // if no channel name was provided, assume the current logged in channel
$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
}
}
2016-06-03 02:27:26 +00:00
if ( ! $nick ) {
notice ( t ( 'You must be logged in to see this page.' ) . EOL );
2016-05-24 10:15:42 +00:00
goaway ( '/login' );
2016-05-21 18:56:42 +00:00
}
2016-06-27 05:13:59 +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 );
return ;
}
2016-11-28 14:24:49 +00:00
2016-05-28 00:37:37 +00:00
require_once ( 'include/wiki.php' );
2016-05-21 18:56:42 +00:00
require_once ( 'include/acl_selectors.php' );
2016-06-30 03:59:00 +00:00
require_once ( 'include/conversation.php' );
2016-11-30 14:13:06 +00:00
require_once ( 'include/bbcode.php' );
2016-06-30 03:59:00 +00:00
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, ...)
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
$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
}
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 ;
// Obtain the default permission settings of the channel
2016-11-16 02:43:26 +00:00
$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' ]
2016-06-03 02:27:26 +00:00
);
// Initialize the ACL to the channel default permissions
$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' ]),
'deny_cid' => acl2json ( $owner_acl [ 'deny_cid' ]),
'deny_gid' => acl2json ( $owner_acl [ 'deny_gid' ]),
2016-06-03 02:27:26 +00:00
'bang' => ''
);
} else {
// 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 );
$o = profile_tabs ( $a , $is_owner , \App :: $profile [ 'channel_address' ]);
2016-10-22 12:52:26 +00:00
// Download a wiki
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
2016-11-23 08:41:10 +00:00
$w = wiki_get_wiki ( $resource_id );
2016-11-23 08:47:10 +00:00
if ( ! $w [ 'path' ]) {
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
\Zotlabs\Lib\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
}
2016-06-03 02:27:26 +00:00
switch ( argc ()) {
case 2 :
2016-11-22 10:30:04 +00:00
$wikis = wiki_list ( $owner , get_observer_hash ());
if ( $wikis ) {
$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' ),
'$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 ;
case 3 :
// /wiki/channel/wiki -> No page was specified, so redirect to Home.md
2016-06-04 22:00:32 +00:00
$wikiUrlName = urlencode ( argv ( 2 ));
goaway ( '/' . argv ( 0 ) . '/' . argv ( 1 ) . '/' . $wikiUrlName . '/Home' );
2016-06-03 02:27:26 +00:00
case 4 :
// GET /wiki/channel/wiki/page
// Fetch the wiki info and determine observer permissions
2016-06-04 19:12:04 +00:00
$wikiUrlName = urlencode ( argv ( 2 ));
$pageUrlName = urlencode ( argv ( 3 ));
2016-12-01 10:24:35 +00:00
2016-11-16 02:43:26 +00:00
$w = wiki_exists_by_name ( $owner [ 'channel_id' ], $wikiUrlName );
2016-06-03 02:27:26 +00:00
if ( ! $w [ 'resource_id' ]) {
2016-11-16 02:43:26 +00:00
notice ( t ( 'Wiki not found' ) . EOL );
2016-05-30 00:16:17 +00:00
goaway ( '/' . argv ( 0 ) . '/' . argv ( 1 ));
2016-12-01 10:24:35 +00:00
return ; //not reached
2016-06-03 02:27:26 +00:00
}
$resource_id = $w [ 'resource_id' ];
if ( ! $wiki_owner ) {
// Check for observer permissions
$observer_hash = get_observer_hash ();
2016-11-16 02:43:26 +00:00
$perms = wiki_get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
2016-06-03 02:27:26 +00:00
if ( ! $perms [ 'read' ]) {
2016-11-16 02:43:26 +00:00
notice ( t ( 'Permission denied.' ) . EOL );
2016-06-03 02:27:26 +00:00
goaway ( '/' . argv ( 0 ) . '/' . argv ( 1 ));
2016-12-01 10:24:35 +00:00
return ; //not reached
2016-06-03 02:27:26 +00:00
}
2016-06-08 10:26:27 +00:00
if ( $perms [ 'write' ]) {
$wiki_editor = true ;
} else {
$wiki_editor = false ;
}
} else {
$wiki_editor = true ;
2016-05-30 00:16:17 +00:00
}
2016-06-15 10:25:31 +00:00
$wikiheaderName = urldecode ( $wikiUrlName );
$wikiheaderPage = urldecode ( $pageUrlName );
2016-12-01 10:24:35 +00:00
$renamePage = (( $wikiheaderPage === 'Home' ) ? '' : t ( 'Rename page' ));
2016-06-04 19:12:04 +00:00
$p = wiki_get_page_content ( array ( 'resource_id' => $resource_id , 'pageUrlName' => $pageUrlName ));
2016-06-03 02:27:26 +00:00
if ( ! $p [ 'success' ]) {
2016-11-16 02:43:26 +00:00
notice ( t ( 'Error retrieving page content' ) . EOL );
2016-06-04 22:00:32 +00:00
goaway ( '/' . argv ( 0 ) . '/' . argv ( 1 ) . '/' . $wikiUrlName );
2016-12-01 10:24:35 +00:00
return ; //not reached
2016-06-03 02:27:26 +00:00
}
2016-11-30 12:30:50 +00:00
$mimeType = $p [ 'mimeType' ];
2016-12-01 10:24:35 +00:00
$rawContent = (( $p [ 'mimeType' ] == 'text/bbcode' ) ? htmlspecialchars_decode ( json_decode ( $p [ 'content' ]), ENT_COMPAT ) : htmlspecialchars_decode ( $p [ 'content' ], ENT_COMPAT ));
2016-11-30 12:30:50 +00:00
$content = ( $p [ 'content' ] !== '' ? $rawContent : '"# New page\n"' );
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' ) {
2016-12-04 11:51:23 +00:00
$renderedContent = wiki_convert_links ( bbcode ( $content ), argv ( 0 ) . '/' . argv ( 1 ) . '/' . $wikiUrlName );
2016-11-30 12:30:50 +00:00
}
else {
require_once ( 'library/markdown.php' );
$html = wiki_generate_toc ( zidify_text ( purify_html ( Markdown ( wiki_bbcode ( json_decode ( $content ))))));
$renderedContent = wiki_convert_links ( $html , argv ( 0 ) . '/' . argv ( 1 ) . '/' . $wikiUrlName );
}
2016-06-03 02:27:26 +00:00
$hide_editor = false ;
2016-06-08 10:26:27 +00:00
$showPageControls = $wiki_editor ;
2016-06-03 02:27:26 +00:00
$showNewWikiButton = $wiki_owner ;
2016-06-08 10:26:27 +00:00
$showNewPageButton = $wiki_editor ;
2016-06-04 19:12:04 +00:00
$pageHistory = wiki_page_history ( array ( 'resource_id' => $resource_id , 'pageUrlName' => $pageUrlName ));
2016-06-03 02:27:26 +00:00
break ;
default : // Strip the extraneous URL components
2016-12-01 10:24:35 +00:00
goaway ( '/' . argv ( 0 ) . '/' . argv ( 1 ) . '/' . $wikiUrlName . '/' . $pageUrlName );
return ; //not reached
2016-05-22 01:55:09 +00:00
}
2016-05-28 18:11:36 +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' ),
'$ok' => t ( 'Revert' ),
'$cancel' => t ( 'Cancel' )
));
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-11-19 03:10:55 +00:00
'$hideEditor' => $hide_editor , // True will completely hide the content section and is used for the case of no wiki selected
'$chooseWikiMessage' => t ( 'Choose an available wiki from the list on the left.' ),
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' ,
2016-05-30 18:59:33 +00:00
'$showNewWikiButton' => $showNewWikiButton ,
2016-06-03 02:27:26 +00:00
'$showNewPageButton' => $showNewPageButton ,
2016-11-16 02:43:26 +00:00
'$channel' => $owner [ 'channel_address' ],
2016-05-28 02:19:05 +00:00
'$resource_id' => $resource_id ,
2016-06-04 19:12:04 +00:00
'$page' => $pageUrlName ,
2016-05-21 18:56:42 +00:00
'$lockstate' => $x [ 'lockstate' ],
'$acl' => $x [ 'acl' ],
2016-08-04 10:09:06 +00:00
'$allow_cid' => $x [ 'allow_cid' ],
'$allow_gid' => $x [ 'allow_gid' ],
'$deny_cid' => $x [ 'deny_cid' ],
'$deny_gid' => $x [ 'deny_gid' ],
2016-05-21 18:56:42 +00:00
'$bang' => $x [ 'bang' ],
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' ), '' , '' ),
2016-11-23 12:38:27 +00:00
'$commitMsg' => array ( 'commitMsg' , '' , '' , '' , '' , 'placeholder="Short description of your changes (optional)"' ),
2016-06-17 10:33:39 +00:00
'$pageHistory' => $pageHistory [ 'history' ],
'$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' ),
'$modaldiffalbum' => t ( 'Choose a different album...' ),
'$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' )
head_add_js ( 'library/ace/ace.js' ); // Ace Code Editor
2016-05-21 18:56:42 +00:00
return $o ;
}
function post () {
2016-05-21 23:02:23 +00:00
require_once ( 'include/wiki.php' );
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-21 18:56:42 +00:00
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' ];
2016-06-25 19:29:52 +00:00
$w = wiki_get_wiki ( $resource_id );
$wikiURL = argv ( 0 ) . '/' . argv ( 1 ) . '/' . $w [ 'urlName' ];
2016-11-30 12:30:50 +00:00
$mimeType = $w [ 'mimeType' ];
if ( $mimeType == 'text/bbcode' ) {
2016-12-04 11:51:23 +00:00
$html = wiki_convert_links ( bbcode ( $content ), $wikiURL );
2016-11-30 12:30:50 +00:00
}
else {
require_once ( 'library/markdown.php' );
$content = wiki_bbcode ( $content );
$html = wiki_generate_toc ( zidify_text ( purify_html ( Markdown ( $content ))));
$html = wiki_convert_links ( $html , $wikiURL );
}
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
2016-06-25 11:27:14 +00:00
$wiki [ 'postVisible' ] = (( intval ( $_POST [ 'postVisible' ]) === 0 ) ? 0 : 1 );
2016-06-04 10:26:41 +00:00
$wiki [ 'rawName' ] = $_POST [ 'wikiName' ];
$wiki [ 'htmlName' ] = escape_tags ( $_POST [ 'wikiName' ]);
2016-06-04 19:12:04 +00:00
$wiki [ 'urlName' ] = urlencode ( $_POST [ 'wikiName' ]);
2016-11-28 14:24:49 +00:00
$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' );
}
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 );
2016-11-16 02:43:26 +00:00
$r = wiki_create_wiki ( $owner , $observer_hash , $wiki , $acl );
2016-05-21 18:56:42 +00:00
if ( $r [ 'success' ]) {
2016-06-04 10:26:41 +00:00
$homePage = wiki_create_page ( 'Home' , $r [ 'item' ][ 'resource_id' ]);
2016-05-29 17:33:52 +00:00
if ( ! $homePage [ 'success' ]) {
2016-11-16 02:43:26 +00:00
notice ( t ( 'Wiki created, but error creating Home page.' ));
2016-06-04 10:26:41 +00:00
goaway ( '/wiki/' . $nick . '/' . $wiki [ 'urlName' ]);
2016-05-29 17:33:52 +00:00
}
2016-06-04 19:12:04 +00:00
goaway ( '/wiki/' . $nick . '/' . $wiki [ 'urlName' ] . '/' . $homePage [ 'page' ][ 'urlName' ]);
2016-05-21 18:56:42 +00:00
} else {
2016-11-16 02:43:26 +00:00
notice ( t ( 'Error creating wiki' ));
2016-05-21 23:02:23 +00:00
goaway ( '/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.' );
2016-06-08 10:26:27 +00:00
json_return_and_die ( array ( 'message' => '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' ];
$deleted = wiki_delete_wiki ( $resource_id );
if ( $deleted [ 'success' ]) {
2016-06-08 10:26:27 +00:00
json_return_and_die ( array ( 'message' => '' , 'success' => true ));
2016-05-24 10:15:42 +00:00
} else {
logger ( 'Error deleting wiki: ' . $resource_id );
2016-06-08 10:26:27 +00:00
json_return_and_die ( array ( 'message' => '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
$perms = wiki_get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
if ( ! $perms [ 'write' ]) {
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
2016-06-04 19:12:04 +00:00
$name = $_POST [ 'name' ]; //Get new page name
if ( urlencode ( escape_tags ( $_POST [ 'name' ])) === '' ) {
2016-05-28 02:19:05 +00:00
json_return_and_die ( array ( 'message' => 'Error creating page. Invalid name.' , 'success' => false ));
}
2016-06-04 19:12:04 +00:00
$page = wiki_create_page ( $name , $resource_id );
2016-05-28 02:19:05 +00:00
if ( $page [ 'success' ]) {
2016-11-24 23:24:15 +00:00
$ob = \App :: get_observer ();
$commit = wiki_git_commit ( array (
'commit_msg' => t ( 'New page created' ),
'resource_id' => $resource_id ,
'observer' => $ob ,
2016-11-29 09:33:46 +00:00
'files' => array ( $page [ 'page' ][ 'fileName' ])
2016-11-24 23:24:15 +00:00
));
if ( $commit [ 'success' ]) {
2016-11-28 10:54:36 +00:00
json_return_and_die ( array ( 'url' => '/' . argv ( 0 ) . '/' . argv ( 1 ) . '/' . $page [ 'wiki' ][ 'urlName' ] . '/' . $page [ 'page' ][ 'urlName' ], 'success' => true ));
2016-11-24 23:24:15 +00:00
} else {
json_return_and_die ( array ( 'message' => 'Error making git commit' , 'url' => '/' . argv ( 0 ) . '/' . argv ( 1 ) . '/' . $page [ 'wiki' ][ 'urlName' ] . '/' . urlencode ( $page [ 'page' ][ 'urlName' ]), 'success' => false ));
}
2016-05-28 02:19:05 +00:00
} else {
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
if (( argc () === 5 ) && ( argv ( 2 ) === 'get' ) && ( argv ( 3 ) === 'page' ) && ( argv ( 4 ) === 'list' )) {
$resource_id = $_POST [ 'resource_id' ]; // resource_id for wiki in db
2016-11-16 02:43:26 +00:00
$perms = wiki_get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
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
2016-05-28 11:42:18 +00:00
$page_list_html = widget_wiki_pages ( array (
'resource_id' => $resource_id ,
'refresh' => true ,
'channel' => argv ( 1 )));
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
2016-11-16 02:43:26 +00:00
$perms = wiki_get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
if ( ! $perms [ 'write' ]) {
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
2016-06-04 19:12:04 +00:00
$saved = wiki_save_page ( array ( 'resource_id' => $resource_id , 'pageUrlName' => $pageUrlName , 'content' => $content ));
2016-05-28 19:11:19 +00:00
if ( $saved [ 'success' ]) {
2016-05-29 14:18:26 +00:00
$ob = \App :: get_observer ();
$commit = wiki_git_commit ( array (
2016-06-06 00:30:45 +00:00
'commit_msg' => $commitMsg ,
2016-05-29 14:18:26 +00:00
'resource_id' => $resource_id ,
'observer' => $ob ,
2016-11-29 09:33:46 +00:00
'files' => array ( $saved [ 'fileName' ])
2016-05-29 14:18:26 +00:00
));
if ( $commit [ 'success' ]) {
json_return_and_die ( array ( 'message' => 'Wiki git repo commit made' , 'success' => true ));
} else {
json_return_and_die ( array ( 'message' => 'Error making git commit' , 'success' => false ));
}
2016-05-28 19:11:19 +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
2016-11-16 02:43:26 +00:00
2016-06-08 10:26:27 +00:00
// Determine if observer has permission to read content
2016-11-16 02:43:26 +00:00
$perms = wiki_get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
if ( ! $perms [ 'read' ]) {
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
2016-05-31 00:59:54 +00:00
$historyHTML = widget_wiki_page_history ( array (
'resource_id' => $resource_id ,
2016-06-04 19:12:04 +00:00
'pageUrlName' => $pageUrlName
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' )) {
$resource_id = $_POST [ 'resource_id' ];
$pageUrlName = $_POST [ 'name' ];
if ( $pageUrlName === 'Home' ) {
json_return_and_die ( array ( 'message' => 'Cannot delete Home' , 'success' => false ));
}
// Determine if observer has permission to delete pages
2016-11-16 02:43:26 +00:00
$perms = wiki_get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
if ( ! $perms [ 'write' ]) {
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
2016-06-04 22:00:32 +00:00
$deleted = wiki_delete_page ( array ( 'resource_id' => $resource_id , 'pageUrlName' => $pageUrlName ));
if ( $deleted [ 'success' ]) {
$ob = \App :: get_observer ();
$commit = wiki_git_commit ( array (
2016-06-15 10:25:31 +00:00
'commit_msg' => 'Deleted ' . $pageUrlName ,
2016-06-04 22:00:32 +00:00
'resource_id' => $resource_id ,
'observer' => $ob ,
'files' => null
));
if ( $commit [ 'success' ]) {
json_return_and_die ( array ( 'message' => 'Wiki git repo commit made' , 'success' => true ));
} else {
json_return_and_die ( array ( 'message' => 'Error making git commit' , 'success' => false ));
}
} else {
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' )) {
$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
$perms = wiki_get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
if ( ! $perms [ 'write' ]) {
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
2016-06-17 10:33:39 +00:00
$reverted = wiki_revert_page ( array ( '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
$perms = wiki_get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
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
2016-06-17 10:33:39 +00:00
$compare = wiki_compare_page ( array ( 'currentCommit' => $currentCommit , 'compareCommit' => $compareCommit , 'resource_id' => $resource_id , 'pageUrlName' => $pageUrlName ));
if ( $compare [ 'success' ]) {
2016-06-20 17:27:05 +00:00
$diffHTML = '<table class="text-center" width="100%"><tr><td class="lead" width="50%">Current Revision</td><td class="lead" width="50%">Selected Revision</td></tr></table>' . $compare [ 'diff' ];
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
$perms = wiki_get_permissions ( $resource_id , intval ( $owner [ 'channel_id' ]), $observer_hash );
if ( ! $perms [ 'write' ]) {
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
2016-06-15 10:25:31 +00:00
$renamed = wiki_rename_page ( array ( 'resource_id' => $resource_id , 'pageUrlName' => $pageUrlName , 'pageNewName' => $pageNewName ));
if ( $renamed [ 'success' ]) {
$ob = \App :: get_observer ();
$commit = wiki_git_commit ( array (
'commit_msg' => 'Renamed ' . urldecode ( $pageUrlName ) . ' to ' . $renamed [ 'page' ][ 'htmlName' ],
'resource_id' => $resource_id ,
'observer' => $ob ,
2016-11-29 09:33:46 +00:00
'files' => array ( $pageUrlName . substr ( $renamed [ 'page' ][ 'fileName' ], - 3 ), $renamed [ 'page' ][ 'fileName' ]),
2016-06-15 10:25:31 +00:00
'all' => true
));
if ( $commit [ 'success' ]) {
json_return_and_die ( array ( 'name' => $renamed [ 'page' ], 'message' => 'Wiki git repo commit made' , 'success' => true ));
} else {
json_return_and_die ( array ( 'message' => 'Error making git commit' , 'success' => false ));
}
} else {
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.'));
2016-05-28 11:17:42 +00:00
json_return_and_die ( array ( 'message' => 'You must be authenticated.' , 'success' => false ));
2016-05-21 18:56:42 +00:00
}
}