with-authinfo-kludge, with-authinfo-kludge.1: Implementation!
[with-authinfo-kludge] / with-authinfo-kludge.1
CommitLineData
b3370918
MW
1.\" -*-nroff-*-
2.\"
3.\" Manual page for `with-authinfo-kludge'.
4.\"
5.\" (c) 2016 Mark Wooding
6.\"
7.
8.\"----- Licensing notice ---------------------------------------------------
9.\"
10.\" This program is free software; you can redistribute it and/or modify
11.\" it under the terms of the GNU General Public License as published by
12.\" the Free Software Foundation; either version 2 of the License, or
13.\" (at your option) any later version.
14.\"
15.\" This program is distributed in the hope that it will be useful,
16.\" but WITHOUT ANY WARRANTY; without even the implied warranty of
17.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18.\" GNU General Public License for more details.
19.\"
20.\" You should have received a copy of the GNU General Public License
21.\" along with this program; if not, write to the Free Software Foundation,
22.\" Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23.
24.ie t \{\
25. ds o \(bu
26.\}
27.el \{\
28. ds o o
29.\}
30.
31.de hP
32.IP
33\h'-\w'\fB\\$1\ \fP'u'\fB\\$1\ \fP\c
34..
35.
36.de VS
37.sp 1
38.RS
39.nf
40.ft B
41..
42.de VE
43.ft R
44.fi
45.RE
46.sp 1
47..
48.
49.TH with-authinfo-kludge 1 "23 April 2016"
50.
51.\"--------------------------------------------------------------------------
52.SH NAME
53with-authinfo-kludge \- run a newsreader with AUTHINFO GENERIC support
54.
55.SH SYNOPSIS
56with-authinfo-kludge
57.RB [ \-v ]
58.RB [ \-d
59.IR dir ]
60.RB [ \-f
61.IR conf ]
62.RB [ \-t
63.IR tag ]
64.br
65\h'5m'\c
66[
67.BI + server
68.RI [ param \fR= value
69\&...] \&...]
70.RB [ + ]
71.br
72\h'5m'\c
73.I command
74.RI [ args
75\&...]
76.
77.\"--------------------------------------------------------------------------
78.SH DESCRIPTION
79.
80The
81.B with-authinfo-kludge
82program is an
83.I adverbial modifier
84which runs another command
85(typically a newsreader)
86in an environment in which at can,
87transparently to it,
88make connections to certain NNTP servers
89which usually require
90.B AUTHINFO GENERIC
91authentication before they'll permit clients to read or post.
92This is useful because support for
93.B AUTHINFO GENERIC
94has never been especially widely supported by newsreaders
95and now seems to be being withdrawn from those newsreaders
96which used to support it.
97.PP
98In the simple case, you say something like
99.VS
100with-authinfo-kludge slrn
101.VE
102and then
103.B slrn
104will start up,
105connect to your default NNTP server
106(as named in the
107.B NNTPSERVER
108environment variable),
109authenticate to it as needed,
110and let you read and post news.
111In more complicated cases,
112.B with-authinfo-kludge
113can handle multiple NNTP servers,
114set up SSH forwarding for them,
115offer different authentication credentials to them,
116and hide the fact that they might be running on nonstandard ports.
117.PP
118The
119.B with-authinfo-kludge
120program doesn't do all of this itself:
121it depends on some other tools existing on the system in which it runs.
122(It doesn't need anything special running on the server system.)
123The external dependencies are as follows.
124.hP \*o
125The
126.B authinfo-kludge
127program, by Richard Kettlewell,
128is a simple proxy which relays commands and responses
129between the client (on stdin/stdout) and server (over TCP),
130and responds transparently to authentication requests from the server.
131.hP \*o
132The
133.B noip
134hack, by Mark Wooding,
135is an
136.B LD_PRELOAD
137library which selectively uses Unix-domain sockets
138in place of IPv4 or IPv6 sockets.
139.
140.SS "Command line"
141The
142.B with-authinfo-kludge
143program accepts a small number of options
144before its main command-line arguments.
145.TP
146.B \-h
147Write help about the command-line syntax to standard output,
148and exit with status zero.
149.TP
150.BI "\-d " dir
151Use
152.I dir
153as the `runtime directory',
154which is used to store sockets and other working files
155while
156.B with-authinfo-kludge
157is running.
158By default, it will choose an appropriate place
159in a moderately complicated manner described below;
160this option lets you override its choice
161in order to achieve special effects.
162.TP
163.BI "\-f " conf
164Read configuration from
165.IR conf .
166The default is somewhat complicated;
167see below.
168.TP
169.BI "\-t " tag
170Use
171.I tag
172to distinguish this usage of
173.B with-authinfo-kludge
174from others.
175The tag is used to select default configuration files
176and runtime directories.
177By default, the basename of the
178.I command
179is used.
180.TP
181.B "\-v"
182Print messages explaining what
183.B with-authinfo-kludge
184is doing to standard error.
185By default,
186.B with-authinfo-kludge
187does its thing silently unless there are problems.
188.PP
189The
190.I command
191argument names the command which should be run
192with the various proxy arrangements which it is the task of
193.B with-authinfo-kludge
194to arrange; it will be passed the
195.IR args ,
196if any.
197The command name and arguments are not subject to
198interpretation by the shell;
199if, for some reason, you wanted to make use of shell features,
200you should specify a command of the form
201.B /bin/sh
202.B \-c
203.IR shell-fragment .
204.PP
205Between the options (if any) and the
206.I command
207name,
208there may be a number of server configurations.
209If any are present, they take the place of any configuration file:
210an error is reported if a
211.B \-f
212option was passed.
afaf8da0 213A server configuration starts with
b3370918
MW
214an argument consisting of a server name prefixed by a
215.RB ` + '
216character:
217.IP
218.BI + server
219.PP
220This may be followed by assignments
221.IP
222.IB param = value
223.PP
224which set configuration parameters
225for the previously-named server.
226Such a server configuration on the command line
227is treated exactly the same as a configuration-file section
228.IP
229.BI [ server ]
230.br
231.IB param = value
232.br
233\&...
234.PP
235See below for details about the configuration file.
236.PP
237To hedge against the unlikely event that the desired
238.IR command 's
239name actually begins with
240.RB ` + ',
241an argument consisting of a
242.RB ` + '
243sign on its own marks the end of the server configurations:
244the following argument will be interpreted as the command name
245regardless of its syntactic form.
246If there is a
247.RB ` + '
248marker, but no server configurations,
249then the configuration file is read,
250or the default configuration is used,
251as usual.
252.
253.SS "Configuration file"
254The
255.B with-authinfo-kludge
256program reads configuration from a standard-ish
257.RB ` .ini '-format
258file.
259The file consists of parameter settings of the form
260.IP
261.I param
262.B =
263.I value
264.PP
265divided into sections by headers of the form
266.IP
267.BI [ name ]
268.PP
269Whitespace around the
270.IR name ,
271.I param
272and
273.I value
274strings is discarded.
275A section
276.I name
277may itself contain square brackets,
278and they need not be properly nested.
279There is no syntax for continuing values over more than one line.
280.PP
281The file may also contain blank lines,
282and comment lines whose first non-whitespace character is either
283.RB ` # '
284or
285.RB ` ; '.
286All such lines are ignored.
287.PP
288Parameter settings apply to the section named in the most recent
289setion header.
290Settings appearing before the first section header apply to
291the special section named
292.BR @GLOBAL ,
293just as if a line
294.IP
295.B [@GLOBAL]
296.PP
297appeared at the very top of the file.
298It is permitted (though not usually expected)
299for several section headers to have the same name;
300in this case,
301all of the settings following any of the occurrences are gathered together,
302just as if they'd all appeared under a single header,
303in the same order.
304If the same parameter is assigned more than once,
305then only the
306.I last
307assignment has any effect.
308.PP
309With the exception of the
310.B @GLOBAL
311section,
312each section header should name an NNTP server.
313.PP
314The following server parameters are recognized.
315.TP
316.BI local= host\fR[ : port \fR]
317Sets the NNTP server address which the newsreader command
318expects to connect to.
319This does
320.I not
321have to be an address local to the machine on which
322.B with-authinfo-kludge
323runs.
324It defaults to the
325.I server
326name from the section heading
327(which must therefore be in the appropriate format),
328and may be equal to the
329.I remote
330address (below) without causing difficulty.
838ff5e9
MW
331Note that
332.B with-authinfo-kludge
333will not do anything to encourage the client
334to connect to the right address;
335its caller must arrange to configure the client correctly,
336e.g., by setting the
337.B NNTPSERVER
338environment variable appropriately.
b3370918
MW
339.TP
340.BI nntpauth= "parameter arguments\fR..."
341Set the AUTHINFO GENERIC authentication parameter and arguments
342to use for this server.
343The default is to use the settings from the
344.B NNTPAUTH
345environment variable.
346.TP
347.BI remote= host\fR[ : port \fR]
348Sets the real address of the NNTP server which
349.BR with-authinfo-kludge 's
350proxy (or the SSH tunnel) should connect to.
351It defaults to the
352.I server
353name from the section heading
354(which must therefore be in the appropriate format).
355.TP
356.BI sshbind= host\fR[ : port\fR]
357Change the address and port number
358of the local end of the SSH tunnel
359set up by the
360.B via
361parameter.
362The default is to use
e8e64c07 363.\" FIXME Fuck you openssh
b3370918
MW
364127.1.0.1:119.
365It is
366.I not
367a problem for multiple servers to use the same address:
368.B with-authinfo-kludge
369uses the
370.BR noip (1)
371library to keep them
372separate.
373.TP
374.BI via= gateway
375Use SSH connection forwarding to reach the server.
376The
377.I gateway
378is passed to
379.BR ssh (1)
380as its hostname parameter,
381so may be a hostname or IP address,
382possibly prefixed by
383.IB user @
384to choose a different login name;
385or it may name a
386.BR ssh_config (1)
387stanza providing detailed configuration.
388Note that the local end of the tunnel will
389.I not
390be exposed to other users of the local machine,
391since this instance of SSH is run under the control of
392.BR noip (1).
393.PP
394The various parameters which take network addresses
395accept a common syntax:
396.IP
397.IR host \c
398.RB [ : \c
399.IR port ]
400.PP
401The
402.I host
403may be a hostname;
404an IPv4 address in dotted-quad notation; or
405an IPv6 address in hex-and-colons notation,
406which must contain at least
407.I two
408colons to be valid.
409Raw IP addresses may be surrounded by square brackets;
410this is necessary to disambiguate a trailing
411.BI : port
412following an IPv6 address because the IPv6 address syntax is stupid.
413.PP
414The
415.B @GLOBAL
416section may set the following parameters.
417.TP
418.BI rundir= dir
419Set the runtime directory to be
420.IR dir .
421This directory (but not its parent directories)
422will be created automatically if necessary.
423The default runtime directory is chosen in a complicated way;
424see below.
425.PP
426The configuration file is found as follows.
427.hP 1.
428If server configurations are provided on the command line,
429then they are used instead of any configuration file.
430.hP 2.
431If a
432.B \-f
433option is given, then it is read as a configuration file.
434A fatal error is reported if the file does not exist,
435or cannot be read for some other reason.
436.hP 3.
437The user's home directory is determined, as follows.
438If the environment variable
439.B HOME
440is set, then its value is used.
b3370918
MW
441Let
442.I home
443be the home directory so determined, if any.
444.hP 4.
445A `configuration home' directory is determined, as follows.
446If the environment variable
447.B XDG_CONFIG_HOME
448is set, then its value is used.
449Otherwise, the configuration home is
450.IB home /.config \fR;
451a fatal error is reported at this point
452if no home directory was determined.
453Let
454.I config-home
455denote the configuration home directory so determined.
e8e64c07 456.\" FIXME XDG_CONFIG_DIRS too now
b3370918
MW
457.hP 5.
458A `tag' is chosen, as follows.
459If the
460.B \-t
461option is given, then its value is used;
462otherwise the tag is the basename of the
463.I command
464(i.e., the part following the last
465.RB ` / ',
466if any).
467Let
468.I tag
469denote the tag so chosen.
470.hP 6.
471If
472.IB config-home /with-authinfo-kludge/ tag .conf
473exists, then it is read as a configuration file.
474(If it can't be read, then a fatal error is reported.)
475.hP 7.
476If
477.IB config-home /with-authinfo-kludge/@default.conf
478exists, then it is read as a configuration file.
479(If it can't be read, then a fatal error is reported.)
480.hP 8.
481No configuration file could be found,
482so a default configuration is constructed, as follows.
483Let
484.I nntp-server
afaf8da0 485be the value of the
b3370918
MW
486.B NNTPSERVER
487environment variable;
488if it is not set, then a fatal error is reported.
489The default configuration is as follows.
490.RS
491.IP
492.BI [ nntp-server ]
493.RE
494.
495.SS "The runtime directory"
496(This section is technical, and can safely be skipped by most users.
497It may be useful to know this stuff if
498.B with-authinfo-kludge
499is behaving confusingly and you're trying to understand why.)
500.PP
501The runtime directory is chosen as follows.
502.hP 1.
503If the
504.B \-d
505option is present, then its value is used.
e365c82b
MW
506Otherwise, if the configuration file specifies
507a value for the global
508.B rundir
509parameter then that it used.
b3370918
MW
510.hP 2.
511If the environment variable
512.B XDG_RUNTIME_DIR
513is set, then let
514.I run
515denote its value;
516then
517.IB run /with-authinfo-kludge
518is used as the runtime directory.
d9c763dc 519.hP 3
b3370918
MW
520If the environment variable
521.B TMPDIR
522is set, then let
523.I tmp
524be its value;
525otherwise, let
526.I tmp
527be
528.BR /tmp .
d9c763dc
MW
529Let
530.I uid
531be the current effective uid, in decimal,
532without leading zeroes
533(if the superuser is foolish enough to run this program then
534.I uid
535is
536.BR 0 ).
b3370918 537If
d9c763dc 538.IB tmp/ with-authinfo-kludge- uid
b3370918
MW
539exists,
540is a directory (and not a symbolic link),
541is owned by the current effective uid,
542and has no permissions for group or others;
543or if it does not exist but can be created with the above properties;
544then it is used as the runtime directory.
d9c763dc 545.hP 4.
b3370918
MW
546The user's home directory is determined, as follows.
547If the environment variable
548.B HOME
549is set, then its value is used.
b3370918
MW
550Let
551.I home
552be the home directory so determined, if any.
d9c763dc 553.hP 5.
b3370918
MW
554A `cache home' directory is determined, as follows.
555If the environment variable
556.B XDG_CACHE_HOME
557is set, then its value is used.
558Otherwise, the configuration home is
559.IB home /.cache \fR;
560a fatal error is reported at this point
561if no home directory was determined.
562Let
563.I cache-home
564denote the cache home directory so determined.
565If the cache home directory does not exist,
566then it is created with mode 0777 (as modified by the umask).
d9c763dc 567.hP 6.
b3370918
MW
568Let
569.I hostname
570be the local machine's hostname,
571as reported by
572.BR gethostname (2).
e365c82b 573Then
b3370918 574.IB cache-home /with-authinfo-kludge. hostname
e365c82b
MW
575is used as the runtime directory.
576.PP
577If the directory chosen by the above procedure does not exist,
b3370918
MW
578then it is created as a directory,
579with mode 0700 (and modified by the umask).
b3370918
MW
580(If it exists, but is not in fact a directory,
581then later operations will fail.)
582.PP
583The runtime directory contains a number of other directories,
584named
e8e64c07
MW
585.\" FIXME junk, new, naming
586.\" session dirs now entirely different
b3370918
MW
587.IR tag . pid \fR.
588Each such directory corresponds to a running
589(or failed)
590instance of
591.BR with-authinfo-kludge ;
592the
593.I pid
594is its process-id (possibly useful for diagnostic purposes),
595and the
596.I tag
597is the tag summarizing its purpose
598(as determined in step 5 of the procedure
599for finding a configuration file).
600.PP
601The contents of the instance directory are as follows.
602.TP
603.B client.pid
604The process-id of the client command run by
605.BR with-authinfo-kludge .
606.TP
607.B lock
608An empty file.
609A
610running
611.B with-authinfo-kludge
612process holds a lock on this file.
613It is used simply to tell other processes that
614the directory is still in use and shouldn't be cleaned up.
615.TP
616.B noip/
617A directory containing Unix-domain sockets,
618maintained by the
619.B noip
620library.
621.TP
622.B ssh.pid
623The process-id of the SSH process started to satisfy a
624.B via
625server parameter.
626.
627.\"--------------------------------------------------------------------------
628.SH BUGS
629.
630The program is probably too complicated for many uses,
631but the author finds the various bells and whistles useful.
632.PP
633There isn't a good way to get two or more NNTP clients
634to share the same proxy machinery.
635This is somewhat wasteful.
636Fixing this would necessitate some other way of
637orchestrating the setup and teardown of runtime directories.
b3370918
MW
638.
639.\"--------------------------------------------------------------------------
640.SH SEE ALSO
641.
642.BR authinfo-kludge (1),
643.BR noip (1).
644.PP
645S. Barber,
646.IR "RFC2980, Common NNTP Extensions",
647.if !t \{\
648.br
649\h'5m'\c
650.\}
651.BR "https://www.ietf.org/rfc/rfc2980.txt" .
652.
653.SH AUTHOR
654Mark Wooding,
655<mdw@distorted.org.uk>
656.
657.\"----- That's all, folks --------------------------------------------------