55
55
-type fcm_config () :: # fcm_config {}.
56
56
57
57
-record (backend_config ,
58
- {type :: backend_type (),
58
+ {ref :: backend_ref (),
59
59
config :: apns_config () | fcm_config ()}).
60
60
61
61
-type backend_config () :: # backend_config {}.
@@ -145,18 +145,34 @@ adhoc_local_commands(Acc, _From, _To, _Request) ->
145
145
146
146
147
147
adhoc_perform_action (<<" register-push-apns" >>, # jid {lserver = LServer } = From , XData ) ->
148
- case xmpp_util :get_xdata_values (<<" token" >>, XData ) of
149
- [Base64Token ] ->
150
- case catch base64 :decode (Base64Token ) of
151
- {'EXIT' , _ } -> {error , xmpp :err_bad_request ()};
152
- Token -> mod_pushoff_mnesia :register_client (From , {LServer , apns }, Token )
153
- end ;
154
- _ -> {error , xmpp :err_bad_request ()}
148
+ BackendRef = case xmpp_util :get_xdata_values (<<" backend_ref" >>, XData ) of
149
+ [Key ] -> {apns , Key };
150
+ _ -> apns
151
+ end ,
152
+ case validate_backend_ref (LServer , BackendRef ) of
153
+ {error , E } -> {error , E };
154
+ {ok , BackendRef } ->
155
+ case xmpp_util :get_xdata_values (<<" token" >>, XData ) of
156
+ [Base64Token ] ->
157
+ case catch base64 :decode (Base64Token ) of
158
+ {'EXIT' , _ } -> {error , xmpp :err_bad_request ()};
159
+ Token -> mod_pushoff_mnesia :register_client (From , {LServer , BackendRef }, Token )
160
+ end ;
161
+ _ -> {error , xmpp :err_bad_request ()}
162
+ end
155
163
end ;
156
164
adhoc_perform_action (<<" register-push-fcm" >>, # jid {lserver = LServer } = From , XData ) ->
157
- case xmpp_util :get_xdata_values (<<" token" >>, XData ) of
158
- [AsciiToken ] -> mod_pushoff_mnesia :register_client (From , {LServer , fcm }, AsciiToken );
159
- _ -> {error , xmpp :err_bad_request ()}
165
+ BackendRef = case xmpp_util :get_xdata_values (<<" backend_ref" >>, XData ) of
166
+ [Key ] -> {fcm , Key };
167
+ _ -> fcm
168
+ end ,
169
+ case validate_backend_ref (LServer , BackendRef ) of
170
+ {error , E } -> {error , E };
171
+ {ok , BackendRef } ->
172
+ case xmpp_util :get_xdata_values (<<" token" >>, XData ) of
173
+ [AsciiToken ] -> mod_pushoff_mnesia :register_client (From , {LServer , BackendRef }, AsciiToken );
174
+ _ -> {error , xmpp :err_bad_request ()}
175
+ end
160
176
end ;
161
177
adhoc_perform_action (<<" unregister-push" >>, From , _ ) ->
162
178
mod_pushoff_mnesia :unregister_client (From , undefined );
@@ -193,10 +209,10 @@ stop(Host) ->
193
209
ok = ejabberd_hooks :delete (remove_user , Host , ? MODULE , remove_user , 50 ),
194
210
195
211
[begin
196
- Worker = backend_worker ({Host , Type }),
212
+ Worker = backend_worker ({Host , Ref }),
197
213
supervisor :terminate_child (ejabberd_gen_mod_sup , Worker ),
198
214
supervisor :delete_child (ejabberd_gen_mod_sup , Worker )
199
- end || # backend_config {type = Type } <- backend_configs (Host )],
215
+ end || # backend_config {ref = Ref } <- backend_configs (Host )],
200
216
ok .
201
217
202
218
depends (_ , _ ) ->
@@ -205,27 +221,33 @@ depends(_, _) ->
205
221
mod_opt_type (backends ) -> fun ? MODULE :parse_backends /1 ;
206
222
mod_opt_type (_ ) -> [backends ].
207
223
224
+ validate_backend_ref (Host , Ref ) ->
225
+ case [R || # backend_config {ref = R } <- backend_configs (Host ), R == Ref ] of
226
+ [R ] -> {ok , R };
227
+ _ -> {error , xmpp :err_bad_request ()}
228
+ end .
229
+
230
+ backend_ref (apns , undefined ) -> apns ;
231
+ backend_ref (fcm , undefined ) -> fcm ;
232
+ backend_ref (apns , K ) -> {apns , K };
233
+ backend_ref (fcm , K ) -> {fcm , K }.
234
+
235
+ backend_type ({Type , _ }) -> Type ;
236
+ backend_type (Type ) -> Type .
237
+
208
238
parse_backends (Plists ) ->
209
239
[parse_backend (Plist ) || Plist <- Plists ].
210
240
211
241
parse_backend (Opts ) ->
212
- RawType = proplists :get_value (type , Opts ),
213
- Type =
214
- case lists :member (RawType , [apns , fcm ]) of
215
- true -> RawType
216
- end ,
217
- Gateway = proplists :get_value (gateway , Opts ),
218
- CertFile = proplists :get_value (certfile , Opts ),
219
- ApiKey = proplists :get_value (api_key , Opts ),
220
-
242
+ Ref = backend_ref (proplists :get_value (type , Opts ), proplists :get_value (backend_ref , Opts )),
221
243
# backend_config {
222
- type = Type ,
244
+ ref = Ref ,
223
245
config =
224
- case Type of
246
+ case backend_type ( Ref ) of
225
247
apns ->
226
- # apns_config {certfile = CertFile , gateway = Gateway };
248
+ # apns_config {certfile = proplists : get_value ( certfile , Opts ), gateway = proplists : get_value ( gateway , Opts ) };
227
249
fcm ->
228
- # fcm_config {gateway = Gateway , api_key = ApiKey }
250
+ # fcm_config {gateway = proplists : get_value ( gateway , Opts ), api_key = proplists : get_value ( api_key , Opts ) }
229
251
end
230
252
}.
231
253
@@ -235,32 +257,33 @@ parse_backend(Opts) ->
235
257
236
258
-spec (backend_worker (backend_id ()) -> atom ()).
237
259
238
- backend_worker ({Host , Type }) -> gen_mod :get_module_proc (Host , Type ).
260
+ backend_worker ({Host , {T , R }}) -> gen_mod :get_module_proc (Host , binary_to_atom (<<(erlang :atom_to_binary (T , latin1 ))/binary , " _" , R /binary >>, latin1 ));
261
+ backend_worker ({Host , Ref }) -> gen_mod :get_module_proc (Host , Ref ).
239
262
240
263
backend_configs (Host ) ->
241
264
gen_mod :get_module_opt (Host , ? MODULE , backends ,
242
265
fun (O ) when is_list (O ) -> O end , []).
243
266
267
+ backend_module (apns ) -> ? MODULE_APNS ;
268
+ backend_module (fcm ) -> ? MODULE_FCM .
269
+
244
270
-spec (start_worker (Host :: binary (), Backend :: backend_config ()) -> ok ).
245
271
246
- start_worker (Host , # backend_config {type = Type , config = TypeConfig }) ->
247
- Module = proplists :get_value (Type , [{apns , ? MODULE_APNS }, {fcm , ? MODULE_FCM }]),
248
- Worker = backend_worker ({Host , Type }),
249
- BackendSpec =
250
- case Type of
272
+ start_worker (Host , # backend_config {ref = Ref , config = Config }) ->
273
+ Worker = backend_worker ({Host , Ref }),
274
+ BackendSpec =
275
+ case backend_type (Ref ) of
251
276
apns ->
252
277
{Worker ,
253
278
{gen_server , start_link ,
254
- [{local , Worker }, Module ,
255
- % % TODO: mb i should send one record like BackendConfig#backend_config.config and parse it in each module
256
- [TypeConfig # apns_config .certfile , TypeConfig # apns_config .gateway ], []]},
279
+ [{local , Worker }, backend_module (backend_type (Ref )),
280
+ [Config # apns_config .certfile , Config # apns_config .gateway ], []]},
257
281
permanent , 1000 , worker , [? MODULE ]};
258
282
fcm ->
259
283
{Worker ,
260
284
{gen_server , start_link ,
261
- [{local , Worker }, Module ,
262
- % % TODO: mb i should send one record like BackendConfig#backend_config.config and parse it in each module
263
- [TypeConfig # fcm_config .gateway , TypeConfig # fcm_config .api_key ], []]},
285
+ [{local , Worker }, backend_module (backend_type (Ref )),
286
+ [Config # fcm_config .gateway , Config # fcm_config .api_key ], []]},
264
287
permanent , 1000 , worker , [? MODULE ]}
265
288
end ,
266
289
0 commit comments