Skip to content

Commit 9f171a3

Browse files
SYSDB: Support ID override templates
1 parent ad7ca5e commit 9f171a3

File tree

4 files changed

+1068
-61
lines changed

4 files changed

+1068
-61
lines changed

src/db/sysdb.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,15 @@
207207
#define SYSDB_VIEW_NAME "viewName"
208208
#define SYSDB_OVERRIDE_CLASS "override"
209209
#define SYSDB_OVERRIDE_ANCHOR_UUID "overrideAnchorUUID"
210+
#define SYSDB_OVERRIDE_ANCHOR "overrideAnchor"
210211
#define SYSDB_OVERRIDE_USER_CLASS "userOverride"
211212
#define SYSDB_OVERRIDE_GROUP_CLASS "groupOverride"
212213
#define SYSDB_OVERRIDE_DN "overrideDN"
213214
#define SYSDB_OVERRIDE_OBJECT_DN "overrideObjectDN"
214215
#define SYSDB_USE_DOMAIN_RESOLUTION_ORDER "useDomainResolutionOrder"
215216
#define SYSDB_DOMAIN_RESOLUTION_ORDER "domainResolutionOrder"
217+
#define SYSDB_DOMAIN_TEMPLATE_SHELL "templateLoginShell"
218+
#define SYSDB_DOMAIN_TEMPLATE_HOMEDIR "templateHomeDirectory"
216219
#define SYSDB_PASSKEY_USER_VERIFICATION "passkeyUserVerification"
217220
#define SYSDB_SESSION_RECORDING "sessionRecording"
218221

@@ -655,6 +658,23 @@ errno_t sysdb_update_view_name(struct sysdb_ctx *sysdb, const char *view_name);
655658
errno_t sysdb_get_view_name(TALLOC_CTX *mem_ctx, struct sysdb_ctx *sysdb,
656659
char **view_name);
657660

661+
errno_t sysdb_update_override_template(struct sysdb_ctx *sysdb,
662+
const char *view_name,
663+
const char *anchor,
664+
const char *home_dir,
665+
const char *login_shell);
666+
667+
errno_t sysdb_domain_update_domain_template(struct sss_domain_info *parent,
668+
struct sysdb_ctx *sysdb,
669+
const char *subdom_name,
670+
const char *home_dir,
671+
const char *login_shell);
672+
673+
errno_t sysdb_update_domain_template(struct sysdb_ctx *sysdb,
674+
struct ldb_dn *dn,
675+
const char *home_dir,
676+
const char *login_shell);
677+
658678
errno_t sysdb_update_view_domain_resolution_order(
659679
struct sysdb_ctx *sysdb,
660680
const char *domain_resolution_order);
@@ -692,6 +712,8 @@ errno_t sysdb_invalidate_overrides(struct sysdb_ctx *sysdb);
692712

693713
errno_t sysdb_apply_default_override(struct sss_domain_info *domain,
694714
struct sysdb_attrs *override_attrs,
715+
const char *global_template_homedir,
716+
const char *global_template_shell,
695717
struct ldb_dn *obj_dn);
696718

697719
errno_t sysdb_search_by_orig_dn(TALLOC_CTX *mem_ctx,
@@ -1231,6 +1253,13 @@ errno_t sysdb_store_override(struct sss_domain_info *domain,
12311253
enum sysdb_member_type type,
12321254
struct sysdb_attrs *attrs, struct ldb_dn *obj_dn);
12331255

1256+
errno_t sysdb_store_override_template(struct sss_domain_info *domain,
1257+
struct sysdb_attrs *attrs,
1258+
const char *global_template_homedir,
1259+
const char *global_template_shell,
1260+
const char *view_name,
1261+
struct ldb_dn *obj_dn);
1262+
12341263
/*
12351264
* Cache the time of last initgroups invocation. Typically this is not done when
12361265
* the provider-specific request itself finishes, because currently the request

src/db/sysdb_subdomains.c

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1621,6 +1621,84 @@ sysdb_domain_get_domain_resolution_order(TALLOC_CTX *mem_ctx,
16211621
return ret;
16221622
}
16231623

1624+
errno_t
1625+
sysdb_domain_update_domain_template(struct sss_domain_info *parent,
1626+
struct sysdb_ctx *sysdb,
1627+
const char *subdom_name,
1628+
const char *home_dir,
1629+
const char *login_shell)
1630+
{
1631+
1632+
TALLOC_CTX *tmp_ctx;
1633+
struct ldb_dn *dn;
1634+
struct sss_domain_info *subdom;
1635+
errno_t ret;
1636+
1637+
if (home_dir == NULL && login_shell == NULL) {
1638+
DEBUG(SSSDBG_OP_FAILURE,
1639+
"Either login shell or home directory must be provided\n");
1640+
return EINVAL;
1641+
}
1642+
1643+
tmp_ctx = talloc_new(NULL);
1644+
if (tmp_ctx == NULL) {
1645+
return ENOMEM;
1646+
}
1647+
1648+
dn = ldb_dn_new_fmt(tmp_ctx, sysdb->ldb, SYSDB_DOM_BASE, subdom_name);
1649+
if (dn == NULL) {
1650+
ret = ENOMEM;
1651+
goto done;
1652+
}
1653+
1654+
ret = sysdb_update_domain_template(sysdb, dn,
1655+
home_dir, login_shell);
1656+
if (ret != EOK) {
1657+
DEBUG(SSSDBG_OP_FAILURE,
1658+
"sysdb_update_domain_template() failed [%d]: [%s].\n",
1659+
ret, sss_strerror(ret));
1660+
goto done;
1661+
}
1662+
1663+
/* Update sss_domain_info struct to have templates available in memory */
1664+
subdom = find_domain_by_name(parent, subdom_name, true);
1665+
if (!subdom) {
1666+
DEBUG(SSSDBG_CRIT_FAILURE,
1667+
"Could not find domain matching [%s]\n",
1668+
subdom_name);
1669+
ret = EIO;
1670+
goto done;
1671+
}
1672+
1673+
if (home_dir != NULL) {
1674+
subdom->template_homedir = talloc_strdup(subdom, home_dir);
1675+
if (subdom->template_homedir == NULL) {
1676+
DEBUG(SSSDBG_OP_FAILURE, "Failed to copy homedir template.\n");
1677+
ret = ENOMEM;
1678+
goto done;
1679+
}
1680+
} else {
1681+
subdom->template_homedir = NULL;
1682+
}
1683+
1684+
if (login_shell != NULL) {
1685+
subdom->template_shell = talloc_strdup(subdom, login_shell);
1686+
if (subdom->template_shell == NULL) {
1687+
DEBUG(SSSDBG_OP_FAILURE, "Failed to copy shell template.\n");
1688+
ret = ENOMEM;
1689+
goto done;
1690+
}
1691+
} else {
1692+
subdom->template_shell = NULL;
1693+
}
1694+
1695+
ret = EOK;
1696+
1697+
done:
1698+
talloc_free(tmp_ctx);
1699+
return ret;
1700+
}
1701+
16241702
errno_t
16251703
sysdb_domain_update_domain_resolution_order(struct sysdb_ctx *sysdb,
16261704
const char *domain_name,

0 commit comments

Comments
 (0)