Skip to content

Commit

Permalink
Refactoring some functions, added tests
Browse files Browse the repository at this point in the history
  • Loading branch information
pahatz committed Dec 19, 2023
1 parent 82089d1 commit ddaf140
Show file tree
Hide file tree
Showing 7 changed files with 44 additions and 41 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -217,7 +217,7 @@ You can login to download the configuration file needed for some of the the tool
```bash
./sda-cli login <login_target>
```
where `login_target` is the URL can be the login endpoint for Big Picture (https://login.bp.nbis.se/), Federated EGA (https://login.fega.nbis.se/) or Genomic Data Infrastructure (https://login.gdi.nbis.se/)
where `login_target` is the URL to the `sda-auth` service from the [sensitive-data-archive](https://github.com/neicnordic/sensitive-data-archive/) project.

This will open a link for the user where they can go and log in.
After the login is complete, a configuration file will be created in the tool's directory with the name of `.sda-cli-session`
Expand Down
39 changes: 17 additions & 22 deletions encrypt/encrypt.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,11 +28,6 @@ import (
var Usage = `
USAGE: %s encrypt -key <public-key-file> (-target <target>) (-outdir <dir>) (-continue=true) [file(s)]
The target can be one of the following:
bp.nbis.se
fega.nbis.se
gdc.nbis.se
encrypt:
Encrypts files according to the crypt4gh standard used in the
Sensitive Data Archive (SDA). Each given file will be encrypted
Expand Down Expand Up @@ -82,36 +77,36 @@ func Encrypt(args []string) error {
return err
}

var sesKey string
if len(publicKeyFileList) == 0 {
// check for public key in .sda-cli-session file from login
sesKey, err = helpers.GetPublicKeyFromSession()
if err != nil {
log.Println("could not read key from previous login,", err)
}
if publicKeyFileList != nil && *target != "" {
return errors.New("only one of -key or -target can be used")
}
// key from session file found
if len(publicKeyFileList) == 0 && sesKey != "" {
publicKeyFileList = append(publicKeyFileList, sesKey)
}
if len(publicKeyFileList) == 0 && sesKey == "" && *target != "" {

if *target != "" {
// fetch info endpoint values
log.Println("fetching public key")
info, err := login.GetAuthInfo(*target)
if err != nil {
return err
}
// create pub file
pubFile, err := helpers.CreatePubFile(info.PublicKey, "crypt4gh_key.pub")
pubKeyFile, err := helpers.CreatePubFile(info.PublicKey, "crypt4gh_key.pub")
if err != nil {
return err
}
log.Println("fetching public key")
// no key provided, no key in session file, target provided
publicKeyFileList = append(publicKeyFileList, pubFile)
publicKeyFileList = append(publicKeyFileList, pubKeyFile)
}
// no key provided, no key in session file, no target provided
if len(publicKeyFileList) == 0 && sesKey == "" && *target == "" {
return errors.New("no public key could be obtained")
if publicKeyFileList == nil && *target == "" {
// check for public key in .sda-cli-session file from login
pubKey, err := helpers.GetPublicKeyFromSession()
if err != nil {
return err
}
// key from session file found
if len(publicKeyFileList) == 0 && pubKey != "" {
publicKeyFileList = append(publicKeyFileList, pubKey)
}
}

// Each filename is first read into a helper struct (sliced for combatibility with checkFiles)
Expand Down
2 changes: 1 addition & 1 deletion encrypt/encrypt_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ func (suite *EncryptTests) TestEncryptFunction() {
// pub key not given
os.Args = []string{"encrypt", suite.fileOk.Name()}
err := Encrypt(os.Args)
assert.EqualError(suite.T(), err, "no public key could be obtained")
assert.EqualError(suite.T(), err, "configuration file (.sda-cli-session) not found")

// no such pub key file
msg := "open somekey: no such file or directory"
Expand Down
14 changes: 5 additions & 9 deletions helpers/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -299,11 +299,9 @@ func GetPublicKeyFromSession() (string, error) {
return "", errors.New("configuration file (.sda-cli-session) not found")
}

if FileExists(".sda-cli-session") {
file, err := os.Open(".sda-cli-session")
if err != nil {
fmt.Println("could not read file:", file)
}
_, err := os.Open(".sda-cli-session")
if err != nil {
return "", err
}

// Load the configuration file
Expand All @@ -319,7 +317,7 @@ func GetPublicKeyFromSession() (string, error) {

pubFile, err := CreatePubFile(config.PublicKey, "key-from-oidc.pub.pem")
if err != nil {
return "", fmt.Errorf("failed to create public key file: %w", err)
return "", err
}

return pubFile, nil
Expand All @@ -328,13 +326,12 @@ func GetPublicKeyFromSession() (string, error) {

// Create public key file
func CreatePubFile(publicKey string, filename string) (string, error) {

// Create a fixed-size array to hold the public key data
var publicKeyData [32]byte
b := []byte(publicKey)
copy(publicKeyData[:], b)

// Open or create a file named "key-from-oidc.pub.pem" in write-only mode with file permissions 0600
// Open or create a file in write-only mode with file permissions 0600
pubFile, err := os.OpenFile(filepath.Clean(filename), os.O_WRONLY|os.O_CREATE, 0600)
if err != nil {
return "", fmt.Errorf("failed to open or create the public key file: %w", err)
Expand All @@ -345,7 +342,6 @@ func CreatePubFile(publicKey string, filename string) (string, error) {
log.Errorf("Error closing file: %s\n", cerr)
}
}()

// Write the publicKeyData array to the "key-from-oidc.pub.pem" file in Crypt4GHX25519 public key format
err = keys.WriteCrypt4GHX25519PublicKey(pubFile, publicKeyData)
if err != nil {
Expand Down
17 changes: 16 additions & 1 deletion helpers/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -365,7 +365,7 @@ encrypt = False
assert.EqualError(suite.T(), err, "public key not found in the configuration")
}

func (suite *HelperTests) TestGetPublicKey() {
func (suite *HelperTests) TestGetPublicKeyFromSession() {

var confFile = `
access_token = someToken
Expand Down Expand Up @@ -415,3 +415,18 @@ func (suite *HelperTests) TestInvalidCharacters() {
assert.Equal(suite.T(), fmt.Sprintf("filepath %v contains disallowed characters: %+v", testfilepath, badchar), err.Error())
}
}

func (suite *HelperTests) TestCreatePubFile() {
var pubKeyContent = `339eb2a458fec5e23aa8b57cfcb35f10e7389025816e44d4234f814ed2aeed3f`
var expectedPubKey = `-----BEGIN CRYPT4GH PUBLIC KEY-----
MzM5ZWIyYTQ1OGZlYzVlMjNhYThiNTdjZmNiMzVmMTA=
-----END CRYPT4GH PUBLIC KEY-----
`
_, err := CreatePubFile(pubKeyContent, os.TempDir()+"/test_public_file.pub.pem")
assert.NoError(suite.T(), err)

pubFile, _ := os.ReadFile(os.TempDir() + "/test_public_file.pub.pem")
s := string(pubFile)
assert.Equal(suite.T(), expectedPubKey, s)
defer os.Remove(os.TempDir() + "/test_public_file.pub.pem")
}
7 changes: 2 additions & 5 deletions login/login.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,7 @@ login:
// the module help
var ArgHelp = `
[login-target]
The login target can be one of the following:
https://login.bp.nbis.se/
https://login.test.fega.nbis.se/
https://login.gdi.nbis.se/`
The login target is the base URL of the service.`

// Args is a flagset that needs to be exported so that it can be written to the
// main program help
Expand Down Expand Up @@ -168,7 +165,7 @@ func NewLogin(args []string) error {
}
err = deviceLogin.Login()
if err != nil {
return fmt.Errorf("Login failed")
return err
}
fmt.Printf("Logged in as %v\n", deviceLogin.UserInfo.Name)

Expand Down
4 changes: 2 additions & 2 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,9 @@ func ParseArgs() (string, []string) {

if Help(subcommand) == nil {
os.Exit(0)
} else {
os.Exit(1)
}
os.Exit(1)

}

// The "list" command can have no arguments since it can use the
Expand Down

0 comments on commit ddaf140

Please sign in to comment.