[MediaWiki-commits] [Gerrit] mediawiki...DonationInterface[deployment]: Send resultswitcher reloaders to TY page

2017-06-29 Thread jenkins-bot (Code Review)
jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/362295 )

Change subject: Send resultswitcher reloaders to TY page
..


Send resultswitcher reloaders to TY page

This restores some logic we used to have that kept track of processed
orders in a key outside of the donor data.

TODO: shouldn't globalcollectadapter return true for
isReturnProcessingRequired() ?

Cherry picked and sanitized of test code for deployment.

Bug: T167990
Change-Id: I9d23953e180b85d0d7ae357442760dd5c4d4619c
---
M gateway_common/GatewayPage.php
M gateway_common/gateway.adapter.php
M paypal_gateway/express_checkout/paypal_express.adapter.php
3 files changed, 59 insertions(+), 0 deletions(-)

Approvals:
  jenkins-bot: Verified
  Ejegg: Looks good to me, approved



diff --git a/gateway_common/GatewayPage.php b/gateway_common/GatewayPage.php
index 4b1f2ba..1d0d271 100644
--- a/gateway_common/GatewayPage.php
+++ b/gateway_common/GatewayPage.php
@@ -398,6 +398,17 @@
 
$this->setHeaders();
 
+   if ( $this->isRepeatReturnProcess() ) {
+   $this->logger->warning(
+   'Donor is trying to process an 
already-processed payment. ' .
+   "Adapter Order ID: $oid.\n" .
+   "Cookies: " . print_r( $_COOKIE, true ) ."\n" .
+   "User-Agent: " . $_SERVER['HTTP_USER_AGENT']
+   );
+   $this->displayThankYouPage( 'repeat return processing' 
);
+   return;
+   }
+
if ( $deadSession ){
if ( $this->adapter->isReturnProcessingRequired() ) {
wfHttpError( 403, 'Forbidden', wfMessage( 
'donate_interface-error-http-403' )->text() );
@@ -429,6 +440,7 @@
// feed processDonorReturn all the GET and POST vars
$requestValues = $this->getRequest()->getValues();
$result = $this->adapter->processDonorReturn( 
$requestValues );
+   $this->markReturnProcessed();
$this->renderResponse( $result );
return;
} else {
@@ -567,4 +579,34 @@
);
}
}
+
+   protected function isRepeatReturnProcess() {
+   $request = $this->getRequest();
+   $requestProcessId = $this->adapter->getRequestProcessId(
+   $request->getValues()
+   );
+   $processedRequests = $request->getSessionData( 
'processed_requests' );
+   if ( !$requestProcessId || empty( $processedRequests ) ) {
+   return false;
+   }
+   return array_key_exists( $requestProcessId, $processedRequests 
);
+   }
+
+   protected function markReturnProcessed() {
+   $request = $this->getRequest();
+   $requestProcessId = $this->adapter->getRequestProcessId(
+   $request->getValues()
+   );
+   if ( !$requestProcessId ) {
+   return;
+   }
+   $processedRequests = $request->getSessionData( 
'processed_requests' );
+   if ( !$processedRequests ) {
+   $processedRequests = array();
+   }
+   // TODO: we could store the results of the last process here, 
but for now
+   // we just indicate we did SOMETHING with it
+   $processedRequests[$requestProcessId] = true;
+   $request->setSessionData( 'processed_requests', 
$processedRequests );
+   }
 }
diff --git a/gateway_common/gateway.adapter.php 
b/gateway_common/gateway.adapter.php
index f26ffd0..9a25296 100644
--- a/gateway_common/gateway.adapter.php
+++ b/gateway_common/gateway.adapter.php
@@ -1452,6 +1452,18 @@
}
 
/**
+* Gateways which return true from isReturnProcessingRequired must
+* override this with logic to get an ID from the request which will
+* identify repeated attempts to process the same payment.
+*
+* @param array $requestValues
+* @return int|string Order id
+*/
+   protected function getRequestProcessId( $requestValues ) {
+   return null;
+   }
+
+   /**
 * Process the API response obtained from the payment processor and set
 * properties of transaction_response.
 * Default implementation just says we got a response.
@@ -2945,6 +2957,7 @@
'PaymentForms',
'numAttempt',
'order_status', //for post-payment activities
+   'processed_requests', //for post-payment 
activities
  

[MediaWiki-commits] [Gerrit] mediawiki...DonationInterface[deployment]: Send resultswitcher reloaders to TY page

2017-06-29 Thread Ejegg (Code Review)
Ejegg has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/362295 )

Change subject: Send resultswitcher reloaders to TY page
..

Send resultswitcher reloaders to TY page

This restores some logic we used to have that kept track of processed
orders in a key outside of the donor data.

TODO: shouldn't globalcollectadapter return true for
isReturnProcessingRequired() ?

Cherry picked and sanitized of test code for deployment.

Bug: T167990
Change-Id: I9d23953e180b85d0d7ae357442760dd5c4d4619c
---
M gateway_common/GatewayPage.php
M gateway_common/gateway.adapter.php
M paypal_gateway/express_checkout/paypal_express.adapter.php
3 files changed, 59 insertions(+), 0 deletions(-)


  git pull 
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/DonationInterface 
refs/changes/95/362295/1

diff --git a/gateway_common/GatewayPage.php b/gateway_common/GatewayPage.php
index 4b1f2ba..1d0d271 100644
--- a/gateway_common/GatewayPage.php
+++ b/gateway_common/GatewayPage.php
@@ -398,6 +398,17 @@
 
$this->setHeaders();
 
+   if ( $this->isRepeatReturnProcess() ) {
+   $this->logger->warning(
+   'Donor is trying to process an 
already-processed payment. ' .
+   "Adapter Order ID: $oid.\n" .
+   "Cookies: " . print_r( $_COOKIE, true ) ."\n" .
+   "User-Agent: " . $_SERVER['HTTP_USER_AGENT']
+   );
+   $this->displayThankYouPage( 'repeat return processing' 
);
+   return;
+   }
+
if ( $deadSession ){
if ( $this->adapter->isReturnProcessingRequired() ) {
wfHttpError( 403, 'Forbidden', wfMessage( 
'donate_interface-error-http-403' )->text() );
@@ -429,6 +440,7 @@
// feed processDonorReturn all the GET and POST vars
$requestValues = $this->getRequest()->getValues();
$result = $this->adapter->processDonorReturn( 
$requestValues );
+   $this->markReturnProcessed();
$this->renderResponse( $result );
return;
} else {
@@ -567,4 +579,34 @@
);
}
}
+
+   protected function isRepeatReturnProcess() {
+   $request = $this->getRequest();
+   $requestProcessId = $this->adapter->getRequestProcessId(
+   $request->getValues()
+   );
+   $processedRequests = $request->getSessionData( 
'processed_requests' );
+   if ( !$requestProcessId || empty( $processedRequests ) ) {
+   return false;
+   }
+   return array_key_exists( $requestProcessId, $processedRequests 
);
+   }
+
+   protected function markReturnProcessed() {
+   $request = $this->getRequest();
+   $requestProcessId = $this->adapter->getRequestProcessId(
+   $request->getValues()
+   );
+   if ( !$requestProcessId ) {
+   return;
+   }
+   $processedRequests = $request->getSessionData( 
'processed_requests' );
+   if ( !$processedRequests ) {
+   $processedRequests = array();
+   }
+   // TODO: we could store the results of the last process here, 
but for now
+   // we just indicate we did SOMETHING with it
+   $processedRequests[$requestProcessId] = true;
+   $request->setSessionData( 'processed_requests', 
$processedRequests );
+   }
 }
diff --git a/gateway_common/gateway.adapter.php 
b/gateway_common/gateway.adapter.php
index f26ffd0..9a25296 100644
--- a/gateway_common/gateway.adapter.php
+++ b/gateway_common/gateway.adapter.php
@@ -1452,6 +1452,18 @@
}
 
/**
+* Gateways which return true from isReturnProcessingRequired must
+* override this with logic to get an ID from the request which will
+* identify repeated attempts to process the same payment.
+*
+* @param array $requestValues
+* @return int|string Order id
+*/
+   protected function getRequestProcessId( $requestValues ) {
+   return null;
+   }
+
+   /**
 * Process the API response obtained from the payment processor and set
 * properties of transaction_response.
 * Default implementation just says we got a response.
@@ -2945,6 +2957,7 @@
'PaymentForms',
'numAttempt',
'order_status', //for post-payment activities
+   'processed_requests', //for post-payment 
activ