mirror of
https://gitea.phreedom.club/localhost_frssoft/bloat.git
synced 2025-05-09 13:28:44 +00:00
merge with upstream
This commit is contained in:
commit
4379eab5bf
25 changed files with 465 additions and 186 deletions
|
@ -4,6 +4,7 @@ import (
|
|||
"context"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
@ -68,7 +69,7 @@ func (c *client) redirect(url string) {
|
|||
c.w.WriteHeader(http.StatusFound)
|
||||
}
|
||||
|
||||
func (c *client) authenticate(t int) (err error) {
|
||||
func (c *client) authenticate(t int, instance string) (err error) {
|
||||
csrf := c.r.FormValue("csrf_token")
|
||||
ref := c.r.URL.RequestURI()
|
||||
defer func() {
|
||||
|
@ -100,6 +101,9 @@ func (c *client) authenticate(t int) (err error) {
|
|||
return err
|
||||
}
|
||||
c.s = sess
|
||||
if len(instance) > 0 && c.s.Instance != instance {
|
||||
return errors.New("invalid instance")
|
||||
}
|
||||
c.Client = mastodon.NewClient(&mastodon.Config{
|
||||
Server: "https://" + c.s.Instance,
|
||||
ClientID: c.s.ClientID,
|
||||
|
|
|
@ -747,7 +747,7 @@ func (s *service) MutePage(c *client, id string) (err error) {
|
|||
if err != nil {
|
||||
return
|
||||
}
|
||||
cdata := s.cdata(c, "Mute"+user.DisplayName+" @"+user.Acct, 0, 0, "")
|
||||
cdata := s.cdata(c, "Mute "+user.DisplayName+" @"+user.Acct, 0, 0, "")
|
||||
data := &renderer.UserData{
|
||||
User: user,
|
||||
CommonData: cdata,
|
||||
|
@ -870,6 +870,55 @@ func (svc *service) FiltersPage(c *client) (err error) {
|
|||
return svc.renderer.Render(c.rctx, c.w, renderer.FiltersPage, data)
|
||||
}
|
||||
|
||||
func (svc *service) ProfilePage(c *client) (err error) {
|
||||
u, err := c.GetAccountCurrentUser(c.ctx)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
// Some instances allow more than 4 fields, but make sure that there are
|
||||
// at least 4 fields in the slice because the template depends on it.
|
||||
if u.Source.Fields == nil {
|
||||
u.Source.Fields = new([]mastodon.Field)
|
||||
}
|
||||
for len(*u.Source.Fields) < 4 {
|
||||
*u.Source.Fields = append(*u.Source.Fields, mastodon.Field{})
|
||||
}
|
||||
cdata := svc.cdata(c, "edit profile", 0, 0, "")
|
||||
data := &renderer.ProfileData{
|
||||
CommonData: cdata,
|
||||
User: u,
|
||||
}
|
||||
return svc.renderer.Render(c.rctx, c.w, renderer.ProfilePage, data)
|
||||
}
|
||||
|
||||
func (s *service) ProfileUpdate(c *client, name, bio string, avatar, banner *multipart.FileHeader,
|
||||
fields []mastodon.Field, locked bool) (err error) {
|
||||
// Need to pass empty data to clear fields
|
||||
if len(fields) == 0 {
|
||||
fields = append(fields, mastodon.Field{})
|
||||
}
|
||||
p := &mastodon.Profile{
|
||||
DisplayName: &name,
|
||||
Note: &bio,
|
||||
Avatar: avatar,
|
||||
Header: banner,
|
||||
Fields: &fields,
|
||||
Locked: &locked,
|
||||
}
|
||||
_, err = c.AccountUpdate(c.ctx, p)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *service) ProfileDelAvatar(c *client) (err error) {
|
||||
_, err = c.AccountDeleteAvatar(c.ctx)
|
||||
return
|
||||
}
|
||||
|
||||
func (s *service) ProfileDelBanner(c *client) (err error) {
|
||||
_, err = c.AccountDeleteHeader(c.ctx)
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *service) SingleInstance() (instance string, ok bool) {
|
||||
if len(s.instance) > 0 {
|
||||
instance = s.instance
|
||||
|
@ -1014,6 +1063,9 @@ func (s *service) NewSessionRegister(c *client, instance string, reason string,
|
|||
return
|
||||
}
|
||||
|
||||
func (s *service) Signout(c *client) (err error) {
|
||||
return c.RevokeToken(c.ctx)
|
||||
}
|
||||
|
||||
func (s *service) Post(c *client, content string, replyToID string,
|
||||
format string, visibility string, isNSFW bool, spoilerText string,
|
||||
|
|
|
@ -2,7 +2,9 @@ package service
|
|||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"mime/multipart"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
@ -24,7 +26,7 @@ const (
|
|||
CSRF
|
||||
)
|
||||
|
||||
func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
|
||||
func NewHandler(s *service, verbose bool, staticDir string) http.Handler {
|
||||
r := mux.NewRouter()
|
||||
|
||||
writeError := func(c *client, err error, t int, retry bool) {
|
||||
|
@ -49,10 +51,12 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
|
|||
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())
|
||||
if verbose {
|
||||
defer func(begin time.Time) {
|
||||
log.Printf("path=%s, err=%v, took=%v\n",
|
||||
req.URL.Path, err, time.Since(begin))
|
||||
}(time.Now())
|
||||
}
|
||||
|
||||
var ct string
|
||||
switch rt {
|
||||
|
@ -63,7 +67,7 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
|
|||
}
|
||||
c.w.Header().Add("Content-Type", ct)
|
||||
|
||||
err = c.authenticate(at)
|
||||
err = c.authenticate(at, s.instance)
|
||||
if err != nil {
|
||||
writeError(c, err, rt, req.Method == http.MethodGet)
|
||||
return
|
||||
|
@ -78,7 +82,7 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
|
|||
}
|
||||
|
||||
rootPage := handle(func(c *client) error {
|
||||
err := c.authenticate(SESSION)
|
||||
err := c.authenticate(SESSION, "")
|
||||
if err != nil {
|
||||
if err == errInvalidSession {
|
||||
c.redirect("/signin")
|
||||
|
@ -248,6 +252,57 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
|
|||
return s.FiltersPage(c)
|
||||
}, SESSION, HTML)
|
||||
|
||||
profilePage := handle(func(c *client) error {
|
||||
return s.ProfilePage(c)
|
||||
}, SESSION, HTML)
|
||||
|
||||
profileUpdate := handle(func(c *client) error {
|
||||
name := c.r.FormValue("name")
|
||||
bio := c.r.FormValue("bio")
|
||||
var avatar, banner *multipart.FileHeader
|
||||
if f := c.r.MultipartForm.File["avatar"]; len(f) > 0 {
|
||||
avatar = f[0]
|
||||
}
|
||||
if f := c.r.MultipartForm.File["banner"]; len(f) > 0 {
|
||||
banner = f[0]
|
||||
}
|
||||
var fields []mastodon.Field
|
||||
for i := 0; i < 16; i++ {
|
||||
n := c.r.FormValue(fmt.Sprintf("field-name-%d", i))
|
||||
v := c.r.FormValue(fmt.Sprintf("field-value-%d", i))
|
||||
if len(n) == 0 {
|
||||
continue
|
||||
}
|
||||
f := mastodon.Field{Name: n, Value: v}
|
||||
fields = append(fields, f)
|
||||
}
|
||||
locked := c.r.FormValue("locked") == "true"
|
||||
err := s.ProfileUpdate(c, name, bio, avatar, banner, fields, locked)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
c.redirect("/")
|
||||
return nil
|
||||
}, CSRF, HTML)
|
||||
|
||||
profileDelAvatar := handle(func(c *client) error {
|
||||
err := s.ProfileDelAvatar(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
c.redirect(c.r.FormValue("referrer"))
|
||||
return nil
|
||||
}, CSRF, HTML)
|
||||
|
||||
profileDelBanner := handle(func(c *client) error {
|
||||
err := s.ProfileDelBanner(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
c.redirect(c.r.FormValue("referrer"))
|
||||
return nil
|
||||
}, CSRF, HTML)
|
||||
|
||||
signin := handle(func(c *client) error {
|
||||
instance := c.r.FormValue("instance")
|
||||
url, sess, err := s.NewSession(c, instance)
|
||||
|
@ -750,6 +805,10 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
|
|||
}, CSRF, HTML)
|
||||
|
||||
signout := handle(func(c *client) error {
|
||||
err := s.Signout(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
c.unsetSession()
|
||||
c.redirect("/")
|
||||
return nil
|
||||
|
@ -815,6 +874,10 @@ func NewHandler(s *service, logger *log.Logger, staticDir string) http.Handler {
|
|||
r.HandleFunc("/useredit", userEdit).Methods(http.MethodPost)
|
||||
r.HandleFunc("/settings", settingsPage).Methods(http.MethodGet)
|
||||
r.HandleFunc("/filters", filtersPage).Methods(http.MethodGet)
|
||||
r.HandleFunc("/profile", profilePage).Methods(http.MethodGet)
|
||||
r.HandleFunc("/profile", profileUpdate).Methods(http.MethodPost)
|
||||
r.HandleFunc("/profile/delavatar", profileDelAvatar).Methods(http.MethodPost)
|
||||
r.HandleFunc("/profile/delbanner", profileDelBanner).Methods(http.MethodPost)
|
||||
r.HandleFunc("/signin", signin).Methods(http.MethodPost)
|
||||
r.HandleFunc("/signup", signup).Methods(http.MethodPost)
|
||||
r.HandleFunc("/oauth_callback", oauthCallback).Methods(http.MethodGet)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue