mirror of
https://github.com/SecurityBrewery/catalyst.git
synced 2025-12-06 15:22:47 +01:00
228 lines
7.6 KiB
Go
228 lines
7.6 KiB
Go
package data
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"log/slog"
|
|
"os"
|
|
"path"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/SecurityBrewery/catalyst/app/database"
|
|
"github.com/SecurityBrewery/catalyst/app/database/sqlc"
|
|
"github.com/SecurityBrewery/catalyst/app/pointer"
|
|
)
|
|
|
|
const (
|
|
AdminEmail = "admin@catalyst-soar.com"
|
|
AnalystEmail = "analyst@catalyst-soar.com"
|
|
)
|
|
|
|
func DefaultTestData(t *testing.T, dir string, queries *sqlc.Queries) {
|
|
t.Helper()
|
|
|
|
parseTime := func(s string) time.Time {
|
|
t, _ := time.Parse(time.RFC3339Nano, s)
|
|
|
|
return t
|
|
}
|
|
|
|
ctx := t.Context()
|
|
|
|
// Insert users
|
|
_, err := queries.InsertUser(ctx, sqlc.InsertUserParams{
|
|
Created: parseTime("2025-06-21T22:21:26.271Z"),
|
|
Updated: parseTime("2025-06-21T22:21:26.271Z"),
|
|
Email: pointer.Pointer("analyst@catalyst-soar.com"),
|
|
Username: "u_bob_analyst",
|
|
Name: pointer.Pointer("Bob Analyst"),
|
|
PasswordHash: "$2a$10$ZEHNh9ZKJ81N717wovDnMuLwZOLa6.g22IRzRr4goG6zGN.57UzJG",
|
|
TokenKey: "z3Jj8bbzcq_cSZs07XKoGlB0UtvmQiphHgwNkE4akoY=",
|
|
Active: true,
|
|
ID: "u_bob_analyst",
|
|
})
|
|
require.NoError(t, err, "failed to insert analyst user")
|
|
|
|
_, err = queries.InsertUser(ctx, sqlc.InsertUserParams{
|
|
Created: parseTime("2025-06-21T22:21:26.271Z"),
|
|
Updated: parseTime("2025-06-21T22:21:26.271Z"),
|
|
Email: pointer.Pointer("admin@catalyst-soar.com"),
|
|
Username: "u_admin",
|
|
Name: pointer.Pointer("Admin User"),
|
|
PasswordHash: "$2a$10$Z3/0HHWau6oi1t1aRPiI0uiVOWI.IosTAYEL0DJ2XJaalP9kesgBa",
|
|
TokenKey: "5BWDKLIAn3SQkpQlBUGrS_XEbFf91DsDpuh_Xmt4Nwg=",
|
|
Active: true,
|
|
ID: "u_admin",
|
|
})
|
|
require.NoError(t, err, "failed to insert admin user")
|
|
|
|
// Insert webhooks
|
|
_, err = queries.InsertWebhook(ctx, sqlc.InsertWebhookParams{
|
|
ID: "w_test_webhook",
|
|
Name: "Test Webhook",
|
|
Collection: "tickets",
|
|
Destination: "https://example.com",
|
|
Created: parseTime("2025-06-21T22:21:26.271Z"),
|
|
Updated: parseTime("2025-06-21T22:21:26.271Z"),
|
|
})
|
|
require.NoError(t, err, "failed to insert webhook")
|
|
|
|
// Insert types
|
|
_, err = queries.InsertType(ctx, sqlc.InsertTypeParams{
|
|
ID: "test-type",
|
|
Singular: "Test",
|
|
Plural: "Tests",
|
|
Schema: []byte(`{}`),
|
|
Created: parseTime("2025-06-21T22:21:26.271Z"),
|
|
Updated: parseTime("2025-06-21T22:21:26.271Z"),
|
|
})
|
|
require.NoError(t, err, "failed to insert type")
|
|
|
|
// Insert tickets
|
|
_, err = queries.InsertTicket(ctx, sqlc.InsertTicketParams{
|
|
Created: parseTime("2025-06-21T22:21:26.271Z"),
|
|
Description: "This is a test ticket.",
|
|
ID: "test-ticket",
|
|
Name: "Test Ticket",
|
|
Open: true,
|
|
Owner: pointer.Pointer("u_bob_analyst"),
|
|
Schema: json.RawMessage(`{"type":"object","properties":{"tlp":{"title":"TLP","type":"string"}}}`),
|
|
State: json.RawMessage(`{"tlp":"AMBER"}`),
|
|
Type: "incident",
|
|
Updated: parseTime("2025-06-21T22:21:26.271Z"),
|
|
})
|
|
require.NoError(t, err, "failed to insert ticket")
|
|
|
|
// Insert tasks
|
|
_, err = queries.InsertTask(ctx, sqlc.InsertTaskParams{
|
|
Created: parseTime("2025-06-21T22:21:26.271Z"),
|
|
ID: "k_test_task",
|
|
Name: "Test Task",
|
|
Open: true,
|
|
Owner: pointer.Pointer("u_bob_analyst"),
|
|
Ticket: "test-ticket",
|
|
Updated: parseTime("2025-06-21T22:21:26.271Z"),
|
|
})
|
|
require.NoError(t, err, "failed to insert task")
|
|
|
|
// Insert comments
|
|
_, err = queries.InsertComment(ctx, sqlc.InsertCommentParams{
|
|
Author: "u_bob_analyst",
|
|
Created: parseTime("2025-06-21T22:21:26.271Z"),
|
|
ID: "c_test_comment",
|
|
Message: "Initial comment on the test ticket.",
|
|
Ticket: "test-ticket",
|
|
Updated: parseTime("2025-06-21T22:21:26.271Z"),
|
|
})
|
|
require.NoError(t, err, "failed to insert comment")
|
|
|
|
// Insert timeline
|
|
_, err = queries.InsertTimeline(ctx, sqlc.InsertTimelineParams{
|
|
Created: parseTime("2025-06-21T22:21:26.271Z"),
|
|
ID: "h_test_timeline",
|
|
Message: "Initial timeline entry.",
|
|
Ticket: "test-ticket",
|
|
Time: parseTime("2023-01-01T00:00:00Z"),
|
|
Updated: parseTime("2025-06-21T22:21:26.271Z"),
|
|
})
|
|
require.NoError(t, err, "failed to insert timeline entry")
|
|
|
|
// Insert links
|
|
_, err = queries.InsertLink(ctx, sqlc.InsertLinkParams{
|
|
Created: parseTime("2025-06-21T22:21:26.271Z"),
|
|
ID: "l_test_link",
|
|
Name: "Catalyst",
|
|
Ticket: "test-ticket",
|
|
Updated: parseTime("2025-06-21T22:21:26.271Z"),
|
|
Url: "https://example.com",
|
|
})
|
|
require.NoError(t, err, "failed to insert link")
|
|
|
|
// Insert files
|
|
_, err = queries.InsertFile(ctx, sqlc.InsertFileParams{
|
|
Created: parseTime("2025-06-21T22:21:26.271Z"),
|
|
ID: "b_test_file",
|
|
Name: "hello.txt",
|
|
Size: 5,
|
|
Ticket: "test-ticket",
|
|
Updated: parseTime("2025-06-21T22:21:26.271Z"),
|
|
Blob: "hello_a20DUE9c77rj.txt",
|
|
})
|
|
require.NoError(t, err, "failed to insert file")
|
|
|
|
// Insert features
|
|
_, err = queries.CreateFeature(ctx, "dev")
|
|
require.NoError(t, err, "failed to insert feature 'dev'")
|
|
|
|
// Insert reactions
|
|
_, err = queries.InsertReaction(ctx, sqlc.InsertReactionParams{
|
|
ID: "r-test-webhook",
|
|
Name: "Reaction",
|
|
Action: "python",
|
|
Actiondata: []byte(`{"requirements":"requests","script":"print('Hello, World!')"}`),
|
|
Trigger: "webhook",
|
|
Triggerdata: []byte(`{"token":"1234567890","path":"test"}`),
|
|
Created: parseTime("2025-06-21T22:21:26.271Z"),
|
|
Updated: parseTime("2025-06-21T22:21:26.271Z"),
|
|
})
|
|
require.NoError(t, err, "failed to insert reaction")
|
|
|
|
_, err = queries.InsertReaction(ctx, sqlc.InsertReactionParams{
|
|
ID: "r-test-proxy",
|
|
Action: "webhook",
|
|
Name: "Reaction",
|
|
Actiondata: []byte(`{"headers":{"Content-Type":"application/json"},"url":"http://127.0.0.1:12345/webhook"}`),
|
|
Trigger: "webhook",
|
|
Triggerdata: []byte(`{"path":"test2"}`),
|
|
Created: parseTime("2025-06-21T22:21:26.271Z"),
|
|
Updated: parseTime("2025-06-21T22:21:26.271Z"),
|
|
})
|
|
require.NoError(t, err, "failed to insert reaction")
|
|
|
|
_, err = queries.InsertReaction(ctx, sqlc.InsertReactionParams{
|
|
ID: "r-test-hook",
|
|
Name: "Hook",
|
|
Action: "python",
|
|
Actiondata: []byte(`{"requirements":"requests","script":"import requests\nrequests.post('http://127.0.0.1:12346/test', json={'test':True})"}`),
|
|
Trigger: "hook",
|
|
Triggerdata: json.RawMessage(`{"collections":["tickets"],"events":["create"]}`),
|
|
Created: parseTime("2025-06-21T22:21:26.271Z"),
|
|
Updated: parseTime("2025-06-21T22:21:26.271Z"),
|
|
})
|
|
require.NoError(t, err, "failed to insert reaction")
|
|
|
|
// Insert user_groups
|
|
err = queries.AssignGroupToUser(ctx, sqlc.AssignGroupToUserParams{
|
|
UserID: "u_bob_analyst",
|
|
GroupID: "analyst",
|
|
})
|
|
require.NoError(t, err, "failed to assign analyst group to user")
|
|
|
|
err = queries.AssignGroupToUser(ctx, sqlc.AssignGroupToUserParams{
|
|
UserID: "u_admin",
|
|
GroupID: "admin",
|
|
})
|
|
require.NoError(t, err, "failed to assign admin group to user")
|
|
|
|
files, err := database.PaginateItems(ctx, func(ctx context.Context, offset, limit int64) ([]sqlc.ListFilesRow, error) {
|
|
return queries.ListFiles(ctx, sqlc.ListFilesParams{Limit: limit, Offset: offset})
|
|
})
|
|
require.NoError(t, err, "failed to list files")
|
|
|
|
for _, file := range files {
|
|
_ = os.MkdirAll(path.Join(dir, "uploads", file.ID), 0o755)
|
|
|
|
infoFilePath := path.Join(dir, "uploads", file.ID+".info")
|
|
slog.InfoContext(t.Context(), "Creating file info", "path", infoFilePath)
|
|
|
|
err = os.WriteFile(infoFilePath, []byte(`{"MetaData":{"filetype":"text/plain"}}`), 0o600)
|
|
require.NoError(t, err, "failed to write file info")
|
|
|
|
err = os.WriteFile(path.Join(dir, "uploads", file.ID, file.Blob), []byte("hello"), 0o600)
|
|
require.NoError(t, err, "failed to write file blob")
|
|
}
|
|
}
|