JekyllEWP 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/jekyllEWP.rb +238 -0
- metadata +45 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 12964c4531c2345816914ddd5597571207bf80bc0b89ad8f30bcec4c5f1f39e3
|
4
|
+
data.tar.gz: 17635e0f34f63be74e297cd1e6a13a1a362dbfb31e4e1c58c25664f38be1593e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 9465bcf7f3fcd95bc3b868c7ce90e7f823394200914d2994d7858f9bd0f17317318e04da473bd2c2a34bd183ca9d7396a670c17b91dd89118398aa46b9f151a9
|
7
|
+
data.tar.gz: e144ba1cc3f0e415800cf05e9870987c56d0da1b54905519d04c26d2b6366e7cba081a644c78dbd692a5758ed34a32044d69dd895884b838d140d4c4772c9fc8
|
data/lib/jekyllEWP.rb
ADDED
@@ -0,0 +1,238 @@
|
|
1
|
+
require 'openssl'
|
2
|
+
require 'base64'
|
3
|
+
|
4
|
+
|
5
|
+
def wrapInForm(encryptedValue, use_sandbox=false, separate_submit=false, button_image = "", identifier="")
|
6
|
+
|
7
|
+
if identifier.nil?
|
8
|
+
identifier = ""
|
9
|
+
end
|
10
|
+
|
11
|
+
if button_image.nil?
|
12
|
+
button_image = ""
|
13
|
+
end
|
14
|
+
|
15
|
+
if getBool(use_sandbox) == true
|
16
|
+
stage = "sandbox."
|
17
|
+
else
|
18
|
+
stage=""
|
19
|
+
end
|
20
|
+
|
21
|
+
unless getBool(separate_submit) == true
|
22
|
+
submit = '<input type="image" src="' + button_image + '" border="0" name="submit" alt="Make payments with PayPal - it\'s fast, free and secure!">'
|
23
|
+
id=''
|
24
|
+
else
|
25
|
+
submit = ""
|
26
|
+
id=' id="' + identifier + '"'
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
return_str = '<form' + id +' action="https://www.' + stage + 'paypal.com/cgi-bin/webscr" method="post">' + '<input type="hidden" name="cmd" value="_s-xclick">' + submit + '<input type="hidden" name="encrypted" value="' + encryptedValue + '"></form>';
|
31
|
+
|
32
|
+
return return_str
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
|
38
|
+
def getButtonEncryptionValue(data, privateKeyData, certData, payPalCertData, keyPass = nil)
|
39
|
+
#puts data
|
40
|
+
#get keys and certs
|
41
|
+
|
42
|
+
#https://stackoverflow.com/a/11136771
|
43
|
+
paypal_pub_cert = OpenSSL::X509::Certificate.new(payPalCertData.gsub('\n', "\n"))
|
44
|
+
|
45
|
+
my_pub_cert = OpenSSL::X509::Certificate.new(certData.gsub('\n', "\n"))
|
46
|
+
|
47
|
+
my_private_key = ''
|
48
|
+
if keyPass
|
49
|
+
#https://stackoverflow.com/a/862090S
|
50
|
+
#https://docs.ruby-lang.org/en/2.1.0/OpenSSL/PKey/RSA.html#method-c-new
|
51
|
+
my_private_key = OpenSSL::PKey::RSA.new(privateKeyData.gsub('\n', "\n"), keyPass)
|
52
|
+
else
|
53
|
+
my_private_key = OpenSSL::PKey::RSA.new(privateKeyData.gsub('\n', "\n"))
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
|
58
|
+
#modified from http://railscasts.com/episodes/143-paypal-security
|
59
|
+
#https://docs.ruby-lang.org/en/2.1.0/OpenSSL/PKCS7.html#method-c-sign
|
60
|
+
signed = OpenSSL::PKCS7::sign(OpenSSL::X509::Certificate.new(my_pub_cert), my_private_key, data, [], OpenSSL::PKCS7::BINARY)
|
61
|
+
|
62
|
+
OpenSSL::PKCS7::encrypt([OpenSSL::X509::Certificate.new(paypal_pub_cert)], signed.to_der, OpenSSL::Cipher.new("des-ede3-cbc"), OpenSSL::PKCS7::BINARY).to_s.gsub("\n", "")
|
63
|
+
|
64
|
+
# puts signed.class
|
65
|
+
return signed.to_pem()
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
def getButtonOptionsString(certID, cmd, paypal_business_email, item_name, item_price, item_number = "0000", currency_code = "USD", tax = nil, shipping = nil )
|
71
|
+
options = ""
|
72
|
+
|
73
|
+
options.concat("cert_id=" + certID + "\n")
|
74
|
+
options.concat("cmd=" + cmd + "\n")
|
75
|
+
|
76
|
+
# if cmd == "_cart"
|
77
|
+
# case cart_options
|
78
|
+
# when "add"
|
79
|
+
# when "display"
|
80
|
+
# options.concat(cart_options + "=1\n")
|
81
|
+
# when "upload"
|
82
|
+
# puts "unsupported value 'upload' used in paypal EWP plugin. the form probably isnt going to work"
|
83
|
+
# end
|
84
|
+
# end
|
85
|
+
|
86
|
+
options.concat("business=" + paypal_business_email + "\n")
|
87
|
+
options.concat("item_name=" + item_name + "\n")
|
88
|
+
#options.concat("item_number=" + item_number + "\n")
|
89
|
+
options.concat("amount=" + item_price + "\n")
|
90
|
+
options.concat("currency_code=" + currency_code + "\n")
|
91
|
+
|
92
|
+
|
93
|
+
|
94
|
+
unless tax.nil? || tax == "0"
|
95
|
+
options.concat("tax=" + tax + "\n")
|
96
|
+
end
|
97
|
+
|
98
|
+
unless shipping.nil? || shipping == "0"
|
99
|
+
options.concat("shipping=" + shipping + "\n")
|
100
|
+
end
|
101
|
+
|
102
|
+
|
103
|
+
|
104
|
+
=begin
|
105
|
+
Below is the full list of supported key/vaue pairs from the paypal docs (https://developer.paypal.com/docs/classic/paypal-payments-standard/integration-guide/encryptedwebpayments/#id08A3I0PD04Y) the ones beginning with a hash (#) are not implemented here.
|
106
|
+
|
107
|
+
some of these are also passthrough variables that arent used by paypal: https://developer.paypal.com/docs/classic/paypal-payments-standard/integration-guide/formbasics/#variations-on-basic-variables
|
108
|
+
|
109
|
+
|
110
|
+
cert_id=Z24MFU6DSHBXQ
|
111
|
+
cmd=_xclick
|
112
|
+
business=sales@company.com
|
113
|
+
item_name=Handheld Computer
|
114
|
+
#item_number=1234
|
115
|
+
#custom=sc-id-789
|
116
|
+
amount=500.00
|
117
|
+
currency_code=USD
|
118
|
+
tax=41.25
|
119
|
+
shipping=20.00
|
120
|
+
#address_override=1
|
121
|
+
#address1=123 Main St
|
122
|
+
#city=Austin
|
123
|
+
#state=TX
|
124
|
+
#zip=94085
|
125
|
+
#country=USA
|
126
|
+
#cancel_return=https://example.com/cancel
|
127
|
+
=end
|
128
|
+
return options
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
#determines the button command from the string input.
|
133
|
+
#possible commands listed at https://developer.paypal.com/docs/classic/paypal-payments-standard/integration-guide/formbasics/#specifying-button-type--cmd
|
134
|
+
|
135
|
+
def getButtonCmd(purpose)
|
136
|
+
|
137
|
+
case purpose
|
138
|
+
when "addtocart"
|
139
|
+
return "_cart\nadd=1" #this is a dirty hack to insert the correct parameter for the cart buttons. better solutions welcome
|
140
|
+
when "viewcart"
|
141
|
+
return "_cart\ndisplay=1" #this is a dirty hack to insert the correct parameter for the cart buttons. better solutions welcome
|
142
|
+
when "buynow"
|
143
|
+
return "_xclick"
|
144
|
+
when "donate"
|
145
|
+
return "_donations"
|
146
|
+
when "autobilling"
|
147
|
+
return "_xclick-auto-billing"
|
148
|
+
when "paymentplan"
|
149
|
+
return "_xclick-payment-plan"
|
150
|
+
else
|
151
|
+
return "_xclick"
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|
155
|
+
|
156
|
+
def getBool(val)
|
157
|
+
val.to_s.downcase == 'true'
|
158
|
+
end
|
159
|
+
|
160
|
+
|
161
|
+
|
162
|
+
|
163
|
+
module Jekyll
|
164
|
+
class PayPalEWP < Liquid::Tag
|
165
|
+
|
166
|
+
|
167
|
+
|
168
|
+
def initialize(tag_name, variables, tokens)
|
169
|
+
super
|
170
|
+
@variables = variables.split(" ")
|
171
|
+
|
172
|
+
@buttonpurpose = @variables[0]
|
173
|
+
|
174
|
+
unless @variables[1].nil?
|
175
|
+
@separatesubmitbutton = getBool(@variables[1])
|
176
|
+
else
|
177
|
+
@separatesubmitbutton = false
|
178
|
+
end
|
179
|
+
|
180
|
+
|
181
|
+
unless @variables[2].nil?
|
182
|
+
|
183
|
+
if @separatesubmitbutton == true
|
184
|
+
#is an id
|
185
|
+
@formid = @variables[2]
|
186
|
+
else
|
187
|
+
#is an image
|
188
|
+
@buttonimage = @variables[2]
|
189
|
+
end
|
190
|
+
|
191
|
+
else
|
192
|
+
#no value provided
|
193
|
+
if @separatesubmitbutton == true
|
194
|
+
#is an id
|
195
|
+
@formid = 0
|
196
|
+
else
|
197
|
+
#is an image
|
198
|
+
@buttonimage = "https://www.paypalobjects.com/en_US/i/btn/btn_cart_LG.gif" #some arbitrary thing
|
199
|
+
end
|
200
|
+
|
201
|
+
end
|
202
|
+
|
203
|
+
|
204
|
+
end
|
205
|
+
|
206
|
+
# Lookup allows access to the page/post variables through the tag context
|
207
|
+
#https://blog.sverrirs.com/2016/04/custom-jekyll-tags.html
|
208
|
+
def lookup(context, name)
|
209
|
+
lookup = context
|
210
|
+
name.split(".").each { |value| lookup = lookup[value] }
|
211
|
+
lookup
|
212
|
+
end
|
213
|
+
|
214
|
+
def render(context)
|
215
|
+
|
216
|
+
wrapInForm(
|
217
|
+
getButtonEncryptionValue(
|
218
|
+
getButtonOptionsString(
|
219
|
+
"#{lookup(context, 'site.paypal_cert_id')}",
|
220
|
+
getButtonCmd(@buttonpurpose),
|
221
|
+
"#{lookup(context, 'site.paypal_email_address')}",
|
222
|
+
"#{lookup(context, 'page.name')}", #product name
|
223
|
+
"#{lookup(context, 'page.price')}"), #product price
|
224
|
+
#"#{lookup(context, 'page.sku')}" #product identifier
|
225
|
+
ENV['EWP_PRIVKEY'],
|
226
|
+
ENV['EWP_PUBCERT'],
|
227
|
+
ENV['EWP_PAYPAL_PUBCERT'],
|
228
|
+
ENV['EWP_PRIVKEY_PASS']),
|
229
|
+
"#{lookup(context, 'site.paypal_sandbox_mode')}",
|
230
|
+
@separatesubmitbutton,
|
231
|
+
@buttonimage,
|
232
|
+
@formid)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
end
|
236
|
+
|
237
|
+
Liquid::Template.register_tag('EWPform', Jekyll::PayPalEWP)
|
238
|
+
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: JekyllEWP
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Adrian Edwards
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2020-01-14 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: This Jekyll plugin creates paypal Encrypted Web Payments buttons and
|
14
|
+
encrypts them at build time so items in your store cannot have their prices or other
|
15
|
+
attributes changed in Inspect Element
|
16
|
+
email: adrian@adriancedwards.com
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- lib/jekyllEWP.rb
|
22
|
+
homepage: https://github.com/MoralCode/Jekyll-EWP
|
23
|
+
licenses:
|
24
|
+
- MIT
|
25
|
+
metadata: {}
|
26
|
+
post_install_message:
|
27
|
+
rdoc_options: []
|
28
|
+
require_paths:
|
29
|
+
- lib
|
30
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: '0'
|
40
|
+
requirements: []
|
41
|
+
rubygems_version: 3.1.2
|
42
|
+
signing_key:
|
43
|
+
specification_version: 4
|
44
|
+
summary: A Jekyll plugin to generate and encrypt PayPal buttons on the fly.
|
45
|
+
test_files: []
|