Annotation of embedaddon/curl/tests/sshhelp.pm, revision 1.1.1.1

1.1       misho       1: #***************************************************************************
                      2: #                                  _   _ ____  _
                      3: #  Project                     ___| | | |  _ \| |
                      4: #                             / __| | | | |_) | |
                      5: #                            | (__| |_| |  _ <| |___
                      6: #                             \___|\___/|_| \_\_____|
                      7: #
                      8: # Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
                      9: #
                     10: # This software is licensed as described in the file COPYING, which
                     11: # you should have received as part of this distribution. The terms
                     12: # are also available at https://curl.haxx.se/docs/copyright.html.
                     13: #
                     14: # You may opt to use, copy, modify, merge, publish, distribute and/or sell
                     15: # copies of the Software, and permit persons to whom the Software is
                     16: # furnished to do so, under the terms of the COPYING file.
                     17: #
                     18: # This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
                     19: # KIND, either express or implied.
                     20: #
                     21: #***************************************************************************
                     22: 
                     23: package sshhelp;
                     24: 
                     25: use strict;
                     26: use warnings;
                     27: use Exporter;
                     28: use File::Spec;
                     29: 
                     30: 
                     31: #***************************************************************************
                     32: # Global symbols allowed without explicit package name
                     33: #
                     34: use vars qw(
                     35:     @ISA
                     36:     @EXPORT_OK
                     37:     $sshdexe
                     38:     $sshexe
                     39:     $sftpsrvexe
                     40:     $sftpexe
                     41:     $sshkeygenexe
                     42:     $httptlssrvexe
                     43:     $sshdconfig
                     44:     $sshconfig
                     45:     $sftpconfig
                     46:     $knownhosts
                     47:     $sshdlog
                     48:     $sshlog
                     49:     $sftplog
                     50:     $sftpcmds
                     51:     $hstprvkeyf
                     52:     $hstpubkeyf
                     53:     $hstpubmd5f
                     54:     $cliprvkeyf
                     55:     $clipubkeyf
                     56:     @sftppath
                     57:     @httptlssrvpath
                     58:     );
                     59: 
                     60: 
                     61: #***************************************************************************
                     62: # Inherit Exporter's capabilities
                     63: #
                     64: @ISA = qw(Exporter);
                     65: 
                     66: 
                     67: #***************************************************************************
                     68: # Global symbols this module will export upon request
                     69: #
                     70: @EXPORT_OK = qw(
                     71:     $sshdexe
                     72:     $sshexe
                     73:     $sftpsrvexe
                     74:     $sftpexe
                     75:     $sshkeygenexe
                     76:     $sshdconfig
                     77:     $sshconfig
                     78:     $sftpconfig
                     79:     $knownhosts
                     80:     $sshdlog
                     81:     $sshlog
                     82:     $sftplog
                     83:     $sftpcmds
                     84:     $hstprvkeyf
                     85:     $hstpubkeyf
                     86:     $hstpubmd5f
                     87:     $cliprvkeyf
                     88:     $clipubkeyf
                     89:     display_sshdconfig
                     90:     display_sshconfig
                     91:     display_sftpconfig
                     92:     display_sshdlog
                     93:     display_sshlog
                     94:     display_sftplog
                     95:     dump_array
                     96:     exe_ext
                     97:     find_sshd
                     98:     find_ssh
                     99:     find_sftpsrv
                    100:     find_sftp
                    101:     find_sshkeygen
                    102:     find_httptlssrv
                    103:     logmsg
                    104:     sshversioninfo
                    105:     );
                    106: 
                    107: 
                    108: #***************************************************************************
                    109: # Global variables initialization
                    110: #
                    111: $sshdexe         = 'sshd'        .exe_ext('SSH'); # base name and ext of ssh daemon
                    112: $sshexe          = 'ssh'         .exe_ext('SSH'); # base name and ext of ssh client
                    113: $sftpsrvexe      = 'sftp-server' .exe_ext('SSH'); # base name and ext of sftp-server
                    114: $sftpexe         = 'sftp'        .exe_ext('SSH'); # base name and ext of sftp client
                    115: $sshkeygenexe    = 'ssh-keygen'  .exe_ext('SSH'); # base name and ext of ssh-keygen
                    116: $httptlssrvexe   = 'gnutls-serv' .exe_ext('SSH'); # base name and ext of gnutls-serv
                    117: $sshdconfig      = 'curl_sshd_config';       # ssh daemon config file
                    118: $sshconfig       = 'curl_ssh_config';        # ssh client config file
                    119: $sftpconfig      = 'curl_sftp_config';       # sftp client config file
                    120: $sshdlog         = undef;                    # ssh daemon log file
                    121: $sshlog          = undef;                    # ssh client log file
                    122: $sftplog         = undef;                    # sftp client log file
                    123: $sftpcmds        = 'curl_sftp_cmds';         # sftp client commands batch file
                    124: $knownhosts      = 'curl_client_knownhosts'; # ssh knownhosts file
                    125: $hstprvkeyf      = 'curl_host_rsa_key';      # host private key file
                    126: $hstpubkeyf      = 'curl_host_rsa_key.pub';  # host public key file
                    127: $hstpubmd5f      = 'curl_host_rsa_key.pub_md5';  # md5 hash of host public key
                    128: $cliprvkeyf      = 'curl_client_key';        # client private key file
                    129: $clipubkeyf      = 'curl_client_key.pub';    # client public key file
                    130: 
                    131: 
                    132: #***************************************************************************
                    133: # Absolute paths where to look for sftp-server plugin, when not in PATH
                    134: #
                    135: @sftppath = qw(
                    136:     /usr/lib/openssh
                    137:     /usr/libexec/openssh
                    138:     /usr/libexec
                    139:     /usr/local/libexec
                    140:     /opt/local/libexec
                    141:     /usr/lib/ssh
                    142:     /usr/libexec/ssh
                    143:     /usr/sbin
                    144:     /usr/lib
                    145:     /usr/lib/ssh/openssh
                    146:     /usr/lib64/ssh
                    147:     /usr/lib64/misc
                    148:     /usr/lib/misc
                    149:     /usr/local/sbin
                    150:     /usr/freeware/bin
                    151:     /usr/freeware/sbin
                    152:     /usr/freeware/libexec
                    153:     /opt/ssh/sbin
                    154:     /opt/ssh/libexec
                    155:     );
                    156: 
                    157: 
                    158: #***************************************************************************
                    159: # Absolute paths where to look for httptlssrv (gnutls-serv), when not in PATH
                    160: #
                    161: @httptlssrvpath = qw(
                    162:     /usr/sbin
                    163:     /usr/libexec
                    164:     /usr/lib
                    165:     /usr/lib/misc
                    166:     /usr/lib64/misc
                    167:     /usr/local/bin
                    168:     /usr/local/sbin
                    169:     /usr/local/libexec
                    170:     /opt/local/bin
                    171:     /opt/local/sbin
                    172:     /opt/local/libexec
                    173:     /usr/freeware/bin
                    174:     /usr/freeware/sbin
                    175:     /usr/freeware/libexec
                    176:     /opt/gnutls/bin
                    177:     /opt/gnutls/sbin
                    178:     /opt/gnutls/libexec
                    179:     );
                    180: 
                    181: 
                    182: #***************************************************************************
                    183: # Return file extension for executable files on this operating system
                    184: #
                    185: sub exe_ext {
                    186:     my ($component, @arr) = @_;
                    187:     if ($ENV{'CURL_TEST_EXE_EXT'}) {
                    188:         return $ENV{'CURL_TEST_EXE_EXT'};
                    189:     }
                    190:     if ($ENV{'CURL_TEST_EXE_EXT_'.$component}) {
                    191:         return $ENV{'CURL_TEST_EXE_EXT_'.$component};
                    192:     }
                    193:     if ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys' ||
                    194:         $^O eq 'dos' || $^O eq 'os2') {
                    195:         return '.exe';
                    196:     }
                    197: }
                    198: 
                    199: 
                    200: #***************************************************************************
                    201: # Create or overwrite the given file with lines from an array of strings
                    202: #
                    203: sub dump_array {
                    204:     my ($filename, @arr) = @_;
                    205:     my $error;
                    206: 
                    207:     if(!$filename) {
                    208:         $error = 'Error: Missing argument 1 for dump_array()';
                    209:     }
                    210:     elsif(open(TEXTFH, ">$filename")) {
                    211:         foreach my $line (@arr) {
                    212:             $line .= "\n" unless($line =~ /\n$/);
                    213:             print TEXTFH $line;
                    214:         }
                    215:         if(!close(TEXTFH)) {
                    216:             $error = "Error: cannot close file $filename";
                    217:         }
                    218:     }
                    219:     else {
                    220:         $error = "Error: cannot write file $filename";
                    221:     }
                    222:     return $error;
                    223: }
                    224: 
                    225: 
                    226: #***************************************************************************
                    227: # Display a message
                    228: #
                    229: sub logmsg {
                    230:     my ($line) = @_;
                    231:     chomp $line if($line);
                    232:     $line .= "\n";
                    233:     print "$line";
                    234: }
                    235: 
                    236: 
                    237: #***************************************************************************
                    238: # Display contents of the given file
                    239: #
                    240: sub display_file {
                    241:     my $filename = $_[0];
                    242:     print "=== Start of file $filename\n";
                    243:     if(open(DISPLAYFH, "<$filename")) {
                    244:         while(my $line = <DISPLAYFH>) {
                    245:             print "$line";
                    246:         }
                    247:         close DISPLAYFH;
                    248:     }
                    249:     print "=== End of file $filename\n";
                    250: }
                    251: 
                    252: 
                    253: #***************************************************************************
                    254: # Display contents of the ssh daemon config file
                    255: #
                    256: sub display_sshdconfig {
                    257:     display_file($sshdconfig);
                    258: }
                    259: 
                    260: 
                    261: #***************************************************************************
                    262: # Display contents of the ssh client config file
                    263: #
                    264: sub display_sshconfig {
                    265:     display_file($sshconfig);
                    266: }
                    267: 
                    268: 
                    269: #***************************************************************************
                    270: # Display contents of the sftp client config file
                    271: #
                    272: sub display_sftpconfig {
                    273:     display_file($sftpconfig);
                    274: }
                    275: 
                    276: 
                    277: #***************************************************************************
                    278: # Display contents of the ssh daemon log file
                    279: #
                    280: sub display_sshdlog {
                    281:     die "error: \$sshdlog uninitialized" if(not defined $sshdlog);
                    282:     display_file($sshdlog);
                    283: }
                    284: 
                    285: 
                    286: #***************************************************************************
                    287: # Display contents of the ssh client log file
                    288: #
                    289: sub display_sshlog {
                    290:     die "error: \$sshlog uninitialized" if(not defined $sshlog);
                    291:     display_file($sshlog);
                    292: }
                    293: 
                    294: 
                    295: #***************************************************************************
                    296: # Display contents of the sftp client log file
                    297: #
                    298: sub display_sftplog {
                    299:     die "error: \$sftplog uninitialized" if(not defined $sftplog);
                    300:     display_file($sftplog);
                    301: }
                    302: 
                    303: 
                    304: #***************************************************************************
                    305: # Find a file somewhere in the given path
                    306: #
                    307: sub find_file {
                    308:     my $fn = $_[0];
                    309:     shift;
                    310:     my @path = @_;
                    311:     foreach (@path) {
                    312:         my $file = File::Spec->catfile($_, $fn);
                    313:         if(-e $file && ! -d $file) {
                    314:             return $file;
                    315:         }
                    316:     }
                    317: }
                    318: 
                    319: 
                    320: #***************************************************************************
                    321: # Find an executable file somewhere in the given path
                    322: #
                    323: sub find_exe_file {
                    324:     my $fn = $_[0];
                    325:     shift;
                    326:     my @path = @_;
                    327:     my $xext = exe_ext('SSH');
                    328:     foreach (@path) {
                    329:         my $file = File::Spec->catfile($_, $fn);
                    330:         if(-e $file && ! -d $file) {
                    331:             return $file if(-x $file);
                    332:             return $file if(($xext) && (lc($file) =~ /\Q$xext\E$/));
                    333:         }
                    334:     }
                    335: }
                    336: 
                    337: 
                    338: #***************************************************************************
                    339: # Find a file in environment path or in our sftppath
                    340: #
                    341: sub find_file_spath {
                    342:     my $filename = $_[0];
                    343:     my @spath;
                    344:     push(@spath, File::Spec->path());
                    345:     push(@spath, @sftppath);
                    346:     return find_file($filename, @spath);
                    347: }
                    348: 
                    349: 
                    350: #***************************************************************************
                    351: # Find an executable file in environment path or in our httptlssrvpath
                    352: #
                    353: sub find_exe_file_hpath {
                    354:     my $filename = $_[0];
                    355:     my @hpath;
                    356:     push(@hpath, File::Spec->path());
                    357:     push(@hpath, @httptlssrvpath);
                    358:     return find_exe_file($filename, @hpath);
                    359: }
                    360: 
                    361: 
                    362: #***************************************************************************
                    363: # Find ssh daemon and return canonical filename
                    364: #
                    365: sub find_sshd {
                    366:     return find_file_spath($sshdexe);
                    367: }
                    368: 
                    369: 
                    370: #***************************************************************************
                    371: # Find ssh client and return canonical filename
                    372: #
                    373: sub find_ssh {
                    374:     return find_file_spath($sshexe);
                    375: }
                    376: 
                    377: 
                    378: #***************************************************************************
                    379: # Find sftp-server plugin and return canonical filename
                    380: #
                    381: sub find_sftpsrv {
                    382:     return find_file_spath($sftpsrvexe);
                    383: }
                    384: 
                    385: 
                    386: #***************************************************************************
                    387: # Find sftp client and return canonical filename
                    388: #
                    389: sub find_sftp {
                    390:     return find_file_spath($sftpexe);
                    391: }
                    392: 
                    393: 
                    394: #***************************************************************************
                    395: # Find ssh-keygen and return canonical filename
                    396: #
                    397: sub find_sshkeygen {
                    398:     return find_file_spath($sshkeygenexe);
                    399: }
                    400: 
                    401: 
                    402: #***************************************************************************
                    403: # Find httptlssrv (gnutls-serv) and return canonical filename
                    404: #
                    405: sub find_httptlssrv {
                    406:     return find_exe_file_hpath($httptlssrvexe);
                    407: }
                    408: 
                    409: 
                    410: #***************************************************************************
                    411: # Return version info for the given ssh client or server binaries
                    412: #
                    413: sub sshversioninfo {
                    414:     my $sshbin = $_[0]; # canonical filename
                    415:     my $major;
                    416:     my $minor;
                    417:     my $patch;
                    418:     my $sshid;
                    419:     my $versnum;
                    420:     my $versstr;
                    421:     my $error;
                    422: 
                    423:     if(!$sshbin) {
                    424:         $error = 'Error: Missing argument 1 for sshversioninfo()';
                    425:     }
                    426:     elsif(! -x $sshbin) {
                    427:         $error = "Error: cannot read or execute $sshbin";
                    428:     }
                    429:     else {
                    430:         my $cmd = ($sshbin =~ /$sshdexe$/) ? "\"$sshbin\" -?" : "\"$sshbin\" -V";
                    431:         $error = "$cmd\n";
                    432:         foreach my $tmpstr (qx($cmd 2>&1)) {
                    433:             if($tmpstr =~ /OpenSSH[_-](\d+)\.(\d+)(\.(\d+))*/i) {
                    434:                 $major = $1;
                    435:                 $minor = $2;
                    436:                 $patch = $4?$4:0;
                    437:                 $sshid = 'OpenSSH';
                    438:                 $versnum = (100*$major) + (10*$minor) + $patch;
                    439:                 $versstr = "$sshid $major.$minor.$patch";
                    440:                 $error = undef;
                    441:                 last;
                    442:             }
                    443:             if($tmpstr =~ /OpenSSH[_-]for[_-]Windows[_-](\d+)\.(\d+)(\.(\d+))*/i) {
                    444:                 $major = $1;
                    445:                 $minor = $2;
                    446:                 $patch = $4?$4:0;
                    447:                 $sshid = 'OpenSSH-Windows';
                    448:                 $versnum = (100*$major) + (10*$minor) + $patch;
                    449:                 $versstr = "$sshid $major.$minor.$patch";
                    450:                 $error = undef;
                    451:                 last;
                    452:             }
                    453:             if($tmpstr =~ /Sun[_-]SSH[_-](\d+)\.(\d+)(\.(\d+))*/i) {
                    454:                 $major = $1;
                    455:                 $minor = $2;
                    456:                 $patch = $4?$4:0;
                    457:                 $sshid = 'SunSSH';
                    458:                 $versnum = (100*$major) + (10*$minor) + $patch;
                    459:                 $versstr = "$sshid $major.$minor.$patch";
                    460:                 $error = undef;
                    461:                 last;
                    462:             }
                    463:             $error .= $tmpstr;
                    464:         }
                    465:         chomp $error if($error);
                    466:     }
                    467:     return ($sshid, $versnum, $versstr, $error);
                    468: }
                    469: 
                    470: 
                    471: #***************************************************************************
                    472: # End of library
                    473: 1;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>