Give – Donation Plugin and Fundraising Platform - Version 2.19.5

Version Description

Download this release

Release Info

Developer jason_the_adams
Plugin Icon 128x128 Give – Donation Plugin and Fundraising Platform
Version 2.19.5
Comparing to
See all releases

Code changes from version 2.19.4 to 2.19.5

give.php CHANGED
@@ -5,7 +5,7 @@
5
  * Description: The most robust, flexible, and intuitive way to accept donations on WordPress.
6
  * Author: GiveWP
7
  * Author URI: https://givewp.com/
8
- * Version: 2.19.4
9
  * Requires at least: 4.9
10
  * Requires PHP: 5.6
11
  * Text Domain: give
@@ -289,7 +289,7 @@ final class Give
289
  {
290
  // Plugin version.
291
  if ( ! defined('GIVE_VERSION')) {
292
- define('GIVE_VERSION', '2.19.4');
293
  }
294
 
295
  // Plugin Root File.
5
  * Description: The most robust, flexible, and intuitive way to accept donations on WordPress.
6
  * Author: GiveWP
7
  * Author URI: https://givewp.com/
8
+ * Version: 2.19.5
9
  * Requires at least: 4.9
10
  * Requires PHP: 5.6
11
  * Text Domain: give
289
  {
290
  // Plugin version.
291
  if ( ! defined('GIVE_VERSION')) {
292
+ define('GIVE_VERSION', '2.19.5');
293
  }
294
 
295
  // Plugin Root File.
languages/give.pot CHANGED
@@ -2,14 +2,14 @@
2
  # This file is distributed under the same license as the Give - Donation Plugin plugin.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: Give - Donation Plugin 2.19.4\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/givewp\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "POT-Creation-Date: 2022-03-10T16:51:28+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.5.0\n"
15
  "X-Domain: give\n"
@@ -14812,7 +14812,7 @@ msgstr ""
14812
  msgid "An unexpected error occurred while processing the subscription. Please try again or contact the site administrator."
14813
  msgstr ""
14814
 
14815
- #: src/Framework/PaymentGateways/Routes/GatewayRoute.php:175
14816
  msgid "An unexpected error occurred while processing your donation. Please try again or contact us to help resolve."
14817
  msgstr ""
14818
 
@@ -15997,19 +15997,19 @@ msgstr ""
15997
  msgid "Dismiss"
15998
  msgstr ""
15999
 
16000
- #: src/Promotions/InPluginUpsells/SaleBanners.php:41
16001
  msgid "Black Friday/Giving Tuesday Sale"
16002
  msgstr ""
16003
 
16004
- #: src/Promotions/InPluginUpsells/SaleBanners.php:42
16005
  msgid "Save 40% on all Plans for a limited time."
16006
  msgstr ""
16007
 
16008
- #: src/Promotions/InPluginUpsells/SaleBanners.php:43
16009
  msgid "Black Friday through Giving Tuesday."
16010
  msgstr ""
16011
 
16012
- #: src/Promotions/InPluginUpsells/SaleBanners.php:44
16013
  msgid "Shop Now"
16014
  msgstr ""
16015
 
2
  # This file is distributed under the same license as the Give - Donation Plugin plugin.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: Give - Donation Plugin 2.19.5\n"
6
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/givewp\n"
7
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
8
  "Language-Team: LANGUAGE <LL@li.org>\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=UTF-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "POT-Creation-Date: 2022-03-11T20:58:17+00:00\n"
13
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
14
  "X-Generator: WP-CLI 2.5.0\n"
15
  "X-Domain: give\n"
14812
  msgid "An unexpected error occurred while processing the subscription. Please try again or contact the site administrator."
14813
  msgstr ""
14814
 
14815
+ #: src/Framework/PaymentGateways/Routes/GatewayRoute.php:188
14816
  msgid "An unexpected error occurred while processing your donation. Please try again or contact us to help resolve."
14817
  msgstr ""
14818
 
15997
  msgid "Dismiss"
15998
  msgstr ""
15999
 
16000
+ #: src/Promotions/InPluginUpsells/SaleBanners.php:42
16001
  msgid "Black Friday/Giving Tuesday Sale"
16002
  msgstr ""
16003
 
16004
+ #: src/Promotions/InPluginUpsells/SaleBanners.php:43
16005
  msgid "Save 40% on all Plans for a limited time."
16006
  msgstr ""
16007
 
16008
+ #: src/Promotions/InPluginUpsells/SaleBanners.php:44
16009
  msgid "Black Friday through Giving Tuesday."
16010
  msgstr ""
16011
 
16012
+ #: src/Promotions/InPluginUpsells/SaleBanners.php:45
16013
  msgid "Shop Now"
16014
  msgstr ""
16015
 
output.log CHANGED
@@ -16,12 +16,12 @@ c88517be8365: Pulling fs layer
16
  181891da1ea0: Pulling fs layer
17
  2a0fa75da19b: Pulling fs layer
18
  07289ea6b918: Pulling fs layer
19
- f1478d838f46: Waiting
20
  c88517be8365: Waiting
21
  142abe9b67c6: Waiting
22
  181891da1ea0: Waiting
23
  2a0fa75da19b: Waiting
24
  07289ea6b918: Waiting
 
25
  4612e05a72cf: Waiting
26
  801bfaa63ef2: Verifying Checksum
27
  801bfaa63ef2: Download complete
@@ -31,21 +31,21 @@ c88517be8365: Waiting
31
  30e209609427: Download complete
32
  801bfaa63ef2: Pull complete
33
  4612e05a72cf: Download complete
34
- 30e209609427: Pull complete
35
  c88517be8365: Verifying Checksum
36
  c88517be8365: Download complete
37
- 320f26ee9b1c: Pull complete
38
  f1478d838f46: Verifying Checksum
39
  f1478d838f46: Download complete
40
- 4612e05a72cf: Pull complete
41
- f1478d838f46: Pull complete
42
  181891da1ea0: Verifying Checksum
43
  181891da1ea0: Download complete
44
- c88517be8365: Pull complete
45
- 2a0fa75da19b: Verifying Checksum
46
- 2a0fa75da19b: Download complete
47
  142abe9b67c6: Verifying Checksum
48
  142abe9b67c6: Download complete
 
 
 
 
 
49
  07289ea6b918: Verifying Checksum
50
  07289ea6b918: Download complete
51
  142abe9b67c6: Pull complete
16
  181891da1ea0: Pulling fs layer
17
  2a0fa75da19b: Pulling fs layer
18
  07289ea6b918: Pulling fs layer
 
19
  c88517be8365: Waiting
20
  142abe9b67c6: Waiting
21
  181891da1ea0: Waiting
22
  2a0fa75da19b: Waiting
23
  07289ea6b918: Waiting
24
+ f1478d838f46: Waiting
25
  4612e05a72cf: Waiting
26
  801bfaa63ef2: Verifying Checksum
27
  801bfaa63ef2: Download complete
31
  30e209609427: Download complete
32
  801bfaa63ef2: Pull complete
33
  4612e05a72cf: Download complete
 
34
  c88517be8365: Verifying Checksum
35
  c88517be8365: Download complete
 
36
  f1478d838f46: Verifying Checksum
37
  f1478d838f46: Download complete
38
+ 30e209609427: Pull complete
 
39
  181891da1ea0: Verifying Checksum
40
  181891da1ea0: Download complete
41
+ 320f26ee9b1c: Pull complete
 
 
42
  142abe9b67c6: Verifying Checksum
43
  142abe9b67c6: Download complete
44
+ 4612e05a72cf: Pull complete
45
+ 2a0fa75da19b: Verifying Checksum
46
+ 2a0fa75da19b: Download complete
47
+ f1478d838f46: Pull complete
48
+ c88517be8365: Pull complete
49
  07289ea6b918: Verifying Checksum
50
  07289ea6b918: Download complete
51
  142abe9b67c6: Pull complete
readme.txt CHANGED
@@ -2,10 +2,10 @@
2
  Contributors: givewp, dlocc, webdevmattcrom, ravinderk, mehul0810, kevinwhoffman, jason_the_adams, henryholtgeerts, kbjohnson90, alaca, benmeredithgmailcom
3
  Donate link: https://go.givewp.com/home
4
  Tags: donation, donate, recurring donations, fundraising, crowdfunding
5
- Requires at least: 4.9
6
  Tested up to: 5.9
7
  Requires PHP: 5.6
8
- Stable tag: 2.19.4
9
  License: GPLv3
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
 
@@ -19,7 +19,7 @@ Transform the way you accept online donations, starting for free. With GiveWP yo
19
 
20
  [youtube https://youtu.be/dFjYyWLyB-k]
21
 
22
- = 💪🏽 GiveWP's Features =
23
 
24
  GiveWP is free and full of many advanced features to suit your needs. Start by choosing one of our donation form templates to create your first fundraising campaign. Then, take advantage of full-featured fundraising reports and donor management tools to increase your overall fundraising revenue by learning what makes donors donate.
25
 
@@ -54,20 +54,20 @@ Find out more:
54
  * **[View our GiveWP Live Demo site](https://go.givewp.com/demosite "See the Live Demo Site")**
55
  * **[Book a Live Demo with our Team](https://go.givewp.com/csdemo "Book a demo with our team")**
56
 
57
- = 🧑🏿‍🤝‍🧑🏿 Who Uses GiveWP? =
58
 
59
  With more than 100,000+ active installs of GiveWP, we hear more and more success stories from nonprofit organizations. Causes are using GiveWP to raise millions of dollars per year. Check out some of our GiveWP Stories and Case Studies for details about their success.
60
 
61
  * [The City Mission used GiveWP](https://go.givewp.com/cmstory) for Giving Tuesday and a competition fundraiser with a neighboring organization, where they raised $45K in 16 hours.
62
- * [A local neighborhood watch program](https://go.givewp.com/memstory) switched from using GoFundMe to GiveWP and raised $40,000 in five days for a memorial fundraiser.
63
- * [Students have funded their tuition](https://go.givewp.com/tuitionstory) to schools like Oxford through individual fundraising pages.
64
- * [A hospital raised money](https://go.givewp.com/twiststory) through a community-wide virtual dance party during the pandemic.
65
 
66
  In addition to nonprofit organizations, GiveWP is widely used for individual or creative purposes. We’ve seen tip jars for blogs or musicians, live streams, and more. Our [Donation Upsells for WooCommerce Add-on](https://go.givewp.com/wooread) is even used in some eCommerce stores to collect donations for a cause, or ask for tips in the cart or checkout.
67
 
68
- We’ve even seen GiveWP used to collect gifts for birthdays and weddings!
69
 
70
- = 💝 Simple and Pain-Free Giving =
71
 
72
  We built GiveWP to be the best WordPress donation plugin from day one. Simply install and activate the plugin to get started.
73
 
@@ -75,7 +75,7 @@ The strength of GiveWP lies within its optimized donation forms. When creating a
75
  You can also integrate your forms with a wide variety of payment processors, including PayPal and Stripe within the free plugin. You can also purchase add-ons to use Authorize,net, Bitpay, Square, and more.
76
 
77
 
78
- = 🌱 First Time Users =
79
 
80
  [youtube https://www.youtube.com/watch?v=UNRa8Dc6Ayc&feature=youtu.be]
81
 
@@ -83,7 +83,7 @@ For new users, we suggest reviewing our [Getting Started Guide](https://go.givew
83
 
84
  If you are a GiveWP customer with an active license of any of our popular add-ons, we'd love to hear from you and support you via our [Priority Support channel](https://go.givewp.com/support).
85
 
86
- = 💳 Accept Credit Card Donations =
87
 
88
  GiveWP comes with several payment gateway options:
89
 
@@ -93,9 +93,9 @@ GiveWP comes with several payment gateway options:
93
  * **Test Gateway** -- use the Test Gateway to see exactly how your donors will walk through the donation process.
94
  * **And many more Gateways** - View additional payment gateways on our website. These include Authorize.net, Bitpay, Square, Razorpay, Paytm, and more.
95
 
96
- = ⚙️ Extend GiveWP with Powerful Add-ons =
97
 
98
- GiveWP's goal is to "Democratize Generosity." We want to make it easy for *everyone* to raise funds online.
99
 
100
  In addition to our free donation plugin, we have [premium GiveWP add-ons](https://go.givewp.com/addons "View all of GiveWP's Premium Add-ons") available to extend the functionality of GiveWP. Ultimately, these tools allow you to raise more money and give you a better relationship with your donors.
101
 
@@ -112,7 +112,7 @@ Must-Have Add-ons for GiveWP:
112
 
113
  [View all of GiveWP's Add-ons](https://go.givewp.com/addons "View all GiveWP add-ons") to discover all the ways you can further enhance and extend GiveWP.
114
 
115
- = 🛠️ Easy to Customize and Enhance =
116
 
117
  Are you a developer? GiveWP is built with best practices and easy to extend and customize. Here are some great developer-oriented tutorials and docs to help you customize GiveWP to your liking:
118
 
@@ -127,11 +127,11 @@ Are you a developer? GiveWP is built with best practices and easy to extend and
127
  * [Site Redesigns Without Donation Data Loss](https://go.givewp.com/datalossdoc)
128
  * [Handling Custom CSS in WordPress](https://go.givewp.com/cssdoc)
129
 
130
- = 💚 About the GiveWP Team =
131
 
132
  GiveWP is part of StellarWP, a Liquid Web Family Brand. Our donation plugin is backed by a growing team of WordPress developers, support engineers, customer success managers, and marketing professionals who’ve worked with WordPress and nonprofits since 2009. This means GiveWP is made with best practices in mind; extremely extensible and customizable, stable, and reliable. We’ll be here in years to come for you and your nonprofit organization.
133
 
134
- = 📧 Connect with GiveWP =
135
 
136
  Stay in touch with us for important plugin news and updates:
137
 
@@ -141,7 +141,7 @@ Stay in touch with us for important plugin news and updates:
141
  * **[GiveWP Add-ons](https://go.givewp.com/addons "View all GiveWP Add-ons")**
142
  * **[Write for GiveWP](https://go.givewp.com/rmwrite4us)**
143
 
144
- = 🐱‍💻 Contribute to GiveWP =
145
 
146
  This plugin is proudly open source (GPL license) and we’re always looking for more contributors. Whether you know another language, can code like no one’s business, or just have an idea, we would love your help and input.
147
 
@@ -153,7 +153,6 @@ Here’s a few ways you can contribute to GiveWP:
153
 
154
  * Join the [GiveWP Community Facebook group](https://go.givewp.com/fb-group). We chat about all things related to WordPress, GiveWP, fundraising, and online donations in general.
155
 
156
-
157
  == Upgrade Notice ==
158
 
159
  == Installation ==
@@ -251,6 +250,9 @@ The 2% fee on Stripe donations only applies to donations taken via our free Stri
251
  8. GiveWP has a dedicated support team to help answer any questions you may have and help you through stumbling blocks.
252
 
253
  == Changelog ==
 
 
 
254
  = 2.19.4: March 10th, 2022 =
255
  * Fix: Resolved issue with PayPal failing to validate route after donating
256
  * Fix: Resolved issue with PayPal logo not loading
2
  Contributors: givewp, dlocc, webdevmattcrom, ravinderk, mehul0810, kevinwhoffman, jason_the_adams, henryholtgeerts, kbjohnson90, alaca, benmeredithgmailcom
3
  Donate link: https://go.givewp.com/home
4
  Tags: donation, donate, recurring donations, fundraising, crowdfunding
5
+ Requires at least: 5.0
6
  Tested up to: 5.9
7
  Requires PHP: 5.6
8
+ Stable tag: 2.19.5
9
  License: GPLv3
10
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
11
 
19
 
20
  [youtube https://youtu.be/dFjYyWLyB-k]
21
 
22
+ === GiveWP Features ===
23
 
24
  GiveWP is free and full of many advanced features to suit your needs. Start by choosing one of our donation form templates to create your first fundraising campaign. Then, take advantage of full-featured fundraising reports and donor management tools to increase your overall fundraising revenue by learning what makes donors donate.
25
 
54
  * **[View our GiveWP Live Demo site](https://go.givewp.com/demosite "See the Live Demo Site")**
55
  * **[Book a Live Demo with our Team](https://go.givewp.com/csdemo "Book a demo with our team")**
56
 
57
+ === 🧑🏿‍🤝‍🧑🏿 Who Uses GiveWP? ===
58
 
59
  With more than 100,000+ active installs of GiveWP, we hear more and more success stories from nonprofit organizations. Causes are using GiveWP to raise millions of dollars per year. Check out some of our GiveWP Stories and Case Studies for details about their success.
60
 
61
  * [The City Mission used GiveWP](https://go.givewp.com/cmstory) for Giving Tuesday and a competition fundraiser with a neighboring organization, where they raised $45K in 16 hours.
62
+ * [A local neighborhood watch program](https://go.givewp.com/memstory) switched from using GoFundMe to GiveWP and raised $40,000 in five days for a memorial fundraiser.
63
+ * [Students have funded their tuition](https://go.givewp.com/tuitionstory) to schools like Oxford through individual fundraising pages.
64
+ * [A hospital raised money](https://go.givewp.com/twiststory) through a community-wide virtual dance party during the pandemic.
65
 
66
  In addition to nonprofit organizations, GiveWP is widely used for individual or creative purposes. We’ve seen tip jars for blogs or musicians, live streams, and more. Our [Donation Upsells for WooCommerce Add-on](https://go.givewp.com/wooread) is even used in some eCommerce stores to collect donations for a cause, or ask for tips in the cart or checkout.
67
 
68
+ We’ve even seen GiveWP used to collect gifts for birthdays and weddings!
69
 
70
+ === 💝 Simple and Pain-Free Giving ===
71
 
72
  We built GiveWP to be the best WordPress donation plugin from day one. Simply install and activate the plugin to get started.
73
 
75
  You can also integrate your forms with a wide variety of payment processors, including PayPal and Stripe within the free plugin. You can also purchase add-ons to use Authorize,net, Bitpay, Square, and more.
76
 
77
 
78
+ === 🌱 First Time Users ===
79
 
80
  [youtube https://www.youtube.com/watch?v=UNRa8Dc6Ayc&feature=youtu.be]
81
 
83
 
84
  If you are a GiveWP customer with an active license of any of our popular add-ons, we'd love to hear from you and support you via our [Priority Support channel](https://go.givewp.com/support).
85
 
86
+ === 💳 Accept Credit Card Donations ===
87
 
88
  GiveWP comes with several payment gateway options:
89
 
93
  * **Test Gateway** -- use the Test Gateway to see exactly how your donors will walk through the donation process.
94
  * **And many more Gateways** - View additional payment gateways on our website. These include Authorize.net, Bitpay, Square, Razorpay, Paytm, and more.
95
 
96
+ === ⚙️ Extend GiveWP with Powerful Add-ons ===
97
 
98
+ GiveWP's goal is to "Democratize Generosity." We want to make it easy for *everyone* to raise funds online.
99
 
100
  In addition to our free donation plugin, we have [premium GiveWP add-ons](https://go.givewp.com/addons "View all of GiveWP's Premium Add-ons") available to extend the functionality of GiveWP. Ultimately, these tools allow you to raise more money and give you a better relationship with your donors.
101
 
112
 
113
  [View all of GiveWP's Add-ons](https://go.givewp.com/addons "View all GiveWP add-ons") to discover all the ways you can further enhance and extend GiveWP.
114
 
115
+ === 🛠️ Easy to Customize and Enhance ===
116
 
117
  Are you a developer? GiveWP is built with best practices and easy to extend and customize. Here are some great developer-oriented tutorials and docs to help you customize GiveWP to your liking:
118
 
127
  * [Site Redesigns Without Donation Data Loss](https://go.givewp.com/datalossdoc)
128
  * [Handling Custom CSS in WordPress](https://go.givewp.com/cssdoc)
129
 
130
+ === 💚 About the GiveWP Team ===
131
 
132
  GiveWP is part of StellarWP, a Liquid Web Family Brand. Our donation plugin is backed by a growing team of WordPress developers, support engineers, customer success managers, and marketing professionals who’ve worked with WordPress and nonprofits since 2009. This means GiveWP is made with best practices in mind; extremely extensible and customizable, stable, and reliable. We’ll be here in years to come for you and your nonprofit organization.
133
 
134
+ === 📧 Connect with GiveWP ===
135
 
136
  Stay in touch with us for important plugin news and updates:
137
 
141
  * **[GiveWP Add-ons](https://go.givewp.com/addons "View all GiveWP Add-ons")**
142
  * **[Write for GiveWP](https://go.givewp.com/rmwrite4us)**
143
 
144
+ === 🐱‍💻 Contribute to GiveWP ===
145
 
146
  This plugin is proudly open source (GPL license) and we’re always looking for more contributors. Whether you know another language, can code like no one’s business, or just have an idea, we would love your help and input.
147
 
153
 
154
  * Join the [GiveWP Community Facebook group](https://go.givewp.com/fb-group). We chat about all things related to WordPress, GiveWP, fundraising, and online donations in general.
155
 
 
156
  == Upgrade Notice ==
157
 
158
  == Installation ==
250
  8. GiveWP has a dedicated support team to help answer any questions you may have and help you through stumbling blocks.
251
 
252
  == Changelog ==
253
+ = 2.19.5: March 11th, 2022 =
254
+ * Fix: Resolved issue with PayPal failing to validate for authenticated users
255
+
256
  = 2.19.4: March 10th, 2022 =
257
  * Fix: Resolved issue with PayPal failing to validate route after donating
258
  * Fix: Resolved issue with PayPal logo not loading
src/Framework/PaymentGateways/DataTransferObjects/GatewayRouteData.php CHANGED
@@ -28,10 +28,15 @@ class GatewayRouteData
28
  * @var string|null
29
  */
30
  public $routeSignatureId;
 
 
 
 
31
 
32
  /**
33
  * Convert data from request into DTO
34
  *
 
35
  * @since 2.19.4 add give-route-signature-id
36
  * @since 2.18.0
37
  *
@@ -45,6 +50,7 @@ class GatewayRouteData
45
  $self->gatewayMethod = $request['give-gateway-method'];
46
  $self->routeSignature = isset($request['give-route-signature']) ? $request['give-route-signature'] : null;
47
  $self->routeSignatureId = isset($request['give-route-signature-id']) ? $request['give-route-signature-id'] : null;
 
48
 
49
  $self->queryParams = array_filter($request, static function ($param) {
50
  return !in_array(
@@ -54,7 +60,8 @@ class GatewayRouteData
54
  'give-gateway-id',
55
  'give-gateway-method',
56
  'give-route-signature',
57
- 'give-route-signature-id'
 
58
  ]
59
  );
60
  }, ARRAY_FILTER_USE_KEY);
28
  * @var string|null
29
  */
30
  public $routeSignatureId;
31
+ /**
32
+ * @var string|null
33
+ */
34
+ public $routeSignatureExpiration;
35
 
36
  /**
37
  * Convert data from request into DTO
38
  *
39
+ * @since 2.19.5 add routeSignatureExpiration
40
  * @since 2.19.4 add give-route-signature-id
41
  * @since 2.18.0
42
  *
50
  $self->gatewayMethod = $request['give-gateway-method'];
51
  $self->routeSignature = isset($request['give-route-signature']) ? $request['give-route-signature'] : null;
52
  $self->routeSignatureId = isset($request['give-route-signature-id']) ? $request['give-route-signature-id'] : null;
53
+ $self->routeSignatureExpiration = isset($request['give-route-signature-expiration']) ? $request['give-route-signature-expiration'] : null;
54
 
55
  $self->queryParams = array_filter($request, static function ($param) {
56
  return !in_array(
60
  'give-gateway-id',
61
  'give-gateway-method',
62
  'give-route-signature',
63
+ 'give-route-signature-id',
64
+ 'give-route-signature-expiration'
65
  ]
66
  );
67
  }, ARRAY_FILTER_USE_KEY);
src/Framework/PaymentGateways/PaymentGateway.php CHANGED
@@ -256,6 +256,7 @@ abstract class PaymentGateway implements PaymentGatewayInterface, LegacyPaymentG
256
  /**
257
  * Generate secure gateway route url
258
  *
 
259
  * @since 2.19.4 replace RouteSignature args with unique donationId
260
  * @since 2.19.0
261
  *
@@ -268,15 +269,16 @@ abstract class PaymentGateway implements PaymentGatewayInterface, LegacyPaymentG
268
  */
269
  public function generateSecureGatewayRouteUrl($gatewayMethod, $donationId, $args = null)
270
  {
271
- $nonce = new RouteSignature($this->getId(), $gatewayMethod, $donationId);
272
 
273
  return Call::invoke(
274
  GenerateGatewayRouteUrl::class,
275
  $this->getId(),
276
  $gatewayMethod,
277
  array_merge($args, [
 
278
  'give-route-signature-id' => $donationId,
279
- 'give-route-signature' => $nonce->toNonce()
280
  ])
281
  );
282
  }
256
  /**
257
  * Generate secure gateway route url
258
  *
259
+ * @since 2.19.5 replace nonce with hash and expiration
260
  * @since 2.19.4 replace RouteSignature args with unique donationId
261
  * @since 2.19.0
262
  *
269
  */
270
  public function generateSecureGatewayRouteUrl($gatewayMethod, $donationId, $args = null)
271
  {
272
+ $signature = new RouteSignature($this->getId(), $gatewayMethod, $donationId);
273
 
274
  return Call::invoke(
275
  GenerateGatewayRouteUrl::class,
276
  $this->getId(),
277
  $gatewayMethod,
278
  array_merge($args, [
279
+ 'give-route-signature' => $signature->toHash(),
280
  'give-route-signature-id' => $donationId,
281
+ 'give-route-signature-expiration' => $signature->expiration,
282
  ])
283
  );
284
  }
src/Framework/PaymentGateways/Routes/GatewayRoute.php CHANGED
@@ -118,7 +118,8 @@ class GatewayRoute
118
  /**
119
  * Validate signature using nonces
120
  *
121
- * @@since 2.19.4 replace RouteSignature args with unique donationId
 
122
  * @since 2.19.0
123
  *
124
  * @param string $routeSignature
@@ -128,12 +129,24 @@ class GatewayRoute
128
  */
129
  private function validateSignature($routeSignature, GatewayRouteData $data)
130
  {
131
- $action = new RouteSignature($data->gatewayId, $data->gatewayMethod, $data->routeSignatureId);
132
-
133
- if (!wp_verify_nonce($routeSignature, $action->toString())) {
 
 
 
 
 
134
  PaymentGatewayLog::error(
135
  'Invalid Secure Route',
136
- ['routeSignature' => $routeSignature, 'action' => $action->toString(), 'data' => $data]
 
 
 
 
 
 
 
137
  );
138
 
139
  wp_die('Forbidden', 403);
118
  /**
119
  * Validate signature using nonces
120
  *
121
+ * @since 2.19.5 replace nonce with hash
122
+ * @since 2.19.4 replace RouteSignature args with unique donationId
123
  * @since 2.19.0
124
  *
125
  * @param string $routeSignature
129
  */
130
  private function validateSignature($routeSignature, GatewayRouteData $data)
131
  {
132
+ $signature = new RouteSignature(
133
+ $data->gatewayId,
134
+ $data->gatewayMethod,
135
+ $data->routeSignatureId,
136
+ $data->routeSignatureExpiration
137
+ );
138
+
139
+ if (!$signature->isValid($routeSignature)) {
140
  PaymentGatewayLog::error(
141
  'Invalid Secure Route',
142
+ [
143
+ 'routeSignature' => $routeSignature,
144
+ 'signature' => $signature,
145
+ 'signatureString' => $signature->toString(),
146
+ 'signatureHash' => $signature->toHash(),
147
+ 'signatureExpiration' => $signature->expiration,
148
+ 'data' => $data
149
+ ]
150
  );
151
 
152
  wp_die('Forbidden', 403);
src/Framework/PaymentGateways/Routes/RouteSignature.php CHANGED
@@ -2,29 +2,53 @@
2
 
3
  namespace Give\Framework\PaymentGateways\Routes;
4
 
 
 
5
  /**
6
  * Route signature for creating secure gateway route methods
7
  *
8
  * @since 2.19.0
9
  */
10
- class RouteSignature {
 
11
  /**
12
  * @var string
13
  */
14
  private $signature;
 
 
 
 
15
 
16
  /**
 
17
  * @since 2.19.4 replace RouteSignature args with unique donationId
18
- *
19
  * @since 2.19.0
20
  *
21
  * @param int $gatewayId
22
  * @param string $gatewayMethod
23
  * @param int $donationId
 
24
  */
25
- public function __construct($gatewayId, $gatewayMethod, $donationId)
26
  {
27
- $this->signature = "$gatewayId@$gatewayMethod:$donationId";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  }
29
 
30
  /**
@@ -38,12 +62,44 @@ class RouteSignature {
38
  }
39
 
40
  /**
41
- * @since 2.19.0
 
 
 
 
 
 
 
 
 
 
 
 
42
  *
43
- * @return false|string
44
  */
45
- public function toNonce()
46
  {
47
- return wp_create_nonce($this->signature);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  }
49
  }
2
 
3
  namespace Give\Framework\PaymentGateways\Routes;
4
 
5
+ use Give\Framework\Shims\Shim;
6
+
7
  /**
8
  * Route signature for creating secure gateway route methods
9
  *
10
  * @since 2.19.0
11
  */
12
+ class RouteSignature
13
+ {
14
  /**
15
  * @var string
16
  */
17
  private $signature;
18
+ /**
19
+ * @var string
20
+ */
21
+ public $expiration;
22
 
23
  /**
24
+ * @since 2.19.5 replace wp_create_nonce with wp_hash and timestamp expiration
25
  * @since 2.19.4 replace RouteSignature args with unique donationId
 
26
  * @since 2.19.0
27
  *
28
  * @param int $gatewayId
29
  * @param string $gatewayMethod
30
  * @param int $donationId
31
+ * @param string $expiration
32
  */
33
+ public function __construct($gatewayId, $gatewayMethod, $donationId, $expiration = null)
34
  {
35
+ $this->expiration = $expiration ?: $this->createExpirationTimestamp();
36
+ $this->signature = $this->generateSignatureString($gatewayId, $gatewayMethod, $donationId, $this->expiration);
37
+ }
38
+
39
+
40
+ /**
41
+ * @since 2.19.5
42
+ *
43
+ * @param string $gatewayId
44
+ * @param string $gatewayMethod
45
+ * @param int $donationId
46
+ * @param string $expiration
47
+ * @return string
48
+ */
49
+ private function generateSignatureString($gatewayId, $gatewayMethod, $donationId, $expiration)
50
+ {
51
+ return "$gatewayId@$gatewayMethod:$donationId|$expiration";
52
  }
53
 
54
  /**
62
  }
63
 
64
  /**
65
+ * @since 2.19.5
66
+ *
67
+ * @return string
68
+ */
69
+ public function toHash()
70
+ {
71
+ return wp_hash($this->signature);
72
+ }
73
+
74
+ /**
75
+ * Create expiration timestamp
76
+ *
77
+ * @since 2.19.5
78
  *
79
+ * @return string
80
  */
81
+ public function createExpirationTimestamp()
82
  {
83
+ Shim::load( 'current_datetime' );
84
+ return (string)current_datetime()->modify('+1 day')->getTimestamp();
85
+ }
86
+
87
+
88
+ /**
89
+ * @since 2.19.5
90
+ *
91
+ * @param string $suppliedSignature
92
+ * @return bool
93
+ */
94
+ public function isValid($suppliedSignature)
95
+ {
96
+ $isSignatureValid = hash_equals(
97
+ $suppliedSignature,
98
+ $this->toHash()
99
+ );
100
+
101
+ $isNotExpired = ((int)$this->expiration) >= current_datetime()->getTimestamp();
102
+
103
+ return $isSignatureValid && $isNotExpired;
104
  }
105
  }
src/Framework/Shims/Shim.php ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Give\Framework\Shims;
4
+
5
+ /**
6
+ * @since 2.19.5
7
+ */
8
+ class Shim
9
+ {
10
+ /**
11
+ * @since 2.19.5
12
+ *
13
+ * @param string $filename
14
+ * @return void
15
+ */
16
+ public static function load( $filename )
17
+ {
18
+ require_once trailingslashit(__DIR__) . "{$filename}.php";
19
+ }
20
+ }
src/Framework/Shims/current_datetime.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * `current_datetime()` and `wp_timezone_string()` were added in WordPress 5.3.
5
+ * GiveWP currently supports WordPress 5.0, so these functions need to be shimmed.
6
+ */
7
+
8
+ if( ! function_exists( 'current_datetime' ) )
9
+ {
10
+ /**
11
+ * Retrieves the current time as an object using the site’s timezone.
12
+ *
13
+ * @return DateTimeImmutable|false
14
+ */
15
+ function current_datetime()
16
+ {
17
+ return date_create_immutable('now', wp_timezone());
18
+ }
19
+ }
20
+
21
+ if( ! function_exists( 'wp_timezone' ) )
22
+ {
23
+ /**
24
+ * Retrieves the timezone of the site as a DateTimeZone object.
25
+ *
26
+ * @return DateTimeZone
27
+ */
28
+ function wp_timezone()
29
+ {
30
+ return new DateTimeZone(wp_timezone_string());
31
+ }
32
+ }
33
+
34
+ if( ! function_exists( 'wp_timezone_string' ) )
35
+ {
36
+ /**
37
+ * Retrieves the timezone of the site as a string.
38
+ *
39
+ * @return mixed|string|void
40
+ */
41
+ function wp_timezone_string()
42
+ {
43
+ $timezone_string = get_option('timezone_string');
44
+
45
+ if ($timezone_string) {
46
+ return $timezone_string;
47
+ }
48
+
49
+ $offset = (float)get_option('gmt_offset');
50
+ $hours = (int)$offset;
51
+ $minutes = ($offset - $hours);
52
+
53
+ $sign = ($offset < 0) ? '-' : '+';
54
+ $abs_hour = abs($hours);
55
+ $abs_mins = abs($minutes * 60);
56
+ $tz_offset = sprintf('%s%02d:%02d', $sign, $abs_hour, $abs_mins);
57
+
58
+ return $tz_offset;
59
+ }
60
+ }
src/Promotions/InPluginUpsells/SaleBanners.php CHANGED
@@ -4,6 +4,7 @@ namespace Give\Promotions\InPluginUpsells;
4
 
5
  use DateTimeImmutable;
6
  use DateTimeZone;
 
7
 
8
  /**
9
  * @since 2.17.0
@@ -56,6 +57,7 @@ class SaleBanners
56
  */
57
  public function getVisibleBanners()
58
  {
 
59
  $currentDateTime = current_datetime();
60
  $currentUserId = get_current_user_id();
61
  $giveWPWebsiteTimezone = new DateTimeZone('America/Los_Angeles');
4
 
5
  use DateTimeImmutable;
6
  use DateTimeZone;
7
+ use Give\Framework\Shims\Shim;
8
 
9
  /**
10
  * @since 2.17.0
57
  */
58
  public function getVisibleBanners()
59
  {
60
+ Shim::load( 'current_datetime' );
61
  $currentDateTime = current_datetime();
62
  $currentUserId = get_current_user_id();
63
  $giveWPWebsiteTimezone = new DateTimeZone('America/Los_Angeles');
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInite9304d023c4911a5fac68f72cfd5b90a::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit051a02152ae0b2f3ff3e04bc8f885aaf::getLoader();
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInite9304d023c4911a5fac68f72cfd5b90a
6
  {
7
  private static $loader;
8
 
@@ -24,15 +24,15 @@ class ComposerAutoloaderInite9304d023c4911a5fac68f72cfd5b90a
24
 
25
  require __DIR__ . '/platform_check.php';
26
 
27
- spl_autoload_register(array('ComposerAutoloaderInite9304d023c4911a5fac68f72cfd5b90a', 'loadClassLoader'), true, true);
28
  self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
29
- spl_autoload_unregister(array('ComposerAutoloaderInite9304d023c4911a5fac68f72cfd5b90a', 'loadClassLoader'));
30
 
31
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
32
  if ($useStaticLoader) {
33
  require __DIR__ . '/autoload_static.php';
34
 
35
- call_user_func(\Composer\Autoload\ComposerStaticInite9304d023c4911a5fac68f72cfd5b90a::getInitializer($loader));
36
  } else {
37
  $map = require __DIR__ . '/autoload_namespaces.php';
38
  foreach ($map as $namespace => $path) {
@@ -53,12 +53,12 @@ class ComposerAutoloaderInite9304d023c4911a5fac68f72cfd5b90a
53
  $loader->register(true);
54
 
55
  if ($useStaticLoader) {
56
- $includeFiles = Composer\Autoload\ComposerStaticInite9304d023c4911a5fac68f72cfd5b90a::$files;
57
  } else {
58
  $includeFiles = require __DIR__ . '/autoload_files.php';
59
  }
60
  foreach ($includeFiles as $fileIdentifier => $file) {
61
- composerRequiree9304d023c4911a5fac68f72cfd5b90a($fileIdentifier, $file);
62
  }
63
 
64
  return $loader;
@@ -70,7 +70,7 @@ class ComposerAutoloaderInite9304d023c4911a5fac68f72cfd5b90a
70
  * @param string $file
71
  * @return void
72
  */
73
- function composerRequiree9304d023c4911a5fac68f72cfd5b90a($fileIdentifier, $file)
74
  {
75
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
76
  $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit051a02152ae0b2f3ff3e04bc8f885aaf
6
  {
7
  private static $loader;
8
 
24
 
25
  require __DIR__ . '/platform_check.php';
26
 
27
+ spl_autoload_register(array('ComposerAutoloaderInit051a02152ae0b2f3ff3e04bc8f885aaf', 'loadClassLoader'), true, true);
28
  self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
29
+ spl_autoload_unregister(array('ComposerAutoloaderInit051a02152ae0b2f3ff3e04bc8f885aaf', 'loadClassLoader'));
30
 
31
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
32
  if ($useStaticLoader) {
33
  require __DIR__ . '/autoload_static.php';
34
 
35
+ call_user_func(\Composer\Autoload\ComposerStaticInit051a02152ae0b2f3ff3e04bc8f885aaf::getInitializer($loader));
36
  } else {
37
  $map = require __DIR__ . '/autoload_namespaces.php';
38
  foreach ($map as $namespace => $path) {
53
  $loader->register(true);
54
 
55
  if ($useStaticLoader) {
56
+ $includeFiles = Composer\Autoload\ComposerStaticInit051a02152ae0b2f3ff3e04bc8f885aaf::$files;
57
  } else {
58
  $includeFiles = require __DIR__ . '/autoload_files.php';
59
  }
60
  foreach ($includeFiles as $fileIdentifier => $file) {
61
+ composerRequire051a02152ae0b2f3ff3e04bc8f885aaf($fileIdentifier, $file);
62
  }
63
 
64
  return $loader;
70
  * @param string $file
71
  * @return void
72
  */
73
+ function composerRequire051a02152ae0b2f3ff3e04bc8f885aaf($fileIdentifier, $file)
74
  {
75
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
76
  $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInite9304d023c4911a5fac68f72cfd5b90a
8
  {
9
  public static $files = array (
10
  '5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php',
@@ -125,9 +125,9 @@ class ComposerStaticInite9304d023c4911a5fac68f72cfd5b90a
125
  public static function getInitializer(ClassLoader $loader)
126
  {
127
  return \Closure::bind(function () use ($loader) {
128
- $loader->prefixLengthsPsr4 = ComposerStaticInite9304d023c4911a5fac68f72cfd5b90a::$prefixLengthsPsr4;
129
- $loader->prefixDirsPsr4 = ComposerStaticInite9304d023c4911a5fac68f72cfd5b90a::$prefixDirsPsr4;
130
- $loader->classMap = ComposerStaticInite9304d023c4911a5fac68f72cfd5b90a::$classMap;
131
 
132
  }, null, ClassLoader::class);
133
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit051a02152ae0b2f3ff3e04bc8f885aaf
8
  {
9
  public static $files = array (
10
  '5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php',
125
  public static function getInitializer(ClassLoader $loader)
126
  {
127
  return \Closure::bind(function () use ($loader) {
128
+ $loader->prefixLengthsPsr4 = ComposerStaticInit051a02152ae0b2f3ff3e04bc8f885aaf::$prefixLengthsPsr4;
129
+ $loader->prefixDirsPsr4 = ComposerStaticInit051a02152ae0b2f3ff3e04bc8f885aaf::$prefixDirsPsr4;
130
+ $loader->classMap = ComposerStaticInit051a02152ae0b2f3ff3e04bc8f885aaf::$classMap;
131
 
132
  }, null, ClassLoader::class);
133
  }
vendor/composer/installed.php CHANGED
@@ -1,11 +1,11 @@
1
  <?php return array(
2
  'root' => array(
3
- 'pretty_version' => '2.19.4',
4
- 'version' => '2.19.4.0',
5
  'type' => 'wordpress-plugin',
6
  'install_path' => __DIR__ . '/../../',
7
  'aliases' => array(),
8
- 'reference' => 'e1a1ce50a49a014ade347a63f34ea38dffa55750',
9
  'name' => 'impress-org/give',
10
  'dev' => false,
11
  ),
@@ -41,12 +41,12 @@
41
  ),
42
  ),
43
  'impress-org/give' => array(
44
- 'pretty_version' => '2.19.4',
45
- 'version' => '2.19.4.0',
46
  'type' => 'wordpress-plugin',
47
  'install_path' => __DIR__ . '/../../',
48
  'aliases' => array(),
49
- 'reference' => 'e1a1ce50a49a014ade347a63f34ea38dffa55750',
50
  'dev_requirement' => false,
51
  ),
52
  'kjohnson/format-object-list' => array(
1
  <?php return array(
2
  'root' => array(
3
+ 'pretty_version' => '2.19.5',
4
+ 'version' => '2.19.5.0',
5
  'type' => 'wordpress-plugin',
6
  'install_path' => __DIR__ . '/../../',
7
  'aliases' => array(),
8
+ 'reference' => '6e61ac09bc7aa92985309601d7e79c81228442b2',
9
  'name' => 'impress-org/give',
10
  'dev' => false,
11
  ),
41
  ),
42
  ),
43
  'impress-org/give' => array(
44
+ 'pretty_version' => '2.19.5',
45
+ 'version' => '2.19.5.0',
46
  'type' => 'wordpress-plugin',
47
  'install_path' => __DIR__ . '/../../',
48
  'aliases' => array(),
49
+ 'reference' => '6e61ac09bc7aa92985309601d7e79c81228442b2',
50
  'dev_requirement' => false,
51
  ),
52
  'kjohnson/format-object-list' => array(