Gemini link prefix strings are back.
[elpher.git] / ISSUES.org
1 #+TITLE: Issues and Dev Notes
2 #+TODO: OPEN(o!) | CLOSED(c!) INVALID(i@)
3 #+STARTUP: logdrawer
4    
5 * Open Bugs
6
7 ** OPEN Sanitize certificate names
8    :LOGBOOK:
9    - State "OPEN"       from              [2020-06-22 Mon 10:32]
10    :END:
11    
12 Currently things will break in undefined ways if a name is specified
13 that contains path separators and probably other characters that I
14 haven't thought of.  This is dangerously unacceptable and needs to be
15 fixed right away.
16
17 ** OPEN Set timer after creating network process
18
19 While the current order is necessary for synchronous socks
20 connections, it is unecessary for regular connections which have the
21 no-wait flag set.  Furthermore, for these connections, having the
22 timer fire up early means that it interferes with requests for
23 user interaction that may appear during the initial connection setup.
24 E.g., asking for approval of uknown TLS certificates.
25
26 * Closed Bugs
27
28 ** CLOSED Relative Gemini links processed improperly
29 :LOGBOOK:
30 - State "CLOSED"     from "OPEN"       [2021-08-04 Wed 15:54]
31 - State "OPEN"       from              [2021-08-04 Wed 13:53]
32 :END:
33
34 Skyjake's gemlog at gemini://skyjake.fi/gemlog/ demonstrate's the
35 issue.  The link back to the root selector in the footer of that page
36 is a relative link to the parent directory, i.e. "..".  For some
37 reason elpher combines this with the current URL and produces
38 "gemini://skyjake.fi" as the destination of the link.  Such URLs
39 (i.e. without a filename) are allowed as input, but are assumed
40 to not appear internally.
41
42 To see why the internal distinction is important, consider a page
43 where the current URL is gemini://example.com/a_page.  The current
44 directory in this case is "/", meaning a relative link to
45 "another_page" results in a destination link of
46 "gemini://example.com/another_page.  On the other hand, if the current
47 URL is gemini://example.com/a_page/, the same relative link is
48 interpreted as refering to gemini://example.com/a_page/another_page.
49
50 The fix will be to ensure gemini://skyjake.fi/gemlog/.. collapses to
51 gemini://skyjake.fi/ rather than gemini://skyjake.fi.
52
53
54   
55 ** CLOSED Org mode faces are not present in recent emacs versions
56 Even 26.1 doesn't seem to have these.  This means that, for many
57 users, elpher doesn't show any difference between any of the
58 item types.  Not a major problem at all, but the faces we inherit
59 from should definitely be ones which have been present for much
60 longer.  Perhaps the font lock mode faces are the way to go after
61 all.
62
63 Update: changed all default faces to inherit from font-lock and basic faces.
64
65 ** CLOSED URL-centric addressing breaks bookmark file compatibility
66    
67 Need a way to allow people to rescue their old bookmark files
68 following this update.
69
70 ** CLOSED History loops <2019-11-08 Fri>
71
72 Occasionally elpher gets stuck in a "history loop" where a
73 node is its own grandparent.  Obviously this sucks, as history
74 is elpher's main mechanism for making gopherspace exploration
75 painless.
76
77 I suspect the problem is in either ~elpher-visit-node~ or
78 ~elpher-visit-parent~.
79
80 Follow-up: this has been fixed by the new stack-based history system
81 in 2.5.
82
83
84 ** CLOSED Redirects do not rewrite current address
85
86 This is a bug, as gemini://blah.com/hi may get redirected
87 to gemini://blah.com/hi/, at which point link lines
88 of the form "=> there" should be interpreted as pointing
89 at gemini://blah.com/hi/there, while currently they are
90 interpreted as pointing at gemini://blah.com/there.
91
92 ** CLOSED History inconsistency when restarting elpher <2020-05-26 Tue>
93
94 To reproduce:
95 1. open elpher and follow a few links until you're a handful of links below
96    the start page.
97 2. kill the elpher buffer with C-x k
98 3. Open elpher again, which will show the start page.
99 4. Press 'u' to go up.  Elpher wiill respond stating that there is no previous page.
100 5. Press 'u' again. Elpher will then jump to the page that was open when
101    the buffer was originally killed.
102
103 Expected behaviour: elpher should be once again at the bottom of the history
104 stack and should not remember the previous history.
105
106 Observed behaviour: elpher _does_ remember the previous history.
107
108 *** update <2020-05-27 Wed>
109 Turns out this was just because the `elpher` function was merely setting
110 the `elpher-current-page` variable to nil, then using `elpher-visit-page`
111 to visit the start page, resulting in the nil being pushed onto the existing
112 history stack.  Because `elpher-visit-previous-page` always trys to pop from
113 this stack and tests whether the result is nil (which it is when the stack is empty),
114 the first "u" would result in the "no previous page" message but would still
115 pop the stack, meaning that subsequent "u" commands would succeed.
116
117 The fix is just to zero out the history list in the `elpher` function just as
118 `elpher-current-page` is cleared.
119
120 * Open Enhancements
121
122 ** OPEN Allow multiple elpher buffers [33%]
123
124    Shouldn't be too hard, just need elpher-current-node to be
125 buffer-local and allow various buffer-switching procedures to
126 do something sensible.
127
128 Here are the things that need to be implemented before
129 this can happen:
130 - [X] shift history out of node tree and into separate stack
131 - [ ] make history stack variables buffer-local
132 - [ ] have elpher-with-clean-buffer select appropriate buffer 
133    
134 ** OPEN Make installing existing certificates easier
135    :LOGBOOK:
136    - State "OPEN"       from "CLOSED"     [2020-06-22 Mon 10:34]
137    :END:
138
139 It's naive to think that people don't have client certificates created
140 outside of elpher. Thus we need some easy way to "install" these
141 certificates, either by copying them or by referencing them in some
142 way.
143
144 * Closed Enhancements
145   
146 ** CLOSED Turn on lexical scoping
147
148    A branch exists for this, but there are some compilation kinks
149 to iron out.
150
151   
152 ** CLOSED Implement support for telnet entries
153
154 Similar to http entries, telnet entries will be handled by code
155 external to elpher. However it seems I made http entry handling a
156 special case, and I don't want another!  So the only option is to
157 bring both http and telnet entries back into the fold by representing
158 them both as standard nodes and having the grunt work done by getter
159 functions.
160
161 ** CLOSED Allow users to access selected and current node details.
162    
163 ** CLOSED Implement bookmark system
164
165   Currently the bookmark page replaces the current page, and it
166   does so silently (i.e. it doesn't become part of the link hierarchy).
167   I think this is a mistake, as it results in confusing behaviour when
168   traversing the link hierarchy after visiting one of the bookmarked links.
169
170   Instead, I think I should
171   1. Make the bookmark page part of the hierarchy, and
172   2. Reinstate the visited node hash table to avoid excess link hierarchy pollution.
173
174   In order to accomplish 1. it will be necessary to make the bookmark page renderer
175   a proper getter function, and one that never caches the contents of the buffer.
176
177   Actually, I might have to think about that a bit more.  I don't know
178   how to answer the question of what the best thing to do with node
179   parent links when using a cached node in place of a new node.  (Maybe
180   I always update node.parent unless parent is already an ancestor of
181   node?)
182
183   
184 ** CLOSED Support character encoding diversity
185
186 ** CLOSED Make URLs the basic address type.
187 Currently I waste a lot of effort converting between
188 URL and non-URL representations.  This is unnecessary, and
189 actually makes lots of things uglier.
190
191 For example, the bookmarks file contains addresses in Elpher's
192 internal representation, whereas I expect users would prefer
193 it contain URLs.
194
195 So the idea would be for (elpher-node-address node) to be
196 a either a string or a symbol, with symbols used for "special"
197 pages (bookmarks, start page, etc).  The getter functions
198 `elpher-address-selector' etc will still do what they currently
199 do, but will process the URL to do it.
200
201 This also means that non-gopher URLs will be explicitly represented
202 as such: no more abusing the "h" type for these.
203
204 ** INVALID Remove "redraw" command
205 This is only necessary for returning from displaying the raw
206 server response.  If I can provide a better way of doing that
207 then we can get rid of redraw entirely.
208
209 Actually, this command can be useful to correct rendering issues that
210 occasionally pop up in termal windows.  Lets leave it for now.
211
212 ** CLOSED Implement Finger support
213    
214 ** CLOSED Improve download performance
215    This is actually easy to fix - the major problem at the moment is
216    the braindead way the incrementally-retrieved data is recorded:
217    (setq result-string (concat result-string next-bit)).
218    This is O(N^2).  Yuck!
219    
220    Okay, replacing this really does improve things.  Large gemini
221    downloads now seem occur at rates I'd expect.
222    
223 ** CLOSED Download/rendering progress feedback
224    Particularly for large files or complicated pages, elpher can
225    take a few seconds or more to generate a response.  Thhis is
226    frustrating for users, who are left staring at a blinking
227    cursor.
228
229    A small amount of feedback could help with this.
230
231 ** CLOSED Implement Gemini support [100%]
232    :LOGBOOK:
233    - State "CLOSED"     from "OPEN"       [2020-06-20 Sat 22:32]
234    :END:
235    
236 Here is the checklist of features required before release:
237 - [X] basic genimi transactions
238 - [X] gemini transactions requiring client certificates
239 - [X] gemini input handling
240 - [X] gemini map files (text/gemini)
241 - [X] Support for plain text responses (text/*)
242 - [X] Support for image responses (text/image)
243 - [X] Support for mime-specified character encodeing
244 - [X] Saving responses to disk
245 - [X] Viewing raw responses
246   
247 The last few will be made infinitely easier if we factor the
248 gopher "getter" code differently.
249
250
251 ** INVALID Allow for grouping of bookmarks
252 :LOGBOOK:
253 - State "INVALID"    from              [2021-07-23 Fri 10:10] \\
254   Since switching to Emacs native bookmarks, this is no longer our concern.
255 :END:
256 To support this I'd like to add a bookmark page specific
257 set of keybindings.  Currently all bindings available on
258 the bookmark page are available everywhere else.  But
259 expanding and collapsing bookmark groups sounds like it
260 might need more specific bindings.
261
262 *** Priority bump <2020-05-31 Sun>
263
264 As bookmark lists grow, some sort of grouping is becoming more and more
265 important.  Furthermore, with this in place it would become feasible
266 (and I really suspect almost trivial) to implement an update-checking
267 system for chosen groups of bookmarks.
268
269 For instance, we could prefetch content for each of the addresses within
270 a chosen group, indicating which had been changed since the last fetch.
271 (We could just store hashes of earlier content to detect changes.)
272
273 The difficult thing to decide is how the UI for the new bookmark page
274 will work.  It already has its own renderer, and we could easily stop
275 using the gopher directory line renderer in favour of something more
276 amenable to displaying the group information.  Thus we're very free to
277 do whatever we like once we also have a special key map in place as well.
278
279 I guess I need to look into what native widgets Emacs has for displaying
280 collapsable hierarchies.
281
282
283 ** CLOSED Add history browsing
284 :LOGBOOK:
285 - State "CLOSED"     from "OPEN"       [2021-07-23 Fri 10:09]
286 :END:
287
288 ** CLOSED Improve gemeini rendering speed
289 :LOGBOOK:
290 - State "CLOSED"     from "OPEN"       [2021-07-31 Sat 00:18]
291 :END:
292
293 Currently pages with many links render extremely slowly.
294
295 Example (>2000 links, 15s): gemini://rawtext.club/~sloum/geminilist/
296
297 It turns out that by far the main contributor to this is the use of
298 (url-port) in elpher-address-from-gemini-url.  I encountered this
299 problem once before in elpher-remove-redundant-ports.  This function
300 call is just incredibly slow for some bizarre reason.  Happily,
301 (url-portspec) is functionally equivalent and is orders of magnitude
302 faster.  With this replacement, loading the above page takes ~2s
303 and there aren't any other hotspots.
304
305
306 ** CLOSED Replace support for user-specified starting pages
307 :LOGBOOK:
308 - State "CLOSED"     from "OPEN"       [2021-08-09 Mon 17:46]
309 :END:
310 This used to be available, but was removed during a refactor.