MCPcopy Create free account
hub / github.com/TheThingsNetwork/lorawan-stack / updateInfo

Method updateInfo

pkg/basicstation/cups/update_info.go:161–392  ·  view source on GitHub ↗
(w http.ResponseWriter, r *http.Request)

Source from the content-addressed store, hash-verified

159var errParse = errors.DefineAborted("parse", "request body parsing")
160
161func (s *Server) updateInfo(w http.ResponseWriter, r *http.Request) (err error) {
162 ctx := r.Context()
163
164 var req UpdateInfoRequest
165 if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
166 return errParse.WithCause(err)
167 }
168
169 if err := req.ValidateContext(ctx); err != nil {
170 return err
171 }
172
173 logger := log.FromContext(ctx).WithFields(log.Fields(
174 "gateway_eui", req.Router.EUI64.String(),
175 ))
176 ctx = log.NewContext(ctx, logger)
177
178 registry, err := s.getRegistry(ctx, nil)
179 if err != nil {
180 return err
181 }
182 serverAuth := s.getServerAuth(ctx)
183
184 var ids *ttnpb.GatewayIdentifiers
185 ids, err = registry.GetIdentifiersForEUI(ctx, &ttnpb.GetGatewayIdentifiersForEUIRequest{
186 Eui: req.Router.EUI64.Bytes(),
187 }, serverAuth)
188 if err != nil {
189 if errors.IsNotFound(err) && s.registerUnknown {
190 gtw, err := s.registerGateway(ctx, req)
191 if err != nil {
192 return err
193 }
194 ids = gtw.GetIds()
195 // Use the generated CUPS API Key for authenticating subsequent calls.
196 md := metadata.New(map[string]string{
197 "id": gtw.GetIds().GetGatewayId(),
198 "authorization": fmt.Sprintf("Bearer %s", string(gtw.TargetCupsKey.Value)),
199 })
200 if ctxMd, ok := metadata.FromIncomingContext(ctx); ok {
201 md = metadata.Join(ctxMd, md)
202 }
203 ctx = metadata.NewIncomingContext(ctx, md)
204 // This makes the server return the target CUPS URI and credentials to the gateway.
205 req.CUPSURI = ""
206 } else {
207 return err
208 }
209 }
210
211 uid := unique.ID(ctx, ids)
212 logger.WithField("gateway_uid", uid).Debug("Found gateway for EUI")
213
214 var md metadata.MD
215 if auth := r.Header.Get("Authorization"); auth != "" {
216 if !strings.HasPrefix(auth, "Bearer ") {
217 auth = fmt.Sprintf("Bearer %s", auth)
218 }

Callers 2

TestServerFunction · 0.95
UpdateInfoMethod · 0.95

Calls 15

ValidateContextMethod · 0.95
getRegistryMethod · 0.95
getServerAuthMethod · 0.95
registerGatewayMethod · 0.95
getTrustMethod · 0.95
MarshalBinaryMethod · 0.95
FromContextFunction · 0.92
FieldsFunction · 0.92
NewContextFunction · 0.92
IsNotFoundFunction · 0.92
IDFunction · 0.92
RequireGatewayFunction · 0.92

Tested by 1

TestServerFunction · 0.76