summaryrefslogtreecommitdiff
path: root/actions.go
diff options
context:
space:
mode:
Diffstat (limited to 'actions.go')
-rw-r--r--actions.go60
1 files changed, 52 insertions, 8 deletions
diff --git a/actions.go b/actions.go
index 4196232..b8b3c87 100644
--- a/actions.go
+++ b/actions.go
@@ -127,13 +127,13 @@ func Reload(state *BrowserState, conf *Config) error {
body := io.LimitReader(bytes.NewBuffer(input), int64(len(input)))
state.Url.Fragment = ""
- response, err = upload(state.Url.String(), body, tlsConf)
+ response, err = upload(state, state.Url.String(), body, tlsConf)
state.Url.Fragment = "prompt"
if err != nil {
return err
}
} else {
- response, err = fetch(urlStr, tlsConf)
+ response, err = fetch(state, urlStr, tlsConf)
if err != nil {
return err
}
@@ -152,7 +152,7 @@ outer:
state.Url = response.Request.URL
state.Url.RawQuery = url.QueryEscape(strings.TrimRight(line, "\n"))
- response, err = fetch(state.Url.String(), tlsConf)
+ response, err = fetch(state, state.Url.String(), tlsConf)
if err != nil {
return err
}
@@ -164,7 +164,7 @@ outer:
state.Url = response.Request.URL
state.Url.RawQuery = url.QueryEscape(strings.TrimRight(string(line), "\n"))
- response, err = fetch(state.Url.String(), tlsConf)
+ response, err = fetch(state, state.Url.String(), tlsConf)
if err != nil {
return err
}
@@ -190,14 +190,58 @@ outer:
return HandleResource(state, conf)
}
-func fetch(u string, tlsConf *tls.Config) (*sliderule.Response, error) {
+func fetch(state *BrowserState, u string, tlsConf *tls.Config) (*sliderule.Response, error) {
tlsConf.ClientSessionCache = nil
- return sliderule.NewClient(tlsConf).Fetch(u)
+ response, err := sliderule.NewClient(tlsConf).Fetch(u)
+ var tofuErr *TOFUViolation
+ if errors.As(err, &tofuErr) {
+ writeError(err.Error())
+ state.Readline.SetPrompt("Trust new certificate instead (y/n)? [n] ")
+ line, err := state.Readline.Readline()
+ if err != nil {
+ return nil, err
+ }
+ if line != "y" {
+ return nil, tofuErr
+ }
+
+ tofuStore[tofuErr.domain] = tofuErr.got
+ if err := saveTofuStore(tofuStore); err != nil {
+ return nil, err
+ }
+
+ return sliderule.NewClient(tlsConf).Fetch(u)
+ } else if err != nil {
+ return nil, err
+ }
+ return response, nil
}
-func upload(u string, body io.Reader, tlsConf *tls.Config) (*sliderule.Response, error) {
+func upload(state *BrowserState, u string, body io.Reader, tlsConf *tls.Config) (*sliderule.Response, error) {
tlsConf.ClientSessionCache = nil
- return sliderule.NewClient(tlsConf).Upload(u, body)
+ response, err := sliderule.NewClient(tlsConf).Upload(u, body)
+ var tofuErr *TOFUViolation
+ if errors.As(err, &tofuErr) {
+ writeError(err.Error())
+ state.Readline.SetPrompt("Trust new certificate instead (y/n)? [n] ")
+ line, err := state.Readline.Readline()
+ if err != nil {
+ return nil, err
+ }
+ if line != "y" {
+ return nil, tofuErr
+ }
+
+ tofuStore[tofuErr.domain] = tofuErr.got
+ if err := saveTofuStore(tofuStore); err != nil {
+ return nil, err
+ }
+
+ return sliderule.NewClient(tlsConf).Upload(u, body)
+ } else if err != nil {
+ return nil, err
+ }
+ return response, nil
}
func externalMessage() ([]byte, error) {