私有rubygems存储库的密码要求是什么?

时间:2014-07-31 06:08:44

标签: ruby gem rubygems

是否有办法在#文件的来源部分中设置包含@.gemrc的密码?

我尝试将它们编码为%3A%40,但后来我收到了Unauthorization 401错误。

如果不可能,我必须为可接受的RubyGems私有存储库密码定义什么规则?

1 个答案:

答案 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

进行测试

1.9.3

$ 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)

2.0.0

$ 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)

2.1.2

$ 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主机。