aboutsummaryrefslogblamecommitdiff
path: root/quotas.go
blob: e077ac8bb4f80d348656b04b91af1f9853e3ef5e (plain) (tree)














































































                                                                                        
package main

import (
	"errors"
	"fmt"
	"strconv"

	"github.com/go-ldap/ldap/v3"
	garage "git.deuxfleurs.fr/garage-sdk/garage-admin-sdk-golang"
)

const (
	// --- Default Quota Values ---
	QUOTA_WEBSITE_SIZE_DEFAULT = 1024 * 1024 * 50 // 50MB
	QUOTA_WEBSITE_SIZE_BURSTED = 1024 * 1024 * 200 // 200MB
	QUOTA_WEBSITE_OBJECTS = 10000 // 10k objects
	QUOTA_WEBSITE_COUNT = 5 // 5 buckets

	// --- Per-user overridable fields ---
	FIELD_QUOTA_WEBSITE_SIZE_BURSTED = "quota_website_size_bursted"
        FIELD_QUOTA_WEBSITE_COUNT = "quota_website_count"
)

type UserQuota struct {
	WebsiteCount int64
	WebsiteSizeDefault int64
	WebsiteSizeBursted int64
	WebsiteObjects int64
}

func NewUserQuota() *UserQuota {
	return &UserQuota {
		WebsiteCount: QUOTA_WEBSITE_COUNT,
		WebsiteSizeDefault: QUOTA_WEBSITE_SIZE_DEFAULT,
		WebsiteSizeBursted: QUOTA_WEBSITE_SIZE_BURSTED,
		WebsiteObjects: QUOTA_WEBSITE_OBJECTS,
	}
}

var (
	ErrQuotaEmpty = fmt.Errorf("No quota is defined for this entry")
	ErrQuotaInvalid = fmt.Errorf("The defined quota can't be parsed")
)

func entryToQuota(entry *ldap.Entry, field string) (int64, error) {
	f := entry.GetAttributeValue(field)
	if f == "" {
		return -1, ErrQuotaEmpty
	}

	q, err := strconv.ParseInt(f, 10, 64)
	if err != nil {
		return -1, errors.Join(ErrQuotaInvalid, err)
	}
	return q, nil
}

func NewUserQuotaFromEntry(entry *ldap.Entry) *UserQuota {
	quotas := NewUserQuota()

	if q, err := entryToQuota(entry, FIELD_QUOTA_WEBSITE_COUNT); err != nil {
		quotas.WebsiteCount = q
	}

	if q, err := entryToQuota(entry, FIELD_QUOTA_WEBSITE_SIZE_BURSTED); err != nil {
		quotas.WebsiteSizeBursted = q
	}

	return quotas
}

func (q *UserQuota) DefaultWebsiteQuota() *garage.UpdateBucketRequestQuotas {
	qr := garage.NewUpdateBucketRequestQuotas()

	qr.SetMaxSize(q.WebsiteSizeDefault) 
	qr.SetMaxObjects(q.WebsiteSizeBursted)

	return qr
}