/* try external authenticators (ldap for now) */
rgw::LDAPHelper* ldh = rgwlib.get_ldh(); /* !nullptr */
RGWToken token{from_base64(key.id)};
- if (ldh->auth(token.id, token.key) == 0) {
+ if (token.valid() && (ldh->auth(token.id, token.key) == 0)) {
/* try to store user if it doesn't already exist */
if (rgw_get_user_info_by_uid(store, token.id, user) < 0) {
int ret = rgw_store_user_info(store, user, NULL, NULL, real_time(),
filter += uid;
filter += ")";
char *attrs[] = { const_cast<char*>(dnattr.c_str()), nullptr };
- LDAPMessage *answer, *entry;
+ LDAPMessage *answer = nullptr, *entry = nullptr;
ret = ldap_search_s(ldap, searchdn.c_str(), LDAP_SCOPE_SUBTREE,
filter.c_str(), attrs, 0, &answer);
if (ret == LDAP_SUCCESS) {
entry = ldap_first_entry(ldap, answer);
- char *dn = ldap_get_dn(ldap, entry);
- ret = simple_bind(dn, pwd);
- ldap_memfree(dn);
+ if (entry) {
+ char *dn = ldap_get_dn(ldap, entry);
+ ret = simple_bind(dn, pwd);
+ ldap_memfree(dn);
+ } else {
+ ret = LDAP_NO_SUCH_ATTRIBUTE; // fixup result
+ }
ldap_msgfree(answer);
}
return (ret == LDAP_SUCCESS) ? ret : -EACCES;
store->ctx()->_conf->rgw_ldap_uri.empty()) {
RGWToken token{from_base64(s3_access_key)};
rgw::LDAPHelper *ldh = RGW_Auth_S3::get_ldap_ctx(store);
- if (ldh->auth(token.id, token.key) != 0)
+ if ((! token.valid()) || ldh->auth(token.id, token.key) != 0)
return -EACCES;
/* ok, succeeded, try to create shadow */
RGW_Auth_S3::init(store);
RGWToken token{from_base64(auth_id)};
- if (ldh->auth(token.id, token.key) != 0)
+ if ((! token.valid()) || ldh->auth(token.id, token.key) != 0)
external_auth_result = -EACCES;
else {
/* ok, succeeded */
/* create local account, if none exists */
s->user->user_id = token.id;
s->user->display_name = token.id; // cn?
- if (rgw_get_user_info_by_uid(store, s->user->user_id,
- *(s->user)) < 0) {
- int ret = rgw_store_user_info(store, *(s->user), NULL, NULL, real_time(), true);
+ int ret = rgw_get_user_info_by_uid(store, s->user->user_id, *(s->user));
+ if (ret < 0) {
+ ret = rgw_store_user_info(store, *(s->user), NULL, NULL, real_time(),
+ true);
if (ret < 0) {
dout(10) << "NOTICE: failed to store new user's info: ret=" << ret
<< dendl;