siriproxy 0.4.4 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -5,21 +5,28 @@ gemspec
5
5
  # load plugins
6
6
  require 'yaml'
7
7
  require 'ostruct'
8
+ config_file = File.expand_path(File.join('~', '.siriproxy', 'config.yml'));
8
9
 
9
- if !File.exists?(File.expand_path('~/.siriproxy/config.yml'))
10
- $stderr.puts "config.yml not found. Copy config.example.yml to config.yml, then modify it."
11
- exit 1
10
+ unless File.exists?(config_file)
11
+ default_config = config_file
12
+ config_file = File.expand_path(File.join(File.dirname(__FILE__), 'config.example.yml'))
13
+ puts "[Notice - Configuration] ==================== Important Configuration Notice =========================="
14
+ puts "[Notice - Configuration] '#{default_config}' not found. Using '#{config_file}'"
15
+ puts "[Notice - Configuration] "
16
+ puts "[Notice - Configuration] Remove this message by copying '#{config_file}' into '~/.siriproxy/'"
17
+ puts "[Notice - Configuration] =============================================================================="
12
18
  end
13
19
 
14
20
  gem 'cora', '0.0.4'
15
21
 
16
- config = OpenStruct.new(YAML.load_file(File.expand_path('~/.siriproxy/config.yml')))
22
+ config = OpenStruct.new(YAML.load_file(File.expand_path(config_file)))
17
23
  if config.plugins
24
+ puts "[Info - Configuration] Loading plugins -- If any fail to load, run `siriproxy bundle` (not `bundle install`) to resolve."
18
25
  config.plugins.each do |plugin|
19
26
  if plugin.is_a? String
20
27
  gem "siriproxy-#{plugin.downcase}"
21
28
  else
22
- gem "siriproxy-#{plugin['gem'] || plugin['name'].downcase}", :path => plugin['path'], :git => plugin['git'], :branch => plugin['branch'], :require => plugin['require']
29
+ gem "siriproxy-#{plugin['gem'] || plugin['name'].downcase}", :path => plugin['path'], :git => plugin['git'], :branch => plugin['branch'], :require => plugin['require']
23
30
  end
24
31
  end
25
32
  end
data/config.example.yml CHANGED
@@ -1,6 +1,17 @@
1
1
  listen: 0.0.0.0
2
2
  port: 443
3
3
  log_level: 1
4
+
5
+ #Create an array of DNS servers for use by internal DNS server and resolving guzzoni.apple.com
6
+ upstream_dns: [8.8.8.8, 8.8.4.4]
7
+
8
+ #Set your computer's IP for use by the internal DNS server
9
+ # server_ip: 192.168.1.100
10
+
11
+ #Set effective user when running as root. Supply a non-privileged user (such as 'nobody')
12
+ # user: nobody
13
+
14
+
4
15
  plugins:
5
16
  # NOTE: run bundle after changing plugin configurations to update required gems
6
17
 
data/lib/siriproxy.rb CHANGED
@@ -13,25 +13,34 @@ class SiriProxy
13
13
  def initialize()
14
14
  # @todo shouldnt need this, make centralize logging instead
15
15
  $LOG_LEVEL = $APP_CONFIG.log_level.to_i
16
+
16
17
  EventMachine.run do
18
+ if Process.uid == 0 && !$APP_CONFIG.user
19
+ puts "[Notice - Server] ======================= WARNING: Running as root ============================="
20
+ puts "[Notice - Server] You should use -l or the config.yml to specify and non-root user to run under"
21
+ puts "[Notice - Server] Running the server as root is dangerous."
22
+ puts "[Notice - Server] =============================================================================="
23
+ end
24
+
17
25
  begin
18
26
  listen_addr = $APP_CONFIG.listen || "0.0.0.0"
19
- puts "Starting SiriProxy on #{listen_addr}:#{$APP_CONFIG.port}.."
27
+ puts "[Info - Server] Starting SiriProxy on #{listen_addr}:#{$APP_CONFIG.port}.."
20
28
  EventMachine::start_server(listen_addr, $APP_CONFIG.port, SiriProxy::Connection::Iphone, $APP_CONFIG.upstream_dns) { |conn|
21
29
  puts "[Info - Guzzoni] Starting conneciton #{conn.inspect}" if $LOG_LEVEL < 1
22
30
  conn.plugin_manager = SiriProxy::PluginManager.new()
23
31
  conn.plugin_manager.iphone_conn = conn
24
32
  }
25
- puts "SiriProxy up and running."
33
+ puts "[Info - Server] SiriProxy up and running."
26
34
  rescue RuntimeError => err
27
35
  if err.message == "no acceptor"
28
- raise "Cannot start the server on port #{$APP_CONFIG.port} - are you root, or have another process on this port already?"
36
+ raise "[Error - Server] Cannot start the server on port #{$APP_CONFIG.port} - are you root, or have another process on this port already?"
29
37
  else
30
38
  raise
31
39
  end
32
40
  end
33
41
 
34
42
  EventMachine.set_effective_user($APP_CONFIG.user) if $APP_CONFIG.user
43
+
35
44
  end
36
45
  end
37
46
  end
@@ -27,7 +27,7 @@ update [dir] Updates to the latest code from GitHub or from a provided dire
27
27
  help Show this usage information
28
28
 
29
29
  Options:
30
- Option Command Description
30
+ Option Command Description
31
31
  EOS
32
32
 
33
33
  def initialize
@@ -42,6 +42,7 @@ Options:
42
42
  when 'console' then run_console
43
43
  when 'update' then update(subcommand)
44
44
  when 'help' then usage
45
+ when 'dnsonly' then dns
45
46
  else usage
46
47
  end
47
48
  end
@@ -97,6 +98,11 @@ Options:
97
98
  end
98
99
 
99
100
  def start_server
101
+ if $APP_CONFIG.server_ip
102
+ require 'siriproxy/dns'
103
+ dns_server = SiriProxy::Dns.new
104
+ dns_server.start()
105
+ end
100
106
  proxy = SiriProxy.new
101
107
  proxy.start()
102
108
  end
@@ -137,6 +143,13 @@ Options:
137
143
  end
138
144
  end
139
145
 
146
+ def dns
147
+ require 'siriproxy/dns'
148
+ $APP_CONFIG.use_dns = true
149
+ server = SiriProxy::Dns.new
150
+ server.run(Logger::DEBUG)
151
+ end
152
+
140
153
  def usage
141
154
  puts "\n#{@option_parser}\n"
142
155
  end
@@ -144,35 +157,45 @@ Options:
144
157
  private
145
158
 
146
159
  def parse_options
147
- $APP_CONFIG = OpenStruct.new(YAML.load_file(File.expand_path('~/.siriproxy/config.yml')))
160
+ config_file = File.expand_path(File.join('~', '.siriproxy', 'config.yml'));
161
+
162
+ unless File.exists?(config_file)
163
+ default_config = config_file
164
+ config_file = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'config.example.yml'))
165
+ end
166
+
167
+ $APP_CONFIG = OpenStruct.new(YAML.load_file(config_file))
148
168
 
149
169
  # Google Public DNS servers
150
170
  $APP_CONFIG.upstream_dns ||= %w[8.8.8.8 8.8.4.4]
151
171
 
152
172
  @branch = nil
153
173
  @option_parser = OptionParser.new do |opts|
154
- opts.on('-L', '--listen ADDRESS', '[server] address to listen on (central or node)') do |listen|
155
- $APP_CONFIG.listen = listen
174
+ opts.on('-d', '--dns ADDRESS', '[server] Launch DNS server guzzoni.apple.com with ADDRESS (requires root)') do |ip|
175
+ $APP_CONFIG.server_ip = ip
156
176
  end
157
- opts.on('-p', '--port PORT', '[server] port number for server (central or node)') do |port_num|
158
- $APP_CONFIG.port = port_num
159
- end
160
- opts.on('-l', '--log LOG_LEVEL', '[server] The level of debug information displayed (higher is more)') do |log_level|
177
+ opts.on('-l', '--log LOG_LEVEL', '[server] The level of debug information displayed (higher is more)') do |log_level|
161
178
  $APP_CONFIG.log_level = log_level
162
179
  end
163
- opts.on( '--upstream-dns SERVERS', Array, '[server] List of upstream DNS servers to query for the real guzzoni.apple.com. Defaults to Google DNS servers') do |servers|
180
+ opts.on('-L', '--listen ADDRESS', '[server] Address to listen on (central or node)') do |listen|
181
+ $APP_CONFIG.listen = listen
182
+ end
183
+ opts.on('-D', '--upstream-dns SERVERS', Array, '[server] List of upstream DNS servers to use. Defaults to \'[8.8.8.8, 8.8.4.4]\'') do |servers|
164
184
  $APP_CONFIG.upstream_dns = servers
165
185
  end
166
- opts.on('-u', '--user USER', '[server] The user to run as after launch') do |user|
186
+ opts.on('-p', '--port PORT', '[server] Port number for server (central or node)') do |port_num|
187
+ $APP_CONFIG.port = port_num
188
+ end
189
+ opts.on('-u', '--user USER', '[server] The user to run as after launch') do |user|
167
190
  $APP_CONFIG.user = user
168
191
  end
169
- opts.on('-b', '--branch BRANCH', '[update] Choose the branch to update from (default: master)') do |branch|
192
+ opts.on('-b', '--branch BRANCH', '[update] Choose the branch to update from (default: master)') do |branch|
170
193
  @branch = branch
171
194
  end
172
- opts.on('-n', '--name CA_NAME', '[gencerts] Define a common name for the CA (default: "SiriProxyCA")') do |ca_name|
195
+ opts.on('-n', '--name CA_NAME', '[gencerts] Define a common name for the CA (default: "SiriProxyCA")') do |ca_name|
173
196
  @ca_name = ca_name
174
197
  end
175
- opts.on_tail('-v', '--version', ' show version') do
198
+ opts.on_tail('-v', '--version', ' Show version') do
176
199
  require "siriproxy/version"
177
200
  puts "SiriProxy version #{SiriProxy::VERSION}"
178
201
  exit
@@ -55,9 +55,15 @@ class SiriProxy::Connection < EventMachine::Connection
55
55
  self.consumed_ace = true;
56
56
  end
57
57
 
58
- process_compressed_data()
59
-
60
- flush_output_buffer()
58
+ begin
59
+ process_compressed_data()
60
+
61
+ flush_output_buffer()
62
+ rescue
63
+ puts "[Info - #{self.name}] Got invalid data (non-ACE protocol?), terminating the connection."
64
+
65
+ self.close_connection
66
+ end
61
67
  end
62
68
 
63
69
  def flush_output_buffer
@@ -5,7 +5,6 @@ require 'resolv'
5
5
  #####
6
6
  class SiriProxy::Connection::Iphone < SiriProxy::Connection
7
7
  def initialize upstream_dns
8
- puts "Create server for iPhone connection"
9
8
  super()
10
9
  self.name = "iPhone"
11
10
  @upstream_dns = upstream_dns
@@ -0,0 +1,67 @@
1
+ require 'rubydns'
2
+
3
+ class SiriProxy::Dns
4
+ attr_accessor :interfaces, :upstream, :thread
5
+
6
+ def initialize
7
+ @interfaces = [
8
+ [:tcp, "0.0.0.0", 53],
9
+ [:udp, "0.0.0.0", 53]
10
+ ]
11
+
12
+ servers = []
13
+
14
+ $APP_CONFIG.upstream_dns.each { |dns_addr|
15
+ servers << [:udp, dns_addr, 53]
16
+ servers << [:tcp, dns_addr, 53]
17
+ }
18
+
19
+ @upstream = RubyDNS::Resolver.new(servers)
20
+ end
21
+
22
+ def start(log_level=Logger::WARN)
23
+ @thread = Thread.new {
24
+ begin
25
+ self.run(log_level)
26
+ rescue RuntimeError => e
27
+ if e.message.match /^no acceptor/
28
+ puts "[Error - Server] You must be root to run the DNS server, DNS server is disabled"
29
+ else
30
+ puts "[Error - Server] DNS Error: #{e.message}"
31
+ puts "[Error - Server] DNS Server has crashed. Terminating SiriProxy"
32
+ exit 1
33
+ end
34
+ rescue Exception => e
35
+ puts "[Error - Server] DNS Error: #{e.message}"
36
+ puts "[Error - Server] DNS Server has crashed. Terminating SiriProxy"
37
+ exit 1
38
+ end
39
+ }
40
+ end
41
+
42
+ def stop
43
+ Thread.kill(@thread)
44
+ end
45
+
46
+ def run(log_level=Logger::WARN,server_ip=$APP_CONFIG.server_ip)
47
+ if server_ip
48
+ upstream = @upstream
49
+
50
+ # Start the RubyDNS server
51
+ RubyDNS::run_server(:listen => @interfaces) do
52
+ @logger.level = log_level
53
+
54
+ match(/guzzoni.apple.com/, Resolv::DNS::Resource::IN::A) do |_host, transaction|
55
+ transaction.respond!(server_ip)
56
+ end
57
+
58
+ # Default DNS handler
59
+ otherwise do |transaction|
60
+ transaction.passthrough!(upstream)
61
+ end
62
+ end
63
+
64
+ puts "[Info - Server] DNS Server started, tainting 'guzzoni.apple.com' with #{server_ip}"
65
+ end
66
+ end
67
+ end
@@ -1,6 +1,8 @@
1
1
  require 'cora'
2
2
 
3
3
  class SiriProxy::Plugin < Cora::Plugin
4
+ attr_accessor :plugin_name
5
+
4
6
  def initialize(config)
5
7
 
6
8
  end
@@ -55,4 +57,8 @@ class SiriProxy::Plugin < Cora::Plugin
55
57
  self.class.filters
56
58
  end
57
59
 
60
+ def to_s
61
+ self.plugin_name
62
+ end
63
+
58
64
  end
@@ -12,20 +12,29 @@ class SiriProxy::PluginManager < Cora
12
12
  @plugins = []
13
13
  if $APP_CONFIG.plugins
14
14
  $APP_CONFIG.plugins.each do |pluginConfig|
15
- if pluginConfig.is_a? String
16
- className = pluginConfig
17
- requireName = "siriproxy-#{className.downcase}"
18
- else
19
- className = pluginConfig['name']
20
- requireName = pluginConfig['require'] || "siriproxy-#{className.downcase}"
15
+ begin
16
+ if pluginConfig.is_a? String
17
+ className = pluginConfig
18
+ requireName = "siriproxy-#{className.downcase}"
19
+ else
20
+ className = pluginConfig['name']
21
+ requireName = pluginConfig['require'] || "siriproxy-#{className.downcase}"
22
+ end
23
+ require requireName
24
+ plugin = SiriProxy::Plugin.const_get(className).new(pluginConfig)
25
+ plugin.plugin_name = className
26
+ plugin.manager = self
27
+ @plugins << plugin
28
+ rescue
29
+ if pluginConfig['name']
30
+ puts "[Error] Failed to load plugin: #{pluginConfig['name']}"
31
+ else
32
+ puts "[Error] Failed to load a plugin that has no name, check your config.yml"
33
+ end
21
34
  end
22
- require requireName
23
- plugin = SiriProxy::Plugin.const_get(className).new(pluginConfig)
24
- plugin.manager = self
25
- @plugins << plugin
26
35
  end
27
36
  end
28
- log "Plugins loaded: #{@plugins}"
37
+ log "Plugins loaded: #{@plugins.join(', ')}"
29
38
  end
30
39
 
31
40
  def process_filters(object, direction)
@@ -1,3 +1,3 @@
1
1
  class SiriProxy
2
- VERSION = "0.4.4"
2
+ VERSION = "0.5.0"
3
3
  end
data/siriproxy.gemspec CHANGED
@@ -23,7 +23,8 @@ Gem::Specification.new do |s|
23
23
  s.add_runtime_dependency "CFPropertyList", "=2.1.2"
24
24
  s.add_runtime_dependency "eventmachine"
25
25
  s.add_runtime_dependency "uuidtools"
26
- s.add_runtime_dependency "cora", ">=0.0.4"
26
+ s.add_runtime_dependency "cora", "=0.0.4"
27
27
  s.add_runtime_dependency "bundler"
28
28
  s.add_runtime_dependency "rake"
29
+ s.add_runtime_dependency "rubydns"
29
30
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: siriproxy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.5.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-02-27 00:00:00.000000000 Z
14
+ date: 2013-03-10 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: CFPropertyList
@@ -66,7 +66,7 @@ dependencies:
66
66
  requirement: !ruby/object:Gem::Requirement
67
67
  none: false
68
68
  requirements:
69
- - - ! '>='
69
+ - - '='
70
70
  - !ruby/object:Gem::Version
71
71
  version: 0.0.4
72
72
  type: :runtime
@@ -74,7 +74,7 @@ dependencies:
74
74
  version_requirements: !ruby/object:Gem::Requirement
75
75
  none: false
76
76
  requirements:
77
- - - ! '>='
77
+ - - '='
78
78
  - !ruby/object:Gem::Version
79
79
  version: 0.0.4
80
80
  - !ruby/object:Gem::Dependency
@@ -109,6 +109,22 @@ dependencies:
109
109
  - - ! '>='
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
+ - !ruby/object:Gem::Dependency
113
+ name: rubydns
114
+ requirement: !ruby/object:Gem::Requirement
115
+ none: false
116
+ requirements:
117
+ - - ! '>='
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ type: :runtime
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ none: false
124
+ requirements:
125
+ - - ! '>='
126
+ - !ruby/object:Gem::Version
127
+ version: '0'
112
128
  description: Siri Proxy is a proxy server for Apple's Siri "assistant." The idea is
113
129
  to allow for the creation of custom handlers for different actions. This can allow
114
130
  developers to easily add functionality to Siri.
@@ -133,6 +149,7 @@ files:
133
149
  - lib/siriproxy/connection.rb
134
150
  - lib/siriproxy/connection/guzzoni.rb
135
151
  - lib/siriproxy/connection/iphone.rb
152
+ - lib/siriproxy/dns.rb
136
153
  - lib/siriproxy/interpret_siri.rb
137
154
  - lib/siriproxy/plugin.rb
138
155
  - lib/siriproxy/plugin_manager.rb