From c4c29e370a82a048be9e471039f9caf00eba3334 Mon Sep 17 00:00:00 2001 From: jessicagreben Date: Tue, 3 Nov 2020 12:38:23 -0800 Subject: [PATCH] wasm: add webassembly code for creating access grant in console web UI Change-Id: I3c6d9afc660f3d959d6138db84341e9460b877a1 --- go.mod | 4 +- go.sum | 9 ++--- satellite/console/wasm/README.md | 35 +++++++++++++++++ satellite/console/wasm/access.go | 64 ++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 7 deletions(-) create mode 100644 satellite/console/wasm/README.md create mode 100644 satellite/console/wasm/access.go diff --git a/go.mod b/go.mod index a1714b64f..9b461315e 100644 --- a/go.mod +++ b/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 ) diff --git a/go.sum b/go.sum index 32704efbc..987e9f5bc 100644 --- a/go.sum +++ b/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= diff --git a/satellite/console/wasm/README.md b/satellite/console/wasm/README.md new file mode 100644 index 000000000..03e6e7bb0 --- /dev/null +++ b/satellite/console/wasm/README.md @@ -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: +``` + + +``` + +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) diff --git a/satellite/console/wasm/access.go b/satellite/console/wasm/access.go new file mode 100644 index 000000000..0f34a962e --- /dev/null +++ b/satellite/console/wasm/access.go @@ -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 +}