This is an automated email from the ASF dual-hosted git repository.
linkinstar pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/answer.git
The following commit(s) were added to refs/heads/dev by this push:
new 0777291e fix(ui): null pointer access if get branding fails
0777291e is described below
commit 0777291e80c804cb836b5059d7e0fad5f2b7fe79
Author: ferhat elmas <[email protected]>
AuthorDate: Wed Nov 26 01:00:42 2025 +0100
fix(ui): null pointer access if get branding fails
Signed-off-by: ferhat elmas <[email protected]>
---
internal/router/ui.go | 6 ++---
internal/router/ui_test.go | 59 ++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 62 insertions(+), 3 deletions(-)
diff --git a/internal/router/ui.go b/internal/router/ui.go
index 0b5ee3f9..14f71f5f 100644
--- a/internal/router/ui.go
+++ b/internal/router/ui.go
@@ -22,7 +22,6 @@ package router
import (
"embed"
"fmt"
- "github.com/apache/answer/plugin"
"io/fs"
"net/http"
"os"
@@ -31,6 +30,7 @@ import (
"github.com/apache/answer/internal/controller"
"github.com/apache/answer/internal/service/siteinfo_common"
"github.com/apache/answer/pkg/htmltext"
+ "github.com/apache/answer/plugin"
"github.com/apache/answer/ui"
"github.com/gin-gonic/gin"
"github.com/segmentfault/pacman/log"
@@ -111,10 +111,10 @@ func (a *UIRouter) Register(r *gin.Engine, baseURLPath
string) {
if err != nil {
log.Error(err)
}
- if branding.Favicon != "" {
+ if branding != nil && branding.Favicon != "" {
c.String(http.StatusOK,
htmltext.GetPicByUrl(branding.Favicon))
return
- } else if branding.SquareIcon != "" {
+ } else if branding != nil && branding.SquareIcon != "" {
c.String(http.StatusOK,
htmltext.GetPicByUrl(branding.SquareIcon))
return
} else {
diff --git a/internal/router/ui_test.go b/internal/router/ui_test.go
new file mode 100644
index 00000000..64552933
--- /dev/null
+++ b/internal/router/ui_test.go
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package router
+
+import (
+ "errors"
+ "net/http"
+ "net/http/httptest"
+ "testing"
+
+ "github.com/apache/answer/internal/service/mock"
+ "github.com/gin-gonic/gin"
+ "github.com/stretchr/testify/assert"
+ "go.uber.org/mock/gomock"
+)
+
+func TestUIRouter_FaviconWithNilBranding(t *testing.T) {
+ ctrl := gomock.NewController(t)
+ defer ctrl.Finish()
+
+ mockSiteInfoService := mock.NewMockSiteInfoCommonService(ctrl)
+
+ // Simulate a database error
+ mockSiteInfoService.EXPECT().
+ GetSiteBranding(gomock.Any()).
+ Return(nil, errors.New("database connection failed"))
+
+ router := &UIRouter{
+ siteInfoService: mockSiteInfoService,
+ }
+
+ gin.SetMode(gin.TestMode)
+ r := gin.New()
+ router.Register(r, "")
+
+ req := httptest.NewRequest(http.MethodGet, "/favicon.ico", nil)
+ w := httptest.NewRecorder()
+
+ r.ServeHTTP(w, req)
+
+ assert.Equal(t, http.StatusOK, w.Code)
+}