Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 10 additions & 7 deletions cmd/certpicker/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@ import (
"encoding/json"
"flag"
"fmt"
"log"
"log/slog"
"net/http"
"strings"
"time"

"github.com/d-Rickyy-b/certstream-server-go/internal/certificatetransparency"
"github.com/d-Rickyy-b/certstream-server-go/internal/config"
"github.com/d-Rickyy-b/certstream-server-go/internal/logger"
"github.com/d-Rickyy-b/certstream-server-go/internal/models"

ct "github.com/google/certificate-transparency-go"
Expand All @@ -23,6 +24,8 @@ import (
var userAgent = fmt.Sprintf("Certstream v%s (github.com/d-Rickyy-b/certstream-server-go)", config.Version)

func main() {
logger.Init()

ctLogFlag := flag.String("log", "", "URL of the CT log - e.g. ct.googleapis.com/logs/eu1/xenon2025h2")
certIDFlag := flag.Int64("cert", 0, "ID of the certificate to fetch from the CT log")
chainFlag := flag.Bool("chain", false, "Include full chain for the certificate")
Expand All @@ -34,7 +37,7 @@ func main() {
certID := *certIDFlag

if ctLog == "" {
log.Fatalln("CT log URL is required")
logger.Fatal("CT log URL is required")
}

if !strings.HasPrefix(ctLog, "https://") {
Expand All @@ -57,29 +60,29 @@ func main() {

jsonClient, e := client.New(ctLog, &httpClient, jsonclient.Options{UserAgent: userAgent})
if e != nil {
log.Fatalln("Error creating JSON client:", e)
logger.Fatal("Error creating JSON client", "error", e)
}

entries, getEntryErr := getEntry(jsonClient, certID)
if getEntryErr != nil {
log.Fatalln("Error getting entry from CT log: ", getEntryErr)
logger.Fatal("Error getting entry from CT log", "error", getEntryErr)
}

// Loop over entries and pars each one.
for _, leafEntry := range entries.Entries {
rawLogEntry, err := ct.RawLogEntryFromLeaf(certID, &leafEntry)
if err != nil {
log.Fatalln("Error creating raw log entry: ", err)
logger.Fatal("Error creating raw log entry", "error", err)
}

entry, parseErr := certificatetransparency.ParseCertstreamEntry(rawLogEntry, "N/A", "N/A", ctLog, models.SourceIsRFC6962)
if parseErr != nil {
log.Fatalln("Error parsing certstream entry: ", parseErr)
logger.Fatal("Error parsing certstream entry", "error", parseErr)
}

// Check if the entry is a certificate or precertificate
if logEntry, toLogEntryErr := rawLogEntry.ToLogEntry(); toLogEntryErr != nil {
log.Println("Error converting rawLogEntry to logEntry: ", toLogEntryErr)
slog.Error("Error converting rawLogEntry to logEntry", "error", toLogEntryErr)
} else {
matcher := scanner.MatchAll{}
if logEntry.X509Cert != nil && matcher.CertificateMatches(logEntry.X509Cert) {
Expand Down
4 changes: 2 additions & 2 deletions cmd/certstream-server-go/createIndex.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@ package main

import (
"fmt"
"log"
"os"
"path/filepath"

"github.com/spf13/cobra"

"github.com/d-Rickyy-b/certstream-server-go/internal/certstream"
"github.com/d-Rickyy-b/certstream-server-go/internal/config"
"github.com/d-Rickyy-b/certstream-server-go/internal/logger"
)

// createIndexCmd represents the createIndex command.
Expand Down Expand Up @@ -62,7 +62,7 @@ create-index will create and pre fill the ct-index.json file with the current va

createErr := certstreamServer.CreateIndexFile(outFilePath)
if createErr != nil {
log.Fatalf("Error while creating index file: %v", createErr)
logger.Fatal("Error while creating index file", "error", createErr)
}

return nil
Expand Down
4 changes: 2 additions & 2 deletions cmd/certstream-server-go/main.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
package main

import (
"log"
"github.com/d-Rickyy-b/certstream-server-go/internal/logger"
)

// main is the entry point for the application.
func main() {
log.SetFlags(log.LstdFlags | log.Lshortfile)
logger.Init()
Execute()
}
4 changes: 2 additions & 2 deletions cmd/certstream-server-go/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ package main

import (
"fmt"
"log"
"os"

"github.com/spf13/cobra"

"github.com/d-Rickyy-b/certstream-server-go/internal/certstream"
"github.com/d-Rickyy-b/certstream-server-go/internal/config"
"github.com/d-Rickyy-b/certstream-server-go/internal/logger"
)

// rootCmd represents the base command when called without any subcommands.
Expand Down Expand Up @@ -44,7 +44,7 @@ certificate transparency logs via websocket connections to connected clients.`,

certstreamServer, err := certstream.NewCertstreamFromConfigFile(configPath)
if err != nil {
log.Fatalf("Error while creating certstream server: %v", err)
logger.Fatal("Error while creating certstream server", "error", err)
}

certstreamServer.Start()
Expand Down
6 changes: 3 additions & 3 deletions cmd/certstream-server-go/validate.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package main

import (
"fmt"
"log"
"log/slog"
"os"

"github.com/spf13/cobra"
Expand Down Expand Up @@ -40,10 +40,10 @@ This command deserializes the config and checks for errors.`,

readConfErr := config.ValidateConfig(configPath)
if readConfErr != nil {
log.Fatalln(readConfErr)
return readConfErr
}

log.Println("Config file is valid!")
slog.Info("Config file is valid")

return nil
},
Expand Down
8 changes: 4 additions & 4 deletions internal/certificatetransparency/ct-parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"encoding/hex"
"fmt"
"hash"
"log"
"log/slog"
"math/big"
"slices"
"strings"
Expand Down Expand Up @@ -48,7 +48,7 @@ func parseData(entry *ct.RawLogEntry, operatorName, logName, ctURL, logType stri
// Convert RawLogEntry to ct.LogEntry
logEntry, conversionErr := entry.ToLogEntry()
if conversionErr != nil {
log.Println("Could not convert entry to LogEntry: ", conversionErr)
slog.Error("Could not convert entry to LogEntry", "error", conversionErr)
return models.Data{}, fmt.Errorf("could not convert entry to logentry: %w", conversionErr)
}

Expand Down Expand Up @@ -92,7 +92,7 @@ func parseData(entry *ct.RawLogEntry, operatorName, logName, ctURL, logType stri

chain, parseErr := parseCertificateChain(logEntry)
if parseErr != nil {
log.Println("Could not parse certificate chain: ", parseErr)
slog.Error("Could not parse certificate chain", "error", parseErr)
return models.Data{}, parseErr
}

Expand Down Expand Up @@ -300,7 +300,7 @@ func parseName(input []string) *string {
func calculateHash(data []byte, certHasher hash.Hash) string {
_, e := certHasher.Write(data)
if e != nil {
log.Printf("Error while hashing cert: %s\n", e)
slog.Error("Error while hashing cert", "error", e)
return ""
}

Expand Down
8 changes: 4 additions & 4 deletions internal/certificatetransparency/ct-tiled.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
"context"
"fmt"
"io"
"log"
"log/slog"
"net/http"
"strconv"
"strings"
Expand Down Expand Up @@ -252,7 +252,7 @@ func (s *StaticCTClient) Monitor(ctx context.Context, foundCert func(*ct.RawLogE
for {
hadNewEntries, err := s.fetchAndProcessTiles(ctx, foundCert, foundPrecert)
if err != nil {
log.Printf("Error processing tiled log updates for '%s': %s\n", s.url, err)
slog.Error("Error processing tiled log updates", "url", s.url, "error", err)
return err
}

Expand Down Expand Up @@ -305,7 +305,7 @@ func (s *StaticCTClient) fetchAndProcessTiles(ctx context.Context, foundCert fun
partialSize := currentTreeSize % TileSize
if partialSize > 0 {
if err := s.processTile(ctx, endTile, partialSize, foundCert, foundPrecert); err != nil {
log.Printf("Warning: error processing partial tile %d: %s\n", endTile, err)
slog.Warn("Error processing partial tile", "tile", endTile, "error", err)
// Don't return error for partial tiles as they might be incomplete
}
}
Expand Down Expand Up @@ -342,7 +342,7 @@ func (s *StaticCTClient) processTile(ctx context.Context, tileIndex, partialWidt
case EntryTypePrecert:
foundPrecert(rawEntry)
default:
log.Printf("Unknown entry type %d in tile %d, skipping entry at index %d\n", leaf.EntryType, tileIndex, entryIndex)
slog.Warn("Unknown entry type in tile, skipping entry", "entry_type", leaf.EntryType, "tile", tileIndex, "index", entryIndex)
}

// Update the index
Expand Down
Loading