Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2a01e0fc08 | |||
| ead3c9043d | |||
| 317dd9aedf | |||
| 7f22302859 | |||
| dc0ae8eb96 |
@@ -13,7 +13,7 @@ Just drop the binary on a server and start triaging.
|
||||
|
||||
### Option A: Download the Binary
|
||||
|
||||
1. Go to the [Releases](https://epigas.gitea.cloud/RiskRancher/core/releases) tab and download the compiled executable for your OS (Windows/macOS/Linux).
|
||||
1. Go to the [Releases](https://code.riskrancher.com/RiskRancher/core/releases) tab and download the compiled executable for your OS (Windows/macOS/Linux).
|
||||
2. Place the binary in a dedicated directory and execute it.
|
||||
3. Visit `http://localhost:8080` in your browser.
|
||||
|
||||
@@ -22,7 +22,7 @@ Just drop the binary on a server and start triaging.
|
||||
Ensure you have **Go 1.26+** installed (*CGO is required for the native `mattn/go-sqlite3` driver*).
|
||||
|
||||
```bash
|
||||
git clone https://epigas.gitea.cloud/RiskRancher/core
|
||||
git clone https://code.riskrancher.com/RiskRancher/core
|
||||
cd core
|
||||
go build -o rr ./cmd/rr/main.go
|
||||
./rr
|
||||
|
||||
+3
-3
@@ -4,9 +4,9 @@ import (
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/server"
|
||||
"epigas.gitea.cloud/RiskRancher/core/ui"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/server"
|
||||
"code.riskrancher.com/RiskRancher/core/ui"
|
||||
)
|
||||
|
||||
var (
|
||||
|
||||
@@ -10,8 +10,8 @@ import (
|
||||
"net/http"
|
||||
"time"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/auth"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/auth"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
|
||||
)
|
||||
|
||||
func main() {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
module epigas.gitea.cloud/RiskRancher/core
|
||||
module code.riskrancher.com/RiskRancher/core
|
||||
|
||||
go 1.26.0
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
func (h *Handler) HandleGetAdapters(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
@@ -9,8 +9,8 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
func setupTestAdapters(t *testing.T) (*Handler, *sql.DB) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package adapters
|
||||
|
||||
import (
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
type Handler struct {
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/auth"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/auth"
|
||||
)
|
||||
|
||||
// PasswordResetRequest is the expected JSON payload
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
func TestGetGlobalConfig(t *testing.T) {
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
func TestExportSystemState(t *testing.T) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
// Handler encapsulates all Admin and Sheriff HTTP logic
|
||||
|
||||
@@ -7,8 +7,8 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
// setupTestAdmin returns the clean Admin Handler and the raw DB
|
||||
|
||||
@@ -9,8 +9,8 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
func setupTestAnalytics(t *testing.T) (*Handler, *sql.DB) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package analytics
|
||||
|
||||
import (
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
type Handler struct {
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ import (
|
||||
"encoding/base64"
|
||||
"math/rand"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
)
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
|
||||
)
|
||||
|
||||
func setupTestAuth(t *testing.T) (*Handler, *sql.DB) {
|
||||
|
||||
@@ -6,7 +6,7 @@ import (
|
||||
"errors"
|
||||
"time"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
// ErrNotFound is a standard error we can use across our handlers
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ import (
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
_ "modernc.org/sqlite"
|
||||
)
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"database/sql"
|
||||
"testing"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
_ "modernc.org/sqlite" // We need the SQLite driver for the test
|
||||
)
|
||||
|
||||
|
||||
@@ -28,8 +28,13 @@ CREATE TABLE IF NOT EXISTS sla_policies (
|
||||
);
|
||||
|
||||
INSERT OR IGNORE INTO sla_policies (domain, severity, days_to_triage, days_to_remediate, max_extensions) VALUES
|
||||
('Vulnerability', 'Critical', 3, 14, 1), ('Vulnerability', 'High', 3, 30, 2),
|
||||
('Privacy', 'Critical', 3, 3, 0), ('Privacy', 'High', 3, 7, 1),
|
||||
('Vulnerability', 'Critical', 3, 14, 1),
|
||||
('Vulnerability', 'High', 3, 30, 2),
|
||||
('Vulnerability', 'Medium', 7, 60, 2),
|
||||
('Vulnerability', 'Low', 14, 90, 3),
|
||||
('Vulnerability', 'Info', 30, 180, 5),
|
||||
('Privacy', 'Critical', 3, 3, 0),
|
||||
('Privacy', 'High', 3, 7, 1),
|
||||
('Incident', 'Critical', 3, 1, 0);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
@@ -70,7 +75,10 @@ CREATE TABLE IF NOT EXISTS tickets (
|
||||
'Triaged',
|
||||
'Assigned Out',
|
||||
'Patched',
|
||||
'False Positive'
|
||||
'False Positive',
|
||||
'Pending Risk Approval',
|
||||
'Risk Accepted',
|
||||
'Pending Verification'
|
||||
)),
|
||||
dedupe_hash TEXT UNIQUE NOT NULL,
|
||||
patch_evidence TEXT,
|
||||
|
||||
@@ -3,7 +3,7 @@ package datastore
|
||||
import (
|
||||
"database/sql"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
type SQLiteStore struct {
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"time"
|
||||
|
||||
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
func (s *SQLiteStore) UpdateAppConfig(ctx context.Context, config domain2.AppConfig) error {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
func (s *SQLiteStore) GetSheriffAnalytics(ctx context.Context) (domain2.SheriffAnalytics, error) {
|
||||
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
func (s *SQLiteStore) SaveDraft(ctx context.Context, d domain2.DraftTicket) error {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"database/sql"
|
||||
"time"
|
||||
|
||||
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
func (s *SQLiteStore) IngestTickets(ctx context.Context, tickets []domain2.Ticket) error {
|
||||
|
||||
@@ -7,7 +7,7 @@ import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
func (s *SQLiteStore) GetTickets(ctx context.Context) ([]domain.Ticket, error) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package ingest
|
||||
|
||||
import (
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
type Handler struct {
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
func (h *Handler) HandleIngest(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
@@ -13,8 +13,8 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
func setupTestIngest(t *testing.T) (*Handler, *sql.DB) {
|
||||
|
||||
@@ -5,8 +5,8 @@ import (
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/auth"
|
||||
domain2 "epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/auth"
|
||||
domain2 "code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
func (h *Handler) HandleSaveDraft(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package report
|
||||
|
||||
import (
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
type Handler struct {
|
||||
|
||||
@@ -13,8 +13,8 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
func setupTestReport(t *testing.T) (*Handler, *sql.DB) {
|
||||
|
||||
+2
-2
@@ -3,8 +3,8 @@ package server
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/sla"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/sla"
|
||||
)
|
||||
|
||||
type App struct {
|
||||
|
||||
@@ -3,14 +3,14 @@ package server
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/adapters"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/admin"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/analytics"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/auth"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/ingest"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/report"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/tickets"
|
||||
"epigas.gitea.cloud/RiskRancher/core/ui"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/adapters"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/admin"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/analytics"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/auth"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/ingest"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/report"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/tickets"
|
||||
"code.riskrancher.com/RiskRancher/core/ui"
|
||||
)
|
||||
|
||||
func RegisterRoutes(app *App) {
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ import (
|
||||
"log"
|
||||
"time"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
// DefaultSLACalculator implements the SLACalculator interface
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package tickets
|
||||
|
||||
import (
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
// Handler encapsulates all Ticket-related HTTP logic
|
||||
|
||||
@@ -10,8 +10,8 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/datastore"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/datastore"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
func setupTestTickets(t *testing.T) (*Handler, *sql.DB) {
|
||||
|
||||
@@ -5,7 +5,7 @@ import (
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
)
|
||||
|
||||
type InlineUpdateRequest struct {
|
||||
|
||||
@@ -3,16 +3,22 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>RiskRancher OSS</title>
|
||||
<title>RiskRancher {{if isProActive}}PRO{{else}}OSS{{end}}</title>
|
||||
<link rel="stylesheet" href="/static/style.css">
|
||||
</head>
|
||||
<body>
|
||||
<header style="display: flex; justify-content: space-between; align-items: center; padding: 10px 20px; background: white; border-bottom: 1px solid #e2e8f0;">
|
||||
<div class="logo">
|
||||
<h2 style="margin: 0;"><a href="/dashboard" style="color: #0f172a; text-decoration: none;">🐴 RiskRancher</a></h2>
|
||||
<h2 style="margin: 0;">
|
||||
<a href="/dashboard" style="color: #0f172a; text-decoration: none;">
|
||||
🐴 RiskRancher{{if isProActive}}{{with getCompanyName}} | {{.}}{{end}}{{end}}
|
||||
</a>
|
||||
</h2>
|
||||
</div>
|
||||
<nav style="display: flex; align-items: center; gap: 15px;">
|
||||
<span style="color: #475569; font-size: 0.9rem; font-family: monospace; padding-left: 15px; margin-left: 5px;">Community Edition</span>
|
||||
<span style="color: {{if isProActive}}#059669{{else}}#475569{{end}}; font-size: 0.9rem; font-family: monospace; padding-left: 15px; margin-left: 5px; font-weight: {{if isProActive}}bold{{else}}normal{{end}};">
|
||||
{{if isProActive}}PRO Edition{{else}}Community Edition{{end}}
|
||||
</span>
|
||||
<button onclick="logout()" style="background: #f1f5f9; color: #dc2626; border: 1px solid #e2e8f0; padding: 6px 12px; border-radius: 4px; font-weight: bold; cursor: pointer; font-size: 0.85rem;">Log Out</button>
|
||||
</nav>
|
||||
</header>
|
||||
@@ -29,7 +35,7 @@
|
||||
{{template "content" .}}
|
||||
</main>
|
||||
<footer style="text-align: center; padding: 20px; margin-top: 40px; border-top: 1px solid #e2e8f0; color: #94a3b8; font-size: 0.85rem;">
|
||||
🐴 RiskRancher Core Edition | Version: <strong>{{.Version}}</strong> | Build: <strong>{{.Commit}}</strong>
|
||||
🐴 RiskRancher {{if isProActive}}PRO Edition{{else}}Core Edition{{end}} | Version: <strong>{{.Version}}</strong> | Build: <strong>{{.Commit}}</strong>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -83,20 +83,6 @@
|
||||
<h3 style="margin: 0 0 15px 0;">⚙️ Operations</h3>
|
||||
|
||||
{{block "pro_backups" .}}
|
||||
<div style="margin-bottom: 20px;">
|
||||
<label style="font-weight: bold; display: flex; justify-content: space-between;">
|
||||
Automated Backups
|
||||
<span style="font-size: 0.75rem; color: #8b5cf6; font-weight: normal;">Pro Feature</span>
|
||||
</label>
|
||||
<div style="display: flex; gap: 10px; margin-top: 5px;">
|
||||
<select disabled style="flex: 1; padding: 6px; background: #f1f5f9; color: #94a3b8; cursor: not-allowed; border: 1px solid #cbd5e1;">
|
||||
<option>Manual Only (Free Core)</option>
|
||||
<option>Daily Automated</option>
|
||||
<option>Weekly Automated</option>
|
||||
</select>
|
||||
<button class="btn btn-secondary" style="color: #94a3b8; border-color: #cbd5e1;" onclick="showUpsell('Automated DB Backups')">🔒 Apply</button>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
<div style="margin-bottom: 20px;">
|
||||
|
||||
@@ -13,9 +13,9 @@ import (
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/auth"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/domain"
|
||||
"epigas.gitea.cloud/RiskRancher/core/pkg/report"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/auth"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/domain"
|
||||
"code.riskrancher.com/RiskRancher/core/pkg/report"
|
||||
)
|
||||
|
||||
//go:embed templates/* templates/components/* static/*
|
||||
@@ -36,7 +36,11 @@ func SetVersionInfo(version, commit string) {
|
||||
}
|
||||
|
||||
func init() {
|
||||
funcMap := template.FuncMap{"lower": strings.ToLower}
|
||||
funcMap := template.FuncMap{
|
||||
"lower": strings.ToLower,
|
||||
"isProActive": func() bool { return false },
|
||||
"getCompanyName": func() string { return "" },
|
||||
}
|
||||
Pages = make(map[string]*template.Template)
|
||||
|
||||
var err error
|
||||
|
||||
Reference in New Issue
Block a user