Received: from mail.netlandish.com (mail.netlandish.com [174.136.98.166]) by code.netlandish.com (Postfix) with ESMTP id 3EF1A111F for <~netlandish/links-dev@lists.code.netlandish.com>; Fri, 29 Aug 2025 13:26:48 +0000 (UTC) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=209.85.221.180; helo=mail-vk1-f180.google.com; envelope-from=peter@netlandish.com; receiver= Authentication-Results: mail.netlandish.com; dkim=pass (1024-bit key; unprotected) header.d=netlandish.com header.i=@netlandish.com header.b=VcJC5ttE Received: from mail-vk1-f180.google.com (mail-vk1-f180.google.com [209.85.221.180]) by mail.netlandish.com (Postfix) with ESMTP id 6B6EC1D642C for <~netlandish/links-dev@lists.code.netlandish.com>; Fri, 29 Aug 2025 13:27:45 +0000 (UTC) Received: by mail-vk1-f180.google.com with SMTP id 71dfb90a1353d-5449a71ff1fso45221e0c.1 for <~netlandish/links-dev@lists.code.netlandish.com>; Fri, 29 Aug 2025 06:27:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netlandish.com; s=google; t=1756474064; x=1757078864; darn=lists.code.netlandish.com; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=THbupN2F0HZ9e4KsA5pqBxWZNAU6b1es4yPXdDoxYHo=; b=VcJC5ttEhHR/+dwQcdT0laF5XN55DmLABfgfhlYIpmu9kf23+hwvduP74fEqxHKbBA hFhJklJQv4ivO/mykoQKQonfXxNaqqAD7Tmh5AIDEcJ808S8XlY82PW2c+WM/d7Z1uKE yZ0907+lngahsBQX0Y/72ZmjxnqXTUrAwGeNU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1756474064; x=1757078864; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=THbupN2F0HZ9e4KsA5pqBxWZNAU6b1es4yPXdDoxYHo=; b=gPHM5ZTL/VNSkAL5LYdr99mLuyhM4SHNPcg587Vt+43P9KL5c2FUSoZFE12LkKYn4C 2ALiNwPiTWC1bb4rsCI++AmipyojMNIAmyhu+g/N4QkbSHsnowFVB14zbTXi/62Nxiis mnMtzIcRIzpA4mc8ABrEEcxc/LXd6sNn75wKTTHC2Yf4TPyctkhaCkeH69rAMJNpEoj+ hq02KLF20AIFgowue+XOUW6s7P4dxeTKuf4Z7vUZEjJdBxhQTYSQoJyGSAeyulX2BkCk Gu9ikciLw34G6Y4Fk2DvXlLi+NBbrxv8GpIofoxfKGBN+27KEax3WZX7ZgPViDvy+9me 6f6w== X-Gm-Message-State: AOJu0YxLjnNBuiEw8KkW8wYJX0n9yOx0khiLDG4h6DqMJ2spdAWLzLQK XByyTFw8ajp/gT6hdANGgSvoco1XsOQTBE/mvJfzCNYpSolFIJ+f/JCEscQIitEt/KgDHA7OOK6 rWiNKZvs= X-Gm-Gg: ASbGncv6moOYINiSpcnLPQJJOLKkI6L30HzdbvvA0VUEZ/D2d/r4+jIxYEvQUiF1LR9 HqpdQfUNdC4iV2+z7JqhC+WSK3oSzOuv1vDpwLUKZPHosC18nATEUxAO6pypTgZHEuLNA20efJm VIPaU7ylBX8Y/lZlPVQJ5vowaH74mdVdZmhG6eIC4v58B8/dQ4I1cpRHXbuMu1Kz1F1Q9PWuOy4 YH+I8ocOggkF7ATJRW9XNpXmSLMH4IaZJGWyMRrkuWmseB9EHIcpwfHTcSrf974b+DqPl0UKNbc FRYSero6wDUd1A3IyOD9KjasVY9OntD1CjyXahF3wJ/aUTP8qsrinT7fV+jUYK791e9Yo79KQj/ 2Wr7bLP2L3OBpQcwajAvdLeyiW+R+fLGWVg== X-Google-Smtp-Source: AGHT+IHQW9BOKMPMSf0LaXzztyRUtoJDh36jD2wc885pjh+f8cRymj608XlAUWPvRon7ILQJNnSbRg== X-Received: by 2002:a05:6122:caa:b0:531:236f:1295 with SMTP id 71dfb90a1353d-53c8a2be6d8mr8200927e0c.5.1756474064316; Fri, 29 Aug 2025 06:27:44 -0700 (PDT) Received: from localhost ([2803:2d60:1107:87f:7a73:f96b:ede1:b448]) by smtp.gmail.com with UTF8SMTPSA id 71dfb90a1353d-544912c7d07sm890873e0c.4.2025.08.29.06.27.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 29 Aug 2025 06:27:43 -0700 (PDT) From: Peter Sanchez To: ~netlandish/links-dev@lists.code.netlandish.com Cc: Peter Sanchez Subject: [PATCH links] Fix panic when trying to render an error template. This panic is covering up other errors in edge cases. Date: Fri, 29 Aug 2025 07:27:40 -0600 Message-ID: <20250829132742.10487-1-peter@netlandish.com> X-Mailer: git-send-email 2.49.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Changelog-added: domains.SafeForContext for template handling. --- core/templates.go | 10 ++++++---- domain/middleware.go | 9 ++++++++- models/utils.go | 4 ++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/core/templates.go b/core/templates.go index 6b7de02..a6e32ea 100644 --- a/core/templates.go +++ b/core/templates.go @@ -68,10 +68,12 @@ func AddGlobalTmpl(c echo.Context) gobwebs.Map { gmap["settingSection"] = true } - dom := domain.ForContext(c.Request().Context()) - if dom.Level == models.DomainLevelUser && dom.OrgID.Valid { - gmap["isUserDomain"] = true - gmap["hideNav"] = true + dom := domain.SafeForContext(c.Request().Context()) + if dom != nil { + if dom.Level == models.DomainLevelUser && dom.OrgID.Valid { + gmap["isUserDomain"] = true + gmap["hideNav"] = true + } } if gctx.User != nil && gctx.User.IsAuthenticated() { diff --git a/domain/middleware.go b/domain/middleware.go index 5400dd3..261ce4b 100644 --- a/domain/middleware.go +++ b/domain/middleware.go @@ -33,6 +33,13 @@ func ForContext(ctx context.Context) *models.Domain { return domain } +// SafeForContext fetches current domain from the request context +// Returns nil if domain is not found in context (safe for use in templates/error handlers) +func SafeForContext(ctx context.Context) *models.Domain { + domain, _ := ctx.Value(domainCtxKey).(*models.Domain) + return domain +} + func badDomainRedirect(c echo.Context, d string) error { gctx := c.(*server.Context) mainDomain, ok := gctx.Server.Config.File.Get("links", "links-service-domain") @@ -141,7 +148,7 @@ func DomainRedirect(next echo.HandlerFunc) echo.HandlerFunc { // Remove :PORT if present host := strings.SplitN(mainDomain, ":", 2)[0] domain := ForContext(c.Request().Context()) - if strings.ToLower(domain.LookupName) != strings.ToLower(host) && + if strings.EqualFold(domain.LookupName, host) && domain.Level == models.DomainLevelSystem { // XXX Populate this from links.InvalidSlugs or better yet, c.Echo().Routes() redirectPaths := []redir{ diff --git a/models/utils.go b/models/utils.go index d4a6dfc..2859806 100644 --- a/models/utils.go +++ b/models/utils.go @@ -5,7 +5,7 @@ import ( "database/sql" "encoding/json" "fmt" - mrand "math/rand" + "math/rand" "strings" "time" @@ -15,7 +15,7 @@ import ( func getShortCode(ctx context.Context, tx *sql.Tx, table, field string, filter sq.Sqlizer) (string, error) { chars := "abcdefghijkmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ0123456789" - r := mrand.New(mrand.NewSource(time.Now().UnixNano())) + r := rand.New(rand.NewSource(time.Now().UnixNano())) codelen := 4 code := make([]byte, codelen) -- 2.49.1