HandleJoin handles the given join-request.
(ctx context.Context, req *ttnpb.JoinRequest, authorizer Authorizer)
| 233 | |
| 234 | // HandleJoin handles the given join-request. |
| 235 | func (js *JoinServer) HandleJoin(ctx context.Context, req *ttnpb.JoinRequest, authorizer Authorizer) (res *ttnpb.JoinResponse, err error) { |
| 236 | if err := authorizer.RequireAuthorized(ctx); err != nil { |
| 237 | return nil, err |
| 238 | } |
| 239 | |
| 240 | logger := log.FromContext(ctx) |
| 241 | defer func() { |
| 242 | if err != nil { |
| 243 | registerRejectJoin(ctx, req, err) |
| 244 | } |
| 245 | }() |
| 246 | |
| 247 | supported := false |
| 248 | for _, ver := range supportedMACVersions { |
| 249 | if req.SelectedMacVersion == ver { |
| 250 | supported = true |
| 251 | break |
| 252 | } |
| 253 | } |
| 254 | if !supported { |
| 255 | return nil, errUnsupportedMACVersion.WithAttributes("version", req.SelectedMacVersion) |
| 256 | } |
| 257 | |
| 258 | req.Payload = &ttnpb.Message{} |
| 259 | if err = lorawan.UnmarshalMessage(req.RawPayload, req.Payload); err != nil { |
| 260 | return nil, errDecodePayload.WithCause(err) |
| 261 | } |
| 262 | |
| 263 | if req.Payload.MHdr.Major != ttnpb.Major_LORAWAN_R1 { |
| 264 | return nil, errUnsupportedLoRaWANMajorVersion.WithAttributes("major", req.Payload.MHdr.Major) |
| 265 | } |
| 266 | if req.Payload.MHdr.MType != ttnpb.MType_JOIN_REQUEST { |
| 267 | return nil, errWrongPayloadType.WithAttributes("type", req.Payload.MHdr.MType) |
| 268 | } |
| 269 | |
| 270 | pld := req.Payload.GetJoinRequestPayload() |
| 271 | if pld == nil { |
| 272 | return nil, errNoJoinRequest.New() |
| 273 | } |
| 274 | devEUI := types.MustEUI64(pld.DevEui).OrZero() |
| 275 | if devEUI.IsZero() { |
| 276 | return nil, errNoDevEUI.New() |
| 277 | } |
| 278 | joinEUI := types.MustEUI64(pld.JoinEui).OrZero() |
| 279 | logger = logger.WithFields(log.Fields( |
| 280 | "join_eui", joinEUI, |
| 281 | "dev_eui", devEUI, |
| 282 | )) |
| 283 | |
| 284 | var match bool |
| 285 | for _, p := range js.euiPrefixes { |
| 286 | if p.Matches(joinEUI) { |
| 287 | match = true |
| 288 | break |
| 289 | } |
| 290 | } |
| 291 | if !match { |
| 292 | return nil, errUnknownJoinEUI.New() |
nothing calls this directly
no test coverage detected