<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -5,6 +5,22 @@ module Adyen
 
     extend ActionView::Helpers::TagHelper
 
+    def self.skins
+      @skins ||= {}
+    end
+    
+    def self.add_skin(name, skin_code, shared_secret)
+      self.skins[name] = {:name =&gt; name, :skin_code =&gt; skin_code, :shared_secret =&gt; shared_secret }
+    end
+
+    def self.skin_by_name(skin_name)
+      self.skins[skin_name]
+    end
+    
+    def self.skin_by_code(skin_code)
+      self.skins.detect { |(name, skin)| skin[:skin_code] == skin_code }.last rescue nil      
+    end
+
     ACTION_URL = &quot;https://%s.adyen.com/hpp/select.shtml&quot;
 
     def self.url(environment = nil)
@@ -34,6 +50,12 @@ module Adyen
       attributes[:order_data]         = Adyen::Encoding.gzip_base64(attributes.delete(:order_data_raw)) if attributes[:order_data_raw]
       attributes[:ship_before_date]   = Adyen::Formatter::DateTime.fmt_date(attributes[:ship_before_date])
       attributes[:session_validity]   = Adyen::Formatter::DateTime.fmt_time(attributes[:session_validity])
+      
+      if attributes[:skin]
+        skin = Adyen::Form.skin_by_name(attributes.delete(:skin))
+        attributes[:skin_code]     ||= skin[:skin_code]
+        attributes[:shared_secret] ||= skin[:shared_secret]
+      end
     end
 
     def self.payment_fields(attributes = {})
@@ -60,16 +82,21 @@ module Adyen
         self.tag(:input, :type =&gt; 'hidden', :name =&gt; key.to_s.camelize(:lower), :value =&gt; value)
       }.join(&quot;\n&quot;)
     end
+    
+    def self.lookup_shared_secret(skin_code)
+      skin = skin_by_code(skin_code)[:shared_secret] rescue nil
+    end
 
     def self.redirect_signature_string(params)
       params[:authResult].to_s + params[:pspReference].to_s + params[:merchantReference].to_s + params[:skinCode].to_s
     end
 
-    def self.redirect_signature(params, shared_secret)
+    def self.redirect_signature(params, shared_secret = nil)
+      shared_secret ||= lookup_shared_secret(params[:skinCode])
       Adyen::Encoding.hmac_base64(shared_secret, redirect_signature_string(params))
     end
 
-    def self.redirect_signature_check(params, shared_secret)
+    def self.redirect_signature_check(params, shared_secret = nil)
       params[:merchantSig] == redirect_signature(params, shared_secret)
     end
 </diff>
      <filename>lib/adyen/form.rb</filename>
    </modified>
    <modified>
      <diff>@@ -2,6 +2,10 @@ require &quot;#{File.dirname(__FILE__)}/spec_helper.rb&quot;
 
 describe Adyen::Form do
 
+  before(:all) do
+    Adyen::Form.add_skin(:testing, '4aD37dJA', 'Kah942*$7sdp0)')
+  end
+
   describe 'Action URLs' do
 
     before(:each) do
@@ -32,9 +36,6 @@ describe Adyen::Form do
     before(:each) do
       # Example taken from integration manual
 
-      # Shared secret between you and Adyen, only valid for this skinCode!
-      @shared_secret = 'Kah942*$7sdp0)'
-
       # Example get params sent back with redirect
       @params = { :authResult =&gt; 'AUTHORISED', :pspReference =&gt; '1211992213193029',
         :merchantReference =&gt; 'Internet Order 12345', :skinCode =&gt; '4aD37dJA',
@@ -46,19 +47,24 @@ describe Adyen::Form do
     end
 
     it &quot;should calculate the signature correctly&quot; do
-      Adyen::Form.redirect_signature(@params, @shared_secret).should eql(@params[:merchantSig])
+      Adyen::Form.redirect_signature(@params).should eql(@params[:merchantSig])
     end
 
-    it &quot;should check the signature correctly&quot; do
-      Adyen::Form.redirect_signature_check(@params, @shared_secret).should be_true
+    it &quot;should check the signature correctly with explicit shared signature&quot; do
+      Adyen::Form.redirect_signature_check(@params, 'Kah942*$7sdp0)').should be_true
     end
 
+    it &quot;should check the signature correctly using the stored shared secret&quot; do
+      Adyen::Form.redirect_signature_check(@params).should be_true
+    end
+
+
     it &quot;should detect a tampered field&quot; do
-      Adyen::Form.redirect_signature_check(@params.merge(:pspReference =&gt; 'tampered'), @shared_secret).should be_false
+      Adyen::Form.redirect_signature_check(@params.merge(:pspReference =&gt; 'tampered')).should be_false
     end
 
     it &quot;should detect a tampered signature&quot; do
-      Adyen::Form.redirect_signature_check(@params.merge(:merchantSig =&gt; 'tampered'), @shared_secret).should be_false
+      Adyen::Form.redirect_signature_check(@params.merge(:merchantSig =&gt; 'tampered')).should be_false
     end
 
   end
@@ -66,10 +72,10 @@ describe Adyen::Form do
   describe 'redirect URL generation' do
     before(:each) do
       @attributes = { :currency_code =&gt; 'GBP', :payment_amount =&gt; 10000, :ship_before_date =&gt; Date.today,
-        :merchant_reference =&gt; 'Internet Order 12345', :skin_code =&gt; '4aD37dJA',
+        :merchant_reference =&gt; 'Internet Order 12345', :skin =&gt; :testing,
         :merchant_account =&gt; 'TestMerchant', :session_validity =&gt; 1.hour.from_now }
 
-      @redirect_url = Adyen::Form.redirect_url(@attributes.merge(:shared_secret =&gt; 'secret'))
+      @redirect_url = Adyen::Form.redirect_url(@attributes)
     end
     
     it &quot;should return an URL pointing to the adyen server&quot; do
@@ -93,12 +99,12 @@ describe Adyen::Form do
 
     before(:each) do
       @attributes = { :currency_code =&gt; 'GBP', :payment_amount =&gt; 10000, :ship_before_date =&gt; Date.today,
-        :merchant_reference =&gt; 'Internet Order 12345', :skin_code =&gt; '4aD37dJA',
+        :merchant_reference =&gt; 'Internet Order 12345', :skin =&gt; :testing,
         :merchant_account =&gt; 'TestMerchant', :session_validity =&gt; 1.hour.from_now }
     end
 
     it &quot;should generate a valid payment form&quot; do
-      content_tag(:form, Adyen::Form.hidden_fields(@attributes.merge(:shared_secret =&gt; 'secret')),
+      content_tag(:form, Adyen::Form.hidden_fields(@attributes),
           :action =&gt; Adyen::Form.url, :method =&gt; :post).should have_adyen_payment_form
     end
   end
@@ -108,9 +114,10 @@ describe Adyen::Form do
     # This example is taken from the Adyen integration manual
 
     before(:each) do
+
       @attributes = { :currency_code =&gt; 'GBP', :payment_amount =&gt; 10000,
         :ship_before_date =&gt; '2007-10-20', :merchant_reference =&gt; 'Internet Order 12345',
-        :skin_code =&gt; '4aD37dJA', :merchant_account =&gt; 'TestMerchant',
+        :skin =&gt; :testing, :merchant_account =&gt; 'TestMerchant',
         :session_validity =&gt; '2007-10-11T11:00:00Z' }
 
       Adyen::Form.do_attribute_transformations!(@attributes)
@@ -120,9 +127,9 @@ describe Adyen::Form do
       signature_string = Adyen::Form.calculate_signature_string(@attributes)
       signature_string.should eql(&quot;10000GBP2007-10-20Internet Order 123454aD37dJATestMerchant2007-10-11T11:00:00Z&quot;)
     end
-
+    
     it &quot;should calculate the signature correctly&quot; do
-      signature = Adyen::Form.calculate_signature(@attributes.merge(:shared_secret =&gt; 'Kah942*$7sdp0)'))
+      signature = Adyen::Form.calculate_signature(@attributes)
       signature.should eql('x58ZcRVL1H6y+XSeBGrySJ9ACVo=')
     end
 
@@ -138,10 +145,8 @@ describe Adyen::Form do
       # Add the required recurrent payment attributes
       @attributes.merge!(:recurring_contract =&gt; 'DEFAULT', :shopper_reference =&gt; 'grasshopper52', :shopper_email =&gt; 'gras.shopper@somewhere.org')
 
-      signature = Adyen::Form.calculate_signature(@attributes.merge(:shared_secret =&gt; 'Kah942*$7sdp0)'))
+      signature = Adyen::Form.calculate_signature(@attributes)
       signature.should eql('F2BQEYbE+EUhiRGuPtcD16Gm7JY=')
     end
-
   end
-
 end
\ No newline at end of file</diff>
      <filename>spec/form_spec.rb</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>3750690b7346e627b9a8a405a2ff2d19eee8ce4a</id>
    </parent>
  </parents>
  <author>
    <name>Willem van Bergen</name>
    <email>willem@vanbergen.org</email>
  </author>
  <url>http://github.com/wvanbergen/adyen/commit/045265a717b61e32b32b96e96291ff6245636509</url>
  <id>045265a717b61e32b32b96e96291ff6245636509</id>
  <committed-date>2009-10-21T07:52:47-07:00</committed-date>
  <authored-date>2009-10-21T07:52:47-07:00</authored-date>
  <message>Added support for storing skin codes and shared secrets in Adyen::Form</message>
  <tree>5cb0a0a297080336106a19384fa642e1bd1e9d3c</tree>
  <committer>
    <name>Willem van Bergen</name>
    <email>willem@vanbergen.org</email>
  </committer>
</commit>
