mirror of
https://github.com/gitpod-io/gitpod.git
synced 2025-12-08 17:36:30 +00:00
67 lines
1.6 KiB
Go
67 lines
1.6 KiB
Go
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
|
|
// Licensed under the GNU Affero General Public License (AGPL).
|
|
// See License.AGPL.txt in the project root for license information.
|
|
|
|
package db
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"gorm.io/datatypes"
|
|
)
|
|
|
|
type EncryptedJSON[T any] datatypes.JSON
|
|
|
|
func (j *EncryptedJSON[T]) EncryptedData() (EncryptedData, error) {
|
|
var data EncryptedData
|
|
err := json.Unmarshal(*j, &data)
|
|
if err != nil {
|
|
return EncryptedData{}, fmt.Errorf("failed to unmarshal encrypted json: %w", err)
|
|
}
|
|
|
|
return data, nil
|
|
}
|
|
|
|
func (j *EncryptedJSON[T]) Decrypt(decryptor Decryptor) (T, error) {
|
|
var out T
|
|
data, err := j.EncryptedData()
|
|
if err != nil {
|
|
return out, fmt.Errorf("failed to obtain encrypted data: %w", err)
|
|
}
|
|
|
|
b, err := decryptor.Decrypt(data)
|
|
if err != nil {
|
|
return out, fmt.Errorf("failed to decrypt encrypted json: %w", err)
|
|
}
|
|
|
|
err = json.Unmarshal(b, &out)
|
|
if err != nil {
|
|
return out, fmt.Errorf("failed to unmarshal encrypted json: %w", err)
|
|
}
|
|
|
|
return out, nil
|
|
}
|
|
|
|
func EncryptJSON[T any](encryptor Encryptor, data T) (EncryptedJSON[T], error) {
|
|
b, err := json.Marshal(data)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to marshal data into json: %w", err)
|
|
}
|
|
|
|
encrypted, err := encryptor.Encrypt(b)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to encrypt json: %w", err)
|
|
}
|
|
|
|
return NewEncryptedJSON[T](encrypted)
|
|
}
|
|
|
|
func NewEncryptedJSON[T any](data EncryptedData) (EncryptedJSON[T], error) {
|
|
b, err := json.Marshal(data)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to serialize encrypted data into json: %w", err)
|
|
}
|
|
|
|
return b, nil
|
|
}
|