wasm: add webassembly code for creating access grant in console web UI
Change-Id: I3c6d9afc660f3d959d6138db84341e9460b877a1
This commit is contained in:
parent
2dffaebc6f
commit
c4c29e370a
4
go.mod
4
go.mod
@ -42,9 +42,9 @@ require (
|
||||
golang.org/x/sys v0.0.0-20200929083018-4d22bbb62b3c
|
||||
golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e
|
||||
google.golang.org/api v0.20.0 // indirect
|
||||
storj.io/common v0.0.0-20201030120157-90ae6720d87e
|
||||
storj.io/common v0.0.0-20201030140758-31112c1cc750
|
||||
storj.io/drpc v0.0.14
|
||||
storj.io/monkit-jaeger v0.0.0-20200518165323-80778fc3f91b
|
||||
storj.io/private v0.0.0-20201026143115-bc926bfa3bca
|
||||
storj.io/uplink v1.3.2-0.20201028181609-f6efc8fcf771
|
||||
storj.io/uplink v1.3.2-0.20201104145754-2f6dfd29a96c
|
||||
)
|
||||
|
9
go.sum
9
go.sum
@ -761,9 +761,8 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt
|
||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||
storj.io/common v0.0.0-20200424175742-65ac59022f4f/go.mod h1:pZyXiIE7bGETIRXtfs0nICqMwp7PM8HqnDuyUeldNA0=
|
||||
storj.io/common v0.0.0-20201026135900-1aaeec90670b/go.mod h1:GqdmNf3fLm2UZX/7Zr0BLFCJ4gFjgm6eHrk/fnmr5jQ=
|
||||
storj.io/common v0.0.0-20201027143432-3718579e12bf/go.mod h1:9iobNl9eI6C2M23FS/b37yFYOdHpoeJ8BFFcxsmv538=
|
||||
storj.io/common v0.0.0-20201030120157-90ae6720d87e h1:6baDicBbR0/2XgcQ068KN+B4dF6akkdh2vemmXka1ns=
|
||||
storj.io/common v0.0.0-20201030120157-90ae6720d87e/go.mod h1:9iobNl9eI6C2M23FS/b37yFYOdHpoeJ8BFFcxsmv538=
|
||||
storj.io/common v0.0.0-20201030140758-31112c1cc750 h1:hgIjnLbkcMjYntYVPDPgFd4vkmNc3GEYL+IiB2jOfzs=
|
||||
storj.io/common v0.0.0-20201030140758-31112c1cc750/go.mod h1:9iobNl9eI6C2M23FS/b37yFYOdHpoeJ8BFFcxsmv538=
|
||||
storj.io/drpc v0.0.11/go.mod h1:TiFc2obNjL9/3isMW1Rpxjy8V9uE0B2HMeMFGiiI7Iw=
|
||||
storj.io/drpc v0.0.11/go.mod h1:TiFc2obNjL9/3isMW1Rpxjy8V9uE0B2HMeMFGiiI7Iw=
|
||||
storj.io/drpc v0.0.14 h1:GCBdymTt1BRw4oHmmUZZlxYXLVRxxYj6x3Ivide2J+I=
|
||||
@ -772,5 +771,5 @@ storj.io/monkit-jaeger v0.0.0-20200518165323-80778fc3f91b h1:Bbg9JCtY6l3HrDxs3BX
|
||||
storj.io/monkit-jaeger v0.0.0-20200518165323-80778fc3f91b/go.mod h1:gj4vuCeyCRjRmH8LIrgoyU9Dc9uR6H+/GcDUXmTbf80=
|
||||
storj.io/private v0.0.0-20201026143115-bc926bfa3bca h1:ekR7vtUYC5+cDyim0ZJaSZeXidyzQqDYsnFPYXgTozc=
|
||||
storj.io/private v0.0.0-20201026143115-bc926bfa3bca/go.mod h1:EaLnIyNyqWQUJB+7+KWVez0In9czl0nHHlm2WobebuA=
|
||||
storj.io/uplink v1.3.2-0.20201028181609-f6efc8fcf771 h1:jPbw74xt8bvv8nOfBaM4g9Ts4moX8mqfD4N/B8vEJrA=
|
||||
storj.io/uplink v1.3.2-0.20201028181609-f6efc8fcf771/go.mod h1:5do8jvbs4ao4tLdIZKzNFJPVKOH1oDfvVf8OIsR5Z9E=
|
||||
storj.io/uplink v1.3.2-0.20201104145754-2f6dfd29a96c h1:m0y0PtruZFgzU7+yQd4zCR5T4adQGjVcluPNbFiYF9Y=
|
||||
storj.io/uplink v1.3.2-0.20201104145754-2f6dfd29a96c/go.mod h1:1J04kNl9rZ2x+mLg2nCZaTHHi0CYQjjqOpDKQYGGOLg=
|
||||
|
35
satellite/console/wasm/README.md
Normal file
35
satellite/console/wasm/README.md
Normal file
@ -0,0 +1,35 @@
|
||||
# Using WebAssembly in Storj
|
||||
|
||||
In order to use the uplink library from the browser, we can compile the uplink library to WebAssembly (wasm).
|
||||
|
||||
### Setup
|
||||
|
||||
To generate wasm code that can create access grants in the web browser, run the following from the storj/wasm directory:
|
||||
```
|
||||
$ GOOS=js GOARCH=wasm go build -o access.wasm access.go
|
||||
```
|
||||
|
||||
The `access.wasm` code can then be loaded into the browser in a script tag in an html page. Also needed is a JavaScript support file which ships with golang.
|
||||
|
||||
To copy the JavaScript support file, run:
|
||||
```
|
||||
$ cp "$(go env GOROOT)/misc/wasm/wasm_exec.js" .
|
||||
```
|
||||
Ref: [Golang WebAssembly docs](https://github.com/golang/go/wiki/WebAssembly)
|
||||
|
||||
The HTML file should include the following:
|
||||
```
|
||||
<script type="text/javascript" src="/path/to/wasm_exec.js"></script>
|
||||
<script>
|
||||
const go = new Go();
|
||||
WebAssembly.instantiateStreaming(
|
||||
fetch("/path/to/access.wasm"), go.importObject).then(
|
||||
(result) => {
|
||||
go.run(result.instance);
|
||||
});
|
||||
</script>
|
||||
```
|
||||
|
||||
Additionally, the HTTP `Content-Security-Policy (CSP) script-src` directive will need to be modified to allow wasm code to be executed.
|
||||
|
||||
See: [WebAssembly Content Security Policy docs](https://github.com/WebAssembly/content-security-policy/blob/master/proposals/CSP.md)
|
64
satellite/console/wasm/access.go
Normal file
64
satellite/console/wasm/access.go
Normal file
@ -0,0 +1,64 @@
|
||||
// +build js,wasm
|
||||
// Copyright (C) 2020 Storj Labs, Inc.
|
||||
// See LICENSE for copying information.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"syscall/js"
|
||||
|
||||
"storj.io/common/encryption"
|
||||
"storj.io/common/macaroon"
|
||||
"storj.io/common/storj"
|
||||
"storj.io/uplink/private/access2"
|
||||
)
|
||||
|
||||
func main() {
|
||||
js.Global().Set("generateAccessGrant", generateAccessGrant())
|
||||
<-make(chan bool)
|
||||
}
|
||||
|
||||
func generateAccessGrant() js.Func {
|
||||
return js.FuncOf(func(this js.Value, args []js.Value) interface{} {
|
||||
if len(args) < 4 {
|
||||
return fmt.Sprintf("Error not enough arguments. Need 4, but only %d supplied. The order of arguments are: satellite Node URL, API key, encryption passphrase, and project salt.", len(args))
|
||||
}
|
||||
satelliteNodeURL := args[0].String()
|
||||
apiKey := args[1].String()
|
||||
encryptionPassphrase := args[2].String()
|
||||
projectSalt := args[3].String()
|
||||
|
||||
return genAccessGrant(satelliteNodeURL,
|
||||
apiKey,
|
||||
encryptionPassphrase,
|
||||
projectSalt,
|
||||
)
|
||||
})
|
||||
}
|
||||
|
||||
func genAccessGrant(satelliteNodeURL, apiKey, encryptionPassphrase, projectSalt string) string {
|
||||
parsedAPIKey, err := macaroon.ParseAPIKey(apiKey)
|
||||
if err != nil {
|
||||
return err.Error()
|
||||
}
|
||||
|
||||
const concurrency = 8
|
||||
key, err := encryption.DeriveRootKey([]byte(encryptionPassphrase), []byte(projectSalt), "", concurrency)
|
||||
if err != nil {
|
||||
return err.Error()
|
||||
}
|
||||
|
||||
encAccess := access2.NewEncryptionAccessWithDefaultKey(key)
|
||||
encAccess.SetDefaultPathCipher(storj.EncAESGCM)
|
||||
a := &access2.Access{
|
||||
SatelliteAddress: satelliteNodeURL,
|
||||
APIKey: parsedAPIKey,
|
||||
EncAccess: encAccess,
|
||||
}
|
||||
accessString, err := a.Serialize()
|
||||
if err != nil {
|
||||
return err.Error()
|
||||
}
|
||||
return accessString
|
||||
}
|
Loading…
Reference in New Issue
Block a user