...
1
2
3
4
5
6
7
8
9
10
11
12
13 package cdb
14
15 import (
16 "context"
17 "encoding/json"
18 "os"
19 "path/filepath"
20
21 "gopkg.in/yaml.v3"
22
23 "github.com/go-kivik/kivik/v4/driver"
24 "github.com/go-kivik/kivik/v4/x/fsdb/cdb/decode"
25 )
26
27
28
29 func (fs *FS) ReadSecurity(ctx context.Context, path string) (*driver.Security, error) {
30 sec := new(driver.Security)
31 ext, err := fs.findSecurityExt(ctx, path)
32 if err != nil {
33 return nil, err
34 }
35 if ext == "" {
36 return sec, nil
37 }
38 f, err := fs.fs.Open(filepath.Join(path, "_security."+ext))
39 if err == nil {
40 defer f.Close()
41 err := decode.Decode(f, ext, sec)
42 return sec, err
43 }
44 if !os.IsNotExist(err) {
45 return nil, err
46 }
47
48 return sec, nil
49 }
50
51
52
53
54 func (fs *FS) findSecurityExt(ctx context.Context, path string) (string, error) {
55 for _, ext := range decode.Extensions() {
56 if err := ctx.Err(); err != nil {
57 return "", err
58 }
59 stat, err := fs.fs.Stat(filepath.Join(path, "_security."+ext))
60 if os.IsNotExist(err) {
61 continue
62 }
63 if err != nil {
64 return "", err
65 }
66 if stat.Mode().IsRegular() {
67 return ext, nil
68 }
69 }
70 return "", nil
71 }
72
73
74
75 func (fs *FS) WriteSecurity(ctx context.Context, path string, sec *driver.Security) error {
76 ext, err := fs.findSecurityExt(ctx, path)
77 if err != nil {
78 return err
79 }
80 if ext == "" {
81 ext = "json"
82 }
83 filename := filepath.Join(path, "_security."+ext)
84 tmp, err := fs.fs.TempFile(path, "_security."+ext)
85 if err != nil {
86 return err
87 }
88 var enc interface {
89 Encode(interface{}) error
90 }
91 switch ext {
92 case "json":
93 enc = json.NewEncoder(tmp)
94 case "yaml", "yml":
95 enc = yaml.NewEncoder(tmp)
96 }
97 if err := enc.Encode(sec); err != nil {
98 return err
99 }
100 if err := tmp.Close(); err != nil {
101 return err
102 }
103 return fs.fs.Rename(tmp.Name(), filename)
104 }
105
View as plain text