Skip to content

Commit df06421

Browse files
committed
add meaningful error for lack of auth on import, remap and backup
Previously, the error printed was just the following: error response "401 Unauthorized", Unauthorized" New error: error response "401 Unauthorized", ensure you have set ADMIN_PASSWD and provided it to the command you're running: Unauthorized
1 parent b80d7ce commit df06421

File tree

5 files changed

+109
-0
lines changed

5 files changed

+109
-0
lines changed

backend/app/cmd/backup_test.go

+28
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package cmd
22

33
import (
4+
"encoding/base64"
45
"fmt"
56
"net/http"
67
"net/http/httptest"
78
"os"
9+
"strings"
810
"testing"
911

1012
"github.com/jessevdk/go-flags"
@@ -16,6 +18,10 @@ func TestBackup_Execute(t *testing.T) {
1618
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
1719
assert.Equal(t, r.URL.Path, "/api/v1/admin/export")
1820
assert.Equal(t, "GET", r.Method)
21+
t.Logf("Authorization header: %+v", r.Header.Get("Authorization"))
22+
auth, err := base64.StdEncoding.DecodeString(strings.Split(r.Header.Get("Authorization"), " ")[1])
23+
require.NoError(t, err)
24+
assert.Equal(t, "admin:secret", string(auth))
1925
fmt.Fprint(w, "blah\nblah2\n12345678\n")
2026
}))
2127
defer ts.Close()
@@ -34,6 +40,28 @@ func TestBackup_Execute(t *testing.T) {
3440
assert.Equal(t, "blah\nblah2\n12345678\n", string(data))
3541
}
3642

43+
func TestBackup_ExecuteNoPassword(t *testing.T) {
44+
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
45+
assert.Equal(t, r.URL.Path, "/api/v1/admin/export")
46+
assert.Equal(t, "GET", r.Method)
47+
t.Logf("Authorization: %+v", r.Header.Get("Authorization"))
48+
auth, err := base64.StdEncoding.DecodeString(strings.Split(r.Header.Get("Authorization"), " ")[1])
49+
require.NoError(t, err)
50+
require.Equal(t, "admin:", string(auth))
51+
w.WriteHeader(http.StatusUnauthorized)
52+
fmt.Fprint(w, "Unauthorized")
53+
}))
54+
defer ts.Close()
55+
56+
cmd := BackupCommand{}
57+
cmd.SetCommon(CommonOpts{RemarkURL: ts.URL})
58+
p := flags.NewParser(&cmd, flags.Default)
59+
_, err := p.ParseArgs([]string{"--site=remark", "--path=/tmp", "--file={{.SITE}}-test.export"})
60+
require.NoError(t, err)
61+
err = cmd.Execute(nil)
62+
assert.EqualError(t, err, "error response \"401 Unauthorized\", ensure you have set ADMIN_PASSWD and provided it to the command you're running: Unauthorized")
63+
}
64+
3765
func TestBackup_ExecuteFailedStatus(t *testing.T) {
3866
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
3967
assert.Equal(t, r.URL.Path, "/api/v1/admin/export")

backend/app/cmd/cmd.go

+3
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,9 @@ func responseError(resp *http.Response) error {
115115
if e != nil {
116116
body = []byte("")
117117
}
118+
if resp.StatusCode == http.StatusUnauthorized {
119+
return fmt.Errorf("error response %q, ensure you have set ADMIN_PASSWD and provided it to the command you're running: %s", resp.Status, body)
120+
}
118121
return fmt.Errorf("error response %q, %s", resp.Status, body)
119122
}
120123

backend/app/cmd/import_test.go

+42
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package cmd
22

33
import (
4+
"encoding/base64"
45
"fmt"
56
"io"
67
"net/http"
78
"net/http/httptest"
9+
"strings"
810
"testing"
911
"time"
1012

@@ -18,6 +20,10 @@ func TestImport_Execute(t *testing.T) {
1820
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
1921
assert.Equal(t, r.URL.Path, "/api/v1/admin/import")
2022
assert.Equal(t, "POST", r.Method)
23+
t.Logf("Authorization header: %+v", r.Header.Get("Authorization"))
24+
auth, err := base64.StdEncoding.DecodeString(strings.Split(r.Header.Get("Authorization"), " ")[1])
25+
require.NoError(t, err)
26+
assert.Equal(t, "admin:secret", string(auth))
2127
body, err := io.ReadAll(r.Body)
2228
assert.NoError(t, err)
2329
assert.Equal(t, "blah\nblah2\n12345678\n", string(body))
@@ -46,6 +52,42 @@ func TestImport_Execute(t *testing.T) {
4652
assert.NoError(t, err)
4753
}
4854

55+
func TestImport_ExecuteNoPassword(t *testing.T) {
56+
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
57+
assert.Equal(t, r.URL.Path, "/api/v1/admin/import")
58+
assert.Equal(t, "POST", r.Method)
59+
t.Logf("Authorization header: %+v", r.Header.Get("Authorization"))
60+
auth, err := base64.StdEncoding.DecodeString(strings.Split(r.Header.Get("Authorization"), " ")[1])
61+
require.NoError(t, err)
62+
assert.Equal(t, "admin:", string(auth))
63+
body, err := io.ReadAll(r.Body)
64+
assert.NoError(t, err)
65+
assert.Equal(t, "blah\nblah2\n12345678\n", string(body))
66+
67+
w.WriteHeader(401)
68+
fmt.Fprint(w, "Unauthorized")
69+
}))
70+
defer ts.Close()
71+
72+
cmd := ImportCommand{}
73+
cmd.SetCommon(CommonOpts{RemarkURL: ts.URL})
74+
75+
p := flags.NewParser(&cmd, flags.Default)
76+
_, err := p.ParseArgs([]string{"--site=remark", "--file=testdata/import.txt"})
77+
require.NoError(t, err)
78+
err = cmd.Execute(nil)
79+
assert.EqualError(t, err, "error response \"401 Unauthorized\", ensure you have set ADMIN_PASSWD and provided it to the command you're running: Unauthorized")
80+
81+
cmd = ImportCommand{}
82+
cmd.SetCommon(CommonOpts{RemarkURL: ts.URL})
83+
84+
p = flags.NewParser(&cmd, flags.Default)
85+
_, err = p.ParseArgs([]string{"--site=remark", "--file=testdata/import.txt.gz"})
86+
require.NoError(t, err)
87+
err = cmd.Execute(nil)
88+
assert.EqualError(t, err, "error response \"401 Unauthorized\", ensure you have set ADMIN_PASSWD and provided it to the command you're running: Unauthorized")
89+
}
90+
4991
func TestImport_ExecuteFailed(t *testing.T) {
5092
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
5193
assert.Equal(t, r.URL.Path, "/api/v1/admin/import")

backend/app/cmd/remap_test.go

+35
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package cmd
22

33
import (
4+
"encoding/base64"
5+
"fmt"
46
"io"
57
"net/http"
68
"net/http/httptest"
9+
"strings"
710
"testing"
811

912
"github.com/jessevdk/go-flags"
@@ -16,6 +19,10 @@ func TestRemap_Execute(t *testing.T) {
1619
assert.Equal(t, r.URL.Path, "/api/v1/admin/remap")
1720
assert.Equal(t, "POST", r.Method)
1821
assert.Equal(t, "remark", r.URL.Query().Get("site"))
22+
t.Logf("Authorization header: %+v", r.Header.Get("Authorization"))
23+
auth, err := base64.StdEncoding.DecodeString(strings.Split(r.Header.Get("Authorization"), " ")[1])
24+
require.NoError(t, err)
25+
assert.Equal(t, "admin:secret", string(auth))
1926
body, err := io.ReadAll(r.Body)
2027
assert.NoError(t, err)
2128
assert.Equal(t, "http://oldsite.com* https://newsite.com*\nhttp://oldsite.com/from-old-page/1 https://newsite.com/to-new-page/1", string(body))
@@ -33,3 +40,31 @@ func TestRemap_Execute(t *testing.T) {
3340
err = cmd.Execute(nil)
3441
assert.NoError(t, err)
3542
}
43+
44+
func TestRemap_ExecuteNoPassword(t *testing.T) {
45+
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
46+
assert.Equal(t, r.URL.Path, "/api/v1/admin/remap")
47+
assert.Equal(t, "POST", r.Method)
48+
assert.Equal(t, "remark", r.URL.Query().Get("site"))
49+
t.Logf("Authorization header: %+v", r.Header.Get("Authorization"))
50+
auth, err := base64.StdEncoding.DecodeString(strings.Split(r.Header.Get("Authorization"), " ")[1])
51+
require.NoError(t, err)
52+
assert.Equal(t, "admin:", string(auth))
53+
body, err := io.ReadAll(r.Body)
54+
assert.NoError(t, err)
55+
assert.Equal(t, "http://oldsite.com* https://newsite.com*\nhttp://oldsite.com/from-old-page/1 https://newsite.com/to-new-page/1", string(body))
56+
57+
w.WriteHeader(401)
58+
fmt.Fprint(w, "Unauthorized")
59+
}))
60+
defer ts.Close()
61+
62+
cmd := RemapCommand{}
63+
cmd.SetCommon(CommonOpts{RemarkURL: ts.URL})
64+
65+
p := flags.NewParser(&cmd, flags.Default)
66+
_, err := p.ParseArgs([]string{"--site=remark", "--file=testdata/remap_urls.txt"})
67+
require.NoError(t, err)
68+
err = cmd.Execute(nil)
69+
assert.EqualError(t, err, "error response \"401 Unauthorized\", ensure you have set ADMIN_PASSWD and provided it to the command you're running: Unauthorized")
70+
}

backend/app/rest/api/migrator_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,7 @@ func TestMigrator_Export(t *testing.T) {
397397
req.SetBasicAuth("admin", "password")
398398
resp, err = client.Do(req)
399399
require.NoError(t, err)
400+
resp.Body.Close()
400401
require.Equal(t, http.StatusInternalServerError, resp.StatusCode)
401402
require.Equal(t, "application/json", resp.Header.Get("Content-Type"))
402403

0 commit comments

Comments
 (0)