diff --git a/backend/app/cmd/server.go b/backend/app/cmd/server.go index 473931d1..7ad4e2b4 100644 --- a/backend/app/cmd/server.go +++ b/backend/app/cmd/server.go @@ -509,7 +509,7 @@ func (s *ServerCommand) makeAdminStore() (admin.Store, error) { s.Admin.Shared.Email = "admin@" + u.Host } } - return admin.NewStaticStore(s.SharedSecret, s.Admin.Shared.Admins, s.Admin.Shared.Email), nil + return admin.NewStaticStore(s.SharedSecret, s.Sites, s.Admin.Shared.Admins, s.Admin.Shared.Email), nil case "rpc": r := &admin.RPC{Client: jrpc.Client{ API: s.Admin.RPC.API, @@ -695,6 +695,9 @@ func (s *ServerCommand) makeAuthenticator(ds *service.DataStore, avas avatar.Sto if claims.User == nil { return false } + if claims.User.Audience == "" { // reject empty aud, made with old (pre 0.8.x) version of auth package + return false + } return !claims.User.BoolAttr("blocked") }), JWTQuery: "jwt", // change default from "token" as it used for deleteme diff --git a/backend/app/cmd/server_test.go b/backend/app/cmd/server_test.go index bd3b6f79..b42e42af 100644 --- a/backend/app/cmd/server_test.go +++ b/backend/app/cmd/server_test.go @@ -388,6 +388,23 @@ func TestServerAuthHooks(t *testing.T) { defer resp.Body.Close() assert.Equal(t, http.StatusCreated, resp.StatusCode, "non-blocked user able to post") + time.Sleep(1200 * time.Millisecond) // prevent limiter to be triggered + // add comment with no-aud claim + claimsNoAud := claims + claims.Audience = "" + tkNoAud, err := tkService.Token(claimsNoAud) + require.NoError(t, err) + t.Log(tkNoAud) + req, err = http.NewRequest("POST", fmt.Sprintf("http://localhost:%d/api/v1/comment", port), + strings.NewReader(`{"text": "test 123", "locator":{"url": "https://radio-t.com/p/2018/12/29/podcast-631/", +"site": "remark"}}`)) + require.NoError(t, err) + req.Header.Set("X-JWT", tkNoAud) + resp, err = client.Do(req) + require.NoError(t, err) + defer resp.Body.Close() + assert.Equal(t, http.StatusUnauthorized, resp.StatusCode, "user without aud claim rejected") + // block user dev as admin req, e := http.NewRequest(http.MethodPut, fmt.Sprintf("http://localhost:%d/api/v1/admin/user/dev?site=remark&block=1&ttl=10d", port), nil) @@ -401,8 +418,6 @@ func TestServerAuthHooks(t *testing.T) { require.Nil(t, err) t.Log(string(b)) - time.Sleep(2 * time.Second) // make sure token expired and refresh happened - // try add a comment with blocked user req, err = http.NewRequest("POST", fmt.Sprintf("http://localhost:%d/api/v1/comment", port), strings.NewReader(`{"text": "test 123 blah", "locator":{"url": "https://radio-t.com/blah1", "site": "remark"}}`)) @@ -435,6 +450,7 @@ func prepServerApp(t *testing.T, duration time.Duration, fn func(o ServerCommand cmd.Notify.Type = "telegram" cmd.Notify.Telegram.API = "http://127.0.0.1:12340/" cmd.Notify.Telegram.Token = "blah" + cmd.UpdateLimit = 10 cmd = fn(cmd) os.Remove(cmd.Store.Bolt.Path + "/remark.db") diff --git a/backend/app/migrator/disqus_test.go b/backend/app/migrator/disqus_test.go index 5394e3f3..a7d6b073 100644 --- a/backend/app/migrator/disqus_test.go +++ b/backend/app/migrator/disqus_test.go @@ -20,7 +20,7 @@ func TestDisqus_Import(t *testing.T) { defer os.Remove("/tmp/remark-test.db") b, err := engine.NewBoltDB(bolt.Options{}, engine.BoltSite{FileName: "/tmp/remark-test.db", SiteID: "test"}) require.Nil(t, err, "create store") - dataStore := service.DataStore{Engine: b, AdminStore: admin.NewStaticStore("12345", []string{}, "")} + dataStore := service.DataStore{Engine: b, AdminStore: admin.NewStaticStore("12345", nil, []string{}, "")} d := Disqus{DataStore: &dataStore} size, err := d.Import(strings.NewReader(xmlTestDisqus), "test") assert.Nil(t, err) diff --git a/backend/app/migrator/migrator_test.go b/backend/app/migrator/migrator_test.go index 4a2151e2..c9b8b897 100644 --- a/backend/app/migrator/migrator_test.go +++ b/backend/app/migrator/migrator_test.go @@ -27,7 +27,7 @@ func TestMigrator_ImportDisqus(t *testing.T) { b, err := engine.NewBoltDB(bolt.Options{}, engine.BoltSite{FileName: "/tmp/remark-test.db", SiteID: "test"}) require.Nil(t, err, "create store") - dataStore := &service.DataStore{Engine: b, AdminStore: admin.NewStaticStore("12345", []string{}, "")} + dataStore := &service.DataStore{Engine: b, AdminStore: admin.NewStaticStore("12345", nil, []string{}, "")} size, err := ImportComments(ImportParams{ DataStore: dataStore, InputFile: "/tmp/disqus-test.xml", @@ -53,7 +53,7 @@ func TestMigrator_ImportWordPress(t *testing.T) { b, err := engine.NewBoltDB(bolt.Options{}, engine.BoltSite{FileName: "/tmp/remark-test.db", SiteID: "test"}) require.Nil(t, err, "create store") - dataStore := &service.DataStore{Engine: b, AdminStore: admin.NewStaticStore("12345", []string{}, "")} + dataStore := &service.DataStore{Engine: b, AdminStore: admin.NewStaticStore("12345", nil, []string{}, "")} size, err := ImportComments(ImportParams{ DataStore: dataStore, InputFile: "/tmp/wordpress-test.xml", @@ -82,7 +82,7 @@ func TestMigrator_ImportNative(t *testing.T) { b, err := engine.NewBoltDB(bolt.Options{}, engine.BoltSite{FileName: "/tmp/remark-test.db", SiteID: "radio-t"}) require.Nil(t, err, "create store") - dataStore := &service.DataStore{Engine: b, AdminStore: admin.NewStaticStore("12345", []string{}, "")} + dataStore := &service.DataStore{Engine: b, AdminStore: admin.NewStaticStore("12345", nil, []string{}, "")} size, err := ImportComments(ImportParams{ DataStore: dataStore, diff --git a/backend/app/migrator/native_test.go b/backend/app/migrator/native_test.go index 63e3d591..280d7f63 100644 --- a/backend/app/migrator/native_test.go +++ b/backend/app/migrator/native_test.go @@ -77,7 +77,7 @@ func TestNative_Import(t *testing.T) { {"id":"f863bd79-fec6-4a75-b308-61fe5dd02aa1","pid":"1234","text":"some text2","user":{"name":"user name","id":"user2","picture":"","ip":"293ec5b0cf154855258824ec7fac5dc63d176915","admin":false},"locator":{"site":"radio-t","url":"https://radio-t.com/2"},"score":0,"votes":{},"time":"2017-12-20T15:18:23-06:00"}` b := prep(t) // write some recs - b.AdminStore = admin.NewStaticStore("12345", []string{}, "") + b.AdminStore = admin.NewStaticStore("12345", nil, []string{}, "") r := Native{DataStore: b} size, err := r.Import(strings.NewReader(inp), "radio-t") assert.Nil(t, err) @@ -107,7 +107,7 @@ func TestNative_ImportWrongVersion(t *testing.T) { {"id":"f863bd79-fec6-4a75-b308-61fe5dd02aa1","pid":"1234","text":"some text2","user":{"name":"user name","id":"user2","picture":"","ip":"293ec5b0cf154855258824ec7fac5dc63d176915","admin":false},"locator":{"site":"radio-t","url":"https://radio-t.com/2"},"score":0,"votes":{},"time":"2017-12-20T15:18:23-06:00"}` b := prep(t) // write some recs - b.AdminStore = admin.NewStaticStore("12345", []string{}, "") + b.AdminStore = admin.NewStaticStore("12345", nil, []string{}, "") r := Native{DataStore: b} size, err := r.Import(strings.NewReader(inp), "radio-t") assert.EqualError(t, err, "unexpected import file version 2") @@ -128,7 +128,7 @@ func TestNative_ImportManyWithError(t *testing.T) { buf.WriteString("{}\n") b := prep(t) // write some recs - b.AdminStore = admin.NewStaticStore("12345", []string{}, "") + b.AdminStore = admin.NewStaticStore("12345", nil, []string{}, "") r := Native{DataStore: b} n, err := r.Import(buf, "radio-t") assert.EqualError(t, err, "failed to save 2 comments") @@ -145,7 +145,7 @@ func prep(t *testing.T) *service.DataStore { boltStore, err := engine.NewBoltDB(bolt.Options{}, engine.BoltSite{SiteID: "radio-t", FileName: testDb}) assert.Nil(t, err) - b := &service.DataStore{Engine: boltStore, AdminStore: admin.NewStaticStore("12345", []string{}, "")} + b := &service.DataStore{Engine: boltStore, AdminStore: admin.NewStaticStore("12345", nil, []string{}, "")} comment := store.Comment{ ID: "efbc17f177ee1a1c0ee6e1e025749966ec071adc", diff --git a/backend/app/migrator/wordpress_test.go b/backend/app/migrator/wordpress_test.go index a229b6cb..4ce8b442 100644 --- a/backend/app/migrator/wordpress_test.go +++ b/backend/app/migrator/wordpress_test.go @@ -21,7 +21,7 @@ func TestWordPress_Import(t *testing.T) { b, err := engine.NewBoltDB(bolt.Options{}, engine.BoltSite{FileName: "/tmp/remark-test.db", SiteID: siteID}) assert.Nil(t, err, "create store") - dataStore := service.DataStore{Engine: b, AdminStore: admin.NewStaticStore("12345", []string{}, "")} + dataStore := service.DataStore{Engine: b, AdminStore: admin.NewStaticStore("12345", nil, []string{}, "")} wp := WordPress{DataStore: &dataStore} size, err := wp.Import(strings.NewReader(xmlTestWP), siteID) assert.Nil(t, err) diff --git a/backend/app/rest/api/admin_test.go b/backend/app/rest/api/admin_test.go index 436d3a15..ea364178 100644 --- a/backend/app/rest/api/admin_test.go +++ b/backend/app/rest/api/admin_test.go @@ -30,15 +30,15 @@ func TestAdmin_Delete(t *testing.T) { defer teardown() c1 := store.Comment{Text: "test test #1", User: store.User{ID: "id", Name: "name"}, - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}} c2 := store.Comment{Text: "test test #2", User: store.User{ID: "id", Name: "name"}, ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}} id1 := addComment(t, c1, ts) addComment(t, c2, ts) // check last comments - res, code := get(t, ts.URL+"/api/v1/last/2?site=radio-t") + res, code := get(t, ts.URL+"/api/v1/last/2?site=remark42") assert.Equal(t, 200, code) comments := []store.Comment{} err := json.Unmarshal([]byte(res), &comments) @@ -46,7 +46,7 @@ func TestAdmin_Delete(t *testing.T) { assert.Equal(t, 2, len(comments), "should have 2 comments") // check multi count - resp, err := post(t, ts.URL+"/api/v1/counts?site=radio-t", `["https://radio-t.com/blah","https://radio-t.com/blah2"]`) + resp, err := post(t, ts.URL+"/api/v1/counts?site=remark42", `["https://radio-t.com/blah","https://radio-t.com/blah2"]`) assert.Nil(t, err) assert.Equal(t, http.StatusOK, resp.StatusCode) bb, err := ioutil.ReadAll(resp.Body) @@ -59,14 +59,14 @@ func TestAdmin_Delete(t *testing.T) { // delete a comment req, err := http.NewRequest(http.MethodDelete, - fmt.Sprintf("%s/api/v1/admin/comment/%s?site=radio-t&url=https://radio-t.com/blah", ts.URL, id1), nil) + fmt.Sprintf("%s/api/v1/admin/comment/%s?site=remark42&url=https://radio-t.com/blah", ts.URL, id1), nil) assert.Nil(t, err) requireAdminOnly(t, req) resp, err = sendReq(t, req, adminUmputunToken) assert.Nil(t, err) assert.Equal(t, 200, resp.StatusCode) - body, code := getWithDevAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=radio-t&url=https://radio-t.com/blah", ts.URL, id1)) + body, code := getWithDevAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=remark42&url=https://radio-t.com/blah", ts.URL, id1)) assert.Equal(t, 200, code) cr := store.Comment{} err = json.Unmarshal([]byte(body), &cr) @@ -76,7 +76,7 @@ func TestAdmin_Delete(t *testing.T) { time.Sleep(250 * time.Millisecond) // check last comments updated - res, code = get(t, ts.URL+"/api/v1/last/2?site=radio-t") + res, code = get(t, ts.URL+"/api/v1/last/2?site=remark42") assert.Equal(t, 200, code) comments = []store.Comment{} err = json.Unmarshal([]byte(res), &comments) @@ -84,7 +84,7 @@ func TestAdmin_Delete(t *testing.T) { assert.Equal(t, 1, len(comments), "should have 1 comments") // check count updated - res, code = get(t, ts.URL+"/api/v1/count?site=radio-t&url=https://radio-t.com/blah") + res, code = get(t, ts.URL+"/api/v1/count?site=remark42&url=https://radio-t.com/blah") assert.Equal(t, 200, code) b := map[string]interface{}{} err = json.Unmarshal([]byte(res), &b) @@ -93,7 +93,7 @@ func TestAdmin_Delete(t *testing.T) { assert.Equal(t, 1.0, b["count"], "should report 1 comments") // check multi count updated - resp, err = post(t, ts.URL+"/api/v1/counts?site=radio-t", `["https://radio-t.com/blah","https://radio-t.com/blah2"]`) + resp, err = post(t, ts.URL+"/api/v1/counts?site=remark42", `["https://radio-t.com/blah","https://radio-t.com/blah2"]`) assert.Nil(t, err) assert.Equal(t, http.StatusOK, resp.StatusCode) bb, err = ioutil.ReadAll(resp.Body) @@ -126,22 +126,22 @@ func TestAdmin_Title(t *testing.T) { defer tss.Close() c1 := store.Comment{Text: "test test #1", User: store.User{ID: "id", Name: "name"}, - Locator: store.Locator{SiteID: "radio-t", URL: tss.URL + "/post1"}} + Locator: store.Locator{SiteID: "remark42", URL: tss.URL + "/post1"}} c2 := store.Comment{Text: "test test #2", User: store.User{ID: "id", Name: "name"}, ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: tss.URL + "/post2"}} + Locator: store.Locator{SiteID: "remark42", URL: tss.URL + "/post2"}} id1 := addComment(t, c1, ts) addComment(t, c2, ts) req, err := http.NewRequest(http.MethodPut, - fmt.Sprintf("%s/api/v1/admin/title/%s?site=radio-t&url=%s/post1", ts.URL, id1, tss.URL), nil) + fmt.Sprintf("%s/api/v1/admin/title/%s?site=remark42&url=%s/post1", ts.URL, id1, tss.URL), nil) assert.Nil(t, err) requireAdminOnly(t, req) resp, err := sendReq(t, req, adminUmputunToken) require.NoError(t, err) assert.Equal(t, 200, resp.StatusCode) - body, code := get(t, fmt.Sprintf("%s/api/v1/id/%s?site=radio-t&url=%s/post1", ts.URL, id1, tss.URL)) + body, code := get(t, fmt.Sprintf("%s/api/v1/id/%s?site=remark42&url=%s/post1", ts.URL, id1, tss.URL)) require.Equal(t, 200, code) cr := store.Comment{} err = json.Unmarshal([]byte(body), &cr) @@ -154,11 +154,11 @@ func TestAdmin_DeleteUser(t *testing.T) { defer teardown() c1 := store.Comment{Text: "test test #1", Orig: "o test test #1", User: store.User{ID: "id1", Name: "name"}, - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}} c2 := store.Comment{Text: "test test #2", Orig: "o test test #2", User: store.User{ID: "id2", Name: "name"}, ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}} c3 := store.Comment{Text: "test test #3", Orig: "o test test #3", User: store.User{ID: "id2", Name: "name"}, ParentID: "", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}} // write comments directly to store to keep user id id1, err := srv.DataService.Create(c1) @@ -168,7 +168,7 @@ func TestAdmin_DeleteUser(t *testing.T) { _, err = srv.DataService.Create(c3) assert.NoError(t, err) - req, err := http.NewRequest(http.MethodDelete, fmt.Sprintf("%s/api/v1/admin/user/%s?site=radio-t", ts.URL, "id2"), nil) + req, err := http.NewRequest(http.MethodDelete, fmt.Sprintf("%s/api/v1/admin/user/%s?site=remark42", ts.URL, "id2"), nil) assert.Nil(t, err) requireAdminOnly(t, req) resp, err := sendReq(t, req, adminUmputunToken) @@ -176,7 +176,7 @@ func TestAdmin_DeleteUser(t *testing.T) { assert.Equal(t, 200, resp.StatusCode) // all 3 comments here, but for id2 they deleted - res, code := get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah&sort=+time") + res, code := get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah&sort=+time") assert.Equal(t, 200, code) cmntWithInfo := commentsWithInfo{} err = json.Unmarshal([]byte(res), &cmntWithInfo) @@ -206,9 +206,9 @@ func TestAdmin_Pin(t *testing.T) { defer teardown() c1 := store.Comment{Text: "test test #1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}} c2 := store.Comment{Text: "test test #2", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}} id1 := addComment(t, c1, ts) addComment(t, c2, ts) @@ -216,7 +216,7 @@ func TestAdmin_Pin(t *testing.T) { pin := func(val int) int { client := http.Client{} req, err := http.NewRequest(http.MethodPut, - fmt.Sprintf("%s/api/v1/admin/pin/%s?site=radio-t&url=https://radio-t.com/blah&pin=%d", ts.URL, id1, val), nil) + fmt.Sprintf("%s/api/v1/admin/pin/%s?site=remark42&url=https://radio-t.com/blah&pin=%d", ts.URL, id1, val), nil) assert.Nil(t, err) requireAdminOnly(t, req) req.SetBasicAuth("admin", "password") @@ -228,7 +228,7 @@ func TestAdmin_Pin(t *testing.T) { code := pin(1) assert.Equal(t, 200, code) - body, code := get(t, fmt.Sprintf("%s/api/v1/id/%s?site=radio-t&url=https://radio-t.com/blah", ts.URL, id1)) + body, code := get(t, fmt.Sprintf("%s/api/v1/id/%s?site=remark42&url=https://radio-t.com/blah", ts.URL, id1)) assert.Equal(t, 200, code) cr := store.Comment{} err := json.Unmarshal([]byte(body), &cr) @@ -237,7 +237,7 @@ func TestAdmin_Pin(t *testing.T) { code = pin(-1) assert.Equal(t, 200, code) - body, code = get(t, fmt.Sprintf("%s/api/v1/id/%s?site=radio-t&url=https://radio-t.com/blah", ts.URL, id1)) + body, code = get(t, fmt.Sprintf("%s/api/v1/id/%s?site=remark42&url=https://radio-t.com/blah", ts.URL, id1)) assert.Equal(t, 200, code) cr = store.Comment{} err = json.Unmarshal([]byte(body), &cr) @@ -250,9 +250,9 @@ func TestAdmin_Block(t *testing.T) { defer teardown() makeTwoComments := func() { - c1 := store.Comment{Text: "test test #1", Locator: store.Locator{SiteID: "radio-t", + c1 := store.Comment{Text: "test test #1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, User: store.User{Name: "user1 name", ID: "user1"}} - c2 := store.Comment{Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "radio-t", + c2 := store.Comment{Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, User: store.User{Name: "user2", ID: "user2"}} _, err := srv.DataService.Create(c1) @@ -262,7 +262,7 @@ func TestAdmin_Block(t *testing.T) { } block := func(val int, ttl string) (code int, body []byte) { - url := fmt.Sprintf("%s/api/v1/admin/user/%s?site=radio-t&block=%d", ts.URL, "user1", val) + url := fmt.Sprintf("%s/api/v1/admin/user/%s?site=remark42&block=%d", ts.URL, "user1", val) if ttl != "" { url = url + "&ttl=" + ttl } @@ -287,20 +287,20 @@ func TestAdmin_Block(t *testing.T) { assert.Nil(t, err) assert.Equal(t, "user1", j["user_id"]) assert.Equal(t, true, j["block"]) - assert.Equal(t, "radio-t", j["site_id"]) + assert.Equal(t, "remark42", j["site_id"]) - assert.True(t, srv.adminRest.dataService.IsBlocked("radio-t", "user1")) - assert.False(t, srv.adminRest.dataService.IsBlocked("radio-t", "user2")) + assert.True(t, srv.adminRest.dataService.IsBlocked("remark42", "user1")) + assert.False(t, srv.adminRest.dataService.IsBlocked("remark42", "user2")) // get last to confirm one comment deleted - bodyStr, code := get(t, ts.URL+"/api/v1/last/10?site=radio-t") + bodyStr, code := get(t, ts.URL+"/api/v1/last/10?site=remark42") assert.Equal(t, 200, code) pi := []store.PostInfo{} assert.NoError(t, json.Unmarshal([]byte(bodyStr), &pi)) assert.Equal(t, 1, len(pi), "last status updated, one comment left") // check if count call has one comment left - resp, err := post(t, ts.URL+"/api/v1/counts?site=radio-t", `["https://radio-t.com/blah"]`) + resp, err := post(t, ts.URL+"/api/v1/counts?site=remark42", `["https://radio-t.com/blah"]`) assert.Nil(t, err) assert.Equal(t, http.StatusOK, resp.StatusCode) body, err = ioutil.ReadAll(resp.Body) @@ -310,7 +310,7 @@ func TestAdmin_Block(t *testing.T) { assert.NoError(t, err) assert.Equal(t, []store.PostInfo([]store.PostInfo{{URL: "https://radio-t.com/blah", Count: 1}}), pi) - res, code := get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah&sort=+time") + res, code := get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah&sort=+time") assert.Equal(t, 200, code) comments := commentsWithInfo{} err = json.Unmarshal([]byte(res), &comments) @@ -332,7 +332,7 @@ func TestAdmin_Block(t *testing.T) { require.Equal(t, 200, code) // get as regular user - res, code = get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah&sort=+time") + res, code = get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah&sort=+time") assert.Equal(t, 200, code) comments = commentsWithInfo{} err = json.Unmarshal([]byte(res), &comments) @@ -343,7 +343,7 @@ func TestAdmin_Block(t *testing.T) { srv.pubRest.cache = &cache.Nop{} // TODO: with lru cache it won't be refreshed and invalidated for long time time.Sleep(50 * time.Millisecond) - res, code = get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah&sort=+time") + res, code = get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah&sort=+time") assert.Equal(t, 200, code) comments = commentsWithInfo{} err = json.Unmarshal([]byte(res), &comments) @@ -352,17 +352,17 @@ func TestAdmin_Block(t *testing.T) { assert.Equal(t, "test test #1", comments.Comments[2].Text, "restored") assert.False(t, comments.Comments[2].Deleted) - assert.False(t, srv.adminRest.dataService.IsBlocked("radio-t", "user1")) - assert.False(t, srv.adminRest.dataService.IsBlocked("radio-t", "user2")) + assert.False(t, srv.adminRest.dataService.IsBlocked("remark42", "user1")) + assert.False(t, srv.adminRest.dataService.IsBlocked("remark42", "user2")) } func TestAdmin_BlockedList(t *testing.T) { ts, srv, teardown := startupT(t) defer teardown() - c1 := store.Comment{Text: "test test #1", Locator: store.Locator{SiteID: "radio-t", + c1 := store.Comment{Text: "test test #1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, User: store.User{Name: "user1 name", ID: "user1"}} - c2 := store.Comment{Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "radio-t", + c2 := store.Comment{Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, User: store.User{Name: "user2 name", ID: "user2"}} // write comments for user1 and user2 @@ -373,7 +373,7 @@ func TestAdmin_BlockedList(t *testing.T) { // block user1 req, err := http.NewRequest(http.MethodPut, - fmt.Sprintf("%s/api/v1/admin/user/%s?site=radio-t&block=%d", ts.URL, "user1", 1), nil) + fmt.Sprintf("%s/api/v1/admin/user/%s?site=remark42&block=%d", ts.URL, "user1", 1), nil) assert.Nil(t, err) res, err := sendReq(t, req, adminUmputunToken) require.NoError(t, err) @@ -381,13 +381,13 @@ func TestAdmin_BlockedList(t *testing.T) { // block user2 req, err = http.NewRequest(http.MethodPut, - fmt.Sprintf("%s/api/v1/admin/user/%s?site=radio-t&block=%d&ttl=50ms", ts.URL, "user2", 1), nil) + fmt.Sprintf("%s/api/v1/admin/user/%s?site=remark42&block=%d&ttl=50ms", ts.URL, "user2", 1), nil) assert.Nil(t, err) res, err = sendReq(t, req, adminUmputunToken) require.NoError(t, err) assert.Equal(t, 200, res.StatusCode) - req, err = http.NewRequest("GET", ts.URL+"/api/v1/admin/blocked?site=radio-t", nil) + req, err = http.NewRequest("GET", ts.URL+"/api/v1/admin/blocked?site=remark42", nil) require.NoError(t, err) res, err = sendReq(t, req, adminUmputunToken) require.NoError(t, err) @@ -403,7 +403,7 @@ func TestAdmin_BlockedList(t *testing.T) { t.Logf("%+v", users) time.Sleep(50 * time.Millisecond) - req, err = http.NewRequest("GET", ts.URL+"/api/v1/admin/blocked?site=radio-t", nil) + req, err = http.NewRequest("GET", ts.URL+"/api/v1/admin/blocked?site=remark42", nil) require.NoError(t, err) res, err = sendReq(t, req, adminUmputunToken) require.NoError(t, err) @@ -418,9 +418,9 @@ func TestAdmin_ReadOnly(t *testing.T) { ts, srv, teardown := startupT(t) defer teardown() - c1 := store.Comment{Text: "test test #1", Locator: store.Locator{SiteID: "radio-t", + c1 := store.Comment{Text: "test test #1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, User: store.User{Name: "user1 name", ID: "user1"}} - c2 := store.Comment{Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "radio-t", + c2 := store.Comment{Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, User: store.User{Name: "user2", ID: "user2"}} _, err := srv.DataService.Create(c1) @@ -428,13 +428,13 @@ func TestAdmin_ReadOnly(t *testing.T) { _, err = srv.DataService.Create(c2) assert.Nil(t, err) - info, err := srv.DataService.Info(store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}, 0) + info, err := srv.DataService.Info(store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, 0) assert.Nil(t, err) assert.False(t, info.ReadOnly) // set post to read-only req, err := http.NewRequest(http.MethodPut, - fmt.Sprintf("%s/api/v1/admin/readonly?site=radio-t&url=https://radio-t.com/blah&ro=1", ts.URL), nil) + fmt.Sprintf("%s/api/v1/admin/readonly?site=remark42&url=https://radio-t.com/blah&ro=1", ts.URL), nil) assert.Nil(t, err) resp, err := sendReq(t, req, "") // non-admin user require.NoError(t, err) @@ -442,13 +442,13 @@ func TestAdmin_ReadOnly(t *testing.T) { resp, err = sendReq(t, req, adminUmputunToken) require.NoError(t, err) assert.Equal(t, 200, resp.StatusCode) - info, err = srv.DataService.Info(store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}, 0) + info, err = srv.DataService.Info(store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, 0) assert.Nil(t, err) assert.True(t, info.ReadOnly) // try to write comment c := store.Comment{Text: "test test #2", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}} b, err := json.Marshal(c) assert.Nil(t, err, "can't marshal comment %+v", c) req, err = http.NewRequest("POST", ts.URL+"/api/v1/comment", bytes.NewBuffer(b)) @@ -459,18 +459,18 @@ func TestAdmin_ReadOnly(t *testing.T) { // reset post's read-only req, err = http.NewRequest(http.MethodPut, - fmt.Sprintf("%s/api/v1/admin/readonly?site=radio-t&url=https://radio-t.com/blah&ro=0", ts.URL), nil) + fmt.Sprintf("%s/api/v1/admin/readonly?site=remark42&url=https://radio-t.com/blah&ro=0", ts.URL), nil) assert.Nil(t, err) resp, err = sendReq(t, req, adminUmputunToken) require.NoError(t, err) assert.Equal(t, 200, resp.StatusCode) - info, err = srv.DataService.Info(store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}, 0) + info, err = srv.DataService.Info(store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, 0) assert.Nil(t, err) assert.False(t, info.ReadOnly) // try to write comment c = store.Comment{Text: "test test #2", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}} b, err = json.Marshal(c) assert.Nil(t, err, "can't marshal comment %+v", c) req, err = http.NewRequest("POST", ts.URL+"/api/v1/comment", bytes.NewBuffer(b)) @@ -486,16 +486,16 @@ func TestAdmin_ReadOnlyNoComments(t *testing.T) { // set post to read-only req, err := http.NewRequest(http.MethodPut, - fmt.Sprintf("%s/api/v1/admin/readonly?site=radio-t&url=https://radio-t.com/blah&ro=1", ts.URL), nil) + fmt.Sprintf("%s/api/v1/admin/readonly?site=remark42&url=https://radio-t.com/blah&ro=1", ts.URL), nil) assert.Nil(t, err) requireAdminOnly(t, req) resp, err := sendReq(t, req, adminUmputunToken) require.NoError(t, err) assert.Equal(t, 200, resp.StatusCode) - _, err = srv.DataService.Info(store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}, 0) + _, err = srv.DataService.Info(store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, 0) assert.NotNil(t, err) - res, code := get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah&format=tree") + res, code := get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah&format=tree") assert.Equal(t, 200, code) comments := commentsWithInfo{} err = json.Unmarshal([]byte(res), &comments) @@ -509,36 +509,36 @@ func TestAdmin_ReadOnlyWithAge(t *testing.T) { ts, srv, teardown := startupT(t) defer teardown() - c1 := store.Comment{Text: "test test #1", Locator: store.Locator{SiteID: "radio-t", + c1 := store.Comment{Text: "test test #1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, User: store.User{Name: "user1 name", ID: "user1"}, Timestamp: time.Date(2001, 1, 1, 1, 1, 1, 0, time.Local)} _, err := srv.DataService.Create(c1) assert.Nil(t, err) - info, err := srv.DataService.Info(store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}, 10) + info, err := srv.DataService.Info(store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, 10) assert.Nil(t, err) assert.True(t, info.ReadOnly, "ro by age") // set post to read-only req, err := http.NewRequest(http.MethodPut, - fmt.Sprintf("%s/api/v1/admin/readonly?site=radio-t&url=https://radio-t.com/blah&ro=1", ts.URL), nil) + fmt.Sprintf("%s/api/v1/admin/readonly?site=remark42&url=https://radio-t.com/blah&ro=1", ts.URL), nil) assert.Nil(t, err) requireAdminOnly(t, req) resp, err := sendReq(t, req, adminUmputunToken) require.NoError(t, err) assert.Equal(t, 200, resp.StatusCode) - info, err = srv.DataService.Info(store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}, 0) + info, err = srv.DataService.Info(store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, 0) assert.NoError(t, err) assert.True(t, info.ReadOnly) // reset post's read-only req, err = http.NewRequest(http.MethodPut, - fmt.Sprintf("%s/api/v1/admin/readonly?site=radio-t&url=https://radio-t.com/blah&ro=0", ts.URL), nil) + fmt.Sprintf("%s/api/v1/admin/readonly?site=remark42&url=https://radio-t.com/blah&ro=0", ts.URL), nil) assert.Nil(t, err) resp, err = sendReq(t, req, adminUmputunToken) require.NoError(t, err) assert.Equal(t, 403, resp.StatusCode) - info, err = srv.DataService.Info(store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}, 0) + info, err = srv.DataService.Info(store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, 0) assert.NoError(t, err) assert.True(t, info.ReadOnly) @@ -547,9 +547,9 @@ func TestAdmin_Verify(t *testing.T) { ts, srv, teardown := startupT(t) defer teardown() - c1 := store.Comment{Text: "test test #1", Locator: store.Locator{SiteID: "radio-t", + c1 := store.Comment{Text: "test test #1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, User: store.User{Name: "user1 name", ID: "user1"}} - c2 := store.Comment{Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "radio-t", + c2 := store.Comment{Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, User: store.User{Name: "user2", ID: "user2"}} _, err := srv.DataService.Create(c1) @@ -557,20 +557,20 @@ func TestAdmin_Verify(t *testing.T) { _, err = srv.DataService.Create(c2) assert.Nil(t, err) - verified := srv.DataService.IsVerified("radio-t", "user1") + verified := srv.DataService.IsVerified("remark42", "user1") assert.False(t, verified) req, err := http.NewRequest(http.MethodPut, - fmt.Sprintf("%s/api/v1/admin/verify/user1?site=radio-t&verified=1", ts.URL), nil) + fmt.Sprintf("%s/api/v1/admin/verify/user1?site=remark42&verified=1", ts.URL), nil) assert.Nil(t, err) requireAdminOnly(t, req) resp, err := sendReq(t, req, adminUmputunToken) require.NoError(t, err) assert.Equal(t, 200, resp.StatusCode) - verified = srv.DataService.IsVerified("radio-t", "user1") + verified = srv.DataService.IsVerified("remark42", "user1") assert.True(t, verified) - res, code := get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah&sort=+time") + res, code := get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah&sort=+time") assert.Equal(t, 200, code) comments := commentsWithInfo{} err = json.Unmarshal([]byte(res), &comments) @@ -580,15 +580,15 @@ func TestAdmin_Verify(t *testing.T) { assert.True(t, comments.Comments[0].User.Verified) req, err = http.NewRequest(http.MethodPut, - fmt.Sprintf("%s/api/v1/admin/verify/user1?site=radio-t&verified=0", ts.URL), nil) + fmt.Sprintf("%s/api/v1/admin/verify/user1?site=remark42&verified=0", ts.URL), nil) assert.Nil(t, err) resp, err = sendReq(t, req, adminUmputunToken) require.NoError(t, err) assert.Equal(t, 200, resp.StatusCode) - verified = srv.DataService.IsVerified("radio-t", "user1") + verified = srv.DataService.IsVerified("remark42", "user1") assert.False(t, verified) - res, code = get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah&sort=+time") + res, code = get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah&sort=+time") assert.Equal(t, 200, code) comments = commentsWithInfo{} err = json.Unmarshal([]byte(res), &comments) @@ -603,14 +603,14 @@ func TestAdmin_ExportStream(t *testing.T) { defer teardown() c1 := store.Comment{Text: "test test #1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}} c2 := store.Comment{Text: "test test #2", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah2"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah2"}} addComment(t, c1, ts) addComment(t, c2, ts) - body, code := getWithAdminAuth(t, ts.URL+"/api/v1/admin/export?site=radio-t&mode=stream") + body, code := getWithAdminAuth(t, ts.URL+"/api/v1/admin/export?site=remark42&mode=stream") assert.Equal(t, 200, code) assert.Equal(t, 3, strings.Count(body, "\n")) assert.Equal(t, 2, strings.Count(body, "\"text\"")) @@ -622,14 +622,14 @@ func TestAdmin_ExportFile(t *testing.T) { defer teardown() c1 := store.Comment{Text: "test test #1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}} c2 := store.Comment{Text: "test test #2", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah2"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah2"}} addComment(t, c1, ts) addComment(t, c2, ts) - req, err := http.NewRequest("GET", ts.URL+"/api/v1/admin/export?site=radio-t&mode=file", nil) + req, err := http.NewRequest("GET", ts.URL+"/api/v1/admin/export?site=remark42&mode=file", nil) require.NoError(t, err) requireAdminOnly(t, req) resp, err := sendReq(t, req, adminUmputunToken) @@ -651,9 +651,9 @@ func TestAdmin_DeleteMeRequest(t *testing.T) { ts, srv, teardown := startupT(t) defer teardown() - c1 := store.Comment{Text: "test test #1", Locator: store.Locator{SiteID: "radio-t", + c1 := store.Comment{Text: "test test #1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, User: store.User{Name: "user1 name", ID: "user1"}} - c2 := store.Comment{Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "radio-t", + c2 := store.Comment{Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, User: store.User{Name: "user2", ID: "user2"}} _, err := srv.DataService.Create(c1) @@ -661,14 +661,14 @@ func TestAdmin_DeleteMeRequest(t *testing.T) { _, err = srv.DataService.Create(c2) assert.Nil(t, err) - comments, err := srv.DataService.User("radio-t", "user1", 0, 0, store.User{}) + comments, err := srv.DataService.User("remark42", "user1", 0, 0, store.User{}) assert.Nil(t, err) assert.Equal(t, 1, len(comments), "a comment for user1") claims := token.Claims{ SessionOnly: true, StandardClaims: jwt.StandardClaims{ - Audience: "radio-t", + Audience: "remark42", Id: "1234567", Issuer: "remark42", NotBefore: time.Now().Add(-1 * time.Minute).Unix(), @@ -698,7 +698,7 @@ func TestAdmin_DeleteMeRequest(t *testing.T) { require.NoError(t, err) assert.Equal(t, 200, resp.StatusCode) - _, err = srv.DataService.User("radio-t", "user1", 0, 0, store.User{}) + _, err = srv.DataService.User("remark42", "user1", 0, 0, store.User{}) assert.EqualError(t, err, "no comments for user user1 in store") } @@ -706,9 +706,9 @@ func TestAdmin_DeleteMeRequestFailed(t *testing.T) { ts, srv, teardown := startupT(t) defer teardown() - c1 := store.Comment{Text: "test test #1", Locator: store.Locator{SiteID: "radio-t", + c1 := store.Comment{Text: "test test #1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, User: store.User{Name: "user1 name", ID: "user1"}} - c2 := store.Comment{Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "radio-t", + c2 := store.Comment{Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, User: store.User{Name: "user2", ID: "user2"}} _, err := srv.DataService.Create(c1) @@ -729,7 +729,7 @@ func TestAdmin_DeleteMeRequestFailed(t *testing.T) { claims := token.Claims{ SessionOnly: true, StandardClaims: jwt.StandardClaims{ - Audience: "radio-t", + Audience: "remark42", Id: "1234567", Issuer: "remark42", NotBefore: time.Now().Add(-1 * time.Minute).Unix(), @@ -784,9 +784,9 @@ func TestAdmin_GetUserInfo(t *testing.T) { ts, srv, teardown := startupT(t) defer teardown() - c1 := store.Comment{Text: "test test #1", Locator: store.Locator{SiteID: "radio-t", + c1 := store.Comment{Text: "test test #1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, User: store.User{Name: "user1 name", ID: "user1"}} - c2 := store.Comment{Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "radio-t", + c2 := store.Comment{Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}, User: store.User{Name: "user2", ID: "user2"}} _, err := srv.DataService.Create(c1) @@ -794,7 +794,8 @@ func TestAdmin_GetUserInfo(t *testing.T) { _, err = srv.DataService.Create(c2) assert.Nil(t, err) - body, code := getWithAdminAuth(t, fmt.Sprintf("%s/api/v1/admin/user/user1?site=radio-t&url=https://radio-t.com/blah", ts.URL)) + body, code := getWithAdminAuth(t, fmt.Sprintf("%s/api/v1/admin/user/user1?site=remark42&url=https://radio-t.com/blah", + ts.URL)) assert.Equal(t, 200, code) u := store.User{} err = json.Unmarshal([]byte(body), &u) @@ -802,9 +803,9 @@ func TestAdmin_GetUserInfo(t *testing.T) { assert.Equal(t, store.User{Name: "user1 name", ID: "user1", Picture: "", IP: "823688dafca7393d24c871a2da98a84d8732e927", Admin: false, Blocked: false, Verified: false}, u) - _, code = get(t, fmt.Sprintf("%s/api/v1/admin/user/user1?site=radio-t&url=https://radio-t.com/blah", ts.URL)) + _, code = get(t, fmt.Sprintf("%s/api/v1/admin/user/user1?site=remark42&url=https://radio-t.com/blah", ts.URL)) assert.Equal(t, 401, code, "no auth") - _, code = getWithAdminAuth(t, fmt.Sprintf("%s/api/v1/admin/user/userX?site=radio-t&url=https://radio-t.com/blah", ts.URL)) + _, code = getWithAdminAuth(t, fmt.Sprintf("%s/api/v1/admin/user/userX?site=remark42&url=https://radio-t.com/blah", ts.URL)) assert.Equal(t, 400, code, "no info about user") } diff --git a/backend/app/rest/api/migrator_test.go b/backend/app/rest/api/migrator_test.go index 51ee0658..51b38804 100644 --- a/backend/app/rest/api/migrator_test.go +++ b/backend/app/rest/api/migrator_test.go @@ -21,11 +21,17 @@ func TestMigrator_Import(t *testing.T) { ts, _, teardown := startupT(t) defer teardown() - r := strings.NewReader(`{"version":1} {"id":"2aa0478c-df1b-46b1-b561-03d507cf482c","pid":"","text":"
test test #1
","user":{"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com","admin":true,"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"radio-t","url":"https://radio-t.com/blah1"},"score":0,"votes":{},"time":"2018-04-30T01:37:00.849053725-05:00"} - {"id":"83fd97fd-ff64-48d1-9fb7-ca7769c77037","pid":"p1","text":"test test #2
","user":{"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com","admin":true,"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"radio-t","url":"https://radio-t.com/blah2"},"score":0,"votes":{},"time":"2018-04-30T01:37:00.861387771-05:00"}`) + r := strings.NewReader(`{"version":1} {"id":"2aa0478c-df1b-46b1-b561-03d507cf482c","pid":"","text":"test test #1
", +"user":{"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com", +"admin":true,"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"remark42","url":"https://radio-t.com/blah1"}, +"score":0,"votes":{},"time":"2018-04-30T01:37:00.849053725-05:00"} + {"id":"83fd97fd-ff64-48d1-9fb7-ca7769c77037","pid":"p1","text":"test test #2
","user":{"name":"developer one", +"id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com","admin":true, +"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"remark42","url":"https://radio-t.com/blah2"},"score":0, +"votes":{},"time":"2018-04-30T01:37:00.861387771-05:00"}`) client := &http.Client{Timeout: 1 * time.Second} - req, err := http.NewRequest("POST", ts.URL+"/api/v1/admin/import?site=radio-t&provider=native", r) + req, err := http.NewRequest("POST", ts.URL+"/api/v1/admin/import?site=remark42&provider=native", r) require.NoError(t, err) req.SetBasicAuth("admin", "password") assert.Nil(t, err) @@ -44,8 +50,14 @@ func TestMigrator_ImportForm(t *testing.T) { ts, _, teardown := startupT(t) defer teardown() - r := strings.NewReader(`{"version":1} {"id":"2aa0478c-df1b-46b1-b561-03d507cf482c","pid":"","text":"test test #1
","user":{"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com","admin":true,"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"radio-t","url":"https://radio-t.com/blah1"},"score":0,"votes":{},"time":"2018-04-30T01:37:00.849053725-05:00"} - {"id":"83fd97fd-ff64-48d1-9fb7-ca7769c77037","pid":"p1","text":"test test #2
","user":{"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com","admin":true,"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"radio-t","url":"https://radio-t.com/blah2"},"score":0,"votes":{},"time":"2018-04-30T01:37:00.861387771-05:00"}`) + r := strings.NewReader(`{"version":1} {"id":"2aa0478c-df1b-46b1-b561-03d507cf482c","pid":"","text":"test test #1
", +"user":{"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com", +"admin":true,"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"remark42","url":"https://radio-t.com/blah1"}, +"score":0,"votes":{},"time":"2018-04-30T01:37:00.849053725-05:00"} + {"id":"83fd97fd-ff64-48d1-9fb7-ca7769c77037","pid":"p1","text":"test test #2
","user":{"name":"developer one", +"id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com","admin":true, +"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"remark42","url":"https://radio-t.com/blah2"},"score":0, +"votes":{},"time":"2018-04-30T01:37:00.861387771-05:00"}`) bodyBuf := &bytes.Buffer{} bodyWriter := multipart.NewWriter(bodyBuf) @@ -57,7 +69,7 @@ func TestMigrator_ImportForm(t *testing.T) { require.NoError(t, bodyWriter.Close()) authts := strings.Replace(ts.URL, "http://", "http://admin:password@", 1) - resp, err := http.Post(authts+"/api/v1/admin/import/form?site=radio-t&provider=native", contentType, bodyBuf) + resp, err := http.Post(authts+"/api/v1/admin/import/form?site=remark42&provider=native", contentType, bodyBuf) assert.Nil(t, err) assert.Equal(t, http.StatusAccepted, resp.StatusCode) @@ -75,7 +87,7 @@ func TestMigrator_ImportFromWP(t *testing.T) { r := strings.NewReader(strings.Replace(xmlTestWP, "'", "`", -1)) client := &http.Client{Timeout: 1 * time.Second} - req, err := http.NewRequest("POST", ts.URL+"/api/v1/admin/import?site=radio-t&provider=wordpress", r) + req, err := http.NewRequest("POST", ts.URL+"/api/v1/admin/import?site=remark42&provider=wordpress", r) assert.Nil(t, err) req.Header.Add("Content-Type", "application/xml; charset=utf-8") req.SetBasicAuth("admin", "password") @@ -94,11 +106,17 @@ func TestMigrator_ImportRejected(t *testing.T) { ts, _, teardown := startupT(t) defer teardown() - r := strings.NewReader(`{"version":1} {"id":"2aa0478c-df1b-46b1-b561-03d507cf482c","pid":"","text":"test test #1
","user":{"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com","admin":true,"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"radio-t","url":"https://radio-t.com/blah1"},"score":0,"votes":{},"time":"2018-04-30T01:37:00.849053725-05:00"} - {"id":"83fd97fd-ff64-48d1-9fb7-ca7769c77037","pid":"p1","text":"test test #2
","user":{"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com","admin":true,"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"radio-t","url":"https://radio-t.com/blah2"},"score":0,"votes":{},"time":"2018-04-30T01:37:00.861387771-05:00"}`) + r := strings.NewReader(`{"version":1} {"id":"2aa0478c-df1b-46b1-b561-03d507cf482c","pid":"","text":"test test #1
", +"user":{"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com", +"admin":true,"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"remark42","url":"https://radio-t.com/blah1"}, +"score":0,"votes":{},"time":"2018-04-30T01:37:00.849053725-05:00"} + {"id":"83fd97fd-ff64-48d1-9fb7-ca7769c77037","pid":"p1","text":"test test #2
","user":{"name":"developer one", +"id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com","admin":true, +"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"remark42","url":"https://radio-t.com/blah2"},"score":0, +"votes":{},"time":"2018-04-30T01:37:00.861387771-05:00"}`) client := &http.Client{Timeout: 1 * time.Second} - req, err := http.NewRequest("POST", ts.URL+"/api/v1/admin/import?site=radio-t&provider=native&secret=XYZ", r) + req, err := http.NewRequest("POST", ts.URL+"/api/v1/admin/import?site=remark42&provider=native&secret=XYZ", r) assert.Nil(t, err) resp, err := client.Do(req) assert.Nil(t, err) @@ -109,14 +127,17 @@ func TestMigrator_ImportDouble(t *testing.T) { ts, _, teardown := startupT(t) defer teardown() - tmpl := `{"id":"%d","pid":"","text":"test test #1
","user":{"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com","admin":true,"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"radio-t","url":"https://radio-t.com/blah1"},"score":0,"votes":{},"time":"2018-04-30T01:37:00.849053725-05:00"}` + tmpl := `{"id":"%d","pid":"","text":"test test #1
","user":{"name":"developer one","id":"dev", +"picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com","admin":true, +"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"remark42","url":"https://radio-t.com/blah1"},"score":0, +"votes":{},"time":"2018-04-30T01:37:00.849053725-05:00"}` recs := []string{} for i := 0; i < 150; i++ { recs = append(recs, fmt.Sprintf(tmpl, i)) } r := strings.NewReader(`{"version":1}` + strings.Join(recs, "\n")) // reader with 10k records client := &http.Client{Timeout: 1 * time.Second} - req, err := http.NewRequest("POST", ts.URL+"/api/v1/admin/import?site=radio-t&provider=native", r) + req, err := http.NewRequest("POST", ts.URL+"/api/v1/admin/import?site=remark42&provider=native", r) require.NoError(t, err) req.SetBasicAuth("admin", "password") assert.Nil(t, err) @@ -125,7 +146,7 @@ func TestMigrator_ImportDouble(t *testing.T) { assert.Equal(t, http.StatusAccepted, resp.StatusCode) client = &http.Client{Timeout: 1 * time.Second} - req, err = http.NewRequest("POST", ts.URL+"/api/v1/admin/import?site=radio-t&provider=native", r) + req, err = http.NewRequest("POST", ts.URL+"/api/v1/admin/import?site=remark42&provider=native", r) require.NoError(t, err) req.SetBasicAuth("admin", "password") assert.Nil(t, err) @@ -139,14 +160,17 @@ func TestMigrator_ImportWaitExpired(t *testing.T) { ts, _, teardown := startupT(t) defer teardown() - tmpl := `{"id":"%d","pid":"","text":"test test #1
","user":{"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com","admin":true,"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"radio-t","url":"https://radio-t.com/blah1"},"score":0,"votes":{},"time":"2018-04-30T01:37:00.849053725-05:00"}` + tmpl := `{"id":"%d","pid":"","text":"test test #1
","user":{"name":"developer one","id":"dev", +"picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com","admin":true, +"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"remark42","url":"https://radio-t.com/blah1"},"score":0, +"votes":{},"time":"2018-04-30T01:37:00.849053725-05:00"}` recs := []string{} for i := 0; i < 150; i++ { recs = append(recs, fmt.Sprintf(tmpl, i)) } r := strings.NewReader(`{"version":1}` + strings.Join(recs, "\n")) // reader with 10k records client := &http.Client{Timeout: 1 * time.Second} - req, err := http.NewRequest("POST", ts.URL+"/api/v1/admin/import?site=radio-t&provider=native", r) + req, err := http.NewRequest("POST", ts.URL+"/api/v1/admin/import?site=remark42&provider=native", r) require.NoError(t, err) req.SetBasicAuth("admin", "password") require.Nil(t, err) @@ -155,7 +179,7 @@ func TestMigrator_ImportWaitExpired(t *testing.T) { assert.Equal(t, http.StatusAccepted, resp.StatusCode) client = &http.Client{Timeout: 10 * time.Second} - req, err = http.NewRequest("GET", ts.URL+"/api/v1/admin/import/wait?site=radio-t&timeout=100ms", nil) + req, err = http.NewRequest("GET", ts.URL+"/api/v1/admin/import/wait?site=remark42&timeout=100ms", nil) require.NoError(t, err) req.SetBasicAuth("admin", "password") assert.NoError(t, err) @@ -170,12 +194,18 @@ func TestMigrator_Export(t *testing.T) { ts, _, teardown := startupT(t) defer teardown() - r := strings.NewReader(`{"version":1} {"id":"2aa0478c-df1b-46b1-b561-03d507cf482c","pid":"","text":"test test #1
","user":{"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com","admin":true,"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"radio-t","url":"https://radio-t.com/blah1"},"score":0,"votes":{},"time":"2018-04-30T01:37:00.849053725-05:00"} - {"id":"83fd97fd-ff64-48d1-9fb7-ca7769c77037","pid":"p1","text":"test test #2
","user":{"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com","admin":true,"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"radio-t","url":"https://radio-t.com/blah2"},"score":0,"votes":{},"time":"2018-04-30T01:37:00.861387771-05:00"}`) + r := strings.NewReader(`{"version":1} {"id":"2aa0478c-df1b-46b1-b561-03d507cf482c","pid":"","text":"test test #1
", +"user":{"name":"developer one","id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com", +"admin":true,"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"remark42","url":"https://radio-t.com/blah1"}, +"score":0,"votes":{},"time":"2018-04-30T01:37:00.849053725-05:00"} + {"id":"83fd97fd-ff64-48d1-9fb7-ca7769c77037","pid":"p1","text":"test test #2
","user":{"name":"developer one", +"id":"dev","picture":"/api/v1/avatar/remark.image","profile":"https://remark42.com","admin":true, +"ip":"ae12fe3b5f129b5cc4cdd2b136b7b7947c4d2741"},"locator":{"site":"remark42","url":"https://radio-t.com/blah2"},"score":0, +"votes":{},"time":"2018-04-30T01:37:00.861387771-05:00"}`) // import comments first client := &http.Client{Timeout: 1 * time.Second} - req, err := http.NewRequest("POST", ts.URL+"/api/v1/admin/import?site=radio-t&provider=native", r) + req, err := http.NewRequest("POST", ts.URL+"/api/v1/admin/import?site=remark42&provider=native", r) require.Nil(t, err) req.SetBasicAuth("admin", "password") resp, err := client.Do(req) @@ -184,7 +214,7 @@ func TestMigrator_Export(t *testing.T) { waitForImportCompletion(t, ts) // check file mode - req, err = http.NewRequest("GET", ts.URL+"/api/v1/admin/export?mode=file&site=radio-t", nil) + req, err = http.NewRequest("GET", ts.URL+"/api/v1/admin/export?mode=file&site=remark42", nil) require.Nil(t, err) req.SetBasicAuth("admin", "password") resp, err = client.Do(req) @@ -201,7 +231,7 @@ func TestMigrator_Export(t *testing.T) { t.Logf("%s", string(ungzBody)) // check stream mode - req, err = http.NewRequest("GET", ts.URL+"/api/v1/admin/export?mode=stream&site=radio-t", nil) + req, err = http.NewRequest("GET", ts.URL+"/api/v1/admin/export?mode=stream&site=remark42", nil) require.Nil(t, err) req.SetBasicAuth("admin", "password") resp, err = client.Do(req) @@ -215,7 +245,7 @@ func TestMigrator_Export(t *testing.T) { assert.Equal(t, 2, strings.Count(string(body), "\"text\"")) t.Logf("%s", string(body)) - req, err = http.NewRequest("GET", ts.URL+"/api/v1/admin/export?site=radio-t", nil) + req, err = http.NewRequest("GET", ts.URL+"/api/v1/admin/export?site=remark42", nil) require.Nil(t, err) resp, err = client.Do(req) require.Nil(t, err) @@ -224,7 +254,7 @@ func TestMigrator_Export(t *testing.T) { func waitForImportCompletion(t *testing.T, ts *httptest.Server) { client := &http.Client{Timeout: 10 * time.Second} - req, err := http.NewRequest("GET", ts.URL+"/api/v1/admin/import/wait?site=radio-t", nil) + req, err := http.NewRequest("GET", ts.URL+"/api/v1/admin/import/wait?site=remark42", nil) require.NoError(t, err) req.SetBasicAuth("admin", "password") assert.NoError(t, err) @@ -234,7 +264,7 @@ func waitForImportCompletion(t *testing.T, ts *httptest.Server) { b, err := ioutil.ReadAll(resp.Body) require.NoError(t, err) defer resp.Body.Close() - assert.Equal(t, "{\"site_id\":\"radio-t\",\"status\":\"completed\"}\n", string(b)) + assert.Equal(t, "{\"site_id\":\"remark42\",\"status\":\"completed\"}\n", string(b)) } var xmlTestWP = ` diff --git a/backend/app/rest/api/rest.go b/backend/app/rest/api/rest.go index 435efae3..9ea621e7 100644 --- a/backend/app/rest/api/rest.go +++ b/backend/app/rest/api/rest.go @@ -258,7 +258,7 @@ func (s *Rest) routes() chi.Router { rapi.Group(func(rauth chi.Router) { rauth.Use(middleware.Timeout(30 * time.Second)) rauth.Use(tollbooth_chi.LimitHandler(tollbooth.NewLimiter(10, nil))) - rauth.Use(authMiddleware.Auth, middleware.NoCache, logInfoWithBody) + rauth.Use(authMiddleware.Auth, matchSiteID, middleware.NoCache, logInfoWithBody) rauth.Get("/user", s.privRest.userInfoCtrl) rauth.Get("/userdata", s.privRest.userAllDataCtrl) }) @@ -267,7 +267,7 @@ func (s *Rest) routes() chi.Router { rapi.Route("/admin", func(radmin chi.Router) { radmin.Use(middleware.Timeout(30 * time.Second)) radmin.Use(tollbooth_chi.LimitHandler(tollbooth.NewLimiter(10, nil))) - radmin.Use(authMiddleware.Auth, authMiddleware.AdminOnly) + radmin.Use(authMiddleware.Auth, authMiddleware.AdminOnly, matchSiteID) radmin.Use(middleware.NoCache, logInfoWithBody) radmin.Delete("/comment/{id}", s.adminRest.deleteCommentCtrl) @@ -292,7 +292,7 @@ func (s *Rest) routes() chi.Router { rapi.Group(func(rauth chi.Router) { rauth.Use(middleware.Timeout(10 * time.Second)) rauth.Use(tollbooth_chi.LimitHandler(tollbooth.NewLimiter(s.updateLimiter(), nil))) - rauth.Use(authMiddleware.Auth) + rauth.Use(authMiddleware.Auth, matchSiteID) rauth.Use(middleware.NoCache) rauth.Use(logger.New(logger.Log(log.Default()), logger.WithBody, logger.Prefix("[DEBUG]"), logger.IPfn(ipFn)).Handler) @@ -306,7 +306,7 @@ func (s *Rest) routes() chi.Router { rapi.Group(func(rauth chi.Router) { rauth.Use(middleware.Timeout(10 * time.Second)) rauth.Use(tollbooth_chi.LimitHandler(tollbooth.NewLimiter(s.updateLimiter(), nil))) - rauth.Use(authMiddleware.Auth, rejectAnonUser) + rauth.Use(authMiddleware.Auth, rejectAnonUser, matchSiteID) rauth.Use(logger.New(logger.Log(log.Default()), logger.Prefix("[DEBUG]"), logger.IPfn(ipFn)).Handler) rauth.Post("/picture", s.privRest.savePictureCtrl) }) @@ -518,6 +518,31 @@ func rejectAnonUser(next http.Handler) http.Handler { return http.HandlerFunc(fn) } +// matchSiteID is a middleware rejecting users with mismatch between site param and and User.SiteID +func matchSiteID(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + user, err := rest.GetUserInfo(r) + if err != nil { + http.Error(w, "Unauthorized", http.StatusUnauthorized) + return + } + + // skip for basic auth user + if user.Name == "admin" && user.ID == "admin" { + next.ServeHTTP(w, r) + return + } + + siteID := r.URL.Query().Get("site") + if siteID != "" && user.SiteID != siteID { + http.Error(w, "Access denied", http.StatusForbidden) + return + } + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) +} + func parseError(err error, defaultCode int) (code int) { code = defaultCode diff --git a/backend/app/rest/api/rest_private.go b/backend/app/rest/api/rest_private.go index 66fa918a..b845367d 100644 --- a/backend/app/rest/api/rest_private.go +++ b/backend/app/rest/api/rest_private.go @@ -60,6 +60,12 @@ func (s *private) createCommentCtrl(w http.ResponseWriter, r *http.Request) { } user := rest.MustGetUserInfo(r) + if user.ID != "admin" && user.SiteID != comment.Locator.SiteID { + rest.SendErrorJSON(w, r, http.StatusForbidden, + errors.New("site mismatch, not allowed to post to "+comment.Locator.SiteID), "invalid site", + rest.ErrCommentValidation) + return + } comment.PrepareUntrusted() // clean all fields user not supposed to set comment.User = user diff --git a/backend/app/rest/api/rest_private_test.go b/backend/app/rest/api/rest_private_test.go index a4511cbe..73ae38b0 100644 --- a/backend/app/rest/api/rest_private_test.go +++ b/backend/app/rest/api/rest_private_test.go @@ -34,7 +34,7 @@ func TestRest_Create(t *testing.T) { defer teardown() resp, err := post(t, ts.URL+"/api/v1/comment", - `{"text": "test 123", "locator":{"url": "https://radio-t.com/blah1", "site": "radio-t"}}`) + `{"text": "test 123", "locator":{"url": "https://radio-t.com/blah1", "site": "remark42"}}`) assert.Nil(t, err) b, err := ioutil.ReadAll(resp.Body) assert.Nil(t, err) @@ -45,7 +45,7 @@ func TestRest_Create(t *testing.T) { err = json.Unmarshal(b, &c) assert.Nil(t, err) loc := c["locator"].(map[string]interface{}) - assert.Equal(t, "radio-t", loc["site"]) + assert.Equal(t, "remark42", loc["site"]) assert.Equal(t, "https://radio-t.com/blah1", loc["url"]) assert.True(t, len(c["id"].(string)) > 8) } @@ -56,29 +56,29 @@ func TestRest_CreateOldPost(t *testing.T) { // make old, but not too old comment old := store.Comment{Text: "test test old", ParentID: "", Timestamp: time.Now().AddDate(0, 0, -5), - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}, User: store.User{ID: "u1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}, User: store.User{ID: "u1"}} _, err := srv.DataService.Create(old) assert.Nil(t, err) - comments, err := srv.DataService.Find(store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}, "time", store.User{}) + comments, err := srv.DataService.Find(store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}, "time", store.User{}) assert.Nil(t, err) assert.Equal(t, 1, len(comments)) // try to add new comment to the same old post resp, err := post(t, ts.URL+"/api/v1/comment", - `{"text": "test 123", "locator":{"site": "radio-t","url": "https://radio-t.com/blah1"}}`) + `{"text": "test 123", "locator":{"site": "remark42","url": "https://radio-t.com/blah1"}}`) assert.Nil(t, err) assert.Equal(t, http.StatusCreated, resp.StatusCode) - assert.Nil(t, srv.DataService.DeleteAll("radio-t")) + assert.Nil(t, srv.DataService.DeleteAll("remark42")) // make too old comment old = store.Comment{Text: "test test old", ParentID: "", Timestamp: time.Now().AddDate(0, 0, -15), - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}, User: store.User{ID: "u1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}, User: store.User{ID: "u1"}} _, err = srv.DataService.Create(old) assert.Nil(t, err) resp, err = post(t, ts.URL+"/api/v1/comment", - `{"text": "test 123", "locator":{"site": "radio-t","url": "https://radio-t.com/blah1"}}`) + `{"text": "test 123", "locator":{"site": "remark42","url": "https://radio-t.com/blah1"}}`) assert.Nil(t, err) assert.Equal(t, http.StatusForbidden, resp.StatusCode) } @@ -87,7 +87,7 @@ func TestRest_CreateTooBig(t *testing.T) { ts, _, teardown := startupT(t) defer teardown() - longComment := fmt.Sprintf(`{"text": "%4001s", "locator":{"url": "https://radio-t.com/blah1", "site": "radio-t"}}`, "Щ") + longComment := fmt.Sprintf(`{"text": "%4001s", "locator":{"url": "https://radio-t.com/blah1", "site": "remark42"}}`, "Щ") resp, err := post(t, ts.URL+"/api/v1/comment", longComment) assert.Nil(t, err) @@ -100,7 +100,7 @@ func TestRest_CreateTooBig(t *testing.T) { assert.Equal(t, "comment text exceeded max allowed size 4000 (4001)", c["error"]) assert.Equal(t, "invalid comment", c["details"]) - veryLongComment := fmt.Sprintf(`{"text": "%70000s", "locator":{"url": "https://radio-t.com/blah1", "site": "radio-t"}}`, "Щ") + veryLongComment := fmt.Sprintf(`{"text": "%70000s", "locator":{"url": "https://radio-t.com/blah1", "site": "remark42"}}`, "Щ") resp, err = post(t, ts.URL+"/api/v1/comment", veryLongComment) assert.Nil(t, err) assert.Equal(t, http.StatusBadRequest, resp.StatusCode) @@ -117,7 +117,8 @@ func TestRest_CreateWithRestrictedWord(t *testing.T) { ts, _, teardown := startupT(t) defer teardown() - badComment := fmt.Sprintf(`{"text": "What the duck is that?", "locator":{"url": "https://radio-t.com/blah1", "site": "radio-t"}}`) + badComment := fmt.Sprintf(`{"text": "What the duck is that?", "locator":{"url": "https://radio-t.com/blah1", +"site": "remark42"}}`) resp, err := post(t, ts.URL+"/api/v1/comment", badComment) assert.Nil(t, err) @@ -135,12 +136,21 @@ func TestRest_CreateRejected(t *testing.T) { ts, _, teardown := startupT(t) defer teardown() - body := `{"text": "test 123", "locator":{"url": "https://radio-t.com/blah1", "site": "radio-t"}}` + body := `{"text": "test 123", "locator":{"url": "https://radio-t.com/blah1", "site": "remark42"}}` // try to create without auth resp, err := http.Post(ts.URL+"/api/v1/comment", "", strings.NewReader(body)) - assert.Nil(t, err) + require.NoError(t, err) assert.Equal(t, 401, resp.StatusCode) + + // try with wrong aud + client := &http.Client{Timeout: 5 * time.Second} + req, err := http.NewRequest("POST", ts.URL+"/api/v1/comment", strings.NewReader(body)) + require.Nil(t, err) + req.Header.Add("X-JWT", devTokenBadAud) + resp, err = client.Do(req) + require.NoError(t, err) + require.Equal(t, http.StatusForbidden, resp.StatusCode, "reject wrong aud") } func TestRest_CreateAndGet(t *testing.T) { @@ -149,7 +159,7 @@ func TestRest_CreateAndGet(t *testing.T) { // create comment resp, err := post(t, ts.URL+"/api/v1/comment", - `{"text": "**test** *123*\n\n http://radio-t.com", "locator":{"url": "https://radio-t.com/blah1", "site": "radio-t"}}`) + `{"text": "**test** *123*\n\n http://radio-t.com", "locator":{"url": "https://radio-t.com/blah1", "site": "remark42"}}`) require.Nil(t, err) require.Equal(t, http.StatusCreated, resp.StatusCode) b, err := ioutil.ReadAll(resp.Body) @@ -161,7 +171,7 @@ func TestRest_CreateAndGet(t *testing.T) { id := c["id"].(string) // get created comment by id as admin - res, code := getWithAdminAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=radio-t&url=https://radio-t.com/blah1", ts.URL, id)) + res, code := getWithAdminAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=remark42&url=https://radio-t.com/blah1", ts.URL, id)) assert.Equal(t, 200, code) comment := store.Comment{} err = json.Unmarshal([]byte(res), &comment) @@ -174,7 +184,7 @@ func TestRest_CreateAndGet(t *testing.T) { t.Logf("%+v", comment) // get created comment by id as non-admin - res, code = getWithDevAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=radio-t&url=https://radio-t.com/blah1", ts.URL, id)) + res, code = getWithDevAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=remark42&url=https://radio-t.com/blah1", ts.URL, id)) assert.Equal(t, 200, code) comment = store.Comment{} err = json.Unmarshal([]byte(res), &comment) @@ -187,11 +197,11 @@ func TestRest_Update(t *testing.T) { defer teardown() c1 := store.Comment{Text: "test test #1", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}} id := addComment(t, c1, ts) client := http.Client{} - req, err := http.NewRequest(http.MethodPut, ts.URL+"/api/v1/comment/"+id+"?site=radio-t&url=https://radio-t.com/blah1", + req, err := http.NewRequest(http.MethodPut, ts.URL+"/api/v1/comment/"+id+"?site=remark42&url=https://radio-t.com/blah1", strings.NewReader(`{"text":"updated text", "summary":"my edit"}`)) assert.Nil(t, err) req.Header.Add("X-JWT", devToken) @@ -212,7 +222,7 @@ func TestRest_Update(t *testing.T) { assert.True(t, time.Since(c2.Edit.Timestamp) < 1*time.Second) // read updated comment - res, code := getWithAdminAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=radio-t&url=https://radio-t.com/blah1", ts.URL, id)) + res, code := getWithAdminAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=remark42&url=https://radio-t.com/blah1", ts.URL, id)) assert.Equal(t, 200, code) c3 := store.Comment{} err = json.Unmarshal([]byte(res), &c3) @@ -225,11 +235,11 @@ func TestRest_UpdateDelete(t *testing.T) { defer teardown() c1 := store.Comment{Text: "test test #1", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}} id := addComment(t, c1, ts) // check multi count updated - resp, err := post(t, ts.URL+"/api/v1/counts?site=radio-t", `["https://radio-t.com/blah1","https://radio-t.com/blah2"]`) + resp, err := post(t, ts.URL+"/api/v1/counts?site=remark42", `["https://radio-t.com/blah1","https://radio-t.com/blah2"]`) require.NoError(t, err) assert.Equal(t, http.StatusOK, resp.StatusCode) bb, err := ioutil.ReadAll(resp.Body) @@ -242,7 +252,7 @@ func TestRest_UpdateDelete(t *testing.T) { // delete a comment client := http.Client{} - req, err := http.NewRequest(http.MethodPut, ts.URL+"/api/v1/comment/"+id+"?site=radio-t&url=https://radio-t.com/blah1", + req, err := http.NewRequest(http.MethodPut, ts.URL+"/api/v1/comment/"+id+"?site=remark42&url=https://radio-t.com/blah1", strings.NewReader(`{"delete": true, "summary":"removed by user"}`)) require.NoError(t, err) req.Header.Add("X-JWT", devToken) @@ -260,7 +270,7 @@ func TestRest_UpdateDelete(t *testing.T) { assert.True(t, c2.Deleted) // read updated comment - res, code := getWithDevAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=radio-t&url=https://radio-t.com/blah1", ts.URL, id)) + res, code := getWithDevAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=remark42&url=https://radio-t.com/blah1", ts.URL, id)) assert.Equal(t, 200, code) c3 := store.Comment{} err = json.Unmarshal([]byte(res), &c3) @@ -270,7 +280,7 @@ func TestRest_UpdateDelete(t *testing.T) { assert.True(t, c3.Deleted) // check multi count updated - resp, err = post(t, ts.URL+"/api/v1/counts?site=radio-t", `["https://radio-t.com/blah1","https://radio-t.com/blah2"]`) + resp, err = post(t, ts.URL+"/api/v1/counts?site=remark42", `["https://radio-t.com/blah1","https://radio-t.com/blah2"]`) assert.Nil(t, err) assert.Equal(t, http.StatusOK, resp.StatusCode) bb, err = ioutil.ReadAll(resp.Body) @@ -287,13 +297,13 @@ func TestRest_UpdateNotOwner(t *testing.T) { defer teardown() c1 := store.Comment{Text: "test test #1", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}, User: store.User{ID: "xyz"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}, User: store.User{ID: "xyz"}} id1, err := srv.DataService.Create(c1) assert.Nil(t, err) client := http.Client{} req, err := http.NewRequest(http.MethodPut, ts.URL+"/api/v1/comment/"+id1+ - "?site=radio-t&url=https://radio-t.com/blah1", strings.NewReader(`{"text":"updated text", "summary":"my edit"}`)) + "?site=remark42&url=https://radio-t.com/blah1", strings.NewReader(`{"text":"updated text", "summary":"my edit"}`)) assert.Nil(t, err) req.Header.Add("X-JWT", devToken) b, err := client.Do(req) @@ -305,7 +315,7 @@ func TestRest_UpdateNotOwner(t *testing.T) { client = http.Client{} req, err = http.NewRequest(http.MethodPut, ts.URL+"/api/v1/comment/"+id1+ - "?site=radio-t&url=https://radio-t.com/blah1", strings.NewReader(`ERRR "text":"updated text", "summary":"my"}`)) + "?site=remark42&url=https://radio-t.com/blah1", strings.NewReader(`ERRR "text":"updated text", "summary":"my"}`)) assert.Nil(t, err) req.Header.Add("X-JWT", devToken) b, err = client.Do(req) @@ -313,16 +323,34 @@ func TestRest_UpdateNotOwner(t *testing.T) { assert.Equal(t, 400, b.StatusCode, string(body), "update is not json") } +func TestRest_UpdateWrongAud(t *testing.T) { + ts, _, teardown := startupT(t) + defer teardown() + + c1 := store.Comment{Text: "test test #1", ParentID: "p1", + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}} + id := addComment(t, c1, ts) + + client := http.Client{} + req, err := http.NewRequest(http.MethodPut, ts.URL+"/api/v1/comment/"+id+"?site=remark42&url=https://radio-t.com/blah1", + strings.NewReader(`{"text":"updated text", "summary":"my edit"}`)) + assert.Nil(t, err) + req.Header.Add("X-JWT", devTokenBadAud) + b, err := client.Do(req) + assert.NoError(t, err) + assert.Equal(t, http.StatusForbidden, b.StatusCode, "reject update with wrong aut in jwt") +} + func TestRest_UpdateWithRestrictedWords(t *testing.T) { ts, _, teardown := startupT(t) defer teardown() c1 := store.Comment{Text: "What the quack is that?", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}} id := addComment(t, c1, ts) client := http.Client{} - req, err := http.NewRequest(http.MethodPut, ts.URL+"/api/v1/comment/"+id+"?site=radio-t&url=https://radio-t.com/blah1", + req, err := http.NewRequest(http.MethodPut, ts.URL+"/api/v1/comment/"+id+"?site=remark42&url=https://radio-t.com/blah1", strings.NewReader(`{"text":"What the duck is that?", "summary":"my edit"}`)) assert.Nil(t, err) req.Header.Add("X-JWT", devToken) @@ -343,9 +371,9 @@ func TestRest_Vote(t *testing.T) { defer teardown() c1 := store.Comment{Text: "test test #1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}} c2 := store.Comment{Text: "test test #2", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah"}} id1 := addComment(t, c1, ts) addComment(t, c2, ts) @@ -353,7 +381,7 @@ func TestRest_Vote(t *testing.T) { vote := func(val int) int { client := http.Client{} req, err := http.NewRequest(http.MethodPut, - fmt.Sprintf("%s/api/v1/vote/%s?site=radio-t&url=https://radio-t.com/blah&vote=%d", ts.URL, id1, val), nil) + fmt.Sprintf("%s/api/v1/vote/%s?site=remark42&url=https://radio-t.com/blah&vote=%d", ts.URL, id1, val), nil) assert.Nil(t, err) req.Header.Add("X-JWT", devToken) resp, err := client.Do(req) @@ -363,7 +391,7 @@ func TestRest_Vote(t *testing.T) { assert.Equal(t, 200, vote(1), "first vote allowed") assert.Equal(t, 400, vote(1), "second vote rejected") - body, code := getWithDevAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=radio-t&url=https://radio-t.com/blah", ts.URL, id1)) + body, code := getWithDevAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=remark42&url=https://radio-t.com/blah", ts.URL, id1)) assert.Equal(t, 200, code) cr := store.Comment{} err := json.Unmarshal([]byte(body), &cr) @@ -373,7 +401,7 @@ func TestRest_Vote(t *testing.T) { assert.Equal(t, map[string]bool(nil), cr.Votes) assert.Equal(t, 200, vote(-1), "opposite vote allowed") - body, code = getWithDevAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=radio-t&url=https://radio-t.com/blah", ts.URL, id1)) + body, code = getWithDevAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=remark42&url=https://radio-t.com/blah", ts.URL, id1)) assert.Equal(t, 200, code) cr = store.Comment{} err = json.Unmarshal([]byte(body), &cr) @@ -382,7 +410,7 @@ func TestRest_Vote(t *testing.T) { assert.Equal(t, 0, cr.Vote) assert.Equal(t, 200, vote(-1), "opposite vote allowed one more time") - body, code = getWithDevAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=radio-t&url=https://radio-t.com/blah", ts.URL, id1)) + body, code = getWithDevAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=remark42&url=https://radio-t.com/blah", ts.URL, id1)) assert.Equal(t, 200, code) cr = store.Comment{} err = json.Unmarshal([]byte(body), &cr) @@ -391,7 +419,7 @@ func TestRest_Vote(t *testing.T) { assert.Equal(t, -1, cr.Vote) assert.Equal(t, 400, vote(-1), "dbl vote not allowed") - body, code = getWithDevAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=radio-t&url=https://radio-t.com/blah", ts.URL, id1)) + body, code = getWithDevAuth(t, fmt.Sprintf("%s/api/v1/id/%s?site=remark42&url=https://radio-t.com/blah", ts.URL, id1)) assert.Equal(t, 200, code) cr = store.Comment{} err = json.Unmarshal([]byte(body), &cr) @@ -399,7 +427,7 @@ func TestRest_Vote(t *testing.T) { assert.Equal(t, -1, cr.Score) assert.Equal(t, -1, cr.Vote) - body, code = get(t, fmt.Sprintf("%s/api/v1/id/%s?site=radio-t&url=https://radio-t.com/blah", ts.URL, id1)) + body, code = get(t, fmt.Sprintf("%s/api/v1/id/%s?site=remark42&url=https://radio-t.com/blah", ts.URL, id1)) assert.Equal(t, 200, code) cr = store.Comment{} err = json.Unmarshal([]byte(body), &cr) @@ -409,7 +437,7 @@ func TestRest_Vote(t *testing.T) { assert.Equal(t, map[string]bool(nil), cr.Votes) req, err := http.NewRequest("GET", - fmt.Sprintf("%s/api/v1/id/%s?site=radio-t&url=https://radio-t.com/blah", ts.URL, id1), nil) + fmt.Sprintf("%s/api/v1/id/%s?site=remark42&url=https://radio-t.com/blah", ts.URL, id1), nil) assert.NoError(t, err) resp, err := sendReq(t, req, adminUmputunToken) assert.NoError(t, err) @@ -428,11 +456,11 @@ func TestRest_UserAllData(t *testing.T) { // write 3 comments user := store.User{ID: "dev", Name: "user name 1"} - c1 := store.Comment{User: user, Text: "test test #1", Locator: store.Locator{SiteID: "radio-t", + c1 := store.Comment{User: user, Text: "test test #1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}, Timestamp: time.Date(2018, 05, 27, 1, 14, 10, 0, time.Local)} - c2 := store.Comment{User: user, Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "radio-t", + c2 := store.Comment{User: user, Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}, Timestamp: time.Date(2018, 05, 27, 1, 14, 20, 0, time.Local)} - c3 := store.Comment{User: user, Text: "test test #3", ParentID: "p1", Locator: store.Locator{SiteID: "radio-t", + c3 := store.Comment{User: user, Text: "test test #3", ParentID: "p1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}, Timestamp: time.Date(2018, 05, 27, 1, 14, 25, 0, time.Local)} _, err := srv.DataService.Create(c1) require.Nil(t, err, "%+v", err) @@ -442,7 +470,7 @@ func TestRest_UserAllData(t *testing.T) { require.Nil(t, err) client := &http.Client{Timeout: 1 * time.Second} - req, err := http.NewRequest("GET", ts.URL+"/api/v1/userdata?site=radio-t", nil) + req, err := http.NewRequest("GET", ts.URL+"/api/v1/userdata?site=remark42", nil) require.Nil(t, err) req.Header.Add("X-JWT", devToken) resp, err := client.Do(req) @@ -471,7 +499,7 @@ func TestRest_UserAllData(t *testing.T) { Picture: "http://example.com/pic.png", IP: "127.0.0.1", SiteID: "remark42"}, parsed.Info) assert.Equal(t, 3, len(parsed.Comments)) - req, err = http.NewRequest("GET", ts.URL+"/api/v1/userdata?site=radio-t", nil) + req, err = http.NewRequest("GET", ts.URL+"/api/v1/userdata?site=remark42", nil) require.Nil(t, err) resp, err = client.Do(req) require.Nil(t, err) @@ -483,7 +511,7 @@ func TestRest_UserAllDataManyComments(t *testing.T) { defer teardown() user := store.User{ID: "dev", Name: "user name 1"} - c := store.Comment{User: user, Text: "test test #1", Locator: store.Locator{SiteID: "radio-t", + c := store.Comment{User: user, Text: "test test #1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}, Timestamp: time.Date(2018, 05, 27, 1, 14, 10, 0, time.Local)} for i := 0; i < 51; i++ { @@ -493,7 +521,7 @@ func TestRest_UserAllDataManyComments(t *testing.T) { require.Nil(t, err) } client := &http.Client{Timeout: 1 * time.Second} - req, err := http.NewRequest("GET", ts.URL+"/api/v1/userdata?site=radio-t", nil) + req, err := http.NewRequest("GET", ts.URL+"/api/v1/userdata?site=remark42", nil) require.Nil(t, err) req.Header.Add("X-JWT", devToken) resp, err := client.Do(req) @@ -516,7 +544,7 @@ func TestRest_DeleteMe(t *testing.T) { defer teardown() client := http.Client{} - req, err := http.NewRequest(http.MethodPost, fmt.Sprintf("%s/api/v1/deleteme?site=radio-t", ts.URL), nil) + req, err := http.NewRequest(http.MethodPost, fmt.Sprintf("%s/api/v1/deleteme?site=remark42", ts.URL), nil) assert.Nil(t, err) req.Header.Add("X-JWT", devToken) resp, err := client.Do(req) @@ -528,7 +556,7 @@ func TestRest_DeleteMe(t *testing.T) { m := map[string]string{} err = json.Unmarshal(body, &m) assert.Nil(t, err) - assert.Equal(t, "radio-t", m["site"]) + assert.Equal(t, "remark42", m["site"]) assert.Equal(t, "dev", m["user_id"]) token := m["token"] @@ -537,7 +565,7 @@ func TestRest_DeleteMe(t *testing.T) { assert.Equal(t, "dev", claims.User.ID) assert.Equal(t, "https://demo.remark42.com/web/deleteme.html?token="+token, m["link"]) - req, err = http.NewRequest(http.MethodPost, fmt.Sprintf("%s/api/v1/deleteme?site=radio-t", ts.URL), nil) + req, err = http.NewRequest(http.MethodPost, fmt.Sprintf("%s/api/v1/deleteme?site=remark42", ts.URL), nil) assert.Nil(t, err) resp, err = client.Do(req) assert.Nil(t, err) @@ -666,7 +694,7 @@ func TestRest_CreateWithPictures(t *testing.T) { id3 := uploadPicture("pic3.png") text := fmt.Sprintf(`text 123  *xxx*  `, id1, id2, id3) - body := fmt.Sprintf(`{"text": "%s", "locator":{"url": "https://radio-t.com/blah1", "site": "radio-t"}}`, text) + body := fmt.Sprintf(`{"text": "%s", "locator":{"url": "https://radio-t.com/blah1", "site": "remark42"}}`, text) resp, err := post(t, ts.URL+"/api/v1/comment", body) assert.Nil(t, err) diff --git a/backend/app/rest/api/rest_public_test.go b/backend/app/rest/api/rest_public_test.go index 1997393b..cc0c5c9b 100644 --- a/backend/app/rest/api/rest_public_test.go +++ b/backend/app/rest/api/rest_public_test.go @@ -78,7 +78,7 @@ func TestRest_Find(t *testing.T) { ts, _, teardown := startupT(t) defer teardown() - res, code := get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah1") + res, code := get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah1") assert.Equal(t, 200, code) comments := commentsWithInfo{} err := json.Unmarshal([]byte(res), &comments) @@ -86,17 +86,17 @@ func TestRest_Find(t *testing.T) { assert.Equal(t, 0, len(comments.Comments), "should have 0 comments") c1 := store.Comment{Text: "test test #1", ParentID: "", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}} id1 := addComment(t, c1, ts) c2 := store.Comment{Text: "test test #2", ParentID: id1, - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}} id2 := addComment(t, c2, ts) assert.NotEqual(t, id1, id2) // get sorted by +time - res, code = get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah1&sort=+time") + res, code = get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah1&sort=+time") assert.Equal(t, 200, code) comments = commentsWithInfo{} err = json.Unmarshal([]byte(res), &comments) @@ -112,7 +112,7 @@ func TestRest_Find(t *testing.T) { assert.True(t, comments.Info.FirstTS.Before(comments.Info.LastTS)) // get sorted by -time - res, code = get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah1&sort=-time") + res, code = get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah1&sort=-time") assert.Equal(t, 200, code) err = json.Unmarshal([]byte(res), &comments) assert.Nil(t, err) @@ -122,7 +122,7 @@ func TestRest_Find(t *testing.T) { // get in tree mode tree := service.Tree{} - res, code = get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah1&format=tree") + res, code = get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah1&format=tree") assert.Equal(t, 200, code) err = json.Unmarshal([]byte(res), &tree) assert.Nil(t, err) @@ -138,25 +138,25 @@ func TestRest_FindAge(t *testing.T) { defer teardown() c1 := store.Comment{Text: "test test #1", ParentID: "", Timestamp: time.Now().AddDate(0, 0, -5), - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}, User: store.User{ID: "u1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}, User: store.User{ID: "u1"}} _, err := srv.DataService.Create(c1) require.Nil(t, err) c2 := store.Comment{Text: "test test #2", ParentID: "", Timestamp: time.Now().AddDate(0, 0, -15), - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah2"}, User: store.User{ID: "u1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah2"}, User: store.User{ID: "u1"}} _, err = srv.DataService.Create(c2) require.Nil(t, err) tree := service.Tree{} - res, code := get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah1&format=tree") + res, code := get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah1&format=tree") assert.Equal(t, 200, code) err = json.Unmarshal([]byte(res), &tree) assert.Nil(t, err) assert.Equal(t, "https://radio-t.com/blah1", tree.Info.URL) assert.False(t, tree.Info.ReadOnly, "post is fresh") - res, code = get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah2&format=tree") + res, code = get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah2&format=tree") assert.Equal(t, 200, code) err = json.Unmarshal([]byte(res), &tree) assert.Nil(t, err) @@ -169,27 +169,27 @@ func TestRest_FindReadOnly(t *testing.T) { defer teardown() c1 := store.Comment{Text: "test test #1", ParentID: "", Timestamp: time.Now().AddDate(0, 0, -1), - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}, User: store.User{ID: "u1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}, User: store.User{ID: "u1"}} _, err := srv.DataService.Create(c1) require.Nil(t, err) c2 := store.Comment{Text: "test test #2", ParentID: "", Timestamp: time.Now().AddDate(0, 0, -2), - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah2"}, User: store.User{ID: "u1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah2"}, User: store.User{ID: "u1"}} _, err = srv.DataService.Create(c2) require.Nil(t, err) // set post to read-only client := http.Client{} req, err := http.NewRequest(http.MethodPut, - fmt.Sprintf("%s/api/v1/admin/readonly?site=radio-t&url=https://radio-t.com/blah1&ro=1", ts.URL), nil) + fmt.Sprintf("%s/api/v1/admin/readonly?site=remark42&url=https://radio-t.com/blah1&ro=1", ts.URL), nil) assert.Nil(t, err) req.SetBasicAuth("admin", "password") _, err = client.Do(req) require.Nil(t, err) tree := service.Tree{} - res, code := get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah1&format=tree") + res, code := get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah1&format=tree") assert.Equal(t, 200, code) err = json.Unmarshal([]byte(res), &tree) require.Nil(t, err) @@ -197,7 +197,7 @@ func TestRest_FindReadOnly(t *testing.T) { assert.True(t, tree.Info.ReadOnly, "post is ro") tree = service.Tree{} - res, code = get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah2&format=tree") + res, code = get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah2&format=tree") assert.Equal(t, 200, code) err = json.Unmarshal([]byte(res), &tree) require.Nil(t, err) @@ -209,7 +209,7 @@ func TestRest_FindUserView(t *testing.T) { ts, _, teardown := startupT(t) defer teardown() - res, code := get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah1&view=user") + res, code := get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah1&view=user") assert.Equal(t, 200, code) comments := commentsWithInfo{} err := json.Unmarshal([]byte(res), &comments) @@ -217,17 +217,17 @@ func TestRest_FindUserView(t *testing.T) { assert.Equal(t, 0, len(comments.Comments), "should have 0 comments") c1 := store.Comment{Text: "test test #1", ParentID: "", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}} id1 := addComment(t, c1, ts) c2 := store.Comment{Text: "test test #2", ParentID: id1, - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}} id2 := addComment(t, c2, ts) assert.NotEqual(t, id1, id2) // get sorted by +time with view=user - res, code = get(t, ts.URL+"/api/v1/find?site=radio-t&url=https://radio-t.com/blah1&sort=+time&view=user") + res, code = get(t, ts.URL+"/api/v1/find?site=remark42&url=https://radio-t.com/blah1&sort=+time&view=user") assert.Equal(t, 200, code) comments = commentsWithInfo{} err = json.Unmarshal([]byte(res), &comments) @@ -245,14 +245,14 @@ func TestRest_Last(t *testing.T) { ts, srv, teardown := startupT(t) defer teardown() - res, code := get(t, ts.URL+"/api/v1/last/2?site=radio-t") + res, code := get(t, ts.URL+"/api/v1/last/2?site=remark42") assert.Equal(t, 200, code) assert.Equal(t, "[]\n", res, "empty last should return empty list") c1 := store.Comment{Text: "test test #1", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}} c2 := store.Comment{Text: "test test #2", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah2"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah2"}} // add 3 comments ts1 := time.Now().UnixNano() / 1000000 @@ -262,7 +262,7 @@ func TestRest_Last(t *testing.T) { ts2 := time.Now().UnixNano() / 1000000 id2 := addComment(t, c2, ts) - res, code = get(t, ts.URL+"/api/v1/last/2?site=radio-t") + res, code = get(t, ts.URL+"/api/v1/last/2?site=remark42") assert.Equal(t, 200, code) comments := []store.Comment{} err := json.Unmarshal([]byte(res), &comments) @@ -271,7 +271,7 @@ func TestRest_Last(t *testing.T) { assert.Equal(t, id1, comments[1].ID) assert.Equal(t, id2, comments[0].ID) - res, code = get(t, fmt.Sprintf("%s/api/v1/last/2?site=radio-t&since=%d", ts.URL, ts1)) + res, code = get(t, fmt.Sprintf("%s/api/v1/last/2?site=remark42&since=%d", ts.URL, ts1)) assert.Equal(t, 200, code) comments = []store.Comment{} err = json.Unmarshal([]byte(res), &comments) @@ -280,7 +280,7 @@ func TestRest_Last(t *testing.T) { assert.Equal(t, id1, comments[1].ID) assert.Equal(t, id2, comments[0].ID) - res, code = get(t, fmt.Sprintf("%s/api/v1/last/2?site=radio-t&since=%d", ts.URL, ts2)) + res, code = get(t, fmt.Sprintf("%s/api/v1/last/2?site=remark42&since=%d", ts.URL, ts2)) assert.Equal(t, 200, code) comments = []store.Comment{} err = json.Unmarshal([]byte(res), &comments) @@ -288,29 +288,29 @@ func TestRest_Last(t *testing.T) { assert.Equal(t, 1, len(comments), "should have 1 comments") assert.Equal(t, id2, comments[0].ID) - res, code = get(t, ts.URL+"/api/v1/last/5?site=radio-t") + res, code = get(t, ts.URL+"/api/v1/last/5?site=remark42") assert.Equal(t, 200, code) err = json.Unmarshal([]byte(res), &comments) assert.Nil(t, err) assert.Equal(t, 3, len(comments), "should have 3 comments") - res, code = get(t, ts.URL+"/api/v1/last/X?site=radio-t") + res, code = get(t, ts.URL+"/api/v1/last/X?site=remark42") assert.Equal(t, 200, code) err = json.Unmarshal([]byte(res), &comments) assert.Nil(t, err) assert.Equal(t, 3, len(comments), "should have 3 comments") - err = srv.DataService.Delete(store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}, id1, store.SoftDelete) + err = srv.DataService.Delete(store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}, id1, store.SoftDelete) assert.Nil(t, err) srv.Cache.Flush(cache.FlusherRequest{}) - res, code = get(t, ts.URL+"/api/v1/last/5?site=radio-t") + res, code = get(t, ts.URL+"/api/v1/last/5?site=remark42") assert.Equal(t, 200, code) err = json.Unmarshal([]byte(res), &comments) assert.Nil(t, err) assert.Equal(t, 2, len(comments), "should have 2 comments") t.Logf("%+v", comments) - _, code = get(t, ts.URL+"/api/v1/last/2?site=radio-t-BLAH") + _, code = get(t, ts.URL+"/api/v1/last/2?site=remark42-BLAH") assert.Equal(t, 500, code) } @@ -319,9 +319,9 @@ func TestRest_FindUserComments(t *testing.T) { defer teardown() c1 := store.Comment{Text: "test test #1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}} c2 := store.Comment{Text: "test test #3", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah2"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah2"}} // add 3 comments addComment(t, c1, ts) @@ -333,10 +333,10 @@ func TestRest_FindUserComments(t *testing.T) { err := srv.DataService.Delete(c2.Locator, id, store.SoftDelete) assert.NoError(t, err) - _, code := get(t, ts.URL+"/api/v1/comments?site=radio-t&user=blah") + _, code := get(t, ts.URL+"/api/v1/comments?site=remark42&user=blah") assert.Equal(t, 400, code, "noting for user blah") - res, code := get(t, ts.URL+"/api/v1/comments?site=radio-t&user=dev") + res, code := get(t, ts.URL+"/api/v1/comments?site=remark42&user=dev") assert.Equal(t, 200, code) resp := struct { @@ -354,7 +354,7 @@ func TestRest_UserInfo(t *testing.T) { ts, _, teardown := startupT(t) defer teardown() - body, code := getWithDevAuth(t, ts.URL+"/api/v1/user?site=radio-t") + body, code := getWithDevAuth(t, ts.URL+"/api/v1/user?site=remark42") assert.Equal(t, 200, code) user := store.User{} err := json.Unmarshal([]byte(body), &user) @@ -368,9 +368,9 @@ func TestRest_Count(t *testing.T) { defer teardown() c1 := store.Comment{Text: "test test #1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}} c2 := store.Comment{Text: "test test #2", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah2"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah2"}} addComment(t, c1, ts) addComment(t, c1, ts) @@ -378,20 +378,20 @@ func TestRest_Count(t *testing.T) { addComment(t, c2, ts) addComment(t, c2, ts) - body, code := get(t, ts.URL+"/api/v1/count?site=radio-t&url=https://radio-t.com/blah1") + body, code := get(t, ts.URL+"/api/v1/count?site=remark42&url=https://radio-t.com/blah1") assert.Equal(t, 200, code) j := R.JSON{} err := json.Unmarshal([]byte(body), &j) assert.Nil(t, err) assert.Equal(t, 3.0, j["count"]) - body, code = get(t, ts.URL+"/api/v1/count?site=radio-t&url=https://radio-t.com/blah2") + body, code = get(t, ts.URL+"/api/v1/count?site=remark42&url=https://radio-t.com/blah2") assert.Equal(t, 200, code) err = json.Unmarshal([]byte(body), &j) assert.Nil(t, err) assert.Equal(t, 2.0, j["count"]) - _, code = get(t, ts.URL+"/api/v1/count?site=radio-t-BLAH&url=https://radio-t.com/blah1XXX") + _, code = get(t, ts.URL+"/api/v1/count?site=remark42-BLAH&url=https://radio-t.com/blah1XXX") assert.Equal(t, 400, code) } @@ -400,9 +400,9 @@ func TestRest_Counts(t *testing.T) { defer teardown() c1 := store.Comment{Text: "test test #1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}} c2 := store.Comment{Text: "test test #2", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah2"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah2"}} addComment(t, c1, ts) addComment(t, c1, ts) @@ -410,7 +410,7 @@ func TestRest_Counts(t *testing.T) { addComment(t, c2, ts) addComment(t, c2, ts) - resp, err := post(t, ts.URL+"/api/v1/counts?site=radio-t", `["https://radio-t.com/blah1","https://radio-t.com/blah2"]`) + resp, err := post(t, ts.URL+"/api/v1/counts?site=remark42", `["https://radio-t.com/blah1","https://radio-t.com/blah2"]`) assert.Nil(t, err) assert.Equal(t, http.StatusOK, resp.StatusCode) @@ -433,9 +433,9 @@ func TestRest_List(t *testing.T) { defer teardown() c1 := store.Comment{Text: "test test #1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}} c2 := store.Comment{Text: "test test #2", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah2"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah2"}} addComment(t, c1, ts) addComment(t, c1, ts) @@ -443,7 +443,7 @@ func TestRest_List(t *testing.T) { addComment(t, c2, ts) addComment(t, c2, ts) - body, code := get(t, ts.URL+"/api/v1/list?site=radio-t") + body, code := get(t, ts.URL+"/api/v1/list?site=remark42") assert.Equal(t, 200, code) pi := []store.PostInfo{} err := json.Unmarshal([]byte(body), &pi) @@ -453,7 +453,7 @@ func TestRest_List(t *testing.T) { assert.Equal(t, "https://radio-t.com/blah1", pi[1].URL) assert.Equal(t, 3, pi[1].Count) - _, code = get(t, ts.URL+"/api/v1/list?site=radio-t-BLAH") + _, code = get(t, ts.URL+"/api/v1/list?site=remark42-BLAH") assert.Equal(t, 400, code) } @@ -462,11 +462,11 @@ func TestRest_ListWithSkipAndLimit(t *testing.T) { defer teardown() c1 := store.Comment{Text: "test test #1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah1"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}} c2 := store.Comment{Text: "test test #2", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah2"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah2"}} c3 := store.Comment{Text: "test test #3", ParentID: "p1", - Locator: store.Locator{SiteID: "radio-t", URL: "https://radio-t.com/blah3"}} + Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah3"}} addComment(t, c1, ts) addComment(t, c1, ts) @@ -476,7 +476,7 @@ func TestRest_ListWithSkipAndLimit(t *testing.T) { addComment(t, c3, ts) addComment(t, c3, ts) - body, code := get(t, ts.URL+"/api/v1/list?site=radio-t&skip=1&limit=2") + body, code := get(t, ts.URL+"/api/v1/list?site=remark42&skip=1&limit=2") assert.Equal(t, 200, code) pi := []store.PostInfo{} err := json.Unmarshal([]byte(body), &pi) @@ -492,7 +492,7 @@ func TestRest_Config(t *testing.T) { ts, _, teardown := startupT(t) defer teardown() - body, code := get(t, ts.URL+"/api/v1/config?site=radio-t") + body, code := get(t, ts.URL+"/api/v1/config?site=remark42") assert.Equal(t, 200, code) j := R.JSON{} err := json.Unmarshal([]byte(body), &j) @@ -517,11 +517,11 @@ func TestRest_Info(t *testing.T) { srv.pubRest.readOnlyAge = 10000000 // make sure we don't hit read-only user := store.User{ID: "user1", Name: "user name 1"} - c1 := store.Comment{User: user, Text: "test test #1", Locator: store.Locator{SiteID: "radio-t", + c1 := store.Comment{User: user, Text: "test test #1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}, Timestamp: time.Date(2018, 05, 27, 1, 14, 10, 0, time.Local)} - c2 := store.Comment{User: user, Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "radio-t", + c2 := store.Comment{User: user, Text: "test test #2", ParentID: "p1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}, Timestamp: time.Date(2018, 05, 27, 1, 14, 20, 0, time.Local)} - c3 := store.Comment{User: user, Text: "test test #3", ParentID: "p1", Locator: store.Locator{SiteID: "radio-t", + c3 := store.Comment{User: user, Text: "test test #3", ParentID: "p1", Locator: store.Locator{SiteID: "remark42", URL: "https://radio-t.com/blah1"}, Timestamp: time.Date(2018, 05, 27, 1, 14, 25, 0, time.Local)} _, err := srv.DataService.Create(c1) @@ -531,7 +531,7 @@ func TestRest_Info(t *testing.T) { _, err = srv.DataService.Create(c3) require.Nil(t, err) - body, code := get(t, ts.URL+"/api/v1/info?site=radio-t&url=https://radio-t.com/blah1") + body, code := get(t, ts.URL+"/api/v1/info?site=remark42&url=https://radio-t.com/blah1") assert.Equal(t, 200, code) info := store.PostInfo{} @@ -541,9 +541,9 @@ func TestRest_Info(t *testing.T) { FirstTS: time.Date(2018, 05, 27, 1, 14, 10, 0, time.Local), LastTS: time.Date(2018, 05, 27, 1, 14, 25, 0, time.Local)} assert.Equal(t, exp, info) - _, code = get(t, ts.URL+"/api/v1/info?site=radio-t&url=https://radio-t.com/blah-no") + _, code = get(t, ts.URL+"/api/v1/info?site=remark42&url=https://radio-t.com/blah-no") assert.Equal(t, 400, code) - _, code = get(t, ts.URL+"/api/v1/info?site=radio-t-no&url=https://radio-t.com/blah-no") + _, code = get(t, ts.URL+"/api/v1/info?site=remark42-no&url=https://radio-t.com/blah-no") assert.Equal(t, 400, code) } @@ -567,7 +567,7 @@ func TestRest_InfoStream(t *testing.T) { } }() - body, code := get(t, ts.URL+"/api/v1/stream/info?site=radio-t&url=https://radio-t.com/blah1") + body, code := get(t, ts.URL+"/api/v1/stream/info?site=remark42&url=https://radio-t.com/blah1") assert.Equal(t, 200, code) wg.Wait() @@ -577,7 +577,7 @@ func TestRest_InfoStream(t *testing.T) { assert.True(t, strings.Contains(recs[0+1], `"count":2`), recs[0]) assert.True(t, strings.Contains(recs[9*3+1], `"count":11`), recs[9]) - _, code = get(t, ts.URL+"/api/v1/stream/info?site=radio-t&url=https://radio-t.com/blah123") + _, code = get(t, ts.URL+"/api/v1/stream/info?site=remark42&url=https://radio-t.com/blah123") assert.Equal(t, 500, code) } @@ -596,7 +596,7 @@ func TestRest_InfoStreamTooMany(t *testing.T) { wg.Add(20) for i := 0; i < 20; i++ { go func() { - _, code := get(t, ts.URL+"/api/v1/stream/info?site=radio-t&url=https://radio-t.com/blah1") + _, code := get(t, ts.URL+"/api/v1/stream/info?site=remark42&url=https://radio-t.com/blah1") if code == 429 { atomic.AddInt32(&errsCount, 1) } @@ -618,7 +618,7 @@ func TestRest_InfoStreamTimeout(t *testing.T) { postComment(t, ts.URL) st := time.Now() - _, code := get(t, ts.URL+"/api/v1/stream/info?site=radio-t&url=https://radio-t.com/blah1") + _, code := get(t, ts.URL+"/api/v1/stream/info?site=remark42&url=https://radio-t.com/blah1") assert.Equal(t, 200, code) assert.True(t, time.Since(st) > time.Millisecond*450 && time.Since(st) < time.Millisecond*500, time.Since(st)) } @@ -645,7 +645,7 @@ func TestRest_InfoStreamCancel(t *testing.T) { }() client := http.Client{} - req, err := http.NewRequest("GET", ts.URL+"/api/v1/stream/info?site=radio-t&url=https://radio-t.com/blah1", nil) + req, err := http.NewRequest("GET", ts.URL+"/api/v1/stream/info?site=remark42&url=https://radio-t.com/blah1", nil) require.Nil(t, err) ctx, cancel := context.WithTimeout(context.Background(), 290*time.Millisecond) defer cancel() @@ -687,7 +687,7 @@ func TestRest_InfoStreamSince(t *testing.T) { } }() - body, code := get(t, ts.URL+"/api/v1/stream/info?site=radio-t&url=https://radio-t.com/blah1&since=12345678") + body, code := get(t, ts.URL+"/api/v1/stream/info?site=remark42&url=https://radio-t.com/blah1&since=12345678") assert.Equal(t, 200, code) wg.Wait() @@ -728,7 +728,7 @@ func TestRest_LastCommentsStream(t *testing.T) { }() client := http.Client{} - req, err := http.NewRequest("GET", ts.URL+"/api/v1/stream/last?site=radio-t", nil) + req, err := http.NewRequest("GET", ts.URL+"/api/v1/stream/last?site=remark42", nil) require.Nil(t, err) r, err := client.Do(req) require.Nil(t, err) @@ -759,7 +759,7 @@ func TestRest_LastCommentsStreamTimeout(t *testing.T) { postComment(t, ts.URL) st := time.Now() - _, code := get(t, ts.URL+"/api/v1/stream/last?site=radio-t") + _, code := get(t, ts.URL+"/api/v1/stream/last?site=remark42") assert.Equal(t, 200, code) assert.True(t, time.Since(st) > time.Millisecond*450 && time.Since(st) < time.Millisecond*500, time.Since(st)) } @@ -785,7 +785,7 @@ func TestRest_LastCommentsStreamCancel(t *testing.T) { }() client := http.Client{} - req, err := http.NewRequest("GET", ts.URL+"/api/v1/stream/last?site=radio-t", nil) + req, err := http.NewRequest("GET", ts.URL+"/api/v1/stream/last?site=remark42", nil) require.Nil(t, err) ctx, cancel := context.WithTimeout(context.Background(), 290*time.Millisecond) defer cancel() @@ -819,7 +819,7 @@ func TestRest_LastCommentsStreamTooMany(t *testing.T) { wg.Add(20) for i := 0; i < 20; i++ { go func() { - _, code := get(t, ts.URL+"/api/v1/stream/last?site=radio-t") + _, code := get(t, ts.URL+"/api/v1/stream/last?site=remark42") if code == 429 { atomic.AddInt32(&errsCount, 1) } @@ -829,7 +829,7 @@ func TestRest_LastCommentsStreamTooMany(t *testing.T) { wg.Wait() assert.Equal(t, int32(10), atomic.LoadInt32(&errsCount), "10 streams rejected") - _, code := get(t, ts.URL+"/api/v1/stream/last?site=radio-t") + _, code := get(t, ts.URL+"/api/v1/stream/last?site=remark42") assert.Equal(t, 200, code, "all streams closed, good to go again") } @@ -854,7 +854,7 @@ func TestRest_LastCommentsStreamSince(t *testing.T) { }() client := http.Client{} - req, err := http.NewRequest("GET", ts.URL+"/api/v1/stream/last?site=radio-t&since=123456", nil) + req, err := http.NewRequest("GET", ts.URL+"/api/v1/stream/last?site=remark42&since=123456", nil) require.Nil(t, err) r, err := client.Do(req) require.Nil(t, err) @@ -874,7 +874,7 @@ func TestRest_LastCommentsStreamSince(t *testing.T) { func postComment(t *testing.T, url string) { resp, e := post(t, url+"/api/v1/comment", - `{"text": "test 123", "locator":{"url": "https://radio-t.com/blah1", "site": "radio-t"}}`) + `{"text": "test 123", "locator":{"url": "https://radio-t.com/blah1", "site": "remark42"}}`) require.Nil(t, e) b, e := ioutil.ReadAll(resp.Body) require.Nil(t, e) diff --git a/backend/app/rest/api/rest_test.go b/backend/app/rest/api/rest_test.go index 5bc7694a..22e83122 100644 --- a/backend/app/rest/api/rest_test.go +++ b/backend/app/rest/api/rest_test.go @@ -39,16 +39,11 @@ import ( var testHTML = "/tmp/test-remark.html" var getStartedHTML = "/tmp/getstarted.html" -var devToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9." + - "eyJhdWQiOiJyZW1hcms0MiIsImV4cCI6Mzc4OTE5MTgyMiwianRpIjoicmFuZG9tIGlkIiwiaXNzIjoicmVtYXJrNDIiLCJuYmYiOjE1MjE4ODQyMjIs" + - "InVzZXIiOnsibmFtZSI6ImRldmVsb3BlciBvbmUiLCJpZCI6ImRldiIsInBpY3R1cmUiOiJodHRwOi8vZXhhbXBsZS5jb20vcGljLnBuZyIsImlwIjoiMT" + - "I3LjAuMC4xIiwiZW1haWwiOiJtZUBleGFtcGxlLmNvbSJ9fQ.aKUAXiZxXypgV7m1wEOgUcyPOvUDXHDi3A06YWKbcLg" +var devToken = `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJyZW1hcms0MiIsImV4cCI6Mzc4OTE5MTgyMiwianRpIjoicmFuZG9tIGlkIiwiaXNzIjoicmVtYXJrNDIiLCJuYmYiOjE1MjE4ODQyMjIsInVzZXIiOnsibmFtZSI6ImRldmVsb3BlciBvbmUiLCJpZCI6ImRldiIsInBpY3R1cmUiOiJodHRwOi8vZXhhbXBsZS5jb20vcGljLnBuZyIsImlwIjoiMTI3LjAuMC4xIiwiZW1haWwiOiJtZUBleGFtcGxlLmNvbSJ9fQ.aKUAXiZxXypgV7m1wEOgUcyPOvUDXHDi3A06YWKbcLg` -var adminUmputunToken = "eyJhbGciOiJIUzI1NiJ9." + - "eyJhdWQiOiJyYWRpb3QiLCJleHAiOjE5NTQ1OTc5ODAsImp0aSI6Ijk3YTJlMGFjNGRjN2Q1ZjY5MjZkNWU4NjIwYWNlZjlhNDBjMCIsImlhdCI6MTQ1" + - "NDU5NzY4MCwiaXNzIjoicmVtYXJrNDIiLCJ1c2VyIjp7Im5hbWUiOiJVbXB1dHVuIiwiaWQiOiJnaXRodWJfZWYwZjcwNmE3IiwicGljdHVyZSI6Imh0" + - "dHBzOi8vcmVtYXJrNDIucmFkaW8tdC5jb20vYXBpL3YxL2F2YXRhci9jYjQyZmY0OTNhZGU2OTZkODhhM2E1OTBmMTM2YWU5ZTM0ZGU3YzFiLmltYWdlI" + - "iwiYXR0cnMiOnsiYWRtaW4iOnRydWUsImJsb2NrZWQiOmZhbHNlfX19.gAR_sZT7hTx7CNHByyrJQWMB5tAtoiISAiG8kes1IjA" +var devTokenBadAud = `eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJyZW1hcms0Ml9iYWQiLCJleHAiOjM3ODkxOTE4MjIsImp0aSI6InJhbmRvbSBpZCIsImlzcyI6InJlbWFyazQyIiwibmJmIjoxNTIxODg0MjIyLCJ1c2VyIjp7Im5hbWUiOiJkZXZlbG9wZXIgb25lIiwiaWQiOiJkZXYiLCJwaWN0dXJlIjoiaHR0cDovL2V4YW1wbGUuY29tL3BpYy5wbmciLCJpcCI6IjEyNy4wLjAuMSIsImVtYWlsIjoibWVAZXhhbXBsZS5jb20ifX0.FuTTocVtcxr4VjpfIICvU2yOb3su28VkDzj94H9Q3xY` + +var adminUmputunToken = `eyJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJyZW1hcms0MiIsImV4cCI6MTk1NDU5Nzk4MCwianRpIjoiOTdhMmUwYWM0ZGM3ZDVmNjkyNmQ1ZTg2MjBhY2VmOWE0MGMwIiwiaWF0IjoxNDU0NTk3NjgwLCJpc3MiOiJyZW1hcms0MiIsInVzZXIiOnsibmFtZSI6IlVtcHV0dW4iLCJpZCI6ImdpdGh1Yl9lZjBmNzA2YTciLCJwaWN0dXJlIjoiaHR0cHM6Ly9yZW1hcms0Mi5yYWRpby10LmNvbS9hcGkvdjEvYXZhdGFyL2NiNDJmZjQ5M2FkZTY5NmQ4OGEzYTU5MGYxMzZhZTllMzRkZTdjMWIuaW1hZ2UiLCJhdHRycyI6eyJhZG1pbiI6dHJ1ZSwiYmxvY2tlZCI6ZmFsc2V9fX0.dZiOjWHguo9f42XCMooMcv4EmYFzifl_-LEvPZHCtks` func TestRest_FileServer(t *testing.T) { ts, _, teardown := startupT(t) @@ -290,13 +285,13 @@ func startupT(t *testing.T) (ts *httptest.Server, srv *Rest, teardown func()) { os.RemoveAll("/tmp/ava-remark42") os.RemoveAll("/tmp/pics-remark42") - b, err := engine.NewBoltDB(bolt.Options{}, engine.BoltSite{FileName: testDb, SiteID: "radio-t"}) + b, err := engine.NewBoltDB(bolt.Options{}, engine.BoltSite{FileName: testDb, SiteID: "remark42"}) require.Nil(t, err) memCache, err := cache.NewMemoryCache() assert.NoError(t, err) - astore := adminstore.NewStaticStore("123456", []string{"a1", "a2"}, "admin@remark-42.com") + astore := adminstore.NewStaticStore("123456", []string{"remark42"}, []string{"a1", "a2"}, "admin@remark-42.com") restrictedWordsMatcher := service.NewRestrictedWordsMatcher(service.StaticRestrictedWordsLister{Words: []string{"duck"}}) dataStore := &service.DataStore{ diff --git a/backend/app/rest/api/rss_test.go b/backend/app/rest/api/rss_test.go index bab6c832..d175f9bb 100644 --- a/backend/app/rest/api/rss_test.go +++ b/backend/app/rest/api/rss_test.go @@ -22,7 +22,7 @@ func TestServer_RssPost(t *testing.T) { c1 := store.Comment{ ID: "1234567890", Text: "test 123", - Locator: store.Locator{URL: "https://radio-t.com/blah1", SiteID: "radio-t"}, + Locator: store.Locator{URL: "https://radio-t.com/blah1", SiteID: "remark42"}, User: store.User{ID: "u1", Name: "developer one"}, } id1, err := rst.DataService.Create(c1) @@ -30,7 +30,7 @@ func TestServer_RssPost(t *testing.T) { assert.Equal(t, "1234567890", id1) pubDate := time.Now().Format(time.RFC1123Z) - res, code := get(t, ts.URL+"/api/v1/rss/post?site=radio-t&url=https://radio-t.com/blah1") + res, code := get(t, ts.URL+"/api/v1/rss/post?site=remark42&url=https://radio-t.com/blah1") assert.Equal(t, 200, code) t.Log(res) @@ -54,7 +54,7 @@ func TestServer_RssPost(t *testing.T) { expected, res = cleanRssFormatting(expected, res) assert.Equal(t, expected, res) - _, code = get(t, ts.URL+"/api/v1/rss/post?site=radio-t-bad&url=https://radio-t.com/blah1") + _, code = get(t, ts.URL+"/api/v1/rss/post?site=remark42-bad&url=https://radio-t.com/blah1") assert.Equal(t, 400, code) } @@ -69,13 +69,13 @@ func TestServer_RssSite(t *testing.T) { c1 := store.Comment{ ID: "comment-id-1", Text: "test 123", - Locator: store.Locator{URL: "https://radio-t.com/blah10", SiteID: "radio-t"}, + Locator: store.Locator{URL: "https://radio-t.com/blah10", SiteID: "remark42"}, User: store.User{ID: "u1", Name: "developer one"}, } c2 := store.Comment{ ID: "comment-id-2", Text: "xyz test", - Locator: store.Locator{URL: "https://radio-t.com/blah11", SiteID: "radio-t"}, + Locator: store.Locator{URL: "https://radio-t.com/blah11", SiteID: "remark42"}, User: store.User{ID: "u1", Name: "developer one"}, } @@ -85,15 +85,15 @@ func TestServer_RssSite(t *testing.T) { require.NoError(t, err) require.NoError(t, err) - res, code := get(t, ts.URL+"/api/v1/rss/site?site=radio-t") + res, code := get(t, ts.URL+"/api/v1/rss/site?site=remark42") assert.Equal(t, 200, code) t.Log(res) expected := fmt.Sprintf(`