Skip to content

Commit 8690fac

Browse files
authored
Merge pull request ceph#57956 from tobias-urdin/remove-keystone-v2
rgw/auth: Remove Keystone v2.0 API support Reviewed-by: Casey Bodley <[email protected]>
2 parents a272348 + c307a91 commit 8690fac

File tree

5 files changed

+49
-218
lines changed

5 files changed

+49
-218
lines changed

doc/radosgw/config-ref.rst

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,6 @@ Keystone Settings
202202
=================
203203

204204
.. confval:: rgw_keystone_url
205-
.. confval:: rgw_keystone_api_version
206205
.. confval:: rgw_keystone_admin_domain
207206
.. confval:: rgw_keystone_admin_project
208207
.. confval:: rgw_keystone_admin_token

src/common/options/rgw.yaml.in

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -783,16 +783,6 @@ options:
783783
services:
784784
- rgw
785785
with_legacy: true
786-
- name: rgw_keystone_api_version
787-
type: int
788-
level: advanced
789-
desc: Version of Keystone API to use (2 or 3).
790-
fmt_desc: The version (2 or 3) of OpenStack Identity API that should be
791-
used for communication with the Keystone server.
792-
default: 2
793-
services:
794-
- rgw
795-
with_legacy: true
796786
- name: rgw_keystone_accepted_roles
797787
type: str
798788
level: advanced

src/rgw/rgw_auth_keystone.cc

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -62,19 +62,14 @@ TokenEngine::get_from_keystone(const DoutPrefixProvider* dpp,
6262
throw -EINVAL;
6363
}
6464

65-
const auto keystone_version = config.get_api_version();
66-
if (keystone_version == rgw::keystone::ApiVersion::VER_2) {
67-
url.append("v2.0/tokens/" + token);
68-
} else if (keystone_version == rgw::keystone::ApiVersion::VER_3) {
69-
url.append("v3/auth/tokens");
65+
url.append("v3/auth/tokens");
7066

71-
if (allow_expired) {
72-
url.append("?allow_expired=1");
73-
}
74-
75-
validate.append_header("X-Subject-Token", token);
67+
if (allow_expired) {
68+
url.append("?allow_expired=1");
7669
}
7770

71+
validate.append_header("X-Subject-Token", token);
72+
7873
std::string admin_token;
7974
bool admin_token_cached = false;
8075
int ret = rgw::keystone::Service::get_admin_token(dpp, token_cache, config,
@@ -130,7 +125,7 @@ TokenEngine::get_from_keystone(const DoutPrefixProvider* dpp,
130125
<< ", body=" << token_body_bl.c_str() << dendl;
131126

132127
TokenEngine::token_envelope_t token_body;
133-
ret = token_body.parse(dpp, token, token_body_bl, config.get_api_version());
128+
ret = token_body.parse(dpp, token, token_body_bl);
134129
if (ret < 0) {
135130
throw ret;
136131
}
@@ -415,12 +410,7 @@ EC2Engine::get_from_keystone(const DoutPrefixProvider* dpp, const std::string_vi
415410
throw -EINVAL;
416411
}
417412

418-
const auto api_version = config.get_api_version();
419-
if (api_version == rgw::keystone::ApiVersion::VER_3) {
420-
keystone_url.append("v3/s3tokens");
421-
} else {
422-
keystone_url.append("v2.0/s3tokens");
423-
}
413+
keystone_url.append("v3/s3tokens");
424414

425415
/* get authentication token for Keystone. */
426416
std::string admin_token;
@@ -483,7 +473,7 @@ EC2Engine::get_from_keystone(const DoutPrefixProvider* dpp, const std::string_vi
483473

484474
/* now parse response */
485475
rgw::keystone::TokenEnvelope token_envelope;
486-
ret = token_envelope.parse(dpp, std::string(), token_body_bl, api_version);
476+
ret = token_envelope.parse(dpp, std::string(), token_body_bl);
487477
if (ret < 0) {
488478
ldpp_dout(dpp, 2) << "s3 keystone: token parsing failed, ret=0" << ret
489479
<< dendl;
@@ -508,12 +498,7 @@ auto EC2Engine::get_secret_from_keystone(const DoutPrefixProvider* dpp,
508498
return make_pair(boost::none, -EINVAL);
509499
}
510500

511-
const auto api_version = config.get_api_version();
512-
if (api_version == rgw::keystone::ApiVersion::VER_3) {
513-
keystone_url.append("v3/");
514-
} else {
515-
keystone_url.append("v2.0/");
516-
}
501+
keystone_url.append("v3/");
517502
keystone_url.append("users/");
518503
keystone_url.append(user_id);
519504
keystone_url.append("/credentials/OS-EC2/");

src/rgw/rgw_keystone.cc

Lines changed: 30 additions & 142 deletions
Original file line numberDiff line numberDiff line change
@@ -54,21 +54,6 @@ void rgw_get_token_id(const string& token, string& token_id)
5454
namespace rgw {
5555
namespace keystone {
5656

57-
ApiVersion CephCtxConfig::get_api_version() const noexcept
58-
{
59-
switch (g_ceph_context->_conf->rgw_keystone_api_version) {
60-
case 3:
61-
return ApiVersion::VER_3;
62-
case 2:
63-
return ApiVersion::VER_2;
64-
default:
65-
dout(0) << "ERROR: wrong Keystone API version: "
66-
<< g_ceph_context->_conf->rgw_keystone_api_version
67-
<< "; falling back to v2" << dendl;
68-
return ApiVersion::VER_2;
69-
}
70-
}
71-
7257
std::string CephCtxConfig::get_endpoint_url() const noexcept
7358
{
7459
static const std::string url = g_ceph_context->_conf->rgw_keystone_url;
@@ -186,33 +171,18 @@ int Service::issue_admin_token_request(const DoutPrefixProvider *dpp,
186171
token_req.append_header("Content-Type", "application/json");
187172
JSONFormatter jf;
188173

189-
const auto keystone_version = config.get_api_version();
190-
if (keystone_version == ApiVersion::VER_2) {
191-
AdminTokenRequestVer2 req_serializer(config);
192-
req_serializer.dump(&jf);
193-
194-
std::stringstream ss;
195-
jf.flush(ss);
196-
token_req.set_post_data(ss.str());
197-
token_req.set_send_length(ss.str().length());
198-
token_url.append("v2.0/tokens");
199-
200-
} else if (keystone_version == ApiVersion::VER_3) {
201-
AdminTokenRequestVer3 req_serializer(config);
202-
req_serializer.dump(&jf);
203-
204-
std::stringstream ss;
205-
jf.flush(ss);
206-
token_req.set_post_data(ss.str());
207-
token_req.set_send_length(ss.str().length());
208-
token_url.append("v3/auth/tokens");
209-
} else {
210-
return -ENOTSUP;
211-
}
174+
AdminTokenRequest req_serializer(config);
175+
req_serializer.dump(&jf);
176+
177+
std::stringstream ss;
178+
jf.flush(ss);
179+
token_req.set_post_data(ss.str());
180+
token_req.set_send_length(ss.str().length());
181+
token_url.append("v3/auth/tokens");
212182

213183
token_req.set_url(token_url);
214184

215-
const int ret = token_req.process(dpp, y);
185+
int ret = token_req.process(dpp, y);
216186

217187
/* Detect rejection earlier than during the token parsing step. */
218188
if (token_req.get_http_status() ==
@@ -225,8 +195,8 @@ int Service::issue_admin_token_request(const DoutPrefixProvider *dpp,
225195
return ret;
226196
}
227197

228-
if (t.parse(dpp, token_req.get_subject_token(), token_bl,
229-
keystone_version) != 0) {
198+
ret = t.parse(dpp, token_req.get_subject_token(), token_bl);
199+
if (ret != 0) {
230200
return -EINVAL;
231201
}
232202

@@ -263,34 +233,19 @@ int Service::get_keystone_barbican_token(const DoutPrefixProvider *dpp,
263233
token_req.append_header("Content-Type", "application/json");
264234
JSONFormatter jf;
265235

266-
const auto keystone_version = config.get_api_version();
267-
if (keystone_version == ApiVersion::VER_2) {
268-
rgw::keystone::BarbicanTokenRequestVer2 req_serializer(cct);
269-
req_serializer.dump(&jf);
270-
271-
std::stringstream ss;
272-
jf.flush(ss);
273-
token_req.set_post_data(ss.str());
274-
token_req.set_send_length(ss.str().length());
275-
token_url.append("v2.0/tokens");
276-
277-
} else if (keystone_version == ApiVersion::VER_3) {
278-
BarbicanTokenRequestVer3 req_serializer(cct);
279-
req_serializer.dump(&jf);
280-
281-
std::stringstream ss;
282-
jf.flush(ss);
283-
token_req.set_post_data(ss.str());
284-
token_req.set_send_length(ss.str().length());
285-
token_url.append("v3/auth/tokens");
286-
} else {
287-
return -ENOTSUP;
288-
}
236+
BarbicanTokenRequest req_serializer(cct);
237+
req_serializer.dump(&jf);
238+
239+
std::stringstream ss;
240+
jf.flush(ss);
241+
token_req.set_post_data(ss.str());
242+
token_req.set_send_length(ss.str().length());
243+
token_url.append("v3/auth/tokens");
289244

290245
token_req.set_url(token_url);
291246

292247
ldpp_dout(dpp, 20) << "Requesting secret from barbican url=" << token_url << dendl;
293-
const int ret = token_req.process(dpp, y);
248+
int ret = token_req.process(dpp, y);
294249
if (ret < 0) {
295250
ldpp_dout(dpp, 20) << "Barbican process error:" << token_bl.c_str() << dendl;
296251
return ret;
@@ -302,8 +257,8 @@ int Service::get_keystone_barbican_token(const DoutPrefixProvider *dpp,
302257
return -EACCES;
303258
}
304259

305-
if (t.parse(dpp, token_req.get_subject_token(), token_bl,
306-
keystone_version) != 0) {
260+
ret = t.parse(dpp, token_req.get_subject_token(), token_bl);
261+
if (ret != 0) {
307262
return -EINVAL;
308263
}
309264

@@ -326,8 +281,7 @@ bool TokenEnvelope::has_role(const std::string& r) const
326281

327282
int TokenEnvelope::parse(const DoutPrefixProvider *dpp,
328283
const std::string& token_str,
329-
ceph::bufferlist& bl,
330-
const ApiVersion version)
284+
ceph::bufferlist& bl)
331285
{
332286
JSONParser parser;
333287
if (! parser.parse(bl.c_str(), bl.length())) {
@@ -336,40 +290,13 @@ int TokenEnvelope::parse(const DoutPrefixProvider *dpp,
336290
}
337291

338292
JSONObjIter token_iter = parser.find_first("token");
339-
JSONObjIter access_iter = parser.find_first("access");
340293

341294
try {
342-
if (version == rgw::keystone::ApiVersion::VER_2) {
343-
if (! access_iter.end()) {
344-
decode_v2(*access_iter);
345-
} else if (! token_iter.end()) {
346-
/* TokenEnvelope structure doesn't follow Identity API v2, so let's
347-
* fallback to v3. Otherwise we can assume it's wrongly formatted.
348-
* The whole mechanism is a workaround for s3_token middleware that
349-
* speaks in v2 disregarding the promise to go with v3. */
350-
decode_v3(*token_iter);
351-
352-
/* Identity v3 conveys the token information not as a part of JSON but
353-
* in the X-Subject-Token HTTP header we're getting from caller. */
354-
token.id = token_str;
355-
} else {
356-
return -EINVAL;
357-
}
358-
} else if (version == rgw::keystone::ApiVersion::VER_3) {
359-
if (! token_iter.end()) {
360-
decode_v3(*token_iter);
361-
/* v3 succeeded. We have to fill token.id from external input as it
362-
* isn't a part of the JSON response anymore. It has been moved
363-
* to X-Subject-Token HTTP header instead. */
364-
token.id = token_str;
365-
} else if (! access_iter.end()) {
366-
/* If the token cannot be parsed according to V3, try V2. */
367-
decode_v2(*access_iter);
368-
} else {
369-
return -EINVAL;
370-
}
295+
if (! token_iter.end()) {
296+
decode(*token_iter);
297+
token.id = token_str;
371298
} else {
372-
return -ENOTSUP;
299+
return -EINVAL;
373300
}
374301
} catch (const JSONDecoder::err& err) {
375302
ldpp_dout(dpp, 0) << "Keystone token parse error: " << err.what() << dendl;
@@ -544,7 +471,6 @@ void rgw::keystone::TokenEnvelope::Token::decode_json(JSONObj *obj)
544471
struct tm t;
545472

546473
JSONDecoder::decode_json("id", id, obj, true);
547-
JSONDecoder::decode_json("tenant", tenant_v2, obj, true);
548474
JSONDecoder::decode_json("expires", expires_iso8601, obj, true);
549475

550476
if (parse_iso8601(expires_iso8601.c_str(), &t)) {
@@ -579,10 +505,9 @@ void rgw::keystone::TokenEnvelope::User::decode_json(JSONObj *obj)
579505
JSONDecoder::decode_json("id", id, obj, true);
580506
JSONDecoder::decode_json("name", name, obj, true);
581507
JSONDecoder::decode_json("domain", domain, obj);
582-
JSONDecoder::decode_json("roles", roles_v2, obj);
583508
}
584509

585-
void rgw::keystone::TokenEnvelope::decode_v3(JSONObj* const root_obj)
510+
void rgw::keystone::TokenEnvelope::decode(JSONObj* const root_obj)
586511
{
587512
std::string expires_iso8601;
588513

@@ -601,15 +526,6 @@ void rgw::keystone::TokenEnvelope::decode_v3(JSONObj* const root_obj)
601526
}
602527
}
603528

604-
void rgw::keystone::TokenEnvelope::decode_v2(JSONObj* const root_obj)
605-
{
606-
JSONDecoder::decode_json("user", user, root_obj, true);
607-
JSONDecoder::decode_json("token", token, root_obj, true);
608-
609-
roles = user.roles_v2;
610-
project = token.tenant_v2;
611-
}
612-
613529
/* This utility function shouldn't conflict with the overload of std::to_string
614530
* provided by string_ref since Boost 1.54 as it's defined outside of the std
615531
* namespace. I hope we'll remove it soon - just after merging the Matt's PR
@@ -619,20 +535,7 @@ static inline std::string to_string(const std::string_view& s)
619535
return std::string(s.data(), s.length());
620536
}
621537

622-
void rgw::keystone::AdminTokenRequestVer2::dump(Formatter* const f) const
623-
{
624-
f->open_object_section("token_request");
625-
f->open_object_section("auth");
626-
f->open_object_section("passwordCredentials");
627-
encode_json("username", ::to_string(conf.get_admin_user()), f);
628-
encode_json("password", ::to_string(conf.get_admin_password()), f);
629-
f->close_section();
630-
encode_json("tenantName", ::to_string(conf.get_admin_tenant()), f);
631-
f->close_section();
632-
f->close_section();
633-
}
634-
635-
void rgw::keystone::AdminTokenRequestVer3::dump(Formatter* const f) const
538+
void rgw::keystone::AdminTokenRequest::dump(Formatter* const f) const
636539
{
637540
f->open_object_section("token_request");
638541
f->open_object_section("auth");
@@ -666,20 +569,7 @@ void rgw::keystone::AdminTokenRequestVer3::dump(Formatter* const f) const
666569
f->close_section();
667570
}
668571

669-
void rgw::keystone::BarbicanTokenRequestVer2::dump(Formatter* const f) const
670-
{
671-
f->open_object_section("token_request");
672-
f->open_object_section("auth");
673-
f->open_object_section("passwordCredentials");
674-
encode_json("username", cct->_conf->rgw_keystone_barbican_user, f);
675-
encode_json("password", cct->_conf->rgw_keystone_barbican_password, f);
676-
f->close_section();
677-
encode_json("tenantName", cct->_conf->rgw_keystone_barbican_tenant, f);
678-
f->close_section();
679-
f->close_section();
680-
}
681-
682-
void rgw::keystone::BarbicanTokenRequestVer3::dump(Formatter* const f) const
572+
void rgw::keystone::BarbicanTokenRequest::dump(Formatter* const f) const
683573
{
684574
f->open_object_section("token_request");
685575
f->open_object_section("auth");
@@ -712,5 +602,3 @@ void rgw::keystone::BarbicanTokenRequestVer3::dump(Formatter* const f) const
712602
f->close_section();
713603
f->close_section();
714604
}
715-
716-

0 commit comments

Comments
 (0)