Ejegg has uploaded a new change for review.
https://gerrit.wikimedia.org/r/280790
Change subject: Move data constraints to config
......................................................................
Move data constraints to config
Declarative party, y'all. There are still some rules in
GlobalCollect's tuneConstraints method, but this moves all the
easy ones.
Change-Id: Icea2b74e4d6d608cab2b832ed8470768db874dfc
---
M adyen_gateway/adyen.adapter.php
M amazon_gateway/amazon.adapter.php
M astropay_gateway/astropay.adapter.php
A astropay_gateway/config/data_constraints.yaml
M gateway_common/gateway.adapter.php
A globalcollect_gateway/config/data_constraints.yaml
M globalcollect_gateway/globalcollect.adapter.php
M paypal_gateway/paypal.adapter.php
A worldpay_gateway/config/data_constraints.yaml
M worldpay_gateway/worldpay.adapter.php
10 files changed, 339 insertions(+), 261 deletions(-)
git pull
ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/DonationInterface
refs/changes/90/280790/1
diff --git a/adyen_gateway/adyen.adapter.php b/adyen_gateway/adyen.adapter.php
index 7cfb42c..1dd74a0 100644
--- a/adyen_gateway/adyen.adapter.php
+++ b/adyen_gateway/adyen.adapter.php
@@ -45,9 +45,6 @@
);
}
- function defineDataConstraints() {
- }
-
function defineErrorMap() {
$this->error_map = array(
'internal-0000' => 'donate_interface-processing-error',
// Failed failed pre-process checks.
diff --git a/amazon_gateway/amazon.adapter.php
b/amazon_gateway/amazon.adapter.php
index b8720d2..53930be 100644
--- a/amazon_gateway/amazon.adapter.php
+++ b/amazon_gateway/amazon.adapter.php
@@ -81,8 +81,6 @@
function defineReturnValueMap() {}
- function defineDataConstraints() {}
-
function defineOrderIDMeta() {
$this->order_id_meta = array(
'generate' => TRUE,
diff --git a/astropay_gateway/astropay.adapter.php
b/astropay_gateway/astropay.adapter.php
index 274cf3a..599efc9 100644
--- a/astropay_gateway/astropay.adapter.php
+++ b/astropay_gateway/astropay.adapter.php
@@ -43,29 +43,6 @@
$this->accountInfo = $this->account_config;
}
- function defineDataConstraints() {
- $this->dataConstraints = array(
- 'x_login' => array( 'type' =>
'alphanumeric', 'length' => 10, ),
- 'x_trans_key' => array( 'type' => 'alphanumeric',
'length' => 10, ),
- 'x_invoice' => array( 'type' =>
'alphanumeric', 'length' => 20, ),
- 'x_amount' => array( 'type' => 'numeric',
),
- 'x_currency' => array( 'type' => 'alphanumeric',
'length' => 3, ),
- 'x_bank' => array( 'type' =>
'alphanumeric', 'length' => 3, ),
- 'x_country' => array( 'type' =>
'alphanumeric', 'length' => 2, ),
- 'x_description' => array( 'type' => 'alphanumeric',
'length' => 200, ),
- 'x_iduser' => array( 'type' =>
'alphanumeric', 'length' => 20, ),
- 'x_cpf' => array( 'type' =>
'alphanumeric', 'length' => 30, ),
- 'x_name' => array( 'type' =>
'alphanumeric', ),
- 'x_email' => array( 'type' =>
'alphanumeric', ),
- 'x_bdate' => array( 'type' => 'date',
'length' => 8, ),
- 'x_address' => array( 'type' =>
'alphanumeric', ),
- 'x_zip' => array( 'type' =>
'alphanumeric', 'length' => 10, ),
- 'x_city' => array( 'type' =>
'alphanumeric', ),
- 'x_state' => array( 'type' =>
'alphanumeric', 'length' => 2, ),
- 'country_code' => array( 'type' => 'alphanumeric',
'length' => 2, ),
- );
- }
-
function defineErrorMap() {
$this->error_map = array(
'internal-0000' => 'donate_interface-processing-error',
// Failed pre-process checks.
diff --git a/astropay_gateway/config/data_constraints.yaml
b/astropay_gateway/config/data_constraints.yaml
new file mode 100644
index 0000000..2ac59be
--- /dev/null
+++ b/astropay_gateway/config/data_constraints.yaml
@@ -0,0 +1,49 @@
+x_login:
+ type: alphanumeric
+ length: 10
+x_trans_key:
+ type: alphanumeric
+ length: 10
+x_invoice:
+ type: alphanumeric
+ length: 20
+x_amount:
+ type: numeric
+x_currency:
+ type: alphanumeric
+ length: 3
+x_bank:
+ type: alphanumeric
+ length: 3
+x_country:
+ type: alphanumeric
+ length: 2
+x_description:
+ type: alphanumeric
+ length: 200
+x_iduser:
+ type: alphanumeric
+ length: 20
+x_cpf:
+ type: alphanumeric
+ length: 30
+x_name:
+ type: alphanumeric
+x_email:
+ type: alphanumeric
+x_bdate:
+ type: date
+ length: 8
+x_address:
+ type: alphanumeric
+x_zip:
+ type: alphanumeric
+ length: 10
+x_city:
+ type: alphanumeric
+x_state:
+ type: alphanumeric
+ length: 2
+country_code:
+ type: alphanumeric
+ length: 2
diff --git a/gateway_common/gateway.adapter.php
b/gateway_common/gateway.adapter.php
index 60d358e..59234b3 100644
--- a/gateway_common/gateway.adapter.php
+++ b/gateway_common/gateway.adapter.php
@@ -328,6 +328,13 @@
}
}
+ // TODO: see comment on definePaymentMethods
+ public function defineDataConstraints() {
+ if ( isset( $this->config['data_constraints'] ) ) {
+ $this->dataConstraints =
$this->config['data_constraints'];
+ }
+ }
+
/**
* Determine which account to use for this session
*/
diff --git a/globalcollect_gateway/config/data_constraints.yaml
b/globalcollect_gateway/config/data_constraints.yaml
new file mode 100644
index 0000000..e435831
--- /dev/null
+++ b/globalcollect_gateway/config/data_constraints.yaml
@@ -0,0 +1,208 @@
+# General fields
+# ACCOUNTHOLDER: AN50
+account_holder:
+ type: alphanumeric
+ length: 50
+# ACCOUNTNAME: AN35
+account_name:
+ type: alphanumeric
+ length: 35
+# ACCOUNTNUMBER: AN30
+account_number:
+ type: alphanumeric
+ length: 30
+# ADDRESSLINE1E: AN35
+address_line_1e:
+ type: alphanumeric
+ length: 35
+# ADDRESSLINE2: AN35
+address_line_2:
+ type: alphanumeric
+ length: 35
+# ADDRESSLINE3: AN35
+address_line_3:
+ type: alphanumeric
+ length: 35
+# ADDRESSLINE4: AN35
+address_line_4:
+ type: alphanumeric
+ length: 35
+# ATTEMPTID: N5
+attempt_id:
+ type: numeric
+ length: 5
+# Did not find this one
+# AUTHORISATIONID: AN18
+authorization_id:
+ type: alphanumeric
+ length: 18
+# AMOUNT: N12
+amount:
+ type: numeric
+ length: 12
+# BANKACCOUNTNUMBER: AN50
+bank_account_number:
+ type: alphanumeric
+ length: 50
+# BANKAGENZIA: AN30
+bank_agenzia:
+ type: alphanumeric
+ length: 30
+# BANKCHECKDIGIT: AN2
+bank_check_digit:
+ type: alphanumeric
+ length: 2
+# BANKCODE: N5
+bank_code:
+ type: numeric
+ length: 5
+# BANKFILIALE: AN30
+bank_filiale:
+ type: alphanumeric
+ length: 30
+# BANKNAME: AN40
+bank_name:
+ type: alphanumeric
+ length: 40
+# BRANCHCODE: N5
+branch_code:
+ type: numeric
+ length: 5
+# CITY: AN40
+city:
+ type: alphanumeric
+ length: 40
+# COUNTRYCODE: AN2
+country:
+ type: alphanumeric
+ length: 2
+# COUNTRYCODEBANK: AN2
+country_code_bank:
+ type: alphanumeric
+ length: 2
+# COUNTRYDESCRIPTION: AN50
+country_description:
+ type: alphanumeric
+ length: 50
+# CUSTOMERBANKCITY: AN50
+customer_bank_city:
+ type: alphanumeric
+ length: 50
+# CUSTOMERBANKSTREET: AN30
+customer_bank_street:
+ type: alphanumeric
+ length: 30
+# CUSTOMERBANKNUMBER: N5
+customer_bank_number:
+ type: numeric
+ length: 5
+# CUSTOMERBANKZIP: AN10
+customer_bank_zip:
+ type: alphanumeric
+ length: 10
+# CREDITCARDNUMBER: N19
+card_num:
+ type: numeric
+ length: 19
+# CURRENCYCODE: AN3
+currency_code:
+ type: alphanumeric
+ length: 3
+# CVV: N4
+cvv:
+ type: numeric
+ length: 4
+# DATECOLLECT: D8 YYYYMMDD
+date_collect:
+ type: date
+ length: 8
+# DIRECTDEBITTEXT: AN50
+direct_debit_text:
+ type: alphanumeric
+ length: 50
+# DOMICILIO: AN30
+domicilio:
+ type: alphanumeric
+ length: 30
+# EFFORTID: N5
+effort_id:
+ type: numeric
+ length: 5
+# EMAIL: AN70
+email:
+ type: alphanumeric
+ length: 70
+# EXPIRYDATE: N4 MMYY
+expiration:
+ type: numeric
+ length: 4
+# FIRSTNAME: AN15
+fname:
+ type: alphanumeric
+ length: 15
+# IBAN: AN50 (AN21 on direct debit)
+iban:
+ type: alphanumeric
+ length: 50
+# IPADDRESS: AN32
+user_ip:
+ type: alphanumeric
+ length: 32
+# ISSUERID: N4
+issuer_id:
+ type: numeric
+ length: 4
+# LANGUAGECODE: AN2
+language:
+ type: alphanumeric
+ length: 2
+# ORDERID: N10
+order_id:
+ type: numeric
+ length: 10
+# PAYMENTPRODUCTID
+payment_product:
+ type: numeric
+ length: 5
+# PAYMENTREFERENCE: AN20
+payment_reference:
+ type: alphanumeric
+ length: 20
+# PROVINCIA: AN30
+provincia:
+ type: alphanumeric
+ length: 30
+# RETURNURL: AN512
+returnto:
+ type: alphanumeric
+ length: 512
+# SPECIALID: AN255
+special_id:
+ type: alphanumeric
+ length: 255
+# STATE: AN35
+state:
+ type: alphanumeric
+ length: 35
+# STREET: AN50
+street:
+ type: alphanumeric
+ length: 50
+# SURNAME: AN35
+lname:
+ type: alphanumeric
+ length: 35
+# SWIFTCODE: AN255
+# This is AN11 for several payment types we are not dealing with yet.
+swift_code:
+ type: alphanumeric
+ length: 255
+# TRANSACTIONTYPE: AN2
+transaction_type:
+ type: alphanumeric
+ length: 2
+# ZIP: AN10
+zip:
+ type: alphanumeric
+ length: 10
+
diff --git a/globalcollect_gateway/globalcollect.adapter.php
b/globalcollect_gateway/globalcollect.adapter.php
index 91a95ce..f91ebab 100644
--- a/globalcollect_gateway/globalcollect.adapter.php
+++ b/globalcollect_gateway/globalcollect.adapter.php
@@ -59,173 +59,6 @@
}
/**
- * Define dataConstraints
- */
- public function defineDataConstraints() {
-
- $this->dataConstraints = array(
-
- // General fields
-
- //'ACCOUNTHOLDER' => 'account_holder',
AN50
- 'account_holder' => array( 'type' =>
'alphanumeric', 'length' => 50, ),
-
- //'ACCOUNTNAME' => 'account_name'
AN35
- 'account_name' => array( 'type' =>
'alphanumeric', 'length' => 35, ),
-
- //'ACCOUNTNUMBER' => 'account_number'
AN30
- 'account_number' => array( 'type' =>
'alphanumeric', 'length' => 30, ),
-
- //'ADDRESSLINE1E' => 'address_line_1e'
AN35
- 'address_line_1e' => array( 'type' =>
'alphanumeric', 'length' => 35, ),
-
- //'ADDRESSLINE2' => 'address_line_2'
AN35
- 'address_line_2' => array( 'type' =>
'alphanumeric', 'length' => 35, ),
-
- //'ADDRESSLINE3' => 'address_line_3'
AN35
- 'address_line_3' => array( 'type' =>
'alphanumeric', 'length' => 35, ),
-
- //'ADDRESSLINE4' => 'address_line_4'
AN35
- 'address_line_4' => array( 'type' =>
'alphanumeric', 'length' => 35, ),
-
- //'ATTEMPTID' => 'attempt_id'
N5
- 'attempt_id' => array( 'type' =>
'numeric', 'length' => 5, ),
-
- // Did not find this one
- //'AUTHORISATIONID' => 'authorization_id'
AN18
- 'authorization_id' => array( 'type' =>
'alphanumeric', 'length' => 18, ),
-
- //'AMOUNT' => 'amount'
N12
- 'amount' => array(
'type' => 'numeric', 'length' => 12, ),
-
- //'BANKACCOUNTNUMBER' => 'bank_account_number'
AN50
- 'bank_account_number' => array( 'type' =>
'alphanumeric', 'length' => 50, ),
-
- //'BANKAGENZIA' => 'bank_agenzia'
AN30
- 'bank_agenzia' => array( 'type' =>
'alphanumeric', 'length' => 30, ),
-
- //'BANKCHECKDIGIT' => 'bank_check_digit'
AN2
- 'bank_check_digit' => array( 'type' =>
'alphanumeric', 'length' => 2, ),
-
- //'BANKCODE' => 'bank_code'
N5
- 'bank_code' => array(
'type' => 'numeric', 'length' => 5, ),
-
- //'BANKFILIALE' => 'bank_filiale'
AN30
- 'bank_filiale' => array( 'type' =>
'alphanumeric', 'length' => 30, ),
-
- //'BANKNAME' => 'bank_name'
AN40
- 'bank_name' => array(
'type' => 'alphanumeric', 'length' => 40, ),
-
- //'BRANCHCODE' => 'branch_code'
N5
- 'branch_code' => array( 'type' =>
'numeric', 'length' => 5, ),
-
- //'CITY' => 'city'
AN40
- 'city' => array(
'type' => 'alphanumeric', 'length' => 40, ),
-
- //'COUNTRYCODE' => 'country'
AN2
- 'country' => array(
'type' => 'alphanumeric', 'length' => 2, ),
-
- //'COUNTRYCODEBANK' => 'country_code_bank'
AN2
- 'country_code_bank' => array( 'type' =>
'alphanumeric', 'length' => 2, ),
-
- //'COUNTRYDESCRIPTION' => 'country_description'
AN50
- 'country_description' => array( 'type' =>
'alphanumeric', 'length' => 50, ),
-
- //'CUSTOMERBANKCITY' => 'customer_bank_city'
AN50
- 'customer_bank_city' => array( 'type' =>
'alphanumeric', 'length' => 50, ),
-
- //'CUSTOMERBANKSTREET' => 'customer_bank_street'
AN30
- 'customer_bank_street' => array( 'type' =>
'alphanumeric', 'length' => 30, ),
-
- //'CUSTOMERBANKNUMBER' => 'customer_bank_number'
N5
- 'customer_bank_number' => array( 'type' => 'numeric',
'length' => 5, ),
-
- //'CUSTOMERBANKZIP' => 'customer_bank_zip'
AN10
- 'customer_bank_zip' => array( 'type' =>
'alphanumeric', 'length' => 10, ),
-
- //'CREDITCARDNUMBER' => 'card_num'
N19
- 'card_num' => array(
'type' => 'numeric', 'length' => 19, ),
-
- //'CURRENCYCODE' => 'currency_code'
AN3
- 'currency_code' => array( 'type' =>
'alphanumeric', 'length' => 3, ),
-
- //'CVV' => 'cvv'
N4
- 'cvv' => array(
'type' => 'numeric', 'length' => 4, ),
-
- //'DATECOLLECT' => 'date_collect'
D8 YYYYMMDD
- 'date_collect' => array( 'type' =>
'date', 'length' => 8, ),
-
- //'DIRECTDEBITTEXT' => 'direct_debit_text'
AN50
- 'direct_debit_text' => array( 'type' =>
'alphanumeric', 'length' => 50, ),
-
- //'DOMICILIO' => 'domicilio'
AN30
- 'domicilio' => array(
'type' => 'alphanumeric', 'length' => 30, ),
-
- //'EFFORTID' => 'effort_id'
N5
- 'effort_id' => array(
'type' => 'numeric', 'length' => 5, ),
-
- //'EMAIL' => 'email'
AN70
- 'email' => array(
'type' => 'alphanumeric', 'length' => 70, ),
-
- //'EXPIRYDATE' => 'expiration'
N4 MMYY
- 'expiration' => array( 'type' =>
'numeric', 'length' => 4, ),
-
- //'FIRSTNAME' => 'fname'
AN15
- 'fname' => array(
'type' => 'alphanumeric', 'length' => 15, ),
-
- //'IBAN' => 'iban'
AN50
- // IBAN is AN21 on direct debit
- 'iban' => array(
'type' => 'alphanumeric', 'length' => 50, ),
-
- //'IPADDRESS' => 'user_ip'
AN32
- 'user_ip' => array(
'type' => 'alphanumeric', 'length' => 32, ),
-
- //'ISSUERID' => 'issuer_id'
N4
- 'issuer_id' => array(
'type' => 'numeric', 'length' => 4, ),
-
- //'LANGUAGECODE' => 'language'
AN2
- 'language' => array(
'type' => 'alphanumeric', 'length' => 2, ),
-
- //'ORDERID' => 'order_id'
N10
- 'order_id' => array(
'type' => 'numeric', 'length' => 10, ),
-
- //PAYMENTPRODUCTID
- 'payment_product' => array( 'type' =>
'numeric', 'length' => 5, ),
-
- //'PAYMENTREFERENCE' => 'payment_reference'
AN20
- 'payment_reference' => array( 'type' =>
'alphanumeric', 'length' => 20, ),
-
- //'PROVINCIA' => 'provincia'
AN30
- 'provincia' => array(
'type' => 'alphanumeric', 'length' => 30, ),
-
- //'RETURNURL' => 'returnto'
AN512
- 'returnto' => array(
'type' => 'alphanumeric', 'length' => 512, ),
-
- //'SPECIALID' => 'special_id'
AN255
- 'special_id' => array( 'type' =>
'alphanumeric', 'length' => 255, ),
-
- //'STATE' => 'state'
AN35
- 'state' => array(
'type' => 'alphanumeric', 'length' => 35, ),
-
- //'STREET' => 'street'
AN50
- 'street' => array(
'type' => 'alphanumeric', 'length' => 50, ),
-
- //'SURNAME' => 'lname'
AN35
- 'lname' => array(
'type' => 'alphanumeric', 'length' => 35, ),
-
- //'SWIFTCODE' => 'swift_code'
AN255
- // This is AN11 for several payment types we are not
dealing with yet.
- 'swift_code' => array( 'type' =>
'alphanumeric', 'length' => 255, ),
-
- //'TRANSACTIONTYPE' => 'transaction_type'
AN2
- 'transaction_type' => array( 'type' =>
'alphanumeric', 'length' => 2, ),
-
- //'ZIP' => 'zip'
AN10
- 'zip' => array(
'type' => 'alphanumeric', 'length' => 10, ),
- );
- }
-
- /**
* Define error_map
*
* @todo
diff --git a/paypal_gateway/paypal.adapter.php
b/paypal_gateway/paypal.adapter.php
index d03672d..6c2d359 100644
--- a/paypal_gateway/paypal.adapter.php
+++ b/paypal_gateway/paypal.adapter.php
@@ -58,8 +58,7 @@
function processResponse( $response ) {
$this->transaction_response->setCommunicationStatus( true );
}
- function defineDataConstraints() {
- }
+
function defineOrderIDMeta() {
$this->order_id_meta = array(
'generate' => false,
diff --git a/worldpay_gateway/config/data_constraints.yaml
b/worldpay_gateway/config/data_constraints.yaml
new file mode 100644
index 0000000..8a2f917
--- /dev/null
+++ b/worldpay_gateway/config/data_constraints.yaml
@@ -0,0 +1,74 @@
+# AcctName
+wp_acctname:
+ type: alphanumeric
+ length: 30
+# Address1
+street:
+ type: alphanumeric
+ length: 60
+# Amount
+amount:
+ type: numeric
+# CardId
+wp_card_id:
+ type: numeric
+# City
+city:
+ type: alphanumeric
+ length: 60
+# CountryCode
+country:
+ type: alphanumeric
+ length: 2
+# CurrencyId
+iso_currency_id:
+ type: numeric
+# CVN
+cvv:
+ type: numeric
+# Email
+email:
+ type: alphanumeric
+ length: 50
+# FirstName
+fname:
+ type: alphanumeric
+ length: 60
+# LastName
+lname:
+ type: alphanumeric
+ length: 60
+# OrderNumber
+order_id:
+ type: alphanumeric
+ length: 35
+# OTTRegion
+region_code:
+ type: numeric
+# OTTResultURL
+returnto:
+ type: alphanumeric
+ length: 255
+# PTTID
+wp_pttid:
+ type: numeric
+# REMOTE_ADDR
+user_ip:
+ type: alphanumeric
+ length: 100
+# StateCode
+state:
+ type: alphanumeric
+ length: 60
+# ZipCode
+zip:
+ type: alphanumeric
+ length: 30
+# MerchantReference2
+merchant_reference_2:
+ type: alphanumeric
+ length: 60
+# NarrativeStatement1
+narrative_statement_1:
+ type: alphanumeric
+ length: 50
diff --git a/worldpay_gateway/worldpay.adapter.php
b/worldpay_gateway/worldpay.adapter.php
index 0dfd4df..c255af8 100644
--- a/worldpay_gateway/worldpay.adapter.php
+++ b/worldpay_gateway/worldpay.adapter.php
@@ -223,70 +223,6 @@
);
}
- function defineDataConstraints() {
- $this->dataConstraints = array(
- // AcctName
- 'wp_acctname' => array( 'type' => 'alphanumeric',
'length' => 30 ),
-
- // Address1
- 'street' => array( 'type' => 'alphanumeric', 'length'
=> 60 ),
-
- // Amount
- 'amount' => array( 'type' => 'numeric' ),
-
- // CardId
- 'wp_card_id' => array( 'type' => 'numeric' ),
-
- // City
- 'city' => array( 'type' => 'alphanumeric', 'length' =>
60 ),
-
- // CountryCode
- 'country' => array( 'type' => 'alphanumeric', 'length'
=> 2 ),
-
- // CurrencyId
- 'iso_currency_id' => array( 'type' => 'numeric' ),
-
- // CVN
- 'cvv' => array( 'type' => 'numeric' ),
-
- // Email
- 'email' => array( 'type' => 'alphanumeric', 'length' =>
50 ),
-
- // FirstName
- 'fname' => array( 'type' => 'alphanumeric', 'length' =>
60 ),
-
- // LastName
- 'lname' => array( 'type' => 'alphanumeric', 'length' =>
60 ),
-
- // OrderNumber
- 'order_id' => array( 'type' => 'alphanumeric', 'length'
=> 35 ),
-
- // OTTRegion
- 'region_code' => array( 'type' => 'numeric' ),
-
- // OTTResultURL
- 'returnto' => array( 'type' => 'alphanumeric', 'length'
=> 255 ),
-
- // PTTID
- 'wp_pttid' => array( 'type' => 'numeric' ),
-
- // REMOTE_ADDR
- 'user_ip' => array( 'type' => 'alphanumeric', 'length'
=> 100 ),
-
- // StateCode
- 'state' => array( 'type' => 'alphanumeric', 'length' =>
60 ),
-
- // ZipCode
- 'zip' => array( 'type' => 'alphanumeric', 'length' =>
30 ),
-
- // MerchantReference2
- 'merchant_reference_2' => array( 'type' =>
'alphanumeric', 'length' => 60 ),
-
- // NarrativeStatement1
- 'narrative_statement_1' => array( 'type' =>
'alphanumeric', 'length' => 50 ),
- );
- }
-
/**
* Worldpay doesn't check order numbers until settlement at
* which point it's too late to do much about it. So; our order
--
To view, visit https://gerrit.wikimedia.org/r/280790
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Icea2b74e4d6d608cab2b832ed8470768db874dfc
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/DonationInterface
Gerrit-Branch: master
Gerrit-Owner: Ejegg <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits