@@ -39,44 +39,67 @@ stop_connector(Id) ->
39
39
lorawan_http_registry :delete ({ws , Id }).
40
40
41
41
init (Req , [# connector {connid = Id }= Connector , Type ]) ->
42
- Bindings = lorawan_admin :parse (cowboy_req :bindings (Req )),
43
- case validate (maps :to_list (Bindings )) of
44
- ok ->
42
+ case authorize (Req , Connector ) of
43
+ {ok , Bindings } ->
45
44
{ok , Timeout } = application :get_env (lorawan_server , websocket_timeout ),
46
45
{cowboy_websocket , Req ,
47
46
# state {conn = Connector , type = Type , path = cowboy_req :path (Req ), bindings = Bindings },
48
47
#{idle_timeout => Timeout }};
48
+ unauthorized ->
49
+ lorawan_utils :throw_error ({connector , Id }, unauthorized ),
50
+ Req2 = cowboy_req :reply (403 , Req ),
51
+ {ok , Req2 , undefined };
49
52
{error , Error } ->
50
53
lorawan_utils :throw_error ({connector , Id }, Error ),
51
54
Req2 = cowboy_req :reply (404 , Req ),
52
55
{ok , Req2 , undefined }
53
56
end .
54
57
55
- validate ([{Key , Value } | Other ]) ->
56
- case validate0 (Key , Value ) of
58
+ authorize (Req , # connector {name = User })
59
+ when User == undefined ; User == <<>> ->
60
+ validate (Req );
61
+ authorize (Req , # connector {name = User , pass = Pass }) ->
62
+ case cowboy_req :parse_header (<<" authorization" >>, Req ) of
63
+ {basic , User , Pass } ->
64
+ validate (Req );
65
+ _Else ->
66
+ unauthorized
67
+ end .
68
+
69
+ validate (Req ) ->
70
+ Bindings = lorawan_admin :parse (cowboy_req :bindings (Req )),
71
+ case validate0 (maps :to_list (Bindings )) of
72
+ ok ->
73
+ {ok , Bindings };
74
+ Error ->
75
+ Error
76
+ end .
77
+
78
+ validate0 ([{Key , Value } | Other ]) ->
79
+ case validate_key (Key , Value ) of
57
80
ok ->
58
81
validate (Other );
59
82
Else ->
60
83
Else
61
84
end ;
62
- validate ([])->
85
+ validate0 ([])->
63
86
ok .
64
87
65
- validate0 (app , App ) ->
88
+ validate_key (app , App ) ->
66
89
case mnesia :dirty_read (handler , App ) of
67
90
[# handler {}] ->
68
91
ok ;
69
92
_Else ->
70
93
{error , {unknown_application , App }}
71
94
end ;
72
- validate0 (deveui , DevEUI ) ->
95
+ validate_key (deveui , DevEUI ) ->
73
96
case mnesia :dirty_read (device , DevEUI ) of
74
97
[# device {}] ->
75
98
ok ;
76
99
_Else ->
77
100
{error , {unknown_deveui , lorawan_utils :binary_to_hex (DevEUI )}}
78
101
end ;
79
- validate0 (devaddr , DevAddr ) ->
102
+ validate_key (devaddr , DevAddr ) ->
80
103
case mnesia :dirty_read (node , DevAddr ) of
81
104
[# node {}] ->
82
105
ok ;
@@ -88,7 +111,7 @@ validate0(devaddr, DevAddr) ->
88
111
{error , {unknown_devaddr , lorawan_utils :binary_to_hex (DevAddr )}}
89
112
end
90
113
end ;
91
- validate0 (_Else , _ ) ->
114
+ validate_key (_Else , _ ) ->
92
115
ok .
93
116
94
117
websocket_init (# state {conn = # connector {connid = Id , app = App }, bindings = Bindings } = State ) ->
0 commit comments