home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 5 Edit / 05-Edit.zip / epmpgp.zip / GCPPGPFE.zip / gcppgpfe.e < prev   
Text File  |  1995-10-22  |  78KB  |  2,012 lines

  1. /***************************************************************************
  2.  
  3.   Program:      GCPPGPFE.E Version 1.1
  4.  
  5.   Author:       John C. Frickson
  6.  
  7.   Copyright:    Copyright (c) 1994 by Gibbon Computer Products
  8.                 All rights reserved.
  9.  
  10.   Description:
  11.  
  12.         Front end for PGP (Pretty Good Privacy) MIT 2.6.x
  13.  
  14.         This E macro will build a menu containing various options for
  15.         executing PGP.  When a menu item is selected, the corresponding
  16.         command is run.
  17.  
  18.   Notes for the Security Conscious:
  19.  
  20.         Uses temporary files
  21.         Passphrase stored in memory
  22.  
  23.   Not Implemented:
  24.  
  25.         see if wipefile (-w) does any good
  26.         sign and conventionally encrypt?
  27.         the esoteric commands           ???????
  28.  
  29. r = WinMessageBox('Debug', 'Message', 16416)
  30.  
  31.  ***************************************************************************/
  32.  
  33. include 'stdconst.e'
  34.  
  35. /************
  36.   Constants
  37. ************/
  38. const
  39.    Copyright = 'GCP PGP Front-End'\10 ||
  40.                'Copyright 1994 by Gibbon Computer Products'\10 ||
  41.                'All rights reserved'\10
  42.    PGP_P  = \1'PGP operations'
  43.    ENCN_P = \1'Encryption operations'
  44.    ENCR_P = \1'Encrypt the selected text'
  45.    ENCS_P = \1'Encrypt and sign the selected text'
  46.    ENCC_P = \1'Encrypt the selected text using Conventional encryption'
  47.    INCL_P = \1'Operations to include public key or fingerprint'
  48.    IKEY_P = \1'Include public key at the current cursor position'
  49.    IFNG_P = \1'Include fingerprint at the current cursor position'
  50.    SIGN_P = \1'Sign the selected text'
  51.    DECR_P = \1'Decrypt and display the message'
  52.    CSIG_P = \1'Check for a valid signature'
  53.    DFLT_P = \1'Toggle default settings on or off'
  54.    CLPW_P = \1'Erase Password from EPM memory'
  55.    SLCT_P = \1'Select which public and secret keyrings will be used'
  56.    SELS_P = \1'Select which secret keyring to use'
  57.    SELP_P = \1'Select which public keyring to use'
  58.    VIEW_P = \1'View the contents of your keyrings'
  59.    VPRN_P = \1'View the contents of your public keyring'
  60.    VPRV_P = \1'Verbose view the contents of your public keyring'
  61.    VPRT_P = \1'View public keyring IDs, signatures, trust, and validity'
  62.    VPRF_P = \1'View fingerprints from your public keyring'
  63.    VSRN_P = \1'View the contents of your secret keyring'
  64.    VSRV_P = \1'Verbose view the contents of your secret keyring'
  65.    VSRT_P = \1'View public keyring IDs, signatures, trust, and validity'
  66.    VSRF_P = \1'View fingerprints from your secret keyring'
  67.    MGMT_P = \1'Key management operations'
  68.    KADD_P = \1'Add the currently displayed key to your public keyring'
  69.    KGEN_P = \1'Generate public/secret key pair (OS/2 Command Shell)'
  70.    KRED_P = \1'Edit your user id or secret ring passphrase (OS/2 Command Shell)'
  71.    TRST_P = \1'Edit trust parameters for a public key (OS/2 Command Shell)'
  72.    REMV_P = \1'Remove a key from your keyring (OS/2 Command Shell)'
  73.    KSGN_P = \1'Sign and certify a key on public ring (OS/2 Command Shell)'
  74.    RMSG_P = \1'Remove selected signatures from a key (OS/2 Command Shell)'
  75.    REVK_P = \1'Permantly revoke your key (OS/2 Command Shell)'
  76.    KDBL_P = \1'Enable or Disable a key on public ring (OS/2 Command Shell)'
  77.    HELP_P = \1'PGP Help operations'
  78.    PHLP_P = \1'Display the PGP Help file'
  79.    ABOT_P = \1'Display the "About" dialog'
  80.  
  81.  
  82. /*********************************
  83.   Execute this on initialization
  84. *********************************/
  85. definit
  86.    universal vTEMP_PATH                             -- Path for temporary file - Predefined
  87.    universal activemenu, defaultmenu
  88.    universal pgp_armor, pgp_textmode,
  89.              pgp_clearsig
  90.    universal sec_name, sec_keyid, sec_pswd, pub_keyid, pub_name
  91.    universal pgp_pubring, pgp_curpubring
  92.    universal pgp_secring
  93.    universal pgp_randseed, pgp_config
  94.    universal pgp_path, pgp_found
  95.    universal pgp_cmd, pgp_opts
  96.  
  97.    sec_keyid = ''
  98.    sec_name  = ''
  99.    sec_pswd = ''
  100.    pub_keyid = ''
  101.    pub_name  = ''
  102.    pgp_path = Get_Env('PGPPATH')
  103.    sec_pswd = Get_Env('PGPPASS')
  104.    pgp_found = 1
  105.    if RightStr(pgp_path,1) = '\' then
  106.       pgp_path = LeftStr(pgp_path, Length(pgp_path) - 1)
  107.     endif
  108.    pgp_cmd = 'PGP +bat +int=off +pa=cat +verb=0'
  109.    pgp_opts = '+cl -at'
  110.  
  111.    pgp_armor       = 1                  -- -a option
  112.    pgp_textmode    = 1                  -- -t option
  113.    pgp_clearsig    = 1                  -- +clearsig
  114.  
  115.    pgp_pubring     = pgp_path'\pubring.pgp'
  116.    pgp_curpubring  = pgp_path'\pubring.pgp'
  117.    pgp_secring     = pgp_path'\secring.pgp'
  118.    pgp_randseed    = pgp_path'\randseed.bin'
  119.    pgp_config      = ''
  120.  
  121.    deletemenu defaultmenu, 6, 0, 0  -- delete the existing Help menu
  122.                                     -- (we want it to stay at the right)
  123.  
  124. ; ****> Create the PGP menu
  125.  
  126.    buildsubmenu  defaultmenu,    700,      'P~GP',                              PGP_P,                  0, 0
  127.    buildmenuitem defaultmenu,    700, 710, '~Encrypt or Sign',                  ENCN_P,                17, 0
  128.       buildmenuitem defaultmenu, 700, 711, '~Encrypt Text'\9'-e',               'PGPEncr -e'ENCR_P,     0, 0
  129.       buildmenuitem defaultmenu, 700, 712, '~Sign Text'\9'-s',                  'PGPEncr -s'SIGN_P,     0, 0
  130.       buildmenuitem defaultmenu, 700, 713, 'Encrypt ~and Sign'\9'-se',          'PGPEncr -se'ENCS_P,    0, 0
  131.       buildmenuitem defaultmenu, 700, 714, '~Conventional Encryption'\9'-c',    'PGPEncr -c'ENCC_P, 32769, 0
  132.    buildmenuitem defaultmenu,    700, 720, '~Include Key or Fingerprint',       INCL_P,                17, 0
  133.       buildmenuitem defaultmenu, 700, 721, 'Include ~Public Key'\9'-kx',        'PGPIncKey x'IKEY_P,    0, 0
  134.       buildmenuitem defaultmenu, 700, 722, 'Include Key ~Fingerprint'\9'-kvc',  'PGPIncKey vc'IFNG_P,32769,0
  135.    buildmenuitem defaultmenu,    700, 729,  \0,                                 '',                     4, 0
  136.    buildmenuitem defaultmenu,    700, 730, '~Decrypt Message',                  'PGPDecr d'DECR_P,      0, 0
  137.    buildmenuitem defaultmenu,    700, 731, '~Check Signature',                  'PGPDecr c'CSIG_P,      0, 0
  138.    buildmenuitem defaultmenu,    700, 739,  \0,                                 '',                     4, 0
  139.    buildmenuitem defaultmenu,    700, 740, 'Cha~nge Defaults',                  'PGPDflt'DFLT_P,        0, 0
  140.    buildmenuitem defaultmenu,    700, 741, 'Clear ~Password',                   'PGPClrPw'CLPW_P,       0, 0
  141.    buildmenuitem defaultmenu,    700, 750, 'Select ~Keyrings',                  SLCT_P,                17, 0
  142.       buildmenuitem defaultmenu, 700, 751, '~Secret Keyring',                   'PGPRing s'SELS_P,      0, 0
  143.       buildmenuitem defaultmenu, 700, 752, '~Public Keyring',                   'PGPRing p'SELP_P,  32769, 0
  144.    buildmenuitem defaultmenu,    700, 759,  \0,                                 '',                     4, 0
  145.    buildmenuitem defaultmenu,    700, 760, '~View Keyring',                     VIEW_P,                17, 0
  146.       buildmenuitem defaultmenu, 700, 761, 'Pubring ~Normal'\9'-kv',            'PGPKV p v'VPRN_P,      0, 0
  147.       buildmenuitem defaultmenu, 700, 762, 'Pubring ~Verbose'\9'-kvv',          'PGPKV p vv'VPRV_P,     0, 0
  148.       buildmenuitem defaultmenu, 700, 763, 'Pubring ~Trust/Validity'\9'-kc',    'PGPKV p c'VPRT_P,      0, 0
  149.       buildmenuitem defaultmenu, 700, 764, 'Pubring ~Fingerprint'\9'-kvc',      'PGPKV p vc'VPRF_P,     0, 0
  150.       buildmenuitem defaultmenu, 700, 765, 'Secring Nor~mal'\9'-kv',            'PGPKV s v'VSRN_P,      0, 0
  151.       buildmenuitem defaultmenu, 700, 766, 'Secring Ver~bose'\9'-kvv',          'PGPKV s vv'VSRV_P,     0, 0
  152.       buildmenuitem defaultmenu, 700, 767, 'Secring Fing~erprint'\9'-kvc',      'PGPKV s vc'VSRF_P, 32769, 0
  153.    buildmenuitem defaultmenu,    700, 770, 'Key ~Management',                   MGMT_P,                17, 0
  154.       buildmenuitem defaultmenu, 700, 771, '~Add Key to Pubring'\9'-ka',        'PGPAddKey a'KADD_P,    0, 0
  155.       buildmenuitem defaultmenu, 700, 772, '(S) ~Generate a Key'\9'-kg',        'PGPKMgt s g'KGEN_P,    0, 0
  156.       buildmenuitem defaultmenu, 700, 773, '(S) ~Edit UserID or Passphrase'\9'-ke','PGPKMgt s e'KRED_P, 0, 0
  157.       buildmenuitem defaultmenu, 700, 774, '(S) Edit ~Trust Parameters'\9'-ke', 'PGPKMgt p e'TRST_P,    0, 0
  158.       buildmenuitem defaultmenu, 700, 775, '(S) ~Remove a Key'\9'-kr',          'PGPKMgt p r'REMV_P,    0, 0
  159.       buildmenuitem defaultmenu, 700, 776, '(S) ~Sign and certify a Key'\9'-ks','PGPKMgt p s'KSGN_P,    0, 0
  160.       buildmenuitem defaultmenu, 700, 777, '(S) Re~move signatures'\9'-krs',    'PGPKMgt p rs'RMSG_P,   0, 0
  161.       buildmenuitem defaultmenu, 700, 778, '(S) Revo~ke your key'\9'-kd',       'PGPKMgt s d'REVK_P,    0, 0
  162.       buildmenuitem defaultmenu, 700, 779, '(S) ~Disable/enable a key'\9'-kd',  'PGPKMgt p d'KDBL_P,32769, 0
  163.    buildmenuitem defaultmenu,    700, 780,  \0,                                 '',                     4, 0
  164.    buildmenuitem defaultmenu,    700, 781, '~Help',                              HELP_P,               17, 0
  165.       buildmenuitem defaultmenu, 700, 782, 'PGP ~Help',                         'PGPHelp'PHLP_P,        0, 0
  166.       buildmenuitem defaultmenu, 700, 783, '~About...',                         'PGPAbout'ABOT_P,   32769, 0
  167.  
  168.    call readd_help_menu()           -- Add the Help menu back in
  169.  
  170.    showmenu defaultmenu             -- Ta da!
  171.  
  172.  
  173. /************************
  174.   Display PGP Help (-h)
  175. ************************/
  176. defc PGPHelp=
  177.    if pgp_checkrings() = 0 then
  178.       return
  179.    endif
  180.    sayerror 'Getting help.  Please wait...'  -- Information message
  181.    refresh                                   -- Make sure the message is displayed
  182.    r = pgp_redirect('-h')               -- pass commands to routine the does the work
  183.    if r = 'ERROR' then
  184.       return
  185.    endif
  186.    .filename='/PGP Help/'                    -- change the title line
  187.    if .last=0 then                           -- if the output window
  188.       'q'                                    --    has no lines, then quit
  189.       sayerror 'Unable to display help!'     --    and give a message
  190.    endif
  191.  
  192.  
  193. /***************************
  194.   Display the About dialog
  195. ***************************/
  196. defc PGPAbout=
  197.  
  198.    r = WinMessageBox('About Gibbon PGP Front End v1.1',
  199.                         'Copyright (c) 1994 by ' ||
  200.                         'Gibbon Computer Products'\10 ||
  201.                         'All rights reserved'\10\10 ||
  202.                         'Gibbon PGP Front End v1.1'\10 ||
  203.                         'EPM, Lamail, and NR/2 interface '||
  204.                         'to MIT PGP Version 2.6.x.  See the ' ||
  205.                         'README for more information.'\10\10 ||
  206.                         'John C. Frickson <frickson@gibbon.com>', 16432)
  207. ; MB_OK           = 0
  208. ; MB_ICONASTERISK = 48
  209. ; MB_INFORMATION  = MB_ICONASTERISK
  210. ; MB_MOVEABLE     = 16384
  211.    x = pgp_checkrings()
  212.  
  213.  
  214. /******************************************************************************
  215.   View either public or secret keyring, normal (-kv) or verbose (-kvv) or
  216.   trust/validity (-kc) or fingerprints (-kvc)
  217. ******************************************************************************/
  218. defc PGPKV=
  219.    universal pgp_curpubring, pgp_secring
  220.  
  221.    arg1 = Word(arg(1),1)
  222.    arg2 = Word(arg(1),2)
  223.  
  224.    switch = '-k'arg2
  225.  
  226.    if pgp_checkrings() = 0 then
  227.       return
  228.    endif
  229.  
  230. --   if arg2 = 'c' then
  231. --      user = ''
  232. --   else
  233.    user = EntryBox('Enter user id, key id or "*" for all', '', '*', 30, 128)
  234.    if user = '' then
  235.       Return
  236.    endif
  237.    if LeftStr(user,1) <> '"' then
  238.       user = '"' || user || '"'
  239.    endif
  240.  
  241.    sayerror 'Getting Keyring Information.  Please wait...'  -- Information message
  242.    refresh                                   -- Make sure the message is displayed
  243.  
  244.    if arg1 = 'p' then
  245.       pubsec = 'Public'
  246.       r = pgp_redirect(switch user pgp_curpubring)  -- pass commands to routine the does the work
  247.       if r = 'ERROR' then
  248.          return
  249.       endif
  250.    else
  251.       pubsec = 'Secret'
  252.       r = pgp_redirect(switch user pgp_secring)  -- pass commands to routine the does the work
  253.       if r = 'ERROR' then
  254.          return
  255.       endif
  256.    endif
  257.  
  258.    If arg2 = 'vv' then
  259.       temp = '/Verbose'
  260.    elseif arg2 = 'vc' then
  261.       temp = '/Fingerprint'
  262.    elseif arg2 = 'c' then
  263.       temp = '/Trust and Validity'
  264.    else
  265.       temp = '/Normal'
  266.    endif
  267.  
  268.    .filename=temp 'Listing of' pubsec 'Keyring/'      -- change the title line
  269.    if .last=0 then                           -- if the output window
  270.       'q'                                    --    has no lines, then quit
  271.       sayerror 'Unable to view keyring!'     --    and give a message
  272.    endif
  273.  
  274.  
  275. /***********************************************
  276.   Select which public or secret keyring to use
  277. ***********************************************/
  278. defc PGPRing=
  279.    universal pgp_curpubring, pgp_secring
  280.  
  281.    message = 'Changing public or secret keyrings will ' ||
  282.              'NOT change which keyrings are used for '  ||
  283.              'encryption.  This is only for key '       ||
  284.              'management and viewing purposes!'
  285.    r = WinMessageBox('Gibbon PGP Front End', message, 16432)
  286. ;                                      MB_INFORMATION = 48
  287. ;                                      MB_MOVEABLE    = 16384
  288.  
  289.    if arg(1) = 'p' then
  290.       temp1 = pgp_curpubring
  291.       temp2 = 'Public'
  292.    else
  293.       temp1 = pgp_secring
  294.       temp2 = 'Secret'
  295.    endif
  296.  
  297.    kr = EntryBox('Enter' temp2 'Keyring Filename', '/~OK/~Cancel', temp1, 30, 128)
  298.    if kr <> '' then
  299.       if pgp_checkrings() = 0 then
  300.          return
  301.       endif
  302.       if arg(1) = 'p' then
  303.          pgp_curpubring = kr
  304.       else
  305.          pgp_secring = kr
  306.       endif
  307.       if pgp_checkrings() = 0 then
  308.          if arg(1) = 'p' then
  309.             pgp_curpubring = temp1
  310.          else
  311.             pgp_secring = temp1
  312.          endif
  313.          return
  314.       endif
  315.       if arg(1) = 's' then
  316.          pgp_get_sec_id()
  317.       endif
  318.       sayerror temp2 'Keyring is now:' kr
  319.    endif
  320.  
  321.  
  322. /************************************************************
  323.   Put up a listbox that allows toggling of default settings
  324. ************************************************************/
  325. defc PGPDflt=
  326.  
  327.    universal pgp_armor, pgp_textmode,
  328.              pgp_clearsig
  329.    universal pgp_cmd, pgp_opts
  330.  
  331.    if pgp_checkrings() = 0 then
  332.       return
  333.    endif
  334.  
  335.    message = 'By default, Gibbon PGP Front End turns on ' ||
  336.              'Armor, Textmode and Clearsig.  If you '     ||
  337.              'toggle these options OFF, the defaults '    ||
  338.              'from your CONFIG.TXT file will be used.'    ||
  339.              \10\10'This may not mean these options are ' ||
  340.              'OFF!  Check your CONFIG.TXT for the '       ||
  341.              'default status.'
  342.    r = WinMessageBox('Gibbon PGP Front End', message, 16432)
  343. ;                                      MB_INFORMATION = 48
  344. ;                                      MB_MOVEABLE    = 16384
  345.  
  346.    one = atoi(1)
  347.    zero = atoi(0)
  348.  
  349.    tpgp_armor       = pgp_armor
  350.    tpgp_textmode    = pgp_textmode
  351.    tpgp_clearsig    = pgp_clearsig
  352.  
  353.    Do Forever
  354.  
  355.       if tpgp_armor then
  356.          pgpoptn = '^ASCII Armor (-a) is ON'
  357.       else
  358.          pgpoptn = '^ASCII Armor (-a) is OFF'
  359.       endif
  360.       if tpgp_textmode then
  361.          pgpoptn = pgpoptn || '^Text mode (-t) is ON'
  362.       else
  363.          pgpoptn = pgpoptn || '^Text mode (-t) is OFF'
  364.       endif
  365.       if tpgp_clearsig then
  366.          pgpoptn = pgpoptn || '^Clear sig (+clearsig) is ON'
  367.       else
  368.          pgpoptn = pgpoptn || '^Clear sig (+clearsig) is OFF'
  369.       endif
  370.  
  371.       parse value listbox('Gibbon PGP Processing Defaults',
  372.                            pgpoptn,
  373.                           '/~OK/~Cancel/~Toggle',
  374.                           0, 0, 3, 40,
  375.                           compile if EVERSION >= 5.60 --gethwndc(APP_HANDLE)
  376.                              zero || zero || one || one || zero ||
  377.                           compile else                --gethwndc(APP_HANDLE)
  378.                              one || one || zero || zero || zero ||
  379.                           compile endif
  380.                           'Toggle Options On or Off -- CAREFULLY!!') with button 2 text \0
  381.  
  382.       btn = itoa(button || \0, 10)
  383.  
  384.       if btn < '3' then
  385.          leave
  386.       endif
  387.  
  388.       test = Word(text,1) || Word(text,Words(text))
  389.  
  390.       if test = 'ASCIION' then
  391.          tpgp_armor = 0
  392.       elseif test = 'ASCIIOFF' then
  393.          tpgp_armor = 1
  394.       elseif test = 'TextON' then
  395.          tpgp_textmode = 0
  396.       elseif test = 'TextOFF' then
  397.          tpgp_textmode = 1
  398.       elseif test = 'ClearON' then
  399.          tpgp_clearsig = 0
  400.       elseif test = 'ClearOFF' then
  401.          tpgp_clearsig = 1
  402.       endif
  403.  
  404.    EndDo
  405.  
  406.    if btn = '1' then
  407.       pgp_armor       = tpgp_armor
  408.       pgp_textmode    = tpgp_textmode
  409.       pgp_clearsig    = tpgp_clearsig
  410.       if pgp_clearsig then
  411.          pgp_opts = '+cl'
  412.       else
  413.          pgp_opts = '+cl=off'
  414.       endif
  415.       if pgp_armor then
  416.          pgp_opts = pgp_opts '-a'
  417.       endif
  418.       if pgp_textmode then
  419.          if pgp_armor then
  420.             pgp_opts = pgp_opts || 't'
  421.          else
  422.             pgp_opts = pgp_opts '-t'
  423.          endif
  424.       endif
  425.    endif
  426.  
  427.  
  428. /***************************************
  429.    Clear Password from memory
  430. ***************************************/
  431. defc PGPClrPW=
  432.    universal sec_name, sec_pswd
  433.    sec_name = ''
  434.    sec_pswd = ''
  435.    message = 'Password has been cleared from memory'
  436.    r = WinMessageBox('Gibbon PGP Front End', message, 16432)
  437. ;                                      MB_INFORMATION = 48
  438. ;                                      MB_MOVEABLE    = 16384
  439.  
  440.  
  441. /****************************************************
  442.   Include public key or fingerprint in message text
  443.   arg   vc  fingerprint
  444.         x   public key
  445. ****************************************************/
  446. defc PGPIncKey=
  447.    universal pgp_curpubring, pgp_secring
  448.    universal sec_name, pub_keyid, pub_name
  449.    universal pgp_cmd, pgp_opts
  450.  
  451.    if pgp_checkrings() = 0 then
  452.       return
  453.    endif
  454.  
  455.    switch = '-k'arg(1)
  456.  
  457. /* select public key */
  458.    pgp_get_pub_id(0)
  459.    if pub_keyid = '' then
  460.       return
  461.    endif
  462.  
  463.    sayerror 'Getting Keyring Information.  Please wait...'  -- Information message
  464.    refresh                                   -- Make sure the message is displayed
  465.  
  466.    Display -3                                -- turn off display updates and error messages
  467.    GetFileID msgFileID                       -- get fileid of current message
  468.  
  469.    r = pgp_redirect(pgp_opts switch pub_keyid pgp_curpubring)
  470.    if r = 'ERROR' then
  471.       Display 3                              -- enable display updates and messages
  472.       return
  473.    endif
  474.    GetFileID tempFileID                    -- get fileid of processed text file
  475.  
  476. /* Here we parse stderr looking for errors and warnings */
  477.    lastline = .last
  478.    Do line = 1 to lastline
  479.       GetLine viewline, line, tempFileID
  480.       if rc < 0 then
  481.          Display 3                           -- enable display updates and messages
  482.          sayerror 'unexpected EOF during parse of stderr'
  483.          Return
  484.       endif
  485.  
  486. -- handle case of unknown error, we search for the error flag \007
  487.       if Pos('', viewline) > 0 then
  488.          message = viewline
  489.          'q'                               -- leave stderr
  490.          ActivateFile msgFileID            -- activate the original file
  491.          Display 3                         -- enable display updates and messages
  492.          refresh
  493.          r = WinMessageBox('Gibbon PGP Front End', message, 16432)
  494. ;                                            MB_INFORMATION = 48
  495. ;                                            MB_MOVEABLE    = 16384
  496.          Return
  497.  
  498. -- else, get next line of stderr
  499.       else
  500.          iterate
  501.       endif
  502.    EndDo /* getline */
  503.  
  504. -- Normally we exit this way if no errors found in stderr
  505.  
  506.    if .last=0 then                           -- if the output window
  507.       'q'                                    --    has no lines, then quit
  508.       Display 3                              --    enable display updates and messages
  509.       sayerror 'PGP returned nothing for the selected key!'  --    and give a message
  510.       Return
  511.    endif
  512.  
  513.    ActivateFile msgFileID                    -- activate the original file
  514.    EndLine                                   -- Go to the end of the line
  515.    Split                                     -- Start a new line
  516.    Down                                      -- Move down one line
  517.  
  518.    copyflag = 0
  519.  
  520.    do lnum = 1 to tempFileID.last            -- Copy the lines from the temp file
  521.       Getline xferline, lnum, tempFileID     --    output from PGP command
  522.       if LeftStr(xferline,10) = '-----BEGIN' then
  523.          copyflag = 1
  524.       endif
  525.       if copyflag then
  526.          InsertLine xferline                 --  into the current file
  527.       endif
  528.       if LeftStr(xferline,10) = 'Type bits/' then
  529.          InsertLine xferline                 --  into the current file
  530.       endif
  531.       if LeftStr(xferline,4) = 'pub ' then
  532.          InsertLine xferline                 --  into the current file
  533.       endif
  534.       if Pos('Key fingerprint', xferline) > 0 then
  535.          xferline = strip(xferline)      --  strip off leading spaces
  536.          InsertLine xferline                 --  into the current file
  537.       endif
  538.       if LeftStr(xferline,8) = '-----END' then
  539.          copyflag = 0
  540.       endif
  541.    EndDo
  542.  
  543.    ActivateFile tempFileID                   -- activate the temp file
  544.    'q'                                       -- quit the file
  545.    ActivateFile msgFileID                    -- activate the original file
  546.    display 3                                 -- turn updates & messages on
  547.    refresh
  548.  
  549.    message = 'Inserted'
  550.    if arg(1) = 'vc' then
  551.       message = message 'fingerprint'
  552.    else
  553.       message = message 'public key'
  554.    endif
  555.    message = message ' for' pub_name
  556.    r = WinMessageBox('Gibbon PGP Front End', message, 16432)
  557. ;                                      MB_INFORMATION = 48
  558. ;                                      MB_MOVEABLE    = 16384
  559.  
  560.  
  561. /************************************
  562.   Encrypt or Sign the selected text
  563.   -s sign
  564.   -e encrypt
  565.   -se sign and encrypt
  566.   -c conventional encrypt
  567. ************************************/
  568. defc PGPEncr=
  569.    universal vTEMP_PATH
  570.    universal pgp_pubring, pgp_secring
  571.    universal pgp_armor, pgp_textmode,
  572.              pgp_clearsig
  573.    universal sec_name, sec_keyid, sec_pswd, pub_keyid, pub_name
  574.    universal pgp_opts
  575.  
  576.    if pgp_checkrings() = 0 then
  577.       return
  578.    endif
  579.  
  580.    bad_pswd = 0
  581.  
  582.    switch = arg(1)
  583.  
  584.    if switch = '-s' then
  585.       function = 'Sign'
  586.    else
  587.       function = 'Encrypt'
  588.    endif
  589.    message = function'ing in progress -- Please wait...'
  590.  
  591. -- check if user marked text to encrypt/sign
  592.    PSAVE_MARK(savemark)
  593.    parse value savemark with firstl lastl firstc lastc fileid marktyp
  594.    SETMARK firstl, lastl, 1, LongestLine(), 1, fileid
  595.  
  596.    if (marktyp = '') then
  597.       r = WinMessageBox('Gibbon PGP Front End',
  598.                         'I can''t' function 'anything without knowing what ' ||
  599.                         'to' function'.  Please mark the appropriate text.', 16416)
  600. ;                                                                MB_CUAWARNING = 32
  601. ;                                                                MB_MOVEABLE   = 16384
  602.       return
  603.    endif
  604.  
  605.    if (.line = 0) then
  606.       .line = 1
  607.    endif
  608.  
  609. -- get secret key if signing
  610.    if Pos('s', switch) > 0 then
  611.       -- Always get the secret key id (changed from v1.0) --
  612.       pgp_get_sec_id()            -- sets global variables sec_keyid and sec_name
  613.       if sec_keyid = '' then      -- make sure didn't fail
  614.          return
  615.       endif
  616.    endif
  617.  
  618. -- get public key if encrypting
  619.    if Pos('e', switch) > 0 then
  620.       pgp_get_pub_id(1)           -- sets global variables pub_keyid and pub_name
  621.       if pub_keyid = '' then      -- make sure didn't fail
  622.          return
  623.       endif
  624.    endif
  625.  
  626. -- check for a revoked key
  627.    if pub_name = '*** KEY REVOKED ***' then
  628.       message = 'Key ID:' pub_keyid || \10\10
  629.       message = message || 'This key has been *REVOKED*' || \10
  630.       message = message || 'so you can not use this key!'
  631.       r = WinMessageBox('Gibbon PGP Front End', message, 16416)
  632. ;                                        MB_CUAWARNING = 32
  633. ;                                        MB_MOVEABLE   = 16384
  634.       return
  635.    endif
  636.  
  637. -- get passphrase if signing
  638.    if Pos('s', switch) > 0 then
  639.       if sec_pswd = '' then
  640. compile if EVERSION > 6.01
  641.          pass = EntryBox('Enter your passphrase', '/OK/Cancel', '', 30, 1024, '', 140)
  642. compile else
  643.          pass = EntryBox('Enter your passphrase', '/OK/Cancel', '', 30, 1024)
  644. compile endif
  645.          if pass = '' then
  646.             Return
  647.          endif
  648.          sec_pswd = pass
  649.       endif
  650.    endif
  651.  
  652. -- get passphrase if encrypting conventionally
  653.    if switch = '-c' then
  654. compile if EVERSION > 6.01
  655.       pgp_convpswd = EntryBox('Enter passphrase for conventional encryption',
  656.                             '/~OK/~Cancel', '', 30, 1024, '', 140)
  657. compile else
  658.       pgp_convpswd = EntryBox('Enter passphrase for conventional encryption',
  659.                             '/~OK/~Cancel', '', 30, 1024)
  660. compile endif
  661.       if pgp_convpswd = '' then
  662.          Return
  663.       endif
  664.     endif
  665.  
  666.    sayerror message
  667.  
  668.    Display -3                              -- turn off display updates and error messages
  669.    GetFileID msgFileID                     -- get fileid of current message
  670.    save_modify = msgFileID.modify          -- save the modified flag
  671.    outfile=vTEMP_PATH || 'pgpfe.out'       -- Build the file name for the temp file
  672.    call erasetemp(outfile)                 -- clear out any leftover temp file
  673.    'e' outfile                             -- open it
  674.    MoveMark                                -- move the marked text to the outfile window
  675.    's'                                     -- save the temporary file
  676.    GetFileID outFileID
  677.  
  678.    sayerror message
  679.  
  680. -- switch can have values -e -se -s -c (encrypt, sign&encrypt, sign, conventional)
  681.    cmdline = switch
  682.    if Pos('c', switch) > 0 then
  683.       cmdline = cmdline '-z"'pgp_convpswd'" '
  684.    endif
  685.    if Pos('s', switch) > 0 then
  686.       cmdline = cmdline '-z"'sec_pswd'" '
  687.    endif
  688.    if Pos('e', switch) > 0 then
  689.       cmdline = cmdline  pub_keyid || ' '
  690.    endif
  691.    if Pos('s', switch) > 0 then
  692.       cmdline = cmdline || '-u 'sec_keyid' '
  693.    endif
  694.  
  695.    cmdline = cmdline || '<' outfile
  696.  
  697.    r = pgp_redirect(pgp_opts cmdline)
  698.    call erasetemp(outfile)                 -- and delete the temp file
  699.  
  700.    sayerror 'Processing complete.'
  701.  
  702.    if r = 'ERROR' then
  703.       UnMark
  704.       ActivateFile outFileID
  705.       SETMARK 1, .last, 1, LongestLine(), 1, outFileID
  706.       ActivateFile msgFileID               -- activate the original file
  707.       CopyMark                             -- restore the moved text
  708.       ActivateFile outFileID
  709.       'q'                                  -- quit the file
  710.       ActivateFile msgFileID               -- activate the original file
  711.       Display 3                            -- enable display updates and messages
  712.       refresh
  713.       return
  714.    endif
  715.  
  716.    GetFileID tempFileID                    -- get fileid of processed text file
  717.    lastline = .last
  718.    ActivateFile msgFileID                  -- activate the original file
  719.  
  720.    copyflag = 0
  721.    copied = 0
  722.  
  723. -- this routine copies message portion of stdout to original message file
  724.    Do line = 1 to lastline
  725.       GetLine xferline, line, tempFileID
  726.       if LeftStr(xferline,10) = '-----BEGIN' then
  727.          copyflag = 1
  728.       endif
  729.       if copyflag then
  730.          InsertLine xferline
  731.          copied = 1
  732.       endif
  733.       if LeftStr(xferline,8) = '-----END' then
  734.          copyflag = 0
  735.       endif
  736.    End
  737.  
  738. -- if message was not copied from stdout file, then something bad happened,
  739. -- most likely a bad passphrase was given
  740. -- first thing we do is restore message file back to original condition
  741.    if copied = 0 then
  742.       UnMark
  743.       ActivateFile outFileID
  744.       SETMARK 1, .last, 1, LongestLine(), 1, outFileID
  745.       ActivateFile msgFileID               -- activate the original file
  746.       CopyMark                             -- restore the text
  747.       msgFileID.modify = save_modify       -- reset modified flag
  748.    end
  749.  
  750.    ActivateFile outFileID
  751.    'q'                                     -- quit the file
  752.    ActivateFile msgFileID                  -- activate the original file
  753.    Unmark
  754.  
  755.    Display 3                               -- enable display updates and messages
  756.    refresh
  757.  
  758. -- summarize what was accomplished...
  759. -- if copied=0 then some error occurred
  760.    if copied = 0 then
  761.       errlineno = 2
  762.       GetLine errorline, errlineno, tempFileID
  763.       chkline = UpCase(errorline)
  764.       if Pos('ERROR',chkline) then
  765.          message = 'PGP Detected an error while attempting ' ||
  766.                    'to encrypt or sign this message.  The '  ||
  767.                    'error message is:'\10\10
  768.          While Length(errorline) > 3 Do
  769.             if LeftStr(errorline,1) = \7 then
  770.                errorline = RightStr(errorline, Length(errorline) - 1)
  771.             endif
  772.             if LeftStr(errorline,24) = "Error:  Bad pass phrase." then
  773.                sec_pswd = ''
  774.                bad_pswd = 1
  775.             endif
  776.             message = message || errorline || \10
  777.             errlineno = errlineno + 1
  778.             if errlineno > tempFileID.last then
  779.                Leave
  780.             endif
  781.             GetLine errorline, errlineno, tempFileID
  782.          EndWhile
  783.  
  784.       else
  785.          message = 'The requested action was not performed, and ' ||
  786.                    'the reason is unknown.  Make sure you are '   ||
  787.                    'executing an OS/2 version of PGP, that your ' ||
  788.                    'PATH/PGPPATH are correct, and your keyrings ' ||
  789.                    'are valid.  If you can''t figure out the '    ||
  790.                    'problem, contact frickson@gibbon.com.'
  791.       endif
  792.  -- copied != 0 so pgp was successful at something
  793.    else
  794.       message = 'This message has been'
  795.       if Pos('s', switch) > 0 then
  796.          if Pos('e', switch) then
  797.             message = message || \10
  798.          endif
  799.          message = message 'signed by' sec_name
  800.       endif
  801.       if Pos('e', switch) then
  802.          if Pos('s', switch) > 0 then
  803.             message = message || \10\10'and'
  804.          endif
  805.          message = message 'encrypted using the public key for' pub_name
  806.       endif
  807.       if switch = '-c' then
  808.          message = message \10'conventionally encrypted.'
  809.       endif
  810.    endif
  811.    ActivateFile tempFileID                 -- activate the temporary file
  812.    'q'                                     -- quit the file
  813.    ActivateFile msgFileID                  -- activate the original file
  814.    refresh
  815.    if bad_pswd then
  816.       message = message || \10\10 || 'Please try again.'
  817.    endif
  818.    r = WinMessageBox('Gibbon PGP Front End', message, 16432)
  819. ;                                      MB_INFORMATION = 48
  820. ;                                      MB_MOVEABLE    = 16384
  821.  
  822.  
  823. /***************************************
  824.   Decrypt message or check a signature
  825.     -c  check signature
  826.     -d  decrypt
  827. ***************************************/
  828. defc PGPDecr=
  829.    universal vTEMP_PATH
  830.    universal pgp_pubring, pgp_secring
  831.    universal pgp_armor, pgp_textmode,
  832.              pgp_clearsig
  833.    universal sec_name, sec_keyid, sec_pswd
  834.  
  835.    if pgp_checkrings() = 0 then
  836.       return
  837.    endif
  838.  
  839.    needconvpswd = 0
  840.    needpswd = 0
  841.  
  842.    Display -3                              -- turn off display updates and error messages
  843.  
  844.    Do Forever
  845.  
  846.       -- This would only happen on the 2nd go-around (or 3rd...) and
  847.       -- would happen because the message being decrypted was conventionally
  848.       -- encrypted and needs a pass phrase, or because the message was
  849.       -- encrypted with a public key.  On the 3rd+ time, it would be
  850.       -- needed because an incorrect pass phrase was entered.
  851.  
  852.       if needconvpswd then
  853. compile if EVERSION > 6.01
  854.          pgp_convpswd = EntryBox('Enter passphrase for conventional encryption',
  855.                                '/~OK/~Cancel', '', 30, 1024, '', 140)
  856. compile else
  857.          pgp_convpswd = EntryBox('Enter passphrase for conventional encryption',
  858.                                '/~OK/~Cancel', '', 30, 1024)
  859. compile endif
  860.          if pgp_convpswd = '' then
  861.             Display 3                      -- enable display updates and messages
  862.             Return
  863.          endif
  864.       endif
  865.  
  866.       if needpswd then
  867.          if sec_pswd = '' then
  868. compile if EVERSION > 6.01
  869.             pass = EntryBox('Enter your passphrase', '/OK/Cancel', '',
  870.                             30, 1024, '', 140)
  871. compile else
  872.             pass = EntryBox('Enter your passphrase', '/OK/Cancel', '', 30, 1024)
  873. compile endif
  874.             if pass = '' then
  875.                Display 3                      -- enable display updates and messages
  876.                Return
  877.             endif
  878.             sec_pswd = pass
  879.          endif
  880.       endif
  881.  
  882.       GetFileID msgFileID                     -- get fileid of current message
  883.  
  884.       SETMARK 1, .last, 1, LongestLine(), 1, msgFileID  -- Mark the whole message
  885.  
  886.       outfile=vTEMP_PATH || 'pgpfe.out'       -- Build the file name for the temp file
  887.       'e' outfile                             -- open it
  888.       CopyMark                                -- copy the marked text to the outfile window
  889.       's'                                     -- save the temporary file
  890.       'q'                                     -- exit the temporary window
  891.       sayerror 'Processing in progress...'
  892.  
  893. -- conventional decryption
  894.       if needconvpswd then
  895.          cmdline = '-z"'pgp_convpswd'" <' outfile
  896. -- public key decryption
  897.       elseif needpswd then
  898.          cmdline = '-z"'sec_pswd'" <' outfile
  899. -- signature check
  900.       else
  901.          cmdline = ' <' outfile
  902.       endif
  903.  
  904. -- option -t for textmode files
  905.       r = pgp_redirect('-t' cmdline)         -- pass commands to routine that does the work
  906.       sayerror 'Processing complete.'
  907.       call erasetemp(outfile)                 -- and delete the temp file
  908.       if r = 'ERROR' then
  909.          ActivateFile msgFileID               -- activate the original file
  910.          Display 3                            -- enable display updates and messages
  911.          return
  912.       endif
  913.       GetFileID tempFileID                    -- get fileid of processed text file
  914.  
  915.       .filename='/Unencrypted Message/'       -- change the title line
  916.       GetLine viewline, 2, tempFileID         -- get line 2 (error or 'good sig' message)
  917.  
  918. /* Here we are looking for success, or errors and warnings
  919.    The types of information we look for are as follows...
  920.  
  921.   1) good signature:
  922.      'Good signature from user'
  923.   2) Can't check signature cause we don't have the key
  924.      'Key matching expected Key ID'
  925.   3) encrypted so passphrase needed
  926.      'You need a pass phrase to unlock your RSA secret key.'
  927.   4) bad pass phrase
  928.      'Error:  Bad pass phrase." then
  929.   5) missing secret key to decrypt
  930.      ' You do not have the secret key'
  931.   6) bad signature:
  932.      'Bad signature from user '
  933.   7) damaged file:
  934.      'Error: Transport armor stripping failed'
  935.   8) Unknown error decrypting file:
  936.      'Error:'
  937. */
  938.  
  939. -- handle case of good signature
  940.       if LeftStr(viewline,24) = 'Good signature from user' then
  941.          message = viewline
  942.          GetLine viewline, 3, tempFileID
  943.          message = message || \10viewline
  944.          if arg(1) = 'c' then                 -- if we're only checking the sig
  945.             'q'                               -- leave the file
  946.             ActivateFile msgFileID            -- activate the original file
  947.          endif
  948.          if arg(1) <> 'c' then                -- if we're not only checking the sig
  949.             Do line = 1 to 3
  950.                DeleteLine 1, tempFileID
  951.             End
  952.             tempFileID.modify = 0             -- reset the modified flag
  953.          endif
  954.          Display 3                            -- enable display updates and messages
  955.          refresh
  956.          r = WinMessageBox('Gibbon PGP Front End', message, 16432)
  957. ;                                            MB_INFORMATION = 48
  958. ;                                            MB_MOVEABLE    = 16384
  959.          Return
  960.  
  961. -- handle case of not having key to check for valid signature
  962.       elseif LeftStr(viewline, 29) = 'Key matching expected Key ID' then
  963.          message = RightStr(viewline, Length(viewline) - 1)
  964.          GetLine viewline, 6, tempFileID
  965.          Do line = 1 to 6
  966.             DeleteLine 1, tempFileID
  967.          End
  968.          tempFileID.Modify = 0                -- reset the modified flag
  969.          message = message || \10\10viewline
  970.          if arg(1) = 'c' then                 -- if we're only checking the sig
  971.             'q'                               -- leave the file
  972.             ActivateFile msgFileID            -- activate the original file
  973.          endif
  974.          r = WinMessageBox('Gibbon PGP Front End', message, 16416)
  975. ;                                            MB_CUAWARNING = 32
  976. ;                                            MB_MOVEABLE   = 16384
  977.          Display 3                            -- enable display updates and messages
  978.          Return
  979.  
  980. -- handle case of needing a passphrase to continue
  981. -- (this will be the case for any encrypted file)
  982.       elseif LeftStr(viewline,22) = 'You need a pass phrase' then
  983.          'q'                                  -- leave the file
  984.          ActivateFile msgFileID               -- activate the original file
  985.          if needconvpswd then
  986.             message = 'Apparently, the pass phrase you entered ' ||
  987.                       'didn''t work.'
  988.          else
  989.             message = 'This is a conventionally encrypted file.  ' ||
  990.                       'A pass phrase must be entered to decrypt '  ||
  991.                       'it.'
  992.          endif
  993.          message = message ||
  994.                    \10\10'Enter the pass phrase in the next '   ||
  995.                    'dialog, or press the Cancel button if you ' ||
  996.                    'don''t want to try to decrypt the file.'
  997.  
  998.          r = WinMessageBox('Gibbon PGP Front End', message, 16416)
  999. ;                                           MB_CUAWARNING = 32
  1000. ;                                           MB_MOVEABLE   = 16384
  1001.          needconvpswd = 1
  1002.  
  1003. -- handle the case of a bad pass phrase
  1004.       elseif LeftStr(viewline,25) = "Error:  Bad pass phrase." then
  1005.          'q'                                  -- leave the file
  1006.          ActivateFile msgFileID               -- activate the original file
  1007.          if needpswd then
  1008.             message = 'Apparently, the pass phrase you entered didn''t work.' ||
  1009.                       \10\10'Enter the pass phrase in the next '   ||
  1010.                       'dialog, or press the Cancel button if you ' ||
  1011.                       'don''t want to try to decrypt the file.'
  1012.  
  1013.             r = WinMessageBox('Gibbon PGP Front End', message, 16416)
  1014. ;                                              MB_CUAWARNING = 32
  1015. ;                                              MB_MOVEABLE   = 16384
  1016.             sec_pswd = ''
  1017.          endif
  1018.          needpswd = 1
  1019.  
  1020. -- handle case of not having the necessary secret key to decrypt
  1021. --      elseif LeftStr(viewline,31) = 'You do not have the secret key' then
  1022.       elseif LeftStr(viewline,33) = 'This message can only be read by:' then
  1023. --         message = 'ERROR: You do not have the secret key needed to decrypt this file.'
  1024.          GetLine vl2, 3, tempFileID
  1025.          message = viewline || vl2
  1026.          GetLine vl2, 5, tempFileID
  1027.          message = message || \10\10 || vl2
  1028.          'q'                                  -- leave the file
  1029.          ActivateFile msgFileID               -- activate the original file
  1030.          Display 3                            -- enable display updates and messages
  1031.          refresh
  1032.          r = WinMessageBox('Gibbon PGP Front End', message, 16432)
  1033. ;                                               MB_INFORMATION = 48
  1034. ;                                               MB_MOVEABLE    = 16384
  1035.          Return
  1036.  
  1037. -- handle case of bad signature
  1038.       elseif LeftStr(viewline,23) = 'Bad signature from user' then
  1039.          message = 'WARNING: ' || viewline
  1040.          GetLine viewline, 3, tempFileID      -- get line 3 ("signature made" message)
  1041.          message = message || \10viewline
  1042.          if arg(1) = 'c' then                 -- if we're only checking the sig
  1043.             'q'                               -- leave the file
  1044.             ActivateFile msgFileID            -- activate the original file
  1045.          endif
  1046.          Display 3                            -- enable display updates and messages
  1047.          refresh
  1048.          r = WinMessageBox('Gibbon PGP Front End', message, 16432)
  1049. ;                                               MB_INFORMATION = 48
  1050. ;                                               MB_MOVEABLE    = 16384
  1051.          Return
  1052.  
  1053. -- handle case of damaged file
  1054.       elseif LeftStr(viewline,40) = 'Error: Transport armor stripping failed' then
  1055.          message = 'ERROR: file has been damaged or tampered with and PGP could not continue.'
  1056.          'q'                                  -- leave the file
  1057.          ActivateFile msgFileID               -- activate the original file
  1058.          Display 3                            -- enable display updates and messages
  1059.          refresh
  1060.          r = WinMessageBox('Gibbon PGP Front End', message, 16432)
  1061. ;                                               MB_INFORMATION = 48
  1062. ;                                               MB_MOVEABLE    = 16384
  1063.          Return
  1064.  
  1065. -- handle case of unknown error
  1066.       elseif LeftStr(viewline,7) = 'Error:' then
  1067.          message = 'ERROR: an unexpected error has occurred:'
  1068.          viewline = RightStr(viewline,Length(viewline) - 1)
  1069.          message = message || \10 || viewline
  1070.          'q'                               -- leave the file
  1071.          ActivateFile msgFileID            -- activate the original file
  1072.          Display 3                            -- enable display updates and messages
  1073.          refresh
  1074.          r = WinMessageBox('Gibbon PGP Front End', message, 16432)
  1075. ;                                               MB_INFORMATION = 48
  1076. ;                                               MB_MOVEABLE    = 16384
  1077.          Return
  1078.  
  1079. -- Normally we exit this way after decrypting a file
  1080. -- that has not been signed, but we need to trap the
  1081. -- case where we only wanted to check the signature
  1082. -- and the file turns out to be unsigned.
  1083.       else
  1084.          if arg(1) = 'c' then                 -- if we're only checking the sig
  1085.             'q'                               -- leave the file
  1086.             ActivateFile msgFileID            -- activate the original file
  1087.             message = 'WARNING: File has not been signed, could not verify ' ||
  1088.                       'signature'
  1089.             Display 3                         -- enable display updates and messages
  1090.             refresh
  1091.             r = WinMessageBox('Gibbon PGP Front End', message, 16432)
  1092. ;                                               MB_INFORMATION = 48
  1093. ;                                               MB_MOVEABLE    = 16384
  1094.          endif
  1095.  
  1096.          Display 3                            -- enable display updates and messages
  1097.          Return
  1098.       endif
  1099.  
  1100.    EndDo
  1101.    Display 3                                  -- enable display updates and messages
  1102.  
  1103.  
  1104. /****************************
  1105.   Add key to public Keyring
  1106. ****************************/
  1107. defc PGPAddKey=
  1108.    universal vTEMP_PATH
  1109.    universal pgp_pubring, pgp_secring,
  1110.              pgp_curpubring
  1111.    universal pgp_armor, pgp_textmode,
  1112.              pgp_clearsig
  1113.    universal sec_name, sec_pswd
  1114.    universal pgp_cmd, pgp_opts
  1115.  
  1116.    if pgp_checkrings() = 0 then
  1117.       return
  1118.    endif
  1119.  
  1120.    switch = '-k'arg(1)
  1121.    GetFileID msgFileID                     -- get fileid of current message
  1122.  
  1123.    Display -3                              -- turn off display updates and error messages
  1124.  
  1125.    if arg(1) = 'a' then
  1126.       lastline = .last
  1127.       startkey = 0
  1128.       endkey   = 0
  1129.       Do line = 1 to lastline
  1130.          GetLine curline, line
  1131.          if curline = '-----BEGIN PGP PUBLIC KEY BLOCK-----' then
  1132.             startkey = line
  1133.          elseif curline = '-----END PGP PUBLIC KEY BLOCK-----' then
  1134.             endkey = line
  1135.          endif
  1136.       End
  1137.  
  1138.       if startkey = 0 or endkey = 0 then
  1139.          message = 'I couldn''t find a public key ' ||
  1140.                    'block anywhere in this message!'
  1141.          r = WinMessageBox('Gibbon PGP Front End', message, 16416)
  1142. ;                                           MB_CUAWARNING = 32
  1143. ;                                           MB_MOVEABLE   = 16384
  1144.          Display 3                            -- enable display updates and messages
  1145.          return
  1146.       else
  1147.          message = 'WARNING: All new keys and signatures will ' ||
  1148.                    'be added to your public key ring WITHOUT '  ||
  1149.                    'asking if you want to add each key.'\10\10  ||
  1150.                    'ALSO, any *existing* bad or malformed '     ||
  1151.                    'signatures will be DELETED!'
  1152.          r = WinMessageBox('Gibbon PGP Front End', message, 16416)
  1153. ;                                           MB_CUAWARNING = 32
  1154. ;                                           MB_MOVEABLE   = 16384
  1155.          message = 'Keys and signatures will be added to ' ||
  1156.                    pgp_curpubring \10\10'Do you want to continue?'
  1157.          r = WinMessageBox('Gibbon PGP Front End', message, 16404)
  1158. ;                                           MB_YESNO        = 4
  1159. ;                                           MB_ICONQUESTION = 16
  1160. ;                                           MB_MOVEABLE     = 16384
  1161.          if r = 7 then   -- MBID_NO is 7
  1162.             Display 3                            -- enable display updates and messages
  1163.             return
  1164.          endif
  1165.  
  1166. ;         SETMARK startkey, endkey, 1, 65, 2, msgFileID  -- Mark the key block
  1167.          SETMARK startkey, endkey, 1, 65, 1, msgFileID  -- Mark the key block
  1168.          outfile=vTEMP_PATH || 'pgpfe.out'    -- Build the file name for the temp file
  1169.          'e' outfile                             -- open it
  1170.          CopyMark                                -- copy the key block to the outfile window
  1171.          's'                                     -- save the temporary file
  1172.          'q'                                     -- exit the temporary window
  1173.  
  1174.          cmdline = switch pgp_curpubring '<' outfile
  1175.          r = pgp_redirect(pgp_opts cmdline)
  1176.          call erasetemp(outfile)                 -- and delete the temp file
  1177.          if r = 'ERROR' then
  1178.             ActivateFile msgFileID               -- activate the original file
  1179.             Display 3                            -- enable display updates and messages
  1180.             return
  1181.          endif
  1182.  
  1183.          GetFileID tempFileID                    -- get fileid of results file
  1184.          ActivateFile msgFileID                  -- activate the original file
  1185.          UnMark
  1186.  
  1187.          ActivateFile tempFileID                 -- activate the temporary file
  1188.          .filename = '/Results of Key Add (-ka) Processing/'
  1189.          GetLine curline, 3
  1190.          If curline = 'No new keys or signatures in keyfile.' then
  1191.             'q'                                  -- quit the file
  1192.             ActivateFile msgFileID               -- activate the original file
  1193.             r = WinMessageBox('Gibbon PGP Front End', curline, 16416)
  1194. ;                                              MB_CUAWARNING = 32
  1195. ;                                              MB_MOVEABLE   = 16384
  1196.             Display 3                            -- enable display updates and messages
  1197.             return
  1198.          endif
  1199.  
  1200.          GetLine curline, 1
  1201. ;         if LeftStr(curline,18) = 'Keyring add error' then
  1202.          if LeftStr(curline,6) = 'ERROR:' then
  1203.             message = 'PGP Detected an error while attempting ' ||
  1204.                       'to add this key to' pgp_curpubring'.'\10 ||
  1205.                       \10'The error message is:'\10\10          ||
  1206.                       RightStr(curline, Length(curline) - 7)
  1207.             'q'                                  -- quit the file
  1208.             ActivateFile msgFileID               -- activate the original file
  1209.             r = WinMessageBox('Gibbon PGP Front End', message, 16416)
  1210. ;                                              MB_CUAWARNING = 32
  1211. ;                                              MB_MOVEABLE   = 16384
  1212.             Display 3                            -- enable display updates and messages
  1213.             return
  1214.          endif
  1215.  
  1216.  
  1217.       endif
  1218.  
  1219.    Endif
  1220.  
  1221.    Display 3                            -- enable display updates and messages
  1222.  
  1223.  
  1224. /**************************
  1225.   Key Management Commands
  1226. **************************/
  1227. defc PGPKMgt=
  1228.    universal vTEMP_PATH
  1229.    universal pgp_pubring, pgp_secring,
  1230.              pgp_curpubring
  1231.    universal pgp_armor, pgp_textmode,
  1232.              pgp_clearsig
  1233.    universal sec_name, sec_pswd, pub_keyid, pub_name
  1234.  
  1235.    if pgp_checkrings() = 0 then
  1236.       return
  1237.    endif
  1238.  
  1239.    arg1 = Word(arg(1),1)
  1240.    arg2 = Word(arg(1),2)
  1241.  
  1242.    switch = '-k'arg2
  1243.  
  1244.    if arg1 = 'p' then                      -- Public key ring management commands
  1245.       pgp_get_pub_id(0)
  1246.       if pub_keyid = '' then
  1247.          return
  1248.       endif
  1249.  
  1250.       if arg2 = 'e' then
  1251.          message = 'Edit Trust Parameters for'
  1252.       elseif arg2 = 'r' then
  1253.          message = 'Remove the key for'
  1254.       elseif arg2 = 's' then
  1255.          message = 'Sign and Certify the key for'
  1256.       elseif arg2 = 'rs' then
  1257.          message = 'Remove a signature from'
  1258.       elseif arg2 = 'd' then
  1259.          message = 'Disable or Enable the key for'
  1260.       endif
  1261.  
  1262.       message = 'You are about to' message pub_name ||
  1263.                 ' on your public keyring:' pgp_curpubring
  1264.  
  1265.    else
  1266.  
  1267.       if arg2 = 'g' then
  1268.          message = 'Generate a new public/secret key pair.'
  1269.       elseif arg2 = 'e' then
  1270.          message = 'Edit your userid or passphrase.'
  1271.       elseif arg2 = 'd' then
  1272.          message = 'REVOKE YOUR KEY and ISSUE A KEY COMPROMISE CERTIFICATE.'
  1273.       endif
  1274.  
  1275.       message = 'You are about to' message
  1276.  
  1277.    endif
  1278.  
  1279.    message = message || \10\10'This action will DIRECTLY affect your keyring!' ||
  1280.                         \10\10'Are you SURE you want to continue?'
  1281.  
  1282.    r = WinMessageBox('Gibbon PGP Front End', message, 16404)
  1283. ;                                     MB_YESNO        = 4
  1284. ;                                     MB_ICONQUESTION = 16
  1285. ;                                     MB_MOVEABLE     = 16384
  1286.  
  1287.    if r = 7 then   -- MBID_NO is 7
  1288.       return
  1289.    endif
  1290.  
  1291.    if arg1 = 's' then
  1292.       sec_name = ''
  1293.       sec_pswd = ''
  1294.    endif
  1295.  
  1296.    if arg2 <> 'g' then
  1297.       pgp_get_sec_id()
  1298.    endif
  1299.  
  1300.    cmd = switch
  1301.  
  1302.    if arg1 = 'p' then
  1303.       cmd = cmd pub_keyid '-u "' || sec_name || '"' pgp_curpubring
  1304.    else
  1305.       if arg2 = 'e' then
  1306.          cmd = cmd '"'sec_name'"' pgp_secring
  1307.       elseif arg2 = 'd' then
  1308.          cmd = cmd '"'sec_name'"'
  1309.       endif
  1310.    endif
  1311.  
  1312.    'OS2 /C PGP' cmd
  1313.  
  1314.  
  1315.  
  1316. /*
  1317. Parameter 8 is a string consisting of (5.51 & below):
  1318.      item# || button# || help_ID || handle || prompt
  1319. or, in 5.60 & above, of:
  1320.      handle || item# || button# || help_ID || prompt
  1321.  
  1322.      handle    the window handle of the OWNERCLIENT
  1323.                (needed to call help; ignored if help_ID is 0)
  1324.      item#     the listbox entry to be initially selected
  1325.      button#   the button that will be the default
  1326.      help_ID   a help panel ID (all shorts)
  1327.      prompt    an ASCIIZ string to be displayed below the title bar
  1328.  
  1329. If help_ID is non-zero, the rightmost button is assumed to be the help button.
  1330. The new parameters are passed to the toolkit in the return buffer, which is
  1331. padded with nulls, so only the minimum needed string need be sent.  The old
  1332. way only supported returning a string if button 1 was pressed; button 2 was
  1333. assumed to be Cancel, a returned null; anything else returned the button
  1334. number.  The new way returns one byte representing the button number (in hex)
  1335. followed by the selected item.  A button number of 0 means Esc was pressed or
  1336. the dialog was closed.  If param8 was passed, the listbox() routine returns
  1337. this entire string; if not, it parses it and returns what the old callers
  1338. expected.
  1339. */
  1340. /*
  1341.    parse value listbox('Select PGP Option for Selected Text',
  1342.                   pgpmenu,
  1343.                  '/Enter/Cancel/Button3/Button4/Button5/Button6',
  1344.                  0, 0, 5, 72,
  1345.                  compile if EVERSION >= 5.60 --gethwndc(APP_HANDLE)
  1346.                     zero || zero || one || one || zero ||
  1347.                  compile else                --gethwndc(APP_HANDLE)
  1348.                     one || one || zero || zero || zero ||
  1349.                  compile endif
  1350.                  'Additional Options?') with button 2 text \0
  1351.  
  1352.    btn = itoa(button || \0, 10)
  1353.    sayerror 'Button:' btn '  Text:' text
  1354. */
  1355.  
  1356.  
  1357.  
  1358. /*
  1359.  
  1360. MB_OK                =        0  -- Pick one of the following for the
  1361. MB_OKCANCEL          =        1  -- buttons you want on the message box
  1362. MB_RETRYCANCEL       =        2
  1363. MB_ABORTRETRYIGNORE  =        3
  1364. MB_YESNO             =        4
  1365. MB_YESNOCANCEL       =        5
  1366. MB_CANCEL            =        6
  1367. MB_ENTER             =        7
  1368. MB_ENTERCANCEL       =        8
  1369.  
  1370. MB_NOICON            =        0  -- Add one of the following for the
  1371. MB_CUANOTIFICATION   =        0  -- icon you want in the message box
  1372. MB_ICONQUESTION      =       16
  1373. MB_ICONEXCLAMATION   =       32
  1374. MB_CUAWARNING        =       32
  1375. MB_ICONASTERISK      =       48
  1376. MB_ICONHAND          =       64
  1377. MB_CUACRITICAL       =       64
  1378. MB_QUERY             =     MB_ICONQUESTION
  1379. MB_WARNING           =     MB_CUAWARNING
  1380. MB_INFORMATION       =     MB_ICONASTERISK
  1381. MB_CRITICAL          =     MB_CUACRITICAL
  1382. MB_ERROR             =     MB_CRITICAL
  1383.  
  1384. MB_DEFBUTTON1        =          0  -- This specifies which button is the
  1385. MB_DEFBUTTON2        =        256  -- default if Enter is pressed.
  1386. MB_DEFBUTTON3        =        512
  1387.  
  1388. MB_APPLMODAL         =       0000  -- Application modal
  1389. MB_SYSTEMMODAL       =       4096  -- System modal
  1390. MB_HELP              =       8192
  1391. MB_MOVEABLE          =      16384  -- The message box can be moved.
  1392.  
  1393. MBID_OK              =     1  -- Message box return codes
  1394. MBID_CANCEL          =     2  -- (correspond with the button pressed)
  1395. MBID_ABORT           =     3
  1396. MBID_RETRY           =     4
  1397. MBID_IGNORE          =     5
  1398. MBID_YES             =     6
  1399. MBID_NO              =     7
  1400. MBID_HELP            =     8
  1401. MBID_ENTER           =     9
  1402. MBID_ERROR           =     65535
  1403.  
  1404. */
  1405.  
  1406.  
  1407. /****************************************
  1408.   get_sec_id gets the secret key to use
  1409. *****************************************/
  1410. defproc pgp_get_sec_id()
  1411.    universal vTEMP_PATH
  1412.    universal pgp_pubring, pgp_secring
  1413.    universal sec_name, sec_keyid, sec_pswd
  1414.  
  1415.    if pgp_checkrings() = 0 then
  1416.       return
  1417.    endif
  1418.  
  1419.    one = atoi(1)
  1420.    zero = atoi(0)
  1421.  
  1422. ;   Display -3                              -- turn off display updates and error messages
  1423.    GetFileID msgFileID                     -- get fileid of current message
  1424.    r = pgp_redirect('-kv *' pgp_secring)  -- pass commands to routine the does the work
  1425.    if r = 'ERROR' then
  1426. ;      Display 3                            -- enable display updates and messages
  1427.       return
  1428.    endif
  1429.    GetFileID tempFileID
  1430.  
  1431.    uidlist = ''
  1432.    lastline = .last
  1433.    numhits = 0
  1434.  
  1435.    Do line = 1 to lastline
  1436.       GetLine viewline, line, tempFileID
  1437.       if Word(viewline,1) = 'sec' then
  1438.          numhits = numhits + 1
  1439.          parse value viewline with . temp1 . temp2
  1440.          -- strip off key length from keyid  (eg. 1024/18CC6311)
  1441.          temp1 = '0x' || SubStr(temp1, Pos('/',temp1)+1)
  1442.          uidlist = uidlist || '^' || temp1' 'temp2
  1443.       endif
  1444.    End
  1445.  
  1446.    ActivateFile tempFileID                 -- activate the temporary file
  1447.    'q'                                     -- quit the file
  1448.    ActivateFile msgFileID                  -- activate the original file
  1449.  
  1450. /* no secret keys were found so punt */
  1451.    if numhits = 0 then
  1452.       r = WinMessageBox('Gibbon PGP Front End',
  1453.                         'I could not find any secret keys in' pgp_secring'!', 16416)
  1454. ;                                                        MB_CUAWARNING = 32
  1455. ;                                                        MB_MOVEABLE   = 16384
  1456.       sec_name = ''
  1457.       sec_keyid = ''
  1458. ;      Display 3                            -- enable display updates and messages
  1459.       return ''
  1460.    endif
  1461.  
  1462. /* If only 1 secret key is found, don't display the list */
  1463.    if numhits = 1 then
  1464.       if temp1 <> sec_keyid then
  1465.          sec_pswd = ''
  1466.       endif
  1467.       sec_keyid = temp1
  1468.       sec_name = temp2
  1469.       return ''
  1470.    endif
  1471.  
  1472. /* otherwise, display secret keys for selection */
  1473.    parse value listbox('Gibbon PGP Key Selection',
  1474.                         uidlist,
  1475.                        '/~OK/~Cancel',
  1476.                        0, 0, 4, 60,
  1477.                        compile if EVERSION >= 5.60 --gethwndc(APP_HANDLE)
  1478.                           zero || zero || one || one || zero ||
  1479.                        compile else                --gethwndc(APP_HANDLE)
  1480.                           one || one || zero || zero || zero ||
  1481.                        compile endif
  1482.                        'Select which secret key you want to use') with button 2 text \0
  1483.    btn = itoa(button || \0, 10)
  1484.    if btn = '2' then
  1485.       sec_keyid = ''
  1486.       sec_name = ''
  1487.       return ''
  1488.    endif
  1489.    parse value text with sec_keyid sec_name
  1490. ;   Display 3                               -- enable display updates and messages
  1491.  
  1492.  
  1493.  
  1494. /*****************************************
  1495.   get_pub_id gets the public key(s) to use
  1496. ******************************************/
  1497. defproc pgp_get_pub_id(mult)
  1498.    universal vTEMP_PATH
  1499.    universal pgp_pubring, pgp_secring
  1500.    universal pub_keyid, pub_name
  1501.  
  1502.    if pgp_checkrings() = 0 then
  1503.       return ''
  1504.    endif
  1505.  
  1506.    one = atoi(1)
  1507.    zero = atoi(0)
  1508.  
  1509.    uid = ''
  1510.    pub_keyid = ''
  1511.    pub_name = ''
  1512.  
  1513.    lastline = .last
  1514.    if lastline > 30 then
  1515.       lastline = 30
  1516.    endif
  1517.    hival = 0
  1518.  
  1519. /*
  1520.    search the message file for email headers To:,  Reply-To:,  or From:
  1521.    and snag email address if found.  Note that if more than one of the
  1522.    above headers is found, priority is to use 'To:', then  'Reply-To:',
  1523.    and then finally 'From:'.  This is controlled by hival.
  1524. */
  1525.    do line = 1 to lastline
  1526.       GetLine viewline, line
  1527.       test = Word(viewline,1)
  1528.       if test <> 'Reply-To:' and test <> 'From:' and test <> 'To:' then
  1529.          iterate
  1530.       endif
  1531.  
  1532. /* From: is the lowest priority */
  1533.       if test = 'From:' then
  1534.          if hival > 1 then
  1535.             iterate
  1536.          else
  1537.             hival = 1
  1538.          endif
  1539.       endif
  1540. /* Reply-To: is next lowest priority */
  1541.       if test = 'Reply-To:' then
  1542.          if hival > 2 then
  1543.             iterate
  1544.          else
  1545.             hival = 2
  1546.          endif
  1547.       endif
  1548. /* To: is highest priority */
  1549.       if test = 'To:' then
  1550.          hival = 3
  1551.       endif
  1552.  
  1553. /* if we get here, then we found a header and need to extract address  */
  1554.       found = 0
  1555.       do numword = 2 to Words(viewline)
  1556.          if Pos('@',Word(viewline,numword)) > 1 then
  1557.             uid = Word(viewline,numword)
  1558.             found = 1
  1559.             leave
  1560.          endif
  1561.       enddo
  1562.  
  1563. /* if we can't find internet style address, then use first word after keyword */
  1564.       if found = 0 then
  1565.          uid = Word(viewline,2)
  1566.       endif
  1567.  
  1568. /* strip off '<' or '(' from email address */
  1569.       if LeftStr(uid,1) = '<' or LeftStr(uid,1) = '(' then
  1570.          uid = RightStr(uid, Length(uid) - 1)
  1571.       endif
  1572.       if RightStr(uid,1) = '>' or RightStr(uid,1) = ')' then
  1573.          uid = LeftStr(uid, Length(uid) - 1)
  1574.       endif
  1575.  
  1576.    enddo /* end search for email headers */
  1577.  
  1578. /* uid contains the email address from header search, if any  */
  1579.    if uid = '' then
  1580.       uid = '*'
  1581.    endif
  1582.  
  1583. /* if mult set, then multiple public keys can be selected simultaneously */
  1584.    if mult then
  1585.       entrytitle = 'Enter public key user id, "*" for a list, or "+" for multiple users'
  1586.    else
  1587.       entrytitle = 'Enter public key user id or "*" for a list'
  1588.    endif
  1589.    mask = EntryBox(entrytitle, '/~OK/~Cancel', uid, 5, 72)
  1590.  
  1591. /* punt if nothing selected */
  1592.    if mask = '' then
  1593.       Return ''
  1594.    endif
  1595.  
  1596. /* trap attempt to mult when mult=0 */
  1597.    if mask = '+' and mult = 0 then
  1598.       mask = '*'
  1599.    endif
  1600.  
  1601.    if mask = '+' then
  1602.       mask = '*'
  1603.       doingmult = 1
  1604.    else
  1605.       doingmult = 0
  1606.    endif
  1607.  
  1608. ;   Display -3                              -- turn off display updates and error messages
  1609.    GetFileID msgFileID                     -- get fileid of current message
  1610. /* search public keyring */
  1611.    r = pgp_redirect('-kv "'mask'"' pgp_pubring)  -- pass commands to routine the does the work
  1612.    if r = 'ERROR' then
  1613. ;      Display 3                            -- enable display updates and messages
  1614.       return
  1615.    endif
  1616.    GetFileID tempFileID
  1617.  
  1618.    lastline = .last
  1619.    numhits = 0
  1620.  
  1621. /* we build a list of public keys found saving only the user name and keyid */
  1622.    listfile=vTEMP_PATH || 'Listbuf.out'    -- Build the file name for the list file
  1623.    'e' listfile                            -- open it
  1624.    GetFileID ListFileID                    -- Get its fileid
  1625.    ActivateFile tempFileID                 -- activate the temporary file
  1626.  
  1627. /* search the raw data for pub keys, and parse out key id and user name */
  1628.    Do line = 1 to lastline
  1629.       GetLine viewline, line
  1630.       if Word(viewline,1) = 'pub' then
  1631.          numhits = numhits + 1
  1632.          parse value viewline with . temp1 . temp2
  1633.          /* strip off key length from keyid  (eg. 1024/18CC6311) */
  1634.          temp1 = '0x' || SubStr(temp1, Pos('/',temp1)+1)
  1635.          temp = \255 || temp1' 'temp2
  1636.          Insertline temp, ListFileID.last, ListFileID -- Add it to the list
  1637.       endif
  1638.    End
  1639.  
  1640.    ListFileID.Modify = 0                   -- reset the modified flag for quit
  1641.  
  1642.    ActivateFile tempFileID                 -- activate the temporary file
  1643.    'q'                                     -- quit the file
  1644.    ActivateFile msgFileID                  -- activate the original file
  1645.  
  1646. /* here only one pub key was found so go ahead and use it */
  1647.    if numhits = 1 then
  1648.       getline pub_key, 1, ListFileID
  1649.       parse value pub_key with pub_keyid pub_name
  1650.       /* strip off \255 character on left side */
  1651.       pub_keyid = RightStr(pub_keyid, Length(pub_keyid) - 1)
  1652.       ActivateFile ListFileID              -- activate the list file
  1653.       'q'                                  -- quit the file
  1654.       ActivateFile msgFileID               -- activate the original file
  1655. ;      Display 3                            -- enable display updates and messages
  1656.       return
  1657.    endif
  1658.  
  1659. /* no matching public keys were found so punt */
  1660.    if numhits = 0 then
  1661.       r = WinMessageBox('Gibbon PGP Front End',
  1662.                         'I could not find any keys matching 'mask' in 'pgp_pubring'!', 16416)
  1663. ;                                                        MB_CUAWARNING = 32
  1664. ;                                                        MB_MOVEABLE   = 16384
  1665.       ActivateFile ListFileID              -- activate the list file
  1666.       'q'                                  -- quit the file
  1667.       ActivateFile msgFileID               -- activate the original file
  1668. ;      Display 3                            -- enable display updates and messages
  1669.       return ''
  1670.    endif
  1671.  
  1672. /* here more than one pub key was found so need user to select from list box */
  1673.  
  1674.    Deleteline ListFileID.last, ListFileID  -- Delete blank line at the end
  1675.  
  1676.    if doingmult then
  1677.       buttons = '/~OK/~Cancel/~Add to List'
  1678.    else
  1679.       buttons = '/~OK/~Cancel'
  1680.    endif
  1681.  
  1682.    temp_keyid = ''
  1683.    temp_name = ''
  1684.  
  1685.    Do Forever
  1686.       ActivateFile ListFileID              -- activate the list file
  1687.       ListHndl = Buffer(CREATEBUF, 'ListBuffer', MAXBUFSIZE, 1)
  1688.       if ListHndl = 0 then
  1689.           sayerror 'ERROR: could not create buffer'
  1690.           return ''
  1691.       endif
  1692.       noflines = buffer(PUTBUF, ListHndl, 1, 0, APPENDCR)
  1693. --      noflines = Buffer(PUTBUF, ListHndl, 1, .last)
  1694.       bufsize = Buffer(USEDSIZEBUF, ListHndl) -- get the size of the buffer
  1695.       ListFileID.Modify = 0                -- reset the modified flag for quit
  1696.       parse value listbox('Gibbon PGP Key Selection',
  1697.                   compile if EPM32  -- Or, if not including STDCONST, "if EVERSION >= 6"
  1698.                            \0 || atol(bufsize) || atoi(32) || atoi(ListHndl),
  1699.                   compile else
  1700.                            \0 || atoi(bufsize) || atoi(ListHndl) || atoi(32),
  1701.                   compile endif
  1702.                            buttons,
  1703.                            0, 0, 10, 72,
  1704.                   compile if EVERSION >= 5.60 --gethwndc(APP_HANDLE)
  1705.                            zero || zero || one || one || zero ||
  1706.                   compile else                --gethwndc(APP_HANDLE)
  1707.                            one || one || zero || zero || zero ||
  1708.                   compile endif
  1709.                            'Select a public key') with button 2 pub_key \0
  1710.  
  1711.       Call Buffer(FREEBUF, ListHndl)       -- Free the buffer
  1712.       btn = itoa(button || \0, 10)
  1713.  
  1714. /* cancel button pressed */
  1715.       if btn = '2' or pub_key = '' then
  1716.          ActivateFile ListFileID           -- activate the list file
  1717.          'q'                               -- quit the file
  1718.          ActivateFile msgFileID            -- activate the original file
  1719.          pub_keyid = ''
  1720.          pub_name = ''
  1721. ;         Display 3                         -- enable display updates and messages
  1722.          return
  1723.       endif
  1724.  
  1725. /* strip off funny note symbol at end of pub_key and parse */
  1726.       if Length(pub_key) > 1 then
  1727.          pub_key = LeftStr(pub_key, Length(pub_key) - 1)
  1728.          parse value pub_key with pub_keyid pub_name
  1729.       endif
  1730.  
  1731. /* OK button pressed */
  1732.       if btn = '1' then
  1733.          if doingmult then
  1734.             pub_keyid = temp_keyid
  1735.             pub_name = temp_name
  1736.             if pub_keyid = '' then
  1737.                message = 'You selected "OK" but haven''t added ' ||
  1738.                          'any public keys yet!  Either use the '  ||
  1739.                          '"Cancel" or "Add to List" buttons.'
  1740.                r = WinMessageBox('Gibbon PGP Front End', message, 16432)
  1741. ;                                                MB_INFORMATION = 48
  1742. ;                                                MB_MOVEABLE    = 16384
  1743.                iterate
  1744.             endif
  1745.          endif
  1746.          ActivateFile ListFileID           -- activate the list file
  1747.          'q'                               -- quit the file
  1748.          ActivateFile msgFileID            -- activate the original file
  1749. ;         Display 3                         -- enable display updates and messages
  1750.          return
  1751.       endif
  1752.  
  1753. /*
  1754.    Add-to-List button pressed  (for multiple keys only)
  1755.          Note: we need to trap the case where the same user is selected
  1756.          twice by checking for pub_keyid = *
  1757. */
  1758.       if btn = '3' and pub_keyid <> '*' then
  1759.          if temp_name = '' then
  1760.             temp_name = pub_name
  1761.             temp_keyid = pub_keyid
  1762.          else
  1763.             temp_name = temp_name' and 'pub_name
  1764.             temp_keyid = temp_keyid' 'pub_keyid
  1765.          endif
  1766.          ActivateFile ListFileID           -- activate the list file
  1767.          for curline = 1 to .last
  1768.             getline chgline, curline
  1769.             if Length(chgline) > 1 then
  1770.                chgline = RightStr(chgline, Length(chgline) - 1)
  1771.             endif
  1772.             if chgline = pub_key then
  1773.                chgline = \255 || '* ' || chgline
  1774.                replaceline chgline, curline
  1775.             endif
  1776.          endfor
  1777.          ActivateFile msgFileID            -- activate the original file
  1778.       endif
  1779.  
  1780.    EndDo
  1781. ;   Display 3                               -- enable display updates and messages
  1782.  
  1783.  
  1784.  
  1785. /***************************************************
  1786.   pgp_checkrings makes sure the keyrings are there
  1787. ***************************************************/
  1788. defproc pgp_checkrings()
  1789.    universal vTEMP_PATH
  1790.    universal pgp_curpubring, pgp_pubring, pgp_secring
  1791.    universal pgp_path, pgp_found, pgp_config
  1792.    universal pgp_randseed, pgp_cmd
  1793.  
  1794.    if pgp_path = '' then
  1795.       r = WinMessageBox('Gibbon PGP Front End',
  1796.                         'Your PGPPATH environment variable has not been set!', 16416)
  1797. ;                                                        MB_CUAWARNING = 32
  1798. ;                                                        MB_MOVEABLE   = 16384
  1799.       Return 0
  1800.     endif
  1801.  
  1802.    if pgp_config = '' then                        -- Has the config file been read yet?
  1803.       v_PATH = Get_Env('TEMP')
  1804.       if v_PATH = '' then
  1805.          v_PATH = Get_Env('TMP')
  1806.       endif
  1807.       if v_PATH <> '' then
  1808.          vTEMP_PATH = v_PATH
  1809.       endif
  1810.  
  1811.       pgp_config = pgp_path'\config.txt'          -- No - set the path
  1812.       if not Exist(pgp_config) then
  1813.          pgp_config = pgp_path'\pgp.ini'
  1814.          if not Exist(pgp_config) then
  1815.             pgp_config = pgp_path'\.pgprc'
  1816.          endif
  1817.       endif
  1818.       if Exist(pgp_config) then                   -- Read it only if it exists
  1819.          GetFileID msgFileID                      -- get fileid of current message
  1820.          'e' pgp_config                           -- Edit it
  1821.          Do line = 1 to .last
  1822.             GetLine viewline, line                -- Get a line
  1823.             if LeftStr(viewline,1) = '#' then     -- Check for comments
  1824.                iterate
  1825.             endif
  1826.             if Words(viewline) < 1 then           -- Check for blank lines
  1827.                iterate
  1828.             endif
  1829.             Parse Value viewline with keyword '=' text '#' .
  1830.             Do Forever
  1831.                test = LeftStr(text,1)
  1832.                if test = ' ' or test = '"' or test = "'" then
  1833.                   text = RightStr(text, Length(text) - 1)
  1834.                else
  1835.                   leave
  1836.                endif
  1837.             EndDo
  1838.             Do Forever
  1839.                test = RightStr(text,1)
  1840.                if test = ' ' or test = '"' or test = "'" then
  1841.                   text = LeftStr(text, Length(text) - 1)
  1842.                else
  1843.                   leave
  1844.                endif
  1845.             EndDo
  1846.             keyword = UpCase(keyword)
  1847.             if keyword = 'MYNAME' then
  1848.                sec_name = text
  1849.             elseif keyword = 'TMP' then
  1850.                vTEMP_PATH = text
  1851.             elseif keyword = 'PUBRING' then
  1852.                pgp_pubring = text
  1853.                pgp_curpubring = text
  1854.             elseif keyword = 'SECRING' then
  1855.                pgp_secring = text
  1856.             elseif keyword = 'RANDSEED' then
  1857.                pgp_randseed = text
  1858.             endif
  1859.  
  1860.          EndDo
  1861.          'q'
  1862.          ActivateFile msgFileID                   -- activate the original file
  1863.       endif
  1864.  
  1865.       if RightStr(vTEMP_PATH,1) <> '\' and RightStr(vTEMP_PATH,1) <> ':' then
  1866.          vTEMP_PATH = vTEMP_PATH || '\'
  1867.       Endif
  1868.  
  1869. /* make sure we can find pgp.exe, if not in path then make pgp_cmd fully qualified
  1870.    pgp_found = 0 -> cannot find pgp in PATH or pgp_path
  1871.    pgp_found = 1 -> pgp is in PATH
  1872.    pgp_found = 2 -> pgp is in pgp_path but not PATH
  1873. */
  1874.       findfile cmdline, 'PGP', 'PATH', 'P'
  1875.       If cmdline = '' then
  1876.          pgp_cmd = pgp_path || '\' || pgp_cmd
  1877.          findfile cmdline, pgp_path || '\PGP', '', 'P'
  1878.          If cmdline = '' then
  1879.             pgp_found = 0
  1880.          else
  1881.             pgp_found = 2
  1882.          endif
  1883.       endif
  1884.  
  1885. compile if EVERSION >= 5.60
  1886.       if pgp_found = 1 then
  1887.          'e' cmdline
  1888.          lth = 0
  1889.          Do line = 1 to .last
  1890.             GetLine viewline, line                -- Get a line
  1891.             if (Pos("This program cannot be run in a DOS session.", viewline) > 0) then
  1892.                leave
  1893.             endif
  1894.             lth = lth + Length(viewline)
  1895.             if (lth > 200) then
  1896.                pgp_found = 0
  1897.                r = WinMessageBox('Gibbon PGP Front End',
  1898.                               'Unable to run PGP.EXE because the program ' ||
  1899.                               'found is not an OS/2 executable.' , 16416)
  1900. ;                                                        MB_CUAWARNING = 32
  1901. ;                                                        MB_MOVEABLE   = 16384
  1902.                leave
  1903.             endif
  1904.          EndDo
  1905.          'q'
  1906.          if pgp_found = 0 then
  1907.             Return 0
  1908.          endif
  1909.       endif
  1910. compile endif
  1911.  
  1912.    endif
  1913.  
  1914.    if pgp_found = 0 then
  1915.       r = WinMessageBox('Gibbon PGP Front End',
  1916.                         'Unable to run PGP.EXE because it could not ' ||
  1917.                         'be found in either the PATH or in PGPPATH!'  ||
  1918.                          \10\10 || 'Make sure the directory that '    ||
  1919.                         'contains PGP is in your PATH.'    , 16416)
  1920. ;                                                        MB_CUAWARNING = 32
  1921. ;                                                        MB_MOVEABLE   = 16384
  1922.       Return 0
  1923.    endif
  1924.  
  1925.    if pgp_found > 1 and pgp_found < 4 then
  1926.       message = 'PGP.EXE was not in the path, but was found in' pgp_path'.' ||
  1927.                 \10\10 || 'Make sure the directory that contains PGP is in your PATH.'
  1928.       r = WinMessageBox('Gibbon PGP Front End', message, 16416)
  1929. ;                                                     MB_CUAWARNING = 32
  1930. ;                                                     MB_MOVEABLE   = 16384
  1931.       pgp_found = pgp_found + 1
  1932.    endif
  1933.  
  1934.    ranseedok = Exist(pgp_randseed)
  1935.    pubringok = Exist(pgp_pubring)
  1936.    curpubok  = Exist(pgp_curpubring)
  1937.    secringok = Exist(pgp_secring)
  1938.  
  1939.    if pubringok = 0 then
  1940.       message = 'Could not find PUBRING.PGP!'
  1941.    endif
  1942.    if curpubok = 0 then
  1943.       if pubringok then
  1944.          message = 'Could not find public key ring' pgp_curpubring'!'
  1945.       else
  1946.          message = message || \10'Or public key ring' pgp_curpubring'!'
  1947.       endif
  1948.    endif
  1949.    if secringok = 0 then
  1950.       if pubringok + curpubok = 2 then
  1951.          message = 'Could not find your secret key ring!'
  1952.       else
  1953.          message = message || \10 || 'Or your secret key ring, either!'
  1954.       endif
  1955.    endif
  1956.    if ranseedok = 0 then
  1957.       if pubringok + curpubok + secringok = 3 then
  1958.          message = 'Could not find RANDSEED.BIN!'
  1959.       else
  1960.          message = message || \10 || 'Or RANDSEED.BIN, either!'
  1961.       endif
  1962.    endif
  1963.  
  1964.    if (pubringok + curpubok + secringok + ranseedok) < 4 then
  1965.       r = WinMessageBox('Gibbon PGP Front End', message, 16416)
  1966. ;                                                        MB_CUAWARNING = 32
  1967. ;                                                        MB_MOVEABLE   = 16384
  1968.       Return 0
  1969.    endif
  1970.  
  1971.    Return 1
  1972.  
  1973.  
  1974. /*********************************************************************
  1975.   redirect invokes PGP and redirects the output to a temproary file.
  1976.   It then loads the file into an edit window, and deletes the file.
  1977. *********************************************************************/
  1978. defproc pgp_redirect(cmdline)
  1979.    universal vTEMP_PATH                             -- Path for temporary file - Predefined
  1980.    universal pgp_armor, pgp_textmode,
  1981.              pgp_clearsig
  1982.    universal pgp_cmd, pgp_opts
  1983.  
  1984.    outfile=vTEMP_PATH || 'pgpfe.tmp'                -- Build the file name for the temp file
  1985.  
  1986.    -- The output is redirected to pgpfe.tmp so it can be picked up
  1987.  
  1988.    lth = Length(pgp_cmd) + Length(cmdline) + Length(outfile) + 11
  1989. compile if EVERSION >= 5.60
  1990.    if lth > 1590 then
  1991.       message = 'Unable to complete the requested action.  ' ||
  1992.                 'The command line length (' || lth || ') '   ||
  1993.                 'exceeds the limit of 1590 characters.'
  1994. compile else
  1995.    if lth > 248 then
  1996.       message = 'Unable to complete the requested action.  ' ||
  1997.                 'The command line length (' || lth || ') '   ||
  1998.                 'exceeds the limit of 248 characters.'
  1999. compile endif
  2000.       r = WinMessageBox('Gibbon PGP Front End', message, 16448)
  2001. ;                                         MB_CUACRITICAL = 64
  2002. ;                                         MB_MOVEABLE    = 16384
  2003.       return 'ERROR'
  2004.    endif
  2005.    cmd = pgp_cmd '-f' cmdline '>'outfile '2>&1'
  2006.    quietshell cmd
  2007.  
  2008.    if RC = sayerror('Insufficient memory') or
  2009.       RC = sayerror('File Not found') then stop; endif
  2010.    'e' outfile                                      -- bring up the output
  2011.    call erasetemp(outfile)                          -- and delete the temp file
  2012.