public function __construct(SettingRepository $settingRepository) { $this->settingRepository = $settingRepository; $this->publicKey = $this->settingRepository->getSolveMediaChallengeKey(); $this->privateKey = $this->settingRepository->getSolveMediaVerificationKey(); $this->hashKey = $this->settingRepository->getSolveMediaAuthenticationKey(); $this->useSSL = false; }
public function send($address, $amount, $ip, $referral = false) { $apiKey = $this->settingRepository->getApiKey(); $query = http_build_query(array('apikey' => $apiKey)); $url = $this->config['api_url'] . '?' . $query; $headers = array('Connection' => 'close'); $data = http_build_query(array('address' => $address, 'amount' => $amount, 'referral' => $referral, 'ip' => $ip)); $browser = new Browser(); $browser->getClient()->setVerifyPeer(false); /** @var Response $response */ try { $response = $browser->post($url, $headers, $data); } catch (Exception $e) { throw new PaytoshiException('Error while posting request', 500, $e); } $content = json_decode($response->getContent(), true); $apiResponse = new ApiResponse($response->isSuccessful(), $response); if (!$response->isSuccessful()) { if (isset($content['code'])) { switch ($content['code']) { case 'NOT_ENOUGH_FUNDS': $apiResponse->setError('Insufficient funds.'); break; case 'INVALID_ADDRESS': $apiResponse->setError('Invalid address.'); break; case 'FAUCET_DISABLED': $apiResponse->setError('This faucet has been disabled by the owner or the Paytoshi staff.'); break; case 'ACCESS_DENIED': $apiResponse->setError('Access denied, please check your apikey.'); break; case 'INTERNAL ERROR': $apiResponse->setError('An internal server error has occurred, try again later.'); break; case 'BAD_REQUEST': $apiResponse->setError('Invalid request.'); break; default: $apiResponse->setError(sprintf("Generic error: %s.", $content['code'])); break; } } else { $apiResponse->setError('Generic error.'); } return $apiResponse; } $apiResponse->setAmount($content['amount']); $apiResponse->setRecipient($content['recipient']); return $apiResponse; }
public function getTemplate($filename) { $templateDir = $this->config['template_path']; //Before setup there is no theme... if ($this->settingRepository) { $currentTheme = $this->settingRepository->getTheme(); $filePath = '.' . DIRECTORY_SEPARATOR . $templateDir . DIRECTORY_SEPARATOR . $currentTheme . DIRECTORY_SEPARATOR . $filename; if (is_file($filePath) && is_readable($filePath)) { return $currentTheme . DIRECTORY_SEPARATOR . $filename; } } $defaultTheme = $this->config['default_theme']; $defaultFilePath = '.' . DIRECTORY_SEPARATOR . $templateDir . DIRECTORY_SEPARATOR . $defaultTheme . DIRECTORY_SEPARATOR . $filename; if (is_file($defaultFilePath) && is_readable($defaultFilePath)) { return $defaultTheme . DIRECTORY_SEPARATOR . $filename; } throw new PaytoshiException('Unable to load a theme.'); }
public function __construct(SettingRepository $settingRepository) { $this->settingRepository = $settingRepository; $this->publicKey = $this->settingRepository->getRecaptchaPublicKey(); $this->privateKey = $this->settingRepository->getRecaptchaPrivateKey(); }
/** * 1. Captcha check * 2. Timeout check * 3. Reward generation * 4. Payout creation * 5. Payment process * 6. Referral payout creation * 7. Referral payment process */ public function reward() { $address = $this->app->request->post('address'); $challenge = $this->app->request->post($this->captchaService->getChallengeName()); $response = $this->app->request->post($this->captchaService->getResponseName()); if (empty($address) || empty($challenge) || empty($response)) { $this->app->flash('warning', 'Missing address or captcha.'); $this->app->redirect($this->app->urlFor('index')); return; } $remoteIp = $this->ipService->determineClientIpAddress($_SERVER); if (!$remoteIp) { $this->app->flash('warning', 'Incorrect ip address.'); $this->app->redirect($this->app->urlFor('index')); return; } // Captcha Check try { /** @var CaptchaResponse $captchaResponse */ $captchaResponse = $this->captchaService->checkAnswer($remoteIp, $challenge, $response); } catch (CaptchaException $e) { $this->app->flash('error', 'Unable to verify captcha.'); $this->app->redirect($this->app->urlFor('index')); return; } if (!$captchaResponse->getSuccess()) { $this->app->flash('error', 'Invalid Captcha'); $this->app->redirect($this->app->urlFor('index')); return; } try { if (!$this->database->beginTransaction()) { } } catch (PaytoshiException $e) { $this->app->flash('error', 'Unable to connect to database.'); $this->app->redirect($this->app->urlFor('index')); return; } $recipient = $this->recipientRepository->findOneByAddress($address); if (!$recipient) { $recipient = new Recipient(); $recipient->setAddress($address); } // Timeout check $lastPayout = $this->payoutRepository->findLastByRecipientAndIp($recipient, $remoteIp); $now = new DateTime(); $waitingInterval = $this->settingRepository->getWaitingInterval(); if ($lastPayout) { $nextPayoutTime = $lastPayout->getCreatedAt()->add(new DateInterval('PT' . $waitingInterval . 'S')); if ($nextPayoutTime > $now) { $this->database->rollBack(); $waitingTime = $nextPayoutTime->diff($now); $this->app->flash('warning', sprintf('You can get a reward again in %s.', $this->formatTime($waitingTime))); $this->app->redirect($this->app->urlFor('index')); return; } } // Reward Generation $earning = $this->rewardService->getReward(); // Payout Creation $payout = new Payout(); $payout->setIp($remoteIp); $payout->setRecipientAddress($recipient->getAddress()); $payout->setEarning($earning); // Payment process try { /* @var $apiResponse ApiResponse */ $apiResponse = $this->apiService->send($payout->getRecipientAddress(), $payout->getEarning(), $remoteIp); } catch (PaytoshiException $e) { $this->database->rollback(); $this->app->flash('error', $e->getMessage()); $this->app->redirect($this->app->urlFor('index')); return; } if (!$apiResponse->getSuccess()) { $this->database->rollback(); $this->app->flash('error', $apiResponse->getError()); $this->app->redirect($this->app->urlFor('index')); return; } $view = $this->app->view(); $view->setData(array('amount' => $apiResponse->getAmount(), 'recipient' => $apiResponse->getRecipient(), 'balanceUrl' => str_replace('_ADDRESS_', $address, $this->app->config('balance_url')))); $this->recipientRepository->save($recipient); $this->app->flash('success', $view->render($this->themeService->getTemplate('balance.html.twig'))); $_SESSION['address'] = $recipient->getAddress(); $referral = $this->app->request->post('referral'); $referralPercentage = $this->settingRepository->getReferralPercentage(); if ($referral && $referral != $address && $referralPercentage > 0) { // Referral Payout Creation $referralRecipient = $this->recipientRepository->findOneByAddress($referral); if (!$referralRecipient) { $referralRecipient = new Recipient(); $referralRecipient->setAddress($referral); } $referralEarning = ceil($earning * $referralPercentage / 100); $payout->setReferralRecipientAddress($referralRecipient->getAddress()); $payout->setReferralEarning($referralEarning); $referralRecipient->setReferralEarning($referralEarning + $referralRecipient->getReferralEarning()); // Referral payment process try { $apiResponse = $this->apiService->send($referralRecipient->getAddress(), $referralRecipient->getReferralEarning(), $remoteIp, true); } catch (PaytoshiException $e) { $this->payoutRepository->save($payout); $this->recipientRepository->save($referralRecipient); $this->database->commit(); $this->app->flash('error', $e->getMessage()); $this->app->redirect($this->app->urlFor('index')); return; } if ($apiResponse->getSuccess()) { $referralRecipient->setReferralEarning(0); } $this->recipientRepository->save($referralRecipient); } $this->payoutRepository->save($payout); $this->database->commit(); $this->app->redirect($this->app->urlFor('index')); }
private function getView() { return array('version' => $this->settingRepository->getVersion(), 'api_key' => $this->settingRepository->getApiKey(), 'name' => $this->settingRepository->getName(), 'description' => $this->settingRepository->getDescription(), 'current_theme' => $this->settingRepository->getTheme(), 'captcha_provider' => $this->settingRepository->getCaptchaProvider(), 'solve_media' => array('challenge_key' => $this->settingRepository->getSolveMediaChallengeKey(), 'verification_key' => $this->settingRepository->getSolveMediaVerificationKey(), 'authentication_key' => $this->settingRepository->getSolveMediaAuthenticationKey()), 'recaptcha' => array('public_key' => $this->settingRepository->getRecaptchaPublicKey(), 'private_key' => $this->settingRepository->getRecaptchaPrivateKey()), 'funcaptcha' => array('public_key' => $this->settingRepository->getFuncaptchaPublicKey(), 'private_key' => $this->settingRepository->getFuncaptchaPrivateKey()), 'waiting_interval' => $this->settingRepository->getWaitingInterval(), 'rewards' => $this->settingRepository->getRewards(), 'referral_percentage' => $this->settingRepository->getReferralPercentage(), 'css' => $this->settingRepository->getCss(), 'header_box' => $this->settingRepository->getHeaderBox(), 'left_box' => $this->settingRepository->getLeftBox(), 'right_box' => $this->settingRepository->getRightBox(), 'center1_box' => $this->settingRepository->getCenter1Box(), 'center2_box' => $this->settingRepository->getCenter2Box(), 'center3_box' => $this->settingRepository->getCenter3Box(), 'footer_box' => $this->settingRepository->getFooterBox()); }