_user object for
* mayAccessPage
* enable native pecl extension (xml-rpc or soap)
* serverurl:
* Installer helper which changes server url of the default PhpWiki.wdsl
* Or do it dynamically in the soap class? No, the client must connect to us.
*
* @author: Reini Urban
*/
define ("WIKI_SOAP", true);
include_once './index.php';
include_once 'lib/main.php';
if (!loadExtension('soap'))
require_once 'lib/nusoap/nusoap.php';
/*
// bypass auth and request loop for now.
// require_once('lib/prepend.php');
include_once 'index.php';
//require_once('lib/stdlib.php');
require_once 'lib/WikiDB.php';
require_once 'lib/config.php';
class WikiRequest extends Request {}
$request = new WikiRequest();
require_once 'lib/PagePerm.php';
require_once 'lib/WikiUserNew.php';
require_once 'lib/WikiGroup.php';
*/
function checkCredentials(&$server, &$credentials, $access, $pagename) {
// check the "Authorization: Basic '.base64_encode("$this->username:$this->password").'\r\n'" header
if (isset($server->header['Authorization'])) {
$line = base64_decode(str_replace("Basic ","",trim($server->header['Authorization'])));
list($credentials['username'],$credentials['password']) = explode(':',$line);
} else {
if (!isset($_SERVER))
$_SERVER =& $GLOBALS['HTTP_SERVER_VARS'];
// TODO: where in the header is the client IP
if (!isset($credentials['username'])) {
if (isset($_SERVER['REMOTE_ADDR']))
$credentials['username'] = $_SERVER['REMOTE_ADDR'];
elseif (isset($GLOBALS['REMOTE_ADDR']))
$credentials['username'] = $GLOBALS['REMOTE_ADDR'];
else
$credentials['username'] = $server->host;
}
}
if (!isset($credentials['password'])) $credentials['password'] = '';
global $request;
if (ENABLE_USER_NEW) {
$request->_user = WikiUser($credentials['username']);
} else {
$request->_user = new WikiUser($request, $credentials['username']);
}
$request->_user->AuthCheck(array('userid' => $credentials['username'],
'passwd' => $credentials['password']));
if (! mayAccessPage ($access, $pagename))
$server->fault(401,'',"no permission");
}
$GLOBALS['SERVER_NAME'] = SERVER_URL;
$GLOBALS['SCRIPT_NAME'] = DATA_PATH . "/SOAP.php";
$url = SERVER_URL . DATA_PATH . "/SOAP.php";
// Local or external wdsl support is experimental.
// It works without also. Just the client has to
// know the wdsl definitions.
$server = new soap_server(/* 'PhpWiki.wdsl' */);
// Now change the server url to ours, because in the wdsl is the original PhpWiki address
//
//
$server->ports[$server->currentPort]['location'] = $url;
$server->bindings[ $server->ports[$server->currentPort]['binding'] ]['endpoint'] = $url;
$server->soapaction = $url; // soap_transport_http
$actions = array('getPageContent','getPageRevision','getCurrentRevision',
'getPageMeta','doSavePage','getAllPagenames',
'getBackLinks','doTitleSearch','doFullTextSearch',
'getRecentChanges','listLinks','listPlugins',
'getPluginSynopsis','callPlugin','listRelations',
'linkSearch'
);
foreach ($actions as $action) {
$server->register($actions);
$server->operations[$actions]['soapaction'] = $url;
}
//todo: check and set credentials
// requiredAuthorityForPage($action);
// require 'edit' access
function doSavePage($pagename,$content,$credentials=false) {
global $server;
checkCredentials($server, $credentials,'edit',$pagename);
$dbi = WikiDB::open($GLOBALS['DBParams']);
$page = $dbi->getPage($pagename);
$current = $page->getCurrentRevision();
$meta = $current->_data;
$meta['summary'] = sprintf(_("SOAP Request %s", $credentials['username'])); // from user or IP ?
$version = $current->getVersion();
return $page->save($content, $version + 1, $meta);
}
// require 'view' access
function getPageContent($pagename,$credentials=false) {
global $server;
checkCredentials($server,$credentials,'view',$pagename);
$dbi = WikiDB::open($GLOBALS['DBParams']);
$page = $dbi->getPage($pagename);
$rev = $page->getCurrentRevision();
$text = $rev->getPackedContent();
return $text;
}
// require 'view' access
function getPageRevision($pagename,$revision,$credentials=false) {
global $server;
checkCredentials($server,$credentials,'view',$pagename);
$dbi = WikiDB::open($GLOBALS['DBParams']);
$page = $dbi->getPage($pagename);
$rev = $page->getCurrentRevision();
$text = $rev->getPackedContent();
return $text;
}
// require 'view' access
function getCurrentRevision($pagename,$credentials=false) {
global $server;
checkCredentials($server,$credentials,'view',$pagename);
if (!mayAccessPage ('view',$pagename))
$server->fault(401,'',"no permission");
$dbi = WikiDB::open($GLOBALS['DBParams']);
$page = $dbi->getPage($pagename);
$rev = $page->getCurrentRevision();
$version = $current->getVersion();
return (double)$version;
}
// require 'change' or 'view' access ?
function getPageMeta($pagename,$credentials=false) {
global $server;
checkCredentials($server,$credentials,'view',$pagename);
$dbi = WikiDB::open($GLOBALS['DBParams']);
$page = $dbi->getPage($pagename);
$rev = $page->getCurrentRevision();
$meta = $rev->_data;
//todo: reformat the meta hash
return $meta;
}
// require 'view' access to AllPages
function getAllPagenames($credentials=false) {
global $server;
checkCredentials($server,$credentials,'view',_("AllPages"));
$dbi = WikiDB::open($GLOBALS['DBParams']);
$page_iter = $dbi->getAllPages();
$pages = array();
while ($page = $page_iter->next()) {
$pages[] = array('pagename' => $page->_pagename);
}
return $pages;
}
// require 'view' access
function getBacklinks($pagename,$credentials=false) {
global $server;
checkCredentials($server,$credentials,'view',$pagename);
$dbi = WikiDB::open($GLOBALS['DBParams']);
$backend = &$dbi->_backend;
$result = $backend->get_links($pagename);
$page_iter = new WikiDB_PageIterator($dbi, $result);
$pages = array();
while ($page = $page_iter->next()) {
$pages[] = array('pagename' => $page->getName());
}
return $pages;
}
// require 'view' access to TitleSearch
function doTitleSearch($s, $credentials=false) {
global $server;
checkCredentials($server,$credentials,'view',_("TitleSearch"));
$dbi = WikiDB::open($GLOBALS['DBParams']);
$query = new TextSearchQuery($s);
$page_iter = $dbi->titleSearch($query);
$pages = array();
while ($page = $page_iter->next()) {
$pages[] = array('pagename' => $page->getName());
}
return $pages;
}
// require 'view' access to FullTextSearch
function doFullTextSearch($s, $credentials=false) {
global $server;
checkCredentials($server,$credentials,'view',_("FullTextSearch"));
$dbi = WikiDB::open($GLOBALS['DBParams']);
$query = new TextSearchQuery($s);
$page_iter = $dbi->fullSearch($query);
$pages = array();
while ($page = $page_iter->next()) {
$pages[] = array('pagename' => $page->getName());
}
return $pages;
}
// require 'view' access to RecentChanges
function getRecentChanges($limit=false, $since=false, $include_minor=false, $credentials=false) {
global $server;
checkCredentials($server,$credentials,'view',_("RecentChanges"));
$dbi = WikiDB::open($GLOBALS['DBParams']);
$params = array('limit' => $limit, 'since' => $since,
'include_minor_revisions' => $include_minor);
$page_iter = $dbi->mostRecent($params);
$pages = array();
while ($page = $page_iter->next()) {
$pages[] = array('pagename' => $page->getName(),
'lastModified' => $page->get('mtime'),
'author' => $page->get('author'),
'summary' => $page->get('summary'), // added with 1.3.13
'version' => $page->getVersion()
);
}
return $pages;
}
// require 'view' access
function listLinks($pagename, $credentials=false) {
global $server;
checkCredentials($server,$credentials,'view',$pagename);
$dbi = WikiDB::open($GLOBALS['DBParams']);
$page = $dbi->getPage($pagename);
$linkiterator = $page->getPageLinks();
$links = array();
while ($currentpage = $linkiterator->next()) {
if ($currentpage->exists())
$links[] = array('pagename' => $currentpage->getName());
}
return $links;
}
function listPlugins($credentials=false) {
global $server;
checkCredentials($server,$credentials,'change',_("HomePage"));
$plugin_dir = 'lib/plugin';
if (defined('PHPWIKI_DIR'))
$plugin_dir = PHPWIKI_DIR . "/$plugin_dir";
$pd = new fileSet($plugin_dir, '*.php');
$plugins = $pd->getFiles();
unset($pd);
sort($plugins);
$RetArray = array();
if (!empty($plugins)) {
require_once 'lib/WikiPlugin.php';
$w = new WikiPluginLoader;
foreach ($plugins as $plugin) {
$pluginName = str_replace(".php", "", $plugin);
$p = $w->getPlugin($pluginName, false); // second arg?
// trap php files which aren't WikiPlugin~s: wikiplugin + wikiplugin_cached only
if (strtolower(substr(get_parent_class($p), 0, 10)) == 'wikiplugin') {
$RetArray[] = $pluginName;
}
}
}
return $RetArray;
}
function getPluginSynopsis($pluginname, $credentials=false) {
global $server;
checkCredentials($server,$credentials,'change',"Help/".$pluginname."Plugin");
require_once 'lib/WikiPlugin.php';
$w = new WikiPluginLoader;
$synopsis = '';
$p = $w->getPlugin($pluginName, false); // second arg?
// trap php files which aren't WikiPlugin~s: wikiplugin + wikiplugin_cached only
if (strtolower(substr(get_parent_class($p), 0, 10)) == 'wikiplugin') {
$plugin_args = '';
$desc = $p->getArgumentsDescription();
$src = array("\n",'"',"'",'|','[',']','\\');
$replace = array('%0A','%22','%27','%7C','%5B','%5D','%5C');
$desc = str_replace("
",' ',$desc->asXML());
if ($desc)
$plugin_args = '\n'.str_replace($src, $replace, $desc);
$synopsis = ""; // args?
}
return $synopsis;
}
// only plugins returning pagelists will return something useful. so omit the html output
function callPlugin($pluginname, $pluginargs, $credentials=false) {
global $server;
checkCredentials($server,$credentials,'change',"Help/".$pluginname."Plugin");
$basepage = '';;
require_once 'lib/WikiPlugin.php';
$w = new WikiPluginLoader;
$p = $w->getPlugin($pluginName, false); // second arg?
$pagelist = $p->run($dbi, $pluginargs, $request, $basepage);
$pages = array();
if (is_object($pagelist) and isa($pagelist, 'PageList')) {
foreach ($pagelist->pageNames() as $name)
$pages[] = array('pagename' => $name);
}
return $pages;
}
/**
* array listRelations([ Integer option = 1 ])
*
* Returns an array of all available relation names.
* option: 1 relations only ( with 0 also )
* option: 2 attributes only
* option: 3 both, all names of relations and attributes
* option: 4 unsorted, this might be added as bitvalue: 7 = 4+3. default: sorted
* For some semanticweb autofill methods.
*
* @author: Reini Urban
*/
function listRelations($option = 1, $credentials=false) {
global $server;
checkCredentials($server,$credentials,'view',_("HomePage"));
$also_attributes = $option & 2;
$only_attributes = $option & 2 and !($option & 1);
$sorted = !($option & 4);
return $dbh->listRelations($also_attributes,
$only_attributes,
$sorted);
}
// some basic semantic search
function linkSearch($linktype, $search, $pages="*", $relation="*", $credentials=false) {
global $server;
checkCredentials($server,$credentials,'view',_("HomePage"));
$dbi = WikiDB::open($GLOBALS['DBParams']);
require_once 'lib/TextSearchQuery.php';
$pagequery = new TextSearchQuery($pages);
$linkquery = new TextSearchQuery($search);
if ($linktype == 'relation') {
$relquery = new TextSearchQuery($relation);
$links = $dbi->_backend->link_search($pagequery, $linkquery, $linktype, $relquery);
} elseif ($linktype == 'attribute') { // only numeric search withh attributes!
$relquery = new TextSearchQuery($relation);
require_once 'lib/SemanticWeb.php';
// search: "population > 1 million and area < 200 km^2" relation="*" pages="*"
$linkquery = new SemanticAttributeSearchQuery($search, $relation);
$links = $dbi->_backend->link_search($pagequery, $linkquery, $linktype, $relquery);
} else {
// we already do have forward and backlinks as SOAP
$links = $dbi->_backend->link_search($pagequery, $linkquery, $linktype);
}
return $links->asArray();
}
$server->service($GLOBALS['HTTP_RAW_POST_DATA']);
// Local Variables:
// mode: php
// tab-width: 8
// c-basic-offset: 4
// c-hanging-comment-ender-p: nil
// indent-tabs-mode: nil
// End: