diff --git a/app/main.go b/app/main.go index 9dce3b80..510d17c4 100644 --- a/app/main.go +++ b/app/main.go @@ -34,6 +34,7 @@ var opts struct { MaxBackupFiles int `long:"max-back" env:"MAX_BACKUP_FILES" default:"10" description:"max backups to keep"` SessionStore string `long:"session" env:"SESSION_STORE" default:"./var" description:"path to session store directory"` + AvatarStore string `long:"avatars" env:"AVATAR_STORE" default:"./var/avatars" description:"path to avatars directory"` StoreKey string `long:"store-key" env:"STORE_KEY" default:"secure-store-key" description:"store key"` GoogleCID string `long:"google-cid" env:"REMARK_GOOGLE_CID" description:"Google OAuth client ID"` @@ -45,10 +46,8 @@ var opts struct { DisqusCID string `long:"disqus-cid" env:"REMARK_DISQUS_CID" description:"Disqus OAuth client ID"` DisqusCSEC string `long:"disqus-csec" env:"REMARK_DISQUS_CSEC" description:"Disqus OAuth client secret"` - AvatarStore string `long:"avatars" env:"AVATAR_STORE" default:"./var/avatars" description:"path to avatars directory"` - DefaultAvatar string `long:"avatar-def" env:"AVATAR_DEF" default:"remark.image" description:"default avatar"` - Port int `long:"port" env:"REMARK_PORT" default:"8080" description:"port"` - WebRoot string `long:"web-root" env:"REMARK_WEB_ROOT" default:"./web" description:"web root directory"` + Port int `long:"port" env:"REMARK_PORT" default:"8080" description:"port"` + WebRoot string `long:"web-root" env:"REMARK_WEB_ROOT" default:"./web" description:"web root directory"` } var revision = "unknown" diff --git a/app/rest/api/rest.go b/app/rest/api/rest.go index 67287a98..3e4aae08 100644 --- a/app/rest/api/rest.go +++ b/app/rest/api/rest.go @@ -50,10 +50,9 @@ func (s *Rest) Run(port int) { } s.amdminService = admin{ - dataService: s.DataService, - exporter: s.Exporter, - cache: s.Cache, - defAvatarURL: s.Authenticator.AvatarProxy.Default(), + dataService: s.DataService, + exporter: s.Exporter, + cache: s.Cache, } router := chi.NewRouter() diff --git a/app/rest/api/rest_test.go b/app/rest/api/rest_test.go index 714b6c9f..29ad7969 100644 --- a/app/rest/api/rest_test.go +++ b/app/rest/api/rest_test.go @@ -23,6 +23,7 @@ import ( "github.com/umputun/remark/app/store" ) + var testDb = "/tmp/test-remark.db" var testHTML = "/tmp/test-remark.html" diff --git a/app/rest/auth/avatar.go b/app/rest/auth/avatar.go index dea01442..e4a70c77 100644 --- a/app/rest/auth/avatar.go +++ b/app/rest/auth/avatar.go @@ -22,10 +22,9 @@ import ( // AvatarProxy provides avatar store and http handler for avatars type AvatarProxy struct { - StorePath string - DefaultAvatar string - RoutePath string - RemarkURL string + StorePath string + RoutePath string + RemarkURL string once sync.Once ctcTable *crc64.Table @@ -38,9 +37,6 @@ func (p *AvatarProxy) Put(u store.User) (avatarURL string, err error) { // no picture for user, try default avatar if u.Picture == "" { - if p.DefaultAvatar != "" { - return p.Default(), nil - } return "", errors.Errorf("no picture for %s", u.ID) } @@ -96,14 +92,8 @@ func (p *AvatarProxy) Routes() (string, chi.Router) { avFile := path.Join(location, avatar) fh, err := os.Open(avFile) if err != nil { - if p.DefaultAvatar == "" { - rest.SendErrorJSON(w, r, http.StatusBadRequest, err, "can't load avatar") - return - } - if fh, err = os.Open(path.Join(p.StorePath, p.DefaultAvatar)); err != nil { - rest.SendErrorJSON(w, r, http.StatusBadRequest, err, "can't load default avatar") - return - } + rest.SendErrorJSON(w, r, http.StatusBadRequest, err, "can't load avatar") + return } defer func() { @@ -124,11 +114,6 @@ func (p *AvatarProxy) Routes() (string, chi.Router) { return p.RoutePath, router } -// Default returns full default avatar url -func (p *AvatarProxy) Default() string { - return strings.TrimRight(p.RemarkURL, "/") + p.RoutePath + "/" + p.DefaultAvatar -} - // get location for user id by adding partion to final path in order to keep files // in different subdirectories and avoid too many files in a single place. // the end result is a full path like this - /tmp/avatars.test/92 diff --git a/app/rest/auth/avatar_test.go b/app/rest/auth/avatar_test.go index 42d7de79..71741cd8 100644 --- a/app/rest/auth/avatar_test.go +++ b/app/rest/auth/avatar_test.go @@ -4,7 +4,6 @@ import ( "bytes" "fmt" "io" - "io/ioutil" "net/http" "net/http/httptest" "os" @@ -48,20 +47,11 @@ func TestPut(t *testing.T) { assert.Equal(t, int64(21), fi.Size()) } -func TestPutDefault(t *testing.T) { - p := AvatarProxy{StorePath: "/tmp/avatars.test", RoutePath: "/avatar", DefaultAvatar: "default.image"} - os.MkdirAll("/tmp/avatars.test", 0700) - ioutil.WriteFile("/tmp/avatars.test/default.image", []byte("1234567890"), 0600) - defer os.RemoveAll("/tmp/avatars.test") - +func TestPutNoAvatar(t *testing.T) { + p := AvatarProxy{StorePath: "/tmp/avatars.test", RoutePath: "/avatar"} u := store.User{ID: "user1", Name: "user1 name"} - res, err := p.Put(u) - assert.NoError(t, err) - assert.Equal(t, "/avatar/default.image", res) - fi, err := os.Stat("/tmp/avatars.test/default.image") - assert.NoError(t, err) - assert.Equal(t, int64(10), fi.Size()) - + _, err := p.Put(u) + assert.Error(t, err) } func TestRoutes(t *testing.T) { @@ -76,7 +66,7 @@ func TestRoutes(t *testing.T) { })) defer ts.Close() - p := AvatarProxy{StorePath: "/tmp/avatars.test", RoutePath: "/avatar", DefaultAvatar: "default.image"} + p := AvatarProxy{StorePath: "/tmp/avatars.test", RoutePath: "/avatar"} os.MkdirAll("/tmp/avatars.test", 0700) defer os.RemoveAll("/tmp/avatars.test") @@ -103,34 +93,6 @@ func TestRoutes(t *testing.T) { assert.Equal(t, "some picture bin data", bb.String()) } -func TestRoutesDefault(t *testing.T) { - p := AvatarProxy{StorePath: "/tmp/avatars.test", RoutePath: "/avatar", DefaultAvatar: "default.image"} - os.MkdirAll("/tmp/avatars.test", 0700) - ioutil.WriteFile("/tmp/avatars.test/default.image", []byte("1234567890"), 0600) - defer os.RemoveAll("/tmp/avatars.test") - - u := store.User{ID: "user1", Name: "user1 name"} - _, err := p.Put(u) - assert.NoError(t, err) - - req, err := http.NewRequest("GET", "/no-such-thing.image", nil) - if err != nil { - t.Fatal(err) - } - - rr := httptest.NewRecorder() - _, routes := p.Routes() - handler := http.Handler(routes) - handler.ServeHTTP(rr, req) - - assert.Equal(t, http.StatusOK, rr.Code) - assert.Equal(t, http.Header{"Content-Type": []string{"image/*"}}, rr.HeaderMap) - bb := bytes.Buffer{} - sz, err := io.Copy(&bb, rr.Body) - assert.NoError(t, err) - assert.Equal(t, int64(10), sz) -} - func TestLocation(t *testing.T) { p := AvatarProxy{StorePath: "/tmp/avatars.test"}