summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/db/sysdb.h3
-rw-r--r--src/db/sysdb_ops.c26
-rw-r--r--src/db/sysdb_services.c27
-rw-r--r--src/db/sysdb_services.h2
-rw-r--r--src/providers/proxy/proxy_services.c2
-rw-r--r--src/tests/sysdb-tests.c8
6 files changed, 47 insertions, 21 deletions
diff --git a/src/db/sysdb.h b/src/db/sysdb.h
index c4d64be1..5863afc9 100644
--- a/src/db/sysdb.h
+++ b/src/db/sysdb.h
@@ -553,7 +553,8 @@ int sysdb_store_group(struct sysdb_ctx *sysdb,
enum sysdb_member_type {
SYSDB_MEMBER_USER,
- SYSDB_MEMBER_GROUP
+ SYSDB_MEMBER_GROUP,
+ SYSDB_MEMBER_SERVICE
};
int sysdb_add_group_member(struct sysdb_ctx *sysdb,
diff --git a/src/db/sysdb_ops.c b/src/db/sysdb_ops.c
index 4c4bc5ce..6573dcf9 100644
--- a/src/db/sysdb_ops.c
+++ b/src/db/sysdb_ops.c
@@ -21,6 +21,7 @@
#include "util/util.h"
#include "db/sysdb_private.h"
+#include "db/sysdb_services.h"
#include "util/crypto/sss_crypto.h"
#include <time.h>
@@ -2949,20 +2950,21 @@ errno_t sysdb_remove_attrs(struct sysdb_ctx *sysdb,
msg = ldb_msg_new(NULL);
if (!msg) return ENOMEM;
- if (type == SYSDB_MEMBER_USER) {
+ switch(type) {
+ case SYSDB_MEMBER_USER:
msg->dn = sysdb_user_dn(sysdb, msg, sysdb->domain->name, name);
- if (!msg->dn) {
- ret = ENOMEM;
- goto done;
- }
- } else if (type == SYSDB_MEMBER_GROUP) {
+ break;
+
+ case SYSDB_MEMBER_GROUP:
msg->dn = sysdb_group_dn(sysdb, msg, sysdb->domain->name, name);
- if (!msg->dn) {
- ret = ENOMEM;
- goto done;
- }
- } else {
- ret = EINVAL;
+ break;
+
+ case SYSDB_MEMBER_SERVICE:
+ msg->dn = sysdb_svc_dn(sysdb, msg, sysdb->domain->name, name);
+ break;
+ }
+ if (!msg->dn) {
+ ret = ENOMEM;
goto done;
}
diff --git a/src/db/sysdb_services.c b/src/db/sysdb_services.c
index 55a0c438..425e9ed7 100644
--- a/src/db/sysdb_services.c
+++ b/src/db/sysdb_services.c
@@ -183,6 +183,8 @@ sysdb_store_service(struct sysdb_ctx *sysdb,
int port,
const char **aliases,
const char **protocols,
+ struct sysdb_attrs *extra_attrs,
+ char **remove_attrs,
uint64_t cache_timeout,
time_t now)
{
@@ -367,11 +369,16 @@ sysdb_store_service(struct sysdb_ctx *sysdb,
if (ret != EOK) goto done;
/* Set the cache timeout */
- attrs = sysdb_new_attrs(tmp_ctx);
- if (!attrs) {
- ret = ENOMEM;
- goto done;
+ if (!extra_attrs) {
+ attrs = sysdb_new_attrs(tmp_ctx);
+ if (!attrs) {
+ ret = ENOMEM;
+ goto done;
+ }
+ } else {
+ attrs = extra_attrs;
}
+
ret = sysdb_attrs_add_time_t(attrs, SYSDB_LAST_UPDATE, now);
if (ret) goto done;
@@ -383,6 +390,18 @@ sysdb_store_service(struct sysdb_ctx *sysdb,
ret = sysdb_set_entry_attr(sysdb, update_dn, attrs, SYSDB_MOD_REP);
if (ret != EOK) goto done;
+ if (remove_attrs) {
+ ret = sysdb_remove_attrs(sysdb, primary_name,
+ SYSDB_MEMBER_SERVICE,
+ remove_attrs);
+ if (ret != EOK) {
+ DEBUG(SSSDBG_MINOR_FAILURE,
+ ("Could not remove missing attributes: [%s]\n",
+ strerror(ret)));
+ goto done;
+ }
+ }
+
ret = sysdb_transaction_commit(sysdb);
if (ret == EOK) in_transaction = false;
diff --git a/src/db/sysdb_services.h b/src/db/sysdb_services.h
index c4ad1d34..97817d88 100644
--- a/src/db/sysdb_services.h
+++ b/src/db/sysdb_services.h
@@ -70,6 +70,8 @@ sysdb_store_service(struct sysdb_ctx *sysdb,
int port,
const char **aliases,
const char **protocols,
+ struct sysdb_attrs *extra_attrs,
+ char **remove_attrs,
uint64_t cache_timeout,
time_t now);
diff --git a/src/providers/proxy/proxy_services.c b/src/providers/proxy/proxy_services.c
index ca098f01..79508a21 100644
--- a/src/providers/proxy/proxy_services.c
+++ b/src/providers/proxy/proxy_services.c
@@ -92,6 +92,7 @@ proxy_save_service(struct sysdb_ctx *sysdb,
ntohs(svc->s_port),
cased_aliases,
protocols,
+ NULL, NULL,
cache_timeout,
now);
done:
@@ -337,6 +338,7 @@ again:
svc->s_port,
const_aliases,
protocols,
+ NULL, NULL,
ctx->entry_cache_timeout,
now);
if (ret) {
diff --git a/src/tests/sysdb-tests.c b/src/tests/sysdb-tests.c
index fa034cec..886491a7 100644
--- a/src/tests/sysdb-tests.c
+++ b/src/tests/sysdb-tests.c
@@ -3015,7 +3015,7 @@ START_TEST(test_sysdb_store_services)
ret = sysdb_store_service(test_ctx->sysdb,
primary_name, port,
aliases, protocols,
- 1, 1);
+ NULL, NULL, 1, 1);
fail_if (ret != EOK);
/* Search by name and make sure the results match */
@@ -3032,7 +3032,7 @@ START_TEST(test_sysdb_store_services)
ret = sysdb_store_service(test_ctx->sysdb,
alt_primary_name, port,
aliases, protocols,
- 1, 1);
+ NULL, NULL, 1, 1);
fail_if (ret != EOK, "[%s]", strerror(ret));
services_check_match_name(test_ctx,
@@ -3049,14 +3049,14 @@ START_TEST(test_sysdb_store_services)
ret = sysdb_store_service(test_ctx->sysdb,
primary_name, port,
aliases, protocols,
- 1, 1);
+ NULL, NULL, 1, 1);
fail_if (ret != EOK, "[%s]", strerror(ret));
/* Change the port number */
ret = sysdb_store_service(test_ctx->sysdb,
primary_name, altport,
aliases, protocols,
- 1, 1);
+ NULL, NULL, 1, 1);
fail_if (ret != EOK, "[%s]", strerror(ret));
/* Search by name and make sure the results match */