-
Notifications
You must be signed in to change notification settings - Fork 16
/
tx_add_viewers.go
135 lines (110 loc) · 3.39 KB
/
tx_add_viewers.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
124
125
126
127
128
129
130
131
132
133
134
135
package cli
import (
"context"
"encoding/hex"
"encoding/json"
"fmt"
"strconv"
"strings"
"github.com/cosmos/cosmos-sdk/client"
"github.com/cosmos/cosmos-sdk/client/flags"
"github.com/cosmos/cosmos-sdk/client/tx"
sdk "github.com/cosmos/cosmos-sdk/types"
eciesgo "github.com/ecies/go/v2"
"github.com/jackalLabs/canine-chain/x/filetree/keeper"
"github.com/jackalLabs/canine-chain/x/filetree/types"
"github.com/spf13/cobra"
)
var _ = strconv.Itoa(0)
func CmdAddViewers() *cobra.Command {
cmd := &cobra.Command{
Use: "add-viewers [viewer-ids] [file path] [file owner]",
Short: "add an address to the files viewing permissions",
Args: cobra.ExactArgs(3),
RunE: func(cmd *cobra.Command, args []string) (err error) {
argViewerIds := args[0]
argHashpath := args[1]
argOwner := args[2]
clientCtx, err := client.GetClientTxContext(cmd)
if err != nil {
return err
}
fileQueryClient := types.NewQueryClient(clientCtx)
trimPath := strings.TrimSuffix(argHashpath, "/")
merklePath := types.MerklePath(trimPath)
ownerChainAddress := MakeOwnerAddress(merklePath, argOwner)
viewerAddresses := strings.Split(argViewerIds, ",")
var viewerIds []string
var viewerKeys []string
for _, v := range viewerAddresses {
if len(v) < 1 {
continue
}
key, err := sdk.AccAddressFromBech32(v) // I think this isn't needed
if err != nil {
return err
}
queryClient := types.NewQueryClient(clientCtx)
res, err := queryClient.Pubkey(cmd.Context(), &types.QueryPubkeyRequest{Address: key.String()})
if err != nil {
return types.ErrPubKeyNotFound
}
pkey, err := eciesgo.NewPublicKeyFromHex(res.Pubkey.Key)
if err != nil {
return err
}
// Perhaps below file query should be replaced with fully fledged 'query file' function that checks permissions first
params := &types.QueryFileRequest{
Address: merklePath,
OwnerAddress: ownerChainAddress,
}
file, err := fileQueryClient.Files(context.Background(), params)
if err != nil {
return types.ErrFileNotFound
}
viewers := file.Files.ViewingAccess
var m map[string]string
err = json.Unmarshal([]byte(viewers), &m)
if err != nil {
return types.ErrCantUnmarshall
}
ownerViewingAddress := keeper.MakeViewerAddress(file.Files.TrackingNumber, argOwner)
hexMessage, err := hex.DecodeString(m[ownerViewingAddress])
if err != nil {
return err
}
// May need to use "clientCtx.from?"
ownerPrivateKey, err := MakePrivateKey(clientCtx)
if err != nil {
return err
}
decrypt, err := eciesgo.Decrypt(ownerPrivateKey, hexMessage)
if err != nil {
fmt.Printf("%v\n", hexMessage)
return err
}
// encrypt using viewer's public key
encrypted, err := eciesgo.Encrypt(pkey, decrypt)
if err != nil {
return err
}
newViewerID := keeper.MakeViewerAddress(file.Files.TrackingNumber, v)
viewerIds = append(viewerIds, newViewerID)
viewerKeys = append(viewerKeys, fmt.Sprintf("%x", encrypted))
}
msg := types.NewMsgAddViewers(
clientCtx.GetFromAddress().String(),
strings.Join(viewerIds, ","),
strings.Join(viewerKeys, ","),
merklePath,
ownerChainAddress,
)
if err := msg.ValidateBasic(); err != nil {
return err
}
return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg)
},
}
flags.AddTxFlagsToCmd(cmd)
return cmd
}