// Handler that clients can use to get a jwt token. // Payload needs to be json in the form of {"username": "******", "password": "******"}. // Reply will be of the form {"token": "TOKEN"}. func (mw *JWTMiddleware) LoginHandler(writer rest.ResponseWriter, request *rest.Request) { login_vals := login{} err := request.DecodeJsonPayload(&login_vals) if err != nil { apiutils.WriteRestError(writer, apierrors.NewBadRequest(err.Error())) return } if login_vals.Username == "" { apiutils.WriteRestError(writer, apierrors.NewInvalid("login", "", fielderrors.ValidationErrorList{ fielderrors.NewFieldRequired("username")})) return } if login_vals.Password == "" { apiutils.WriteRestError(writer, apierrors.NewInvalid("login", "", fielderrors.ValidationErrorList{ fielderrors.NewFieldRequired("password")})) return } if !mw.Authenticator(login_vals.Username, login_vals.Password) { mw.unauthorized(writer) return } token := jwt.New(jwt.GetSigningMethod(mw.SigningAlgorithm)) if mw.PayloadFunc != nil { for key, value := range mw.PayloadFunc(login_vals.Username) { token.Claims[key] = value } } token.Claims["id"] = login_vals.Username token.Claims["exp"] = time.Now().Add(mw.Timeout).Unix() if mw.MaxRefresh != 0 { token.Claims["orig_iat"] = time.Now().Unix() } tokenString, err := token.SignedString(mw.Key) if err != nil { mw.unauthorized(writer) return } writer.WriteJson(&map[string]string{"token": tokenString}) }
func PostUserSettings(w rest.ResponseWriter, r *rest.Request) { form := UserSettings{} err := r.DecodeJsonPayload(&form) if err != nil { apiutils.WriteRestError(w, apierrors.NewBadRequest(err.Error())) return } changed := false // true if config really was updated err = clientconfig.Update(func(conf *clientconfig.Config) error { s := &conf.Settings.Local prevLang := s.Language if ValidLanguage(form.Language) { s.Language = form.Language } else { s.Language = "en" } if prevLang != s.Language { ui.Language(s.Language) changed = true } if s.CountryCode != form.CountryCode { s.CountryCode = form.CountryCode changed = true } if s.ClientAutoUpdate != form.ClientAutoUpdate { s.ClientAutoUpdate = form.ClientAutoUpdate changed = true } if s.BlocklistAutoUpdate != form.BlocklistAutoUpdate { s.BlocklistAutoUpdate = form.BlocklistAutoUpdate changed = true } return nil }) if changed { err := clientconfig.Write() if err != nil { lg.Errorln(err) } } if err != nil { lg.Errorln(err) } }
func ValidateConnectionString(w rest.ResponseWriter, r *rest.Request) { form := ValidateConnectionStringRequest{} err := r.DecodeJsonPayload(&form) if err != nil { apiutils.WriteRestError(w, apierrors.NewBadRequest("can't decode json")) return } c, err := shared.DecodeConnection(form.ConnectionString) if err != nil { w.WriteJson(ValidateConnectionStringResponse{ Ok: false, }) return } w.WriteJson(ValidateConnectionStringResponse{ Ok: true, Name: c.DisplayName(), }) }
func PostConnection(w rest.ResponseWriter, r *rest.Request) { form := ConnectionSetting{} err := r.DecodeJsonPayload(&form) if err != nil { apiutils.WriteRestError(w, apierrors.NewBadRequest(err.Error())) return } err = clientconfig.Update(func(conf *clientconfig.Config) error { all := conf.Settings.Connections var connection shared.Connection // decoded connection var invalids fielderrors.ValidationErrorList // Verify that the encoded field is set { if form.Encoded == "" { invalids = append(invalids, fielderrors.NewFieldRequired("encoded")) } } // verify that the connection is decodeable { var err error connection, err = shared.DecodeConnection(form.Encoded) if err != nil { invalids = append(invalids, fielderrors.NewFieldInvalid("encoded", form.Encoded, "invalid formatting")) } } // validate that the id exists, if supplied foundIdx := 0 { if form.ID != "" { found := false for k, v := range all { if v.ID == form.ID { found = true foundIdx = k } } if !found { invalids = append(invalids, fielderrors.NewFieldNotFound("id", form.ID)) } } } // validate that the connection doesnt alreay exist { encoded, err := connection.Encode() if err != nil { apiutils.WriteRestError(w, err) return nil } found := false for _, v := range all { enc2, err := v.Encode() if err != nil { lg.Errorln(err) continue } if enc2 == encoded { found = true } } if found { invalids = append(invalids, fielderrors.NewFieldDuplicate("encoded", form.Encoded)) } } // end of field validations if len(invalids) > 0 { apiutils.WriteRestError(w, apierrors.NewInvalid("post-connection", "", invalids)) return nil } // add connection to settings and save if form.ID == "" { connection.EnsureID() conf.Settings.Connections = append(conf.Settings.Connections, connection) } else { conf.Settings.Connections[foundIdx] = connection } service.UpdateConnections(conf.Settings.Connections) return nil }) if err != nil { lg.Errorln(err) } clientconfig.Write() w.WriteJson(true) }