Example #1
0
/**
 * Forward an xmlrpc request to another server, and return to client the response received.
 * @param xmlrpcmsg $m (see method docs below for a description of the expected parameters)
 * @return xmlrpcresp
 */
function forward_request($m)
{
    // create client
    $timeout = 0;
    $url = php_xmlrpc_decode($m->getParam(0));
    $c = new xmlrpc_client($url);
    if ($m->getNumParams() > 3) {
        // we have to set some options onto the client.
        // Note that if we do not untaint the received values, warnings might be generated...
        $options = php_xmlrpc_decode($m->getParam(3));
        foreach ($options as $key => $val) {
            switch ($key) {
                case 'Cookie':
                    break;
                case 'Credentials':
                    break;
                case 'RequestCompression':
                    $c->setRequestCompression($val);
                    break;
                case 'SSLVerifyHost':
                    $c->setSSLVerifyHost($val);
                    break;
                case 'SSLVerifyPeer':
                    $c->setSSLVerifyPeer($val);
                    break;
                case 'Timeout':
                    $timeout = (int) $val;
                    break;
            }
            // switch
        }
    }
    // build call for remote server
    /// @todo find a weay to forward client info (such as IP) to server, either
    /// - as xml comments in the payload, or
    /// - using std http header conventions, such as X-forwarded-for...
    $method = php_xmlrpc_decode($m->getParam(1));
    $pars = $m->getParam(2);
    $m = new xmlrpcmsg($method);
    for ($i = 0; $i < $pars->arraySize(); $i++) {
        $m->addParam($pars->arraymem($i));
    }
    // add debug info into response we give back to caller
    xmlrpc_debugmsg("Sending to server {$url} the payload: " . $m->serialize());
    return $c->send($m, $timeout);
}
Example #2
0
function agesorter($m)
{
    global $agesorter_arr, $xmlrpcerruser, $s;
    xmlrpc_debugmsg("Entering 'agesorter'");
    // get the parameter
    $sno = $m->getParam(0);
    // error string for [if|when] things go wrong
    $err = "";
    // create the output value
    $v = new xmlrpcval();
    $agar = array();
    if (isset($sno) && $sno->kindOf() == "array") {
        $max = $sno->arraysize();
        // TODO: create debug method to print can work once more
        // print "<!-- found $max array elements -->\n";
        for ($i = 0; $i < $max; $i++) {
            $rec = $sno->arraymem($i);
            if ($rec->kindOf() != "struct") {
                $err = "Found non-struct in array at element {$i}";
                break;
            }
            // extract name and age from struct
            $n = $rec->structmem("name");
            $a = $rec->structmem("age");
            // $n and $a are xmlrpcvals,
            // so get the scalarval from them
            $agar[$n->scalarval()] = $a->scalarval();
        }
        $agesorter_arr = $agar;
        // hack, must make global as uksort() won't
        // allow us to pass any other auxilliary information
        uksort($agesorter_arr, agesorter_compare);
        $outAr = array();
        while (list($key, $val) = each($agesorter_arr)) {
            // recreate each struct element
            $outAr[] = new xmlrpcval(array("name" => new xmlrpcval($key), "age" => new xmlrpcval($val, "int")), "struct");
        }
        // add this array to the output value
        $v->addArray($outAr);
    } else {
        $err = "Must be one parameter, an array of structs";
    }
    if ($err) {
        return new xmlrpcresp(0, $xmlrpcerruser, $err);
    } else {
        return new xmlrpcresp($v);
    }
}
Example #3
0
/**
 * Helper for {@link b2_getcategories()} and {@link mt_getPostCategories()}, because they differ
 * only in the "categoryId" case ("categoryId" (b2) vs "categoryID" (MT))
 *
 * @param string Type, either "b2" or "mt"
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (string): Unique identifier of the blog to query
 *					1 username (string): Login for a Blogger user who is member of the blog.
 *					2 password (string): Password for said username.
 * @return xmlrpcresp XML-RPC Response
 */
function _b2_or_mt_get_categories($type, $m)
{
    global $xmlrpcerruser, $DB;
    // CHECK LOGIN:
    /**
     * @var User
     */
    if (!($current_User =& xmlrpcs_login($m, 1, 2))) {
        // Login failed, return (last) error:
        return xmlrpcs_resperror();
    }
    // GET BLOG:
    /**
     * @var Blog
     */
    if (!($Blog =& xmlrpcs_get_Blog($m, 0))) {
        // Login failed, return (last) error:
        return xmlrpcs_resperror();
    }
    // CHECK PERMISSION: (we need at least one post/edit status)
    if (!$current_User->check_perm('blog_post_statuses', 1, false, $Blog->ID)) {
        // Permission denied
        return xmlrpcs_resperror(3);
        // User error 3
    }
    logIO('Permission granted.');
    $sql = 'SELECT *
					  FROM T_categories ';
    $BlogCache =& get_Cache('BlogCache');
    $current_Blog = $BlogCache->get_by_ID($Blog->ID);
    $aggregate_coll_IDs = $current_Blog->get_setting('aggregate_coll_IDs');
    if (empty($aggregate_coll_IDs)) {
        // We only want posts from the current blog:
        $sql .= 'WHERE cat_blog_ID =' . $current_Blog->ID;
    } else {
        // We are aggregating posts from several blogs:
        $sql .= 'WHERE cat_blog_ID IN (' . $aggregate_coll_IDs . ')';
    }
    $sql .= " ORDER BY cat_name ASC";
    $rows = $DB->get_results($sql);
    if ($DB->error) {
        // DB error
        return new xmlrpcresp(0, $xmlrpcerruser + 9, 'DB error: ' . $DB->last_error);
        // user error 9
    }
    xmlrpc_debugmsg('Categories:' . count($rows));
    $categoryIdName = $type == 'b2' ? 'categoryID' : 'categoryId';
    $data = array();
    foreach ($rows as $row) {
        $data[] = new xmlrpcval(array($categoryIdName => new xmlrpcval($row->cat_ID), 'categoryName' => new xmlrpcval($row->cat_name)), 'struct');
    }
    logIO('OK.');
    return new xmlrpcresp(new xmlrpcval($data, "array"));
}
Example #4
0
/**
 * metaWeblog.getRecentPosts
 *
 * @see http://www.xmlrpc.com/metaWeblogApi#metawebloggetrecentposts
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 blogid (string): Unique identifier of the blog the post will be added to.
 *						Currently ignored in b2evo, in favor of the category.
 *					1 username (string): Login for a Blogger user who has permission to edit the given
 *						post (either the user who originally created it or an admin of the blog).
 *					2 password (string): Password for said username.
 */
function mw_getrecentposts($m)
{
    global $xmlrpcerruser, $DB;
    // CHECK LOGIN:
    /**
     * @var User
     */
    if (!($current_User =& xmlrpcs_login($m, 1, 2))) {
        // Login failed, return (last) error:
        return xmlrpcs_resperror();
    }
    // GET BLOG:
    /**
     * @var Blog
     */
    if (!($Blog =& xmlrpcs_get_Blog($m, 0))) {
        // Login failed, return (last) error:
        return xmlrpcs_resperror();
    }
    // CHECK PERMISSION: (we need at least one post/edit status)
    if (!$current_User->check_perm('blog_post_statuses', 1, false, $Blog->ID)) {
        // Permission denied
        return xmlrpcs_resperror(3);
        // User error 3
    }
    logIO('Permission granted.');
    $numposts = $m->getParam(3);
    $numposts = $numposts->scalarval();
    logIO("In mw_getrecentposts, current numposts is ..." . $numposts);
    // Get the posts to display:
    load_class('items/model/_itemlist.class.php');
    $MainList =& new ItemList2($Blog, NULL, NULL, $numposts);
    $MainList->set_filters(array('visibility_array' => array('published', 'protected', 'private', 'draft', 'deprecated', 'redirected'), 'order' => 'DESC', 'unit' => 'posts'));
    // Run the query:
    $MainList->query();
    xmlrpc_debugmsg('Items:' . $MainList->result_num_rows);
    $data = array();
    /**
     * @var Item
     */
    while ($Item =& $MainList->get_item()) {
        xmlrpc_debugmsg('Item:' . $Item->title . ' - Issued: ' . $Item->issue_date . ' - Modified: ' . $Item->mod_date);
        $post_date = mysql2date("U", $Item->issue_date);
        $post_date = gmdate("Ymd", $post_date) . "T" . gmdate("H:i:s", $post_date);
        $content = $Item->content;
        $content = str_replace("\n", '', $content);
        // Tor - kludge to fix bug in xmlrpc libraries
        // Load Item's creator User:
        $Item->get_creator_User();
        $authorname = $Item->creator_User->get('preferredname');
        // need a loop here to extract all categoy names
        // $extra_cat_IDs is the variable for the rest of the IDs
        $hope_cat_name = get_the_category_by_ID($Item->main_cat_ID);
        $test = $Item->extra_cat_IDs[0];
        xmlrpc_debugmsg('postcats:' . $hope_cat_name["cat_name"]);
        xmlrpc_debugmsg('test:' . $test);
        $data[] = new xmlrpcval(array("dateCreated" => new xmlrpcval($post_date, "dateTime.iso8601"), "userid" => new xmlrpcval($Item->creator_user_ID), "postid" => new xmlrpcval($Item->ID), "categories" => new xmlrpcval(array(new xmlrpcval($hope_cat_name["cat_name"])), 'array'), "title" => new xmlrpcval($Item->title), "description" => new xmlrpcval($content), "link" => new xmlrpcval($Item->url), 'publish' => new xmlrpcval($Item->status == 'published', 'boolean')), "struct");
    }
    $resp = new xmlrpcval($data, "array");
    logIO('OK.');
    return new xmlrpcresp($resp);
}
Example #5
0
 function _errorHandler($e)
 {
     $msg = htmlspecialchars($e->asString());
     // '--' not allowed within xml comment
     $msg = str_replace('--', '&#45;&#45;', $msg);
     if (function_exists('xmlrpc_debugmsg')) {
         xmlrpc_debugmsg($msg);
     }
     return true;
 }
Example #6
0
/**
 * blogger.getRecentPosts retieves X most recent posts.
 *
 * This API call is not documented on
 * {@link http://www.blogger.com/developers/api/1_docs/}
 * @see http://www.sixapart.com/developers/xmlrpc/blogger_api/bloggergetrecentposts.html
 *
 * @param xmlrpcmsg XML-RPC Message
 *					0 appkey (string): Unique identifier/passcode of the application sending the post.
 *						(See access info {@link http://www.blogger.com/developers/api/1_docs/#access} .)
 *					1 blogid (string): Unique identifier of the blog the post will be added to.
 *						Currently ignored in b2evo, in favor of the category.
 *					2 username (string): Login for a Blogger user who has permission to edit the given
 *						post (either the user who originally created it or an admin of the blog).
 *					3 password (string): Password for said username.
 *					4 numposts (integer): number of posts to retrieve.
 * @return xmlrpcresp XML-RPC Response
 */
function blogger_getrecentposts($m)
{
    global $xmlrpcerruser, $DB;
    // CHECK LOGIN:
    /**
     * @var User
     */
    if (!($current_User =& xmlrpcs_login($m, 2, 3))) {
        // Login failed, return (last) error:
        return xmlrpcs_resperror();
    }
    // GET BLOG:
    /**
     * @var Blog
     */
    if (!($Blog =& xmlrpcs_get_Blog($m, 1))) {
        // Login failed, return (last) error:
        return xmlrpcs_resperror();
    }
    // CHECK PERMISSION: (we need at least one post/edit status)
    // (we should be able to see all even if we cannot edit the particular status of a post)
    if (!$current_User->check_perm('blog_post_statuses', 1, false, $Blog->ID)) {
        // Permission denied
        return xmlrpcs_resperror(3);
        // User error 3
    }
    logIO('Permission granted.');
    $numposts = $m->getParam(4);
    $numposts = $numposts->scalarval();
    // Get the posts to display:
    load_class('items/model/_itemlist.class.php');
    $MainList =& new ItemList2($Blog, NULL, NULL, $numposts);
    $MainList->set_filters(array('visibility_array' => array('published', 'protected', 'private', 'draft', 'deprecated', 'redirected'), 'order' => 'DESC', 'unit' => 'posts'));
    // Run the query:
    $MainList->query();
    xmlrpc_debugmsg('Items:' . $MainList->result_num_rows);
    $data = array();
    while ($Item =& $MainList->get_item()) {
        xmlrpc_debugmsg('Item:' . $Item->title . ' - Issued: ' . $Item->issue_date . ' - Modified: ' . $Item->mod_date);
        $post_date = mysql2date("U", $Item->issue_date);
        $post_date = gmdate("Ymd", $post_date) . "T" . gmdate("H:i:s", $post_date);
        $content = '<title>' . $Item->title . '</title>';
        $content .= '<category>' . $Item->main_cat_ID . '</category>';
        $content .= $Item->content;
        // Load Item's creator User:
        $Item->get_creator_User();
        $authorname = $Item->creator_User->get('preferredname');
        $data[] = new xmlrpcval(array("authorName" => new xmlrpcval($authorname), "userid" => new xmlrpcval($Item->creator_user_ID), "dateCreated" => new xmlrpcval($post_date, "dateTime.iso8601"), "content" => new xmlrpcval($content), "postid" => new xmlrpcval($Item->ID)), "struct");
    }
    $resp = new xmlrpcval($data, "array");
    logIO('OK.');
    return new xmlrpcresp($resp);
}
function agesorter($m)
{
    global $s;
    xmlrpc_debugmsg("Entering 'agesorter'");
    // get the parameter
    $sno = $m->getParam(0);
    // error string for [if|when] things go wrong
    $err = '';
    // create the output value
    $v = CreateObject('phpgwapi.xmlrpcval');
    $agar = array();
    if (isset($sno) && $sno->kindOf() == 'array') {
        $max = $sno->arraysize();
        // TODO: create debug method to print can work once more
        // print "<!-- found $max array elements -->\n";
        for ($i = 0; $i < $max; $i++) {
            $rec = $sno->arraymem($i);
            if ($rec->kindOf() != 'struct') {
                $err = 'Found non-struct in array at element ' . $i;
                break;
            }
            // extract name and age from struct
            $n = $rec->structmem('name');
            $a = $rec->structmem('age');
            // $n and $a are xmlrpcvals,
            // so get the scalarval from them
            $agar[$n->scalarval()] = $a->scalarval();
        }
        $GLOBALS['agesorter_arr'] = $agar;
        // hack, must make global as uksort() won't
        // allow us to pass any other auxilliary information
        uksort($GLOBALS['agesorter_arr'], agesorter_compare);
        $outAr = array();
        while (list($key, $val) = each($GLOBALS['agesorter_arr'])) {
            // recreate each struct element
            $outAr[] = CreateObject('phpgwapi.xmlrpcval', array('name' => CreateObject('phpgwapi.xmlrpcval', $key), 'age' => CreateObject('phpgwapi.xmlrpcval', $val, 'int')), 'struct');
        }
        // add this array to the output value
        $v->addArray($outAr);
    } else {
        $err = 'Must be one parameter, an array of structs';
    }
    if ($err) {
        return CreateObject('phpgwapi.xmlrpcresp', CreateObject('phpgwapi.xmlrpcval'), $GLOBALS['xmlrpcerruser'], $err);
    } else {
        return CreateObject('phpgwapi.xmlrpcresp', $v);
    }
}