refactor: Decompose and pull up recipient parsing to cmds

This commit is contained in:
Felicitas Pojtinger
2021-12-04 02:02:22 +01:00
parent 211ec57062
commit 641eba4a4e
4 changed files with 71 additions and 33 deletions

View File

@@ -59,6 +59,8 @@ var (
errKeyNotAccessible = errors.New("key not found or accessible")
errMissingTarHeader = errors.New("tar header is missing")
errRecipientUnparsable = errors.New("recipient could not be parsed")
)
var archiveCmd = &cobra.Command{
@@ -103,6 +105,11 @@ var archiveCmd = &cobra.Command{
return err
}
recipient, err := parseRecipient(viper.GetString(encryptionFlag), pubkey)
if err != nil {
return err
}
hdrs, err := archive(
viper.GetString(tapeFlag),
viper.GetInt(recordSizeFlag),
@@ -111,7 +118,7 @@ var archiveCmd = &cobra.Command{
viper.GetString(compressionFlag),
viper.GetString(compressionLevelFlag),
viper.GetString(encryptionFlag),
pubkey,
recipient,
)
if err != nil {
return err
@@ -149,7 +156,7 @@ func archive(
compressionFormat string,
compressionLevel string,
encryptionFormat string,
pubkey []byte,
recipient interface{},
) ([]*tar.Header, error) {
dirty := false
tw, isRegular, cleanup, err := openTapeWriter(tape)
@@ -241,7 +248,7 @@ func archive(
Writer: io.Discard,
}
encryptor, err := encrypt(fileSizeCounter, encryptionFormat, pubkey)
encryptor, err := encrypt(fileSizeCounter, encryptionFormat, recipient)
if err != nil {
return err
}
@@ -316,7 +323,7 @@ func archive(
hdrToAppend := *hdr
headers = append(headers, &hdrToAppend)
if err := encryptHeader(hdr, encryptionFormat, pubkey); err != nil {
if err := encryptHeader(hdr, encryptionFormat, recipient); err != nil {
return err
}
@@ -329,7 +336,7 @@ func archive(
}
// Compress and write the file
encryptor, err := encrypt(tw, encryptionFormat, pubkey)
encryptor, err := encrypt(tw, encryptionFormat, recipient)
if err != nil {
return err
}
@@ -422,7 +429,7 @@ func checkCompressionLevel(compressionLevel string) error {
func encryptHeader(
hdr *tar.Header,
encryptionFormat string,
pubkey []byte,
recipient interface{},
) error {
if encryptionFormat == encryptionFormatNoneKey {
return nil
@@ -439,7 +446,7 @@ func encryptHeader(
return err
}
newHdr.PAXRecords[pax.STFSEmbeddedHeader], err = encryptString(string(wrappedHeader), encryptionFormat, pubkey)
newHdr.PAXRecords[pax.STFSEmbeddedHeader], err = encryptString(string(wrappedHeader), encryptionFormat, recipient)
if err != nil {
return err
}
@@ -483,23 +490,39 @@ func addSuffix(name string, compressionFormat string, encryptionFormat string) (
return name, nil
}
func parseRecipient(
encryptionFormat string,
pubkey []byte,
) (interface{}, error) {
switch encryptionFormat {
case encryptionFormatAgeKey:
return age.ParseX25519Recipient(string(pubkey))
case encryptionFormatPGPKey:
return openpgp.ReadKeyRing(bytes.NewBuffer(pubkey))
case encryptionFormatNoneKey:
return pubkey, nil
default:
return nil, errUnsupportedEncryptionFormat
}
}
func encrypt(
dst io.Writer,
encryptionFormat string,
pubkey []byte,
recipient interface{},
) (io.WriteCloser, error) {
switch encryptionFormat {
case encryptionFormatAgeKey:
recipient, err := age.ParseX25519Recipient(string(pubkey))
if err != nil {
return nil, err
recipient, ok := recipient.(*age.X25519Recipient)
if !ok {
return nil, errRecipientUnparsable
}
return age.Encrypt(dst, recipient)
case encryptionFormatPGPKey:
recipient, err := openpgp.ReadKeyRing(bytes.NewBuffer(pubkey))
if err != nil {
return nil, err
recipient, ok := recipient.(openpgp.EntityList)
if !ok {
return nil, errRecipientUnparsable
}
return openpgp.Encrypt(dst, recipient, nil, nil, nil)
@@ -513,13 +536,13 @@ func encrypt(
func encryptString(
src string,
encryptionFormat string,
pubkey []byte,
recipient interface{},
) (string, error) {
switch encryptionFormat {
case encryptionFormatAgeKey:
recipient, err := age.ParseX25519Recipient(string(pubkey))
if err != nil {
return "", err
recipient, ok := recipient.(*age.X25519Recipient)
if !ok {
return "", errRecipientUnparsable
}
out := &bytes.Buffer{}
@@ -538,9 +561,9 @@ func encryptString(
return base64.StdEncoding.EncodeToString(out.Bytes()), nil
case encryptionFormatPGPKey:
recipient, err := openpgp.ReadKeyRing(bytes.NewBuffer(pubkey))
if err != nil {
return "", err
recipient, ok := recipient.(openpgp.EntityList)
if !ok {
return "", errRecipientUnparsable
}
out := &bytes.Buffer{}

View File

@@ -47,12 +47,17 @@ var deleteCmd = &cobra.Command{
return err
}
recipient, err := parseRecipient(viper.GetString(encryptionFlag), pubkey)
if err != nil {
return err
}
return delete(
viper.GetString(tapeFlag),
viper.GetString(metadataFlag),
viper.GetString(nameFlag),
viper.GetString(encryptionFlag),
pubkey,
recipient,
)
},
}
@@ -62,7 +67,7 @@ func delete(
metadata string,
name string,
encryptionFormat string,
pubkey []byte,
recipient interface{},
) error {
dirty := false
tw, _, cleanup, err := openTapeWriter(tape)
@@ -113,7 +118,7 @@ func delete(
hdr.PAXRecords[pax.STFSRecordVersion] = pax.STFSRecordVersion1
hdr.PAXRecords[pax.STFSRecordAction] = pax.STFSRecordActionDelete
if err := encryptHeader(hdr, encryptionFormat, pubkey); err != nil {
if err := encryptHeader(hdr, encryptionFormat, recipient); err != nil {
return err
}

View File

@@ -40,13 +40,18 @@ var moveCmd = &cobra.Command{
return err
}
recipient, err := parseRecipient(viper.GetString(encryptionFlag), pubkey)
if err != nil {
return err
}
return move(
viper.GetString(tapeFlag),
viper.GetString(metadataFlag),
viper.GetString(srcFlag),
viper.GetString(dstFlag),
viper.GetString(encryptionFlag),
pubkey,
recipient,
)
},
}
@@ -57,7 +62,7 @@ func move(
src string,
dst string,
encryptionFormat string,
pubkey []byte,
recipient interface{},
) error {
dirty := false
tw, _, cleanup, err := openTapeWriter(tape)
@@ -110,7 +115,7 @@ func move(
hdr.PAXRecords[pax.STFSRecordAction] = pax.STFSRecordActionUpdate
hdr.PAXRecords[pax.STFSRecordReplacesName] = dbhdr.Name
if err := encryptHeader(hdr, encryptionFormat, pubkey); err != nil {
if err := encryptHeader(hdr, encryptionFormat, recipient); err != nil {
return err
}

View File

@@ -60,6 +60,11 @@ var updateCmd = &cobra.Command{
return err
}
recipient, err := parseRecipient(viper.GetString(encryptionFlag), pubkey)
if err != nil {
return err
}
hdrs, err := update(
viper.GetString(tapeFlag),
viper.GetInt(recordSizeFlag),
@@ -68,7 +73,7 @@ var updateCmd = &cobra.Command{
viper.GetString(compressionFlag),
viper.GetString(compressionLevelFlag),
viper.GetString(encryptionFlag),
pubkey,
recipient,
)
if err != nil {
return err
@@ -106,7 +111,7 @@ func update(
compressionFormat string,
compressionLevel string,
encryptionFormat string,
pubkey []byte,
recipient interface{},
) ([]*tar.Header, error) {
dirty := false
tw, isRegular, cleanup, err := openTapeWriter(tape)
@@ -152,7 +157,7 @@ func update(
Writer: io.Discard,
}
encryptor, err := encrypt(fileSizeCounter, encryptionFormat, pubkey)
encryptor, err := encrypt(fileSizeCounter, encryptionFormat, recipient)
if err != nil {
return err
}
@@ -230,7 +235,7 @@ func update(
hdrToAppend := *hdr
headers = append(headers, &hdrToAppend)
if err := encryptHeader(hdr, encryptionFormat, pubkey); err != nil {
if err := encryptHeader(hdr, encryptionFormat, recipient); err != nil {
return err
}
@@ -243,7 +248,7 @@ func update(
}
// Compress and write the file
encryptor, err := encrypt(tw, encryptionFormat, pubkey)
encryptor, err := encrypt(tw, encryptionFormat, recipient)
if err != nil {
return err
}
@@ -300,7 +305,7 @@ func update(
hdrToAppend := *hdr
headers = append(headers, &hdrToAppend)
if err := encryptHeader(hdr, encryptionFormat, pubkey); err != nil {
if err := encryptHeader(hdr, encryptionFormat, recipient); err != nil {
return err
}