diff --git a/public/include/autoloader.inc.php b/public/include/autoloader.inc.php index 8f8ea6dc..35ce807e 100644 --- a/public/include/autoloader.inc.php +++ b/public/include/autoloader.inc.php @@ -1,34 +1,40 @@ isMobile() && $config['website']['mobile']) { - // Set to mobile theme - $config['website']['mobile_theme'] ? $theme = $config['website']['mobile_theme'] : $theme = 'mobile'; -} else { - // Use configured theme, fallback to default theme - $config['website']['theme'] ? $theme = $config['website']['theme'] : $theme = 'mmcFE'; -} -define('THEME', $theme); - +// Default classes require_once(CLASS_DIR . '/debug.class.php'); require_once(CLASS_DIR . '/bitcoin.class.php'); require_once(CLASS_DIR . '/statscache.class.php'); require_once(CLASS_DIR . '/bitcoinwrapper.class.php'); require_once(INCLUDE_DIR . '/lib/KLogger.php'); require_once(INCLUDE_DIR . '/database.inc.php'); -require_once(INCLUDE_DIR . '/smarty.inc.php'); -// Load classes that need the above as dependencies + +// We need to load these two first require_once(CLASS_DIR . '/base.class.php'); +require_once(CLASS_DIR . '/setting.class.php'); + +// We need this one in here to properly set our theme +require_once(INCLUDE_DIR . '/lib/Mobile_Detect.php'); + +// Detect device +if ($detect->isMobile() && $setting->getValue('website_mobile_theme')) { + // Set to mobile theme + $setting->getValue('website_mobile_theme') ? $theme = $setting->getValue('website_mobile_theme') : $theme = 'mobile'; +} else { + // Use configured theme, fallback to default theme + $setting->getValue('website_theme') ? $theme = $setting->getValue('website_theme') : $theme = 'mmcFE'; +} +define('THEME', $theme); + +// Load smarty now that we have our theme defined +require_once(INCLUDE_DIR . '/smarty.inc.php'); + +// Load everything else in proper order require_once(CLASS_DIR . '/api.class.php'); require_once(CLASS_DIR . '/mail.class.php'); require_once(CLASS_DIR . '/tokentype.class.php'); require_once(CLASS_DIR . '/token.class.php'); require_once(CLASS_DIR . '/payout.class.php'); require_once(CLASS_DIR . '/block.class.php'); -require_once(CLASS_DIR . '/setting.class.php'); require_once(CLASS_DIR . '/monitoring.class.php'); require_once(CLASS_DIR . '/user.class.php'); require_once(CLASS_DIR . '/invitation.class.php'); @@ -40,3 +46,6 @@ require_once(CLASS_DIR . '/notification.class.php'); require_once(CLASS_DIR . '/news.class.php'); require_once(INCLUDE_DIR . '/lib/Michelf/Markdown.php'); require_once(INCLUDE_DIR . '/lib/scrypt.php'); + + +?> diff --git a/public/include/classes/api.class.php b/public/include/classes/api.class.php index 36374162..e1403ee5 100644 --- a/public/include/classes/api.class.php +++ b/public/include/classes/api.class.php @@ -8,7 +8,7 @@ if (!defined('SECURITY')) die('Hacking attempt'); **/ class Api extends Base { function isActive($error=true) { - if (!$this->config['website']['api']['disabled']) { + if (!$this->setting->getValue('disable_api')) { return true; } else { if ($error == true) { @@ -21,3 +21,4 @@ class Api extends Base { $api = new Api(); $api->setConfig($config); +$api->setSetting($setting); diff --git a/public/include/classes/base.class.php b/public/include/classes/base.class.php index 6dc88b02..2aae51ce 100644 --- a/public/include/classes/base.class.php +++ b/public/include/classes/base.class.php @@ -32,7 +32,10 @@ class Base { $this->token = $token; } public function setBlock($block) { - $this->block= $block; + $this->block = $block; + } + public function setSetting($setting) { + $this->setting = $setting; } public function setBitcoin($bitcoin) { $this->bitcoin = $bitcoin; diff --git a/public/include/classes/block.class.php b/public/include/classes/block.class.php index 03f8bd13..fb5e8dc4 100644 --- a/public/include/classes/block.class.php +++ b/public/include/classes/block.class.php @@ -10,9 +10,10 @@ class Block { // This defines each block public $height, $blockhash, $confirmations, $time, $accounted; - public function __construct($debug, $mysqli, $salt) { + public function __construct($debug, $mysqli, $config) { $this->debug = $debug; $this->mysqli = $mysqli; + $this->config = $config; $this->debug->append("Instantiated Block class", 2); } @@ -132,8 +133,9 @@ class Block { * @param confirmations int Required confirmations to consider block confirmed * @return data array Array with database fields as keys **/ - public function getAllUnconfirmed($confirmations='120') { - $stmt = $this->mysqli->prepare("SELECT id, height, blockhash, confirmations FROM $this->table WHERE confirmations < ? AND confirmations > -1"); + public function getAllUnconfirmed() { + $stmt = $this->mysqli->prepare("SELECT * FROM $this->table WHERE confirmations < ? AND confirmations > -1"); + empty($this->config['network_confirmations']) ? $confirmations = 120 : $confirmations = $this->config['network_confirmations']; if ($this->checkStmt($stmt) && $stmt->bind_param("i", $confirmations) && $stmt->execute() && $result = $stmt->get_result()) return $result->fetch_all(MYSQLI_ASSOC); return false; @@ -279,4 +281,4 @@ class Block { } // Automatically load our class for furhter usage -$block = new Block($debug, $mysqli, SALT); +$block = new Block($debug, $mysqli, $config); diff --git a/public/include/classes/mail.class.php b/public/include/classes/mail.class.php index e34423c5..ca1342aa 100644 --- a/public/include/classes/mail.class.php +++ b/public/include/classes/mail.class.php @@ -4,30 +4,7 @@ if (!defined('SECURITY')) die('Hacking attempt'); -class Mail { - private $sError = ''; - - public function setDebug($debug) { - $this->debug = $debug; - } - public function setMysql($mysqli) { - $this->mysqli = $mysqli; - } - public function setSmarty($smarty) { - $this->smarty = $smarty; - } - public function setUser($user) { - $this->user = $user; - } - public function setConfig($config) { - $this->config = $config; - } - public function setErrorMessage($msg) { - $this->sError = $msg; - } - public function getError() { - return $this->sError; - } +class Mail extends Base { function checkStmt($bState) { $this->debug->append("STA " . __METHOD__, 4); if ($bState ===! true) { @@ -39,21 +16,15 @@ class Mail { } public function sendMail($template, $aData) { - $this->smarty->assign('WEBSITENAME', $this->config['website']['name']); + $this->smarty->assign('WEBSITENAME', $this->setting->getValue('website_name')); $this->smarty->assign('SUBJECT', $aData['subject']); $this->smarty->assign('DATA', $aData); - $headers = 'From: Website Administration <' . $this->config['website']['email'] . ">\n"; + $headers = 'From: Website Administration <' . $this->setting->getValue('website_email') . ">\n"; $headers .= "MIME-Version: 1.0\n"; $headers .= "Content-Type: text/html; charset=ISO-8859-1\r\n"; - if (mail($aData['email'], - $this->smarty->fetch(BASEPATH . 'templates/mail/subject.tpl'), - $this->smarty->fetch(BASEPATH . 'templates/mail/' . $template . '.tpl'), - $headers)) { - return true; - } else { - $this->setErrorMessage("Unable to send mail"); - return false; - } + if (mail($aData['email'], $this->smarty->fetch(BASEPATH . 'templates/mail/subject.tpl'), $this->smarty->fetch(BASEPATH . 'templates/mail/' . $template . '.tpl'), $headers)) + return true; + $this->setErrorMessage('Unable to send mail'); return false; } } @@ -64,4 +35,5 @@ $mail->setDebug($debug); $mail->setMysql($mysqli); $mail->setSmarty($smarty); $mail->setConfig($config); +$mail->setSetting($setting); ?> diff --git a/public/include/classes/notification.class.php b/public/include/classes/notification.class.php index d128087a..08f3d3f5 100644 --- a/public/include/classes/notification.class.php +++ b/public/include/classes/notification.class.php @@ -17,21 +17,6 @@ class Notification extends Mail { return $this->updateSingle($id, $field); } - /** - * Update a single row in a table - * @param userID int Account ID - * @param field string Field to update - * @return bool - **/ - private function updateSingle($id, $field, $table='') { - if (empty($table)) $table = $this->table; - $this->debug->append("STA " . __METHOD__, 4); - $stmt = $this->mysqli->prepare("UPDATE $table SET " . $field['name'] . " = ? WHERE id = ? LIMIT 1"); - if ($this->checkStmt($stmt) && $stmt->bind_param($field['type'].'i', $field['value'], $id) && $stmt->execute()) - return true; - $this->debug->append("Unable to update " . $field['name'] . " with " . $field['value'] . " for ID $id"); - return false; - } /** * We check our notification table for existing data * so we can avoid duplicate entries diff --git a/public/include/classes/setting.class.php b/public/include/classes/setting.class.php index f2c1cbea..56a0d460 100644 --- a/public/include/classes/setting.class.php +++ b/public/include/classes/setting.class.php @@ -5,10 +5,9 @@ if (!defined('SECURITY')) die('Hacking attempt'); class Setting { - public function __construct($debug, $mysqli, $salt) { + public function __construct($debug, $mysqli) { $this->debug = $debug; $this->mysqli = $mysqli; - $this->salt = $salt; $this->table = 'settings'; } @@ -47,9 +46,8 @@ class Setting { if ($stmt && $stmt->bind_param('sss', $name, $value, $value) && $stmt->execute()) return true; $this->debug->append("Failed to set $name to $value"); - echo $this->mysqli->error; return false; } } -$setting = new Setting($debug, $mysqli, SALT); +$setting = new Setting($debug, $mysqli); diff --git a/public/include/classes/statistics.class.php b/public/include/classes/statistics.class.php index e3fb62e9..cca66283 100644 --- a/public/include/classes/statistics.class.php +++ b/public/include/classes/statistics.class.php @@ -404,10 +404,10 @@ class Statistics { GROUP BY HOUR(time)"); if ($this->checkStmt($stmt) && $stmt->bind_param('ii', $account_id, $account_id) && $stmt->execute() && $result = $stmt->get_result()) { $iStartHour = date('G'); - for ($i = $iStartHour; $i < 24; $i++) $aData[$i] = 0; + // Initilize array + for ($i = 0; $i < 24; $i++) $aData[($iStartHour + $i) % 24] = 0; + // Fill data while ($row = $result->fetch_assoc()) $aData[$row['hour']] = $row['hashrate']; - // Fill any non-existing hours with 0 hashrate - for ($i = 0; $i < 24; $i++) if (!array_key_exists($i, $aData)) $aData[$i] = 0; return $this->memcache->setCache(__FUNCTION__ . $account_id, $aData); } // Catchall @@ -441,10 +441,10 @@ class Statistics { GROUP BY HOUR(time)"); if ($this->checkStmt($stmt) && $stmt->execute() && $result = $stmt->get_result()) { $iStartHour = date('G'); - for ($i = $iStartHour; $i < 24; $i++) $aData[$i] = 0; + // Initilize array + for ($i = 0; $i < 24; $i++) $aData[($iStartHour + $i) % 24] = 0; + // Fill data while ($row = $result->fetch_assoc()) $aData[$row['hour']] = (int) $row['hashrate']; - // Fill any non-existing hours with 0 hashrate - for ($i = 0; $i < 24; $i++) if (!array_key_exists($i, $aData)) $aData[$i] = 0; return $this->memcache->setCache(__FUNCTION__, $aData); } // Catchall diff --git a/public/include/classes/user.class.php b/public/include/classes/user.class.php index c9fcc2cc..e012505a 100644 --- a/public/include/classes/user.class.php +++ b/public/include/classes/user.class.php @@ -28,6 +28,9 @@ class User { public function setBitcoin($bitcoin) { $this->bitcoin = $bitcoin; } + public function setSetting($setting) { + $this->setting = $setting; + } private function setErrorMessage($msg) { $this->sError = $msg; } @@ -525,7 +528,7 @@ class User { } } if ($this->mysqli->query("SELECT id FROM $this->table LIMIT 1")->num_rows > 0) { - $this->config['accounts']['confirm_email']['enabled'] ? $is_locked = 1 : $is_locked = 0; + ! $this->setting->getValue('accounts_confirm_email_disabled') ? $is_locked = 1 : $is_locked = 0; $is_admin = 0; $stmt = $this->mysqli->prepare(" INSERT INTO $this->table (username, pass, email, pin, api_key, is_locked) @@ -547,14 +550,14 @@ class User { $username_clean = strip_tags($username); if ($this->checkStmt($stmt) && $stmt->bind_param('sssssi', $username_clean, $password_hash, $email1, $pin_hash, $apikey_hash, $is_locked) && $stmt->execute()) { - if ($this->config['accounts']['confirm_email']['enabled'] && $is_admin != 1) { + if (! $this->setting->getValue('accounts_confirm_email_enabled') && $is_admin != 1) { if ($token = $this->token->createToken('confirm_email', $stmt->insert_id)) { $aData['username'] = $username_clean; $aData['token'] = $token; $aData['email'] = $email1; $aData['subject'] = 'E-Mail verification'; if (!$this->mail->sendMail('register/confirm_email', $aData)) { - $this->setErrorMessage('Unable to request email confirmation'); + $this->setErrorMessage('Unable to request email confirmation: ' . $this->mail->getError()); return false; } return true; @@ -666,3 +669,4 @@ $user = new User($debug, $mysqli, SALT, $config); $user->setMail($mail); $user->setToken($oToken); $user->setBitcoin($bitcoin); +$user->setSetting($setting); diff --git a/public/include/config/admin_settings.inc.php b/public/include/config/admin_settings.inc.php index a1d293d8..f3b68cd8 100644 --- a/public/include/config/admin_settings.inc.php +++ b/public/include/config/admin_settings.inc.php @@ -3,48 +3,186 @@ // Make sure we are called from index.php if (!defined('SECURITY')) die('Hacking attempt'); +// Load a list of themes available +$aTmpThemes = glob(THEME_DIR . '/*'); +$aThemes = array(); +foreach ($aTmpThemes as $dir) { + if (basename($dir) != 'cache' && basename($dir) != 'compile' && basename($dir) != 'mail') $aThemes[basename($dir)] = basename($dir); +} + // Load the settings available in this system -$aSettings['system'][] = array( +$aSettings['website'][] = array( 'display' => 'Maintenance Mode', 'type' => 'select', 'options' => array( 0 => 'No', 1 => 'Yes' ), + 'default' => 0, 'name' => 'maintenance', 'value' => $setting->getValue('maintenance'), 'tooltip' => 'Enable or Disable maintenance mode. Only admins can still login.' ); +$aSettings['website'][] = array( + 'display' => 'Message of the Day', 'type' => 'text', + 'size' => 25, + 'default' => '', + 'name' => 'system_motd', 'value' => $setting->getValue('system_motd'), + 'tooltip' => 'Display a message of the day as information popup if set.' +); +$aSettings['website'][] = array( + 'display' => 'Website Name', 'type' => 'text', + 'size' => 25, + 'default' => 'The Pool', + 'name' => 'website_name', 'value' => $setting->getValue('website_name'), + 'tooltip' => 'The name of you pool page, displayed in the header of the page.' +); +$aSettings['website'][] = array( + 'display' => 'Website Title', 'type' => 'text', + 'size' => 25, + 'default' => 'The Pool - Mining Evolved', + 'name' => 'website_title', 'value' => $setting->getValue('website_title'), + 'tooltip' => 'The title of you pool page, displayed in the browser window header.' +); +$aSettings['website'][] = array( + 'display' => 'Website Slogan', 'type' => 'text', + 'size' => 25, + 'default' => 'Resistance is Futile', + 'name' => 'website_slogan', 'value' => $setting->getValue('website_slogan'), + 'tooltip' => 'The slogan of you pool page, displayed in the browser window header.' +); +$aSettings['website'][] = array( + 'display' => 'Website e-mail', 'type' => 'text', + 'size' => 25, + 'default' => 'test@example.com', + 'name' => 'website_email', 'value' => $setting->getValue('website_email'), + 'tooltip' => 'The email address for your pool, used in mail templates and notifications.' +); +$aSettings['website'][] = array( + 'display' => 'Website theme', 'type' => 'select', + 'options' => $aThemes, + 'default' => 'mmcFE', + 'name' => 'website_theme', 'value' => $setting->getValue('website_theme'), + 'tooltip' => 'The default theme used on your pool.' +); +$aSettings['website'][] = array( + 'display' => 'Website mobile theme', 'type' => 'select', + 'options' => $aThemes, + 'default' => 'mobile', + 'name' => 'website_mobile_theme', 'value' => $setting->getValue('website_mobile_theme'), + 'tooltip' => 'The mobile theme used for your pool.' +); +$aSettings['website'][] = array( + 'display' => 'Blockexplorer URL', 'type' => 'text', + 'size' => 50, + 'default' => 'http://explorer.litecoin.net/block/', + 'name' => 'website_blockexplorer_url', 'value' => $setting->getValue('website_blockexplorer_url'), + 'tooltip' => 'URL to the blockexplorer website for your blockchain. Will append the blockhash to the URL. Leave empty to disabled this.' +); +$aSettings['website'][] = array( + 'display' => 'Disable Blockexplorer', 'type' => 'select', + 'options' => array( 0 => 'No', 1 => 'Yes' ), + 'name' => 'website_blockexplorer_disabled', 'value' => $setting->getValue('website_blockexplorer_disabled'), + 'tooltip' => 'Enabled or disable the blockexplorer URL feature. Will remove any links using the blockexplorer URL.' +); +$aSettings['website'][] = array( + 'display' => 'Chaininfo URL', 'type' => 'text', + 'size' => 50, + 'default' => 'http://allchains.info', + 'name' => 'website_chaininfo_url', 'value' => $setting->getValue('website_chaininfo_url'), + 'tooltip' => 'URL to the chaininfo website for your blockchain. Leave empty to disabled this.' +); +$aSettings['website'][] = array( + 'display' => 'Disable Chaininfo', 'type' => 'select', + 'options' => array( 0 => 'No', 1 => 'Yes' ), + 'name' => 'website_chaininfo_disabled', 'value' => $setting->getValue('website_chaininfo_disabled'), + 'tooltip' => 'Enabled or disable the chainfo URL feature. Will remove any links using the chaininfo URL.' +); +$aSettings['statistics'][] = array( + 'display' => 'Block Statistics Count', 'type' => 'text', + 'size' => 25, + 'default' => 20, + 'name' => 'statistics_block_count', 'value' => $setting->getValue('statistics_block_count'), + 'tooltip' => 'Blocks to fetch for the block statistics page.' +); +$aSettings['acl'][] = array( + 'display' => 'Pool Statistics', 'type' => 'select', + 'options' => array( 0 => 'Private', 1 => 'Public'), + 'default' => 1, + 'name' => 'acl_pool_statistics', 'value' => $setting->getValue('acl_pool_statistics'), + 'tooltip' => 'Make the pool statistics page private (users only) or public.' +); +$aSettings['acl'][] = array( + 'display' => 'Blcok Statistics', 'type' => 'select', + 'options' => array( 0 => 'Private', 1 => 'Public'), + 'default' => 1, + 'name' => 'acl_block_statistics', 'value' => $setting->getValue('acl_block_statistics'), + 'tooltip' => 'Make the block statistics page private (users only) or public.' +); +$aSettings['system'][] = array( + 'display' => 'Disable e-mail confirmations', 'type' => 'select', + 'options' => array( 0 => 'No', 1 => 'Yes' ), + 'default' => 0, + 'name' => 'accounts_confirm_email_disabled', 'value' => $setting->getValue('accounts_confirm_email_disabled'), + 'tooltip' => 'Should users supply a valid e-mail address upon registration. Requires them to confirm the address before accounts are activated.' +); $aSettings['system'][] = array( 'display' => 'Disable registrations', 'type' => 'select', 'options' => array( 0 => 'No', 1 => 'Yes' ), + 'default' => 0, 'name' => 'lock_registration', 'value' => $setting->getValue('lock_registration'), 'tooltip' => 'Enable or Disable registrations. Useful to create an invitation only pool.' ); $aSettings['system'][] = array( 'display' => 'Disable Invitations', 'type' => 'select', 'options' => array( 0 => 'No', 1 => 'Yes' ), + 'default' => 0, 'name' => 'disable_invitations', 'value' => $setting->getValue('disable_invitations'), 'tooltip' => 'Enable or Disable invitations. Users will not be able to invite new users via email if disabled.' ); $aSettings['system'][] = array( 'display' => 'Disable Manual Payouts', 'type' => 'select', 'options' => array( 0 => 'No', 1 => 'Yes' ), + 'default' => 0, 'name' => 'disable_mp', 'value' => $setting->getValue('disable_mp'), 'tooltip' => 'Enable or Disable the manual payout processing. Users will not be able to withdraw any funds if disabled.' ); $aSettings['system'][] = array( 'display' => 'Disable Automatic Payouts', 'type' => 'select', 'options' => array( 0 => 'No', 1 => 'Yes' ), + 'default' => 0, 'name' => 'disable_ap', 'value' => $setting->getValue('disable_ap'), 'tooltip' => 'Enable or Disable the automatic payout processing. Users exceeding their thresholds will not be paid out if disabled.' ); $aSettings['system'][] = array( 'display' => 'Disable notifications', 'type' => 'select', 'options' => array( 0 => 'No', 1 => 'Yes' ), + 'default' => 0, 'name' => 'disable_notifications', 'value' => $setting->getValue('disable_notifications'), 'tooltip' => 'Enable or Disable system notifications. This includes new found blocks, monitoring and all other notifications.' ); -$aSettings['other'][] = array( - 'display' => 'Message of the Day', 'type' => 'text', +$aSettings['system'][] = array( + 'display' => 'Disable API', 'type' => 'select', + 'options' => array( 0 => 'No', 1 => 'Yes' ), + 'default' => 0, + 'name' => 'disable_api', 'value' => $setting->getValue('disable_api'), + 'tooltip' => 'Enable or Disable the pool wide API functions. See API reference on Github for details.' +); +$aSettings['recaptcha'][] = array( + 'display' => 'Enable re-Captcha', 'type' => 'select', + 'options' => array( 0 => 'No', 1 => 'Yes' ), + 'default' => 0, + 'name' => 'recaptcha_enabled', 'value' => $setting->getValue('recaptcha_enabled'), + 'tooltip' => 'Enable or Disable re-Captcha. This will require user input on registraion and other forms.' +); +$aSettings['recaptcha'][] = array( + 'display' => 're-Captcha Private Key', 'type' => 'text', 'size' => 25, - 'name' => 'system_motd', 'value' => $setting->getValue('system_motd'), - 'tooltip' => 'Display a message of the day as information popup if set.' + 'default' => 'YOUR_PRIVATE_KEY', + 'name' => 'recaptcha_private_key', 'value' => $setting->getValue('recaptcha_private_key'), + 'tooltip' => '.' +); +$aSettings['recaptcha'][] = array( + 'display' => 're-Captcha Public Key', 'type' => 'text', + 'size' => 25, + 'default' => 'YOUR_PUBLIC_KEY', + 'name' => 'recaptcha_public_key', 'value' => $setting->getValue('recaptcha_public_key'), + 'tooltip' => 'Your public key as given by your re-Captcha account.' ); ?> diff --git a/public/include/config/global.inc.dist.php b/public/include/config/global.inc.dist.php index 852e8be2..82ea1b5a 100644 --- a/public/include/config/global.inc.dist.php +++ b/public/include/config/global.inc.dist.php @@ -97,49 +97,10 @@ $config['ap_threshold']['min'] = 1; $config['ap_threshold']['max'] = 250; -/** - * Website specific configuration settings - * - * Explanation: - * title : Website title used in master template - * name : The pool name, displayed in the header and mails - * slogan : A special slogan, also displayed in the header below name - * email : `From` addresses used in notifications - * theme : Theme used for desktop browsers - * mobile : Enable/Disable mobile theme support - * mobile_theme : Theme used for mobile browsers - * api disabled : Disable the sites API functions - * blocks count : # of blocks to display on block statistics page - * - * Defaults: - * title = `The Pool - Mining Evolved` - * name = `The Pool` - * slogan = `Resistance is futile` - * email = `test@example.com` - * theme = `mmcFE` - * mobile = true - * mobile_theme = `mobile` - * api disbabled = false - * blocks count = 20 - **/ -$config['website']['title'] = 'The Pool - Mining Evolved'; -$config['website']['name'] = 'The Pool'; -$config['website']['slogan'] = 'Resistance is futile'; -$config['website']['email'] = 'test@example.com'; -$config['website']['theme'] = 'mmcFE'; -$config['website']['mobile'] = true; -$config['website']['mobile_theme'] = 'mobile'; -$config['website']['api']['disabled'] = false; -$config['website']['blocks']['count'] = 20; - /** * Account specific settings * * Explanation - * You can change some defaults on how accounts are created or registered - * By default, all newly created accounts will require an email verificaiton. - * Only after acitivating an account the user will be able to login - * * Invitations will allow your users to invite new members to join the pool. * After sending a mail to the invited user, they can register using the token * created. Invitations can be enabled and disabled through the admin panel. @@ -149,41 +110,13 @@ $config['website']['blocks']['count'] = 20; * variable. * * Options: - * confirm_email : Send confirmation mail to user after registration * count : Maximum invitations a user is able to send * * Defaults: - * confirm_email : true * count : 5 **/ -$config['accounts']['confirm_email']['enabled'] = true; $config['accounts']['invitations']['count'] = 5; -/** - * Some basic access restrictions on some pages - * - * Explanation: - * Some pools would like to run a few pages for public access instead - * of enforcing a login. You can change visibility of some pages here. - * - * Options: - * 'public' : Allow guest access and authenticated user to view page - * 'private' : Only allow logged in users access to view page - * - * Defaults: - * 'private' for every page - **/ -$config['website']['acl']['statistics']['pool'] = 'private'; -$config['website']['acl']['statistics']['blocks'] = 'private'; - -/** - * Re-Captcha settings - * Please read http://www.google.com/recaptcha for details - **/ -$config['recaptcha']['enabled'] = false; -$config['recaptcha']['public_key'] = 'YOUR_PUBLIC_RECAPTCHA_KEY'; -$config['recaptcha']['private_key'] = 'YOUR_PRIVATE_RECAPTCHA_KEY'; - // Currency system used in this pool, default: `LTC` $config['currency'] = 'LTC'; @@ -254,15 +187,6 @@ $config['payout_system'] = 'prop'; $config['archive']['maxrounds'] = 10; $config['archive']['maxage'] = 60 * 24; -// URL prefix for block searches, used for block links, default: `http://explorer.litecoin.net/block/` -// The Blockhash is appended on the templates to this URL -// If this config is empty, the block link to the block information page will be removed -$config['blockexplorer'] = 'http://explorer.litecoin.net/block/'; - -// Link to blockchain information, used for difficulty link, default: `http://allchains.info` -// If empty, the difficulty link to the chain information will be removed -$config['chaininfo'] = 'http://allchains.info'; - // Pool fees applied to users in percent, default: 0 (disabled) $config['fees'] = 0; @@ -349,6 +273,8 @@ $config['reward'] = 50; // Confirmations per block required to credit transactions, default: 120 $config['confirmations'] = 120; +// Confirmations per block required in network to confirm its transactions, default: 120 +$config['network_confirmations'] = 120; /** * Available pps options: diff --git a/public/include/pages/admin/wallet.inc.php b/public/include/pages/admin/wallet.inc.php index 822134dd..de201523 100644 --- a/public/include/pages/admin/wallet.inc.php +++ b/public/include/pages/admin/wallet.inc.php @@ -24,16 +24,24 @@ if (!$smarty->isCached('master.tpl', $smarty_cache_key)) { $dNewmint = -1; $_SESSION['POPUP'][] = array('CONTENT' => 'Unable to connect to wallet RPC service: ' . $bitcoin->can_connect(), 'TYPE' => 'errormsg'); } + // Fetch unconfirmed amount from blocks table + $aBlocksUnconfirmed = $block->getAllUnconfirmed(); + $dBlocksUnconfirmedBalance = 0; + if (!empty($aBlocksUnconfirmed)) + foreach ($aBlocksUnconfirmed as $aData) $dBlocksUnconfirmedBalance += $aData['amount']; + // Fetch locked balance from transactions $dLockedBalance = $transaction->getLockedBalance(); } else { $debug->append('Using cached page', 3); } +$smarty->assign("UNCONFIRMED", $dBlocksUnconfirmedBalance); $smarty->assign("BALANCE", $dBalance); $smarty->assign("LOCKED", $dLockedBalance); $smarty->assign("NEWMINT", $dNewmint); // Tempalte specifics $smarty->assign("CONTENT", "default.tpl"); + ?> diff --git a/public/include/pages/register.inc.php b/public/include/pages/register.inc.php index 01b71b18..681bcb53 100644 --- a/public/include/pages/register.inc.php +++ b/public/include/pages/register.inc.php @@ -10,11 +10,10 @@ if ($setting->getValue('lock_registration') && $setting->getValue('disable_invit $_SESSION['POPUP'][] = array('CONTENT' => 'Only invited users are allowed to register.', 'TYPE' => 'errormsg'); $smarty->assign("CONTENT", "disabled.tpl"); } else { - if ($config['recaptcha']['enabled']) { + if ($setting->getValue('recaptcha_enabled')) { require_once(INCLUDE_DIR . '/lib/recaptchalib.php'); - $smarty->assign("RECAPTCHA", recaptcha_get_html($config['recaptcha']['public_key'])); + $smarty->assign("RECAPTCHA", recaptcha_get_html($setting->getValue('recaptcha_public_key'))); } - // Tempalte specifics $smarty->assign("CONTENT", "default.tpl"); } ?> diff --git a/public/include/pages/register/register.inc.php b/public/include/pages/register/register.inc.php index ca165e3b..ecb2c028 100644 --- a/public/include/pages/register/register.inc.php +++ b/public/include/pages/register/register.inc.php @@ -2,11 +2,11 @@ // Make sure we are called from index.php if (!defined('SECURITY')) die('Hacking attempt'); -if ($config['recaptcha']['enabled']) { +if ($setting->getValue('recaptcha_enabled')) { // Load re-captcha specific data require_once(INCLUDE_DIR . '/lib/recaptchalib.php'); $rsp = recaptcha_check_answer ( - $config['recaptcha']['private_key'], + $setting->getValue('recaptcha_private_key'), $_SERVER["REMOTE_ADDR"], $_POST["recaptcha_challenge_field"], $_POST["recaptcha_response_field"] @@ -19,28 +19,28 @@ if ($setting->getValue('disable_invitations') && $setting->getValue('lock_regist $_SESSION['POPUP'][] = array('CONTENT' => 'Only invited users are allowed to register.', 'TYPE' => 'errormsg'); } else { // Check if recaptcha is enabled, process form data if valid - if($config['recaptcha']['enabled'] && $_POST["recaptcha_response_field"] && $_POST["recaptcha_response_field"]!=''){ + if($setting->getValue('recaptcha_enabled') && $_POST["recaptcha_response_field"] && $_POST["recaptcha_response_field"]!=''){ if ($rsp->is_valid) { - $smarty->assign("RECAPTCHA", recaptcha_get_html($config['recaptcha']['public_key'])); + $smarty->assign("RECAPTCHA", recaptcha_get_html($setting->getValue('recaptcha_public_key'))); isset($_POST['token']) ? $token = $_POST['token'] : $token = ''; if ($user->register($_POST['username'], $_POST['password1'], $_POST['password2'], $_POST['pin'], $_POST['email1'], $_POST['email2'], $token)) { - $config['accounts']['confirm_email']['enabled'] ? $_SESSION['POPUP'][] = array('CONTENT' => 'Please check your mailbox to activate this account') : $_SESSION['POPUP'][] = array('CONTENT' => 'Account created, please login'); + ! $setting->getValue('accounts_confirm_email_disabled') ? $_SESSION['POPUP'][] = array('CONTENT' => 'Please check your mailbox to activate this account') : $_SESSION['POPUP'][] = array('CONTENT' => 'Account created, please login'); } else { $_SESSION['POPUP'][] = array('CONTENT' => 'Unable to create account: ' . $user->getError(), 'TYPE' => 'errormsg'); } } else { - $smarty->assign("RECAPTCHA", recaptcha_get_html($config['recaptcha']['public_key'], $rsp->error)); + $smarty->assign("RECAPTCHA", recaptcha_get_html($setting->getValue('recaptcha_public_key'), $rsp->error)); $_SESSION['POPUP'][] = array('CONTENT' => 'Invalid Captcha, please try again. (' . $rsp->error . ')', 'TYPE' => 'errormsg'); } // Empty captcha - } else if ($config['recaptcha']['enabled']) { - $smarty->assign("RECAPTCHA", recaptcha_get_html($config['recaptcha']['public_key'], $rsp->error)); + } else if ($setting->getValue('recaptcha_enabled')) { + $smarty->assign("RECAPTCHA", recaptcha_get_html($setting->getValue('recaptcha_public_key'), $rsp->error)); $_SESSION['POPUP'][] = array('CONTENT' => 'Empty Captcha, please try again.', 'TYPE' => 'errormsg'); // Captcha disabled } else { isset($_POST['token']) ? $token = $_POST['token'] : $token = ''; if ($user->register($_POST['username'], $_POST['password1'], $_POST['password2'], $_POST['pin'], $_POST['email1'], $_POST['email2'], $token)) { - $config['accounts']['confirm_email']['enabled'] ? $_SESSION['POPUP'][] = array('CONTENT' => 'Please check your mailbox to activate this account') : $_SESSION['POPUP'][] = array('CONTENT' => 'Account created, please login'); + ! $setting->getValue('accounts_confirm_email_disabled') ? $_SESSION['POPUP'][] = array('CONTENT' => 'Please check your mailbox to activate this account') : $_SESSION['POPUP'][] = array('CONTENT' => 'Account created, please login'); } else { $_SESSION['POPUP'][] = array('CONTENT' => 'Unable to create account: ' . $user->getError(), 'TYPE' => 'errormsg'); } diff --git a/public/include/pages/statistics/blocks.inc.php b/public/include/pages/statistics/blocks.inc.php index 494e6be3..116d999d 100644 --- a/public/include/pages/statistics/blocks.inc.php +++ b/public/include/pages/statistics/blocks.inc.php @@ -7,7 +7,7 @@ if (!defined('SECURITY')) die('Hacking attempt'); if (!$smarty->isCached('master.tpl', $smarty_cache_key)) { $debug->append('No cached version available, fetching from backend', 3); // Grab the last blocks found - !empty($config['website']['blocks']['count']) ? $iLimit = $config['website']['blocks']['count'] : $iLimit = 20; + $setting->getValue('statistics_block_count') ? $iLimit = $setting->getValue('statistics_block_count') : $iLimit = 20; $aBlocksFoundData = $statistics->getBlocksFound($iLimit); // Propagate content our template @@ -17,7 +17,7 @@ if (!$smarty->isCached('master.tpl', $smarty_cache_key)) { $debug->append('Using cached page', 3); } -if ($config['website']['acl']['statistics']['blocks'] == 'public') { +if ($setting->getValue('acl_block_statistics')) { $smarty->assign("CONTENT", "default.tpl"); } else if ($user->isAuthenticated()) { $smarty->assign("CONTENT", "default.tpl"); diff --git a/public/include/pages/statistics/pool.inc.php b/public/include/pages/statistics/pool.inc.php index 2c1ca533..7937029d 100644 --- a/public/include/pages/statistics/pool.inc.php +++ b/public/include/pages/statistics/pool.inc.php @@ -52,7 +52,7 @@ if (!$smarty->isCached('master.tpl', $smarty_cache_key)) { $smarty->assign("CONTRIBSHARES", $aContributorsShares); $smarty->assign("CONTRIBHASHES", $aContributorsHashes); $smarty->assign("CURRENTBLOCK", $iBlock); - $smarty->assign("CURRENTBLOCKHASH", $sBlockHash); + $smarty->assign("CURRENTBLOCKHASH", @$sBlockHash); if (count($aBlockData) > 0) { $smarty->assign("LASTBLOCK", $aBlockData['height']); $smarty->assign("LASTBLOCKHASH", $aBlockData['blockhash']); @@ -66,9 +66,9 @@ if (!$smarty->isCached('master.tpl', $smarty_cache_key)) { } // Public / private page detection -if ($config['website']['acl']['statistics']['pool'] == 'public') { +if ($setting->getValue('acl_pool_statistics')) { $smarty->assign("CONTENT", "authenticated.tpl"); -} else if ($user->isAuthenticated() && $config['website']['acl']['statistics']['pool'] == 'private') { +} else if ($user->isAuthenticated() && ! $setting->getValue('acl_pool_statistics')) { $smarty->assign("CONTENT", "authenticated.tpl"); } else { $smarty->assign("CONTENT", "../default.tpl"); diff --git a/public/include/smarty_globals.inc.php b/public/include/smarty_globals.inc.php index 27d980e6..01cc6e5b 100644 --- a/public/include/smarty_globals.inc.php +++ b/public/include/smarty_globals.inc.php @@ -34,8 +34,6 @@ if ($iCurrentPoolHashrate > $dNetworkHashrate) $dNetworkHashrate = $iCurrentPool // Global data for Smarty $aGlobal = array( - 'slogan' => $config['website']['slogan'], - 'websitename' => $config['website']['name'], 'hashrate' => $iCurrentPoolHashrate, 'nethashrate' => $dNetworkHashrate, 'sharerate' => $iCurrentPoolShareRate, @@ -45,11 +43,8 @@ $aGlobal = array( 'confirmations' => $config['confirmations'], 'reward' => $config['reward'], 'price' => $setting->getValue('price'), - 'blockexplorer' => $config['blockexplorer'], - 'chaininfo' => $config['chaininfo'], 'disable_mp' => $setting->getValue('disable_mp'), 'config' => array( - 'website' => $config['website'], 'accounts' => $config['accounts'], 'disable_invitations' => $setting->getValue('disable_invitations'), 'disable_notifications' => $setting->getValue('disable_notifications'), @@ -65,6 +60,21 @@ $aGlobal = array( ) ); +// Website configurations +$aGlobal['website']['name'] = $setting->getValue('website_name'); +$aGlobal['website']['title'] = $setting->getValue('website_title'); +$aGlobal['website']['slogan'] = $setting->getValue('website_slogan'); +$aGlobal['website']['email'] = $setting->getValue('website_email'); +$aGlobal['website']['api']['disabled'] = $setting->getValue('disable_api'); +$aGlobal['website']['blockexplorer']['disabled'] = $setting->getValue('website_blockexplorer_disabled'); +$aGlobal['website']['chaininfo']['disabled'] = $setting->getValue('website_chaininfo_disabled'); +$setting->getValue('website_blockexplorer_url') ? $aGlobal['website']['blockexplorer']['url'] = $setting->getValue('website_blockexplorer_url') : $aGlobal['website']['blockexplorer']['url'] = 'http://explorer.litecoin.net/block/'; +$setting->getValue('website_chaininfo_url') ? $aGlobal['website']['chaininfo']['url'] = $setting->getValue('website_chaininfo_url') : $aGlobal['website']['chaininfo']['url'] = 'http://allchains.info'; + +// ACLs +$aGlobal['acl']['pool']['statistics'] = $setting->getValue('acl_pool_statistics'); +$aGlobal['acl']['block']['statistics'] = $setting->getValue('acl_block_statistics'); + // We support some dynamic reward targets but fall back to our fixed value // Special calculations for PPS Values based on reward_type setting and/or available blocks if ($config['pps']['reward']['type'] == 'blockavg' && $block->getBlockCount() > 0) { diff --git a/public/templates/mmcFE/account/transactions/default.tpl b/public/templates/mmcFE/account/transactions/default.tpl index 169e7de2..32febd64 100644 --- a/public/templates/mmcFE/account/transactions/default.tpl +++ b/public/templates/mmcFE/account/transactions/default.tpl @@ -96,7 +96,7 @@ ({$TRANSACTIONS[transaction].confirmations|default:"n/a"})
{/if}| {$BLOCKSFOUND[block].height} | + {if ! $GLOBAL.website.blockexplorer.disabled} +{$BLOCKSFOUND[block].height} | + {else} +{$BLOCKSFOUND[block].height} | + {/if}{if $BLOCKSFOUND[block].confirmations >= $GLOBAL.confirmations} Confirmed diff --git a/public/templates/mmcFE/statistics/blocks/small_table.tpl b/public/templates/mmcFE/statistics/blocks/small_table.tpl index 7ddc03c8..e826fd3a 100644 --- a/public/templates/mmcFE/statistics/blocks/small_table.tpl +++ b/public/templates/mmcFE/statistics/blocks/small_table.tpl @@ -13,7 +13,11 @@ {assign var=rank value=1} {section block $BLOCKSFOUND} | ||||
| {$BLOCKSFOUND[block].height} | + {if ! $GLOBAL.website.blockexplorer.disabled} +{$BLOCKSFOUND[block].height} | + {else} +{$BLOCKSFOUND[block].height} | + {/if}{if $BLOCKSFOUND[block].is_anonymous|default:"0" == 1}anonymous{else}{$BLOCKSFOUND[block].finder|default:"unknown"|escape}{/if} | {$BLOCKSFOUND[block].time|date_format:"%d/%m %H:%M:%S"} | {$BLOCKSFOUND[block].shares|number_format} | diff --git a/public/templates/mmcFE/statistics/pool/authenticated.tpl b/public/templates/mmcFE/statistics/pool/authenticated.tpl index ff87137a..fad93e8f 100644 --- a/public/templates/mmcFE/statistics/pool/authenticated.tpl +++ b/public/templates/mmcFE/statistics/pool/authenticated.tpl @@ -19,10 +19,10 @@Current Active Workers | {$GLOBAL.workers} |
| Next Network Block | -{$CURRENTBLOCK + 1} (Current: {$CURRENTBLOCK}) | +{$CURRENTBLOCK + 1} (Current: {$CURRENTBLOCK}) | |||||
| Last Block Found | -{if $GLOBAL.blockexplorer}{$LASTBLOCK|default:"0"}{else}{$LASTBLOCK|default:"0"}{/if} | +{if $GLOBAL.website.blockexplorer.url}{$LASTBLOCK|default:"0"}{else}{$LASTBLOCK|default:"0"}{/if} | |||||
| Current Difficulty | - {if $GLOBAL.chaininfo} -{$DIFFICULTY} | + {if ! $GLOBAL.website.chaininfo.disabled} +{$DIFFICULTY} | {else}{$DIFFICULTY} | {/if} @@ -57,7 +57,7 @@