是否有办法在#
文件的来源部分中设置包含@
或.gemrc
的密码?
我尝试将它们编码为%3A
和%40
,但后来我收到了Unauthorization 401错误。
如果不可能,我必须为可接受的RubyGems私有存储库密码定义什么规则?
答案 0 :(得分:1)
这似乎是gem
或更具体地Gem::RemoteFetcher
在Ruby版本before 2.1中处理URI中userinfo
部分中包含转义字符的请求的问题。
您可以查看使用Fiddler等代理发送的Base64编码的基本身份验证信息,并通过代理观看gem
完成请求。
使用admin:admin
即可获得
Authorization: Basic YWRtaW46YWRtaW4=
然后使用admin:a%64min
您将获得额外的字符:
Authorization: Basic YWRtaW46YSU2NG1pbg==
原来是:
irb(main):012:0> Base64.decode64 'YWRtaW46YSU2NG1pbg=='
=> "admin:a%64min"
因此,如果%
对字符进行编码,则会直接将它们传递给基本身份验证,就像密码包含%XX
个字符一样。然后,当您不转义userinfo时,URI字符串解析将失败。
Ruby 2.1以后似乎重新构建了代码,因此它将原始URI
对象一直传递给请求,而不是尝试build authorisation from a URI object in the request。
Here is the code for allowed userinfo characters in 1.9.3。归结为:
[a-zA-Z\d\\-_.!~*'();:&=+$,]
gem sources
$ rbenv shell 1.9.3-p545
$ gem sources -V -a 'http://admin:a%23min@localhost:3000/'
GET http://admin:a%23min@localhost:3000/specs.4.8.gz
401 Unauthorized
Error fetching http://admin:a%23min@localhost:3000/:
bad response Unauthorized 401 (http://admin:a%23min@localhost:3000/specs.4.8.gz)
$ rbenv shell 2.0.0-p481
$ gem sources -V -a 'http://admin:a%23min@localhost:3000/'
GET http://admin:a%23min@localhost:3000/specs.4.8.gz
401 Unauthorized
Error fetching http://admin:a%23min@10.1.1.140:3000/:
bad response Unauthorized 401 (http://admin:a%23min@localhost:3000/specs.4.8.gz)
$ rbenv shell 2.1.2
$ gem sources -V -a 'http://admin:a%23min@localhost:3000/'
GET http://admin:a%23min@localhost:3000/specs.4.8.gz
404 Not Found
Error fetching http://admin:a%23min@localhost:3000/:
bad response Not Found 404 (http://admin:a%23min@localhost:3000/specs.4.8.gz)
预计404是因为这是一个简单的Rack shim响应而不是真正的gem主机。