Index: client/1.0/pkgr.eagle ================================================================== --- client/1.0/pkgr.eagle +++ client/1.0/pkgr.eagle @@ -1472,14 +1472,14 @@ # # NOTE: Should the HTTP request processor attempt to force the use of # HTTPS for URIs that were originally HTTP? This setting is only # applicable to native Tcl. # - variable forceSecureHttps; # DEFAULT: true + variable forceSecureUri; # DEFAULT: true - if {![info exists forceSecureHttps]} then { - set forceSecureHttps true + if {![info exists forceSecureUri]} then { + set forceSecureUri true } # # NOTE: Is this HTTP request processor allowed to use plain HTTP if/when # the "tls" package is not available? This should only be changed @@ -1487,14 +1487,25 @@ # native Tcl interpreter in use. It should be noted here that the # official package repository server reserves the right to refuse # plain HTTP connections, which means that changing this setting # may be totally pointless. # - variable allowInsecureHttp; # DEFAULT: false + variable allowInsecureUri; # DEFAULT: false + + if {![info exists allowInsecureUri]} then { + set allowInsecureUri false + } + + # + # NOTE: Is this HTTP request processor allowed to use plain HTTP if/when + # the server responds with an HTTP redirect location to an original + # URI that was HTTPS? Otherwise, a script error will result. + # + variable allowInsecureRedirect; # DEFAULT: false - if {![info exists allowInsecureHttp]} then { - set allowInsecureHttp false + if {![info exists allowInsecureRedirect]} then { + set allowInsecureRedirect false } # # NOTE: What is the default set of API keys if none were set explicitly? # This list is subject to change at any time -AND- may be empty or @@ -1710,26 +1721,32 @@ # # NOTE: This procedure was stolen from the "getEagle.tcl" script. It is # designed to process a single HTTP request, including any HTTP # 3XX redirects (up to the specified limit), and return the raw - # HTTP response data. It does not contain special code to handle - # HTTP status codes other than 3XX (e.g. 4XX, 5XX, etc). + # HTTP response data. It may raise any number of script errors. # # proc getFileViaHttp { uri redirectLimit channel quiet args } { # # NOTE: This variable is used to determine if plain HTTP URIs should be # converted to HTTPS, if the "tls" package is available. # - variable forceSecureHttps + variable forceSecureUri # # NOTE: This variable is used to determine if plain HTTP is allowed if # the "tls" package is not available. # - variable allowInsecureHttp + variable allowInsecureUri + + # + # NOTE: This variable is used to determine if plain HTTP is allowed if + # an HTTP redirect response contains an HTTP URI and the original + # URI was HTTPS. + # + variable allowInsecureRedirect # # NOTE: This variable is used to keep track of the currently scheduled # (i.e. pending) [after] event. # @@ -1746,18 +1763,20 @@ # otherwise, only attempt to use HTTP if explicitly allowed. # if {[catch {package require tls}] == 0} then { ::http::register https 443 [list ::tls::socket -tls1 true] - if {$forceSecureHttps} then { + if {$forceSecureUri} then { if {[string range $uri 0 6] eq "http://"} then { set uri [appendArgs https:// [string range $uri 7 end]] } } - } elseif {$allowInsecureHttp} then { - if {[string range $uri 0 7] eq "https://"} then { - set uri [appendArgs http:// [string range $uri 8 end]] + } else { + if {$allowInsecureUri} then { + if {[string range $uri 0 7] eq "https://"} then { + set uri [appendArgs http:// [string range $uri 8 end]] + } } } # # NOTE: Unless the caller forbids it, display progress messages during @@ -1778,19 +1797,49 @@ # # NOTE: Issue the HTTP request now, grabbing the resulting token. # set token [eval [list ::http::geturl $uri] $args] + # + # NOTE: Grab the HTTP response code and data now as they are needed + # in almost all cases. + # + set code [::http::ncode $token]; set data [::http::data $token] + # # NOTE: Check the HTTP response code, in order to follow any HTTP # redirect responses. # - switch -exact -- [::http::ncode $token] { + switch -glob -- $code { + 100 - + 101 - + 102 { + ::http::cleanup $token; error [appendArgs \ + "unsupported informational HTTP response status code " \ + $code ", data: " $data] + } + 200 - + 201 - + 202 - + 203 - + 204 - + 205 - + 206 - + 207 - + 208 - + 226 { + # + # NOTE: Ok, the HTTP response is actual data of some kind (which + # may be empty). + # + ::http::cleanup $token; break + } 301 - 302 - 303 - - 307 { + 307 - + 308 { # # NOTE: Unless the caller forbids it, display progress messages # when an HTTP redirect is returned. # if {!$quiet} then { @@ -1802,19 +1851,18 @@ # than X. # incr redirectCount # - # TODO: Maybe make this limit configurable? + # TODO: Maybe make this limit more configurable? # if {$redirectCount > $redirectLimit} then { # - # NOTE: Just "give up" and return whatever data that we have - # now. + # NOTE: Just "give up" and raise a script error. # - set data [::http::data $token] - ::http::cleanup $token; break + ::http::cleanup $token; error [appendArgs \ + "redirection limit of " $redirectLimit " exceeded"] } # # NOTE: Grab the metadata associated with this HTTP response. # @@ -1829,21 +1877,23 @@ # it will be used in the subsequent HTTP request. # set location $meta(Location); unset meta # - # NOTE: For security, do NOT follow an HTTP redirect if - # it attempts to redirect from HTTPS to HTTP. + # NOTE: For security, by default, do NOT follow an HTTP + # redirect if it attempts to redirect from HTTPS + # to HTTP. # - if {[string range $uri 0 7] eq "https://" && \ + if {!$allowInsecureRedirect && \ + [string range $uri 0 7] eq "https://" && \ [string range $location 0 7] ne "https://"} then { # - # NOTE: Just "give up" and return whatever data that - # we have now. + # NOTE: Just "give up" and raise a script error. # - set data [::http::data $token] - ::http::cleanup $token; break + ::http::cleanup $token; error [appendArgs \ + "refused insecure redirect from \"" $uri "\" to \"" \ + $location \"] } # # NOTE: Replace the original URI with the new one, for # use in the next HTTP request. @@ -1855,25 +1905,38 @@ # one will be created for the next request. # ::http::cleanup $token } else { # - # NOTE: Just "give up" and return whatever data that we - # have now. - # - set data [::http::data $token] - ::http::cleanup $token; break - } - } - default { - # - # NOTE: Ok, the HTTP response is actual data of some kind - # (which may be an error); however, it is not any - # kind of supported HTTP redirect. - # - set data [::http::data $token] - ::http::cleanup $token; break + # NOTE: Just "give up" and raise a script error. + # + ::http::cleanup $token; error [appendArgs \ + "redirect from \"" $uri "\" missing location, code " \ + $code ", data: " $data] + } + } + 304 - + 305 - + 306 { + ::http::cleanup $token; error [appendArgs \ + "unsupported redirection HTTP response status code " $code \ + ", data: " $data] + } + 4?? { + ::http::cleanup $token; error [appendArgs \ + "client error HTTP response status code " $code ", data: " \ + $data] + } + 5?? { + ::http::cleanup $token; error [appendArgs \ + "server error HTTP response status code " $code ", data: " \ + $data] + } + default { + ::http::cleanup $token; error [appendArgs \ + "unrecognized HTTP response status code " $code ", data: " \ + $data] } } } # Index: client/1.0/pkgr.eagle.asc ================================================================== --- client/1.0/pkgr.eagle.asc +++ client/1.0/pkgr.eagle.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJX3YvNAAoJEFAslq9JXcLZcvQP+wdEnKvWgEB2LoaPuDe5DRLL -5XBk3wGY0nBhORXg9xa5TFD/ZQYu/I8ku5Hram6ujP+aU83MKUOzdf+/5S0Zsuuf -dWmsG/wmrgRjFX0wbyIm5NIxCH8scXcFjl0aB8s4skYRpvtXGtssOToI2HY65r++ -FbtkA8btny+8q6yIwOGITcRITM5ufdLV4CL2SX+PYYMmiw/xwKnR0sISPu6vuo/v -jLB7Fz/cqcxtGw8Bcw72S21cnYNK21VRxLSIMMZFGMh+jqMHNbrxwh7bwVR9KSGy -Te8moGAV3JVYCBUs1I8T0ptV1VUP8Y3LUJl4e+ovJ8GHdgzstjdjWzbeLt9ogrXq -Itxh3Y5Hdtpon8fbNixhe2gzyWjVnJeBSTwMzMsF5mRpPliPA4ZcBK477MtY35jm -tWiDz9DLptLha9/KLGeQ3kG7t0RHzInnwTIgGBlsIEghi2ZvWkrk+C5HqK8MXaGa -e/yV/4bwMUeGKd05U1FIpvpa/Am1Sjw/ein7efRc54T3Xp85Lt6rawU7foFSoTbr -6AXY4dRoLhHwr3VKzwgpYYP4gOBYzkOIFiVz4eSBNrgzSlONPJEMLgtT/UZ7yarC -bEPddm+rRs0aNoIhwznUVk96JnrmaMU2LPb3Au5tKpldumCrCitsnWhBt2w3VDc5 -IY+SHdmhC1mvqXgYOrzn -=Qhta +iQIcBAABCAAGBQJX3gq5AAoJEFAslq9JXcLZ4kYP/i7cwkZGs0fSCnG9hlcHsF1R +2RQLxSxMKvslZC8wG7kjBEl4kEFornaKEvrBcNi4cH62kixU7kaXai40bhTDdRfx +wCovFa3Ie+ES/+uEBSeA7Ju7bn3l8tWaktwSqqwEhCgiW4eXFUWLgqqMZmxVn2Yb +aBk07FKci+vfFm5akZ23pVzz8IUCzh2y6AavFgE/0xkIibFrUQNn8yc4dAqM1VrB +2gZ7rvkrzF10sNGzmK5cb/F6owN9Cq4A7Rr+hsixh3KUF2Smws8tQuOEHlDa17ln +98n35Gbp34JqTaXwyUBgAWtel4SvQc36SXQoG7jH5hLtMnlhyAVnZPiiB8TgfJUU +GpQPxhd4dhLkMeg8u55ZlRbzlAcClBsQyxkzFjk7rKe0Y82ZnAPWioqtMgj0LjNG +EOLPdJG+v7wJD/yfpvkNiBbwq2DTZq5V4uDub95RS+Ck3QxX5MF8LlIX9D6v7f/O +QznTyMChbM6A4E96NLsFEHcqz85GXtSwMqez3rfX+wRlSFKXNxqYUFXFpVOWoTrS +jVrs/xeLBStdGK/a5W8vhEWuyF8SrOIXBxPO1Tn/Yzjp1sY18JCvJYckC2962+7m +ZD0nJS8KE6L5jrTA53iXU+0OVvjdhYzaMVcbKy9l/UUxo2YThdGaqah+42Ezoo56 +kDLy5eoJLZ7XfE9kP40B +=tpBZ -----END PGP SIGNATURE----- Index: client/1.0/pkgr.eagle.harpy ================================================================== --- client/1.0/pkgr.eagle.harpy +++ client/1.0/pkgr.eagle.harpy @@ -19,50 +19,50 @@ None Mistachkin Systems - e4eb97a3-0d46-46e6-a2e8-250907a57841 + 4eac20d8-450e-4bf5-80ce-3d7e3cdd6bdf SHA512 Script - 2016-09-17T18:29:05.3652343Z + 2016-09-18T03:31:28.6953125Z -1.00:00:00 0x9559f6017247e3e2 - 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 Index: client/1.0/pkgr.eagle.harpy.asc ================================================================== --- client/1.0/pkgr.eagle.harpy.asc +++ client/1.0/pkgr.eagle.harpy.asc @@ -1,18 +1,18 @@ -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 Comment: Eagle Package Repository -iQIcBAABCAAGBQJX3YvPAAoJEFAslq9JXcLZtW4QALxApTX8zjqKtETnY32ZgJG3 -TJ4riULFHC2hGXynu8IYGEsDx/gpCgJy/nOqlBc4XvlBzs8eyIId6f75sN6eX41d -7cRkPHs4qQMtywoZ0FeSKDuUA47+vMy2lb8PpSdYffJbJCtPLmxaaTwXkt1qG4aK -aPHACZDWJ5DAUZO3TwVKWMPWq6J0gdWjkYLKQsvWDMaH3YFu+CjKb3El0ECUXBbB -f1oEFPfvogbS56Y4ymNgvMMdHmaa5rUE7U3JTt73opvnzO1QbswkxP2dAEgiwuIm -vPo8ngSvIoGFsxNEOZa4fi2aiM+kypuv+dfBLVAV2d6afJJFyxkNH4XvthI7oUSK -J2n1S0o8F+USuSdLctk/uWnfIo7OTy4pJ1xQWezI0HxIA4GYRfPMW2RGbd/d2lCD -eOo69svCsMTiF7o41e3d3kGCPG54HtL7BkGY3wGZDWSy8x01vfqfosy08VbfQebE -PbeJjhm429bTYLlfTgjCdhi/2EZXr1vSP42NEKUu7+CWs+pzgZXCRlmLpx1IKTHh -M/vBrHn7f6FUOAtXPl0mSTWGsLKMkGDPszEaU8c1BV24VaeztsXMstmBczPMaSXY -VGRQNIyvJXjxQEd9kaIJRELAO9x985LDnOkUa3O9xOPXLiIYnxP424cmSLUcsX0r -x14PRi6k4P+8FKrN9Ro6 -=0QrJ +iQIcBAABCAAGBQJX3gq8AAoJEFAslq9JXcLZSdAQALgMLzDQtG/AhqDxfMAtG0GL +J76zelZDVOU+WCSERIQYcBmbkNfYqVV9dCGBz/joOBIzsTIFbKpKhShCo0JoJzdo +zcG3vNVEw6BUdanbMUjhPiPwcsyu0qLsaZH1R+GS6g9ASKU2Z4FuDn8e+4awfX3Z +2GJKcpcE5QknNMIpUQnnNpZQvgPAS950GqpfUe8AHyaOc/JFQvBCd8h5wVoolkMZ +TmiTVt12JDbQn5yDFyVy+YYmEstxhw+bPvEYbiXYQnUAl/H+FjKmfNLwyKDsYr3H +1foS2bTFRePOwDT6AOS4LWZ/4oiz4p9iryCPjQxx66pcWx8mOWvQdI3hi3G1C0TH +CUSEoIMpu7LRwo1lgG7Pxe4MrSnHyKL/Yh0yoPsYyLNXMuUNXkpsb6JeWHFd7ItO +kUc59PplzGeX7sCDF6TCOidqzpahFOoetWYEyLWdYXO4+BDUT/UU5ibvELfdrpdX +EQU2sXSyjl/9qe4pAfObCUoY+ybk1UFkRCxnJ+YjzP+Jmg9xThyzVkC4PaGbL4hT +gTh+wh2AGtAqergPMcDacHRCO2NF808kagQhdPfsPWxCYYxN3o4e1OGr7f83xp1f +GoQGWJ5VQWR5hvy3KZyjxPebXVYHtM2/rg6Xk37AA+F0Ofwm323gijl0Lc7lm1kL +1R7gkkyQ1FV2JqNSbLCX +=TNp1 -----END PGP SIGNATURE-----