func (sc *ServerContext) applySyncFunction(dbcontext *db.DatabaseContext, syncFn string) error { changed, err := dbcontext.UpdateSyncFun(syncFn) if err != nil || !changed { return err } // Sync function has changed: base.Logf("**NOTE:** %q's sync function has changed. The new function may assign different channels to documents, or permissions to users. You may want to re-sync the database to update these.", dbcontext.Name) return nil }
func (sc *ServerContext) installPrincipals(context *db.DatabaseContext, spec map[string]*db.PrincipalConfig, what string) error { for name, princ := range spec { isGuest := name == base.GuestUsername if isGuest { internalName := "" princ.Name = &internalName } else { princ.Name = &name } _, err := context.UpdatePrincipal(*princ, (what == "user"), isGuest) if err != nil { // A conflict error just means updatePrincipal didn't overwrite an existing user. if status, _ := base.ErrorAsHTTPStatus(err); status != http.StatusConflict { return fmt.Errorf("Couldn't create %s %q: %v", what, name, err) } } else if isGuest { base.Log(" Reset guest user to config") } else { base.Logf(" Created %s %q", what, name) } } return nil }
func (sc *ServerContext) startShadowing(dbcontext *db.DatabaseContext, shadow *ShadowConfig) error { base.Warn("Bucket Shadowing feature comes with a number of limitations and caveats. See https://github.com/couchbase/sync_gateway/issues/1363 for more details.") var pattern *regexp.Regexp if shadow.Doc_id_regex != nil { var err error pattern, err = regexp.Compile(*shadow.Doc_id_regex) if err != nil { base.Warn("Invalid shadow doc_id_regex: %s", *shadow.Doc_id_regex) return err } } spec := base.BucketSpec{ Server: *shadow.Server, PoolName: "default", BucketName: *shadow.Bucket, FeedType: shadow.FeedType, } if shadow.Pool != nil { spec.PoolName = *shadow.Pool } if shadow.Username != "" { spec.Auth = shadow } bucket, err := base.GetBucket(spec, nil) if err != nil { err = base.HTTPErrorf(http.StatusBadGateway, "Unable to connect to shadow bucket: %s", err) return err } shadower, err := db.NewShadower(dbcontext, bucket, pattern) if err != nil { bucket.Close() return err } dbcontext.Shadower = shadower //Remove credentials from server URL before logging url, err := couchbase.ParseURL(spec.Server) if err == nil { base.Logf("Database %q shadowing remote bucket %q, pool %q, server <%s:%s/%s>", dbcontext.Name, spec.BucketName, spec.PoolName, url.Scheme, url.Host, url.Path) } return nil }
func (sc *ServerContext) startShadowing(dbcontext *db.DatabaseContext, shadow *ShadowConfig) error { var pattern *regexp.Regexp if shadow.Doc_id_regex != nil { var err error pattern, err = regexp.Compile(*shadow.Doc_id_regex) if err != nil { base.Warn("Invalid shadow doc_id_regex: %s", *shadow.Doc_id_regex) return err } } spec := base.BucketSpec{ Server: *shadow.Server, PoolName: "default", BucketName: shadow.Bucket, FeedType: shadow.FeedType, } if shadow.Pool != nil { spec.PoolName = *shadow.Pool } if shadow.Username != "" { spec.Auth = shadow } bucket, err := db.ConnectToBucket(spec) if err != nil { return err } shadower, err := db.NewShadower(dbcontext, bucket, pattern) if err != nil { bucket.Close() return err } dbcontext.Shadower = shadower //Remove credentials from server URL before logging url, err := couchbase.ParseURL(spec.Server) if err == nil { base.Logf("Database %q shadowing remote bucket %q, pool %q, server <%s:%s/%s>", dbcontext.Name, spec.BucketName, spec.PoolName, url.Scheme, url.Host, url.Path) } return nil }
func (h *handler) checkAuth(context *db.DatabaseContext) error { h.user = nil if context == nil { return nil } // Check basic auth first if userName, password := h.getBasicAuth(); userName != "" { h.user = context.Authenticator().AuthenticateUser(userName, password) if h.user == nil { base.Logf("HTTP auth failed for username=%q", userName) h.response.Header().Set("WWW-Authenticate", `Basic realm="Couchbase Sync Gateway"`) return base.HTTPErrorf(http.StatusUnauthorized, "Invalid login") } return nil } // Check cookie var err error h.user, err = context.Authenticator().AuthenticateCookie(h.rq, h.response) if err != nil { return err } else if h.user != nil { return nil } // No auth given -- check guest access if h.user, err = context.Authenticator().GetUser(""); err != nil { return err } if h.privs == regularPrivs && h.user.Disabled() { h.response.Header().Set("WWW-Authenticate", `Basic realm="Couchbase Sync Gateway"`) return base.HTTPErrorf(http.StatusUnauthorized, "Login required") } return nil }
func (h *handler) checkAuth(context *db.DatabaseContext) error { h.user = nil if context == nil { return nil } var err error // If oidc enabled, check for bearer ID token if context.Options.OIDCOptions != nil { if token := h.getBearerToken(); token != "" { h.user, _, err = context.Authenticator().AuthenticateUntrustedJWT(token, context.OIDCProviders, h.getOIDCCallbackURL) if h.user == nil || err != nil { return base.HTTPErrorf(http.StatusUnauthorized, "Invalid login") } return nil } /* * If unsupported/oidc testing is enabled * and this is a call on the token endpoint * and the username and password match those in the oidc default provider config * then authorize this request */ if unsupportedOptions := context.Options.UnsupportedOptions; unsupportedOptions != nil { if unsupportedOptions.OidcTestProvider.Enabled && strings.HasSuffix(h.rq.URL.Path, "/_oidc_testing/token") { if username, password := h.getBasicAuth(); username != "" && password != "" { provider := context.Options.OIDCOptions.Providers.GetProviderForIssuer(issuerUrlForDB(h, context.Name), testProviderAudiences) if provider != nil && provider.ClientID != nil && provider.ValidationKey != nil { if *provider.ClientID == username && *provider.ValidationKey == password { return nil } } } } } } // Check basic auth first if userName, password := h.getBasicAuth(); userName != "" { h.user = context.Authenticator().AuthenticateUser(userName, password) if h.user == nil { base.Logf("HTTP auth failed for username=%q", userName) h.response.Header().Set("WWW-Authenticate", `Basic realm="Couchbase Sync Gateway"`) return base.HTTPErrorf(http.StatusUnauthorized, "Invalid login") } return nil } // Check cookie h.user, err = context.Authenticator().AuthenticateCookie(h.rq, h.response) if err != nil { return err } else if h.user != nil { return nil } // No auth given -- check guest access if h.user, err = context.Authenticator().GetUser(""); err != nil { return err } if h.privs == regularPrivs && h.user.Disabled() { h.response.Header().Set("WWW-Authenticate", `Basic realm="Couchbase Sync Gateway"`) return base.HTTPErrorf(http.StatusUnauthorized, "Login required") } return nil }