auto login

This commit is contained in:
Celogeek 2021-12-16 10:38:56 +01:00
parent 025991160b
commit 6c37970be2
Signed by: celogeek
GPG Key ID: E6B7BDCFC446233A
7 changed files with 76 additions and 31 deletions

View File

@ -59,7 +59,7 @@ func (p *Piwigo) LoadConfig() (err error) {
err = json.Unmarshal(b, &p) err = json.Unmarshal(b, &p)
if p.Url == "" || p.Token == nil { if p.Url == "" || p.Username == "" || p.Password == "" {
err = errors.New("missing configuration url or token") err = errors.New("missing configuration url or token")
} }

55
internal/piwigo/login.go Normal file
View File

@ -0,0 +1,55 @@
package piwigo
import (
"errors"
"net/url"
)
type StatusResponse struct {
User string `json:"username"`
Role string `json:"status"`
Version string `json:"version"`
}
func (p *Piwigo) GetStatus() (*StatusResponse, error) {
if p.Url == "" || p.Username == "" || p.Password == "" {
return nil, errors.New("missing configuration url or token")
}
resp := &StatusResponse{}
err := p.Post("pwg.session.getStatus", nil, resp)
if err != nil {
return nil, err
}
if resp.User == p.Username {
return resp, nil
}
return nil, errors.New("you are a guest")
}
func (p *Piwigo) Login() (*StatusResponse, error) {
resp, err := p.GetStatus()
if err != nil && err.Error() != "you are a guest" {
return nil, err
}
if resp != nil {
return resp, nil
}
err = p.Post("pwg.session.login", &url.Values{
"username": []string{p.Username},
"password": []string{p.Password},
}, nil)
if err != nil {
return nil, err
}
err = p.SaveConfig()
if err != nil {
return nil, err
}
return p.GetStatus()
}

View File

@ -1,10 +1,10 @@
package piwigo package piwigo
import "net/http"
type Piwigo struct { type Piwigo struct {
Url string `json:"url"` Url string `json:"url"`
Token *http.Cookie `json:"token"` Username string `json:"username"`
Password string `json:"password"`
Token string `json:"token"`
} }
type PiwigoResult struct { type PiwigoResult struct {

View File

@ -42,8 +42,8 @@ func (p *Piwigo) Post(method string, form *url.Values, resp interface{}) error {
} }
req.Header.Set("Content-Type", "application/x-www-form-urlencoded") req.Header.Set("Content-Type", "application/x-www-form-urlencoded")
if p.Token != nil { if p.Token != "" {
req.AddCookie(p.Token) req.AddCookie(&http.Cookie{Name: "pwg_id", Value: p.Token, HttpOnly: true})
} }
r, err := http.DefaultClient.Do(req) r, err := http.DefaultClient.Do(req)
@ -66,6 +66,7 @@ func (p *Piwigo) Post(method string, form *url.Values, resp interface{}) error {
if err != nil { if err != nil {
return err return err
} }
DumpResponse(RawResult) DumpResponse(RawResult)
err = json.NewDecoder(newBody).Decode(&Result) err = json.NewDecoder(newBody).Decode(&Result)
@ -85,7 +86,7 @@ func (p *Piwigo) Post(method string, form *url.Values, resp interface{}) error {
for _, c := range r.Cookies() { for _, c := range r.Cookies() {
if c.Name == "pwg_id" { if c.Name == "pwg_id" {
p.Token = c p.Token = c.Value
break break
} }
} }

View File

@ -28,6 +28,11 @@ func (c *GetInfosCommand) Execute(args []string) error {
return err return err
} }
_, err := p.Login()
if err != nil {
return err
}
var resp GetInfosResponse var resp GetInfosResponse
if err := p.Post("pwg.getInfos", &url.Values{}, &resp); err != nil { if err := p.Post("pwg.getInfos", &url.Values{}, &resp); err != nil {
@ -35,7 +40,7 @@ func (c *GetInfosCommand) Execute(args []string) error {
} }
t := table.NewWriter() t := table.NewWriter()
t.AppendHeader(table.Row{"", "Value"}) t.AppendHeader(table.Row{"Key", "Value"})
for _, info := range resp.Infos { for _, info := range resp.Infos {
t.AppendRow(table.Row{info.Name, info.Value}) t.AppendRow(table.Row{info.Name, info.Value})
} }

View File

@ -2,7 +2,6 @@ package piwigocli
import ( import (
"fmt" "fmt"
"net/url"
"github.com/celogeek/piwigo-cli/internal/piwigo" "github.com/celogeek/piwigo-cli/internal/piwigo"
) )
@ -18,19 +17,11 @@ func (c *LoginCommand) Execute(args []string) error {
p := piwigo.Piwigo{ p := piwigo.Piwigo{
Url: c.Url, Url: c.Url,
Username: c.Login,
Password: c.Password,
} }
result := false _, err := p.Login()
err := p.Post("pwg.session.login", &url.Values{
"username": []string{c.Login},
"password": []string{c.Password},
}, &result)
if err != nil {
return err
}
err = p.SaveConfig()
if err != nil { if err != nil {
return err return err
} }

View File

@ -10,21 +10,14 @@ import (
type StatusCommand struct { type StatusCommand struct {
} }
type StatusResponse struct {
User string `json:"username"`
Role string `json:"status"`
Version string `json:"version"`
}
func (c *StatusCommand) Execute(args []string) error { func (c *StatusCommand) Execute(args []string) error {
p := piwigo.Piwigo{} p := piwigo.Piwigo{}
if err := p.LoadConfig(); err != nil { if err := p.LoadConfig(); err != nil {
return err return err
} }
resp := &StatusResponse{} resp, err := p.Login()
if err != nil {
if err := p.Post("pwg.session.getStatus", nil, &resp); err != nil {
return err return err
} }