Encrypt git token in insertstruct

This commit is contained in:
2025-03-01 21:59:04 +01:00
parent e89b4a0e14
commit 3ce92322f4
6 changed files with 21 additions and 19 deletions

View File

@@ -11,7 +11,7 @@ import (
// CreateSession inserts a new session record into the database // CreateSession inserts a new session record into the database
func (db *database) CreateSession(session *models.Session) error { func (db *database) CreateSession(session *models.Session) error {
query, err := NewQuery(db.dbType). query, err := NewQuery(db.dbType).
InsertStruct(session, "sessions") InsertStruct(session, "sessions", db.secretsService)
if err != nil { if err != nil {
return fmt.Errorf("failed to create query: %w", err) return fmt.Errorf("failed to create query: %w", err)
} }

View File

@@ -2,6 +2,7 @@ package db
import ( import (
"fmt" "fmt"
"lemma/internal/secrets"
"reflect" "reflect"
"strings" "strings"
"unicode" "unicode"
@@ -14,7 +15,7 @@ type DBField struct {
useDefault bool useDefault bool
} }
func StructTagsToFields(s any) ([]DBField, error) { func StructTagsToFields(s any, secretsService secrets.Service) ([]DBField, error) {
v := reflect.ValueOf(s) v := reflect.ValueOf(s)
if v.Kind() == reflect.Ptr { if v.Kind() == reflect.Ptr {
@@ -49,6 +50,8 @@ func StructTagsToFields(s any) ([]DBField, error) {
} }
useDefault := false useDefault := false
value := v.Field(i).Interface()
if strings.Contains(tag, ",") { if strings.Contains(tag, ",") {
parts := strings.Split(tag, ",") parts := strings.Split(tag, ",")
tag = parts[0] tag = parts[0]
@@ -61,13 +64,19 @@ func StructTagsToFields(s any) ([]DBField, error) {
} }
case "default": case "default":
useDefault = true useDefault = true
case "encrypted":
val, err := secretsService.Encrypt(value.(string))
if err != nil {
return nil, fmt.Errorf("failed to encrypt field %s: %w", f.Name, err)
}
value = val
} }
} }
} }
fields = append(fields, DBField{ fields = append(fields, DBField{
Name: tag, Name: tag,
Value: v.Field(i).Interface(), Value: value,
Type: f.Type, Type: f.Type,
useDefault: useDefault, useDefault: useDefault,
}) })
@@ -91,8 +100,8 @@ func toSnakeCase(s string) string {
return res return res
} }
func (q *Query) InsertStruct(s any, table string) (*Query, error) { func (q *Query) InsertStruct(s any, table string, secretsService secrets.Service) (*Query, error) {
fields, err := StructTagsToFields(s) fields, err := StructTagsToFields(s, secretsService)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@@ -18,7 +18,7 @@ func (db *database) CreateUser(user *models.User) (*models.User, error) {
defer tx.Rollback() defer tx.Rollback()
query, err := NewQuery(db.dbType). query, err := NewQuery(db.dbType).
InsertStruct(user, "users") InsertStruct(user, "users", db.secretsService)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create query: %w", err) return nil, fmt.Errorf("failed to create query: %w", err)
@@ -73,7 +73,7 @@ func (db *database) createWorkspaceTx(tx *sql.Tx, workspace *models.Workspace) e
log := getLogger().WithGroup("users") log := getLogger().WithGroup("users")
insertQuery, err := NewQuery(db.dbType). insertQuery, err := NewQuery(db.dbType).
InsertStruct(workspace, "workspaces") InsertStruct(workspace, "workspaces", db.secretsService)
if err != nil { if err != nil {
return fmt.Errorf("failed to create query: %w", err) return fmt.Errorf("failed to create query: %w", err)

View File

@@ -19,15 +19,8 @@ func (db *database) CreateWorkspace(workspace *models.Workspace) error {
workspace.SetDefaultSettings() workspace.SetDefaultSettings()
} }
// Encrypt token if present
encryptedToken, err := db.encryptToken(workspace.GitToken)
if err != nil {
return fmt.Errorf("failed to encrypt token: %w", err)
}
workspace.GitToken = encryptedToken
query, err := NewQuery(db.dbType). query, err := NewQuery(db.dbType).
InsertStruct(workspace, "workspaces") InsertStruct(workspace, "workspaces", db.secretsService)
if err != nil { if err != nil {
return fmt.Errorf("failed to create query: %w", err) return fmt.Errorf("failed to create query: %w", err)

View File

@@ -5,7 +5,7 @@ import "time"
// Session represents a user session in the database // Session represents a user session in the database
type Session struct { type Session struct {
ID string `db:"id,default"` // Unique session identifier ID string `db:"id"` // Unique session identifier
UserID int `db:"user_id"` // ID of the user this session belongs to UserID int `db:"user_id"` // ID of the user this session belongs to
RefreshToken string `db:"refresh_token"` // The refresh token associated with this session RefreshToken string `db:"refresh_token"` // The refresh token associated with this session
ExpiresAt time.Time `db:"expires_at"` // When this session expires ExpiresAt time.Time `db:"expires_at"` // When this session expires

View File

@@ -17,9 +17,9 @@ type Workspace struct {
AutoSave bool `json:"autoSave" db:"auto_save"` AutoSave bool `json:"autoSave" db:"auto_save"`
ShowHiddenFiles bool `json:"showHiddenFiles" db:"show_hidden_files"` ShowHiddenFiles bool `json:"showHiddenFiles" db:"show_hidden_files"`
GitEnabled bool `json:"gitEnabled" db:"git_enabled"` GitEnabled bool `json:"gitEnabled" db:"git_enabled"`
GitURL string `json:"gitUrl" db:"git_url" validate:"required_if=GitEnabled true"` GitURL string `json:"gitUrl" db:"git_url,ommitempty" validate:"required_if=GitEnabled true"`
GitUser string `json:"gitUser" db:"git_user" validate:"required_if=GitEnabled true"` GitUser string `json:"gitUser" db:"git_user,ommitempty" validate:"required_if=GitEnabled true"`
GitToken string `json:"gitToken" db:"git_token" validate:"required_if=GitEnabled true"` GitToken string `json:"gitToken" db:"git_token,ommitempty,encrypted" validate:"required_if=GitEnabled true"`
GitAutoCommit bool `json:"gitAutoCommit" db:"git_auto_commit"` GitAutoCommit bool `json:"gitAutoCommit" db:"git_auto_commit"`
GitCommitMsgTemplate string `json:"gitCommitMsgTemplate" db:"git_commit_msg_template"` GitCommitMsgTemplate string `json:"gitCommitMsgTemplate" db:"git_commit_msg_template"`
GitCommitName string `json:"gitCommitName" db:"git_commit_name"` GitCommitName string `json:"gitCommitName" db:"git_commit_name"`