summaryrefslogtreecommitdiffstats
path: root/nsswitch/libwbclient/wbc_idmap_sssd.c
diff options
context:
space:
mode:
Diffstat (limited to 'nsswitch/libwbclient/wbc_idmap_sssd.c')
-rw-r--r--nsswitch/libwbclient/wbc_idmap_sssd.c138
1 files changed, 133 insertions, 5 deletions
diff --git a/nsswitch/libwbclient/wbc_idmap_sssd.c b/nsswitch/libwbclient/wbc_idmap_sssd.c
index d1ef7f59ca1..25fb88eb18b 100644
--- a/nsswitch/libwbclient/wbc_idmap_sssd.c
+++ b/nsswitch/libwbclient/wbc_idmap_sssd.c
@@ -20,6 +20,7 @@
*/
/* Required Headers */
+#include <sss_nss_idmap.h>
#include "replace.h"
#include "libwbclient.h"
@@ -29,13 +30,57 @@
/* Convert a Windows SID to a Unix uid, allocating an uid if needed */
wbcErr wbcSidToUid(const struct wbcDomainSid *sid, uid_t *puid)
{
- WBC_SSSD_NOT_IMPLEMENTED;
+ int ret;
+ char *sid_str;
+ uint32_t id;
+ enum sss_id_type type;
+ wbcErr wbc_status;
+
+ wbc_status = wbcSidToString(sid, &sid_str);
+ if (!WBC_ERROR_IS_OK(wbc_status)) {
+ return wbc_status;
+ }
+
+ ret = sss_nss_getidbysid(sid_str, &id, &type);
+ wbcFreeMemory(sid_str);
+ if (ret != 0) {
+ return WBC_ERR_UNKNOWN_FAILURE;
+ }
+
+ if (type != SSS_ID_TYPE_UID && type != SSS_ID_TYPE_BOTH) {
+ return WBC_ERR_UNKNOWN_GROUP;
+ }
+
+ *puid = (uid_t) id;
+
+ return WBC_ERR_SUCCESS;
}
/* Convert a Unix uid to a Windows SID, allocating a SID if needed */
wbcErr wbcUidToSid(uid_t uid, struct wbcDomainSid *sid)
{
- WBC_SSSD_NOT_IMPLEMENTED;
+ int ret;
+ char *str_sid;
+ enum sss_id_type type;
+ wbcErr wbc_status;
+
+ ret = sss_nss_getsidbyid(uid, &str_sid, &type);
+ if (ret != 0) {
+ return WBC_ERR_UNKNOWN_FAILURE;
+ }
+
+ if (type != SSS_ID_TYPE_UID && type != SSS_ID_TYPE_BOTH) {
+ free(str_sid);
+ return WBC_ERR_UNKNOWN_USER;
+ }
+
+ wbc_status = wbcStringToSid(str_sid, sid);
+ free(str_sid);
+ if (!WBC_ERROR_IS_OK(wbc_status)) {
+ return wbc_status;
+ }
+
+ return WBC_ERR_SUCCESS;
}
/** @brief Convert a Windows SID to a Unix gid, allocating a gid if needed
@@ -49,24 +94,70 @@ wbcErr wbcUidToSid(uid_t uid, struct wbcDomainSid *sid)
wbcErr wbcSidToGid(const struct wbcDomainSid *sid, gid_t *pgid)
{
- WBC_SSSD_NOT_IMPLEMENTED;
+ int ret;
+ char *sid_str;
+ uint32_t id;
+ enum sss_id_type type;
+ wbcErr wbc_status;
+
+ wbc_status = wbcSidToString(sid, &sid_str);
+ if (!WBC_ERROR_IS_OK(wbc_status)) {
+ return wbc_status;
+ }
+
+ ret = sss_nss_getidbysid(sid_str, &id, &type);
+ wbcFreeMemory(sid_str);
+ if (ret != 0) {
+ return WBC_ERR_UNKNOWN_FAILURE;
+ }
+
+ if (type != SSS_ID_TYPE_GID && type != SSS_ID_TYPE_BOTH) {
+ return WBC_ERR_UNKNOWN_GROUP;
+ }
+
+ *pgid = (gid_t) id;
+
+ return WBC_ERR_SUCCESS;
}
/* Convert a Unix gid to a Windows SID, allocating a SID if needed */
wbcErr wbcGidToSid(gid_t gid, struct wbcDomainSid *sid)
{
- WBC_SSSD_NOT_IMPLEMENTED;
+ int ret;
+ char *str_sid;
+ enum sss_id_type type;
+ wbcErr wbc_status;
+
+ ret = sss_nss_getsidbyid(gid, &str_sid, &type);
+ if (ret != 0) {
+ return WBC_ERR_UNKNOWN_FAILURE;
+ }
+
+ if (type != SSS_ID_TYPE_GID && type != SSS_ID_TYPE_BOTH) {
+ free(str_sid);
+ return WBC_ERR_UNKNOWN_USER;
+ }
+
+ wbc_status = wbcStringToSid(str_sid, sid);
+ free(str_sid);
+ if (!WBC_ERROR_IS_OK(wbc_status)) {
+ return wbc_status;
+ }
+
+ return WBC_ERR_SUCCESS;
}
/* Obtain a new uid from Winbind */
wbcErr wbcAllocateUid(uid_t *puid)
{
+ /* Not supported by SSSD */
WBC_SSSD_NOT_IMPLEMENTED;
}
/* Obtain a new gid from Winbind */
wbcErr wbcAllocateGid(gid_t *pgid)
{
+ /* Not supported by SSSD */
WBC_SSSD_NOT_IMPLEMENTED;
}
@@ -74,5 +165,42 @@ wbcErr wbcAllocateGid(gid_t *pgid)
wbcErr wbcSidsToUnixIds(const struct wbcDomainSid *sids, uint32_t num_sids,
struct wbcUnixId *ids)
{
- WBC_SSSD_NOT_IMPLEMENTED;
+ int ret;
+ char *sid_str;
+ uint32_t id;
+ enum sss_id_type type;
+ size_t c;
+ wbcErr wbc_status;
+
+ for (c = 0; c < num_sids; c++) {
+ wbc_status = wbcSidToString(&sids[c], &sid_str);
+ if (!WBC_ERROR_IS_OK(wbc_status)) {
+ return wbc_status;
+ }
+
+ ret = sss_nss_getidbysid(sid_str, &id, &type);
+ wbcFreeMemory(sid_str);
+ if (ret != 0) {
+ return WBC_ERR_UNKNOWN_FAILURE;
+ }
+
+ switch (type) {
+ case SSS_ID_TYPE_UID:
+ ids[c].type = WBC_ID_TYPE_UID;
+ ids[c].id.uid = (uid_t) id;
+ break;
+ case SSS_ID_TYPE_GID:
+ ids[c].type = WBC_ID_TYPE_GID;
+ ids[c].id.gid = (gid_t) id;
+ break;
+ case SSS_ID_TYPE_BOTH:
+ ids[c].type = WBC_ID_TYPE_BOTH;
+ ids[c].id.uid = (uid_t) id;
+ break;
+ default:
+ ids[c].type = WBC_ID_TYPE_NOT_SPECIFIED;
+ }
+ }
+
+ return WBC_ERR_SUCCESS;
}