Skip to content
Snippets Groups Projects
Commit db45ade1 authored by Prasath Nadarajah's avatar Prasath Nadarajah
Browse files

Ading all the files

parent b6c43583
Branches
No related tags found
No related merge requests found
.post-state {
visibility: hidden;
}
.row-actions .inline {
display: none;
}
<?php
// @TODO load all the classes dynamically
include_once( dirname( __FILE__ ) . '/class-wp-xmlrpc-client.php' );
include_once( dirname( __FILE__ ) . '/class-wp-rest-client.php' );
class wp_client_factory {
public static function get_client( $transport_type, $site_ID ) {
$class = $transport_type . '_client';
if( class_exists($class) ) {
return new $class( $site_ID );
}
throw new Exception('transport class not found');
}
public static function display_client_settings( $site, $class ) {
if( class_exists($class) ) {
return $class::display_settings( $site );
}
throw new Exception('transport class not found');
}
public static function save_client_settings( $site_ID, $class ) {
$class = $_POST['transport_type'] . '_client';
if( class_exists($class) ) {
return $class::save_settings( $site_ID );
}
throw new Exception('transport class not found');
}
}
\ No newline at end of file
<?php
include_once( dirname( __FILE__ ) . '/interface-wp-client.php' );
include_once( dirname( __FILE__ ) . '/push-syndicate-encryption.php' );
class wp_rest_client implements wp_client{
private $access_token;
private $blog_ID;
private $response;
private $error_message;
private $error_code;
private $port;
private $useragent;
private $timeout;
function __construct( $site_ID, $port = 80, $timeout = 45 ) {
$this->access_token = push_syndicate_decrypt( get_post_meta( $site_ID, 'syn_site_token', true) );
$this->blog_ID = get_post_meta( $site_ID, 'syn_site_id', true);
$this->timeout = $timeout;
$this->useragent = 'push syndication plugin';
$this->port = $port;
}
public function new_post( $post_ID ) {
$post = (array)get_post( $post_ID );
$response = wp_remote_post( 'https://public-api.wordpress.com/rest/v1/sites/' . $this->blog_ID . '/posts/new/', array(
'method' => 'POST',
'timeout' => $this->timeout,
'user-agent' => $this->useragent,
'sslverify' => false,
'headers' => array (
'authorization' => 'Bearer ' . $this->access_token,
'Content-Type' => 'application/x-www-form-urlencoded'
),
'body' => array (
'title' => $post['post_title'],
'content' => $post['post_content'],
'excerpt' => $post['post_excerpt'],
'status' => $post['post_status'],
'password' => $post['post_password'],
'categories' => $this->_prepare_terms( wp_get_object_terms( $post_ID, 'category', array('fields' => 'names') ) ),
'tags' => $this->_prepare_terms( wp_get_object_terms( $post_ID, 'post_tag', array('fields' => 'names') ) )
),
) );
if ( is_wp_error( $response ) ) {
$this->error_message = 'HTTP connection error!!';
return false;
}
$response = json_decode( wp_remote_retrieve_body( $response ) );
if( empty($response->error) ) {
$this->response = $response->ID;
return true;
} else {
$this->error_message = $response->message;
return false;
}
}
public function edit_post( $post_ID, $ext_ID ) {
$post = (array)get_post( $post_ID );
$response = wp_remote_post( 'https://public-api.wordpress.com/rest/v1/sites/' . $this->blog_ID . '/posts/' . $ext_ID . '/', array(
'method' => 'POST',
'timeout' => $this->timeout,
'user-agent' => $this->useragent,
'sslverify' => false,
'headers' => array (
'authorization' => 'Bearer ' . $this->access_token,
'Content-Type' => 'application/x-www-form-urlencoded'
),
'body' => array (
'title' => $post['post_title'],
'content' => $post['post_content'],
'excerpt' => $post['post_excerpt'],
'status' => $post['post_status'],
'password' => $post['post_password'],
'categories' => $this->_prepare_terms( wp_get_object_terms( $post_ID, 'category', array('fields' => 'names') ) ),
'tags' => $this->_prepare_terms( wp_get_object_terms( $post_ID, 'post_tag', array('fields' => 'names') ) )
),
) );
if ( is_wp_error( $response ) ) {
$this->error_message = 'HTTP connection error!!';
return false;
}
$response = json_decode( wp_remote_retrieve_body( $response ) );
if( empty($response->error) ) {
return true;
} else {
$this->error_message = $response->message;
return false;
}
}
// get an array of values and convert it to CSV
function _prepare_terms( $terms ) {
$terms_csv = '';
foreach( $terms as $term ) {
$terms_csv .= $term . ',';
}
return $terms_csv;
}
public function delete_post( $ext_ID ) {
$response = wp_remote_post( 'https://public-api.wordpress.com/rest/v1/sites/' . $this->blog_ID . '/posts/' . $ext_ID . '/delete', array(
'method' => 'POST',
'timeout' => $this->timeout,
'user-agent' => $this->useragent,
'sslverify' => false,
'headers' => array (
'authorization' => 'Bearer ' . $this->access_token,
),
) );
if ( is_wp_error( $response ) ) {
$this->error_message = 'HTTP connection error!!';
return false;
}
$response = json_decode( wp_remote_retrieve_body( $response ) );
if( empty($response->error) ) {
return true;
} else {
$this->error_message = $response->message;
return false;
}
}
public function test_connection() {
// @TODo find a better method
$response = wp_remote_post( 'https://public-api.wordpress.com/rest/v1/me/?pretty=1', array(
'method' => 'GET',
'timeout' => $this->timeout,
'user-agent' => $this->useragent,
'sslverify' => false,
'headers' => array (
'authorization' => 'Bearer ' . $this->access_token,
),
) );
if ( is_wp_error( $response ) ) {
$this->error_message = 'HTTP connection error!!';
// @TODO error validation and error messages
return false;
}
$response = json_decode( wp_remote_retrieve_body( $response ) );
if( empty( $response->error ) ) {
return true;
} else {
$this->error_message = $response->message;
return false;
}
}
public function is_post_exists( $post_ID ) {
$response = wp_remote_post( 'https://public-api.wordpress.com/rest/v1/sites/' . $this->blog_ID . '/posts/' . $post_ID . '/?pretty=1', array(
'method' => 'GET',
'timeout' => $this->timeout,
'user-agent' => $this->useragent,
'sslverify' => false,
'headers' => array (
'authorization' => 'Bearer ' . $this->access_token,
),
) );
if ( is_wp_error( $response ) ) {
$this->error_message = 'HTTP connection error!!';
return false;
}
$response = json_decode( wp_remote_retrieve_body( $response ) );
if( empty($response->error) ) {
return true;
} else {
$this->error_message = $response->message;
return false;
}
}
public function get_response() {
return $this->response;
}
public function get_error_code() {
return $this->error_code;
}
public function get_error_message() {
return $this->error_message;
}
public static function display_settings( $post ) {
$site_token = push_syndicate_decrypt( get_post_meta( $post->ID, 'syn_site_token', true) );
$site_id = get_post_meta( $post->ID, 'syn_site_id', true);
$site_url = get_post_meta( $post->ID, 'syn_site_url', true);
// @TODO refresh UI
?>
<p>
To generate the following information automatically please visit the <a href="<?php echo get_admin_url(); ?>/options-general.php?page=push-syndicate-settings" target="_blank">settings page</a>
</p>
<p>
<label for=site_token>Enter API Token</label>
</p>
<p>
<input type="text" name="site_token" id="site_token" size="100" value="<?php echo esc_html( $site_token ); ?>" />
</p>
<p>
<label for=site_id>Enter Blog ID</label>
</p>
<p>
<input type="text" name="site_id" id="site_id" size="100" value="<?php echo esc_html( $site_id ); ?>" />
</p>
<p>
<label for=site_url>Enter a valid Blog URL</label>
</p>
<p>
<input type="text" name="site_url" id="site_url" size="100" value="<?php echo esc_html( $site_url ); ?>" />
</p>
<?php
}
public static function save_settings( $site_ID ) {
update_post_meta( $site_ID, 'syn_site_token', push_syndicate_encrypt( sanitize_text_field( $_POST['site_token'] ) ) );
update_post_meta( $site_ID, 'syn_site_id', sanitize_text_field( $_POST['site_id'] ) );
update_post_meta( $site_ID, 'syn_site_url', sanitize_text_field( $_POST['site_url'] ) );
return true;
}
}
\ No newline at end of file
<?php
include_once( ABSPATH . 'wp-includes/class-IXR.php' );
include_once( ABSPATH . 'wp-includes/class-wp-http-ixr-client.php' );
include_once( dirname( __FILE__ ) . '/interface-wp-client.php' );
include_once( dirname( __FILE__ ) . '/push-syndicate-encryption.php' );
class wp_xmlrpc_client extends WP_HTTP_IXR_Client implements wp_client {
private $username;
private $password;
function __construct( $site_ID ) {
// @TODO check port, timeout etc
$server = untrailingslashit( get_post_meta( $site_ID, 'syn_site_url', true ) );
$server = esc_url_raw( $server . '/xmlrpc.php' );
parent::__construct( $server );
$this->username = get_post_meta( $site_ID, 'syn_site_username', true);
$this->password = push_syndicate_decrypt( get_post_meta( $site_ID, 'syn_site_password', true) );
}
public function new_post( $post_ID ) {
$post = (array)get_post( $post_ID );
// rearranging arguments
$args = array();
$args['post_title'] = $post['post_title'];
$args['post_content'] = $post['post_content'];
$args['post_excerpt'] = $post['post_excerpt'];
$args['post_status'] = $post['post_status'];
$args['post_type'] = $post['post_type'];
$args['wp_password'] = $post['post_password'];
// @TODO extend this to custom taxonomies
$args['terms_names'] = array(
'category' => wp_get_object_terms( $post_ID, 'category', array('fields' => 'names') ),
'post_tag' => wp_get_object_terms( $post_ID, 'post_tag', array('fields' => 'names') )
);
// post meta
$custom_fields= array();
$custom_fields[] = array( 'key' => 'masterpost_url', 'value' => $post['guid'] );
$args['custom_fields'] = $custom_fields;
$result = $this->query(
'wp.newPost',
'1',
$this->username,
$this->password,
$args
);
if( !$result ) {
return false;
}
return true;
}
public function edit_post( $post_ID, $ext_ID ) {
$post = (array)get_post( $post_ID );
// rearranging arguments
$args = array();
$args['post_title'] = $post['post_title'];
$args['post_content'] = $post['post_content'];
$args['post_excerpt'] = $post['post_excerpt'];
$args['post_status'] = $post['post_status'];
$args['post_type'] = $post['post_type'];
$args['wp_password'] = $post['post_password'];
// @TODO extend this to custom taxonomies
$args['terms_names'] = array(
'category' => wp_get_object_terms( $post_ID, 'category', array('fields' => 'names') ),
'post_tag' => wp_get_object_terms( $post_ID, 'post_tag', array('fields' => 'names') )
);
// post meta
$custom_fields= array();
$custom_fields[] = array( 'key' => 'masterpost_url', 'value' => $post['guid'] );
$args['custom_fields'] = $custom_fields;
$result = $this->query(
'wp.editPost',
'1',
$this->username,
$this->password,
$ext_ID,
$args
);
if( !$result ) {
return false;
}
return true;
}
public function delete_post( $ext_ID ) {
$result = $this->query(
'wp.deletePost',
'1',
$this->username,
$this->password,
$ext_ID
);
if( !$result ) {
return false;
}
return true;
}
public function test_connection() {
$result = $this->query(
'wp.getPostTypes', // @TODO find a better suitable function
'1',
$this->username,
$this->password
);
if( !$result ) {
$error_code = absint($this->get_error_code());
switch( $error_code ) {
case 32301:
add_filter('redirect_post_location', create_function( '$location', 'return add_query_arg("message", 305, $location);' ) );
break;
case 401:
add_filter('redirect_post_location', create_function( '$location', 'return add_query_arg("message", 302, $location);' ) );
break;
case 403:
add_filter('redirect_post_location', create_function( '$location', 'return add_query_arg("message", 303, $location);' ) );
break;
case 405:
add_filter('redirect_post_location', create_function( '$location', 'return add_query_arg("message", 304, $location);' ) );
break;
default:
add_filter('redirect_post_location', create_function( '$location', 'return add_query_arg("message", 306, $location);' ) );
break;
}
return false;
}
return true;
}
public function is_post_exists( $ext_ID ) {
$result = $this->query(
'wp.getPost',
'1',
$this->username,
$this->password,
$ext_ID
);
if( !$result ) {
return false;
}
$post = $this->getResponse();
if( $ext_ID != $post['post_id'] ) {
return false;
}
return true;
}
public function get_response() {
return parent::getResponse();
}
public function get_error_code() {
return parent::getErrorCode();
}
public function get_error_message() {
return parent::getErrorMessage();
}
public static function display_settings( $site ) {
$site_url = get_post_meta( $site->ID, 'syn_site_url', true);
$site_username = get_post_meta( $site->ID, 'syn_site_username', true);
$site_password = push_syndicate_decrypt( get_post_meta( $site->ID, 'syn_site_password', true) );
// @TODO refresh UI
?>
<p>
<label for=site_url>Enter a valid site URL</label>
</p>
<p>
<input type="text" name="site_url" id="site_url" size="100" value="<?php echo esc_html( $site_url ); ?>" />
</p>
<p>
<label for="site_username">Enter Username</label>
</p>
<p>
<input type="text" name="site_username" id="site_username" size="100" value="<?php echo esc_html( $site_username ); ?>" />
</p>
<p>
<label>Enter Password</label>
</p>
<p>
<input type="password" name="site_password" id="site_password" size="100" autocomplete="off" value="<?php echo esc_html( $site_password ); ?>" />
</p>
<?php
}
public static function save_settings( $site_ID ) {
str_replace( '/xmlrpc.php', '', $_POST['site_url'] );
update_post_meta( $site_ID, 'syn_site_url', esc_url_raw( $_POST['site_url'] ) );
update_post_meta( $site_ID, 'syn_site_username', sanitize_text_field( $_POST['site_username'] ) );
update_post_meta( $site_ID, 'syn_site_password', push_syndicate_encrypt( sanitize_text_field( $_POST['site_password'] ) ) );
if( !filter_var( $_POST['site_url'], FILTER_VALIDATE_URL ) ) {
add_filter('redirect_post_location', create_function( '$location', 'return add_query_arg("message", 301, $location);' ) );
return false;
}
return true;
}
}
\ No newline at end of file
<?php
interface wp_client {
/**
* Creates a new post in the slave site.
*
* @param int $post_ID The post ID to push.
*
* @return boolean true on success false on failure.
*/
public function new_post( $post_ID );
/**
* Edits an existing post in the slave site.
*
* @param int $post_ID The post ID to push.
* @param int $ext_ID Slave post ID to edit.
*
* @return boolean true on success false on failure.
*/
public function edit_post( $post_ID, $ext_ID );
/**
* Deletes an existing post in the slave site.
*
* @param int $ext_ID Slave post ID to delete.
*
* @return boolean true on success false on failure.
*/
public function delete_post( $ext_ID );
/**
* Test the connection with the slave site.
*
* @return boolean true on success false on failure.
*/
public function test_connection();
/**
* Checks whether the given post exists in the slave site.
*
* @param int $ext_ID Slave post ID to check.
*
* @return boolean true on success false on failure.
*/
public function is_post_exists( $ext_ID );
/**
* Get the response message sent from the slave site.
*
* @return string response message.
*/
public function get_response();
/**
* Get the error code.
*
* @return int error code.
*/
public function get_error_code();
/**
* Get the error message sent from the slave site.
*
* @return string error message.
*/
public function get_error_message();
/**
* Display the client settings for the slave site.
*
* @param object $site The site object to display settings.
*/
public static function display_settings( $site );
/**
* Save the client settings for the slave site.
*
* @param int $site_ID The site ID to save settings.
*
* @return boolean true on success false on failure.
*/
public static function save_settings( $site_ID );
}
\ No newline at end of file
<?php
function push_syndicate_encrypt( $data ) {
$data = serialize( $data );
return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5(PUSH_SYNDICATE_KEY), $data, MCRYPT_MODE_CBC, md5(md5(PUSH_SYNDICATE_KEY))));
}
function push_syndicate_decrypt( $data ) {
$data = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5(PUSH_SYNDICATE_KEY), base64_decode($data), MCRYPT_MODE_CBC, md5(md5(PUSH_SYNDICATE_KEY))), "\0");
if ( !$data )
return false;
return @unserialize( $data );
}
\ No newline at end of file
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment