Rebrand: Nexus Terminal → Alchementary Link
Renames the product across the codebase: Go module path, config/data paths, keychain service name, export file extension, build tooling, docs, and UI text. Sidebar brand mark now reads ">_ AlchementaryLink" with "Alchementary" in the connection-group gold accent colour, and the window title is "Alchementary Link". Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019T8bJS8BCtY5GeSG2HBj1n
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
114060127f
commit
1a380a0e99
+18
-18
@@ -24,17 +24,17 @@ import (
|
||||
"github.com/pquerna/otp/totp"
|
||||
wailsRuntime "github.com/wailsapp/wails/v2/pkg/runtime"
|
||||
|
||||
"github.com/andydixon/nexus/internal/audit"
|
||||
"github.com/andydixon/nexus/internal/exportimport"
|
||||
"github.com/andydixon/nexus/internal/localshell"
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/nexus/internal/preferences"
|
||||
"github.com/andydixon/nexus/internal/secrets"
|
||||
"github.com/andydixon/nexus/internal/sessions"
|
||||
"github.com/andydixon/nexus/internal/sshconfig"
|
||||
"github.com/andydixon/nexus/internal/storage"
|
||||
"github.com/andydixon/nexus/internal/updater"
|
||||
"github.com/andydixon/nexus/internal/validation"
|
||||
"github.com/andydixon/link/internal/audit"
|
||||
"github.com/andydixon/link/internal/exportimport"
|
||||
"github.com/andydixon/link/internal/localshell"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
"github.com/andydixon/link/internal/preferences"
|
||||
"github.com/andydixon/link/internal/secrets"
|
||||
"github.com/andydixon/link/internal/sessions"
|
||||
"github.com/andydixon/link/internal/sshconfig"
|
||||
"github.com/andydixon/link/internal/storage"
|
||||
"github.com/andydixon/link/internal/updater"
|
||||
"github.com/andydixon/link/internal/validation"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
@@ -1291,9 +1291,9 @@ func (s *Service) ExportProfilesEncrypted(profileIDs []string, password string)
|
||||
// Prompt for save location.
|
||||
path, err := wailsRuntime.SaveFileDialog(s.ctx, wailsRuntime.SaveDialogOptions{
|
||||
Title: "Export Encrypted Profiles",
|
||||
DefaultFilename: "nexus-profiles.nexus",
|
||||
DefaultFilename: "link-profiles.link",
|
||||
Filters: []wailsRuntime.FileFilter{
|
||||
{DisplayName: "Nexus Export (*.nexus)", Pattern: "*.nexus"},
|
||||
{DisplayName: "Link Export (*.link)", Pattern: "*.link"},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
@@ -1303,9 +1303,9 @@ func (s *Service) ExportProfilesEncrypted(profileIDs []string, password string)
|
||||
return "", fmt.Errorf("export cancelled")
|
||||
}
|
||||
|
||||
// Ensure .nexus extension.
|
||||
if filepath.Ext(path) != ".nexus" {
|
||||
path += ".nexus"
|
||||
// Ensure .link extension.
|
||||
if filepath.Ext(path) != ".link" {
|
||||
path += ".link"
|
||||
}
|
||||
|
||||
if err := exportimport.EncryptAndExport(profiles, password, path); err != nil {
|
||||
@@ -1327,7 +1327,7 @@ func (s *Service) ImportProfilesEncrypted(password string, strategy string) (int
|
||||
path, err := wailsRuntime.OpenFileDialog(s.ctx, wailsRuntime.OpenDialogOptions{
|
||||
Title: "Import Encrypted Profiles",
|
||||
Filters: []wailsRuntime.FileFilter{
|
||||
{DisplayName: "Nexus Export (*.nexus)", Pattern: "*.nexus"},
|
||||
{DisplayName: "Link Export (*.link)", Pattern: "*.link"},
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
@@ -2023,7 +2023,7 @@ func (s *Service) GenerateSSHKey(name string, keyType string, bits int, passphra
|
||||
}
|
||||
|
||||
// Build ssh-keygen arguments
|
||||
args := []string{"-t", keyType, "-f", keyPath, "-C", name + "@nexus-terminal"}
|
||||
args := []string{"-t", keyType, "-f", keyPath, "-C", name + "@alchementary-link"}
|
||||
if passphrase != "" {
|
||||
args = append(args, "-N", passphrase)
|
||||
} else {
|
||||
|
||||
@@ -7,10 +7,10 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/andydixon/nexus/internal/audit"
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/nexus/internal/storage"
|
||||
"github.com/andydixon/link/internal/audit"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
"github.com/andydixon/link/internal/storage"
|
||||
)
|
||||
|
||||
type closeTrackingWriter struct {
|
||||
|
||||
+11
-11
@@ -17,17 +17,17 @@ import (
|
||||
|
||||
wailsRuntime "github.com/wailsapp/wails/v2/pkg/runtime"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/analysis"
|
||||
"github.com/andydixon/nexus/internal/leviathan/binsnoop"
|
||||
"github.com/andydixon/nexus/internal/leviathan/disasm"
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/nexus/internal/leviathan/parsers"
|
||||
"github.com/andydixon/nexus/internal/leviathan/patch"
|
||||
"github.com/andydixon/nexus/internal/leviathan/pdf"
|
||||
"github.com/andydixon/nexus/internal/leviathan/spectrogram"
|
||||
"github.com/andydixon/nexus/internal/leviathan/squashfs"
|
||||
"github.com/andydixon/nexus/internal/leviathan/stego"
|
||||
"github.com/andydixon/nexus/internal/leviathan/transforms"
|
||||
"github.com/andydixon/link/internal/leviathan/analysis"
|
||||
"github.com/andydixon/link/internal/leviathan/binsnoop"
|
||||
"github.com/andydixon/link/internal/leviathan/disasm"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/parsers"
|
||||
"github.com/andydixon/link/internal/leviathan/patch"
|
||||
"github.com/andydixon/link/internal/leviathan/pdf"
|
||||
"github.com/andydixon/link/internal/leviathan/spectrogram"
|
||||
"github.com/andydixon/link/internal/leviathan/squashfs"
|
||||
"github.com/andydixon/link/internal/leviathan/stego"
|
||||
"github.com/andydixon/link/internal/leviathan/transforms"
|
||||
)
|
||||
|
||||
type leviathanState struct {
|
||||
|
||||
+11
-11
@@ -1,4 +1,4 @@
|
||||
// Package app provides the core application lifecycle for Nexus Terminal.
|
||||
// Package app provides the core application lifecycle for Alchementary Link.
|
||||
// It wires together storage, secrets, sessions, preferences, known hosts,
|
||||
// and the audit log, and exposes Wails lifecycle hooks.
|
||||
package app
|
||||
@@ -11,15 +11,15 @@ import (
|
||||
|
||||
"github.com/wailsapp/wails/v2/pkg/runtime"
|
||||
|
||||
"github.com/andydixon/nexus/internal/api"
|
||||
"github.com/andydixon/nexus/internal/audit"
|
||||
"github.com/andydixon/nexus/internal/config"
|
||||
"github.com/andydixon/nexus/internal/knownhosts"
|
||||
"github.com/andydixon/nexus/internal/preferences"
|
||||
"github.com/andydixon/nexus/internal/recording"
|
||||
"github.com/andydixon/nexus/internal/secrets"
|
||||
"github.com/andydixon/nexus/internal/sessions"
|
||||
"github.com/andydixon/nexus/internal/storage"
|
||||
"github.com/andydixon/link/internal/api"
|
||||
"github.com/andydixon/link/internal/audit"
|
||||
"github.com/andydixon/link/internal/config"
|
||||
"github.com/andydixon/link/internal/knownhosts"
|
||||
"github.com/andydixon/link/internal/preferences"
|
||||
"github.com/andydixon/link/internal/recording"
|
||||
"github.com/andydixon/link/internal/secrets"
|
||||
"github.com/andydixon/link/internal/sessions"
|
||||
"github.com/andydixon/link/internal/storage"
|
||||
)
|
||||
|
||||
// App is the central application struct. Wails binds its lifecycle methods
|
||||
@@ -85,7 +85,7 @@ func (a *App) Startup(ctx context.Context) {
|
||||
|
||||
// Initialise secret stores (keychain preferred, encrypted file fallback).
|
||||
a.SecretStore = secrets.NewSecretStore(cfg.SecretPath)
|
||||
a.KeychainStore = secrets.NewKeychainStore("NexusTerminal")
|
||||
a.KeychainStore = secrets.NewKeychainStore("AlchementaryLink")
|
||||
|
||||
// Initialise the audit logger backed by SQLite.
|
||||
a.AuditLog = audit.NewLogger(store)
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"runtime"
|
||||
)
|
||||
|
||||
const appName = "NexusTerminal"
|
||||
const appName = "AlchementaryLink"
|
||||
|
||||
// AppConfig holds the resolved application configuration paths.
|
||||
type AppConfig struct {
|
||||
@@ -19,9 +19,9 @@ type AppConfig struct {
|
||||
|
||||
// Load resolves the application configuration.
|
||||
// Data directory follows platform conventions:
|
||||
// - macOS: ~/Library/Application Support/NexusTerminal
|
||||
// - Linux: ~/.config/NexusTerminal
|
||||
// - Windows: %APPDATA%/NexusTerminal
|
||||
// - macOS: ~/Library/Application Support/AlchementaryLink
|
||||
// - Linux: ~/.config/AlchementaryLink
|
||||
// - Windows: %APPDATA%/AlchementaryLink
|
||||
func Load() (*AppConfig, error) {
|
||||
dataDir, err := resolveDataDir()
|
||||
if err != nil {
|
||||
@@ -30,9 +30,9 @@ func Load() (*AppConfig, error) {
|
||||
|
||||
cfg := &AppConfig{
|
||||
DataDir: dataDir,
|
||||
DBPath: filepath.Join(dataDir, "nexus.db"),
|
||||
DBPath: filepath.Join(dataDir, "link.db"),
|
||||
SecretPath: filepath.Join(dataDir, "vault"),
|
||||
LogPath: filepath.Join(dataDir, "nexus.log"),
|
||||
LogPath: filepath.Join(dataDir, "link.log"),
|
||||
}
|
||||
return cfg, nil
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ import (
|
||||
|
||||
"golang.org/x/crypto/argon2"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
@@ -6,12 +6,12 @@ import (
|
||||
"runtime"
|
||||
"testing"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
)
|
||||
|
||||
func TestEncryptDecryptRoundTrip(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
path := filepath.Join(dir, "test-export.nexus")
|
||||
path := filepath.Join(dir, "test-export.link")
|
||||
|
||||
profiles := []models.Profile{
|
||||
{
|
||||
@@ -73,7 +73,7 @@ func TestEncryptDecryptRoundTrip(t *testing.T) {
|
||||
|
||||
func TestDecryptWrongPassword(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
path := filepath.Join(dir, "test-export.nexus")
|
||||
path := filepath.Join(dir, "test-export.link")
|
||||
|
||||
profiles := []models.Profile{
|
||||
{
|
||||
@@ -97,7 +97,7 @@ func TestDecryptWrongPassword(t *testing.T) {
|
||||
|
||||
func TestEncryptEmptyProfiles(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
path := filepath.Join(dir, "test.nexus")
|
||||
path := filepath.Join(dir, "test.link")
|
||||
|
||||
err := EncryptAndExport(nil, "password", path)
|
||||
if err == nil {
|
||||
@@ -109,7 +109,7 @@ func TestEncryptAndExportRestrictsExistingFilePermissions(t *testing.T) {
|
||||
if runtime.GOOS == "windows" {
|
||||
t.Skip("POSIX permission bits are not enforced on Windows")
|
||||
}
|
||||
path := filepath.Join(t.TempDir(), "profiles.nexus")
|
||||
path := filepath.Join(t.TempDir(), "profiles.link")
|
||||
if err := os.WriteFile(path, []byte("old"), 0644); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
@@ -127,7 +127,7 @@ func TestEncryptAndExportRestrictsExistingFilePermissions(t *testing.T) {
|
||||
|
||||
func TestEncryptEmptyPassword(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
path := filepath.Join(dir, "test.nexus")
|
||||
path := filepath.Join(dir, "test.link")
|
||||
|
||||
profiles := []models.Profile{{ID: "1"}}
|
||||
err := EncryptAndExport(profiles, "", path)
|
||||
@@ -138,7 +138,7 @@ func TestEncryptEmptyPassword(t *testing.T) {
|
||||
|
||||
func TestDecryptCorruptFile(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
path := filepath.Join(dir, "corrupt.nexus")
|
||||
path := filepath.Join(dir, "corrupt.link")
|
||||
|
||||
// Write garbage data.
|
||||
if err := os.WriteFile(path, []byte("corrupt"), 0600); err != nil {
|
||||
@@ -153,7 +153,7 @@ func TestDecryptCorruptFile(t *testing.T) {
|
||||
|
||||
func TestDecryptRejectsOversizedFile(t *testing.T) {
|
||||
dir := t.TempDir()
|
||||
path := filepath.Join(dir, "huge.nexus")
|
||||
path := filepath.Join(dir, "huge.link")
|
||||
f, err := os.Create(path)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
@@ -17,7 +17,7 @@ import (
|
||||
"sync/atomic"
|
||||
"time"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
)
|
||||
|
||||
const (
|
||||
@@ -90,7 +90,7 @@ func (c *Client) fetchRepos(ctx context.Context, progress func(done int, total i
|
||||
}
|
||||
req.Header.Set("Authorization", "Bearer "+c.token)
|
||||
req.Header.Set("Accept", "application/vnd.github+json")
|
||||
req.Header.Set("User-Agent", "NexusTerminal/1.0")
|
||||
req.Header.Set("User-Agent", "AlchementaryLink/1.0")
|
||||
|
||||
resp, err := c.httpClient.Do(req)
|
||||
if err != nil {
|
||||
@@ -210,7 +210,7 @@ func (c *Client) FetchLatestCommit(ctx context.Context, fullName string, ref str
|
||||
}
|
||||
req.Header.Set("Authorization", "Bearer "+c.token)
|
||||
req.Header.Set("Accept", "application/vnd.github+json")
|
||||
req.Header.Set("User-Agent", "NexusTerminal/1.0")
|
||||
req.Header.Set("User-Agent", "AlchementaryLink/1.0")
|
||||
|
||||
resp, err := c.httpClient.Do(req)
|
||||
if err != nil {
|
||||
@@ -280,7 +280,7 @@ func (c *Client) DownloadRepoArchive(ctx context.Context, fullName string, ref s
|
||||
}
|
||||
req.Header.Set("Authorization", "Bearer "+c.token)
|
||||
req.Header.Set("Accept", "application/vnd.github+json")
|
||||
req.Header.Set("User-Agent", "NexusTerminal/1.0")
|
||||
req.Header.Set("User-Agent", "AlchementaryLink/1.0")
|
||||
|
||||
resp, err := c.httpClient.Do(req)
|
||||
if err != nil {
|
||||
@@ -319,7 +319,7 @@ func (c *Client) ValidateToken(ctx context.Context) (string, error) {
|
||||
}
|
||||
req.Header.Set("Authorization", "Bearer "+c.token)
|
||||
req.Header.Set("Accept", "application/vnd.github+json")
|
||||
req.Header.Set("User-Agent", "NexusTerminal/1.0")
|
||||
req.Header.Set("User-Agent", "AlchementaryLink/1.0")
|
||||
|
||||
resp, err := c.httpClient.Do(req)
|
||||
if err != nil {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
// Package ircclient wraps a full IRC client with Nexus-specific event and
|
||||
// Package ircclient wraps a full IRC client with Link-specific event and
|
||||
// command handling, including optional SSH tunnelling.
|
||||
package ircclient
|
||||
|
||||
@@ -216,7 +216,7 @@ func (c *Client) Close() {
|
||||
c.mu.Unlock()
|
||||
|
||||
if c.client != nil {
|
||||
c.client.Quit("Nexus Terminal disconnected")
|
||||
c.client.Quit("Alchementary Link disconnected")
|
||||
c.client.Close()
|
||||
}
|
||||
if c.sshClient != nil {
|
||||
@@ -305,7 +305,7 @@ func (c *Client) HandleInput(target string, input string) error {
|
||||
}
|
||||
case "quit":
|
||||
if args == "" {
|
||||
args = "Nexus Terminal disconnected"
|
||||
args = "Alchementary Link disconnected"
|
||||
}
|
||||
c.client.Quit(args)
|
||||
c.client.Close()
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package knownhosts
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
)
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"encoding/binary"
|
||||
"io"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// Signature describes a carveable object. `validate` is run against
|
||||
|
||||
@@ -3,7 +3,7 @@ package analysis
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// DiffRegion describes a contiguous run of differing bytes.
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"math"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// Entropy computes Shannon entropy per sliding window over the range.
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// fuzzy.go implements context-triggered piecewise hashing (CTPH) compatible
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
"hash"
|
||||
"hash/crc32"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// HashSet contains CRC32/MD5/SHA-1/SHA-256/SHA-512 for a range.
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"regexp"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// ioc regexes. They run against printable ASCII strings extracted
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// KeyArtefact is a single key-ish object we've found in the raw file.
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
type MultiSearchQuery struct {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package analysis
|
||||
|
||||
import (
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// Overview returns a compact first-pass report intended for both UI
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// Rule represents a lightweight YARA-like rule. A rule matches when
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"errors"
|
||||
"regexp"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// SearchHit describes one search result.
|
||||
|
||||
@@ -3,7 +3,7 @@ package analysis
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// StringHit represents one extracted string.
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"math"
|
||||
"time"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// ScanTimestamps walks the range looking for plausible timestamps in
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
package disasm
|
||||
|
||||
import (
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/nexus/internal/leviathan/parsers"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/parsers"
|
||||
)
|
||||
|
||||
// ImageAnalysis is a metadata-seeded analysis across file-backed executable
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// ParseASN1 produces a field tree for the DER TLV structure starting
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// ParseCerts scans the whole document for PEM-encoded certificates
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"fmt"
|
||||
"sort"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// ExecutableRegion is a file-backed executable code range.
|
||||
|
||||
@@ -12,7 +12,7 @@ import (
|
||||
"unicode/utf16"
|
||||
"unicode/utf8"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// Field is one node of the parsed structure.
|
||||
|
||||
@@ -15,7 +15,7 @@ import (
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// leaf builds a terminal Field with no children.
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// Mach-O magic values (32/64, LE/BE) plus fat (universal) magic.
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// ImportSym is one resolved PE import (a function name, or an ordinal).
|
||||
|
||||
@@ -14,7 +14,7 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// Step is one parsed instruction.
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/transforms"
|
||||
"github.com/andydixon/link/internal/leviathan/transforms"
|
||||
)
|
||||
|
||||
const MaxDecodedStreamOutput = 64 << 20
|
||||
|
||||
@@ -16,7 +16,7 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
const maxPDFParseBytes = 128 << 20
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
func TestParseRejectsOversizedPDFBeforeWholeRange(t *testing.T) {
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// XRefEntry describes one cross-reference entry after parsing either a
|
||||
|
||||
@@ -21,7 +21,7 @@ import (
|
||||
"path"
|
||||
"sort"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
"github.com/klauspost/compress/zstd"
|
||||
"github.com/ulikunitz/xz"
|
||||
)
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
"io"
|
||||
"strings"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// MetaEntry is one piece of textual/EXIF metadata recovered from an image.
|
||||
|
||||
@@ -14,7 +14,7 @@ import (
|
||||
"encoding/binary"
|
||||
"errors"
|
||||
|
||||
"github.com/andydixon/nexus/internal/leviathan/document"
|
||||
"github.com/andydixon/link/internal/leviathan/document"
|
||||
)
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
@@ -16,7 +16,7 @@ import (
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/andydixon/nexus/internal/terminalenv"
|
||||
"github.com/andydixon/link/internal/terminalenv"
|
||||
"github.com/creack/pty"
|
||||
)
|
||||
|
||||
|
||||
@@ -128,8 +128,8 @@ func NewProfile(protocol Protocol) Profile {
|
||||
case ProtocolIRC:
|
||||
p.Port = DefaultIRCPort
|
||||
p.IRC = &IRCConfig{
|
||||
Nick: "nexus",
|
||||
RealName: "Nexus Terminal",
|
||||
Nick: "link",
|
||||
RealName: "Alchementary Link",
|
||||
ServerPasswordMode: SecretModeAskEveryTime,
|
||||
NickServMode: SecretModeSaved,
|
||||
AutoJoinRooms: []string{},
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// Package models defines the core data structures used throughout
|
||||
// the Nexus Terminal application.
|
||||
// the Alchementary Link application.
|
||||
package models
|
||||
|
||||
import "time"
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"fmt"
|
||||
"sync"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
)
|
||||
|
||||
// PreferenceStore is the persistence interface used by the Manager.
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"bytes"
|
||||
"testing"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
)
|
||||
|
||||
func TestHistoryIsCappedByEntryCount(t *testing.T) {
|
||||
|
||||
@@ -10,7 +10,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
)
|
||||
|
||||
const (
|
||||
|
||||
@@ -27,7 +27,7 @@ func NewKeychainStore(serviceName string) *KeychainStore {
|
||||
// without error.
|
||||
func (k *KeychainStore) Available() bool {
|
||||
// Attempt a round-trip to verify the keychain is usable.
|
||||
probeKey := "__nexus_keychain_probe__"
|
||||
probeKey := "__link_keychain_probe__"
|
||||
probeVal := "probe"
|
||||
|
||||
if err := keyring.Set(k.serviceName, probeKey, probeVal); err != nil {
|
||||
|
||||
@@ -18,19 +18,19 @@ import (
|
||||
wailsRuntime "github.com/wailsapp/wails/v2/pkg/runtime"
|
||||
"golang.org/x/crypto/ssh"
|
||||
|
||||
"github.com/andydixon/nexus/internal/audit"
|
||||
"github.com/andydixon/nexus/internal/githubclient"
|
||||
"github.com/andydixon/nexus/internal/ircclient"
|
||||
"github.com/andydixon/nexus/internal/localshell"
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/nexus/internal/rawclient"
|
||||
"github.com/andydixon/nexus/internal/recording"
|
||||
"github.com/andydixon/nexus/internal/secrets"
|
||||
"github.com/andydixon/nexus/internal/sftpclient"
|
||||
"github.com/andydixon/nexus/internal/sshclient"
|
||||
"github.com/andydixon/nexus/internal/storage"
|
||||
"github.com/andydixon/nexus/internal/telnetclient"
|
||||
"github.com/andydixon/nexus/internal/vncclient"
|
||||
"github.com/andydixon/link/internal/audit"
|
||||
"github.com/andydixon/link/internal/githubclient"
|
||||
"github.com/andydixon/link/internal/ircclient"
|
||||
"github.com/andydixon/link/internal/localshell"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
"github.com/andydixon/link/internal/rawclient"
|
||||
"github.com/andydixon/link/internal/recording"
|
||||
"github.com/andydixon/link/internal/secrets"
|
||||
"github.com/andydixon/link/internal/sftpclient"
|
||||
"github.com/andydixon/link/internal/sshclient"
|
||||
"github.com/andydixon/link/internal/storage"
|
||||
"github.com/andydixon/link/internal/telnetclient"
|
||||
"github.com/andydixon/link/internal/vncclient"
|
||||
)
|
||||
|
||||
const maxTunnelPrivateKeyBytes = 1 << 20
|
||||
|
||||
@@ -14,9 +14,9 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/andydixon/nexus/internal/audit"
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/nexus/internal/storage"
|
||||
"github.com/andydixon/link/internal/audit"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
"github.com/andydixon/link/internal/storage"
|
||||
"golang.org/x/crypto/ssh"
|
||||
)
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"net"
|
||||
"time"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
"golang.org/x/crypto/ssh"
|
||||
)
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ import (
|
||||
"net"
|
||||
"sync"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
"golang.org/x/crypto/ssh"
|
||||
)
|
||||
|
||||
|
||||
@@ -13,8 +13,8 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/nexus/internal/terminalenv"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
"github.com/andydixon/link/internal/terminalenv"
|
||||
"github.com/pquerna/otp/totp"
|
||||
"golang.org/x/crypto/ssh"
|
||||
"golang.org/x/net/proxy"
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
"golang.org/x/crypto/ssh"
|
||||
)
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// Package sshconfig parses OpenSSH ~/.ssh/config files and converts
|
||||
// Host blocks into Nexus Terminal connection profiles. Supports a useful
|
||||
// Host blocks into Alchementary Link connection profiles. Supports a useful
|
||||
// subset of SSH config directives: HostName, Port, User, IdentityFile,
|
||||
// ProxyJump, ForwardAgent, and Compression.
|
||||
//
|
||||
@@ -18,7 +18,7 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
@@ -170,7 +170,7 @@ func DefaultConfigPath() string {
|
||||
return filepath.Join(home, ".ssh", "config")
|
||||
}
|
||||
|
||||
// ToProfiles converts parsed Host blocks into Nexus Terminal profiles.
|
||||
// ToProfiles converts parsed Host blocks into Alchementary Link profiles.
|
||||
// Each block produces one profile; the first alias becomes the display name.
|
||||
func ToProfiles(blocks []HostBlock, folder string) []models.Profile {
|
||||
profiles := make([]models.Profile, 0, len(blocks))
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
-- Initial schema for Nexus Terminal
|
||||
-- Initial schema for Alchementary Link
|
||||
-- Creates the core tables for profiles, known hosts, preferences, and audit log.
|
||||
|
||||
CREATE TABLE IF NOT EXISTS profiles (
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
@@ -37,8 +37,8 @@ func makeIRCProfile(name, host string) *models.Profile {
|
||||
p := models.NewProfile(models.ProtocolIRC)
|
||||
p.DisplayName = name
|
||||
p.Host = host
|
||||
p.Username = "nexus"
|
||||
p.IRC.Nick = "nexus"
|
||||
p.Username = "link"
|
||||
p.IRC.Nick = "link"
|
||||
return &p
|
||||
}
|
||||
|
||||
@@ -120,14 +120,14 @@ func TestIRCLastRoomsRoundTripReplaceAndDelete(t *testing.T) {
|
||||
t.Fatalf("CreateProfile() error = %v", err)
|
||||
}
|
||||
|
||||
if err := store.SaveIRCLastRooms(p.ID, []string{" #Go-Nuts ", "#nexus", "#go-nuts", ""}); err != nil {
|
||||
if err := store.SaveIRCLastRooms(p.ID, []string{" #Go-Nuts ", "#link", "#go-nuts", ""}); err != nil {
|
||||
t.Fatalf("SaveIRCLastRooms() error = %v", err)
|
||||
}
|
||||
rooms, err := store.GetIRCLastRooms(p.ID)
|
||||
if err != nil {
|
||||
t.Fatalf("GetIRCLastRooms() error = %v", err)
|
||||
}
|
||||
if got, want := strings.Join(rooms, ","), "#Go-Nuts,#nexus"; got != want {
|
||||
if got, want := strings.Join(rooms, ","), "#Go-Nuts,#link"; got != want {
|
||||
t.Fatalf("GetIRCLastRooms() = %q, want %q", got, want)
|
||||
}
|
||||
|
||||
|
||||
@@ -11,8 +11,8 @@ import (
|
||||
|
||||
_ "modernc.org/sqlite"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/nexus/internal/storage/migrations"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
"github.com/andydixon/link/internal/storage/migrations"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
"golang.org/x/text/encoding/charmap"
|
||||
)
|
||||
|
||||
|
||||
@@ -20,8 +20,8 @@ const (
|
||||
// defaultOwner and defaultRepo identify the GitHub repository to check.
|
||||
// These should be overridden via SetRepository if the project is hosted
|
||||
// elsewhere.
|
||||
defaultOwner = "nexus-terminal"
|
||||
defaultRepo = "nexus-terminal"
|
||||
defaultOwner = "alchementary-link"
|
||||
defaultRepo = "alchementary-link"
|
||||
|
||||
// requestTimeout limits the HTTP request duration.
|
||||
requestTimeout = 10 * time.Second
|
||||
@@ -118,7 +118,7 @@ func (c *Checker) Check(ctx context.Context) (*UpdateInfo, error) {
|
||||
return nil, fmt.Errorf("updater: failed to create request: %w", err)
|
||||
}
|
||||
req.Header.Set("Accept", "application/vnd.github+json")
|
||||
req.Header.Set("User-Agent", "NexusTerminal-UpdateChecker")
|
||||
req.Header.Set("User-Agent", "AlchementaryLink-UpdateChecker")
|
||||
|
||||
resp, err := c.client.Do(req)
|
||||
if err != nil {
|
||||
@@ -183,7 +183,7 @@ func (c *URLChecker) Check(ctx context.Context) (*UpdateInfo, error) {
|
||||
return nil, fmt.Errorf("updater: failed to create request: %w", err)
|
||||
}
|
||||
req.Header.Set("Accept", "application/json, text/plain")
|
||||
req.Header.Set("User-Agent", "NexusTerminal-UpdateChecker")
|
||||
req.Header.Set("User-Agent", "AlchementaryLink-UpdateChecker")
|
||||
|
||||
resp, err := c.client.Do(req)
|
||||
if err != nil {
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"net/url"
|
||||
"strings"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
"github.com/lrstanley/girc"
|
||||
)
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ package validation
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/andydixon/nexus/internal/models"
|
||||
"github.com/andydixon/link/internal/models"
|
||||
)
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user