Add methods for two-factor authentication and vehicle refresh functionality
This commit is contained in:
76
client.go
76
client.go
@ -7,6 +7,7 @@ import (
|
|||||||
"log/slog"
|
"log/slog"
|
||||||
"slices"
|
"slices"
|
||||||
"sync"
|
"sync"
|
||||||
|
"time"
|
||||||
|
|
||||||
"git.savin.nyc/alex/mysubaru/config"
|
"git.savin.nyc/alex/mysubaru/config"
|
||||||
"resty.dev/v3"
|
"resty.dev/v3"
|
||||||
@ -196,8 +197,81 @@ func (c *Client) GetVehicleByVin(vin string) (*Vehicle, error) {
|
|||||||
return nil, errors.New("vin code is not in the list of the available vin codes")
|
return nil, errors.New("vin code is not in the list of the available vin codes")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RefreshVehicles refreshes the list of vehicles associated with the client's account.
|
||||||
|
func (c *Client) RefreshVehicles() error {
|
||||||
|
params := map[string]string{}
|
||||||
|
reqURL := MOBILE_API_VERSION + apiURLs["API_REFRESH_VEHICLES"]
|
||||||
|
resp, err := c.execute(GET, reqURL, params, false)
|
||||||
|
if err != nil {
|
||||||
|
c.logger.Error("error while executing RefreshVehicles request", "request", "RefreshVehicles", "error", err.Error())
|
||||||
|
return errors.New("error while executing RefreshVehicles request: " + err.Error())
|
||||||
|
}
|
||||||
|
c.logger.Debug("http request output", "request", "RefreshVehicles", "body", resp)
|
||||||
|
|
||||||
|
// var vd VehicleData
|
||||||
|
// err = json.Unmarshal(resp.Data, &vd)
|
||||||
|
// if err != nil {
|
||||||
|
// c.logger.Error("error while parsing json", "request", "SelectVehicle", "error", err.Error())
|
||||||
|
// return errors.New("error while parsing json while vehicle selection")
|
||||||
|
// }
|
||||||
|
// c.logger.Debug("http request output", "request", "SelectVehicle", "body", resp)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// RequestAuthCode requests an authentication code for two-factor authentication (2FA).
|
||||||
|
func (c *Client) RequestAuthCode() error {
|
||||||
|
params := map[string]string{
|
||||||
|
"contactMethod": "0",
|
||||||
|
"languagePreference": "EN"}
|
||||||
|
reqUrl := MOBILE_API_VERSION + apiURLs["API_2FA_SEND_VERIFICATION"]
|
||||||
|
resp, err := c.execute(POST, reqUrl, params, false)
|
||||||
|
if err != nil {
|
||||||
|
c.logger.Error("error while executing RequestAuthCode request", "request", "RequestAuthCode", "error", err.Error())
|
||||||
|
return errors.New("error while executing RequestAuthCode request: " + err.Error())
|
||||||
|
}
|
||||||
|
c.logger.Debug("http request output", "request", "RequestAuthCode", "body", resp)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// SubmitAuthCode submits the authentication code received from the RequestAuthCode method.
|
||||||
|
func (c *Client) SubmitAuthCode(code string, permanent bool) error {
|
||||||
|
params := map[string]string{
|
||||||
|
"deviceId": c.credentials.DeviceID,
|
||||||
|
"deviceName": c.credentials.DeviceName,
|
||||||
|
"verificationCode": code}
|
||||||
|
if permanent {
|
||||||
|
params["rememberDevice"] = "on"
|
||||||
|
}
|
||||||
|
|
||||||
|
reqUrl := MOBILE_API_VERSION + apiURLs["API_2FA_AUTH_VERIFY"]
|
||||||
|
resp, err := c.execute(POST, reqUrl, params, false)
|
||||||
|
if err != nil {
|
||||||
|
c.logger.Error("error while executing SubmitAuthCode request", "request", "SubmitAuthCode", "error", err.Error())
|
||||||
|
return errors.New("error while executing SubmitAuthCode request: " + err.Error())
|
||||||
|
}
|
||||||
|
// Device registration does not always immediately take effect
|
||||||
|
time.Sleep(time.Second * 3)
|
||||||
|
c.logger.Debug("http request output", "request", "SubmitAuthCode", "body", resp)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// getContactMethods retrieves the available contact methods for two-factor authentication (2FA).
|
||||||
|
func (c *Client) GetContactMethods() error {
|
||||||
|
params := map[string]string{}
|
||||||
|
reqUrl := MOBILE_API_VERSION + apiURLs["API_2FA_CONTACT"]
|
||||||
|
resp, err := c.execute(POST, reqUrl, params, false)
|
||||||
|
if err != nil {
|
||||||
|
c.logger.Error("error while executing GetContactMethods request", "request", "GetContactMethods", "error", err.Error())
|
||||||
|
return errors.New("error while executing GetContactMethods request: " + err.Error())
|
||||||
|
}
|
||||||
|
c.logger.Debug("http request output", "request", "GetContactMethods", "body", resp)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// func isPINRequired() {}
|
// func isPINRequired() {}
|
||||||
// func getVehicles() {}
|
|
||||||
// func getEVStatus() {}
|
// func getEVStatus() {}
|
||||||
// func getRemoteOptionsStatus() {}
|
// func getRemoteOptionsStatus() {}
|
||||||
// func getRemoteStartStatus() {}
|
// func getRemoteStartStatus() {}
|
||||||
|
Reference in New Issue
Block a user