From: Jeff Halter Date: Sun, 28 May 2023 16:39:33 +0000 (-0700) Subject: Handler tracker list errors X-Git-Url: https://git.r.bdr.sh/rbdr/mobius/commitdiff_plain/04f402736027ced9bfbbf628136dc4872b671555 Handler tracker list errors --- diff --git a/hotline/tracker.go b/hotline/tracker.go index 4d4c8a6..bd7aa00 100644 --- a/hotline/tracker.go +++ b/hotline/tracker.go @@ -125,7 +125,10 @@ func GetListing(addr string) ([]ServerRecord, error) { for { scanner.Scan() var srv ServerRecord - _, _ = srv.Read(scanner.Bytes()) + _, err = srv.Read(scanner.Bytes()) + if err != nil { + return nil, err + } servers = append(servers, srv) if len(servers) == totalSrv { @@ -146,17 +149,29 @@ func GetListing(addr string) ([]ServerRecord, error) { // 00000050 4f 54 4c 2e 63 6f 6d 3a 35 35 30 30 2d 4f 3a b2 |OTL.com:5500-O:.| // 00000060 15 7c 00 00 00 00 08 53 65 6e 65 63 74 75 73 20 |.|.....Senectus | func serverScanner(data []byte, _ bool) (advance int, token []byte, err error) { + // The name length field is the 11th byte of the server record. If we don't have that many bytes, + // return nil token so the Scanner reads more data and continues scanning. if len(data) < 10 { return 0, nil, nil } // A server entry has two variable length fields: the name and description. - // To get the token length, we first need the name length from the 10th byte: + // To get the token length, we first need the name length from the 10th byte nameLen := int(data[10]) + // The description length field is at the 12th + nameLen byte of the server record. + // If we don't have that many bytes, return nil token so the Scanner reads more data and continues scanning. + if len(data) < 11+nameLen { + return 0, nil, nil + } + // Next we need the description length from the 11+nameLen byte: descLen := int(data[11+nameLen]) + if len(data) < 12+nameLen+descLen { + return 0, nil, nil + } + return 12 + nameLen + descLen, data[0 : 12+nameLen+descLen], nil } diff --git a/hotline/tracker_test.go b/hotline/tracker_test.go index 3e0be5d..481f916 100644 --- a/hotline/tracker_test.go +++ b/hotline/tracker_test.go @@ -139,6 +139,44 @@ func Test_serverScanner(t *testing.T) { wantToken: []byte(nil), wantErr: assert.NoError, }, + { + name: "when nameLen exceeds provided data", + args: args{ + data: []byte{ + 0x18, 0x05, 0x30, 0x63, // IP Addr + 0x15, 0x7c, // Port + 0x00, 0x02, // UserCount + 0x00, 0x00, // ?? + 0xff, // Name Len + 0x54, 0x68, 0x65, // Name + 0x03, // Desc Len + 0x54, 0x54, 0x54, // Description + }, + atEOF: false, + }, + wantAdvance: 0, + wantToken: []byte(nil), + wantErr: assert.NoError, + }, + { + name: "when description len exceeds provided data", + args: args{ + data: []byte{ + 0x18, 0x05, 0x30, 0x63, // IP Addr + 0x15, 0x7c, // Port + 0x00, 0x02, // UserCount + 0x00, 0x00, // ?? + 0x03, // Name Len + 0x54, 0x68, 0x65, // Name + 0xff, // Desc Len + 0x54, 0x54, 0x54, // Description + }, + atEOF: false, + }, + wantAdvance: 0, + wantToken: []byte(nil), + wantErr: assert.NoError, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/hotline/ui.go b/hotline/ui.go index 0347274..e3e2fab 100644 --- a/hotline/ui.go +++ b/hotline/ui.go @@ -102,12 +102,7 @@ func (ui *UI) showBookmarks() *tview.List { return list } -func (ui *UI) getTrackerList() *tview.List { - listing, err := GetListing(ui.HLClient.Pref.Tracker) - if err != nil { - // TODO - } - +func (ui *UI) getTrackerList(servers []ServerRecord) *tview.List { list := tview.NewList() list.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { if event.Key() == tcell.KeyEsc { @@ -117,14 +112,12 @@ func (ui *UI) getTrackerList() *tview.List { }) list.Box.SetBorder(true).SetTitle("| Servers |") - shortcut := 97 // rune for "a" - for i, srv := range listing { - addr := srv.Addr() - srvName := srv.Name + const shortcut = 97 // rune for "a" + for i, srv := range servers { list.AddItem(string(srv.Name), string(srv.Description), rune(shortcut+i), func() { ui.Pages.RemovePage("joinServer") - newJS := ui.renderJoinServerForm(string(srvName), addr, GuestAccount, "", trackerListPage, false, true) + newJS := ui.renderJoinServerForm(string(srv.Name), srv.Addr(), GuestAccount, "", trackerListPage, false, true) ui.Pages.AddPage("joinServer", newJS, true, true) ui.Pages.ShowPage("joinServer") @@ -411,7 +404,7 @@ func (ui *UI) renderServerUI() *tview.Flex { newsPostTextArea.SetText(curTxt) } default: - _, _ = fmt.Fprintf(newsPostTextArea, string(event.Rune())) + _, _ = fmt.Fprint(newsPostTextArea, string(event.Rune())) } } @@ -468,7 +461,20 @@ func (ui *UI) Start() { ui.Pages.AddAndSwitchToPage("bookmarks", ui.showBookmarks(), true) }). AddItem("Browse Tracker", "", 't', func() { - ui.trackerList = ui.getTrackerList() + listing, err := GetListing(ui.HLClient.Pref.Tracker) + if err != nil { + errMsg := fmt.Sprintf("Error fetching tracker results:\n%v", err) + errModal := tview.NewModal() + errModal.SetText(errMsg) + errModal.AddButtons([]string{"Cancel"}) + errModal.SetDoneFunc(func(buttonIndex int, buttonLabel string) { + ui.Pages.RemovePage("errModal") + }) + ui.Pages.RemovePage("joinServer") + ui.Pages.AddPage("errModal", errModal, false, true) + return + } + ui.trackerList = ui.getTrackerList(listing) ui.Pages.AddAndSwitchToPage("trackerList", ui.trackerList, true) }). AddItem("Settings", "", 's', func() {