118 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			118 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Go
		
	
	
	
|  | package core | ||
|  | 
 | ||
|  | import ( | ||
|  | 	"errors" | ||
|  | 	"time" | ||
|  | 
 | ||
|  | 	"github.com/pocketbase/dbx" | ||
|  | 	"github.com/pocketbase/pocketbase/tools/types" | ||
|  | ) | ||
|  | 
 | ||
|  | // FindAllMFAsByRecord returns all MFA models linked to the provided auth record.
 | ||
|  | func (app *BaseApp) FindAllMFAsByRecord(authRecord *Record) ([]*MFA, error) { | ||
|  | 	result := []*MFA{} | ||
|  | 
 | ||
|  | 	err := app.RecordQuery(CollectionNameMFAs). | ||
|  | 		AndWhere(dbx.HashExp{ | ||
|  | 			"collectionRef": authRecord.Collection().Id, | ||
|  | 			"recordRef":     authRecord.Id, | ||
|  | 		}). | ||
|  | 		OrderBy("created DESC"). | ||
|  | 		All(&result) | ||
|  | 
 | ||
|  | 	if err != nil { | ||
|  | 		return nil, err | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return result, nil | ||
|  | } | ||
|  | 
 | ||
|  | // FindAllMFAsByCollection returns all MFA models linked to the provided collection.
 | ||
|  | func (app *BaseApp) FindAllMFAsByCollection(collection *Collection) ([]*MFA, error) { | ||
|  | 	result := []*MFA{} | ||
|  | 
 | ||
|  | 	err := app.RecordQuery(CollectionNameMFAs). | ||
|  | 		AndWhere(dbx.HashExp{"collectionRef": collection.Id}). | ||
|  | 		OrderBy("created DESC"). | ||
|  | 		All(&result) | ||
|  | 
 | ||
|  | 	if err != nil { | ||
|  | 		return nil, err | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return result, nil | ||
|  | } | ||
|  | 
 | ||
|  | // FindMFAById returns a single MFA model by its id.
 | ||
|  | func (app *BaseApp) FindMFAById(id string) (*MFA, error) { | ||
|  | 	result := &MFA{} | ||
|  | 
 | ||
|  | 	err := app.RecordQuery(CollectionNameMFAs). | ||
|  | 		AndWhere(dbx.HashExp{"id": id}). | ||
|  | 		Limit(1). | ||
|  | 		One(result) | ||
|  | 
 | ||
|  | 	if err != nil { | ||
|  | 		return nil, err | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return result, nil | ||
|  | } | ||
|  | 
 | ||
|  | // DeleteAllMFAsByRecord deletes all MFA models associated with the provided record.
 | ||
|  | //
 | ||
|  | // Returns a combined error with the failed deletes.
 | ||
|  | func (app *BaseApp) DeleteAllMFAsByRecord(authRecord *Record) error { | ||
|  | 	models, err := app.FindAllMFAsByRecord(authRecord) | ||
|  | 	if err != nil { | ||
|  | 		return err | ||
|  | 	} | ||
|  | 
 | ||
|  | 	var errs []error | ||
|  | 	for _, m := range models { | ||
|  | 		if err := app.Delete(m); err != nil { | ||
|  | 			errs = append(errs, err) | ||
|  | 		} | ||
|  | 	} | ||
|  | 	if len(errs) > 0 { | ||
|  | 		return errors.Join(errs...) | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return nil | ||
|  | } | ||
|  | 
 | ||
|  | // DeleteExpiredMFAs deletes the expired MFAs for all auth collections.
 | ||
|  | func (app *BaseApp) DeleteExpiredMFAs() error { | ||
|  | 	authCollections, err := app.FindAllCollections(CollectionTypeAuth) | ||
|  | 	if err != nil { | ||
|  | 		return err | ||
|  | 	} | ||
|  | 
 | ||
|  | 	// note: perform even if MFA is disabled to ensure that there are no dangling old records
 | ||
|  | 	for _, collection := range authCollections { | ||
|  | 		minValidDate, err := types.ParseDateTime(time.Now().Add(-1 * collection.MFA.DurationTime())) | ||
|  | 		if err != nil { | ||
|  | 			return err | ||
|  | 		} | ||
|  | 
 | ||
|  | 		items := []*Record{} | ||
|  | 
 | ||
|  | 		err = app.RecordQuery(CollectionNameMFAs). | ||
|  | 			AndWhere(dbx.HashExp{"collectionRef": collection.Id}). | ||
|  | 			AndWhere(dbx.NewExp("[[created]] < {:date}", dbx.Params{"date": minValidDate})). | ||
|  | 			All(&items) | ||
|  | 		if err != nil { | ||
|  | 			return err | ||
|  | 		} | ||
|  | 
 | ||
|  | 		for _, item := range items { | ||
|  | 			err = app.Delete(item) | ||
|  | 			if err != nil { | ||
|  | 				return err | ||
|  | 			} | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return nil | ||
|  | } |