_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: