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