mirror of
https://github.com/makew0rld/amfora.git
synced 2024-12-04 14:46:29 -05:00
✨ Add TOFU continue option - fixes #6
This commit is contained in:
parent
023780bfbf
commit
c2c74cbe28
@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
- `left_margin` config option
|
- `left_margin` config option
|
||||||
- Right margin for text (#1)
|
- Right margin for text (#1)
|
||||||
- Desktop entry file
|
- Desktop entry file
|
||||||
|
- Option to continue anyway when cert doesn't match TOFU database
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
- Connection timeout is 15 seconds (was 5s)
|
- Connection timeout is 15 seconds (was 5s)
|
||||||
|
1
NOTES.md
1
NOTES.md
@ -10,3 +10,4 @@
|
|||||||
- Filed [issue 25](https://gitlab.com/tslocum/cview/-/issues/25)
|
- Filed [issue 25](https://gitlab.com/tslocum/cview/-/issues/25)
|
||||||
- Modal styling messed up when wrapped - example occurence is the error modal for a long unsupported scheme URL
|
- Modal styling messed up when wrapped - example occurence is the error modal for a long unsupported scheme URL
|
||||||
- Filed [issue 26](https://gitlab.com/tslocum/cview/-/issues/26)
|
- Filed [issue 26](https://gitlab.com/tslocum/cview/-/issues/26)
|
||||||
|
- Add some bold back into modal text after this is fixed
|
@ -18,7 +18,7 @@ func Fetch(u string) (*gemini.Response, error) {
|
|||||||
parsed, _ := url.Parse(u)
|
parsed, _ := url.Parse(u)
|
||||||
ok := handleTofu(resp.Cert, parsed.Port())
|
ok := handleTofu(resp.Cert, parsed.Port())
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, ErrTofu
|
return resp, ErrTofu
|
||||||
}
|
}
|
||||||
return resp, err
|
return resp, err
|
||||||
}
|
}
|
||||||
|
@ -104,3 +104,12 @@ func handleTofu(cert *x509.Certificate, port string) bool {
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RemoveTofuEntry invalidates the TOFU entry in the database for the given cert and port.
|
||||||
|
// This will make any cert for that domain valid.
|
||||||
|
//
|
||||||
|
// The port string can be empty, to indicate port 1965.
|
||||||
|
func RemoveTofuEntry(cert *x509.Certificate, port string) {
|
||||||
|
tofuStore.Set(idKey(cert.Subject.CommonName, port), "")
|
||||||
|
tofuStore.WriteConfig()
|
||||||
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package display
|
package display
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
@ -35,7 +36,6 @@ var inputCh = make(chan string)
|
|||||||
var inputModalText string // The current text of the input field in the modal
|
var inputModalText string // The current text of the input field in the modal
|
||||||
|
|
||||||
var yesNoModal = cview.NewModal().
|
var yesNoModal = cview.NewModal().
|
||||||
SetBackgroundColor(tcell.ColorPurple).
|
|
||||||
SetButtonBackgroundColor(tcell.ColorNavy).
|
SetButtonBackgroundColor(tcell.ColorNavy).
|
||||||
SetButtonTextColor(tcell.ColorWhite).
|
SetButtonTextColor(tcell.ColorWhite).
|
||||||
SetTextColor(tcell.ColorWhite).
|
SetTextColor(tcell.ColorWhite).
|
||||||
@ -143,7 +143,26 @@ func Input(prompt string) (string, bool) {
|
|||||||
|
|
||||||
// YesNo displays a modal asking a yes-or-no question.
|
// YesNo displays a modal asking a yes-or-no question.
|
||||||
func YesNo(prompt string) bool {
|
func YesNo(prompt string) bool {
|
||||||
yesNoModal.SetText(prompt)
|
yesNoModal.SetText(prompt).SetBackgroundColor(tcell.ColorPurple)
|
||||||
|
tabPages.ShowPage("yesno")
|
||||||
|
tabPages.SendToFront("yesno")
|
||||||
|
App.SetFocus(yesNoModal)
|
||||||
|
App.Draw()
|
||||||
|
|
||||||
|
resp := <-yesNoCh
|
||||||
|
tabPages.SwitchToPage(strconv.Itoa(curTab))
|
||||||
|
return resp
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tofu displays the TOFU warning modal.
|
||||||
|
// It returns a bool indicating whether the user wants to continue.
|
||||||
|
func Tofu(host string) bool {
|
||||||
|
// Reuses yesno modal, with error colour
|
||||||
|
|
||||||
|
yesNoModal.SetBackgroundColor(tcell.ColorMaroon)
|
||||||
|
yesNoModal.SetText(
|
||||||
|
fmt.Sprintf("%s's certificate has changed, possibly indicating an security issue. Are you sure you want to continue anyway?", host),
|
||||||
|
)
|
||||||
tabPages.ShowPage("yesno")
|
tabPages.ShowPage("yesno")
|
||||||
tabPages.SendToFront("yesno")
|
tabPages.SendToFront("yesno")
|
||||||
App.SetFocus(yesNoModal)
|
App.SetFocus(yesNoModal)
|
||||||
|
@ -140,7 +140,7 @@ func setPage(p *structs.Page) {
|
|||||||
// The second returned item is a bool indicating if page content was displayed.
|
// The second returned item is a bool indicating if page content was displayed.
|
||||||
// It returns false for Errors, other protocols, etc.
|
// It returns false for Errors, other protocols, etc.
|
||||||
func handleURL(u string) (string, bool) {
|
func handleURL(u string) (string, bool) {
|
||||||
defer App.Draw() // Make sure modals get displayed
|
defer App.Draw() // Just in case
|
||||||
|
|
||||||
//logger.Log.Printf("Sent: %s", u)
|
//logger.Log.Printf("Sent: %s", u)
|
||||||
|
|
||||||
@ -178,7 +178,7 @@ func handleURL(u string) (string, bool) {
|
|||||||
return "", false
|
return "", false
|
||||||
}
|
}
|
||||||
if !strings.HasPrefix(u, "gemini") {
|
if !strings.HasPrefix(u, "gemini") {
|
||||||
Error("Protocol Error", "Only [::b]gemini[::-] and [::b]http[::-] are supported. URL was "+u)
|
Error("Protocol Error", "Only gemini and HTTP are supported. URL was "+u)
|
||||||
bottomBar.SetText(tabMap[curTab].Url)
|
bottomBar.SetText(tabMap[curTab].Url)
|
||||||
return "", false
|
return "", false
|
||||||
}
|
}
|
||||||
@ -195,7 +195,17 @@ func handleURL(u string) (string, bool) {
|
|||||||
App.Draw()
|
App.Draw()
|
||||||
|
|
||||||
res, err := client.Fetch(u)
|
res, err := client.Fetch(u)
|
||||||
if err != nil {
|
if err == client.ErrTofu {
|
||||||
|
if Tofu(parsed.Host) {
|
||||||
|
// They want to continue anyway
|
||||||
|
client.RemoveTofuEntry(res.Cert, parsed.Port())
|
||||||
|
return handleURL(u)
|
||||||
|
}
|
||||||
|
// They don't want to continue
|
||||||
|
// Set the bar back to original URL
|
||||||
|
bottomBar.SetText(tabMap[curTab].Url)
|
||||||
|
return "", false
|
||||||
|
} else if err != nil {
|
||||||
Error("URL Fetch Error", err.Error())
|
Error("URL Fetch Error", err.Error())
|
||||||
// Set the bar back to original URL
|
// Set the bar back to original URL
|
||||||
bottomBar.SetText(tabMap[curTab].Url)
|
bottomBar.SetText(tabMap[curTab].Url)
|
||||||
|
Loading…
Reference in New Issue
Block a user