}
bool RGWSwift::verify_swift_token(RGWRados *store, req_state *s)
+{
+ if (!do_verify_swift_token(store, s)) {
+ return false;
+ }
+
+ if (!s->swift_user.empty()) {
+ string subuser;
+ ssize_t pos = s->swift_user.find(':');
+ if (pos < 0) {
+ subuser = s->swift_user;
+ } else {
+ subuser = s->swift_user.substr(pos + 1);
+ }
+ s->perm_mask = 0;
+ map<string, RGWSubUser>::iterator iter = s->user.subusers.find(subuser);
+ if (iter != s->user.subusers.end()) {
+ RGWSubUser& subuser = iter->second;
+ s->perm_mask = subuser.perm_mask;
+ }
+ } else {
+ s->perm_mask = RGW_PERM_FULL_CONTROL;
+ }
+
+ return true;
+
+}
+
+bool RGWSwift::do_verify_swift_token(RGWRados *store, req_state *s)
{
if (!s->os_auth_token) {
int ret = authenticate_temp_url(store, s);
}
if (strncmp(s->os_auth_token, "AUTH_rgwtk", 10) == 0) {
- int ret = rgw_swift_verify_signed_token(s->cct, store, s->os_auth_token, s->user);
+ int ret = rgw_swift_verify_signed_token(s->cct, store, s->os_auth_token, s->user, &s->swift_user);
if (ret < 0)
return false;
return ret;
}
-int rgw_swift_verify_signed_token(CephContext *cct, RGWRados *store, const char *token, RGWUserInfo& info)
+int rgw_swift_verify_signed_token(CephContext *cct, RGWRados *store, const char *token, RGWUserInfo& info, string *pswift_user)
{
if (strncmp(token, "AUTH_rgwtk", 10) != 0)
return -EINVAL;
dout(0) << "NOTICE: tokens mismatch tok=" << buf << dendl;
return -EPERM;
}
+ *pswift_user = swift_user;
return 0;
}
#define RGW_SWIFT_TOKEN_EXPIRATION (15 * 60)
-extern int rgw_swift_verify_signed_token(CephContext *cct, RGWRados *store, const char *token, RGWUserInfo& info);
+extern int rgw_swift_verify_signed_token(CephContext *cct, RGWRados *store, const char *token, RGWUserInfo& info, string *pswift_user);
class RGW_SWIFT_Auth_Get : public RGWOp {
public: