Merge pull request #4 from cryptochangements34/master

Add server authentication, request an user or a password.
This commit is contained in:
serhack 2017-07-24 08:50:55 +02:00 committed by GitHub
commit 58f4921731
3 changed files with 43 additions and 19 deletions

View File

@ -6,7 +6,7 @@ This plugin is rather simple but there are a few things that need to be set up b
* A web server! Ideally with the most recent versions of PHP and mysql * A web server! Ideally with the most recent versions of PHP and mysql
* The Monero wallet-cli and Moenro wallet-rpc tools found [here](https://getmonero.org/downloads/) * The Monero wallet-cli and Monero wallet-rpc tools found [here](https://getmonero.org/downloads/)
* [WordPress](https://wordpress.org) * [WordPress](https://wordpress.org)
Wordpress is the backend tool that is needed to use WooCommerce and this Monero plugin Wordpress is the backend tool that is needed to use WooCommerce and this Monero plugin
@ -15,19 +15,19 @@ Wordpress is the backend tool that is needed to use WooCommerce and this Monero
This Monero plugin is an extension of WooCommerce, which works with WordPress This Monero plugin is an extension of WooCommerce, which works with WordPress
## Step 1: Activating the plugin ## Step 1: Activating the plugin
* Downloading: First of all, you will need to download the plugin. This can be done by typing `git clone https://github.com/monero-integrations/monerowp.git` or can be downloaded as a zip file from the GitHub web page. * Downloading: First of all, you will need to download the plugin. This can be done with the command `git clone https://github.com/monero-integrations/monerowp.git` or can be downloaded as a zip file from the GitHub web page.
* Put the plugin in the correct directory: You will need to put the folder named `monero` from this repo into the wordpress plugins directory. This can be found at `path/to/wordpress/folder/wp-content/plugins` * Put the plugin in the correct directory: You will need to put the folder named `monero` from this repo into the wordpress plugins directory. This can be found at `path/to/wordpress/folder/wp-content/plugins`
* Ativate the plugin from the WordPress admin panel: Once you login to the admin panel in WordPress, click on "Installed Plugins" under "Plugins". Then simply click "Activate" where it says "Monero - WooCommerce Gateway" * Activate the plugin from the WordPress admin panel: Once you login to the admin panel in WordPress, click on "Installed Plugins" under "Plugins". Then simply click "Activate" where it says "Monero - WooCommerce Gateway"
## Step 2: Setup the Monero Wallet RPC ## Step 2: Setup the Monero Wallet RPC
* Setup a monero wallet using the moenro-wallet-cli tool. If you do not knwo how to do this you can learn about it at [getmonero.org](https://getmonero.org/resources/user-guides/monero-wallet-cli.html) * Setup a monero wallet using the monero-wallet-cli tool. If you do not know how to do this you can learn about it at [getmonero.org](https://getmonero.org/resources/user-guides/monero-wallet-cli.html)
* Start the monero daemon on your server and leave it running in the background. This can be accomplished by running `./monerod` inside your monero downloads folder. * Start the monero daemon on your server and leave it running in the background. This can be accomplished by running `./monerod` inside your monero downloads folder.
* Start the Wallet RPC and leave it running in the background. This can be accomplished by running `monero-wallet-rpc --rpc-bind-port 18081 --disable-rpc-login --wallet-file /path/walletfile` where "/path/walletfile" is your actual wallet file. * Start the Wallet RPC and leave it running in the background. This can be accomplished by running `monero-wallet-rpc --rpc-bind-port 18081 --rpc-login username:password --wallet-file /path/walletfile` where "username:password" is the username and password that you want to use, seperated by a colon and "/path/walletfile" is your actual wallet file.
## Step 3: Setup Monero Gateway in WooCommerce ## Step 3: Setup Monero Gateway in WooCommerce
@ -45,4 +45,9 @@ This Monero plugin is an extension of WooCommerce, which works with WordPress
* Enter the port number of the Wallet RPC in the box labeled "Daemon PORT" (will be `18081` if you used the above example). * Enter the port number of the Wallet RPC in the box labeled "Daemon PORT" (will be `18081` if you used the above example).
* Enter the username and password that you want to use in their respective feilds
* Click on "Save changes" * Click on "Save changes"
## Info on server authentication
It is reccommended that you specify a username/password with your wallet rpc. This can be done by starting your wallet rpc with `monero-wallet-rpc --rpc-bind-port 18081 --rpc-login username:password --wallet-file /path/walletfile` where "username:password" is the username and password that you want to use, seperated by a colon. Alternatively, you can use the `--restricted-rpc` flag with the wallet rpc like so `./monero-wallet-rpc --testnet --rpc-bind-port 18081 --restricted-rpc --wallet-file wallet/path`.

View File

@ -4,7 +4,6 @@
class Monero_Gateway extends WC_Payment_Gateway class Monero_Gateway extends WC_Payment_Gateway
{ {
private $monero_daemon; private $monero_daemon;
function __construct() function __construct()
{ {
@ -21,6 +20,8 @@ class Monero_Gateway extends WC_Payment_Gateway
$this->host = $this->get_option('daemon_host'); $this->host = $this->get_option('daemon_host');
$this->port = $this->get_option('daemon_port'); $this->port = $this->get_option('daemon_port');
$this->address = $this->get_option('monero_address'); $this->address = $this->get_option('monero_address');
$this->username = $this->get_option('username');
$this->password = $this->get_option('password');
// After init_settings() is called, you can get the settings and load them into variables, e.g: // After init_settings() is called, you can get the settings and load them into variables, e.g:
// $this->title = $this->get_option('title' ); // $this->title = $this->get_option('title' );
@ -30,7 +31,7 @@ class Monero_Gateway extends WC_Payment_Gateway
foreach ($this->settings as $setting_key => $value) { foreach ($this->settings as $setting_key => $value) {
$this->$setting_key = $value; $this->$setting_key = $value;
} }
add_action('admin_notices', array( add_action('admin_notices', array(
$this, $this,
@ -44,7 +45,6 @@ class Monero_Gateway extends WC_Payment_Gateway
add_action('woocommerce_thankyou_' . $this->id, array( $this, 'instruction' ) ); add_action('woocommerce_thankyou_' . $this->id, array( $this, 'instruction' ) );
if (is_admin()) { if (is_admin()) {
@ -54,7 +54,7 @@ class Monero_Gateway extends WC_Payment_Gateway
'process_admin_options' 'process_admin_options'
)); ));
} }
$this->monero_daemon = new Monero_Library($this->host . ':' . $this->port . '/json_rpc'); $this->monero_daemon = new Monero_Library($this->host . ':' . $this->port . '/json_rpc', $this->username, $this->password);
} }
public function admin_options() public function admin_options()
@ -64,7 +64,7 @@ class Monero_Gateway extends WC_Payment_Gateway
echo "<table class='form-table'>"; echo "<table class='form-table'>";
$this->generate_settings_html(); $this->generate_settings_html();
echo "</table>"; echo "</table>";
echo "<h4>Learn more about using a password with the monero wallet-rpc <a href=\"https://github.com/cryptochangements34/monerowp/blob/master/README.md\">here</a></h4>";
} }
@ -98,7 +98,7 @@ class Monero_Gateway extends WC_Payment_Gateway
'type' => 'text', 'type' => 'text',
'desc_tip' => __('Monero Wallet Address', 'monero_gateway') 'desc_tip' => __('Monero Wallet Address', 'monero_gateway')
), ),
'daemon_host' => array( 'daemon_host' => array(
'title' => __('Daemon Host/ IP', 'monero_gateway'), 'title' => __('Daemon Host/ IP', 'monero_gateway'),
'type' => 'text', 'type' => 'text',
'desc_tip' => __('This is the Daemon Host/IP to authorize the payment with port', 'monero_gateway'), 'desc_tip' => __('This is the Daemon Host/IP to authorize the payment with port', 'monero_gateway'),
@ -110,14 +110,28 @@ class Monero_Gateway extends WC_Payment_Gateway
'desc_tip' => __('This is the Daemon Host/IP to authorize the payment with port', 'monero_gateway'), 'desc_tip' => __('This is the Daemon Host/IP to authorize the payment with port', 'monero_gateway'),
'default' => '18080', 'default' => '18080',
), ),
'username' => array(
'title' => __('username', 'monero_gateway'),
'desc_tip' => __('This is the username that you used with your monero wallet-rpc', 'monero_gateway'),
'type' => __('text'),
'default' => __('username')
),
'password' => array(
'title' => __('password', 'monero_gateway'),
'desc_tip' => __('This is the password that you used with your monero wallet-rpc', 'monero_gateway'),
'description' => __('you can leave these fields empty if you did not set', 'monero_gateway'),
'type' => __('text'),
'default' => __('password')
),
'environment' => array( 'environment' => array(
'title' => __(' Test Mode', 'monero_gateway'), 'title' => __(' Test Mode', 'monero_gateway'),
'label' => __('Enable Test Mode', 'monero_gateway'), 'label' => __('Enable Test Mode', 'monero_gateway'),
'type' => 'checkbox', 'type' => 'checkbox',
'description' => __('Place the payment gateway in test mode.', 'monero_gateway'), 'description' => __('Check this box if you are using testnet', 'monero_gateway'),
'default' => 'no' 'default' => 'no'
) ),
); );
} }
@ -193,7 +207,7 @@ class Monero_Gateway extends WC_Payment_Gateway
$payment_id = bin2hex(openssl_random_pseudo_bytes(8)); $payment_id = bin2hex(openssl_random_pseudo_bytes(8));
$uri = "monero:$address?amount=$amount?payment_id=$payment_id"; $uri = "monero:$address?amount=$amount?payment_id=$payment_id";
$array_integrated_address = $this->monero_daemon->make_integrated_address($payment_id); $array_integrated_address = $this->monero_daemon->make_integrated_address($payment_id);
// Generate a QR code // Generate a QR code
echo "<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css'>"; echo "<link rel='stylesheet' href='https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css'>";
@ -310,6 +324,5 @@ class Monero_Gateway extends WC_Payment_Gateway
}*/ }*/
} }
} }

View File

@ -11,7 +11,9 @@
*/ */
class Monero_Library class Monero_Library
{ {
protected $url = null, $is_debug = false, $parameters_structure = 'array'; protected $url = null, $is_debug = false, $parameters_structure = 'array';
private $username;
private $password;
protected $curl_options = array( protected $curl_options = array(
CURLOPT_CONNECTTIMEOUT => 8, CURLOPT_CONNECTTIMEOUT => 8,
CURLOPT_TIMEOUT => 8 CURLOPT_TIMEOUT => 8
@ -31,12 +33,14 @@ class Monero_Library
503 => '503 Service Unavailable' 503 => '503 Service Unavailable'
); );
public function __construct($pUrl) public function __construct($pUrl, $pUser, $pPass)
{ {
$this->validate(false === extension_loaded('curl'), 'The curl extension must be loaded for using this class!'); $this->validate(false === extension_loaded('curl'), 'The curl extension must be loaded for using this class!');
$this->validate(false === extension_loaded('json'), 'The json extension must be loaded for using this class!'); $this->validate(false === extension_loaded('json'), 'The json extension must be loaded for using this class!');
$this->url = $pUrl; $this->url = $pUrl;
$this->username = $pUser;
$this->password = $pPass;
} }
private function getHttpErrorMessage($pErrorNumber) private function getHttpErrorMessage($pErrorNumber)
@ -123,6 +127,8 @@ class Monero_Library
throw new RuntimeException('Could\'t initialize a cURL session'); throw new RuntimeException('Could\'t initialize a cURL session');
} }
curl_setopt($ch, CURLOPT_URL, $this->url); curl_setopt($ch, CURLOPT_URL, $this->url);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt($ch, CURLOPT_USERPWD, $this->username . ":" . $this->password);
curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $pRequest); curl_setopt($ch, CURLOPT_POSTFIELDS, $pRequest);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json')); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: application/json'));