bloat/service/transport.go

705 lines
18 KiB
Go
Raw Normal View History

2019-12-13 18:08:26 +00:00
package service
import (
2021-03-20 05:12:48 +00:00
"context"
2020-01-08 18:16:06 +00:00
"encoding/json"
"log"
2019-12-13 18:08:26 +00:00
"net/http"
2019-12-26 19:18:09 +00:00
"strconv"
2019-12-29 05:59:31 +00:00
"time"
2020-01-01 15:58:27 +00:00
"bloat/mastodon"
2020-01-01 15:58:27 +00:00
"bloat/model"
2021-03-20 05:12:48 +00:00
"bloat/renderer"
2019-12-13 18:08:26 +00:00
"github.com/gorilla/mux"
)
2020-04-19 08:18:36 +00:00
const (
sessionExp = 365 * 24 * time.Hour
)
const (
2021-03-20 05:12:48 +00:00
HTML int = iota
JSON
)
const (
2021-03-20 05:12:48 +00:00
NOAUTH int = iota
SESSION
CSRF
)
type client struct {
*mastodon.Client
2021-03-20 05:12:48 +00:00
w http.ResponseWriter
r *http.Request
s model.Session
csrf string
ctx context.Context
rctx *renderer.Context
}
func setSessionCookie(w http.ResponseWriter, sid string, exp time.Duration) {
2020-04-19 08:18:36 +00:00
http.SetCookie(w, &http.Cookie{
Name: "session_id",
Value: sid,
2020-04-19 08:18:36 +00:00
Expires: time.Now().Add(exp),
})
}
func writeJson(c *client, data interface{}) error {
2021-03-20 05:12:48 +00:00
return json.NewEncoder(c.w).Encode(map[string]interface{}{
"data": data,
})
2020-01-28 17:51:00 +00:00
}
2019-12-13 18:08:26 +00:00
func serveJsonError(w http.ResponseWriter, err error) {
var d = make(map[string]interface{})
d["error"] = err.Error()
2020-11-09 12:10:29 +00:00
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(w).Encode(d)
return
}
func redirect(c *client, url string) {
2021-03-20 05:12:48 +00:00
c.w.Header().Add("Location", url)
c.w.WriteHeader(http.StatusFound)
}
2019-12-13 18:08:26 +00:00
func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
2019-12-13 18:08:26 +00:00
r := mux.NewRouter()
2019-12-13 20:23:15 +00:00
writeError := func(c *client, err error, t int, retry bool) {
switch t {
case HTML:
2021-03-20 05:12:48 +00:00
c.w.WriteHeader(http.StatusInternalServerError)
s.ErrorPage(c, err, retry)
case JSON:
2021-03-20 05:12:48 +00:00
c.w.WriteHeader(http.StatusInternalServerError)
json.NewEncoder(c.w).Encode(map[string]string{
"error": err.Error(),
})
2020-02-18 22:15:37 +00:00
}
2020-01-28 17:51:00 +00:00
}
2019-12-13 18:08:26 +00:00
2021-03-20 05:12:48 +00:00
authenticate := func(c *client, t int) error {
var sid string
if cookie, _ := c.r.Cookie("session_id"); cookie != nil {
sid = cookie.Value
2019-12-13 18:08:26 +00:00
}
2021-03-20 05:12:48 +00:00
csrf := c.r.FormValue("csrf_token")
ref := c.r.URL.RequestURI()
return s.authenticate(c, sid, csrf, ref, t)
2020-01-28 17:51:00 +00:00
}
2019-12-13 18:08:26 +00:00
2021-03-20 05:12:48 +00:00
handle := func(f func(c *client) error, at int, rt int) http.HandlerFunc {
return func(w http.ResponseWriter, req *http.Request) {
var err error
2021-03-20 05:12:48 +00:00
c := &client{
ctx: req.Context(),
w: w,
r: req,
}
defer func(begin time.Time) {
logger.Printf("path=%s, err=%v, took=%v\n",
req.URL.Path, err, time.Since(begin))
}(time.Now())
2019-12-13 18:08:26 +00:00
var ct string
switch rt {
case HTML:
ct = "text/html; charset=utf-8"
case JSON:
ct = "application/json"
}
2021-03-20 05:12:48 +00:00
c.w.Header().Add("Content-Type", ct)
2020-01-30 15:32:37 +00:00
err = authenticate(c, at)
2020-01-30 15:32:37 +00:00
if err != nil {
writeError(c, err, rt, req.Method == http.MethodGet)
2020-01-30 15:32:37 +00:00
return
}
err = f(c)
2020-01-28 17:51:00 +00:00
if err != nil {
writeError(c, err, rt, req.Method == http.MethodGet)
2020-01-28 17:51:00 +00:00
return
}
2020-01-08 18:16:06 +00:00
}
2020-01-28 17:51:00 +00:00
}
2020-01-25 10:07:06 +00:00
rootPage := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
err := authenticate(c, SESSION)
2020-01-08 18:16:06 +00:00
if err != nil {
if err == errInvalidSession {
redirect(c, "/signin")
return nil
}
return err
2020-01-08 18:16:06 +00:00
}
2021-03-20 05:12:48 +00:00
if !c.s.IsLoggedIn() {
redirect(c, "/signin")
return nil
2020-01-08 18:16:06 +00:00
}
return s.RootPage(c)
}, NOAUTH, HTML)
2020-01-08 18:16:06 +00:00
navPage := handle(func(c *client) error {
return s.NavPage(c)
}, SESSION, HTML)
2019-12-14 20:19:02 +00:00
signinPage := handle(func(c *client) error {
instance, ok := s.SingleInstance()
if !ok {
return s.SigninPage(c)
}
2021-03-20 05:12:48 +00:00
url, sid, err := s.NewSession(c, instance)
if err != nil {
return err
}
2021-03-20 05:12:48 +00:00
setSessionCookie(c.w, sid, sessionExp)
redirect(c, url)
return nil
}, NOAUTH, HTML)
timelinePage := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
tType, _ := mux.Vars(c.r)["type"]
q := c.r.URL.Query()
2021-01-23 08:44:05 +00:00
instance := q.Get("instance")
maxID := q.Get("max_id")
minID := q.Get("min_id")
2021-01-23 08:44:05 +00:00
return s.TimelinePage(c, tType, instance, maxID, minID)
}, SESSION, HTML)
defaultTimelinePage := handle(func(c *client) error {
redirect(c, "/timeline/home")
return nil
}, SESSION, HTML)
threadPage := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
q := c.r.URL.Query()
reply := q.Get("reply")
return s.ThreadPage(c, id, len(reply) > 1)
}, SESSION, HTML)
2021-09-05 17:17:59 +00:00
quickReplyPage := handle(func(c *client) error {
id, _ := mux.Vars(c.r)["id"]
return s.QuickReplyPage(c, id)
}, SESSION, HTML)
likedByPage := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
return s.LikedByPage(c, id)
}, SESSION, HTML)
retweetedByPage := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
return s.RetweetedByPage(c, id)
}, SESSION, HTML)
notificationsPage := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
q := c.r.URL.Query()
maxID := q.Get("max_id")
minID := q.Get("min_id")
return s.NotificationPage(c, maxID, minID)
}, SESSION, HTML)
userPage := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
pageType, _ := mux.Vars(c.r)["type"]
q := c.r.URL.Query()
maxID := q.Get("max_id")
minID := q.Get("min_id")
return s.UserPage(c, id, pageType, maxID, minID)
}, SESSION, HTML)
userSearchPage := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
q := c.r.URL.Query()
sq := q.Get("q")
offset, _ := strconv.Atoi(q.Get("offset"))
return s.UserSearchPage(c, id, sq, offset)
}, SESSION, HTML)
aboutPage := handle(func(c *client) error {
return s.AboutPage(c)
}, SESSION, HTML)
emojisPage := handle(func(c *client) error {
return s.EmojiPage(c)
}, SESSION, HTML)
searchPage := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
q := c.r.URL.Query()
sq := q.Get("q")
qType := q.Get("type")
offset, _ := strconv.Atoi(q.Get("offset"))
return s.SearchPage(c, sq, qType, offset)
}, SESSION, HTML)
settingsPage := handle(func(c *client) error {
return s.SettingsPage(c)
}, SESSION, HTML)
2021-01-30 16:51:09 +00:00
filtersPage := handle(func(c *client) error {
return s.FiltersPage(c)
}, SESSION, HTML)
signin := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
instance := c.r.FormValue("instance")
url, sid, err := s.NewSession(c, instance)
if err != nil {
return err
}
2021-03-20 05:12:48 +00:00
setSessionCookie(c.w, sid, sessionExp)
redirect(c, url)
return nil
}, NOAUTH, HTML)
oauthCallback := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
q := c.r.URL.Query()
token := q.Get("code")
2021-03-20 05:12:48 +00:00
err := s.Signin(c, token)
if err != nil {
return err
}
redirect(c, "/")
return nil
}, SESSION, HTML)
post := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
content := c.r.FormValue("content")
replyToID := c.r.FormValue("reply_to_id")
format := c.r.FormValue("format")
visibility := c.r.FormValue("visibility")
isNSFW := c.r.FormValue("is_nsfw") == "true"
2021-09-05 17:17:59 +00:00
quickReply := c.r.FormValue("quickreply") == "true"
2021-03-20 05:12:48 +00:00
files := c.r.MultipartForm.File["attachments"]
2019-12-14 20:19:02 +00:00
2020-05-24 04:38:34 +00:00
id, err := s.Post(c, content, replyToID, format, visibility, isNSFW, files)
2019-12-13 18:08:26 +00:00
if err != nil {
return err
2019-12-13 18:08:26 +00:00
}
2021-09-05 17:17:59 +00:00
var location string
2019-12-13 20:23:15 +00:00
if len(replyToID) > 0 {
2021-09-05 17:17:59 +00:00
if quickReply {
location = "/quickreply/" + id + "#status-" + id
} else {
location = "/thread/" + replyToID + "#status-" + id
}
} else {
location = c.r.FormValue("referrer")
2019-12-13 20:23:15 +00:00
}
redirect(c, location)
return nil
}, CSRF, HTML)
like := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
rid := c.r.FormValue("retweeted_by_id")
2020-05-24 04:38:34 +00:00
_, err := s.Like(c, id)
if err != nil {
return err
}
if len(rid) > 0 {
id = rid
2020-01-28 17:51:00 +00:00
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer")+"#status-"+id)
return nil
}, CSRF, HTML)
unlike := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
rid := c.r.FormValue("retweeted_by_id")
2020-05-24 04:38:34 +00:00
_, err := s.UnLike(c, id)
if err != nil {
return err
}
if len(rid) > 0 {
id = rid
2020-01-28 17:51:00 +00:00
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer")+"#status-"+id)
return nil
}, CSRF, HTML)
retweet := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
rid := c.r.FormValue("retweeted_by_id")
2020-05-24 04:38:34 +00:00
_, err := s.Retweet(c, id)
if err != nil {
return err
}
if len(rid) > 0 {
id = rid
2020-01-28 17:51:00 +00:00
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer")+"#status-"+id)
return nil
}, CSRF, HTML)
2019-12-21 05:48:48 +00:00
unretweet := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
rid := c.r.FormValue("retweeted_by_id")
2020-05-24 04:38:34 +00:00
_, err := s.UnRetweet(c, id)
2019-12-21 05:48:48 +00:00
if err != nil {
return err
2019-12-21 05:48:48 +00:00
}
if len(rid) > 0 {
id = rid
2019-12-22 18:10:42 +00:00
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer")+"#status-"+id)
return nil
}, CSRF, HTML)
2019-12-26 19:18:09 +00:00
vote := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
statusID := c.r.FormValue("status_id")
choices, _ := c.r.PostForm["choices"]
2020-05-24 04:38:34 +00:00
err := s.Vote(c, id, choices)
if err != nil {
return err
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer")+"#status-"+statusID)
return nil
}, CSRF, HTML)
follow := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
q := c.r.URL.Query()
2020-04-19 05:57:40 +00:00
var reblogs *bool
if r, ok := q["reblogs"]; ok && len(r) > 0 {
2020-04-19 05:57:40 +00:00
reblogs = new(bool)
*reblogs = r[0] == "true"
}
2020-05-24 04:38:34 +00:00
err := s.Follow(c, id, reblogs)
2019-12-26 19:18:09 +00:00
if err != nil {
return err
2019-12-26 19:18:09 +00:00
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer"))
return nil
}, CSRF, HTML)
2019-12-26 19:18:09 +00:00
unfollow := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2020-05-24 04:38:34 +00:00
err := s.UnFollow(c, id)
2019-12-27 08:06:43 +00:00
if err != nil {
return err
2019-12-27 08:06:43 +00:00
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer"))
return nil
}, CSRF, HTML)
2019-12-27 08:06:43 +00:00
2021-01-16 09:10:02 +00:00
accept := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2021-01-16 09:10:02 +00:00
err := s.Accept(c, id)
if err != nil {
return err
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer"))
2021-01-16 09:10:02 +00:00
return nil
}, CSRF, HTML)
2019-12-27 08:06:43 +00:00
2021-01-16 09:10:02 +00:00
reject := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2021-01-16 09:10:02 +00:00
err := s.Reject(c, id)
if err != nil {
return err
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer"))
2021-01-16 09:10:02 +00:00
return nil
}, CSRF, HTML)
2020-02-08 10:49:06 +00:00
mute := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2020-05-24 04:38:34 +00:00
err := s.Mute(c, id)
2020-02-08 10:49:06 +00:00
if err != nil {
return err
2020-02-08 10:49:06 +00:00
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer"))
return nil
}, CSRF, HTML)
2020-02-08 10:49:06 +00:00
unMute := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2020-05-24 04:38:34 +00:00
err := s.UnMute(c, id)
2020-02-08 10:49:06 +00:00
if err != nil {
return err
2020-02-08 10:49:06 +00:00
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer"))
return nil
}, CSRF, HTML)
2020-02-08 10:49:06 +00:00
block := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2020-05-24 04:38:34 +00:00
err := s.Block(c, id)
2020-02-08 10:49:06 +00:00
if err != nil {
return err
2020-02-08 10:49:06 +00:00
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer"))
return nil
}, CSRF, HTML)
2020-02-08 10:49:06 +00:00
unBlock := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2020-05-24 04:38:34 +00:00
err := s.UnBlock(c, id)
2020-02-08 10:49:06 +00:00
if err != nil {
return err
2020-02-08 10:49:06 +00:00
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer"))
return nil
}, CSRF, HTML)
2020-02-08 10:49:06 +00:00
subscribe := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2020-05-24 04:38:34 +00:00
err := s.Subscribe(c, id)
2020-04-17 17:19:11 +00:00
if err != nil {
return err
2020-04-17 17:19:11 +00:00
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer"))
return nil
}, CSRF, HTML)
2020-04-17 17:19:11 +00:00
unSubscribe := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2020-05-24 04:38:34 +00:00
err := s.UnSubscribe(c, id)
2020-04-17 17:19:11 +00:00
if err != nil {
return err
2020-04-17 17:19:11 +00:00
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer"))
return nil
}, CSRF, HTML)
2020-04-17 17:19:11 +00:00
settings := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
visibility := c.r.FormValue("visibility")
format := c.r.FormValue("format")
copyScope := c.r.FormValue("copy_scope") == "true"
threadInNewTab := c.r.FormValue("thread_in_new_tab") == "true"
hideAttachments := c.r.FormValue("hide_attachments") == "true"
maskNSFW := c.r.FormValue("mask_nsfw") == "true"
ni, _ := strconv.Atoi(c.r.FormValue("notification_interval"))
fluorideMode := c.r.FormValue("fluoride_mode") == "true"
darkMode := c.r.FormValue("dark_mode") == "true"
antiDopamineMode := c.r.FormValue("anti_dopamine_mode") == "true"
2021-04-03 09:22:43 +00:00
css := c.r.FormValue("css")
2020-01-28 17:51:00 +00:00
2019-12-27 08:06:43 +00:00
settings := &model.Settings{
DefaultVisibility: visibility,
DefaultFormat: format,
CopyScope: copyScope,
ThreadInNewTab: threadInNewTab,
HideAttachments: hideAttachments,
MaskNSFW: maskNSFW,
NotificationInterval: ni,
FluorideMode: fluorideMode,
DarkMode: darkMode,
AntiDopamineMode: antiDopamineMode,
2021-04-03 09:22:43 +00:00
CSS: css,
2019-12-27 08:06:43 +00:00
}
2020-05-24 04:38:34 +00:00
err := s.SaveSettings(c, settings)
2019-12-27 08:06:43 +00:00
if err != nil {
return err
2019-12-27 08:06:43 +00:00
}
redirect(c, "/")
return nil
}, CSRF, HTML)
2019-12-27 08:06:43 +00:00
muteConversation := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2020-05-24 04:38:34 +00:00
err := s.MuteConversation(c, id)
2020-02-02 07:24:06 +00:00
if err != nil {
return err
2020-02-02 07:24:06 +00:00
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer"))
return nil
}, CSRF, HTML)
2020-02-02 07:24:06 +00:00
unMuteConversation := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2020-05-24 04:38:34 +00:00
err := s.UnMuteConversation(c, id)
2020-02-02 07:24:06 +00:00
if err != nil {
return err
2020-02-02 07:24:06 +00:00
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer"))
return nil
}, CSRF, HTML)
2020-02-02 07:24:06 +00:00
delete := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2020-05-24 04:38:34 +00:00
err := s.Delete(c, id)
2020-02-02 08:30:40 +00:00
if err != nil {
return err
2020-02-02 08:30:40 +00:00
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer"))
return nil
}, CSRF, HTML)
2020-02-02 08:30:40 +00:00
readNotifications := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
q := c.r.URL.Query()
maxID := q.Get("max_id")
2020-05-24 04:38:34 +00:00
err := s.ReadNotifications(c, maxID)
2020-02-18 22:15:37 +00:00
if err != nil {
return err
2020-02-18 22:15:37 +00:00
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer"))
return nil
}, CSRF, HTML)
2020-02-18 22:15:37 +00:00
bookmark := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
rid := c.r.FormValue("retweeted_by_id")
err := s.Bookmark(c, id)
if err != nil {
return err
}
if len(rid) > 0 {
id = rid
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer")+"#status-"+id)
return nil
}, CSRF, HTML)
unBookmark := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
rid := c.r.FormValue("retweeted_by_id")
err := s.UnBookmark(c, id)
if err != nil {
return err
}
if len(rid) > 0 {
id = rid
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer")+"#status-"+id)
return nil
}, CSRF, HTML)
2020-03-04 15:59:59 +00:00
2021-01-30 16:51:09 +00:00
filter := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
phrase := c.r.FormValue("phrase")
wholeWord := c.r.FormValue("whole_word") == "true"
2021-01-30 16:51:09 +00:00
err := s.Filter(c, phrase, wholeWord)
if err != nil {
return err
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer"))
2021-01-30 16:51:09 +00:00
return nil
}, CSRF, HTML)
unFilter := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2021-01-30 16:51:09 +00:00
err := s.UnFilter(c, id)
if err != nil {
return err
}
2021-03-20 05:12:48 +00:00
redirect(c, c.r.FormValue("referrer"))
return nil
}, CSRF, HTML)
2020-03-04 15:59:59 +00:00
signout := handle(func(c *client) error {
2020-05-24 04:38:34 +00:00
s.Signout(c)
2021-03-20 05:12:48 +00:00
setSessionCookie(c.w, "", 0)
redirect(c, "/")
return nil
}, CSRF, HTML)
2020-03-04 15:59:59 +00:00
fLike := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2020-05-24 04:38:34 +00:00
count, err := s.Like(c, id)
2020-01-28 17:51:00 +00:00
if err != nil {
return err
2020-01-28 17:51:00 +00:00
}
return writeJson(c, count)
}, CSRF, JSON)
2020-05-24 04:38:34 +00:00
fUnlike := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2020-05-24 04:38:34 +00:00
count, err := s.UnLike(c, id)
2020-01-28 17:51:00 +00:00
if err != nil {
return err
2020-01-28 17:51:00 +00:00
}
return writeJson(c, count)
}, CSRF, JSON)
2020-01-28 17:51:00 +00:00
fRetweet := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2020-05-24 04:38:34 +00:00
count, err := s.Retweet(c, id)
2020-01-28 17:51:00 +00:00
if err != nil {
return err
2020-01-28 17:51:00 +00:00
}
return writeJson(c, count)
}, CSRF, JSON)
2020-01-28 17:51:00 +00:00
fUnretweet := handle(func(c *client) error {
2021-03-20 05:12:48 +00:00
id, _ := mux.Vars(c.r)["id"]
2020-05-24 04:38:34 +00:00
count, err := s.UnRetweet(c, id)
2020-01-28 17:51:00 +00:00
if err != nil {
return err
2020-01-28 17:51:00 +00:00
}
return writeJson(c, count)
}, CSRF, JSON)
2020-11-09 12:10:29 +00:00
fStatus := handle(func(c *client) error {
2021-05-30 09:16:06 +00:00
id, _ := mux.Vars(c.r)["id"]
return s.StatusPopup(c, id)
}, SESSION, JSON)
2020-11-09 12:10:29 +00:00
2020-01-28 17:51:00 +00:00
r.HandleFunc("/", rootPage).Methods(http.MethodGet)
2020-02-18 22:15:37 +00:00
r.HandleFunc("/nav", navPage).Methods(http.MethodGet)
2020-01-28 17:51:00 +00:00
r.HandleFunc("/signin", signinPage).Methods(http.MethodGet)
r.HandleFunc("/timeline/{type}", timelinePage).Methods(http.MethodGet)
2020-05-24 04:38:34 +00:00
r.HandleFunc("/timeline", defaultTimelinePage).Methods(http.MethodGet)
2020-01-28 17:51:00 +00:00
r.HandleFunc("/thread/{id}", threadPage).Methods(http.MethodGet)
2021-09-05 17:17:59 +00:00
r.HandleFunc("/quickreply/{id}", quickReplyPage).Methods(http.MethodGet)
2020-01-28 17:51:00 +00:00
r.HandleFunc("/likedby/{id}", likedByPage).Methods(http.MethodGet)
r.HandleFunc("/retweetedby/{id}", retweetedByPage).Methods(http.MethodGet)
r.HandleFunc("/notifications", notificationsPage).Methods(http.MethodGet)
r.HandleFunc("/user/{id}", userPage).Methods(http.MethodGet)
r.HandleFunc("/user/{id}/{type}", userPage).Methods(http.MethodGet)
2020-01-30 15:32:37 +00:00
r.HandleFunc("/usersearch/{id}", userSearchPage).Methods(http.MethodGet)
2020-01-28 17:51:00 +00:00
r.HandleFunc("/about", aboutPage).Methods(http.MethodGet)
r.HandleFunc("/emojis", emojisPage).Methods(http.MethodGet)
r.HandleFunc("/search", searchPage).Methods(http.MethodGet)
r.HandleFunc("/settings", settingsPage).Methods(http.MethodGet)
2021-01-30 16:51:09 +00:00
r.HandleFunc("/filters", filtersPage).Methods(http.MethodGet)
2020-01-28 17:51:00 +00:00
r.HandleFunc("/signin", signin).Methods(http.MethodPost)
r.HandleFunc("/oauth_callback", oauthCallback).Methods(http.MethodGet)
r.HandleFunc("/post", post).Methods(http.MethodPost)
r.HandleFunc("/like/{id}", like).Methods(http.MethodPost)
r.HandleFunc("/unlike/{id}", unlike).Methods(http.MethodPost)
r.HandleFunc("/retweet/{id}", retweet).Methods(http.MethodPost)
r.HandleFunc("/unretweet/{id}", unretweet).Methods(http.MethodPost)
r.HandleFunc("/vote/{id}", vote).Methods(http.MethodPost)
2020-01-28 17:51:00 +00:00
r.HandleFunc("/follow/{id}", follow).Methods(http.MethodPost)
r.HandleFunc("/unfollow/{id}", unfollow).Methods(http.MethodPost)
2021-01-16 09:10:02 +00:00
r.HandleFunc("/accept/{id}", accept).Methods(http.MethodPost)
r.HandleFunc("/reject/{id}", reject).Methods(http.MethodPost)
2020-02-08 10:49:06 +00:00
r.HandleFunc("/mute/{id}", mute).Methods(http.MethodPost)
r.HandleFunc("/unmute/{id}", unMute).Methods(http.MethodPost)
r.HandleFunc("/block/{id}", block).Methods(http.MethodPost)
r.HandleFunc("/unblock/{id}", unBlock).Methods(http.MethodPost)
2020-04-17 17:19:11 +00:00
r.HandleFunc("/subscribe/{id}", subscribe).Methods(http.MethodPost)
r.HandleFunc("/unsubscribe/{id}", unSubscribe).Methods(http.MethodPost)
2020-01-28 17:51:00 +00:00
r.HandleFunc("/settings", settings).Methods(http.MethodPost)
2020-02-02 07:24:06 +00:00
r.HandleFunc("/muteconv/{id}", muteConversation).Methods(http.MethodPost)
r.HandleFunc("/unmuteconv/{id}", unMuteConversation).Methods(http.MethodPost)
2020-02-02 08:30:40 +00:00
r.HandleFunc("/delete/{id}", delete).Methods(http.MethodPost)
2020-02-18 22:15:37 +00:00
r.HandleFunc("/notifications/read", readNotifications).Methods(http.MethodPost)
r.HandleFunc("/bookmark/{id}", bookmark).Methods(http.MethodPost)
r.HandleFunc("/unbookmark/{id}", unBookmark).Methods(http.MethodPost)
2021-01-30 16:51:09 +00:00
r.HandleFunc("/filter", filter).Methods(http.MethodPost)
r.HandleFunc("/unfilter/{id}", unFilter).Methods(http.MethodPost)
2020-03-04 15:59:59 +00:00
r.HandleFunc("/signout", signout).Methods(http.MethodPost)
2020-01-28 17:51:00 +00:00
r.HandleFunc("/fluoride/like/{id}", fLike).Methods(http.MethodPost)
r.HandleFunc("/fluoride/unlike/{id}", fUnlike).Methods(http.MethodPost)
r.HandleFunc("/fluoride/retweet/{id}", fRetweet).Methods(http.MethodPost)
r.HandleFunc("/fluoride/unretweet/{id}", fUnretweet).Methods(http.MethodPost)
r.HandleFunc("/fluoride/status/{id}", fStatus).Methods(http.MethodGet)
2020-01-28 17:51:00 +00:00
r.PathPrefix("/static").Handler(http.StripPrefix("/static",
http.FileServer(http.Dir(staticDir))))
2020-01-28 17:51:00 +00:00
return r
2020-01-08 18:16:06 +00:00
}