Index: client/1.0/pkgd.eagle ================================================================== --- client/1.0/pkgd.eagle +++ client/1.0/pkgd.eagle @@ -34,10 +34,20 @@ if {![info exists clientDirectory]} then { set clientDirectory [file dirname $script] } + # + # NOTE: This is the HTTP(S) login cookie to use when downloading files + # from the package file server. + # + variable loginCookie; # DEFAULT: NONE + + if {![info exists loginCookie]} then { + set loginCookie [list] + } + # # NOTE: Prevent progress messages from being displayed while downloading # from the repository, etc? By default, this is enabled. # variable quiet; # DEFAULT: true @@ -45,26 +55,40 @@ if {![info exists quiet]} then { set quiet true } # - # NOTE: The base URI for the package distribution web site. + # NOTE: The base URI used to build the URIs for the package file server. # - variable baseUri; # DEFAULT: https://urn.to/r/pkgd + variable baseUri; # DEFAULT: https://urn.to/r if {![info exists baseUri]} then { - set baseUri https://urn.to/r/pkgd + set baseUri https://urn.to/r + } + + # + # NOTE: The URI where a login request may be sent. This should return a + # payload containing the necessary HTTP(S) cookie information. + # + variable loginUri; # DEFAULT: ${baseUri}/pkgd_login?... + + if {![info exists loginUri]} then { + set loginUri [string trim { + ${baseUri}/pkgd_login?name=${userName}&password=${password} + }] } # # NOTE: The URI where a single package file may be found. This file will # belong to a specific version of one package. # - variable downloadUri; # DEFAULT: ${baseUri}?...&filename=${fileName} + variable downloadUri; # DEFAULT: ${baseUri}/pkgd_file?... if {![info exists downloadUri]} then { - set downloadUri {${baseUri}?download&ci=trunk&filename=${fileName}} + set downloadUri [string trim { + ${baseUri}/pkgd_file?download&ci=trunk&filename=${fileName} + }] } # # NOTE: The root directory where any persistent packages will be saved. # @@ -126,10 +150,11 @@ # NOTE: This procedure returns non-zero if the specified file seems to be # a Harpy script certificate file. The fileName argument is the name # of the file to check, which may or may not exist. The nameOnly # argument should be non-zero to ignore the contents of the file. # + # proc isHarpyCertificateFileName { fileName nameOnly } { if {[string length $fileName] == 0} then { return false } @@ -230,10 +255,113 @@ } else { error "unsupported language" } } + # + # NOTE: This procedure issues a request to an HTTP(S) server. It returns + # the raw response data verbatim. It may raise a script error. It + # will always use the currently configured HTTP(S) login cookie, if + # any; therefore, it should really only be used for requests to the + # package file server. The uri argument is the fully qualified URI + # to request. + # + proc getPackageFile { uri } { + variable loginCookie + variable quiet + + if {[isEagle]} then { + if {![object invoke Eagle._Tests.Default \ + TestHasScriptNewWebClientCallback ""]} then { + set error null + + set code [object invoke Eagle._Tests.Default \ + TestSetScriptNewWebClientCallback "" true true error] + + if {$code ne "Ok"} then { + error [getStringFromObjectHandle $error] + } + } + + if {[info exists loginCookie] && [llength $loginCookie] == 2} then { + set script [object create String { + if {[methodName ToString] eq "GetWebRequest"} then { + webRequest Headers.Add Cookie [join $loginCookie =] + } + }] + + return [uri download -inline -webclientdata $script -- $uri] + } else { + return [uri download -inline -- $uri] + } + } else { + set options [list -binary true] + + if {[info exists loginCookie] && [llength $loginCookie] == 2} then { + lappend options -headers [list Cookie [join $loginCookie =]] + } + + return [eval ::PackageRepository::getFileViaHttp \ + [list $uri] [list 20] [list stdout] [list $quiet] $options] + } + } + + # + # NOTE: This procedure resets the currently configured login cookie, if + # any, and then attempts to login using the specified user name and + # password. Upon success, it will set the login cookie to the one + # from the raw response data. Upon failure, a script error will be + # raised. The userName argument must be the name of a package file + # server user with at least Fossil Check-Out (o) permissions on the + # package file server. The password argument must be the plaintext + # password that is associated with the specified user name. + # + # + proc resetCookieAndLogin { userName password } { + variable baseUri + variable loginCookie + variable loginUri + + # + # NOTE: Build the full URI for the login request. + # + set uri [subst $loginUri] + + # + # NOTE: Reset the old login cookie, if any. Then, issue a new login + # request, capturing the raw response data. + # + set loginCookie [list]; set data [getPackageFile $uri] + + # + # NOTE: Attempt to extract the necessary values from the raw response + # data. + # + set pattern(1) {"authToken":"(.*?)"}; # TODO: *HACK* Keep updated. + + if {![regexp -- $pattern(1) $data dummy authToken]} then { + error "login response missing \"authToken\"" + } + + set pattern(2) {"loginCookieName":"(.*?)"}; # TODO: *HACK* Keep updated. + + if {![regexp -- $pattern(2) $data dummy loginCookieName]} then { + error "login response missing \"loginCookieName\"" + } + + # + # NOTE: Set the login cookie to the one freshly extracted from the raw + # response data. + # + set loginCookie [list $loginCookieName $authToken] + + # + # NOTE: Always return an empty string (i.e. and not the login data). + # + return "" + } + # # NOTE: This procedure checks if there is a higher version available of the # specified package on the package file server. The language argument # must be one of the literal strings "eagle", "tcl", or "client". The # version argument must be one of the literal strings "8.4", "8.5", or @@ -276,11 +404,16 @@ set compare [package vcompare \ [string trim [readFile $downloadFileName]] \ [string trim [readFile $localFileName]]] - file delete -force -- $temporaryDirectory + if {[isEagle]} then { + file delete -recursive -- $temporaryDirectory + } else { + file delete -force -- $temporaryDirectory + } + return [expr {$compare > 0}] } # # NOTE: This procedure downloads a single file from the package file server, @@ -300,11 +433,10 @@ # downloaded and verified for the downloaded file. # proc downloadOneFile { language version fileName localFileName usePgp } { variable baseUri variable downloadUri - variable quiet # # NOTE: First, build the full relative file name to download from # the remote package repository. # @@ -313,16 +445,11 @@ # # NOTE: Then, in one step, download the file from the package file # server and write it to the specified local file. # - if {[isEagle]} then { - writeFile $localFileName [interp readorgetscriptfile -- "" $uri] - } else { - writeFile $localFileName [::PackageRepository::getFileViaHttp \ - $uri 20 stdout $quiet -binary true] - } + writeFile $localFileName [getPackageFile $uri] # # NOTE: Is use of OpenPGP for signature verification enabled? Also, # did we just download an OpenPGP signature file? # @@ -459,11 +586,15 @@ addToAutoPath $language $downloadDirectory } } if {$persistent} then { - file delete -force -- $temporaryDirectory + if {[isEagle]} then { + file delete -recursive -- $temporaryDirectory + } else { + file delete -force -- $temporaryDirectory + } } return $downloadDirectories } Index: client/1.0/pkgd.eagle.asc ================================================================== --- client/1.0/pkgd.eagle.asc +++ client/1.0/pkgd.eagle.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJXuR79AAoJEFAslq9JXcLZGkcP/0Rusi/Ck7BwaruO7aJiLP3Y -WhlZLxknxnnyMObJbg8vE0HmwYVadX69HitKuclGuS8pM1tSvtT2fBzrX/W2MYfk -8ZtBzkid6na0fgjfQlp+aYSrZFPuvARIV99jVbsR7ettCX/yEmHerrPZ3UobGV+a -8pUpsuV9L/cSfJqUxi1WAIk1U+GvZOx3nhXnb2nMC+DsGEDsbC6TxLikrrMMEL2L -+JLvSCaM5uPqU+bRWB5zBxvM6wb528k1N8PhpmSDxqlgAAee/edkaQ1u61M7hmHL -QM8UOX6Ngska2VUTVz1hFYiQNBwt6jTVNJLn9NrkTdZBPQRdxUC9hK08RkkqBMi0 -nD2B34Fmm7sgUYl5Vy75fGhFMYftyUIBdIcGC8aHCOk9ha4sghqPYLWE73OrF3QD -AAr2ukrpfCiGqh0/wzL3CvC6sbYFSLTA6c7CAmtuDeDlm51FPjEovnPwVoLn8gWt -ST6ie3Oa/l1de7yFcTdYCCLXyILmJpgvu2ttcm21uRIy3NCxAVe7xPdBb8lUKcIu -QNF3RXm63zON46FEQL5PPbzwLbY0iV6fsrZY54d7M8bECuM3aVDdgH9wFNlO7Ghx -mLlD/cua3lnBOgE/pv21wfZ10COuNsX+Re1eoAx52koi6ueq6NLxxFO0K7nDSvln -ZydAFmqYE1FV5IuEoJcg -=xWb0 +iQIcBAABCAAGBQJXuV/cAAoJEFAslq9JXcLZTIoQALdsxhprLPHT9pQCm02Gzc+g +ruhWk4FYThLYOJPWF/R2K+X9M2HjCGEdoY1x/VDkMbArn6iE7gndZz6NMyZL7gbK +Y2lQf7eBW/U/eF63xFeVsgWdU5wRB9SVOkghIO0LRH6hO3zZvKTFNf9rU88kD5KI +o4/RY60UTWgx8rBniI9gj5v5V6qvpmtLBlMTT6hLq7PU1STKsMof2UkDYHNxZcC2 +Z86xHJI0LS3LV8sM2Ey6BpuS6GXPCApg2IeRJs2M/NRVRJLV1HcbmiMBrzNH0Av9 +t64Yv49hGX043nGbw7SnAQbltFlWjXSoHqiyaoe+okVT19u9RwdcEESOVDA1L9vm +ajk/R/QmrW1p75rncjlo9yCyd+BLupoWC1vftbQoWomrptgmqcMuevO2PniDcaO6 +zPACXpD+w3XIk9kSpgibm4edIxvT+bztUBMhyNg2W1kT6zwGyyrrLDpnUcgz8u+j +wTmgTbHnbC2GSDbI3dU33ZBDrxEp6B8ZqFHoMIdPOD1EUdXKoEOww7hyEtXv3mnj +vapl6529XogSr7CVTtXg1VpiJUpA526szANmP8XCJrtQBEbDheN6REHtzs8cNFvM +o2ndOjC3Ox+BZSLHB9Kt88+h7TN87OOcEJcahbvmJXpzcTBwr+9ox2vvMxMAXowI +qGP+7UdKk2U5p7l7XJV4 +=k7R4 -----END PGP SIGNATURE----- Index: client/1.0/pkgd.eagle.harpy ================================================================== --- client/1.0/pkgd.eagle.harpy +++ client/1.0/pkgd.eagle.harpy @@ -19,32 +19,32 @@ None Mistachkin Systems - 179914be-ec09-4558-854a-5105c9c67c2d + e5f21c61-7d36-4135-ac77-068ef196d385 SHA512 Script - 2016-08-21T03:24:27.6748516Z + 2016-08-21T08:01:24.6709453Z -1.00:00:00 0x2c322765603b5278 - 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 Index: client/1.0/pkgd.eagle.harpy.asc ================================================================== --- client/1.0/pkgd.eagle.harpy.asc +++ client/1.0/pkgd.eagle.harpy.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJXuR8AAAoJEFAslq9JXcLZf3EQAI5FUpROmsegg1bL5/2Iqg+j -RI9FXeMmqUaSNlFQ0gs/GwBnoRnRUQw8LhoDITdM2ATtLJ9RLJ3NVxdRt+sVfcv7 -1JSZR9mFwzix4IT5KEYhr5upvNNHCwh9JeDypnn4vmKlCauUjlQFhlIBs2zWcn2G -eXclfl6DEoCbicqHOqCxjyz6AKCLlgtX+jHEjCovfaa+W0q+RRDeu/u8LTu3bQrc -sQjWNaUHDER7ihqDxHwVDgxVznLX8juggeZVTue5BB0LyERx0CY8QcECirQvYKqG -l+z7I90C9P288+ZEQYHHiwqeon0QBL/R39W+g4wbz9wV/e3gqj4Osf0Ij4tfXQ1c -9taPi72qCiNnKnng+A2z14ObGQaswsqEbw8QoqdB7ye7Vlkc4goDAc3lqXliDxGF -Cd49UwdtdQIeQDy1XdIcjbMHOe2StS5mm8wbV46CsJtOSO1o4zIdKoK51n81XsTl -W8Ev/eWNhUmKkgdyVrbGNXlG7S3eaQDg+JriYUgdH8UZWiutnfD2xlJ8fxta9+o4 -NKYFYbZIVdICDNqWCI2v3PxjQHQnFpnmDAIcZgS5TbBz9K953dP9AYhTmqSU7stV -8rJ5TxKjIzMNc4uzllWUKRG0Z6Os6t9Aq3v0FBGgX0ncxsFTnkmGVJ5qlzNmQy7C -+PdzIKpNZE2xKEaGLU/9 -=gNJp +iQIcBAABCAAGBQJXuV/eAAoJEFAslq9JXcLZvSsP/2KjJk+ZlEti+gIcGN1+p7Kg +c8KU6XywO47u8kiJ9Lasc/i8cegjRFXJEsy3EcAi3ZRQ2UVK2WnnHIB74dtLhuh3 +Wp9no0qJGMAnPmAtCQYeaNboEcErfcTgdKAxRly9S6g4ynCFDjkAMWJFM5eW6p0D +N2FXJ3iveQIG0RkWFIdUF/s0GhKi9834uhyK91D4AKwLaol25SKHwiqCQf4KNnPK +MQYEF9ZMXRbxL+lV8mutBmRv7hQbKWWxB/WcuFcdwftVin8b+hoihXBLXcQ3dCXs +EuRKBoRqgvcLCmkj6SJP/JoiO5jqH71isJTbppcedkmRXFpiRYLCV2nXYTcpljV1 +ObR9dVj0MN/cS/IjZk65723HgtUqmdAseBexL0043TxV7z0o3/GjuThWr6Fs0HQJ +Rn5uNvFSkF/dSJZi5SDUGKDCqwQfOMMMZWHaircvrzNVTMR9P1wlb+ikX/s9iiE1 +5ScMSZsRZ4pFuoAg6Y1tFYAg6lpHLUrRw+tRF2PfnRFSNaQlWTrewiHemYbk2enp +xKmjNHmfeq9LWXKowMj2MQ3C+esVee02IhCvxngySEfHIbz472j40bi04cnAH1Sy +Rf0IaDitvm4yP6k1YMA0yf9YMhL8OHXJU5sVqQBit3HKs5FayJGRd+zzI5Y0wZqh +kYzNQBTVZJvpFhyw7MTz +=XiGw -----END PGP SIGNATURE-----