Преглед на файлове

Merge pull request #1025 from dsander/javascript-credentials

Allow JavaScriptAgent to get and set user credentials
Dominik Sander преди 9 години
родител
ревизия
d94a1ef066
променени са 2 файла, в които са добавени 46 реда и са изтрити 0 реда
  1. 18 0
      app/models/agents/java_script_agent.rb
  2. 28 0
      spec/models/agents/java_script_agent_spec.rb

+ 18 - 0
app/models/agents/java_script_agent.rb

@@ -21,6 +21,8 @@ module Agents
       * `this.memory()`
       * `this.memory(key)`
       * `this.memory(keyToSet, valueToSet)`
+      * `this.credential(name)`
+      * `this.credential(name, valueToSet)`
       * `this.options()`
       * `this.options(key)`
       * `this.log(message)`
@@ -120,6 +122,8 @@ module Agents
       end
       context["escapeHtml"] = lambda { |a, x| CGI.escapeHTML(x) }
       context["unescapeHtml"] = lambda { |a, x| CGI.unescapeHTML(x) }
+      context['getCredential'] = lambda { |a, k| credential(k); }
+      context['setCredential'] = lambda { |a, k, v| set_credential(k, v) }
 
       if (options['language'] || '').downcase == 'coffeescript'
         context.eval(CoffeeScript.compile code)
@@ -142,6 +146,12 @@ module Agents
       (interpolated['code'] || '').strip =~ /\Acredential:(.*)\Z/ && $1
     end
 
+    def set_credential(name, value)
+      c = user.user_credentials.find_or_initialize_by(credential_name: name)
+      c.credential_value = value
+      c.save!
+    end
+
     def setup_javascript
       <<-JS
         function Agent() {};
@@ -164,6 +174,14 @@ module Agents
           }
         }
 
+        Agent.credential = function(name, value) {
+          if (typeof(value) !== "undefined") {
+            setCredential(name, value);
+          } else {
+            return getCredential(name);
+          }
+        }
+
         Agent.options = function(key) {
           if (typeof(key) !== "undefined") {
             return JSON.parse(getOptions())[key];

+ 28 - 0
spec/models/agents/java_script_agent_spec.rb

@@ -264,5 +264,33 @@ describe Agents::JavaScriptAgent do
         expect(AgentLog.last.message).to eq("hello from coffeescript")
       end
     end
+
+    describe "user credentials" do
+      it "can access an existing credential" do
+        @agent.send(:set_credential, 'test', 'hello')
+        @agent.options['code'] = 'Agent.check = function() { this.log(this.credential("test")); };'
+        @agent.save!
+        @agent.check
+        expect(AgentLog.last.message).to eq("hello")
+      end
+
+      it "will create a new credential" do
+        @agent.options['code'] = 'Agent.check = function() { this.credential("test","1234"); };'
+        @agent.save!
+        expect {
+          @agent.check
+        }.to change(UserCredential, :count).by(1)
+      end
+
+      it "updates an existing credential" do
+        @agent.send(:set_credential, 'test', 1234)
+        @agent.options['code'] = 'Agent.check = function() { this.credential("test","12345"); };'
+        @agent.save!
+        expect {
+          @agent.check
+        }.to change(UserCredential, :count).by(0)
+        expect(@agent.user.user_credentials.last.credential_value).to eq('12345')
+      end
+    end
   end
 end