-
Notifications
You must be signed in to change notification settings - Fork 384
/
repo.go
123 lines (104 loc) · 3.13 KB
/
repo.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
package encryptedrepo
import (
"fmt"
"path/filepath"
"time"
ipfs_cfg "github.com/ipfs/kubo/config"
ipfs_repo "github.com/ipfs/kubo/repo"
"github.com/pkg/errors"
"berty.tech/berty/v2/go/pkg/errcode"
encrepo "berty.tech/go-ipfs-repo-encrypted"
"berty.tech/weshnet/pkg/ipfsutil"
)
// LoadEncryptedRepoFromPath
func LoadEncryptedRepoFromPath(path string, key []byte, salt []byte) (ipfs_repo.Repo, error) {
dir, _ := filepath.Split(path)
if _, err := ipfsutil.LoadPlugins(dir); err != nil {
return nil, errors.Wrap(err, "failed to load plugins")
}
// init repo if needed
sqldsOpts := encrepo.SQLCipherDatastoreOptions{JournalMode: "WAL", PlaintextHeader: len(salt) != 0, Salt: salt}
isInit, err := encrepo.IsInitialized(path, key, sqldsOpts)
if err != nil {
return nil, errors.Wrap(err, "failed to check if repo is initialized")
}
if !isInit {
cfg, err := ipfsutil.CreateBaseConfig()
if err != nil {
return nil, errors.Wrap(err, "failed to create base config")
}
ucfg, err := upgradeToPersistentConfig(cfg)
if err != nil {
return nil, errors.Wrap(err, "failed to upgrade repo")
}
ucfg.Datastore.Spec = nil
if err := encrepo.Init(path, key, sqldsOpts, ucfg); err != nil {
return nil, errors.Wrap(err, "failed to init repo")
}
}
return encrepo.Open(path, key, sqldsOpts)
}
func ResetExistingEncryptedRepoIdentity(repo ipfs_repo.Repo, path string, key []byte, salt []byte) (ipfs_repo.Repo, error) {
repo, err := ipfsutil.ResetExistingRepoIdentity(repo)
if err != nil {
return nil, fmt.Errorf("unable to open reset existing repo identity: %w", err)
}
_ = repo.Close()
sqldsOpts := encrepo.SQLCipherDatastoreOptions{JournalMode: "WAL", PlaintextHeader: len(salt) != 0, Salt: salt}
repo, err = encrepo.Open(path, key, sqldsOpts)
if err != nil {
return nil, errcode.ErrInternal.Wrap(err)
}
return repo, nil
}
func upgradeToPersistentConfig(cfg *ipfs_cfg.Config) (*ipfs_cfg.Config, error) {
cfgCopy, err := cfg.Clone()
if err != nil {
return nil, err
}
// setup the node mount points.
cfgCopy.Mounts = ipfs_cfg.Mounts{
IPFS: "/ipfs",
IPNS: "/ipns",
}
cfgCopy.Ipns = ipfs_cfg.Ipns{
ResolveCacheSize: 128,
}
cfgCopy.Reprovider = ipfs_cfg.Reprovider{
Interval: ipfs_cfg.NewOptionalDuration(time.Hour * 12),
Strategy: ipfs_cfg.NewOptionalString("all"),
}
cfgCopy.Datastore = ipfs_cfg.Datastore{
StorageMax: "10GB",
StorageGCWatermark: 90, // 90%
GCPeriod: "1h",
BloomFilterSize: 0,
Spec: map[string]interface{}{
"type": "mount",
"mounts": []interface{}{
map[string]interface{}{
"mountpoint": "/blocks",
"type": "measure",
"prefix": "flatfs.datastore",
"child": map[string]interface{}{
"type": "flatfs",
"path": "blocks",
"sync": true,
"shardFunc": "/repo/flatfs/shard/v1/next-to-last/2",
},
},
map[string]interface{}{
"mountpoint": "/",
"type": "measure",
"prefix": "leveldb.datastore",
"child": map[string]interface{}{
"type": "levelds",
"path": "datastore",
"compression": "none",
},
},
},
},
}
return cfgCopy, nil
}