diff --git a/internal/piwigo/config.go b/internal/piwigo/config.go index 3c0d385..9c8876c 100644 --- a/internal/piwigo/config.go +++ b/internal/piwigo/config.go @@ -59,7 +59,7 @@ func (p *Piwigo) LoadConfig() (err error) { 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") } diff --git a/internal/piwigo/login.go b/internal/piwigo/login.go new file mode 100644 index 0000000..64ea7f4 --- /dev/null +++ b/internal/piwigo/login.go @@ -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() +} diff --git a/internal/piwigo/piwigo.go b/internal/piwigo/piwigo.go index 57e290b..b4e353a 100644 --- a/internal/piwigo/piwigo.go +++ b/internal/piwigo/piwigo.go @@ -1,10 +1,10 @@ package piwigo -import "net/http" - type Piwigo struct { - Url string `json:"url"` - Token *http.Cookie `json:"token"` + Url string `json:"url"` + Username string `json:"username"` + Password string `json:"password"` + Token string `json:"token"` } type PiwigoResult struct { diff --git a/internal/piwigo/post.go b/internal/piwigo/post.go index e73b2b3..8423b82 100644 --- a/internal/piwigo/post.go +++ b/internal/piwigo/post.go @@ -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") - if p.Token != nil { - req.AddCookie(p.Token) + if p.Token != "" { + req.AddCookie(&http.Cookie{Name: "pwg_id", Value: p.Token, HttpOnly: true}) } 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 { return err } + DumpResponse(RawResult) 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() { if c.Name == "pwg_id" { - p.Token = c + p.Token = c.Value break } } diff --git a/internal/piwigocli/general.go b/internal/piwigocli/general.go index 41dadae..598234e 100644 --- a/internal/piwigocli/general.go +++ b/internal/piwigocli/general.go @@ -28,6 +28,11 @@ func (c *GetInfosCommand) Execute(args []string) error { return err } + _, err := p.Login() + if err != nil { + return err + } + var resp GetInfosResponse 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.AppendHeader(table.Row{"", "Value"}) + t.AppendHeader(table.Row{"Key", "Value"}) for _, info := range resp.Infos { t.AppendRow(table.Row{info.Name, info.Value}) } diff --git a/internal/piwigocli/session_login.go b/internal/piwigocli/session_login.go index 733b83e..25a7c4f 100644 --- a/internal/piwigocli/session_login.go +++ b/internal/piwigocli/session_login.go @@ -2,7 +2,6 @@ package piwigocli import ( "fmt" - "net/url" "github.com/celogeek/piwigo-cli/internal/piwigo" ) @@ -17,20 +16,12 @@ func (c *LoginCommand) Execute(args []string) error { fmt.Printf("Login on %s...\n", c.Url) p := piwigo.Piwigo{ - Url: c.Url, + Url: c.Url, + Username: c.Login, + Password: c.Password, } - result := false - - 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() + _, err := p.Login() if err != nil { return err } diff --git a/internal/piwigocli/session_status.go b/internal/piwigocli/session_status.go index 33751d3..cdc81fb 100644 --- a/internal/piwigocli/session_status.go +++ b/internal/piwigocli/session_status.go @@ -10,21 +10,14 @@ import ( 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 { p := piwigo.Piwigo{} if err := p.LoadConfig(); err != nil { return err } - resp := &StatusResponse{} - - if err := p.Post("pwg.session.getStatus", nil, &resp); err != nil { + resp, err := p.Login() + if err != nil { return err }