push-apns 0.0.1.pre3 → 0.0.1.pre4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/push/configuration_apns.rb +13 -0
- data/lib/push/daemon/apns.rb +4 -6
- data/lib/push/daemon/apns_support/connection_apns.rb +4 -4
- data/lib/push/daemon/apns_support/feedback_receiver.rb +10 -9
- data/lib/push/feedback_apns.rb +2 -0
- data/lib/push/message_apns.rb +1 -1
- data/lib/push-apns/version.rb +1 -1
- data/lib/push-apns.rb +2 -1
- metadata +12 -12
- data/lib/push/daemon/apns_support/certificate.rb +0 -37
@@ -0,0 +1,13 @@
|
|
1
|
+
module Push
|
2
|
+
class ConfigurationApns < Push::Configuration
|
3
|
+
store :properties, accessors: [:certificate, :certificate_password, :sandbox, :feedback_poll]
|
4
|
+
attr_accessible :app, :enabled, :connections, :certificate, :certificate_password, :sandbox, :feedback_poll
|
5
|
+
validates :certificate, :presence => true
|
6
|
+
validates :sandbox, :inclusion => { :in => [true, false] }
|
7
|
+
validates :feedback_poll, :presence => true
|
8
|
+
|
9
|
+
def name
|
10
|
+
:apns
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
data/lib/push/daemon/apns.rb
CHANGED
@@ -1,14 +1,12 @@
|
|
1
1
|
module Push
|
2
2
|
module Daemon
|
3
3
|
class Apns
|
4
|
-
attr_accessor :configuration
|
4
|
+
attr_accessor :configuration
|
5
5
|
|
6
6
|
def initialize(options)
|
7
7
|
self.configuration = options
|
8
8
|
|
9
|
-
|
10
|
-
certificate.load
|
11
|
-
|
9
|
+
@feedback_receiver = ApnsSupport::FeedbackReceiver.new(self)
|
12
10
|
start_feedback
|
13
11
|
end
|
14
12
|
|
@@ -26,11 +24,11 @@ module Push
|
|
26
24
|
end
|
27
25
|
|
28
26
|
def start_feedback
|
29
|
-
|
27
|
+
@feedback_receiver.start
|
30
28
|
end
|
31
29
|
|
32
30
|
def stop_feedback
|
33
|
-
|
31
|
+
@feedback_receiver.stop
|
34
32
|
end
|
35
33
|
|
36
34
|
def stop
|
@@ -10,11 +10,11 @@ module Push
|
|
10
10
|
@provider = provider
|
11
11
|
if i
|
12
12
|
# Apns push connection
|
13
|
-
@name = "ConnectionApns #{i}"
|
13
|
+
@name = "#{@provider.configuration[:name]}: ConnectionApns #{i}"
|
14
14
|
@host = "gateway.#{provider.configuration[:sandbox] ? 'sandbox.' : ''}push.apple.com"
|
15
15
|
@port = 2195
|
16
16
|
else
|
17
|
-
@name = "FeedbackReceiver"
|
17
|
+
@name = "#{@provider.configuration[:name]}: FeedbackReceiver"
|
18
18
|
@host = "feedback.#{provider.configuration[:sandbox] ? 'sandbox.' : ''}push.apple.com"
|
19
19
|
@port = 2196
|
20
20
|
end
|
@@ -94,8 +94,8 @@ module Push
|
|
94
94
|
|
95
95
|
def setup_ssl_context
|
96
96
|
ssl_context = OpenSSL::SSL::SSLContext.new
|
97
|
-
ssl_context.key = OpenSSL::PKey::RSA.new(provider.certificate
|
98
|
-
ssl_context.cert = OpenSSL::X509::Certificate.new(provider.certificate
|
97
|
+
ssl_context.key = OpenSSL::PKey::RSA.new(provider.configuration[:certificate], provider.configuration[:certificate_password])
|
98
|
+
ssl_context.cert = OpenSSL::X509::Certificate.new(provider.configuration[:certificate])
|
99
99
|
ssl_context
|
100
100
|
end
|
101
101
|
|
@@ -2,12 +2,14 @@ module Push
|
|
2
2
|
module Daemon
|
3
3
|
module ApnsSupport
|
4
4
|
class FeedbackReceiver
|
5
|
-
|
6
|
-
attr_accessor :provider
|
5
|
+
include Push::Daemon::InterruptibleSleep
|
7
6
|
FEEDBACK_TUPLE_BYTES = 38
|
8
7
|
|
9
|
-
def
|
8
|
+
def initialize(provider)
|
10
9
|
@provider = provider
|
10
|
+
end
|
11
|
+
|
12
|
+
def start
|
11
13
|
@thread = Thread.new do
|
12
14
|
loop do
|
13
15
|
break if @stop
|
@@ -17,13 +19,12 @@ module Push
|
|
17
19
|
end
|
18
20
|
end
|
19
21
|
|
20
|
-
def
|
22
|
+
def stop
|
21
23
|
@stop = true
|
22
24
|
interrupt_sleep
|
23
|
-
@thread.join if @thread
|
24
25
|
end
|
25
26
|
|
26
|
-
def
|
27
|
+
def check_for_feedback
|
27
28
|
connection = nil
|
28
29
|
begin
|
29
30
|
connection = ApnsSupport::ConnectionApns.new(@provider)
|
@@ -42,15 +43,15 @@ module Push
|
|
42
43
|
|
43
44
|
protected
|
44
45
|
|
45
|
-
def
|
46
|
+
def parse_tuple(tuple)
|
46
47
|
failed_at, _, device = tuple.unpack("N1n1H*")
|
47
48
|
[Time.at(failed_at).utc, device]
|
48
49
|
end
|
49
50
|
|
50
|
-
def
|
51
|
+
def create_feedback(failed_at, device)
|
51
52
|
formatted_failed_at = failed_at.strftime("%Y-%m-%d %H:%M:%S UTC")
|
52
53
|
Push::Daemon.logger.info("[FeedbackReceiver] Delivery failed at #{formatted_failed_at} for #{device}")
|
53
|
-
Push::FeedbackApns.create!(:failed_at => failed_at, :device => device)
|
54
|
+
Push::FeedbackApns.create!(:app => @provider.configuration[:name], :failed_at => failed_at, :device => device, :follow_up => 'delete')
|
54
55
|
end
|
55
56
|
end
|
56
57
|
end
|
data/lib/push/feedback_apns.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
module Push
|
2
2
|
class FeedbackApns < Push::Feedback
|
3
|
+
attr_accessible :app, :device, :follow_up, :failed_at
|
3
4
|
validates :device, :format => { :with => /\A[a-z0-9]{64}\z/ }
|
5
|
+
validates :follow_up, :inclusion => { :in => %w(delete), :message => "%{value} is not a valid follow-up" }
|
4
6
|
end
|
5
7
|
end
|
data/lib/push/message_apns.rb
CHANGED
@@ -15,7 +15,7 @@ module Push
|
|
15
15
|
}
|
16
16
|
|
17
17
|
store :properties, accessors: [:alert, :badge, :sound, :expiry, :attributes_for_device]
|
18
|
-
attr_accessible :device, :alert, :badge, :sound, :expiry, :attributes_for_device
|
18
|
+
attr_accessible :app, :device, :alert, :badge, :sound, :expiry, :attributes_for_device
|
19
19
|
|
20
20
|
validates :badge, :numericality => true, :allow_nil => true
|
21
21
|
validates :expiry, :numericality => true, :presence => true
|
data/lib/push-apns/version.rb
CHANGED
data/lib/push-apns.rb
CHANGED
@@ -2,12 +2,13 @@ require 'socket'
|
|
2
2
|
require 'pathname'
|
3
3
|
require 'push-apns/version'
|
4
4
|
require 'push/apns/binary_notification_validator'
|
5
|
+
require 'push/configuration'
|
6
|
+
require 'push/configuration_apns'
|
5
7
|
require 'push/message'
|
6
8
|
require 'push/message_apns'
|
7
9
|
require 'push/feedback'
|
8
10
|
require 'push/feedback_apns'
|
9
11
|
require 'push/daemon/apns'
|
10
12
|
require 'push/daemon/interruptible_sleep'
|
11
|
-
require 'push/daemon/apns_support/certificate'
|
12
13
|
require 'push/daemon/apns_support/connection_apns'
|
13
14
|
require 'push/daemon/apns_support/feedback_receiver'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: push-apns
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.1.
|
4
|
+
version: 0.0.1.pre4
|
5
5
|
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multi_json
|
16
|
-
requirement: &
|
16
|
+
requirement: &70225631818240 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,21 +21,21 @@ dependencies:
|
|
21
21
|
version: '1.0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70225631818240
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: push-core
|
27
|
-
requirement: &
|
27
|
+
requirement: &70225631817380 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - =
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 0.0.1.
|
32
|
+
version: 0.0.1.pre4
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70225631817380
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: sqlite3
|
38
|
-
requirement: &
|
38
|
+
requirement: &70225631816340 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,8 +43,8 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
47
|
-
description:
|
46
|
+
version_requirements: *70225631816340
|
47
|
+
description: APNS support for the modular push daemon.
|
48
48
|
email:
|
49
49
|
- tom@tnux.net
|
50
50
|
executables: []
|
@@ -54,8 +54,8 @@ files:
|
|
54
54
|
- lib/push-apns.rb
|
55
55
|
- lib/push-apns/version.rb
|
56
56
|
- lib/push/apns/binary_notification_validator.rb
|
57
|
+
- lib/push/configuration_apns.rb
|
57
58
|
- lib/push/daemon/apns.rb
|
58
|
-
- lib/push/daemon/apns_support/certificate.rb
|
59
59
|
- lib/push/daemon/apns_support/connection_apns.rb
|
60
60
|
- lib/push/daemon/apns_support/feedback_receiver.rb
|
61
61
|
- lib/push/feedback_apns.rb
|
@@ -85,5 +85,5 @@ rubyforge_project:
|
|
85
85
|
rubygems_version: 1.8.5
|
86
86
|
signing_key:
|
87
87
|
specification_version: 3
|
88
|
-
summary: APNS (iOS) part of the modular push daemon.
|
88
|
+
summary: APNS (iOS/Apple) part of the modular push daemon.
|
89
89
|
test_files: []
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module Push
|
2
|
-
class CertificateError < StandardError; end
|
3
|
-
|
4
|
-
module Daemon
|
5
|
-
module ApnsSupport
|
6
|
-
class Certificate
|
7
|
-
attr_accessor :certificate
|
8
|
-
|
9
|
-
def initialize(certificate_path)
|
10
|
-
@certificate_path = path(certificate_path)
|
11
|
-
end
|
12
|
-
|
13
|
-
def path(path)
|
14
|
-
if Pathname.new(path).absolute?
|
15
|
-
path
|
16
|
-
else
|
17
|
-
File.join(Rails.root, "config", "push", path)
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def load
|
22
|
-
@certificate = read_certificate
|
23
|
-
end
|
24
|
-
|
25
|
-
protected
|
26
|
-
|
27
|
-
def read_certificate
|
28
|
-
if !File.exists?(@certificate_path)
|
29
|
-
raise CertificateError, "#{@certificate_path} does not exist. The certificate location can be configured in config/push/<<environment>>.rb"
|
30
|
-
else
|
31
|
-
File.read(@certificate_path)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|