Advertisement
joric

mIRC script for GPG authentication (version 1.1b)

Jul 12th, 2011
357
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
mIRC 8.09 KB | None | 0 0
  1. /**
  2.  * @file
  3.  * @author Joric <irc.freenode.net/#bitcoin-otc>
  4.  * @version 1.1b
  5.  *
  6.  * @section LICENSE
  7.  *
  8.  * This program is in the public domain
  9.  *
  10.  * @section DESCRIPTION
  11.  *
  12.  * GPG authentication helper script for mIRC
  13.  * Usage: /gpgauth [passphrase]
  14.  *
  15.  * You can install this script by typing /load -rs <path-to-script>
  16.  * You can uninstall this script by typing /unload -rs <path-to-script>
  17.  * You can also just copy/paste it into 'remote' window and then hit the OK button.
  18.  *                                                                                      
  19.  * Use /reload -rs <path-to-script> to reload script after editing.
  20.  */
  21.  
  22. /**
  23.  * menu
  24.  *
  25.  * adds options to the global menu
  26.  * you may edit or comment them out and reload script to accept changes
  27.  */
  28.  
  29. menu status,channel,query {
  30.     GPG Options: gpg_options
  31.     $iif(%gpg.debug,GPG Reload,$null): reload -rs $script
  32. ;    GPG Evaluate: gpg_autorun
  33. }
  34.  
  35. alias gpg_authenticate {
  36.     join #bitcoin-otc-foyer
  37.     gpgauth %gpg.passphrase
  38. }
  39.  
  40. alias gpg_autorun {
  41.     var %i = 1
  42.     var %n = $numtok(%gpg.sequence, $asc(|))
  43.     while (%i <= %n) {
  44.         $gettok(%gpg.sequence, %i, $asc(|))
  45.         inc %i
  46.     }
  47. }
  48.  
  49. alias gpg_load {
  50.     set %gpg.ini $scriptdir $+ gpgauth.ini
  51.     set %gpg.executable $readini(%gpg.ini, config, gpg.executable)
  52.     set %gpg.passphrase $readini(%gpg.ini, config, gpg.passphrase)
  53.     set %gpg.sequence $readini(%gpg.ini, config, gpg.sequence)
  54.     set %gpg.autostart $readini(%gpg.ini, config, gpg.autostart)
  55.     set %gpg.hideoptions $readini(%gpg.ini, config, gpg.hideoptions)
  56.  
  57.     if (!%gpg.executable) {
  58.         set %gpg.executable C:\Program Files\GNU\GnuPG\gpg.exe
  59.     }
  60. }
  61.  
  62. alias writeiniex {
  63.     if ($4) {
  64.         writeini $1 $2 $3 $4-
  65.     }
  66.     else {
  67.         remini $1 $2 $3
  68.     }
  69. }
  70.  
  71. alias gpg_save {
  72.     set %gpg.ini $scriptdir $+ gpgauth.ini
  73.     writeiniex %gpg.ini config gpg.executable %gpg.executable
  74.     writeiniex %gpg.ini config gpg.passphrase %gpg.passphrase
  75.     writeiniex %gpg.ini config gpg.sequence %gpg.sequence
  76.     writeiniex %gpg.ini config gpg.hideoptions %gpg.hideoptions
  77.     writeiniex %gpg.ini config gpg.autostart %gpg.autostart
  78. }
  79.  
  80. alias gpg_options {
  81.     dialog -m gpg_options gpg_options
  82. }
  83.  
  84. /**
  85.  * gpgauth
  86.  *
  87.  * Automated gpg authentication for #bitcoin-otc
  88.  *
  89.  * @param passphrase
  90.  */
  91.  
  92. alias gpgauth {
  93.     gpg_load
  94.     set %gpg.passphrase $1  
  95.     msg gribble ;;gpg eauth $me
  96. }
  97.  
  98. on *:TEXT:*:?: {    
  99.     if ($nick != gribble) {
  100.         return
  101.     }
  102.     else if ($regex($1-,/get your encrypted otp from (http:[^ ]+)/i)) {
  103.         var %url = $regml(1)
  104.         wget %url %gpg.passphrase
  105.         notice $me downloading %url
  106.     }
  107.     else if ($regex($1-,/You are now authenticated/i)) {
  108.         notice $me authenticated
  109.         msg gribble ;;letmein
  110.         ;closemsg gribble
  111.         .timer0 1 2 join #bitcoin-otc
  112.     }
  113.     else if ($regex($1-,/you must be present/i)) {
  114.         notice $me you have to join a channel first
  115.     }
  116.     else if ($regex($1-,/incorrect one-time password/i)) {
  117.         notice $me incorrect password
  118.     }
  119. }
  120.  
  121. alias gpg_quote {
  122.     return $chr(34) $+ $1 $+ $chr(34)
  123. }
  124.  
  125. alias wget_callback {  
  126.     notice $me decrypting message...
  127.  
  128.     var %key = $gpg_quote($scriptdir $+ $1)
  129.     var %out = $gpg_quote($scriptdir $+ stdout.txt)
  130.     var %err = $gpg_quote($scriptdir $+ stderr.txt)
  131.     var %exe = $gpg_quote(%gpg.executable)
  132.  
  133.     if (%gpg.passphrase) {
  134.         var %cmd = echo %gpg.passphrase $+ $chr($asc(|)) %exe --decrypt --quiet --batch --passphrase-fd 0 %key 1> %out 2> %err
  135.     }
  136.     else {
  137.         var %cmd = %exe --decrypt --quiet --batch %key 1> %out 2> %err
  138.     }
  139.  
  140.     run -np cmd /C %cmd
  141.  
  142.     .timer1 1 2 /gpg_everify %out %err
  143.  
  144.     ;echo %cmd
  145. }
  146.  
  147. alias gpg_everify {
  148.     var %challenge = $read($1,1)
  149.     if (%challenge) {
  150.         msg gribble ;;gpg everify %challenge
  151.         return
  152.     }
  153.     var %errmsg = $read($2,1)
  154.     if (%errmsg) {
  155.         notice $me %errmsg
  156.     }
  157. }
  158.  
  159. /**
  160.  * wget
  161.  *
  162.  * Simple function for downloading files via HTTP
  163.  * When finished, calls wget_callback <filename>
  164.  *
  165.  * @param url
  166.  */
  167.  
  168. alias wget {    
  169.     if ($regex($1,/http:/\/([^/]+)([^ ]+)/g)) {
  170.         %host = $regml(1)
  171.         %path = $regml(2)              
  172.         var %socket $+(wget,:,$nopath(%path))
  173.         if (!$sock(%socket)) {
  174.           sockopen %socket %host 80
  175.           sockmark %socket HEAD %host %path
  176.         }
  177.         else {
  178.             echo $color(info) -s * Socket already in use.
  179.         }
  180.     }
  181. }  
  182.  
  183. on *:SOCKOPEN:wget*:{
  184.     hadd -m ticks $sockname $ticks
  185.     var %file = $nopath($gettok($sock($sockname).mark,3,32))
  186.     var %fullfile = $+(",$scriptdir,%file,")
  187.     var %sckr = sockwrite -n $sockname, %^ = $gettok($sock($sockname).mark,3,32)
  188.     write -c %fullfile
  189.     %sckr GET $iif(left(%^,1) != $chr(47),$chr(47) $+ %^,%^) HTTP/1.0
  190.     %sckr HOST: $gettok($sock($sockname).mark,2,32)
  191.     %sckr ACCEPT: *.*
  192.     %sckr $crlf
  193. }
  194.  
  195. on *:SOCKREAD:wget*:{
  196.     if ($sockerr) {
  197.         echo $color(info) -s * Error: $sock($sockname).wsmsg
  198.         return
  199.     }
  200.      var %a
  201.     :begin
  202.     if ($gettok($sock($sockname).mark,1,32) == head) {
  203.         sockread %a
  204.     }
  205.     else {
  206.         sockread &b
  207.     }
  208.     if ($sockbr) {
  209.         tokenize 32 $sock($sockname).mark
  210.         if ($1 == HEAD) {
  211.             if (%a) {
  212.                 ;Catching the file size, avoiding the data header
  213.                 if ($gettok(%a,1,32) == Content-Length:) { var %totsize = $gettok(%a,2,32) }
  214.             }  
  215.             else {
  216.                 ;When there are no vars, we now we have to start binary downloading
  217.                 sockmark $sockname GET $2- %totsize
  218.             }
  219.         }
  220.         elseif ($1 == GET) {
  221.             ;Downloading ...
  222.             var %file = $+(",$scriptdir,$nopath($3),"), %cursize = $file(%file).size
  223.             var %totsize = $gettok($sock($sockname).mark,4,32)
  224.             bwrite %file -1 &b
  225.         }
  226.       goto begin
  227.     }
  228. }
  229.  
  230. on *:SOCKCLOSE:wget*:{
  231.     var %filename = $nopath($gettok($sock($sockname).mark,3,32))
  232.     wget_callback %filename
  233. }
  234.  
  235. /**
  236.  * GUI implementation
  237.  */
  238.  
  239. alias gpg_dialog_changed {
  240.     did -e $1 3
  241. }
  242.  
  243. on 1:dialog:gpg_options:sclick:1: {
  244.     ;close dialog
  245.     dialog -x $dname
  246.     gpg_authenticate
  247. }
  248.  
  249. on 1:dialog:gpg_options:sclick:10: {
  250.     ;open file dialog
  251.     var %file = $sfile($nofile(%gpg.executable) $+ *.exe)
  252.     if (%file) {
  253.         did -ra $dname 6 %file
  254.         gpg_dialog_changed $dname
  255.     }
  256. }
  257.  
  258. on 1:dialog:gpg_options:init:0: {
  259.     gpg_dialog_load $dname
  260. }
  261.  
  262. alias gpg_dialog_load {
  263.     did -ra $dname 6 %gpg.executable
  264.     did -ra $dname 7 %gpg.passphrase
  265. ;    did -ra $dname 13 %gpg.sequence
  266.     did $iif(%gpg.autostart, -c, -u) $dname 8
  267.     did $iif(%gpg.hideoptions, -c, -u) $dname 9
  268.     did -b $dname 3 ;disable apply button
  269.  
  270.     ;did -ra $dname 13 $me
  271.     ;did -c $dname 13 1
  272. }
  273.  
  274. alias gpg_dialog_save {  
  275.     set %gpg.executable $did($1,6)
  276.     set %gpg.passphrase $did($1,7)
  277. ;    set %gpg.sequence $did($1,13)
  278.     set %gpg.autostart $iif($did($1,8).state, 1, $null)
  279.     set %gpg.hideoptions $iif($did($1,9).state, 1, $null)
  280.     gpg_save
  281. }
  282.  
  283. on 1:dialog:gpg_options:sclick:3: {
  284.     ;apply button clicked
  285.     gpg_dialog_save $dname
  286.     did -b $dname $did
  287. }
  288.  
  289. on 1:dialog:gpg_options:edit,sclick:6,7,8,9: {
  290.     gpg_dialog_changed $dname
  291. }
  292.  
  293. on 1:dialog:gpg_options:sclick:2: {
  294.     gpg_dialog_save $dname
  295. }
  296.  
  297. dialog gpg_options {
  298.   title "GPG Authentication"
  299.   size -1 -1 202 96
  300.   option dbu
  301.   text "Path to gpg.exe (usually C:\Program Files\GNU\GnuPG\gpg.exe):", 4, 5 4 185 9
  302.   edit "", 6, 5 12 178 11, autohs limit 0
  303.   button "...", 10, 185 12 12 11
  304.   text "Passphrase (leave blank if you run /gpgauth manually for security reasons):", 5, 5 28 186 8
  305.   edit "", 7, 5 37 192 11, pass
  306.   check "Autorun after connection", 8, 5 54 90 8, disable
  307.   check "Remove from popup menu (use /gpg_options)", 9, 5 66 126 7, disable
  308.   button "Authenticate", 1, 4 79 44 12
  309.   button "OK", 2, 71 79 40 12, ok
  310.   button "Apply", 3, 157 79 40 12
  311.   button "Cancel", 11, 114 79 40 12, cancel
  312. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement