crossdomain 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: c4547edd7129c7d8236bcb838981cc767af5f1e5
4
+ data.tar.gz: 86bad3c77b96f8dd500b91d7fd2d64360c01f4e2
5
+ SHA512:
6
+ metadata.gz: 9057cf7826dfa80b0cb3640895ad2520e8a09fa83e1bd5cf0128154cfcf78a9ad0620f37e54cf9b1fa75fc12452fa2431eb5cf9916f66e8f705542b73a8d1bac
7
+ data.tar.gz: d824bac43608c72cc3923c1d4d27c335d2d63fc1eab44b737b337c7bbe46d1ad478d01669f21d1aee2d6933abac0ceb5d9874e34f4f9ea6a53ff3db0a91804ef
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in crossdomain.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Alexander Dimitrov
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # Crossdomain
2
+
3
+ ## Typical usage
4
+
5
+ ```
6
+ gem install crossdomain
7
+ sudo crossdomain --policy-path "/path/to/crossdomain.xml"
8
+ ```
9
+
10
+ `Crossdomain` is a standalone daemon to serve flash policy file on the default flash port (843). It uses a crossdomain.xml file you provide, which is validated against adobes schema before served. It requires `root` so it can bind to 843, but after this drops privileges to `nobody`.
11
+
12
+ ## Who needs this?
13
+ If you use flash fallback for websockets and you can't serve crossdomain.xml on the same port you probably need this.
14
+
15
+ ## Requirements
16
+
17
+ - Ruby 2.1.2 or greater
18
+ - root access to bind to port 843
19
+
20
+ ## Configuration optiosn
21
+ ```
22
+ -p, --port PORT Port to bind to (Default: 843).
23
+ -H, --host HOST Address to bind to (Default: 0.0.0.0)
24
+ -x, --policy-path PATH crossdomain.xml policy file path (Default: pwd + /crossdomain.xml)
25
+
26
+ ```
27
+
28
+
29
+ ## Contributing
30
+
31
+ 1. Fork it
32
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
33
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
34
+ 4. Push to the branch (`git push origin my-new-feature`)
35
+ 5. Create new Pull Request
36
+
37
+ # Author
38
+
39
+ - Alexander Dimitrov
40
+
41
+ Copyright (c) 2014 Alexander Dimitrov. See LICENSE.txt for further details.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'rspec/core/rake_task'
4
+
5
+ RSpec::Core::RakeTask.new do |t|
6
+ t.rspec_opts = ["-c", "-f progress", "-r ./spec/spec_helper.rb"]
7
+ t.pattern = 'spec/**/*_spec.rb'
8
+ end
9
+
10
+ task :default => :spec
data/bin/crossdomain ADDED
@@ -0,0 +1,43 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: utf-8
3
+
4
+ require 'optparse'
5
+ require 'bundler/setup'
6
+
7
+
8
+ options = {
9
+ host: '0.0.0.0', port: '843', xml_path: File.join(Dir.pwd, 'crossdomain.xml')
10
+ }
11
+
12
+
13
+ OptionParser.new do |opts|
14
+ opts.on '-h', '--help', 'Display this screen' do
15
+ puts opts
16
+ exit
17
+ end
18
+
19
+ opts.on '-p', '--port PORT', "Port to bind to (Default: 843)." do |k|
20
+ options[:app_key] = k
21
+ end
22
+
23
+ opts.on '-H', '--host HOST', "Address to bind to (Default: 0.0.0.0)" do |k|
24
+ options[:secret] = k
25
+ end
26
+
27
+ opts.on '-x', '--policy-path PATH', 'crossdomain.xml policy file path (Default: `pwd` + /crossdomain.xml)' do |h|
28
+ options[:xml_path] = h
29
+ end
30
+
31
+ opts.parse!
32
+ end
33
+
34
+ File.tap { |f| require f.expand_path(f.join(f.dirname(__FILE__),'..', 'lib', 'crossdomain.rb')) }
35
+ Crossdomain::Config.load options
36
+
37
+ puts "\n"
38
+ puts "\n"
39
+
40
+ puts "Running Crossdomain v.#{Crossdomain::VERSION}"
41
+ puts "\n"
42
+
43
+ Crossdomain::Service.start
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'crossdomain/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "crossdomain"
8
+ spec.version = Crossdomain::VERSION
9
+ spec.authors = ["Alexander Dimitrov"]
10
+ spec.email = ["dimitrov@loggator.com"]
11
+ spec.description = %q{Daemon to serve crossdomain.xml on the flashport}
12
+ spec.summary = %q{crossdomain.xml flashsocket daemon}
13
+ spec.homepage = "https://loggator.com"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+
25
+ spec.add_dependency 'nokogiri', '~> 1.6'
26
+ spec.add_dependency 'activesupport', '~> 3.1'
27
+ end
@@ -0,0 +1,28 @@
1
+ require 'nokogiri'
2
+ require 'open-uri'
3
+
4
+ module Crossdomain
5
+ module XML
6
+ CROSSDOMAIN_SCHEMA_FILE = '/Users/alex/Sites/Social/crossdomain/vendor/PolicyFile.xsd'
7
+ def validate!(xml_path)
8
+
9
+ begin
10
+ xml = File.read(xml_path)
11
+ rescue Errno::ENOENT
12
+ return false
13
+ end
14
+ doc = Nokogiri::XML(xml)
15
+ return false if doc.errors.size > 0
16
+
17
+ xsd = Nokogiri::XML::Schema(File.read(CROSSDOMAIN_SCHEMA_FILE))
18
+
19
+
20
+ xsd.validate(doc).each do |error|
21
+ Crossdomain.logger.warning error.message
22
+ end
23
+
24
+ xml
25
+ end
26
+ extend self
27
+ end
28
+ end
@@ -0,0 +1,23 @@
1
+ module Crossdomain
2
+ module Config
3
+ def load(opts={})
4
+ options.update opts
5
+ end
6
+
7
+ def [](key)
8
+ options[key]
9
+ end
10
+
11
+ def options
12
+ @options ||= {
13
+ host: '0.0.0.0', port: '843', xml_path: File.join(Dir.pwd, 'crossdomain.xml')
14
+ }
15
+ end
16
+
17
+ def method_missing(meth, *args, &blk)
18
+ options[meth]
19
+ end
20
+
21
+ extend self
22
+ end
23
+ end
@@ -0,0 +1,32 @@
1
+ require 'time'
2
+ require 'logger'
3
+
4
+ module Crossdomain
5
+ module Logging
6
+
7
+ class Pretty < Logger::Formatter
8
+ # Provide a call() method that returns the formatted message.
9
+ def call(severity, time, program_name, message)
10
+ "#{time.utc.iso8601} #{Process.pid} #{severity}: #{message}\n"
11
+ end
12
+ end
13
+
14
+ def self.logger
15
+ @logger ||= begin
16
+ log = Logger.new(STDOUT)
17
+ log.level = Logger::INFO
18
+ log.formatter = Pretty.new
19
+ log
20
+ end
21
+ end
22
+
23
+ def self.logger=(log)
24
+ @logger = (log ? log : Logger.new('/dev/null'))
25
+ end
26
+
27
+ def logger
28
+ Crossdomain::Logging.logger
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,52 @@
1
+ require 'socket'
2
+
3
+ module Crossdomain
4
+ module Service
5
+ def start
6
+
7
+ # Validates XML against Adobe's schema
8
+ xml = Crossdomain::XML.validate!(Crossdomain::Config[:xml_path])
9
+
10
+ unless xml
11
+ Crossdomain.logger.error "Missing or malformed xml at #{Crossdomain::Config[:xml_path]}"
12
+ return
13
+ end
14
+
15
+ if Crossdomain::Config[:port].to_i < 1000 and Process.uid != 0
16
+ Crossdomain.logger.error "You need to be root to bind to port #{Crossdomain::Config[:port]}"
17
+ return
18
+ end
19
+
20
+ Crossdomain.logger.info "Binding to #{Crossdomain::Config[:host]}:#{Crossdomain::Config[:port]}"
21
+ @server = TCPServer.new Crossdomain::Config[:host], Crossdomain::Config[:port]
22
+
23
+ # Drop privileges
24
+ Crossdomain.logger.info "Dropping privileges to nobody"
25
+ uid = Etc.getpwnam("nobody").uid
26
+ Process::Sys.setuid(uid)
27
+
28
+ begin
29
+
30
+ loop do
31
+ Thread.start(@server.accept) do |client|
32
+ client.puts xml
33
+ client.close
34
+ end
35
+ end
36
+
37
+ rescue Interrupt
38
+ #@server.stop
39
+ Crossdomain.logger.info "Shutting down..."
40
+ end
41
+ end
42
+
43
+ def check_permissions
44
+ end
45
+
46
+ def stop
47
+ @server.stop
48
+ end
49
+
50
+ extend self
51
+ end
52
+ end
@@ -0,0 +1,3 @@
1
+ module Crossdomain
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,28 @@
1
+ require 'bundler/setup'
2
+ require "crossdomain/version"
3
+ require 'active_support/core_ext/string'
4
+ require 'nokogiri'
5
+ require 'net/http'
6
+
7
+ module Crossdomain
8
+ end
9
+
10
+
11
+ module Crossdomain
12
+
13
+ def self.logger
14
+ Crossdomain::Logging.logger
15
+ end
16
+
17
+ def self.logger=(log)
18
+ Crossdomain::Logging.logger = log
19
+ end
20
+
21
+ end
22
+
23
+
24
+ File.tap do |f|
25
+ Dir[f.expand_path(f.join(f.dirname(__FILE__), 'crossdomain', '*.rb'))].each do |file|
26
+ Crossdomain.autoload File.basename(file, '.rb').camelize, file
27
+ end
28
+ end
@@ -0,0 +1,3 @@
1
+ <?xml version="1.0" ?>
2
+ <cross-domain-policy>foo
3
+ <allow-access-from domain="*" to-ports="*" />
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" ?>
2
+ <cross-domain-policy>
3
+ <allow-access-from domain="*" to-ports="*" />
4
+ <invalid-field foo="bar" />
5
+ </cross-domain-policy>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" ?>
2
+ <cross-domain-policy>
3
+ <allow-access-from domain="*" to-ports="*" />
4
+ </cross-domain-policy>
@@ -0,0 +1,5 @@
1
+ require 'spec_helper'
2
+ require 'crossdomain'
3
+
4
+ describe 'Integration' do
5
+ end
@@ -0,0 +1,11 @@
1
+ require 'bundler/setup'
2
+ require 'crossdomain'
3
+
4
+ RSpec.configure do |config|
5
+
6
+ config.formatter = 'documentation'
7
+ config.color = true
8
+ config.mock_framework = :rspec
9
+ config.order = 'random'
10
+ config.fail_fast = false
11
+ end
@@ -0,0 +1,25 @@
1
+ require 'spec_helper'
2
+ require 'crossdomain'
3
+
4
+ describe 'Crossdomain::XML' do
5
+ describe "#validate!" do
6
+ it 'should output schema errors as warnings' do
7
+ expect(Crossdomain.logger).to receive(:warning).with(an_instance_of(String)).at_least(:once)
8
+ expect(Crossdomain::XML.validate!('spec/files/invalid_spec.xml')).to eq(File.read('spec/files/invalid_spec.xml'))
9
+ end
10
+
11
+ it 'should return string for valid xml' do
12
+ expect(Crossdomain::XML.validate!('spec/files/valid.xml')).to eq(File.read('spec/files/valid.xml'))
13
+ end
14
+
15
+ it 'should return false for invalid xml' do
16
+ expect(Crossdomain::XML.validate!('spec/files/invalid.xml')).to eq(false)
17
+ end
18
+
19
+ it 'should throw error for missing file' do
20
+ expect {
21
+ Crossdomain::XML.validate!('spec/files/missing.xml')
22
+ }.to raise_error
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,143 @@
1
+
2
+ <?xml version="1.0"?>
3
+
4
+ <!-- Copyright (c) 2007-2009 Adobe Systems Incorporated. All Rights Reserved. -->
5
+
6
+ <!-- XML Schema for policy files -->
7
+ <!-- Generic version for all policy files; see more specific schemas at
8
+ PolicyFileHttp.xsd, PolicyFileHttps.xsd, PolicyFileFtp.xsd, PolicyFileSocket.xsd -->
9
+ <!-- Note that several different user-agents support policy files, and each may support
10
+ a different set of the tags described here. Consult the documentation for your
11
+ particular user-agent in order to verify that you are using syntax it supports.
12
+ The rules here only help validate that a policy file is well-formed. -->
13
+
14
+ <!-- No target namespace. Flash Player will not parse policy files that
15
+ use explicit namespace qualification (e.g. <pf:cross-domain-policy>),
16
+ so we place our types in the unqualified namespace to discourage
17
+ qualification in policy files. -->
18
+
19
+ <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
20
+
21
+ <!-- Meta-policy: a policy on policies.
22
+ A declaration in a master policy file, controlling what other policy files
23
+ may exist on the server. -->
24
+ <xsd:simpleType name="meta-policy-attribute">
25
+ <xsd:restriction base="xsd:string">
26
+ <xsd:enumeration value="all"/>
27
+ <xsd:enumeration value="by-content-type"/>
28
+ <xsd:enumeration value="by-ftp-filename"/>
29
+ <xsd:enumeration value="master-only"/>
30
+ <xsd:enumeration value="none"/>
31
+ </xsd:restriction>
32
+ </xsd:simpleType>
33
+
34
+ <!-- DNS domain name.
35
+ Wildcard forms "*" and "*.foo.com" also allowed. -->
36
+ <xsd:simpleType name="domain-attribute">
37
+ <xsd:restriction base="xsd:string">
38
+ <xsd:pattern value="\*|(\*?[A-Za-z0-9\-\.]+)"/>
39
+ </xsd:restriction>
40
+ </xsd:simpleType>
41
+
42
+ <!-- TCP/UDP port range -->
43
+ <xsd:simpleType name="ports-attribute">
44
+ <xsd:restriction base="xsd:string">
45
+ <xsd:pattern value="\*|([0-9]+(-[0-9]+)?(,[0-9]+(-[0-9]+)?)*)"/>
46
+ </xsd:restriction>
47
+ </xsd:simpleType>
48
+
49
+ <!-- secure attribute: permits override of default rule
50
+ that HTTPS resources require HTTPS accessors -->
51
+ <xsd:simpleType name="secure-attribute">
52
+ <xsd:restriction base="xsd:string">
53
+ <xsd:enumeration value="true"/>
54
+ <xsd:enumeration value="false"/>
55
+ </xsd:restriction>
56
+ </xsd:simpleType>
57
+
58
+ <!-- Set of HTTP header names.
59
+ Wildcard forms "*" and "Prefix-*" also allowed. -->
60
+ <xsd:simpleType name="headers-attribute">
61
+ <xsd:restriction base="xsd:string">
62
+ <!-- What is a legal header name?
63
+ RFC2616, which defines HTTP/1.1, refers to RFC822, which defines email.
64
+ RFC822 says that anything from ASCII 33 - 126 (decimal), minus the colon, is legal.
65
+ From this, we subtract the comma, since we interpret it as a separator,
66
+ and the asterisk, since we interpret it as a wildcard. -->
67
+ </xsd:restriction>
68
+ </xsd:simpleType>
69
+
70
+ <!-- SHA-1 fingerprint: 40 hex digits, with optional spaces and colons as separators -->
71
+ <xsd:simpleType name="sha1-fingerprint-attribute">
72
+ <xsd:restriction base="xsd:string">
73
+ <xsd:pattern value="([0-9a-fA-F][: ]?){40}"/>
74
+ </xsd:restriction>
75
+ </xsd:simpleType>
76
+
77
+ <!-- SHA-1 fingerprint algorithm designation: case insensitive -->
78
+ <xsd:simpleType name="sha1-fingerprint-algorithm-attribute">
79
+ <xsd:restriction base="xsd:string">
80
+ <xsd:pattern value="[Ss][Hh][Aa]-1"/>
81
+ </xsd:restriction>
82
+ </xsd:simpleType>
83
+
84
+ <!-- site-control tag: site-wide declarations for master policy file -->
85
+ <xsd:complexType name="site-control-element">
86
+ <xsd:attribute name="permitted-cross-domain-policies" use="required" type="meta-policy-attribute"/>
87
+ </xsd:complexType>
88
+
89
+ <!-- allow-access-from tag: permit access by documents from specified domains -->
90
+ <xsd:complexType name="allow-access-element">
91
+ <xsd:attribute name="domain" use="required" type="domain-attribute"/>
92
+ <xsd:attribute name="to-ports" use="optional" type="ports-attribute"/>
93
+ <xsd:attribute name="secure" use="optional" type="secure-attribute"/>
94
+ </xsd:complexType>
95
+
96
+ <!-- allow-http-request-headers-from tag: permit HTTP request header sending
97
+ by documents from specified domains -->
98
+ <xsd:complexType name="allow-headers-element">
99
+ <xsd:attribute name="domain" use="required" type="domain-attribute"/>
100
+ <xsd:attribute name="headers" use="required" type="headers-attribute"/>
101
+ <xsd:attribute name="secure" use="optional" type="secure-attribute"/>
102
+ </xsd:complexType>
103
+
104
+ <!-- certificate tag: identifies a signing certificate by its fingerprint.
105
+ For now, the only fingerprint algorithm supported is SHA-1.
106
+ The fingerprint is to be computed over the DER encoding of an X.509 certificate. -->
107
+ <xsd:complexType name="certificate-element">
108
+ <xsd:attribute name="fingerprint" use="required" type="sha1-fingerprint-attribute"/>
109
+ <xsd:attribute name="fingerprint-algorithm" use="required" type="sha1-fingerprint-algorithm-attribute"/>
110
+ </xsd:complexType>
111
+
112
+ <!-- signatory tag: permit access by documents signed with specified credentials -->
113
+ <xsd:complexType name="signatory-element">
114
+ <xsd:choice>
115
+ <xsd:element name="certificate" type="certificate-element" minOccurs="1" maxOccurs="1"/>
116
+ </xsd:choice>
117
+ </xsd:complexType>
118
+
119
+ <!-- allow-access-from-identity tag: permit access by documents identified by
120
+ cryptographic means.
121
+ For now, these means are limited to signatures. -->
122
+ <xsd:complexType name="allow-access-identity-element">
123
+ <xsd:choice>
124
+ <xsd:element name="signatory" type="signatory-element" minOccurs="1" maxOccurs="1"/>
125
+ </xsd:choice>
126
+ </xsd:complexType>
127
+
128
+ <!-- cross-domain-policy tag: top-level tag in the file -->
129
+ <xsd:complexType name="cross-domain-policy-element">
130
+ <xsd:sequence>
131
+ <xsd:element name="site-control" minOccurs="0" maxOccurs="1" type="site-control-element"/>
132
+ <xsd:element name="allow-access-from" minOccurs="0" maxOccurs="unbounded" type="allow-access-element"/>
133
+ <xsd:element name="allow-http-request-headers-from" minOccurs="0" maxOccurs="unbounded" type="allow-headers-element"/>
134
+ <xsd:element name="allow-access-from-identity" minOccurs="0" maxOccurs="unbounded" type="allow-access-identity-element"/>
135
+ </xsd:sequence>
136
+ </xsd:complexType>
137
+
138
+ <!-- specify top-level tag -->
139
+ <xsd:element name="cross-domain-policy" type="cross-domain-policy-element"/>
140
+
141
+ </xsd:schema>
142
+
143
+ <!-- End of file. -->
metadata ADDED
@@ -0,0 +1,141 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: crossdomain
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Alexander Dimitrov
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.3'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.3'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: nokogiri
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.6'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.6'
69
+ - !ruby/object:Gem::Dependency
70
+ name: activesupport
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.1'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.1'
83
+ description: Daemon to serve crossdomain.xml on the flashport
84
+ email:
85
+ - dimitrov@loggator.com
86
+ executables:
87
+ - crossdomain
88
+ extensions: []
89
+ extra_rdoc_files: []
90
+ files:
91
+ - ".gitignore"
92
+ - Gemfile
93
+ - LICENSE.txt
94
+ - README.md
95
+ - Rakefile
96
+ - bin/crossdomain
97
+ - crossdomain.gemspec
98
+ - lib/crossdomain.rb
99
+ - lib/crossdomain/XML.rb
100
+ - lib/crossdomain/config.rb
101
+ - lib/crossdomain/logging.rb
102
+ - lib/crossdomain/service.rb
103
+ - lib/crossdomain/version.rb
104
+ - spec/files/invalid.xml
105
+ - spec/files/invalid_spec.xml
106
+ - spec/files/valid.xml
107
+ - spec/integration/service.rb
108
+ - spec/spec_helper.rb
109
+ - spec/unit/xml_spec.rb
110
+ - vendor/PolicyFile.xsd
111
+ homepage: https://loggator.com
112
+ licenses:
113
+ - MIT
114
+ metadata: {}
115
+ post_install_message:
116
+ rdoc_options: []
117
+ require_paths:
118
+ - lib
119
+ required_ruby_version: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ required_rubygems_version: !ruby/object:Gem::Requirement
125
+ requirements:
126
+ - - ">="
127
+ - !ruby/object:Gem::Version
128
+ version: '0'
129
+ requirements: []
130
+ rubyforge_project:
131
+ rubygems_version: 2.2.2
132
+ signing_key:
133
+ specification_version: 4
134
+ summary: crossdomain.xml flashsocket daemon
135
+ test_files:
136
+ - spec/files/invalid.xml
137
+ - spec/files/invalid_spec.xml
138
+ - spec/files/valid.xml
139
+ - spec/integration/service.rb
140
+ - spec/spec_helper.rb
141
+ - spec/unit/xml_spec.rb