Properly initialize user_fd.
[libpwmd.git] / doc / tutorial.lyx
blobbd2b04ca0e487120560b5853b538fb0927e9363e
1 #LyX 2.2 created this file. For more info see http://www.lyx.org/
2 \lyxformat 508
3 \begin_document
4 \begin_header
5 \save_transient_properties true
6 \origin unavailable
7 \textclass docbook
8 \use_default_options false
9 \maintain_unincluded_children false
10 \language english
11 \language_package default
12 \inputencoding auto
13 \fontencoding global
14 \font_roman "default" "default"
15 \font_sans "default" "default"
16 \font_typewriter "default" "default"
17 \font_math "auto" "auto"
18 \font_default_family default
19 \use_non_tex_fonts false
20 \font_sc false
21 \font_osf false
22 \font_sf_scale 100 100
23 \font_tt_scale 100 100
24 \graphics default
25 \default_output_format default
26 \output_sync 0
27 \bibtex_command default
28 \index_command default
29 \paperfontsize default
30 \spacing single
31 \use_hyperref false
32 \papersize default
33 \use_geometry false
34 \use_package amsmath 0
35 \use_package amssymb 0
36 \use_package cancel 1
37 \use_package esint 0
38 \use_package mathdots 1
39 \use_package mathtools 1
40 \use_package mhchem 1
41 \use_package stackrel 1
42 \use_package stmaryrd 1
43 \use_package undertilde 1
44 \cite_engine basic
45 \cite_engine_type default
46 \biblio_style plain
47 \use_bibtopic false
48 \use_indices false
49 \paperorientation portrait
50 \suppress_date false
51 \justification true
52 \use_refstyle 0
53 \index Index
54 \shortcut idx
55 \color #008000
56 \end_index
57 \secnumdepth 3
58 \tocdepth 3
59 \paragraph_separation indent
60 \paragraph_indentation default
61 \quotes_language english
62 \papercolumns 1
63 \papersides 1
64 \paperpagestyle default
65 \tracking_changes false
66 \output_changes false
67 \html_math_output 0
68 \html_css_as_file 0
69 \html_be_strict false
70 \end_header
72 \begin_body
74 \begin_layout Title
75 Libpwmd Tutorial
76 \end_layout
78 \begin_layout Date
79 Sep-21-2016
80 \end_layout
82 \begin_layout Author
83 Ben Kibbey
84 \begin_inset Foot
85 status open
87 \begin_layout Plain Layout
88 bjk@luxsci.net
89 \end_layout
91 \end_inset
94 \end_layout
96 \begin_layout Author
97 \begin_inset CommandInset toc
98 LatexCommand tableofcontents
100 \end_inset
103 \end_layout
105 \begin_layout Section
106 Introduction
107 \end_layout
109 \begin_layout Standard
110 This is a tutorial showing the basic usage of libpwmd
111 \begin_inset Foot
112 status open
114 \begin_layout Plain Layout
115 http://libpwmd.sourceforge.net/
116 \end_layout
118 \end_inset
121  Libpwmd
122 \emph on
124 \emph default
125 is a library making it easy for applications to use pwmd
126 \begin_inset Foot
127 status open
129 \begin_layout Plain Layout
130 http://pwmd.sourceforge.net/
131 \end_layout
133 \end_inset
136 \emph on
137 Password Manager Daemon).
138  Password Manager Daemon
139 \emph default
140  is a universal data server.
141  It began as a way to keep track of passwords for accounts like email and
142  websites but has evolved to store anything you want.
143  There are other password management tools but pwmd has a couple of distinguishi
144 ng features:
145 \end_layout
147 \begin_layout Itemize
148 It does not depend on a desktop environment but has the ability for applications
149  to connect to it like a desktop solution provides.
150 \end_layout
152 \begin_layout Itemize
153 Some portion of a stored data can be shared with another portion in the
154  same data file.
155  This feature behaves a lot like a symbolic link on a file system, XML entities,
156  or HTML targets if you're familiar with those, but implemented in a different
157  way.
158  This means less duplication of content.
159  See 
160 \begin_inset CommandInset ref
161 LatexCommand ref
162 reference "sec:Linking-elements"
164 \end_inset
166  for details.
167 \end_layout
169 \begin_layout Itemize
170 The XML document is OpenPGP encrypted and signed using an existing or newly
171  generated key pair.
172  Symmetric encryption is also supported as well as smartcards.
173  All crypto operations are done using GpgME which in turn uses gnupg.
174 \end_layout
176 \begin_layout Standard
177 Other features include:
178 \end_layout
180 \begin_layout Itemize
181 Multi-threaded.
182  More than one client may access the same data file while optionally locking
183  out other clients.
184 \end_layout
186 \begin_layout Itemize
187 Secure memory management.
188  Pwmd will zero out memory before freeing it and the contents of the cached
189  document are encrypted.
190 \end_layout
192 \begin_layout Itemize
193 Remote connections over TLS with client certificates used as authentication.
194 \end_layout
196 \begin_layout Itemize
197 Remote connections over SSH (some configuration needed).
198 \end_layout
200 \begin_layout Itemize
201 ACL's for each element in an element path, listening socket and filename.
202 \end_layout
204 \begin_layout Section
205 File Format and Element Paths
206 \end_layout
208 \begin_layout Standard
209 The document is in XML format and is manipulated by commands sent from a
210  client.
211  Commands that access previously stored data take what is called an 
212 \emph on
213 element path
214 \emph default
215  as an argument.
216  An element path is a character string containing element names representing
217  branches of an element tree.
218  The branches are separated with a TAB (ASCII 0x09) character.
219  Why a TAB? So other characters can be used in the element name.
220  If for example a '/' were used as the separator, then a URL (i.e., http://sf.net/)
221  could not be used as an element name since it would be an XML syntax error.
222  For the rest of this tutorial, when you see <TAB>, replace it with a real
223  TAB character.
224 \end_layout
226 \begin_layout Standard
227 For example, the element path "root<TAB>child<TAB>last" has the following
228  element tree structure:
229 \end_layout
231 \begin_layout Code
232 <root>
233 \end_layout
235 \begin_layout Code
236     <child>
237 \end_layout
239 \begin_layout Code
240         <last>
241 \end_layout
243 \begin_layout Code
244 Content or XML CDATA of the "last" element.
245 \end_layout
247 \begin_layout Code
248         </last>
249 \end_layout
251 \begin_layout Code
252     </child>
253 \end_layout
255 \begin_layout Code
256 </root>
257 \end_layout
259 \begin_layout Standard
260 I should say that the XML structure that pwmd uses is a little more complicated.
261  It really looks like the following internally, but we will use the above
262  format in this tutorial for simplicity:
263 \end_layout
265 \begin_layout Code
266 <element _name="root">
267 \end_layout
269 \begin_layout Code
270     <element _name="child">
271 \end_layout
273 \begin_layout Code
274         <element _name="last">
275 \end_layout
277 \begin_layout Code
278 Content or CDATA of the "last" element.
279 \end_layout
281 \begin_layout Code
282         </element>
283 \end_layout
285 \begin_layout Code
286     </element>
287 \end_layout
289 \begin_layout Code
290 </element>
291 \end_layout
293 \begin_layout Standard
294 Every element created has an element named 
295 \emph on
296 element
297 \emph default
298  with an attribute 
299 \emph on
300 _name
301 \emph default
302  associated with it.
303  The value of the 
304 \emph on
305 _name
306 \emph default
307  attribute is what an element in an element path refers to.
308  It is done this way so that a wider range of characters can be used in
309  an element name while maintaining valid XML.
310  In fact the only restriction of an element name is that it not contain
311  whitespace characters.
312 \end_layout
314 \begin_layout Standard
315 There is one other difference from your normal XML document in that only
316  the first match of an element is considered for the current element tree
317  depth.
318  When an element of the current depth of an element tree is found, the next
319  element in the element path is searched for beginning at the child node
320  of the found element.
321  From the example above:
322 \end_layout
324 \begin_layout Code
325 <root>
326 \end_layout
328 \begin_layout Code
329     <child>
330 \end_layout
332 \begin_layout Code
333         <last>
334 \end_layout
336 \begin_layout Code
337 Content or XML CDATA of the "last" element.
338 \end_layout
340 \begin_layout Code
341         </last>
342 \end_layout
344 \begin_layout Code
345     </child>
346 \end_layout
348 \begin_layout Code
349     <child>
350 \end_layout
352 \begin_layout Code
353 This element will never be reached.
354 \end_layout
356 \begin_layout Code
357     </child>
358 \end_layout
360 \begin_layout Code
361 </root>
362 \end_layout
364 \begin_layout Standard
365 The second "<child>" element is never reached because it has the same name
366  as its sibling element 
367 \begin_inset Quotes eld
368 \end_inset
370 above
371 \begin_inset Quotes erd
372 \end_inset
374  it.
375 \end_layout
377 \begin_layout Section
378 Connecting to PWMD
379 \end_layout
381 \begin_layout Standard
382 You will need a 
383 \emph on
384 pwmd
385 \emph default
386  client to send commands to the pwmd server.
388 \emph on
389 libpwmd
390 \emph default
391  includes a client named 
392 \emph on
393 pwmc
394 \emph default
396  It is command-line based and there are not any fancy graphics, but it is
397  good for understanding how 
398 \emph on
399 pwmd
400 \emph default
401  commands are processed.
402  If you want a more user friendly client that resembles a file manager and
403  has a point and click interface, try QPwmc 
404 \begin_inset Foot
405 status open
407 \begin_layout Plain Layout
408 http://qpwmc.sourceforge.net/
409 \end_layout
411 \end_inset
413  which uses the Qt4 or Qt5 toolkit and is also a full featured client.
414 \end_layout
416 \begin_layout Standard
417 In this tutorial we will use the 
418 \emph on
419 pwmc
420 \emph default
421  client included with libpwmd.
423 \emph on
424 pwmc
425 \emph default
426  has two modes that commands are read from: interactive and stdin.
427  The interactive mode uses the readline library and has command history,
428  while reading from standard input (stdin) makes shell scripting and automation
429  easy.
430  For the examples, we will be connecting to the default local unix domain
431  socket (UDS) that pwmd waits for connections on and use interactive mode.
432  Remote connections are also possible over TLS or an SSH channel but those
433  are not covered here.
434  Read the pwmc(1) manual page for details about how to do that.
435 \end_layout
437 \begin_layout Standard
438 The example filename we will use is "datafile".
439  It is initially a non-existent file but it will be created once we have
440  saved to it.
441  Now let us connect to the server in interactive mode and open the data
442  file:
443 \end_layout
445 \begin_layout Code
446 $ pwmc datafile
447 \end_layout
449 \begin_layout Code
450 Connected.
451 \end_layout
453 \begin_layout Code
454 pwmc:datafile>
455 \end_layout
457 \begin_layout Standard
458 The "pwmc>" prompt is a readline prompt that has command history and can
459  also do filename completion when doing a dot command that requires a filename
460  on the local filesystem.
461 \end_layout
463 \begin_layout Section
464 Commands
465 \end_layout
467 \begin_layout Standard
468 There are two different types of commands: client commands and protocol
469  commands.
470  The client commands are 
471 \emph on
472 pwmc
473 \emph default
474  specific and only available to the 
475 \emph on
476 pwmc
477 \emph default
478  client.
479  Protocol commands are commands sent from any client and to the 
480 \emph on
481 pwmd
482 \emph default
483  server.
484  All pwmc client commands are prefixed with a dot '.' followed by the command
485  name.
486  Protocol commands are sent without any dot prefix.
487  To see the available pwmc and protocol commands, send the .help or HELP
488  commands:
489 \end_layout
491 \begin_layout Code
492 pwmc:datafile> .help
493 \end_layout
495 \begin_layout Standard
497 \end_layout
499 \begin_layout Code
500 pwmc:datafile> help
501 \end_layout
503 \begin_layout Standard
504 To store some data in an element path or to create an element path, you
505  will need to know what element path to create.
506  It is up to you how you want your data organized.
507  If for example you will be storing account information it may be good to
508  categorize what the account is for: email, instant messaging, blogging,
509  etc.
510  An application that uses libpwmd may require that a certain element path
511  exists.
512  Refer to that applications documentation to determine what element paths
513  need to be created.
514 \end_layout
516 \begin_layout Standard
517 In the following example we will setup mail server element paths which can
518  be used for other applications requiring a mail server configuration.
519  First, lets create the hostname element path:
520 \end_layout
522 \begin_layout Code
523 pwmc:datafile> STORE
524 \end_layout
526 \begin_layout Code
527 Press CTRL-D to send the current line.
528  Press twice to end.
529  DATA:
530 \end_layout
532 \begin_layout Standard
533 The STORE command is a 
534 \emph on
535 pwmd
536 \emph default
537  protocol command.
538  This, and a few other commands, use what is called a 
539 \emph on
540 server inquire
541 \emph default
542  to retrieve additional command parameters from the client while other commands
543  require only the command itself with its command arguments.
544  The server inquire will wait for the client to finish sending its' data
545  before completing the command.
546  When responding to a server inquire in pwmc, pwmc will show a message informing
547  you that it is waiting for data to be sent.
548  Enter the element path and its content, then press <CTRL-D> twice to finish
549  sending the data and to let 
550 \emph on
551 pwmd
552 \emph default
553  complete the command:
554 \end_layout
556 \begin_layout Code
557 email<TAB>isp<TAB>IMAP<TAB>hostname<TAB>imap.server.com<CTRL-D><CTRL-D>
558 \end_layout
560 \begin_layout Standard
561 Remember that you should replace <TAB> in the examples with a real TAB character.
562  After pressing the first <CTRL-D>, the characters that were entered are
563  sent to 
564 \emph on
565 pwmd
566 \emph default
567  and the inquire continues.
568  To terminate the inquire and finish sending data for the command press
569  <CTRL-D> a second time.
570 \end_layout
572 \begin_layout Standard
573 If you were to have pressed <RETURN> before any <CTRL-D> then the inquired
574  line would have been sent in full including a newline character.
575  Since in this example a newline character in a hostname is not a valid
576  hostname, this is not what we want.
577 \end_layout
579 \begin_layout Standard
580 We have just created an element path whose XML structure looks like the
581  following:
582 \end_layout
584 \begin_layout Code
585 <email>
586 \end_layout
588 \begin_layout Code
589     <isp>
590 \end_layout
592 \begin_layout Code
593         <IMAP>
594 \end_layout
596 \begin_layout Code
597             <hostname>imap.server.com</hostname>
598 \end_layout
600 \begin_layout Code
601         </IMAP>
602 \end_layout
604 \begin_layout Code
605     </isp>
606 \end_layout
608 \begin_layout Code
609 </email>
610 \end_layout
612 \begin_layout Standard
613 The GET protocol command returns the value, or content, of the last element
614  of an element path.
615  To retrieve the hostname of the element path we just created, do:
616 \end_layout
618 \begin_layout Code
619 pwmc:datafile> GET email<TAB>isp<TAB>IMAP<TAB>hostname
620 \end_layout
622 \begin_layout Code
623 imap.server.com
624 \end_layout
626 \begin_layout Code
627 pwmc:datafile>
628 \end_layout
630 \begin_layout Standard
631 Let us create the rest of the needed elements:
632 \end_layout
634 \begin_layout Code
635 pwmc:datafile> STORE
636 \end_layout
638 \begin_layout Code
639 email<TAB>isp<TAB>IMAP<TAB>port<TAB>993<CTRL-D><CTRL-D>
640 \end_layout
642 \begin_layout Code
644 \end_layout
646 \begin_layout Code
647 pwmc:datafile> STORE
648 \end_layout
650 \begin_layout Code
651 email<TAB>isp<TAB>IMAP<TAB>ssl<TAB>1<CTRL-D><CTRL-D>
652 \end_layout
654 \begin_layout Code
656 \end_layout
658 \begin_layout Code
659 pwmc:datafile> STORE
660 \end_layout
662 \begin_layout Code
663 email<TAB>isp<TAB>username<TAB>myusername<CTRL-D><CTRL-D>
664 \end_layout
666 \begin_layout Code
668 \end_layout
670 \begin_layout Code
671 pwmc:datafile> STORE
672 \end_layout
674 \begin_layout Code
675 email<TAB>isp<TAB>password<TAB>mypassword<CTRL-D><CTRL-D>
676 \end_layout
678 \begin_layout Standard
679 Now the element structure for the "email" element looks like this:
680 \end_layout
682 \begin_layout Code
683 <email>
684 \end_layout
686 \begin_layout Code
687     <isp>
688 \end_layout
690 \begin_layout Code
691         <IMAP>
692 \end_layout
694 \begin_layout Code
695               <hostname>imap.server.com</hostname>
696 \end_layout
698 \begin_layout Code
699               <port>993</port>
700 \end_layout
702 \begin_layout Code
703               <ssl>1</ssl>
704 \end_layout
706 \begin_layout Code
707         </IMAP>
708 \end_layout
710 \begin_layout Code
711         <username>myusername</username>
712 \end_layout
714 \begin_layout Code
715         <password>mypassword</password>
716 \end_layout
718 \begin_layout Code
719     </isp>
720 \end_layout
722 \begin_layout Code
723 </email>
724 \end_layout
726 \begin_layout Standard
727 If you wanted to change your password (after changing it on the mail server,
728  of course) just do as you did when initially creating the password element
729  path.
730  The new content will overwrite the existing content:
731 \end_layout
733 \begin_layout Code
734 pwmc:datafile> STORE
735 \end_layout
737 \begin_layout Code
738 email<TAB>isp<TAB>password<TAB>newpassword<CTRL-D><CTRL-D>
739 \end_layout
741 \begin_layout Code
742 pwmc:datafile>
743 \end_layout
745 \begin_layout Standard
746 An application using libpwmd that requires mail server information now has
747  the basic information it needs.
748  It may require more elements and they can be created just as these elements
749  have been.
750  The only thing left to do now is to save the changes:
751 \end_layout
753 \begin_layout Code
754 pwmc:datafile> <CTRL-D>
755 \end_layout
757 \begin_layout Standard
758 After pressing <CTRL-D> a prompt will be shown asking what to do next.
759  Press 
760 \begin_inset Quotes eld
761 \end_inset
764 \begin_inset Quotes erd
765 \end_inset
767  to save what we have created.
768  This will generate a new encryption and signing key pair by default.
769  If you would rather use an existing encryption and signing key or use symmetric
770  encryption, you will need to use the .save pwmc command along with the required
771  SAVE protocol command options.
772  The .save command lets libpwmd set some things that may be needed for the
773  current connection such as pinentry settings.
774  Type:
775 \end_layout
777 \begin_layout Code
778 pwmc:datafile> help save
779 \end_layout
781 \begin_layout Standard
782 to see SAVE syntax and options.
783 \end_layout
785 \begin_layout Standard
786 When the save has completed the encrypted data file has been written to
787  disk and is also stored in pwmd's file cache.
788  A cached document is the same document on disc that is stored in memory.
789  This means that the next time the document is opened a passphrase won't
790  be required until pwmd's cache timer removes it from the cache.
791  By default, the cache timeout for each data file is 600 seconds, or 10
792  minutes.
793  This setting can be changed in pwmd's configuration and set independently
794  for each file and can also be set to not cache the file at all or to cache
795  it indefinately.
796 \end_layout
798 \begin_layout Section
799 \begin_inset CommandInset label
800 LatexCommand label
801 name "sec:Linking-elements"
803 \end_inset
805 Linking elements
806 \end_layout
808 \begin_layout Standard
809 One distinguishing feature of pwmd is the ability to share data of one element
810  path with another.
811  If for example your ISP lets you host a blog on their server and you use
812  a blogging client that can use libpwmd for authentication details, you
813  can share authentication information with the email example above when
814  the account details are the same.
815  When element linking is used, this avoids the need to change the content
816  for both the blogging and email password elements.
817 \end_layout
819 \begin_layout Standard
820 This is done by setting a special 
821 \begin_inset Quotes eld
822 \end_inset
824 target
825 \begin_inset Quotes erd
826 \end_inset
828  attribute for an element.
829  It behaves similarly to the HTML 
830 \begin_inset Quotes eld
831 \end_inset
833 target
834 \begin_inset Quotes erd
835 \end_inset
837  attribute or XML entities or a symbolic link on a filesystem.
839 \end_layout
841 \begin_layout Standard
842 Let's create an example blogging element path:
843 \end_layout
845 \begin_layout Code
846 pwmc:datafile> STORE
847 \end_layout
849 \begin_layout Code
850 blog<TAB>isp<TAB>hostname<TAB>blog.myisp.com<CTRL-D><CTRL-D>
851 \end_layout
853 \begin_layout Code
855 \end_layout
857 \begin_layout Code
858 pwmc:datafile> ATTR SET target blog<TAB>isp<TAB>username email<TAB>isp<TAB>usern
860 \end_layout
862 \begin_layout Code
863 pwmc:datafile> ATTR SET target blog<TAB>isp<TAB>password email<TAB>isp<TAB>passw
865 \end_layout
867 \begin_layout Standard
868 Now each access of the "blog/isp/username" and "blog/isp/password" element
869  paths, which were created if they did not already exist, will point to
870  "email/isp/username" and "email/isp/password", respectively.
871  To retrieve the value or content of an element that contains a "target"
872  attribute, just use the GET command as you would for any other element:
873 \end_layout
875 \begin_layout Code
876 pwmc:datafile> GET blog<TAB>isp<TAB>password
877 \end_layout
879 \begin_layout Code
880 mypassword
881 \end_layout
883 \begin_layout Code
884 pwmc:datafile>
885 \end_layout
887 \begin_layout Standard
888 A "target" attribute may also refer to another element with a "target" attribute.
889  Every "target" attribute will be followed until there are no others to
890  resolve.
891  To get the real element path and resolve all "target" attributes, use the
892  REALPATH protocol command:
893 \end_layout
895 \begin_layout Code
896 pwmc:datafile> REALPATH blog<TAB>isp<TAB>password
897 \end_layout
899 \begin_layout Code
900 email<TAB>isp<TAB>password
901 \end_layout
903 \begin_layout Code
904 pwmc:datafile>
905 \end_layout
907 \begin_layout Standard
908 Using the LIST command is useful to show the element structure of a document:
909 \end_layout
911 \begin_layout Code
912 pwmc:datafile> LIST
913 \end_layout
915 \begin_layout Code
916 email
917 \end_layout
919 \begin_layout Code
920 blog
921 \end_layout
923 \begin_layout Code
924 pwmc:datafile> LIST email
925 \end_layout
927 \begin_layout Code
928 email
929 \end_layout
931 \begin_layout Code
932 email<TAB>isp
933 \end_layout
935 \begin_layout Code
936 email<TAB>isp<TAB>username
937 \end_layout
939 \begin_layout Code
940 email<TAB>isp<TAB>password
941 \end_layout
943 \begin_layout Code
944 email<TAB>isp<TAB>IMAP<TAB>hostname
945 \end_layout
947 \begin_layout Code
948 email<TAB>isp<TAB>IMAP<TAB>port
949 \end_layout
951 \begin_layout Code
952 email<TAB>isp<TAB>IMAP<TAB>ssl
953 \end_layout
955 \begin_layout Code
956 pwmc:datafile> LIST blog
957 \end_layout
959 \begin_layout Code
960 blog
961 \end_layout
963 \begin_layout Code
964 blog<TAB>isp
965 \end_layout
967 \begin_layout Code
968 blog<TAB>isp<TAB>hostname
969 \end_layout
971 \begin_layout Code
972 blog<TAB>isp<TAB>username
973 \end_layout
975 \begin_layout Code
976 blog<TAB>isp<TAB>password
977 \end_layout
979 \begin_layout Code
980 pwmc:datafile>
981 \end_layout
983 \end_body
984 \end_document