func initContextWithApiKey(ctx *Context) bool { var keyString string if keyString = getApiKey(ctx); keyString == "" { return false } // base64 decode key decoded, err := apikeygen.Decode(keyString) if err != nil { ctx.JsonApiErr(401, "Invalid API key", err) return true } // fetch key keyQuery := m.GetApiKeyByNameQuery{KeyName: decoded.Name, OrgId: decoded.OrgId} if err := bus.Dispatch(&keyQuery); err != nil { ctx.JsonApiErr(401, "Invalid API key", err) return true } else { apikey := keyQuery.Result // validate api key if !apikeygen.IsValid(decoded, apikey.Key) { ctx.JsonApiErr(401, "Invalid API key", err) return true } ctx.IsSignedIn = true ctx.SignedInUser = &m.SignedInUser{} ctx.OrgRole = apikey.Role ctx.ApiKeyId = apikey.Id ctx.OrgId = apikey.OrgId return true } }
func register(so socketio.Socket) (*CollectorContext, error) { req := so.Request() req.ParseForm() keyString := req.Form.Get("apiKey") name := req.Form.Get("name") if name == "" { return nil, errors.New("collector name not provided.") } lastSocketId := req.Form.Get("lastSocketId") versionStr := req.Form.Get("version") if versionStr == "" { return nil, errors.New("version number not provided.") } versionParts := strings.SplitN(versionStr, ".", 2) if len(versionParts) != 2 { return nil, errors.New("could not parse version number") } versionMajor, err := strconv.ParseInt(versionParts[0], 10, 64) if err != nil { return nil, errors.New("could not parse version number") } versionMinor, err := strconv.ParseFloat(versionParts[1], 64) if err != nil { return nil, errors.New("could not parse version number.") } //--------- set required version of collector.------------// // if versionMajor < 0 || versionMinor < 1.1 { return nil, errors.New("invalid collector version. Please upgrade.") } // //--------- set required version of collector.------------// log.Info("collector %s with version %d.%f connected", name, versionMajor, versionMinor) if keyString != "" { // base64 decode key decoded, err := apikeygen.Decode(keyString) if err != nil { return nil, m.ErrInvalidApiKey } // fetch key keyQuery := m.GetApiKeyByNameQuery{KeyName: decoded.Name, OrgId: decoded.OrgId} if err := bus.Dispatch(&keyQuery); err != nil { return nil, m.ErrInvalidApiKey } apikey := keyQuery.Result // validate api key if !apikeygen.IsValid(decoded, apikey.Key) { return nil, m.ErrInvalidApiKey } // lookup collector colQuery := m.GetCollectorByNameQuery{Name: name, OrgId: apikey.OrgId} if err := bus.Dispatch(&colQuery); err != nil { //collector not found, so lets create a new one. colCmd := m.AddCollectorCommand{ OrgId: apikey.OrgId, Name: name, Enabled: true, } if err := bus.Dispatch(&colCmd); err != nil { return nil, err } colQuery.Result = colCmd.Result } sess := &CollectorContext{ SignedInUser: &m.SignedInUser{ IsGrafanaAdmin: apikey.IsAdmin, OrgRole: apikey.Role, ApiKeyId: apikey.Id, OrgId: apikey.OrgId, Name: apikey.Name, }, Collector: colQuery.Result, Socket: so, SocketId: so.Id(), } log.Info("collector %s with id %d owned by %d authenticated successfully.", name, colQuery.Result.Id, apikey.OrgId) if lastSocketId != "" { log.Info("removing socket with Id %s", lastSocketId) cmd := &m.DeleteCollectorSessionCommand{ SocketId: lastSocketId, OrgId: sess.OrgId, CollectorId: sess.Collector.Id, } if err := bus.Dispatch(cmd); err != nil { log.Error(0, "failed to remove collectors lastSocketId", err) return nil, err } } if err := sess.Save(); err != nil { return nil, err } log.Info("saving session to contextCache") contextCache.Set(sess.SocketId, sess) log.Info("session saved to contextCache") return sess, nil } return nil, m.ErrInvalidApiKey }