This patch set up the IO::Socket::SSL that all proxy(transparent, https and http) and non proxy settings will work. Now the server will also be verified. --- PVE/API2/Subscription.pm | 22 +++++++++++----------- PVE/APLInfo.pm | 35 ++++++++++++++++++++++++----------- 2 files changed, 35 insertions(+), 22 deletions(-)
diff --git a/PVE/API2/Subscription.pm b/PVE/API2/Subscription.pm index 47cd408..0bf2066 100644 --- a/PVE/API2/Subscription.pm +++ b/PVE/API2/Subscription.pm @@ -224,19 +224,19 @@ sub check_subscription { $req->header('Content-Length' => length($content)); $req->content($content); - my $ua = LWP::UserAgent->new(protocols_allowed => ['https'], timeout => 30); - $ua->ssl_opts(verify_hostname => 0); # don't care + my $ua = LWP::UserAgent->new( timeout => 30); - # HACK: LWP does not use proxy 'CONNECT' for https - local $ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = "Net::SSL"; - local ($ENV{HTTPS_PROXY}, $ENV{HTTPS_PROXY_USERNAME}, $ENV{HTTPS_PROXY_PASSWORD}); + # HACK: LWP to be sure IO::Socket::SSL is ued. + local $ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = "IO::Socket::SSL"; if ($proxy) { - # some proxies reject connection if UserAgent header is not set - Net::SSL::send_useragent_to_proxy(1); - ($ENV{HTTPS_PROXY}, $ENV{HTTPS_PROXY_USERNAME}, $ENV{HTTPS_PROXY_PASSWORD}) = - PVE::API2Tools::parse_http_proxy($proxy); - $ua->proxy(['http'], $proxy); + my ($host, $user, $passwd) = PVE::API2Tools::parse_http_proxy($proxy); + + if ($user && $passwd) { + $ua->proxy(['https', 'http'], 'connect://'."$user:$passwd".'@'.$host); + } else { + $ua->proxy(['https', 'http'], 'connect://'.$host); + } } else { $ua->env_proxy; } @@ -344,7 +344,7 @@ __PACKAGE__->register_method ({ my $age = time() - $info->{checktime}; return undef if $age < $localkeydays*60*60*24; } - + my $key = $info->{key}; $info = check_subscription($key); diff --git a/PVE/APLInfo.pm b/PVE/APLInfo.pm index 16e60a5..ec49088 100644 --- a/PVE/APLInfo.pm +++ b/PVE/APLInfo.pm @@ -144,10 +144,29 @@ sub read_aplinfo { } sub url_get { - my ($ua, $url, $file, $logfh) = @_; + my ($ua, $url, $file, $logfh, $proxy) = @_; my $req = HTTP::Request->new(GET => $url); + if ($proxy) { + my ($host, $user, $passwd) = PVE::API2Tools::parse_http_proxy($proxy); + if ($url =~ m/^https:\/\//) { + if ($user && $passwd) { + $ua->proxy(['https', 'http'], 'connect://'."$user:$passwd".'@'.$host); + } else { + $ua->proxy(['https', 'http'], 'connect://'.$host); + } + } else { + local ($ENV{HTTPS_PROXY}, $ENV{HTTPS_PROXY_USERNAME}, $ENV{HTTPS_PROXY_PASSWORD}); + ($ENV{HTTPS_PROXY}, $ENV{HTTPS_PROXY_USERNAME}, $ENV{HTTPS_PROXY_PASSWORD}) = + PVE::API2Tools::parse_http_proxy($proxy); + + $ua->proxy(['http', 'https'], $proxy); + } + } else { + $ua->env_proxy; + } + logmsg ($logfh, "start download $url"); my $res = $ua->request($req, $file); @@ -162,7 +181,7 @@ sub url_get { } sub download_aplinfo { - my ($ua, $aplurl, $host, $logfd) = @_; + my ($ua, $aplurl, $host, $logfd, $proxy) = @_; my $aplsrcurl = "$aplurl/aplinfo.dat.gz"; my $aplsigurl = "$aplurl/aplinfo.dat.asc"; @@ -173,11 +192,11 @@ sub download_aplinfo { eval { - if (url_get($ua, $aplsigurl, $sigfn, $logfd) != 0) { + if (url_get($ua, $aplsigurl, $sigfn, $logfd, $proxy) != 0) { die "update failed - no signature file '$sigfn'\n"; } - if (url_get($ua, $aplsrcurl, $tmpgz, $logfd) != 0) { + if (url_get($ua, $aplsrcurl, $tmpgz, $logfd, $proxy) != 0) { die "update failed - no data file '$aplsrcurl'\n"; } @@ -272,12 +291,6 @@ sub update { my $ua = LWP::UserAgent->new; $ua->agent("PVE/1.0"); - if ($proxy) { - $ua->proxy(['http', 'https'], $proxy); - } else { - $ua->env_proxy; - } - my $urls = get_apl_sources(); mkdir $aplinfodir; @@ -287,7 +300,7 @@ sub update { eval { my $uri = URI->new($aplurl); my $host = $uri->host(); - download_aplinfo($ua, $aplurl, $host, $logfd); + download_aplinfo($ua, $aplurl, $host, $logfd, $proxy); }; if (my $err = $@) { logmsg ($logfd, $err); -- 2.1.4 _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com http://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel