mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-09-09 05:18:37 +00:00
Backport #23768 (no source code conflict, only some unrelated docs/test-ini conflicts) Some storages like: * https://developers.cloudflare.com/r2/api/s3/api/ * https://www.backblaze.com/b2/docs/s3_compatible_api.html They do not support "x-amz-checksum-algorithm" header But minio recently uses that header with CRC32C by default. So we have to tell minio to use legacy MD5 checksum.
92 lines
2.5 KiB
Go
92 lines
2.5 KiB
Go
// Copyright 2020 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package setting
|
|
|
|
import (
|
|
"path/filepath"
|
|
"reflect"
|
|
|
|
ini "gopkg.in/ini.v1"
|
|
)
|
|
|
|
// Storage represents configuration of storages
|
|
type Storage struct {
|
|
Type string
|
|
Path string
|
|
Section *ini.Section
|
|
ServeDirect bool
|
|
}
|
|
|
|
// MapTo implements the Mappable interface
|
|
func (s *Storage) MapTo(v interface{}) error {
|
|
pathValue := reflect.ValueOf(v).Elem().FieldByName("Path")
|
|
if pathValue.IsValid() && pathValue.Kind() == reflect.String {
|
|
pathValue.SetString(s.Path)
|
|
}
|
|
if s.Section != nil {
|
|
return s.Section.MapTo(v)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func getStorage(rootCfg ConfigProvider, name, typ string, targetSec *ini.Section) Storage {
|
|
const sectionName = "storage"
|
|
sec := rootCfg.Section(sectionName)
|
|
|
|
// Global Defaults
|
|
sec.Key("MINIO_ENDPOINT").MustString("localhost:9000")
|
|
sec.Key("MINIO_ACCESS_KEY_ID").MustString("")
|
|
sec.Key("MINIO_SECRET_ACCESS_KEY").MustString("")
|
|
sec.Key("MINIO_BUCKET").MustString("gitea")
|
|
sec.Key("MINIO_LOCATION").MustString("us-east-1")
|
|
sec.Key("MINIO_USE_SSL").MustBool(false)
|
|
sec.Key("MINIO_INSECURE_SKIP_VERIFY").MustBool(false)
|
|
sec.Key("MINIO_CHECKSUM_ALGORITHM").MustString("default")
|
|
|
|
if targetSec == nil {
|
|
targetSec, _ = rootCfg.NewSection(name)
|
|
}
|
|
|
|
var storage Storage
|
|
storage.Section = targetSec
|
|
storage.Type = typ
|
|
|
|
overrides := make([]*ini.Section, 0, 3)
|
|
nameSec, err := rootCfg.GetSection(sectionName + "." + name)
|
|
if err == nil {
|
|
overrides = append(overrides, nameSec)
|
|
}
|
|
|
|
typeSec, err := rootCfg.GetSection(sectionName + "." + typ)
|
|
if err == nil {
|
|
overrides = append(overrides, typeSec)
|
|
nextType := typeSec.Key("STORAGE_TYPE").String()
|
|
if len(nextType) > 0 {
|
|
storage.Type = nextType // Support custom STORAGE_TYPE
|
|
}
|
|
}
|
|
overrides = append(overrides, sec)
|
|
|
|
for _, override := range overrides {
|
|
for _, key := range override.Keys() {
|
|
if !targetSec.HasKey(key.Name()) {
|
|
_, _ = targetSec.NewKey(key.Name(), key.Value())
|
|
}
|
|
}
|
|
if len(storage.Type) == 0 {
|
|
storage.Type = override.Key("STORAGE_TYPE").String()
|
|
}
|
|
}
|
|
storage.ServeDirect = storage.Section.Key("SERVE_DIRECT").MustBool(false)
|
|
|
|
// Specific defaults
|
|
storage.Path = storage.Section.Key("PATH").MustString(filepath.Join(AppDataPath, name))
|
|
if !filepath.IsAbs(storage.Path) {
|
|
storage.Path = filepath.Join(AppWorkPath, storage.Path)
|
|
storage.Section.Key("PATH").SetValue(storage.Path)
|
|
}
|
|
storage.Section.Key("MINIO_BASE_PATH").MustString(name + "/")
|
|
|
|
return storage
|
|
}
|