2004-05-23 00:02:53 -04:00
< ? php
# fix for mozBlog and other cases where '<?xml' isn't on the very first line
$HTTP_RAW_POST_DATA = trim ( $HTTP_RAW_POST_DATA );
2004-09-17 16:48:43 -04:00
include ( 'wp-config.php' );
include_once ( ABSPATH . WPINC . '/class-xmlrpc.php' );
include_once ( ABSPATH . WPINC . '/class-xmlrpcs.php' );
include_once ( ABSPATH . WPINC . '/functions-post.php' );
2004-05-23 00:02:53 -04:00
// Turn off all warnings and errors.
2004-09-17 16:48:43 -04:00
error_reporting ( 0 );
2004-05-23 00:02:53 -04:00
$post_default_title = " " ; // posts submitted via the xmlrpc interface get that title
$post_default_category = 1 ; // posts submitted via the xmlrpc interface go into that category
2004-09-14 13:20:22 -04:00
$xmlrpc_logging = 0 ;
2004-05-23 00:02:53 -04:00
function logIO ( $io , $msg ) {
global $xmlrpc_logging ;
if ( $xmlrpc_logging ) {
2004-09-17 16:48:43 -04:00
$fp = fopen ( " ./xmlrpc.log " , " a+ " );
2004-05-23 00:02:53 -04:00
$date = gmdate ( " Y-m-d H:i:s " );
$iot = ( $io == " I " ) ? " Input: " : " Output: " ;
fwrite ( $fp , " \n \n " . $date . $iot . $msg );
fclose ( $fp );
}
return true ;
}
function starify ( $string ) {
$i = strlen ( $string );
return str_repeat ( '*' , $i );
}
logIO ( " I " , $HTTP_RAW_POST_DATA );
2004-09-01 12:13:35 -04:00
2004-09-17 16:48:43 -04:00
/**** B2 API ****/
# note: the b2 API currently consists of the Blogger API,
# plus the following methods:
#
# b2.newPost , b2.getCategories
# Note: the b2 API will be replaced by the standard Weblogs.API once the specs are defined.
### b2.newPost ###
$wpnewpost_sig = array ( array ( $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcBoolean , $xmlrpcString , $xmlrpcString , $xmlrpcString ));
$wpnewpost_doc = 'Adds a post, blogger-api like, +title +category +postdate' ;
function b2newpost ( $m ) {
global $wpdb ;
global $xmlrpcerruser ; // import user errcode value
global $blog_ID , $cache_userdata , $use_rss ;
global $post_default_title , $post_default_category ;
global $cafelogID , $sleep_after_edit ;
$err = " " ;
$username = $m -> getParam ( 2 );
$password = $m -> getParam ( 3 );
$content = $m -> getParam ( 4 );
$title = $m -> getParam ( 6 );
$category = $m -> getParam ( 7 );
$postdate = $m -> getParam ( 8 );
$username = $username -> scalarval ();
$password = $password -> scalarval ();
$content = $content -> scalarval ();
$title = $title -> scalarval ();
$post_category = $category -> scalarval ();
$postdate = $postdate -> scalarval ();
if ( user_pass_ok ( $username , $password )) {
$userdata = get_userdatabylogin ( $username );
$post_author = $userdata -> ID ;
$user_level = $userdata -> user_level ;
if ( $user_level < 1 ) {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 1 , // user error 1
" Sorry, level 0 users can not post " );
}
$post_content = format_to_post ( $content );
$post_title = addslashes ( $title );
if ( $postdate != " " ) {
$post_date = $postdate ;
$post_date_gmt = get_gmt_from_date ( $postdate );
} else {
$post_date = current_time ( 'mysql' );
$post_date_gmt = current_time ( 'mysql' , 1 );
}
$post_data = compact ( 'post_content' , 'post_title' , 'post_date' , 'post_date_gmt' , 'post_author' , 'post_category' );
$result = wp_insert_post ( $post_data );
if ( ! $result )
return new xmlrpcresp ( 0 , $xmlrpcerruser + 2 , // user error 2
" For some strange yet very annoying reason, your entry couldn't be posted. " );
$post_ID = $result ;
if ( ! isset ( $blog_ID )) { $blog_ID = 1 ; }
if ( isset ( $sleep_after_edit ) && $sleep_after_edit > 0 ) {
sleep ( $sleep_after_edit );
}
pingback ( $content , $post_ID );
return new xmlrpcresp ( new xmlrpcval ( " $post_ID " ));
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
2004-08-27 04:46:24 -04:00
}
2004-08-26 11:42:43 -04:00
}
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
### b2.getCategories ###
$wpgetcategories_sig = array ( array ( $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString ));
$wpgetcategories_doc = 'given a blogID, gives a struct that list categories in that blog, using categoryID and categoryName. categoryName is there so the user would choose a category name from the client, rather than just a number. however, when using b2.newPost, only the category ID number should be sent.' ;
function b2getcategories ( $m ) {
global $wpdb ;
global $xmlrpcerruser ;
$blogid = $m -> getParam ( 0 );
$blogid = $blogid -> scalarval (); // we dot not use that yet, that will be used with multiple blogs
$username = $m -> getParam ( 1 );
$username = $username -> scalarval ();
$password = $m -> getParam ( 2 );
$password = $password -> scalarval ();
$userdata = get_userdatabylogin ( $username );
if ( user_pass_ok ( $username , $password )) {
$results = $wpdb -> get_results ( " SELECT * FROM $wpdb->categories ORDER BY cat_ID ASC " );
if ( ! $results ) die ( " Error getting data " );
$i = 0 ;
foreach ( $results as $row ) {
$cat_name = $row -> cat_name ;
$cat_ID = $row -> cat_ID ;
$struct [ $i ] = new xmlrpcval ( array ( " categoryID " => new xmlrpcval ( $cat_ID ),
" categoryName " => new xmlrpcval ( $cat_name )
), " struct " );
$i = $i + 1 ;
}
$data = array ( $struct [ 0 ]);
for ( $j = 1 ; $j < $i ; $j ++ ) {
array_push ( $data , $struct [ $j ]);
}
$resp = new xmlrpcval ( $data , " array " );
return new xmlrpcresp ( $resp );
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
2004-09-01 12:13:35 -04:00
}
2004-09-17 16:48:43 -04:00
}
2004-09-01 12:13:35 -04:00
2004-09-17 16:48:43 -04:00
### b2.getPostURL ###
$wp_getPostURL_sig = array ( array ( $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString ));
$wp_getPostURL_doc = 'Given a blog ID, username, password, and a post ID, returns the URL to that post.' ;
function b2_getPostURL ( $m ) {
global $wpdb ;
global $xmlrpcerruser ;
global $querystring_start , $querystring_equal , $querystring_separator ;
// ideally, this would be used:
// $blog_ID = $m->getParam(0);
// $blog_ID = $blog_ID->scalarval();
// but right now, b2 handles only one blog, so... :P
$blog_ID = 1 ;
$username = $m -> getParam ( 2 );
$username = $username -> scalarval ();
$password = $m -> getParam ( 3 );
$password = $password -> scalarval ();
$post_ID = $m -> getParam ( 4 );
$post_ID = intval ( $post_ID -> scalarval ());
$userdata = get_userdatabylogin ( $username );
if ( $userdata -> user_level < 1 ) {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 1 , // user error 1
" Sorry, users whose level is zero, can not use this method. " );
2004-09-01 12:13:35 -04:00
}
2004-09-17 16:48:43 -04:00
if ( user_pass_ok ( $username , $password )) {
$blog_URL = get_settings ( 'home' ) . '/' . get_settings ( 'blogfilename' );
$post_URL = get_permalink ( $post_ID );
if ( $err ) {
return new xmlrpcresp ( 0 , $xmlrpcerruser , $err );
} else {
return new xmlrpcresp ( new xmlrpcval ( $post_URL ));;
}
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
2004-09-01 12:13:35 -04:00
}
}
2004-09-17 16:48:43 -04:00
/**** /B2 API ****/
2004-09-01 12:13:35 -04:00
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
/**** Blogger API ****/
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
# as described on http://plant.blogger.com/api and in various messages in http://groups.yahoo.com/group/bloggerDev/
#
# another list of these methods is there http://www.tswoam.co.uk/blogger_method_listing.html
# so you won't have to browse the eGroup to find all the methods
#
# special note: Evan please keep _your_ API page up to date :p
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
### blogger.newPost ###
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
$bloggernewpost_sig = array ( array ( $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcBoolean ));
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
$bloggernewpost_doc = 'Adds a post, blogger-api like' ;
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
function bloggernewpost ( $m ) {
global $wpdb ;
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
global $xmlrpcerruser ; // import user errcode value
global $blog_ID , $cache_userdata , $use_rss ;
global $post_default_title , $post_default_category ;
global $cafelogID , $sleep_after_edit ;
$err = " " ;
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
$username = $m -> getParam ( 2 );
$password = $m -> getParam ( 3 );
$content = $m -> getParam ( 4 );
$publish = $m -> getParam ( 5 );
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
$username = $username -> scalarval ();
$password = $password -> scalarval ();
$content = $content -> scalarval ();
// publish flag sets post status appropriately
$post_status = $publish -> scalarval () ? 'publish' : 'draft' ;
if ( user_pass_ok ( $username , $password )) {
$userdata = get_userdatabylogin ( $username );
$post_author = $userdata -> ID ;
$user_level = $userdata -> user_level ;
if ( $user_level < 1 ) {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 1 , // user error 1
" Sorry, level 0 users can not post " );
}
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
$post_title = addslashes ( xmlrpc_getposttitle ( $content ));
$post_category = xmlrpc_getpostcategory ( $content );
$content = xmlrpc_removepostdata ( $content );
$post_content = format_to_post ( $content );
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
$post_date = current_time ( 'mysql' );
$post_date_gmt = current_time ( 'mysql' , 1 );
$postdata = compact ( 'post_author' , 'post_date' , 'post_date_gmt' , 'post_content' , 'post_title' , 'post_category' , 'post_status' );
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
$post_ID = wp_insert_post ( $postdata );
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
if ( ! $post_ID )
return new xmlrpcresp ( 0 , $xmlrpcerruser + 2 , // user error 2
" For some strange yet very annoying reason, your entry couldn't be posted. " );
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
if ( ! isset ( $blog_ID )) { $blog_ID = 1 ; }
if ( isset ( $sleep_after_edit ) && $sleep_after_edit > 0 ) {
sleep ( $sleep_after_edit );
}
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
pingback ( $content , $post_ID );
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
logIO ( " O " , " Posted ! ID: $post_ID " );
return new xmlrpcresp ( new xmlrpcval ( " $post_ID " ));
} else {
logIO ( " O " , " Wrong username/password combination <b> $username / $password </b> " );
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
2004-05-23 00:02:53 -04:00
}
2004-09-17 16:48:43 -04:00
}
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
### blogger.editPost ###
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
$bloggereditpost_sig = array ( array ( $xmlrpcBoolean , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcBoolean ));
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
$bloggereditpost_doc = 'Edits a post, blogger-api like' ;
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
function bloggereditpost ( $m ) {
global $wpdb ;
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
global $xmlrpcerruser ; // import user errcode value
global $blog_ID , $cache_userdata , $use_rss ;
global $post_default_title , $post_default_category , $sleep_after_edit ;
$err = " " ;
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
$post_ID = $m -> getParam ( 1 );
$username = $m -> getParam ( 2 );
$password = $m -> getParam ( 3 );
$newcontent = $m -> getParam ( 4 );
$publish = $m -> getParam ( 5 );
$ID = $post_ID -> scalarval ();
$username = $username -> scalarval ();
$password = $password -> scalarval ();
$newcontent = $newcontent -> scalarval ();
$post_status = $publish -> scalarval () ? 'publish' : 'draft' ;
$result = wp_get_single_post ( $ID , ARRAY_A );
if ( ! $result )
return new xmlrpcresp ( 0 , $xmlrpcerruser + 2 , // user error 2
" No such post ' $ID '. " );
$userdata = get_userdatabylogin ( $username );
$user_ID = $userdata -> ID ;
$user_level = $userdata -> user_level ;
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
$postdata = get_postdata ( $ID );
$post_authordata = get_userdata ( $postdata [ " Author_ID " ]);
$post_author_ID = $postdata [ " Author_ID " ];
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
if (( $user_ID != $post_author_ID ) && ( $user_level <= $post_authordata -> user_level )) {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 1 , // user error 1
" Sorry, you do not have the right to edit this post " );
}
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
if ( user_pass_ok ( $username , $password )) {
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
if ( $user_level < 1 ) {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 1 , // user error 1
" Sorry, level 0 users can not edit posts " );
}
extract ( $result );
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
$content = $newcontent ;
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
$post_title = xmlrpc_getposttitle ( $content );
$post_category = xmlrpc_getpostcategory ( $content );
$content = xmlrpc_removepostdata ( $content );
$post_content = format_to_post ( $content );
$postdata = compact ( 'ID' , 'post_content' , 'post_title' , 'post_category' , 'post_status' , 'post_excerpt' );
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
$result = wp_update_post ( $postdata );
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
if ( ! $result )
return new xmlrpcresp ( 0 , $xmlrpcerruser + 2 , // user error 2
" For some strange yet very annoying reason, the entry couldn't be edited. " );
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
if ( ! isset ( $blog_ID )) { $blog_ID = 1 ; }
if ( isset ( $sleep_after_edit ) && $sleep_after_edit > 0 ) {
sleep ( $sleep_after_edit );
}
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
return new xmlrpcresp ( new xmlrpcval ( true , " boolean " ));
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
2004-05-23 00:02:53 -04:00
}
2004-09-17 16:48:43 -04:00
}
2004-05-23 11:46:43 -04:00
2004-09-17 16:48:43 -04:00
### blogger.deletePost ###
2004-05-23 11:46:43 -04:00
2004-09-17 16:48:43 -04:00
$bloggerdeletepost_sig = array ( array ( $xmlrpcBoolean , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcBoolean ));
2004-05-23 11:46:43 -04:00
2004-09-17 16:48:43 -04:00
$bloggerdeletepost_doc = 'Deletes a post, blogger-api like' ;
2004-05-23 11:46:43 -04:00
2004-09-17 16:48:43 -04:00
function bloggerdeletepost ( $m ) {
global $wpdb ;
2004-05-23 11:46:43 -04:00
2004-09-17 16:48:43 -04:00
global $xmlrpcerruser ; // import user errcode value
global $blog_ID , $cache_userdata , $use_rss ;
global $post_default_title , $post_default_category , $sleep_after_edit ;
$err = " " ;
2004-05-23 11:46:43 -04:00
2004-09-17 16:48:43 -04:00
$post_ID = $m -> getParam ( 1 );
$username = $m -> getParam ( 2 );
$password = $m -> getParam ( 3 );
$newcontent = $m -> getParam ( 4 );
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
$post_ID = $post_ID -> scalarval ();
$username = $username -> scalarval ();
$password = $password -> scalarval ();
$newcontent = $newcontent -> scalarval ();
2004-05-23 11:46:43 -04:00
2004-09-17 16:48:43 -04:00
$sql = " SELECT * FROM $wpdb->posts WHERE ID = ' $post_ID ' " ;
$result = $wpdb -> get_results ( $sql );
if ( ! $result )
return new xmlrpcresp ( 0 , $xmlrpcerruser + 2 , // user error 2
" No such post ' $post_ID '. " );
2004-05-23 11:46:43 -04:00
2004-09-17 16:48:43 -04:00
$userdata = get_userdatabylogin ( $username );
$user_ID = $userdata -> ID ;
$user_level = $userdata -> user_level ;
$postdata = get_postdata ( $post_ID );
$post_authordata = get_userdata ( $postdata [ " Author_ID " ]);
$post_author_ID = $postdata [ " Author_ID " ];
if (( $user_ID != $post_author_ID ) && ( $user_level <= $post_authordata -> user_level )) {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 1 , // user error 1
" Sorry, you do not have the right to delete this post " );
2004-05-23 11:46:43 -04:00
}
2004-09-17 16:48:43 -04:00
if ( user_pass_ok ( $username , $password )) {
2004-05-23 11:46:43 -04:00
2004-09-17 16:48:43 -04:00
if ( $user_level < 1 ) {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 1 , // user error 1
" Sorry, level 0 users can not delete posts " );
}
2004-05-23 11:46:43 -04:00
2004-09-17 16:48:43 -04:00
$result = wp_delete_post ( $post_ID );
2004-05-23 11:46:43 -04:00
2004-09-17 16:48:43 -04:00
if ( ! $result )
return new xmlrpcresp ( 0 , $xmlrpcerruser + 2 , // user error 2
" For some strange yet very annoying reason, the entry couldn't be deleted. " );
2004-05-23 11:46:43 -04:00
2004-09-17 16:48:43 -04:00
if ( ! isset ( $blog_ID )) { $blog_ID = 1 ; }
if ( isset ( $sleep_after_edit ) && $sleep_after_edit > 0 ) {
sleep ( $sleep_after_edit );
}
2004-05-23 11:46:43 -04:00
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
return new xmlrpcresp ( new xmlrpcval ( true , 'boolean' ));
2004-05-23 11:46:43 -04:00
2004-09-17 16:48:43 -04:00
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
2004-05-23 11:46:43 -04:00
}
2004-09-17 16:48:43 -04:00
}
### blogger.getUsersBlogs ###
$bloggergetusersblogs_sig = array ( array ( $xmlrpcArray , $xmlrpcString , $xmlrpcString , $xmlrpcString ));
2004-05-23 11:46:43 -04:00
2004-09-17 16:48:43 -04:00
$bloggergetusersblogs_doc = 'returns the user\'s blogs - this is a dummy function, just so that BlogBuddy and other blogs-retrieving apps work' ;
2004-05-23 12:42:23 -04:00
2004-09-17 16:48:43 -04:00
function bloggergetusersblogs ( $m ) {
global $wpdb ;
// this function will have a real purpose with CafeLog's multiple blogs capability
2004-05-23 12:42:23 -04:00
2004-09-17 16:48:43 -04:00
global $xmlrpcerruser ;
2004-05-23 12:42:23 -04:00
2004-09-17 16:48:43 -04:00
$user_login = $m -> getParam ( 1 );
$user_login = $user_login -> scalarval ();
2004-05-23 12:42:23 -04:00
2004-09-17 16:48:43 -04:00
$sql = " SELECT user_level FROM $wpdb->users WHERE user_login = ' $user_login ' AND user_level > 3 " ;
$result = $wpdb -> get_results ( $sql );
$is_admin = $wpdb -> num_rows ;
$struct = new xmlrpcval ( array ( " isAdmin " => new xmlrpcval ( $is_admin , " boolean " ),
" url " => new xmlrpcval ( get_settings ( 'home' ) . '/' . get_settings ( 'blogfilename' )),
" blogid " => new xmlrpcval ( " 1 " ),
" blogName " => new xmlrpcval ( get_settings ( 'blogname' ))
), " struct " );
$resp = new xmlrpcval ( array ( $struct ), " array " );
return new xmlrpcresp ( $resp );
}
2004-05-23 12:42:23 -04:00
2004-09-17 16:48:43 -04:00
### blogger.getUserInfo ###
2004-05-23 12:42:23 -04:00
2004-09-17 16:48:43 -04:00
$bloggergetuserinfo_sig = array ( array ( $xmlrpcStruct , $xmlrpcString , $xmlrpcString , $xmlrpcString ));
2004-05-23 12:42:23 -04:00
2004-09-17 16:48:43 -04:00
$bloggergetuserinfo_doc = 'gives the info about a user' ;
2004-05-23 12:42:23 -04:00
2004-09-17 16:48:43 -04:00
function bloggergetuserinfo ( $m ) {
global $xmlrpcerruser ;
2004-05-23 12:42:23 -04:00
2004-09-17 16:48:43 -04:00
$username = $m -> getParam ( 1 );
$username = $username -> scalarval ();
2004-05-23 12:42:23 -04:00
2004-09-17 16:48:43 -04:00
$password = $m -> getParam ( 2 );
$password = $password -> scalarval ();
2004-05-23 12:42:23 -04:00
2004-09-17 16:48:43 -04:00
$userdata = get_userdatabylogin ( $username );
if ( user_pass_ok ( $username , $password )) {
$struct = new xmlrpcval ( array ( " nickname " => new xmlrpcval ( $userdata -> user_nickname ),
" userid " => new xmlrpcval ( $userdata -> ID ),
" url " => new xmlrpcval ( $userdata -> user_url ),
" email " => new xmlrpcval ( $userdata -> user_email ),
" lastname " => new xmlrpcval ( $userdata -> user_lastname ),
" firstname " => new xmlrpcval ( $userdata -> user_firstname )
), " struct " );
$resp = $struct ;
return new xmlrpcresp ( $resp );
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
2004-05-23 12:42:23 -04:00
}
2004-09-17 16:48:43 -04:00
}
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
### blogger.getPost ###
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
$bloggergetpost_sig = array ( array ( $xmlrpcStruct , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString ));
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
$bloggergetpost_doc = 'fetches a post, blogger-api like' ;
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
function bloggergetpost ( $m ) {
global $xmlrpcerruser ;
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
$post_ID = $m -> getParam ( 1 );
$post_ID = $post_ID -> scalarval ();
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
$username = $m -> getParam ( 2 );
$username = $username -> scalarval ();
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
$password = $m -> getParam ( 3 );
$password = $password -> scalarval ();
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
if ( user_pass_ok ( $username , $password )) {
$postdata = wp_get_single_post ( $post_ID );
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
if ( $postdata [ 'post_date' ] != '' ) {
$post_date = mysql2date ( 'Ymd\TH:i:s\Z' , $postdata [ 'post_date_gmt' ]);
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
$categories = implode ( ',' , $postdata [ 'post_category' ]);
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
$content = '<title>' . stripslashes ( $postdata [ 'post_title' ]) . '</title>' ;
$content .= '<category>' . $categories . '</category>' ;
$content .= stripslashes ( $postdata [ 'post_content' ]);
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
$struct = new xmlrpcval ( array ( 'userid' => new xmlrpcval ( $postdata [ 'post_author' ]),
" dateCreated " => new xmlrpcval ( $post_date , " dateTime.iso8601 " ),
" content " => new xmlrpcval ( $content ),
" postid " => new xmlrpcval ( $postdata [ " ID " ])
), " struct " );
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
$resp = $struct ;
return new xmlrpcresp ( $resp );
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 4
" No such post # $post_ID " );
}
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
2004-08-25 11:24:09 -04:00
}
2004-09-17 16:48:43 -04:00
}
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
### blogger.getRecentPosts ###
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
$bloggergetrecentposts_sig = array ( array ( $xmlrpcArray , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcInt ));
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
$bloggergetrecentposts_doc = 'fetches X most recent posts, blogger-api like' ;
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
function bloggergetrecentposts ( $m ) {
global $wpdb ;
global $xmlrpcerruser ;
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
error_reporting ( 0 ); // there is a bug in phpxmlrpc that makes it say there are errors while the output is actually valid, so let's disable errors for that function
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
$blogid = 1 ; // we don't need that yet
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
$numposts = $m -> getParam ( 4 );
$numposts = $numposts -> scalarval ();
2004-08-25 11:24:09 -04:00
2004-09-17 16:48:43 -04:00
if ( $numposts > 0 ) {
$limit = " LIMIT $numposts " ;
} else {
$limit = " " ;
2004-08-25 11:24:09 -04:00
}
2004-09-17 16:48:43 -04:00
$username = $m -> getParam ( 2 );
$username = $username -> scalarval ();
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$password = $m -> getParam ( 3 );
$password = $password -> scalarval ();
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
if ( user_pass_ok ( $username , $password )) {
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$sql = " SELECT * FROM $wpdb->posts ORDER BY post_date_gmt DESC " . $limit ;
$result = $wpdb -> get_results ( $sql );
if ( ! $result )
return new xmlrpcresp ( 0 , $xmlrpcerruser + 2 , // user error 2
" For some strange yet very annoying reason, the entries couldn't be fetched. " );
$data = new xmlrpcval ( " " , " array " );
$i = 0 ;
foreach ( $result as $row ) {
$postdata = array (
" ID " => $row -> ID ,
" Author_ID " => $row -> post_author ,
" Date " => $row -> post_date_gmt ,
" Content " => $row -> post_content ,
" Title " => $row -> post_title ,
" Category " => $row -> post_category
);
$post_date = mysql2date ( 'Ymd\TH:i:s\Z' , $postdata [ 'Date' ]);
$categories = implode ( ',' , wp_get_post_cats ( 1 , $postdata [ 'ID' ]));
$content = " <title> " . stripslashes ( $postdata [ " Title " ]) . " </title> " ;
$content .= " <category> " . $categories . " </category> " ;
$content .= stripslashes ( $postdata [ " Content " ]);
// $content = convert_chars($content,"html");
// $content = $postdata["Title"];
$category = new xmlrpcval ( $postdata [ 'Category' ]);
$authordata = get_userdata ( $postdata [ " Author_ID " ]);
switch ( $authordata [ " user_idmode " ]) {
case " nickname " :
$authorname = $authordata [ " user_nickname " ];
case " login " :
$authorname = $authordata [ " user_login " ];
break ;
case " firstname " :
$authorname = $authordata [ " user_firstname " ];
break ;
case " lastname " :
$authorname = $authordata [ " user_lastname " ];
break ;
case " namefl " :
$authorname = $authordata [ " user_firstname " ] . " " . $authordata [ " user_lastname " ];
break ;
case " namelf " :
$authorname = $authordata [ " user_lastname " ] . " " . $authordata [ " user_firstname " ];
break ;
default :
$authorname = $authordata [ " user_nickname " ];
break ;
}
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$struct [ $i ] = new xmlrpcval ( array ( " authorName " => new xmlrpcval ( $authorname ),
" userid " => new xmlrpcval ( $postdata [ " Author_ID " ]),
" dateCreated " => new xmlrpcval ( $post_date , " dateTime.iso8601 " ),
" content " => new xmlrpcval ( $content ),
" postid " => new xmlrpcval ( $postdata [ " ID " ]),
'category' => $category
), " struct " );
$i = $i + 1 ;
}
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$data = array ( $struct [ 0 ]);
for ( $j = 1 ; $j < $i ; $j ++ ) {
array_push ( $data , $struct [ $j ]);
}
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$resp = new xmlrpcval ( $data , " array " );
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
return new xmlrpcresp ( $resp );
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
}
}
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
### blogger.getTemplate ###
2004-09-14 13:20:22 -04:00
2004-09-17 16:48:43 -04:00
# note: on b2, it fetches your $blogfilename, or b2.php if you didn't specify the variable
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$bloggergettemplate_sig = array ( array ( $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString ));
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$bloggergettemplate_doc = 'returns the default template file\'s code' ;
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
function bloggergettemplate ( $m ) {
global $xmlrpcerruser ;
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
error_reporting ( 0 ); // there is a bug in phpxmlrpc that makes it say there are errors while the output is actually valid, so let's disable errors for that function
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$blogid = 1 ; // we do not need this yet
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$templateType = $m -> getParam ( 4 );
$templateType = $templateType -> scalarval ();
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$username = $m -> getParam ( 2 );
$username = $username -> scalarval ();
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$password = $m -> getParam ( 3 );
$password = $password -> scalarval ();
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$userdata = get_userdatabylogin ( $username );
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
if ( $userdata -> user_level < 3 ) {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 1 , // user error 1
" Sorry, users whose level is less than 3, can not edit the template. " );
}
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
if ( user_pass_ok ( $username , $password )) {
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
if ( $templateType == " main " ) {
if ( get_settings ( 'blogfilename' ) != '' ) {
$file = get_settings ( 'blogfilename' );
} else {
$file = " wp.php " ;
}
} elseif ( $templateType == " archiveIndex " ) {
$file = " wp.php " ;
}
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$doc_root = preg_replace ( '#http://.+?/#' , $_SERVER [ 'DOCUMENT_ROOT' ] . '/' , get_settings ( 'home' ));
$file = $doc_root . '/' . $file ;
$f = fopen ( $file , " r " );
$content = fread ( $f , filesize ( $file ));
fclose ( $f );
$content = str_replace ( " \n " , " \r \n " , $content ); // so it is actually editable with a windows/mac client, instead of being returned as a looooooooooong line of code
return new xmlrpcresp ( new xmlrpcval ( " $content " ));
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
2004-08-25 12:28:20 -04:00
}
2004-09-17 16:48:43 -04:00
}
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
### blogger.setTemplate ###
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
# note: on b2, it saves that in your $blogfilename, or b2.php if you didn't specify the variable
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$bloggersettemplate_sig = array ( array ( $xmlrpcBoolean , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString ));
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$bloggersettemplate_doc = 'saves the default template file\'s code' ;
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
function bloggersettemplate ( $m ) {
global $xmlrpcerruser ;
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
error_reporting ( 0 ); // there is a bug in phpxmlrpc that makes it say there are errors while the output is actually valid, so let's disable errors for that function
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$blogid = 1 ; // we do not need this yet
2004-08-26 11:42:43 -04:00
2004-09-17 16:48:43 -04:00
$template = $m -> getParam ( 4 );
$template = $template -> scalarval ();
2004-08-26 11:42:43 -04:00
2004-09-17 16:48:43 -04:00
$templateType = $m -> getParam ( 5 );
$templateType = $templateType -> scalarval ();
2004-08-26 11:42:43 -04:00
2004-09-17 16:48:43 -04:00
$username = $m -> getParam ( 2 );
$username = $username -> scalarval ();
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$password = $m -> getParam ( 3 );
$password = $password -> scalarval ();
2004-08-25 12:28:20 -04:00
2004-09-17 16:48:43 -04:00
$userdata = get_userdatabylogin ( $username );
if ( $userdata -> user_level < 3 ) {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 1 , // user error 1
" Sorry, users whose level is less than 3, can not edit the template. " );
2004-08-25 12:28:20 -04:00
}
2004-08-26 11:42:43 -04:00
2004-09-17 16:48:43 -04:00
if ( user_pass_ok ( $username , $password )) {
2004-08-26 11:42:43 -04:00
2004-09-17 16:48:43 -04:00
if ( $templateType == 'main' ) {
if ( get_settings ( 'blogfilename' ) != '' ) {
$file = get_settings ( 'blogfilename' );
} else {
$file = " wp.php " ;
}
} elseif ( $templateType == " archiveIndex " ) {
$file = " wp.php " ;
2004-08-26 11:42:43 -04:00
}
2004-09-17 16:48:43 -04:00
$doc_root = preg_replace ( '#http://.+?/#' , $_SERVER [ 'DOCUMENT_ROOT' ] . '/' , get_settings ( 'home' ));
$file = $doc_root . '/' . $file ;
$f = fopen ( $file , " w+ " );
fwrite ( $f , $template );
fclose ( $f );
return new xmlrpcresp ( new xmlrpcval ( true , " boolean " ));
2004-08-26 11:42:43 -04:00
2004-09-17 16:48:43 -04:00
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
}
}
2004-08-26 11:42:43 -04:00
2004-09-17 16:48:43 -04:00
/**** /Blogger API ****/
2004-08-26 11:42:43 -04:00
2004-09-17 16:48:43 -04:00
/**** metaWeblog API ****/
2004-08-26 11:42:43 -04:00
2004-09-17 16:48:43 -04:00
/**********************
*
* metaWeblog API extensions
* added by
* Dougal Campbell < dougal @ gunters . org >
* http :// dougal . gunters . org /
*
**********************/
2004-08-26 11:42:43 -04:00
2004-09-17 16:48:43 -04:00
$mwnewpost_sig = array ( array ( $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcStruct , $xmlrpcBoolean ));
$mwnewpost_doc = 'Add a post, MetaWeblog API-style' ;
function mwnewpost ( $params ) {
global $xmlrpcerruser ;
global $blog_ID , $cache_userdata ;
global $use_rss , $post_default_title ;
global $post_default_category , $cafelogID , $sleep_after_edit ;
$xblogid = $params -> getParam ( 0 );
$xuser = $params -> getParam ( 1 );
$xpass = $params -> getParam ( 2 );
$xcontent = $params -> getParam ( 3 );
$xpublish = $params -> getParam ( 4 );
$blogid = $xblogid -> scalarval ();
$username = $xuser -> scalarval ();
$password = $xpass -> scalarval ();
$contentstruct = phpxmlrpc_decode ( $xcontent );
$post_status = $xpublish -> scalarval () ? 'publish' : 'draft' ;
// Check login
if ( user_pass_ok ( $username , $password )) {
$userdata = get_userdatabylogin ( $username );
$post_author = $userdata -> ID ;
$user_level = $userdata -> user_level ;
if ( $user_level < 1 ) {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 1 ,
" Sorry, level 0 users cannot post " );
}
2004-08-26 11:42:43 -04:00
2004-09-17 16:48:43 -04:00
$post_title = $contentstruct [ 'title' ];
$post_content = format_to_post ( $contentstruct [ 'description' ]);
$post_excerpt = $contentstruct [ 'mt_excerpt' ];
$post_more = $contentstruct [ 'mt_text_more' ];
$comment_status = $contentstruct [ 'mt_allow_comments' ] ? 'open' : 'closed' ;
$ping_status = $contentstruct [ 'mt_allow_pings' ] ? 'open' : 'closed' ;
if ( $post_more ) {
$post_content = $post_content . " \n <!--more--> \n " . $post_more ;
}
// Do some timestamp voodoo
$dateCreated = $contentstruct [ 'dateCreated' ];
if ( ! empty ( $dateCreated )) {
$post_date = get_date_from_gmt ( iso8601_to_datetime ( $dateCreated ));
$post_date_gmt = iso8601_to_datetime ( $dateCreated , GMT );
} else {
$post_date = current_time ( 'mysql' );
$post_date_gmt = current_time ( 'mysql' , 1 );
}
$catnames = $contentstruct [ 'categories' ];
// FIXME: commented until proper fix // logio("O","Post cats: " . print_r($catnames,true));
$post_category = array ();
if ( $catnames ) {
foreach ( $catnames as $cat ) {
$post_category [] = get_cat_ID ( $cat );
}
} else {
$post_category [] = 1 ;
}
// We've got all the data -- post it:
$postarr = compact ( 'post_author' , 'post_date' , 'post_date_gmt' , 'post_content' , 'post_title' , 'post_category' , 'post_status' , 'post_excerpt' , 'comment_status' , 'ping_status' );
$post_ID = wp_insert_post ( $postarr );
if ( ! $post_ID ) {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 2 , " For some strange yet very annoying reason, your entry could not be posted. " );
}
if ( ! isset ( $blog_ID )) { $blog_ID = 1 ; }
if ( isset ( $sleep_after_edit ) && $sleep_after_edit > 0 ) {
sleep ( $sleep_after_edit );
}
pingback ( $content , $post_ID );
trackback_url_list ( $contentstruct [ 'mt_tb_ping_urls' ], $post_ID );
logIO ( " O " , " (MW) Posted ! ID: $post_ID " );
$myResp = new xmlrpcval ( $post_ID , " string " );
return new xmlrpcresp ( $myResp );
} else {
logIO ( " O " , " (MW) Wrong username/password combination <b> $username / $password </b> " );
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
2004-08-26 11:42:43 -04:00
}
2004-09-17 16:48:43 -04:00
}
2004-08-26 11:42:43 -04:00
2004-09-17 16:48:43 -04:00
$mweditpost_sig = array ( array ( $xmlrpcBoolean , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcStruct , $xmlrpcBoolean ));
$mweditpost_doc = 'Edit a post, MetaWeblog API-style' ;
2004-08-27 04:46:24 -04:00
2004-09-17 16:48:43 -04:00
function mweditpost ( $params ) { // ($postid, $user, $pass, $content, $publish)
global $xmlrpcerruser ;
$xpostid = $params -> getParam ( 0 );
$xuser = $params -> getParam ( 1 );
$xpass = $params -> getParam ( 2 );
$xcontent = $params -> getParam ( 3 );
$xpublish = $params -> getParam ( 4 );
$ID = $xpostid -> scalarval ();
$username = $xuser -> scalarval ();
$password = $xpass -> scalarval ();
$contentstruct = phpxmlrpc_decode ( $xcontent );
$postdata = wp_get_single_post ( $ID , ARRAY_A );
if ( ! $postdata )
return new xmlrpcresp ( 0 , $xmlrpcerruser + 2 , // user error 2
" No such post $ID . " );
$userdata = get_userdatabylogin ( $username );
$user_ID = $userdata -> ID ;
$user_level = $userdata -> user_level ;
$time_difference = get_settings ( 'gmt_offset' );
$post_author_ID = $postdata [ 'post_author' ];
$post_authordata = get_userdata ( $post_author_ID );
if (( $user_ID != $post_author_ID ) && ( $user_level <= $post_authordata -> user_level )) {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 1 , // user error 1
" Sorry, you do not have the right to edit this post. " );
2004-08-27 04:46:24 -04:00
}
2004-09-17 16:48:43 -04:00
// Check login
if ( user_pass_ok ( $username , $password )) {
if ( $user_level < 1 ) {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 1 ,
2004-08-27 04:46:24 -04:00
2004-09-17 16:48:43 -04:00
" Sorry, level 0 users cannot edit posts " );
}
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
extract ( $postdata );
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
$post_title = $contentstruct [ 'title' ];
$post_content = format_to_post ( $contentstruct [ 'description' ]);
$catnames = $contentstruct [ 'categories' ];
if ( $catnames ) {
foreach ( $catnames as $cat ) {
$post_category [] = get_cat_ID ( $cat );
}
}
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
$post_excerpt = $contentstruct [ 'mt_excerpt' ];
$post_more = $contentstruct [ 'mt_text_more' ];
$post_status = $xpublish -> scalarval () ? 'publish' : 'draft' ;
if ( $post_more ) {
$post_content = $post_content . " \n <!--more--> \n " . $post_more ;
}
$comment_status = ( 1 == $contentstruct [ 'mt_allow_comments' ]) ? 'open' : 'closed' ;
$ping_status = $contentstruct [ 'mt_allow_pings' ] ? 'open' : 'closed' ;
// Do some timestamp voodoo
$dateCreated = $contentstruct [ 'dateCreated' ];
if ( ! empty ( $dateCreated )) {
$post_date = get_date_from_gmt ( iso8601_to_datetime ( $dateCreated ));
$post_date_gmt = iso8601_to_datetime ( $dateCreated , GMT );
} else {
$post_date = $postdata [ 'post_date' ];
$post_date_gmt = $postdata [ 'post_date_gmt' ];
}
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
// We've got all the data -- post it:
$newpost = compact ( 'ID' , 'post_content' , 'post_title' , 'post_category' , 'post_status' , 'post_excerpt' , 'comment_status' , 'ping_status' , 'post_date' , 'post_date_gmt' );
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
$post_ID = wp_update_post ( $newpost );
if ( ! $post_ID ) {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 2 , " For some strange yet very annoying reason, your entry could not be posted. " );
}
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
if ( ! isset ( $blog_ID )) { $blog_ID = 1 ; }
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
if ( isset ( $sleep_after_edit ) && $sleep_after_edit > 0 ) {
sleep ( $sleep_after_edit );
}
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
pingback ( $content , $post_ID );
trackback_url_list ( $contentstruct [ 'mt_tb_ping_urls' ], $post_ID );
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
logIO ( " O " , " (MW) Edited ! ID: $post_ID " );
$myResp = new xmlrpcval ( true , " boolean " );
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
return new xmlrpcresp ( $myResp );
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
} else {
logIO ( " O " , " (MW) Wrong username/password combination <b> $username / $password </b> " );
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
2004-09-14 12:52:13 -04:00
}
2004-09-17 16:48:43 -04:00
}
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
$mwgetpost_sig = array ( array ( $xmlrpcStruct , $xmlrpcString , $xmlrpcString , $xmlrpcString ));
$mwegetpost_doc = 'Get a post, MetaWeblog API-style' ;
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
function mwgetpost ( $params ) { // ($postid, $user, $pass)
global $xmlrpcerruser ;
$xpostid = $params -> getParam ( 0 );
$xuser = $params -> getParam ( 1 );
$xpass = $params -> getParam ( 2 );
$post_ID = $xpostid -> scalarval ();
$username = $xuser -> scalarval ();
$password = $xpass -> scalarval ();
// Check login
if ( user_pass_ok ( $username , $password )) {
$postdata = wp_get_single_post ( $post_ID , ARRAY_A );
if ( $postdata [ 'post_date' ] != '' ) {
$post_date = mysql2date ( 'Ymd\TH:i:s\Z' , $postdata [ 'post_date_gmt' ]);
$catids = wp_get_post_cats ( '' , $post_ID );
foreach ( $catids as $catid ) {
$catname = get_cat_name ( $catid );
$catnameenc = new xmlrpcval ( $catname );
$catlist [] = $catnameenc ;
}
$post = get_extended ( $postdata [ 'post_content' ]);
$allow_comments = ( 'open' == $postdata [ 'comment_status' ]) ? 1 : 0 ;
$allow_pings = ( 'open' == $postdata [ 'ping_status' ]) ? 1 : 0 ;
$resp = array (
'link' => new xmlrpcval ( post_permalink ( $post_ID )),
'title' => new xmlrpcval ( $postdata [ 'post_title' ]),
'description' => new xmlrpcval ( $post [ 'main' ]),
'dateCreated' => new xmlrpcval ( $post_date , 'dateTime.iso8601' ),
'userid' => new xmlrpcval ( $postdata [ 'post_author' ]),
'postid' => new xmlrpcval ( $postdata [ 'ID' ]),
'content' => new xmlrpcval ( $postdata [ 'post_content' ]),
'permalink' => new xmlrpcval ( post_permalink ( $post_ID )),
'categories' => new xmlrpcval ( $catlist , 'array' ),
'mt_excerpt' => new xmlrpcval ( $postdata [ 'post_excerpt' ]),
'mt_allow_comments' => new xmlrpcval ( $allow_comments , 'int' ),
'mt_allow_pings' => new xmlrpcval ( $allow_pings , 'int' ),
'mt_text_more' => new xmlrpcval ( $post [ 'extended' ])
);
$resp = new xmlrpcval ( $resp , 'struct' );
return new xmlrpcresp ( $resp );
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 4
" No such post # $post_ID " );
}
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
}
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
}
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
$mwrecentposts_sig = array ( array ( $xmlrpcArray , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcInt ));
$mwerecentposts_doc = 'Get recent posts, MetaWeblog API-style' ;
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
function mwrecentposts ( $params ) { // ($blogid, $user, $pass, $num)
global $xmlrpcerruser ;
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
$xblogid = $params -> getParam ( 0 );
$xuser = $params -> getParam ( 1 );
$xpass = $params -> getParam ( 2 );
$xnum = $params -> getParam ( 3 );
$blogid = $xblogid -> scalarval ();
$username = $xuser -> scalarval ();
$password = $xpass -> scalarval ();
$num = $xnum -> scalarval ();
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
// Check login
if ( user_pass_ok ( $username , $password )) {
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
$postlist = wp_get_recent_posts ( $num );
// Build response packet. We can't just use xmlrpc_encode,
// because of the dateCreated field, which must be a date type.
// Encode each entry of the array.
foreach ( $postlist as $entry ) {
$isoString = mysql2date ( 'Ymd\TH:i:s\Z' , $entry [ 'post_date_gmt' ]);
$date = new xmlrpcval ( $isoString , " dateTime.iso8601 " );
$userid = new xmlrpcval ( $entry [ 'post_author' ]);
$content = new xmlrpcval ( $entry [ 'post_content' ]);
$excerpt = new xmlrpcval ( $entry [ 'post_excerpt' ]);
// $pcat = stripslashes(get_cat_name($entry['post_category']));
$catlist = array ();
$catids = wp_get_post_cats ( '' , $entry [ 'ID' ]);
foreach ( $catids as $catid ) {
$catname = get_cat_name ( $catid );
$catnameenc = new xmlrpcval ( $catname );
$catlist [] = $catnameenc ;
}
2004-09-14 12:52:13 -04:00
2004-09-17 16:48:43 -04:00
// For multiple cats, we might do something like
// this in the future:
//$catstruct['description'] = $pcat;
//$catstruct['categoryId'] = $entry['post_category'];
//$catstruct['categoryName'] = $pcat;
//$catstruct['isPrimary'] = TRUE;
//$catstruct2 = phpxmlrpc_encode($catstruct);
// $categories = new xmlrpcval(array(new xmlrpcval($pcat)),'array');
$categories = new xmlrpcval ( $catlist , 'array' );
$post = get_extended ( $entry [ 'post_content' ]);
$postid = new xmlrpcval ( $entry [ 'ID' ]);
$title = new xmlrpcval ( stripslashes ( $entry [ 'post_title' ]));
$description = new xmlrpcval ( stripslashes ( $post [ 'main' ]));
$link = new xmlrpcval ( post_permalink ( $entry [ 'ID' ]));
$permalink = $link ;
$extended = new xmlrpcval ( stripslashes ( $post [ 'extended' ]));
$allow_comments = new xmlrpcval ((( 'open' == $entry [ 'comment_status' ]) ? 1 : 0 ), 'int' );
$allow_pings = new xmlrpcval ((( 'open' == $entry [ 'ping_status' ]) ? 1 : 0 ), 'int' );
$encode_arr = array (
'dateCreated' => $date ,
'userid' => $userid ,
'postid' => $postid ,
'categories' => $categories ,
'title' => $title ,
'description' => $description ,
'link' => $link ,
'permalink' => $permalink ,
'mt_excerpt' => $excerpt ,
'mt_allow_comments' => $allow_comments ,
'mt_allow_pings' => $allow_pings ,
'mt_text_more' => $extended
);
$xmlrpcpostarr [] = new xmlrpcval ( $encode_arr , " struct " );
}
// Now convert that to an xmlrpc array type
$myResp = new xmlrpcval ( $xmlrpcpostarr , " array " );
return new xmlrpcresp ( $myResp );
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
2004-09-14 12:52:13 -04:00
}
2004-09-17 16:48:43 -04:00
}
2004-09-14 12:52:13 -04:00
2004-09-16 09:26:06 -04:00
2004-09-17 16:48:43 -04:00
$mwgetcats_sig = array ( array ( $xmlrpcArray , $xmlrpcString , $xmlrpcString , $xmlrpcString ));
$mwgetcats_doc = 'Get a post, MetaWeblog API-style' ;
function mwgetcats ( $params ) { // ($blogid, $user, $pass)
global $xmlrpcerruser , $wpdb ;
global $querystring_start , $querystring_equal , $querystring_separator ;
$blog_URL = get_settings ( 'home' ) . '/' . get_settings ( 'blogfilename' );
$arr = array ();
if ( $cats = $wpdb -> get_results ( " SELECT cat_ID,cat_name FROM $wpdb->categories " , ARRAY_A )) {
foreach ( $cats as $cat ) {
$struct [ 'categoryId' ] = $cat [ 'cat_ID' ];
$struct [ 'description' ] = $cat [ 'cat_name' ];
$struct [ 'categoryName' ] = $cat [ 'cat_name' ];
$struct [ 'htmlUrl' ] = htmlspecialchars ( $blog_URL . $querystring_start . 'cat' . $querystring_equal . $cat [ 'cat_ID' ]);
$struct [ 'rssUrl' ] = '' ; // will probably hack alexking's stuff in here
$arr [] = phpxmlrpc_encode ( $struct );
}
2004-09-16 10:54:25 -04:00
}
2004-09-17 16:48:43 -04:00
$resp = new xmlrpcval ( $arr , 'array' );
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
return new xmlrpcresp ( $resp );
}
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
$mwnewmedia_sig = array ( array ( $xmlrpcStruct , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcStruct ));
$mwnewmedia_doc = 'Upload image or other binary data, MetaWeblog API-style (unimplemented)' ;
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
function mwnewmedia ( $params ) { // ($blogid, $user, $pass, $struct)
global $xmlrpcerruser ;
return new xmlrpcresp ( 0 , $xmlrpcerruser + 10 , // user error 10
'metaWeblog.newMediaObject not implemented (yet)' );
}
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
/**** /MetaWeblog API ****/
/**** MovableType API ****/
/**********************
*
* MovableType API extensions
* added by
* Dougal Campbell < dougal @ gunters . org >
* http :// dougal . gunters . org /
*
* DONE :
* mt . getCategoryList
* mt . setPostCategories
* mt . supportedMethods
* mt . getPostCategories
* mt . publishPost
* mt . getRecentPostTitles
* extend metaWeblog . newPost
* extend metaWeblog . editPost
* extend metaWeblog . getPost
* extend metaWeblog . getRecentPosts
*
* PARTIALLY DONE :
* mt . supportedTextFilters // empty stub, because WP doesn't support per-post text filters at this time
* mt . getTrackbackPings // another stub.
* metaWeblog . newMediaObject // ditto. For now.
*
**********************/
$mt_supportedMethods_sig = array ( array ( $xmlrpcArray ));
$mt_supportedMethods_doc = 'Retrieve information about the XML-RPC methods supported by the server.' ;
// ripped out of system.listMethods
function mt_supportedMethods ( $params ) {
global $dispatch_map , $xmlrpcerr , $xmlrpcstr , $_xmlrpcs_dmap ;
$v = new xmlrpcval ();
$dmap = $dispatch_map ;
$outAr = array ();
for ( reset ( $dmap ); list ( $key , $val ) = each ( $dmap ); ) {
$outAr [] = new xmlrpcval ( $key , " string " );
}
$dmap = $_xmlrpcs_dmap ;
for ( reset ( $dmap ); list ( $key , $val ) = each ( $dmap ); ) {
$outAr [] = new xmlrpcval ( $key , " string " );
}
$v -> addArray ( $outAr );
return new xmlrpcresp ( $v );
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
}
$mt_getPostCategories_sig = array ( array ( $xmlrpcArray , $xmlrpcString , $xmlrpcString , $xmlrpcString ));
$mt_getPostCategories_doc = " Returns a list of all categories to which the post is assigned. " ;
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
function mt_getPostCategories ( $params ) {
global $xmlrpcusererr ;
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
$xpostid = $params -> getParam ( 0 );
$xuser = $params -> getParam ( 1 );
$xpass = $params -> getParam ( 2 );
$post_ID = $xpostid -> scalarval ();
$username = $xuser -> scalarval ();
$password = $xpass -> scalarval ();
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
if ( user_pass_ok ( $username , $password )) {
$catids = wp_get_post_cats ( '1' , $post_ID );
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
// The first category listed will be set as primary
$struct [ 'isPrimary' ] = true ;
foreach ( $catids as $catid ) {
$struct [ 'categoryId' ] = $catid ;
$struct [ 'categoryName' ] = get_cat_name ( $catid );
$resp_struct [] = phpxmlrpc_encode ( $struct );
$struct [ 'isPrimary' ] = false ;
}
// Return an array of structs
$resp_array = new xmlrpcval ( $resp_struct , 'array' );
return new xmlrpcresp ( $resp_array );
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
2004-09-16 10:54:25 -04:00
}
2004-09-17 16:48:43 -04:00
}
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
$mt_setPostCategories_sig = array ( array ( $xmlrpcBoolean , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcArray ));
$mt_setPostCategories_doc = " Sets the categories for a post " ;
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
function mt_setPostCategories ( $params ) {
global $xmlrpcusererr ;
$xpostid = $params -> getParam ( 0 );
$xuser = $params -> getParam ( 1 );
$xpass = $params -> getParam ( 2 );
$xcats = $params -> getParam ( 3 );
$post_ID = $xpostid -> scalarval ();
$username = $xuser -> scalarval ();
$password = $xpass -> scalarval ();
$cats = phpxmlrpc_decode ( $xcats );
foreach ( $cats as $cat ) {
$catids [] = $cat [ 'categoryId' ];
2004-09-16 10:54:25 -04:00
}
2004-09-17 16:48:43 -04:00
if ( user_pass_ok ( $username , $password )) {
wp_set_post_cats ( '' , $post_ID , $catids );
return new xmlrpcresp ( new xmlrpcval ( true , 'boolean' ));
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
}
}
$mt_publishPost_sig = array ( array ( $xmlrpcBoolean , $xmlrpcString , $xmlrpcString , $xmlrpcString ));
$mt_publishPost_doc = " Publish (rebuild) all of the static files related to an entry. Equivalent to saving an entry in the system (but without the ping). " ;
function mt_publishPost ( $params ) {
global $xmlrpcusererr ;
$xpostid = $params -> getParam ( 0 );
$xuser = $params -> getParam ( 1 );
$xpass = $params -> getParam ( 2 );
$post_ID = $xpostid -> scalarval ();
$username = $xuser -> scalarval ();
$password = $xpass -> scalarval ();
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
if ( user_pass_ok ( $username , $password )) {
$postdata = wp_get_single_post ( $post_ID , ARRAY_A );
$postdata [ 'post_status' ] = 'publish' ;
// retain old cats
$cats = wp_get_post_cats ( '' , $post_ID );
$postdata [ 'post_category' ] = $cats ;
$result = wp_update_post ( $postdata );
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
return new xmlrpcresp ( new xmlrpcval ( $result , 'boolean' ));
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
}
}
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
$mt_getRecentPostTitles_sig = array ( array ( $xmlrpcArray , $xmlrpcString , $xmlrpcString , $xmlrpcString , $xmlrpcInt ));
$mt_getRecentPostTitles_doc = " Returns a bandwidth-friendly list of the most recent posts in the system. " ;
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
function mt_getRecentPostTitles ( $params ) {
global $xmlrpcusererr , $wpdb ;
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
$xblogid = $params -> getParam ( 0 );
$xuser = $params -> getParam ( 1 );
$xpass = $params -> getParam ( 2 );
$xnumposts = $params -> getParam ( 3 );
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
$blogid = $xblogid -> scalarval ();
$username = $xuser -> scalarval ();
$password = $xpass -> scalarval ();
$numposts = intval ( $xnumposts -> scalarval ());
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
if ( user_pass_ok ( $username , $password )) {
$sql = " SELECT post_date, post_date_gmt, post_author, ID, post_title FROM $wpdb->posts ORDER BY post_date_gmt DESC LIMIT $numposts " ;
$posts = $wpdb -> get_results ( $sql , ARRAY_A );
foreach ( $posts as $post ) {
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
$post_date = mysql2date ( 'Ymd\TH:i:s\Z' , $post [ 'post_date_gmt' ]);
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
$struct [ 'dateCreated' ] = new xmlrpcval ( $post_date , 'dateTime.iso8601' );
$struct [ 'userid' ] = new xmlrpcval ( $post [ 'post_author' ], 'string' );
$struct [ 'postid' ] = new xmlrpcval ( $post [ 'ID' ], 'string' );
$struct [ 'title' ] = new xmlrpcval ( $post [ 'post_title' ], 'string' );
$result [] = $struct ;
2004-09-16 10:54:25 -04:00
}
2004-09-17 16:48:43 -04:00
return new xmlrpcresp ( new xmlrpcval ( $results , 'array' ));
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
} else {
return new xmlrpcresp ( 0 , $xmlrpcerruser + 3 , // user error 3
'Wrong username/password combination ' . $username . ' / ' . starify ( $password ));
2004-09-16 10:54:25 -04:00
}
2004-09-17 16:48:43 -04:00
}
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
$mt_supportedTextFilters_sig = array ( array ( $xmlrpcArray ));
$mt_supportedTextFilters_doc = " Retrieve information about the text formatting plugins supported by the server. (not implemented) " ;
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
function mt_supportedTextFilters ( $params ) {
// This should probably check the status of the 'use_bbcode'
// and 'use_gmcode' config options.
return new xmlrpcresp ( new xmlrpcval ( array (), 'array' ));
}
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
$mt_getTrackbackPings_sig = array ( array ( $xmlrpcArray , $xmlrpcString ));
$mt_getTrackbackPings_doc = " Retrieve the list of Trackback pings posted to a particular entry. (not implemented) " ;
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
function mt_getTrackbackPings ( $params ) {
$struct [ 'pingTitle' ] = '' ;
$struct [ 'pingURL' ] = '' ;
$struct [ 'pingIP' ] = '' ;
$xmlstruct = phpxmlrpc_encode ( $struct );
return new xmlrpcresp ( new xmlrpcval ( array ( $xmlstruct ), 'array' ));
}
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
/**** /MovableType API ****/
2004-09-16 10:54:25 -04:00
2004-09-17 16:48:43 -04:00
/**** PingBack functions ****/
2004-09-16 09:26:06 -04:00
2004-09-17 16:48:43 -04:00
$pingback_ping_sig = array ( array ( $xmlrpcString , $xmlrpcString , $xmlrpcString ));
2004-09-16 09:26:06 -04:00
2004-09-17 16:48:43 -04:00
$pingback_ping_doc = 'Gets a pingback and registers it as a comment prefixed by <pingback />' ;
2004-09-16 09:26:06 -04:00
2004-09-17 16:48:43 -04:00
function pingback_ping ( $m ) { // original code by Mort
// (http://mort.mine.nu:8080)
global $wpdb , $wp_version ;
2004-09-16 09:26:06 -04:00
2004-09-17 16:48:43 -04:00
//$log = debug_fopen('./xmlrpc.log', 'w');
2004-09-16 09:26:06 -04:00
2004-09-17 16:48:43 -04:00
$title = '' ;
2004-09-16 09:26:06 -04:00
2004-09-17 16:48:43 -04:00
$pagelinkedfrom = $m -> getParam ( 0 );
$pagelinkedfrom = $pagelinkedfrom -> scalarval ();
2004-09-16 09:26:06 -04:00
2004-09-17 16:48:43 -04:00
$pagelinkedto = $m -> getParam ( 1 );
$pagelinkedto = $pagelinkedto -> scalarval ();
$pagelinkedfrom = str_replace ( '&' , '&' , $pagelinkedfrom );
$pagelinkedto = preg_replace ( '#&([^amp\;])#is' , '&$1' , $pagelinkedto );
//debug_fwrite($log, 'BEGIN '.time().' - '.date('Y-m-d H:i:s')."\n\n");
//debug_fwrite($log, 'Page linked from: '.$pagelinkedfrom."\n");
//debug_fwrite($log, 'Page linked to: '.$pagelinkedto."\n");
$messages = array (
htmlentities ( " Pingback from " . $pagelinkedfrom . " to "
. $pagelinkedto . " registered. Keep the web talking! :-) " ),
htmlentities ( " We can't find the URL to the post you are trying to "
. " link to in your entry. Please check how you wrote the post's permalink in your entry. " ),
htmlentities ( " We can't find the post you are trying to link to. "
. " Please check the post's permalink. " )
);
$message = $messages [ 0 ];
2004-09-16 09:26:06 -04:00
2004-09-17 16:48:43 -04:00
// Check if the page linked to is in our site
$pos1 = strpos ( $pagelinkedto , str_replace ( 'http://' , '' , str_replace ( 'www.' , '' , get_settings ( 'home' ))));
if ( $pos1 ) {
2004-09-16 09:26:06 -04:00
// let's find which post is linked to
$urltest = parse_url ( $pagelinkedto );
if ( $post_ID = url_to_postid ( $pagelinkedto )) {
$way = 'url_to_postid()' ;
2004-09-17 16:48:43 -04:00
}
elseif ( preg_match ( '#p/[0-9]{1,}#' , $urltest [ 'path' ], $match )) {
2004-09-16 09:26:06 -04:00
// the path defines the post_ID (archives/p/XXXX)
$blah = explode ( '/' , $match [ 0 ]);
$post_ID = $blah [ 1 ];
$way = 'from the path' ;
} elseif ( preg_match ( '#p=[0-9]{1,}#' , $urltest [ 'query' ], $match )) {
// the querystring defines the post_ID (?p=XXXX)
$blah = explode ( '=' , $match [ 0 ]);
$post_ID = $blah [ 1 ];
$way = 'from the querystring' ;
} elseif ( isset ( $urltest [ 'fragment' ])) {
// an #anchor is there, it's either...
if ( intval ( $urltest [ 'fragment' ])) {
// ...an integer #XXXX (simpliest case)
$post_ID = $urltest [ 'fragment' ];
$way = 'from the fragment (numeric)' ;
} elseif ( preg_match ( '/post-[0-9]+/' , $urltest [ 'fragment' ])) {
// ...a post id in the form 'post-###'
$post_ID = preg_replace ( '/[^0-9]+/' , '' , $urltest [ 'fragment' ]);
$way = 'from the fragment (post-###)' ;
} elseif ( is_string ( $urltest [ 'fragment' ])) {
// ...or a string #title, a little more complicated
$title = preg_replace ( '/[^a-zA-Z0-9]/' , '.' , $urltest [ 'fragment' ]);
$sql = " SELECT ID FROM $wpdb->posts WHERE post_title RLIKE ' $title ' " ;
2004-09-17 16:48:43 -04:00
$post_ID = $wpdb -> get_var ( $sql ) or die ( " Query: $sql\n\nError : " );
2004-09-16 09:26:06 -04:00
$way = 'from the fragment (title)' ;
}
} else {
// TODO: Attempt to extract a post ID from the given URL
2004-09-17 16:48:43 -04:00
$post_ID = - 1 ;
$way = 'no match' ;
2004-09-16 09:26:06 -04:00
}
logIO ( " O " , " (PB) URI=' $pagelinkedto ' ID=' $post_ID ' Found=' $way ' " );
2004-09-17 16:48:43 -04:00
//debug_fwrite($log, "Found post ID $way: $post_ID\n");
2004-09-16 09:26:06 -04:00
2004-09-17 16:48:43 -04:00
$sql = 'SELECT post_author FROM ' . $wpdb -> posts . ' WHERE ID = ' . $post_ID ;
2004-09-16 09:26:06 -04:00
$result = $wpdb -> get_results ( $sql );
if ( $wpdb -> num_rows ) {
2004-09-17 16:48:43 -04:00
//debug_fwrite($log, 'Post exists'."\n");
2004-09-16 09:26:06 -04:00
2004-09-17 16:48:43 -04:00
// Let's check that the remote site didn't already pingback this entry
$sql = 'SELECT * FROM ' . $wpdb -> comments . '
WHERE comment_post_ID = '.$post_ID.'
AND comment_author_url = \ '' . $pagelinkedfrom . ' \ '
AND comment_content LIKE \ '%<pingback />%\'' ;
$result = $wpdb -> get_results ( $sql );
if ( $wpdb -> num_rows || ( 1 == 1 )) {
2004-09-16 09:26:06 -04:00
2004-09-17 16:48:43 -04:00
// very stupid, but gives time to the 'from' server to publish !
sleep ( 1 );
2004-09-16 11:20:39 -04:00
2004-09-17 16:48:43 -04:00
// Let's check the remote site
$fp = @ fopen ( $pagelinkedfrom , 'r' );
2004-09-16 11:20:39 -04:00
2004-09-17 16:48:43 -04:00
$puntero = 4096 ;
while ( $remote_read = fread ( $fp , $puntero )) {
$linea .= $remote_read ;
}
// Work around bug in strip_tags():
$linea = str_replace ( '<!DOCTYPE' , '<DOCTYPE' , $linea );
$linea = strip_tags ( $linea , '<title><a>' );
$linea = strip_all_but_one_link ( $linea , $pagelinkedto );
// I don't think we need this? -- emc3
//$linea = preg_replace('#&([^amp\;])#is', '&$1', $linea);
if ( empty ( $matchtitle )) {
preg_match ( '|<title>([^<]*?)</title>|is' , $linea , $matchtitle );
}
$pos2 = strpos ( $linea , $pagelinkedto );
$pos3 = strpos ( $linea , str_replace ( 'http://www.' , 'http://' , $pagelinkedto ));
if ( is_integer ( $pos2 ) || is_integer ( $pos3 )) {
//debug_fwrite($log, 'The page really links to us :)'."\n");
$pos4 = ( is_integer ( $pos2 )) ? $pos2 : $pos3 ;
$start = $pos4 - 100 ;
$context = substr ( $linea , $start , 250 );
$context = str_replace ( " \n " , ' ' , $context );
$context = str_replace ( '&' , '&' , $context );
} else {
//debug_fwrite($log, 'The page doesn\'t link to us, here\'s an excerpt :'."\n\n".$linea."\n\n");
}
//}
//debug_fwrite($log, '*****'."\n\n");
fclose ( $fp );
if ( ! empty ( $context )) {
// Check if pings are on, inelegant exit
$pingstatus = $wpdb -> get_var ( " SELECT ping_status FROM $wpdb->posts WHERE ID = $post_ID " );
if ( 'closed' == $pingstatus ) die ( 'Sorry, pings are turned off for this post.' );
$pagelinkedfrom = preg_replace ( '#&([^amp\;])#is' , '&$1' , $pagelinkedfrom );
$title = ( ! strlen ( $matchtitle [ 1 ])) ? $pagelinkedfrom : $matchtitle [ 1 ];
$original_context = strip_tags ( $context );
$context = '<pingback />[...] ' ;
$context = htmlspecialchars ( $original_context );
$context .= ' [...]' ;
$original_pagelinkedfrom = $pagelinkedfrom ;
$pagelinkedfrom = addslashes ( $pagelinkedfrom );
$original_title = $title ;
$title = addslashes ( strip_tags ( trim ( $title )));
$user_ip = $_SERVER [ 'REMOTE_ADDR' ];
$user_agent = addslashes ( $_SERVER [ 'HTTP_USER_AGENT' ]);
$now = current_time ( 'mysql' );
$now_gmt = current_time ( 'mysql' , 1 );
if ( check_comment ( $title , '' , $pagelinkedfrom , $context , $user_ip , $user_agent ) ) {
$approved = 1 ;
} else {
$approved = 0 ;
}
$consulta = $wpdb -> query ( " INSERT INTO $wpdb->comments
( comment_post_ID , comment_author , comment_author_url , comment_author_IP , comment_date , comment_date_gmt , comment_content , comment_approved , comment_agent )
VALUES
( $post_ID , '$title' , '$pagelinkedfrom' , '$user_ip' , $now ', ' $now_gmt ', ' $context ', ' $approved ', ' $user_agent ' )
" );
$comment_ID = $wpdb -> get_var ( 'SELECT last_insert_id()' );
if ( get_settings ( 'comments_notify' ))
wp_notify_postauthor ( $comment_ID , 'pingback' );
do_action ( 'pingback_post' , $comment_ID );
} else {
// URL pattern not found
$message = " Page linked to: $pagelinkedto\nPage linked from: "
. " $pagelinkedfrom\nTitle : $title\nContext : $context\n\n " . $messages [ 1 ];
}
} else {
// We already have a Pingback from this URL
$message = " Sorry, you already did a pingback to $pagelinkedto "
. " from $pagelinkedfrom . " ;
2004-09-16 11:20:39 -04:00
}
2004-09-17 16:48:43 -04:00
} else {
// Post_ID not found
$message = $messages [ 2 ];
//debug_fwrite($log, 'Post doesn\'t exist'."\n");
2004-09-16 11:20:39 -04:00
}
}
2004-09-17 16:48:43 -04:00
return new xmlrpcresp ( new xmlrpcval ( $message ));
2004-05-23 12:42:23 -04:00
}
2004-05-23 00:02:53 -04:00
2004-09-17 16:48:43 -04:00
/**** /PingBack functions ****/
/**** SERVER FUNCTIONS ARRAY ****/
$dispatch_map =
array ( " blogger.newPost " =>
array ( " function " => " bloggernewpost " ,
" signature " => $bloggernewpost_sig ,
" docstring " => $bloggernewpost_doc ),
" blogger.editPost " =>
array ( " function " => " bloggereditpost " ,
" signature " => $bloggereditpost_sig ,
" docstring " => $bloggereditpost_doc ),
" blogger.deletePost " =>
array ( " function " => " bloggerdeletepost " ,
" signature " => $bloggerdeletepost_sig ,
" docstring " => $bloggerdeletepost_doc ),
" blogger.getUsersBlogs " =>
array ( " function " => " bloggergetusersblogs " ,
" signature " => $bloggergetusersblogs_sig ,
" docstring " => $bloggergetusersblogs_doc ),
" blogger.getUserInfo " =>
array ( " function " => " bloggergetuserinfo " ,
" signature " => $bloggergetuserinfo_sig ,
" docstring " => $bloggergetuserinfo_doc ),
" blogger.getPost " =>
array ( " function " => " bloggergetpost " ,
" signature " => $bloggergetpost_sig ,
" docstring " => $bloggergetpost_doc ),
" blogger.getRecentPosts " =>
array ( " function " => " bloggergetrecentposts " ,
" signature " => $bloggergetrecentposts_sig ,
" docstring " => $bloggergetrecentposts_doc ),
" blogger.getTemplate " =>
array ( " function " => " bloggergettemplate " ,
" signature " => $bloggergettemplate_sig ,
" docstring " => $bloggergettemplate_doc ),
" blogger.setTemplate " =>
array ( " function " => " bloggersettemplate " ,
" signature " => $bloggersettemplate_sig ,
" docstring " => $bloggersettemplate_doc ),
" metaWeblog.newPost " =>
array ( " function " => " mwnewpost " ,
" signature " => $mwnewpost_sig ,
" docstring " => $mwnewpost_doc ),
" metaWeblog.editPost " =>
array ( " function " => " mweditpost " ,
" signature " => $mweditpost_sig ,
" docstring " => $mweditpost_doc ),
" metaWeblog.getPost " =>
array ( " function " => " mwgetpost " ,
" signature " => $mwgetpost_sig ,
" docstring " => $mwgetpost_doc ),
" metaWeblog.getRecentPosts " =>
array ( " function " => " mwrecentposts " ,
" signature " => $mwrecentposts_sig ,
" docstring " => $mwrecentposts_doc ),
" metaWeblog.getCategories " =>
array ( " function " => " mwgetcats " ,
" signature " => $mwgetcats_sig ,
" docstring " => $mwgetcats_doc ),
" metaWeblog.newMediaObject " =>
array ( " function " => " mwnewmedia " ,
" signature " => $mwnewmedia_sig ,
" docstring " => $mwnewmedia_doc ),
" mt.getCategoryList " =>
array ( " function " => " mwgetcats " ,
" signature " => $mwgetcats_sig ,
" docstring " => $mwgetcats_doc ),
" mt.getPostCategories " =>
array ( " function " => " mt_getPostCategories " ,
" signature " => $mt_getPostCategories_sig ,
" docstring " => $mt_getPostCategories_doc ),
" mt.setPostCategories " =>
array ( " function " => " mt_setPostCategories " ,
" signature " => $mt_setPostCategories_sig ,
" docstring " => $mt_setPostCategories_doc ),
" mt.publishPost " =>
array ( " function " => " mt_publishPost " ,
" signature " => $mt_publishPost_sig ,
" docstring " => $mt_publishPost_doc ),
" mt.supportedMethods " =>
array ( " function " => " mt_supportedMethods " ,
" signature " => $mt_supportedMethods_sig ,
" docstring " => $mt_supportedMethods_doc ),
" mt.supportedTextFilters " =>
array ( " function " => " mt_supportedTextFilters " ,
" signature " => $mt_supportedTextFilters_sig ,
" docstring " => $mt_supportedTextFilters_doc ),
" mt.getRecentPostTitles " =>
array ( " function " => " mt_getRecentPostTitles " ,
" signature " => $mt_getRecentPostTitles_sig ,
" docstring " => $mt_getRecentPostTitles_doc ),
" mt.getTrackbackPings " =>
array ( " function " => " mt_getTrackbackPings " ,
" signature " => $mt_getTrackbackPings_sig ,
" docstring " => $mt_getTrackbackPings_doc ),
" b2.newPost " =>
array ( " function " => " b2newpost " ,
" signature " => $wpnewpost_sig ,
" docstring " => $wpnewpost_doc ),
" b2.getCategories " =>
array ( " function " => " b2getcategories " ,
" signature " => $wpgetcategories_sig ,
" docstring " => $wpgetcategories_doc ),
" b2.ping " =>
array ( " function " => " b2ping " ,
" signature " => $wpping_sig ,
" docstring " => $wpping_doc ),
" pingback.ping " =>
array ( " function " => " pingback_ping " ,
" signature " => $pingback_ping_sig ,
" docstring " => $pingback_ping_doc ),
" b2.getPostURL " =>
array ( " function " => " pingback_getPostURL " ,
" signature " => $wp_getPostURL_sig ,
" docstring " => $wp_getPostURL_doc ),
);
$s = new xmlrpc_server ( $dispatch_map );
?>