mirror of
https://github.com/lordmathis/lemma.git
synced 2025-11-05 23:44:22 +00:00
Encrypt git token in insertstruct
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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"`
|
||||||
|
|||||||
Reference in New Issue
Block a user