diff options
Diffstat (limited to 'source4/ldap_server')
-rw-r--r-- | source4/ldap_server/ldap_backend.c | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/source4/ldap_server/ldap_backend.c b/source4/ldap_server/ldap_backend.c index afeb3500d0..000d7e28f8 100644 --- a/source4/ldap_server/ldap_backend.c +++ b/source4/ldap_server/ldap_backend.c @@ -1162,6 +1162,9 @@ NTSTATUS ldapsrv_do_call(struct ldapsrv_call *call) { unsigned int i; struct ldap_message *msg = call->request; + struct ldb_context *samdb = call->conn->ldb; + NTSTATUS status; + time_t *lastts; /* Check for undecoded critical extensions */ for (i=0; msg->controls && msg->controls[i]; i++) { if (!msg->controls_decoded[i] && @@ -1180,9 +1183,11 @@ NTSTATUS ldapsrv_do_call(struct ldapsrv_call *call) case LDAP_TAG_SearchRequest: return ldapsrv_SearchRequest(call); case LDAP_TAG_ModifyRequest: - return ldapsrv_ModifyRequest(call); + status = ldapsrv_ModifyRequest(call); + break; case LDAP_TAG_AddRequest: - return ldapsrv_AddRequest(call); + status = ldapsrv_AddRequest(call); + break; case LDAP_TAG_DelRequest: return ldapsrv_DelRequest(call); case LDAP_TAG_ModifyDNRequest: @@ -1196,4 +1201,20 @@ NTSTATUS ldapsrv_do_call(struct ldapsrv_call *call) default: return ldapsrv_unwilling(call, LDAP_PROTOCOL_ERROR); } + + if (NT_STATUS_IS_OK(status)) { + lastts = (time_t *)ldb_get_opaque(samdb, DSDB_OPAQUE_LAST_SCHEMA_UPDATE_MSG_OPAQUE_NAME); + if (lastts && !*lastts) { + DEBUG(10, ("Schema update now was requested, fullfilling the request ts = %d\n", lastts)); + /* + * Just requesting the schema will do the trick + * as the delay for reload is experied, we will have a reload + * from the schema as expected as we are not yet in a transaction! + */ + dsdb_get_schema(samdb, NULL); + *lastts = time(NULL); + ldb_set_opaque(samdb, DSDB_OPAQUE_LAST_SCHEMA_UPDATE_MSG_OPAQUE_NAME, lastts); + } + } + return status; } |