ruby_home 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/lib/ruby_home/accessory_info.rb +1 -1
- data/lib/ruby_home/device_id.rb +1 -1
- data/lib/ruby_home/factories/characteristic_factory.rb +7 -8
- data/lib/ruby_home/factories/default_values/base_value.rb +15 -0
- data/lib/ruby_home/factories/default_values/bool_value.rb +9 -0
- data/lib/ruby_home/factories/default_values/float_value.rb +15 -0
- data/lib/ruby_home/factories/default_values/int32_value.rb +15 -0
- data/lib/ruby_home/factories/default_values/null_value.rb +9 -0
- data/lib/ruby_home/factories/default_values/string_value.rb +25 -0
- data/lib/ruby_home/factories/default_values/uint32_value.rb +20 -0
- data/lib/ruby_home/factories/default_values/uint8_value.rb +19 -0
- data/lib/ruby_home/greeter.rb +28 -0
- data/lib/ruby_home/http/controllers/characteristics_controller.rb +33 -31
- data/lib/ruby_home/identifier_cache.rb +2 -2
- data/lib/ruby_home/password.rb +46 -0
- data/lib/ruby_home/version.rb +1 -1
- data/lib/ruby_home.rb +5 -0
- data/rubyhome.gemspec +1 -0
- metadata +14 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf4e167745548086679350014c0375cf64eeb8733b9e6948ef0846ea36fd4f11
|
4
|
+
data.tar.gz: d8583372ac979eceafcd3c6a1cf36f8f40c32d5ab543ff28b7cf03e11e294d9b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 84a6186ceb1d259b60bfe877ee3e12c78c4d9a25cb3fc9433605c45264a3bc174796650bb87e95795f8c39ea6dd365bc22425c6360636e07923f731cacaf185d
|
7
|
+
data.tar.gz: 19899a408055f4dd74993b03679cee97ea4d440b09beccbf6aaf4d034db727a96d09a73fc85ddb85f3fc4326704782ec861f9e006149a05c9e6c00c57123513d
|
data/.travis.yml
CHANGED
data/lib/ruby_home/device_id.rb
CHANGED
@@ -1,12 +1,7 @@
|
|
1
1
|
module RubyHome
|
2
2
|
class CharacteristicFactory
|
3
3
|
DEFAULT_VALUES = {
|
4
|
-
firmware_revision: '1.0',
|
5
4
|
identify: nil,
|
6
|
-
manufacturer: 'Default-Manufacturer',
|
7
|
-
model: 'Default-Model',
|
8
|
-
name: 'RubyHome',
|
9
|
-
serial_number: 'Default-SerialNumber',
|
10
5
|
}.freeze
|
11
6
|
|
12
7
|
def self.create(characteristic_name, options={}, &block)
|
@@ -44,9 +39,13 @@ module RubyHome
|
|
44
39
|
|
45
40
|
def default_value
|
46
41
|
DEFAULT_VALUES.fetch(characteristic_name.to_sym) do
|
47
|
-
|
48
|
-
|
49
|
-
|
42
|
+
klass = "RubyHome::#{template.format.classify}DefaultValue".safe_constantize || NullDefaultValue
|
43
|
+
default_value = klass.new(template).default
|
44
|
+
|
45
|
+
if default_value.nil?
|
46
|
+
raise "No default value available for characteristic: #{characteristic_name} of type: #{template.format}"
|
47
|
+
else
|
48
|
+
default_value
|
50
49
|
end
|
51
50
|
end
|
52
51
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'base_value'
|
2
|
+
|
3
|
+
module RubyHome
|
4
|
+
class StringDefaultValue < BaseValue
|
5
|
+
DEFAULT_VALUES = {
|
6
|
+
firmware_revision: '1.0',
|
7
|
+
hardware_revision: '1.0',
|
8
|
+
manufacturer: 'Default-Manufacturer',
|
9
|
+
model: 'Default-Model',
|
10
|
+
name: 'RubyHome',
|
11
|
+
serial_number: 'Default-SerialNumber',
|
12
|
+
version: '1.0',
|
13
|
+
}.freeze
|
14
|
+
|
15
|
+
def default
|
16
|
+
DEFAULT_VALUES[name]
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def name
|
22
|
+
template.name
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'base_value'
|
2
|
+
|
3
|
+
module RubyHome
|
4
|
+
class Uint32DefaultValue < BaseValue
|
5
|
+
DEFAULT_VALUES = {
|
6
|
+
color_temperature: 50,
|
7
|
+
lock_management_auto_security_timeout: 0,
|
8
|
+
}.freeze
|
9
|
+
|
10
|
+
def default
|
11
|
+
DEFAULT_VALUES[name]
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def name
|
17
|
+
template.name
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require_relative 'base_value'
|
2
|
+
|
3
|
+
module RubyHome
|
4
|
+
class Uint8DefaultValue < BaseValue
|
5
|
+
def default
|
6
|
+
first_default_value.to_i
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def first_default_value
|
12
|
+
valid_values.keys.first
|
13
|
+
end
|
14
|
+
|
15
|
+
def valid_values
|
16
|
+
template.constraints.fetch('ValidValues')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module RubyHome
|
2
|
+
module Greeter
|
3
|
+
class << self
|
4
|
+
def run
|
5
|
+
unless paired?
|
6
|
+
puts "Please enter this code with your HomeKit app on your iOS device to pair with RubyHome"
|
7
|
+
puts " "
|
8
|
+
puts " ┌────────────┐ "
|
9
|
+
puts " │ " + pin + " │ "
|
10
|
+
puts " └────────────┘ "
|
11
|
+
puts " "
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def pin
|
16
|
+
accessory_info.password
|
17
|
+
end
|
18
|
+
|
19
|
+
def paired?
|
20
|
+
accessory_info.paired?
|
21
|
+
end
|
22
|
+
|
23
|
+
def accessory_info
|
24
|
+
AccessoryInfo.instance
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -3,46 +3,48 @@ require_relative 'application_controller'
|
|
3
3
|
module RubyHome
|
4
4
|
module HTTP
|
5
5
|
class CharacteristicsController < ApplicationController
|
6
|
-
|
6
|
+
before do
|
7
7
|
content_type 'application/hap+json'
|
8
|
+
require_session
|
9
|
+
end
|
8
10
|
|
9
|
-
|
10
|
-
|
11
|
-
characteristics = IdentifierCache.find_characteristics(
|
12
|
-
accessory_id: accessory_id.to_i,
|
13
|
-
instance_id: instance_id.to_i
|
14
|
-
)
|
15
|
-
|
16
|
-
CharacteristicValueSerializer.new(characteristics).serialized_json
|
17
|
-
else
|
18
|
-
status 401
|
19
|
-
JSON.generate({"status" => -70401})
|
20
|
-
end
|
11
|
+
get '/' do
|
12
|
+
CharacteristicValueSerializer.new(find_characteristics).serialized_json
|
21
13
|
end
|
22
14
|
|
23
15
|
put '/' do
|
24
|
-
|
16
|
+
json_body.fetch('characteristics', []).each do |characteristic_params|
|
17
|
+
update_characteristics(characteristic_params)
|
18
|
+
end
|
19
|
+
|
20
|
+
status 204
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
25
24
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
characteristic = IdentifierCache.find_characteristics(
|
31
|
-
accessory_id: accessory_id.to_i,
|
32
|
-
instance_id: instance_id.to_i
|
33
|
-
).first
|
34
|
-
|
35
|
-
if characteristic_params['value']
|
36
|
-
characteristic.value = characteristic_params['value']
|
37
|
-
end
|
25
|
+
def find_characteristics
|
26
|
+
params.fetch(:id, "").split(',').flat_map do |characteristic_params|
|
27
|
+
aid, iid = characteristic_params.split('.')
|
28
|
+
find_characteristic(aid: aid, iid: iid)
|
38
29
|
end
|
30
|
+
end
|
39
31
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
32
|
+
def update_characteristics(characteristic_params)
|
33
|
+
characteristic = find_characteristic(**characteristic_params.symbolize_keys.slice(:aid, :iid))
|
34
|
+
if characteristic && characteristic_params['value']
|
35
|
+
characteristic.value = characteristic_params['value']
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def find_characteristic(aid:, iid:)
|
40
|
+
IdentifierCache.find_characteristic(accessory_id: aid.to_i, instance_id: iid.to_i)
|
41
|
+
end
|
42
|
+
|
43
|
+
def require_session
|
44
|
+
unless cache[:controller_to_accessory_key] && cache[:accessory_to_controller_key]
|
45
|
+
halt 401, JSON.generate({"status" => -70401})
|
46
|
+
end
|
44
47
|
end
|
45
|
-
end
|
46
48
|
end
|
47
49
|
end
|
48
50
|
end
|
@@ -19,8 +19,8 @@ module RubyHome
|
|
19
19
|
services.flat_map(&:characteristics)
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
23
|
-
characteristics.
|
22
|
+
def find_characteristic(attributes)
|
23
|
+
characteristics.find do |characteristic|
|
24
24
|
attributes.all? do |key, value|
|
25
25
|
characteristic.send(key) == value
|
26
26
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module RubyHome
|
2
|
+
module Password
|
3
|
+
class << self
|
4
|
+
DELIMITER = '-'
|
5
|
+
LENGTH = 8
|
6
|
+
INVALIDS = [
|
7
|
+
'00000000',
|
8
|
+
'11111111',
|
9
|
+
'22222222',
|
10
|
+
'33333333',
|
11
|
+
'44444444',
|
12
|
+
'55555555',
|
13
|
+
'66666666',
|
14
|
+
'77777777',
|
15
|
+
'88888888',
|
16
|
+
'99999999',
|
17
|
+
'12345678',
|
18
|
+
'87654321',
|
19
|
+
]
|
20
|
+
|
21
|
+
# The Setup Code must conform to the format XXX-XX-XXX where each X is a
|
22
|
+
# 0-9 digit and dashes are required. For example, "101-48-005" (without
|
23
|
+
# quotes). The accessory must generate its SRP verifier with the full
|
24
|
+
# Setup Code, including dashes.
|
25
|
+
|
26
|
+
def generate
|
27
|
+
loop do
|
28
|
+
digits = random_digits(LENGTH)
|
29
|
+
break format(digits.to_s) unless INVALIDS.include?(digits)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def format(digits)
|
34
|
+
[
|
35
|
+
digits[0...3],
|
36
|
+
digits[3...5],
|
37
|
+
digits[5...8],
|
38
|
+
].join(DELIMITER)
|
39
|
+
end
|
40
|
+
|
41
|
+
def random_digits(length)
|
42
|
+
Array.new(length) { rand(0..9) }.join
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/ruby_home/version.rb
CHANGED
data/lib/ruby_home.rb
CHANGED
@@ -18,6 +18,7 @@ module RubyHome
|
|
18
18
|
trap 'INT' do shutdown end
|
19
19
|
trap 'TERM' do shutdown end
|
20
20
|
|
21
|
+
greet
|
21
22
|
start
|
22
23
|
end
|
23
24
|
|
@@ -42,5 +43,9 @@ module RubyHome
|
|
42
43
|
def http_server
|
43
44
|
@@_http_server ||= RubyHome::HTTP::Application.new
|
44
45
|
end
|
46
|
+
|
47
|
+
def greet
|
48
|
+
Greeter.run
|
49
|
+
end
|
45
50
|
end
|
46
51
|
end
|
data/rubyhome.gemspec
CHANGED
@@ -16,6 +16,7 @@ Gem::Specification.new do |spec|
|
|
16
16
|
provided by manufacturers of smart home devices.
|
17
17
|
DESCRIPTION
|
18
18
|
spec.homepage = 'https://github.com/karlentwistle/ruby_home'
|
19
|
+
spec.license = 'MIT'
|
19
20
|
|
20
21
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
21
22
|
f.match(%r{^(test|spec|features)/})
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_home
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karl Entwistle
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-09-
|
11
|
+
date: 2018-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -304,8 +304,17 @@ files:
|
|
304
304
|
- lib/ruby_home/dns/text_record.rb
|
305
305
|
- lib/ruby_home/factories/accessory_factory.rb
|
306
306
|
- lib/ruby_home/factories/characteristic_factory.rb
|
307
|
+
- lib/ruby_home/factories/default_values/base_value.rb
|
308
|
+
- lib/ruby_home/factories/default_values/bool_value.rb
|
309
|
+
- lib/ruby_home/factories/default_values/float_value.rb
|
310
|
+
- lib/ruby_home/factories/default_values/int32_value.rb
|
311
|
+
- lib/ruby_home/factories/default_values/null_value.rb
|
312
|
+
- lib/ruby_home/factories/default_values/string_value.rb
|
313
|
+
- lib/ruby_home/factories/default_values/uint32_value.rb
|
314
|
+
- lib/ruby_home/factories/default_values/uint8_value.rb
|
307
315
|
- lib/ruby_home/factories/templates/characteristic_template.rb
|
308
316
|
- lib/ruby_home/factories/templates/service_template.rb
|
317
|
+
- lib/ruby_home/greeter.rb
|
309
318
|
- lib/ruby_home/hap/accessory.rb
|
310
319
|
- lib/ruby_home/hap/characteristic.rb
|
311
320
|
- lib/ruby_home/hap/crypto/chacha20poly1305.rb
|
@@ -333,6 +342,7 @@ files:
|
|
333
342
|
- lib/ruby_home/http/services/start_srp_service.rb
|
334
343
|
- lib/ruby_home/http/services/verify_srp_service.rb
|
335
344
|
- lib/ruby_home/identifier_cache.rb
|
345
|
+
- lib/ruby_home/password.rb
|
336
346
|
- lib/ruby_home/rack/handler/hap_server.rb
|
337
347
|
- lib/ruby_home/version.rb
|
338
348
|
- lib/ruby_home/yaml_record.rb
|
@@ -340,7 +350,8 @@ files:
|
|
340
350
|
- sbin/characteristic_generator.rb
|
341
351
|
- sbin/service_generator.rb
|
342
352
|
homepage: https://github.com/karlentwistle/ruby_home
|
343
|
-
licenses:
|
353
|
+
licenses:
|
354
|
+
- MIT
|
344
355
|
metadata: {}
|
345
356
|
post_install_message:
|
346
357
|
rdoc_options: []
|