crossdomain 0.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 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