35
35
36
36
-include (" mod_pushoff.hrl" ).
37
37
38
- -define (MODULE_APNS , mod_pushoff_apns ).
39
- -define (MODULE_FCM , mod_pushoff_fcm ).
40
38
-define (OFFLINE_HOOK_PRIO , 1 ). % must fire before mod_offline (which has 50)
41
39
42
- %
43
- % types
44
- %
45
-
46
- -record (apns_config ,
47
- {certfile = <<" " >> :: binary (),
48
- gateway = <<" " >> :: binary ()}).
49
-
50
- -record (fcm_config ,
51
- {gateway = <<" " >> :: binary (),
52
- api_key = <<" " >> :: binary ()}).
53
-
54
- -type apns_config () :: # apns_config {}.
55
- -type fcm_config () :: # fcm_config {}.
56
-
57
- -record (backend_config ,
58
- {ref :: backend_ref (),
59
- config :: apns_config () | fcm_config ()}).
60
-
61
- -type backend_config () :: # backend_config {}.
40
+ -type apns_config () :: #{backend_type := mod_pushoff_apns_h2 , certfile := binary (), gateway := binary (), topic := binary ()}.
41
+ -type fcm_config () :: #{backend_type := mod_pushoff_fcm , gateway := binary (), api_key := binary ()}.
42
+ -type backend_config () :: #{ref := backend_ref (), config := apns_config () | fcm_config ()}.
62
43
63
44
%
64
45
% dispatch to workers
@@ -75,8 +56,7 @@ dispatch(#pushoff_registration{bare_jid = UserBare, token = Token, timestamp = T
75
56
backend_id = BackendId },
76
57
Payload ) ->
77
58
DisableArgs = {UserBare , Timestamp },
78
- gen_server :cast (backend_worker (BackendId ),
79
- {dispatch , UserBare , Payload , Token , DisableArgs }),
59
+ gen_server :cast (backend_worker (BackendId ), {dispatch , UserBare , Payload , Token , DisableArgs }),
80
60
ok .
81
61
82
62
@@ -144,10 +124,27 @@ adhoc_local_commands(Acc, _From, _To, _Request) ->
144
124
Acc .
145
125
146
126
127
+ adhoc_perform_action (<<" register-push-apns-h2" >>, # jid {lserver = LServer } = From , XData ) ->
128
+ BackendRef = case xmpp_util :get_xdata_values (<<" backend_ref" >>, XData ) of
129
+ [Key ] -> {mod_pushoff_apns_h2 , Key };
130
+ _ -> undefined
131
+ end ,
132
+ case validate_backend_ref (LServer , BackendRef ) of
133
+ {error , E } -> {error , E };
134
+ {ok , BackendRef } ->
135
+ case xmpp_util :get_xdata_values (<<" token" >>, XData ) of
136
+ [Base64Token ] ->
137
+ case catch base64 :decode (Base64Token ) of
138
+ {'EXIT' , _ } -> {error , xmpp :err_bad_request ()};
139
+ Token -> mod_pushoff_mnesia :register_client (From , {LServer , BackendRef }, Token )
140
+ end ;
141
+ _ -> {error , xmpp :err_bad_request ()}
142
+ end
143
+ end ;
147
144
adhoc_perform_action (<<" register-push-apns" >>, # jid {lserver = LServer } = From , XData ) ->
148
145
BackendRef = case xmpp_util :get_xdata_values (<<" backend_ref" >>, XData ) of
149
- [Key ] -> {apns , Key };
150
- _ -> apns
146
+ [Key ] -> {mod_pushoff_apns , Key };
147
+ _ -> mod_pushoff_apns
151
148
end ,
152
149
case validate_backend_ref (LServer , BackendRef ) of
153
150
{error , E } -> {error , E };
@@ -210,7 +207,7 @@ stop(Host) ->
210
207
Worker = backend_worker ({Host , Ref }),
211
208
supervisor :terminate_child (ejabberd_gen_mod_sup , Worker ),
212
209
supervisor :delete_child (ejabberd_gen_mod_sup , Worker )
213
- end || # backend_config {ref = Ref } <- backend_configs (Host )],
210
+ end || #{ref : = Ref } <- backend_configs (Host )],
214
211
ok .
215
212
216
213
depends (_ , _ ) ->
@@ -220,34 +217,36 @@ mod_opt_type(backends) -> fun ?MODULE:parse_backends/1;
220
217
mod_opt_type (_ ) -> [backends ].
221
218
222
219
validate_backend_ref (Host , Ref ) ->
223
- case [R || # backend_config {ref = R } <- backend_configs (Host ), R == Ref ] of
220
+ case [R || #{ref : = R } <- backend_configs (Host ), R == Ref ] of
224
221
[R ] -> {ok , R };
225
222
_ -> {error , xmpp :err_bad_request ()}
226
223
end .
227
224
228
- backend_ref (apns , undefined ) -> apns ;
229
- backend_ref (fcm , undefined ) -> fcm ;
230
- backend_ref (apns , K ) -> {apns , K };
231
- backend_ref (fcm , K ) -> {fcm , K }.
225
+ backend_ref (X , undefined ) -> X ;
226
+ backend_ref (X , K ) -> {X , K }.
232
227
233
228
backend_type ({Type , _ }) -> Type ;
234
229
backend_type (Type ) -> Type .
235
230
236
231
parse_backends (Plists ) ->
237
232
[parse_backend (Plist ) || Plist <- Plists ].
238
233
234
+ -spec (parse_backend (proplist :proplist ()) -> backend_config ()).
239
235
parse_backend (Opts ) ->
240
236
Ref = backend_ref (proplists :get_value (type , Opts ), proplists :get_value (backend_ref , Opts )),
241
- # backend_config {
242
- ref = Ref ,
243
- config =
244
- case backend_type (Ref ) of
245
- apns ->
246
- # apns_config {certfile = proplists :get_value (certfile , Opts ), gateway = proplists :get_value (gateway , Opts )};
247
- fcm ->
248
- # fcm_config {gateway = proplists :get_value (gateway , Opts ), api_key = proplists :get_value (api_key , Opts )}
249
- end
250
- }.
237
+ #{ref => Ref ,
238
+ config =>
239
+ case backend_type (Ref ) of
240
+ mod_pushoff_fcm ->
241
+ #{backend_type => mod_pushoff_fcm ,
242
+ gateway => proplists :get_value (gateway , Opts ),
243
+ api_key => proplists :get_value (api_key , Opts )};
244
+ X when X == mod_pushoff_apns orelse X == mod_pushoff_apns_h2 ->
245
+ #{backend_type => X ,
246
+ certfile => proplists :get_value (certfile , Opts ),
247
+ gateway => proplists :get_value (gateway , Opts ),
248
+ topic => proplists :get_value (topic , Opts )}
249
+ end }.
251
250
252
251
%
253
252
% workers
@@ -262,29 +261,14 @@ backend_configs(Host) ->
262
261
gen_mod :get_module_opt (Host , ? MODULE , backends ,
263
262
fun (O ) when is_list (O ) -> O end , []).
264
263
265
- backend_module (apns ) -> ? MODULE_APNS ;
266
- backend_module (fcm ) -> ? MODULE_FCM .
267
-
268
264
-spec (start_worker (Host :: binary (), Backend :: backend_config ()) -> ok ).
269
265
270
- start_worker (Host , # backend_config {ref = Ref , config = Config }) ->
266
+ start_worker (Host , #{ref : = Ref , config : = Config }) ->
271
267
Worker = backend_worker ({Host , Ref }),
272
- BackendSpec =
273
- case backend_type (Ref ) of
274
- apns ->
275
- {Worker ,
268
+ BackendSpec = {Worker ,
276
269
{gen_server , start_link ,
277
- [{local , Worker }, backend_module (backend_type (Ref )),
278
- [Config # apns_config .certfile , Config # apns_config .gateway ], []]},
279
- permanent , 1000 , worker , [? MODULE ]};
280
- fcm ->
281
- {Worker ,
282
- {gen_server , start_link ,
283
- [{local , Worker }, backend_module (backend_type (Ref )),
284
- [Config # fcm_config .gateway , Config # fcm_config .api_key ], []]},
285
- permanent , 1000 , worker , [? MODULE ]}
286
- end ,
287
-
270
+ [{local , Worker }, backend_type (Ref ), Config , []]},
271
+ permanent , 1000 , worker , [? MODULE ]},
288
272
supervisor :start_child (ejabberd_gen_mod_sup , BackendSpec ).
289
273
290
274
%
0 commit comments