Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migration 8-9 - Encoding key filenames with base32 #96

Merged
merged 12 commits into from
Mar 17, 2020
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,9 @@ ipfs repo version | go-ipfs versions
4 | 0.4.3 - 0.4.5
5 | 0.4.6 - 0.4.10
6 | 0.4.11 - 0.4.15
7 | 0.4.16 - current
7 | 0.4.16 - 0.4.23
8 | 0.5.0 - current
9 | 0.5.0 - current

### How to Run Migrations

Expand Down
11 changes: 11 additions & 0 deletions ipfs-8-to-9/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package main

import (
migrate "github.com/ipfs/fs-repo-migrations/go-migrate"
mg8 "github.com/ipfs/fs-repo-migrations/ipfs-8-to-9/migration"
)

func main() {
m := mg8.Migration{}
migrate.Main(&m)
}
152 changes: 152 additions & 0 deletions ipfs-8-to-9/migration/migration.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
package mg8

import (
base32 "encoding/base32"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"

migrate "github.com/ipfs/fs-repo-migrations/go-migrate"
mfsr "github.com/ipfs/fs-repo-migrations/mfsr"
log "github.com/ipfs/fs-repo-migrations/stump"
)

type Migration struct{}

func (m Migration) Versions() string {
return "8-to-9"
}

func (m Migration) Reversible() bool {
return true
}

const keyFilenamePrefix = "key_"

func isEncoded(name string) bool {
Stebalien marked this conversation as resolved.
Show resolved Hide resolved
if !strings.HasPrefix(name, keyFilenamePrefix) {
return false
}
hsanjuan marked this conversation as resolved.
Show resolved Hide resolved

_, err := decode(name)

return err == nil
}

func encode(name string) (string, error) {
if name == "" {
return "", fmt.Errorf("key name must be at least one character")
}

encodedName := base32.StdEncoding.EncodeToString([]byte(name))
return keyFilenamePrefix + strings.ToLower(encodedName), nil
}

func decode(name string) (string, error) {
if !strings.HasPrefix(name, keyFilenamePrefix) {
return "", fmt.Errorf("key's filename has unexpected format")
}

nameWithoutPrefix := strings.ToUpper(name[len(keyFilenamePrefix):])
data, err := base32.StdEncoding.DecodeString(nameWithoutPrefix)

if err != nil {
return "", err
}

decodedName := string(data[:])
hsanjuan marked this conversation as resolved.
Show resolved Hide resolved

return decodedName, nil
}

func (m Migration) Apply(opts migrate.Options) error {
log.Verbose = opts.Verbose
log.Log("applying %s repo migration", m.Versions())

keystoreRoot := filepath.Join(opts.Path, "keystore")
hsanjuan marked this conversation as resolved.
Show resolved Hide resolved
fileInfos, err := ioutil.ReadDir(keystoreRoot)

if err != nil {
return err
}

for _, info := range fileInfos {
if info.IsDir() {
log.Log("skipping ", info.Name(), " as it is directory!")
continue
}

if isEncoded(info.Name()) {
log.Log("skipping ", info.Name(), " as it is already encoded!")
continue
}

log.VLog("migrating key's filename: ", info.Name())
encodedName, err := encode(info.Name())
hsanjuan marked this conversation as resolved.
Show resolved Hide resolved
if err != nil {
return err
}

os.Rename(
filepath.Join(keystoreRoot, info.Name()),
filepath.Join(keystoreRoot, encodedName),
)
hsanjuan marked this conversation as resolved.
Show resolved Hide resolved
}

err = mfsr.RepoPath(opts.Path).WriteVersion("9")
if err != nil {
log.Error("failed to update version file to 9")
return err
}

log.Log("updated version file")

return nil
}

func (m Migration) Revert(opts migrate.Options) error {
log.Verbose = opts.Verbose
log.Log("reverting migration")

keystoreRoot := filepath.Join(opts.Path, "keystore")
fileInfos, err := ioutil.ReadDir(keystoreRoot)

if err != nil {
return err
}
hsanjuan marked this conversation as resolved.
Show resolved Hide resolved

for _, info := range fileInfos {
if info.IsDir() {
log.Log("skipping", info.Name(), "as it is directory!")
continue
}

if !isEncoded(info.Name()) {
log.Log("skipping", info.Name(), "as it is not encoded!")
continue
}

log.VLog("reverting key's filename:", info.Name())
decodedName, err := decode(info.Name())
if err != nil {
return err
}

os.Rename(
filepath.Join(keystoreRoot, info.Name()),
filepath.Join(keystoreRoot, decodedName),
)
}
hsanjuan marked this conversation as resolved.
Show resolved Hide resolved

err = mfsr.RepoPath(opts.Path).WriteVersion("8")
if err != nil {
log.Error("failed to update version file to 8")
return err
}

log.Log("updated version file")

return nil
}
22 changes: 22 additions & 0 deletions ipfs-8-to-9/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
{
"author": "AuHau",
"bugs": {},
"gx": {
"dvcsimport": "github.com/ipfs/fs-repo-migrations/ipfs-7-to-8"
},
"gxDependencies": [
{
"author": "whyrusleeping",
"hash": "QmfVj3x4D6Jkq9SEoi5n2NmoUomLwoeiwnYz2KQa15wRw6",
"name": "base32",
"version": "0.0.2"
}
],
"gxVersion": "0.14.0",
"language": "go",
"license": "",
"name": "ipfs-7-to-8",
"releaseCmd": "git commit -a -m \"gx publish $VERSION\"",
"version": "0.0.0"
}

6 changes: 5 additions & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@ import (
mg4 "github.com/ipfs/fs-repo-migrations/ipfs-4-to-5/migration"
mg5 "github.com/ipfs/fs-repo-migrations/ipfs-5-to-6/migration"
mg6 "github.com/ipfs/fs-repo-migrations/ipfs-6-to-7/migration"
mg7 "github.com/ipfs/fs-repo-migrations/ipfs-7-to-8/migration"
mg8 "github.com/ipfs/fs-repo-migrations/ipfs-8-to-9/migration"
mfsr "github.com/ipfs/fs-repo-migrations/mfsr"
)

var CurrentVersion = 7
var CurrentVersion = 9

var migrations = []gomigrate.Migration{
&mg0.Migration{},
Expand All @@ -29,6 +31,8 @@ var migrations = []gomigrate.Migration{
&mg4.Migration{},
&mg5.Migration{},
&mg6.Migration{},
&mg7.Migration{},
&mg8.Migration{},
}

func GetIpfsDir() (string, error) {
Expand Down