[SCM] Samba Shared Repository - branch master updated
Matthias Dieter Wallnöfer
mdw at samba.org
Sat Aug 14 12:55:13 MDT 2010
The branch, master has been updated
via d6ccd4c... s4:ldap_backend.c - fix a DS error code after WERROR change
via 7ffae93... werror.h - fix order and duplicate DS error codes
via ab3e20b... s4:libnet - free the "c" context also on error conditions
via 2de63aa... talloc:documentation - explain that "talloc_free" works also with "NULL" pointers
via 07af3f2... s4:samdb_set_password - return "NT_STATUS_WRONG_PASSWORD" when a user account doesn't exist
via 1fa9e99... s4:password_hash LDB module - improve an error message
via 4b569d7... s4:password_hash LDB module - implement the SAMR behaviour when checking old passwords
via e335b24... s4:password_hash LDB module - fix wrong error codes
via a9b0552... s4:passwords.py - test the error code when there doesn't exist any password yet
via c335c5f... s4:passwords.py - perform testing of wrong old passwords on change operations
via 4f63770... s4:torture/rpc/samr.c - fix a wrong torture error message
from 13a4922... s3: Remove a conn NULL check from claim_connection
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit d6ccd4c9daaaf19e9fb4dd16ba8b6599d28ef1d5
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date: Sat Aug 14 19:44:58 2010 +0200
s4:ldap_backend.c - fix a DS error code after WERROR change
commit 7ffae937625afa59f2e554f4aa7dc2113699f7df
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date: Sat Aug 14 19:41:46 2010 +0200
werror.h - fix order and duplicate DS error codes
commit ab3e20b82fca206d03a68acc501fdbd5a59b47a7
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date: Sat Aug 14 18:47:15 2010 +0200
s4:libnet - free the "c" context also on error conditions
(and if it's NULL then "talloc_free" does ignore it)
commit 2de63aa2801a907905b3e05557074af5b896d486
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date: Sat Aug 14 18:36:49 2010 +0200
talloc:documentation - explain that "talloc_free" works also with "NULL" pointers
(talloc.c)
...
> static inline int _talloc_free_internal(void *ptr, const char *location)
> {
> struct talloc_chunk *tc;
>
> if (unlikely(ptr == NULL)) {
> return -1;
> }
>
> tc = talloc_chunk_from_ptr(ptr);
...
Obviously this never had been documented before.
commit 07af3f289e403396a9ddef744cf42e2badc1f1cc
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date: Sat Aug 14 17:11:40 2010 +0200
s4:samdb_set_password - return "NT_STATUS_WRONG_PASSWORD" when a user account doesn't exist
This is for the (SAMR) account detection protection mechanism.
commit 1fa9e994423b96cc6a13682f79e827cae6850553
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date: Sat Aug 14 17:10:59 2010 +0200
s4:password_hash LDB module - improve an error message
commit 4b569d74a4be62a65e9c6ef1248eb83eae215831
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date: Sat Aug 14 11:51:47 2010 +0200
s4:password_hash LDB module - implement the SAMR behaviour when checking old passwords
Sooner or later this module should take over all password change actions.
commit e335b24ad00c3398f2bd4b7da9c4df6087597121
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date: Sat Aug 14 11:19:29 2010 +0200
s4:password_hash LDB module - fix wrong error codes
To match the passwords.py test
commit a9b055291c39198be5fb1648ba1f51418af16e09
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date: Sat Aug 14 11:59:47 2010 +0200
s4:passwords.py - test the error code when there doesn't exist any password yet
After the creation of a user object we don't have any password yet.
commit c335c5f54a2bb174b558f7edaced468e597c7ed6
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date: Sat Aug 14 10:46:38 2010 +0200
s4:passwords.py - perform testing of wrong old passwords on change operations
commit 4f6377043dc7a524a2afd05cd151c82350f06cfe
Author: Matthias Dieter Wallnöfer <mdw at samba.org>
Date: Sat Aug 14 11:19:53 2010 +0200
s4:torture/rpc/samr.c - fix a wrong torture error message
-----------------------------------------------------------------------
Summary of changes:
lib/talloc/talloc.h | 31 +++++--
lib/talloc/talloc_guide.txt | 9 +-
libcli/util/doserr.c | 5 +-
libcli/util/werror.h | 111 +++++++++++------------
source4/dsdb/common/util.c | 2 +
source4/dsdb/samdb/ldb_modules/password_hash.c | 33 +++++---
source4/dsdb/tests/python/passwords.py | 72 +++++++++++++++-
source4/ldap_server/ldap_backend.c | 2 +-
source4/libnet/libnet_group.c | 1 +
source4/libnet/libnet_user.c | 3 +-
source4/torture/rpc/samr.c | 2 +-
11 files changed, 177 insertions(+), 94 deletions(-)
Changeset truncated at 500 lines:
diff --git a/lib/talloc/talloc.h b/lib/talloc/talloc.h
index c59fd35..187d7e7 100644
--- a/lib/talloc/talloc.h
+++ b/lib/talloc/talloc.h
@@ -158,16 +158,25 @@ void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2);
/**
* @brief Free a chunk of talloc memory.
*
- * This function frees a piece of talloc memory, and all its children. It
- * operates recursively on its children. You can call talloc_free() on any
- * pointer returned by talloc().
+ * The talloc_free() function frees a piece of talloc memory, and all its
+ * children. You can call talloc_free() on any pointer returned by
+ * talloc().
*
- * If this pointer has an additional parent when talloc_free() is called then
- * the memory is not actually released, but instead the most recently
- * established parent is destroyed. See talloc_reference() for details on
- * establishing additional parents.
+ * The return value of talloc_free() indicates success or failure, with 0
+ * returned for success and -1 for failure. A possible failure condition
+ * is if the pointer had a destructor attached to it and the destructor
+ * returned -1. See talloc_set_destructor() for details on
+ * destructors. Likewise, if "ptr" is NULL, then the function will make
+ * no modifications and return -1.
*
- * For more control on which parent is removed, see talloc_unlink().
+ * If this pointer has an additional parent when talloc_free() is called
+ * then the memory is not actually released, but instead the most
+ * recently established parent is destroyed. See talloc_reference() for
+ * details on establishing additional parents.
+ *
+ * For more control on which parent is removed, see talloc_unlink()
+ *
+ * talloc_free() operates recursively on its children.
*
* From the 2.0 version of talloc, as a special case, talloc_free() is
* refused on pointers that have more than one parent, as talloc would
@@ -190,9 +199,11 @@ void *talloc_init(const char *fmt, ...) PRINTF_ATTRIBUTE(1,2);
*
* @param[in] ptr The chunk to be freed.
*
- * @return Returns 0 on success and -1 on error. The only possible
+ * @return Returns 0 on success and -1 on error. A possible
* failure condition is if the pointer had a destructor
- * attached to it and the destructor returned -1.
+ * attached to it and the destructor returned -1. Likewise,
+ * if "ptr" is NULL, then the function will make no
+ * modifications and returns -1.
*
* Example:
* @code
diff --git a/lib/talloc/talloc_guide.txt b/lib/talloc/talloc_guide.txt
index 79387bf..a79fd03 100644
--- a/lib/talloc/talloc_guide.txt
+++ b/lib/talloc/talloc_guide.txt
@@ -117,10 +117,11 @@ children. You can call talloc_free() on any pointer returned by
talloc().
The return value of talloc_free() indicates success or failure, with 0
-returned for success and -1 for failure. The only possible failure
-condition is if the pointer had a destructor attached to it and the
-destructor returned -1. See talloc_set_destructor() for details on
-destructors.
+returned for success and -1 for failure. A possible failure condition
+is if the pointer had a destructor attached to it and the destructor
+returned -1. See talloc_set_destructor() for details on
+destructors. Likewise, if "ptr" is NULL, then the function will make
+no modifications and returns -1.
If this pointer has an additional parent when talloc_free() is called
then the memory is not actually released, but instead the most
diff --git a/libcli/util/doserr.c b/libcli/util/doserr.c
index 958c617..fd0233c 100644
--- a/libcli/util/doserr.c
+++ b/libcli/util/doserr.c
@@ -126,7 +126,6 @@ static const struct werror_code_struct dos_errs[] =
{ "WERR_DS_OPERATIONS_ERROR", WERR_DS_OPERATIONS_ERROR },
{ "WERR_DS_PROTOCOL_ERROR", WERR_DS_PROTOCOL_ERROR },
{ "WERR_DS_TIMELIMIT_EXCEEEDED", WERR_DS_TIMELIMIT_EXCEEDED },
- { "WERR_DS_SIZE_LIMIT_EXCEEDED", WERR_DS_SIZE_LIMIT_EXCEEDED },
{ "WERR_DS_ADMIN_LIMIT_EXCEEEDED", WERR_DS_ADMIN_LIMIT_EXCEEDED },
{ "WERR_DS_COMPARE_FALSE", WERR_DS_COMPARE_FALSE },
{ "WERR_DS_COMPARE_TRUE", WERR_DS_COMPARE_TRUE },
@@ -165,7 +164,6 @@ static const struct werror_code_struct dos_errs[] =
{ "WERR_DS_DRA_ACCESS_DENIED", WERR_DS_DRA_ACCESS_DENIED },
{ "WERR_DS_DRA_SOURCE_DISABLED", WERR_DS_DRA_SOURCE_DISABLED },
{ "WERR_DS_DNS_LOOKUP_FAILURE", WERR_DS_DNS_LOOKUP_FAILURE },
- { "WERR_DS_WRONG_LINKED_ATTRIBUTE_SYNTAX", WERR_DS_WRONG_LINKED_ATTRIBUTE_SYNTAX },
{ "WERR_DS_NO_MSDS_INTID", WERR_DS_NO_MSDS_INTID },
{ "WERR_DS_DUP_MSDS_INTID", WERR_DS_DUP_MSDS_INTID },
{ "WERR_GENERAL_FAILURE", WERR_GENERAL_FAILURE },
@@ -1962,7 +1960,6 @@ static const struct werror_code_struct dos_errs[] =
{ "WERR_FRS_ERR_INVALID_SERVICE_PARAMETER", WERR_FRS_ERR_INVALID_SERVICE_PARAMETER },
{ "WERR_DS_NOT_INSTALLED", WERR_DS_NOT_INSTALLED },
{ "WERR_DS_MEMBERSHIP_EVALUATED_LOCALLY", WERR_DS_MEMBERSHIP_EVALUATED_LOCALLY },
- { "WERR_DS_INVALID_ATTRIBUTE_YNTAX", WERR_DS_INVALID_ATTRIBUTE_YNTAX },
{ "WERR_DS_NO_RIDS_ALLOCATED", WERR_DS_NO_RIDS_ALLOCATED },
{ "WERR_DS_NO_MORE_RIDS", WERR_DS_NO_MORE_RIDS },
{ "WERR_DS_INCORRECT_ROLE_OWNER", WERR_DS_INCORRECT_ROLE_OWNER },
@@ -4473,7 +4470,7 @@ const struct werror_str_struct dos_err_strs[] = {
{ WERR_DS_NOT_INSTALLED, "An error occurred while installing the directory service. For more information, see the event log." },
{ WERR_DS_MEMBERSHIP_EVALUATED_LOCALLY, "The directory service evaluated group memberships locally." },
{ WERR_DS_NO_ATTRIBUTE_OR_VALUE, "The specified directory service attribute or value does not exist." },
- { WERR_DS_INVALID_ATTRIBUTE_YNTAX, "The attribute syntax specified to the directory service is invalid." },
+ { WERR_DS_INVALID_ATTRIBUTE_SYNTAX, "The attribute syntax specified to the directory service is invalid." },
{ WERR_DS_ATTRIBUTE_TYPE_UNDEFINED, "The attribute type specified to the directory service is not defined." },
{ WERR_DS_ATTRIBUTE_OR_VALUE_EXISTS, "The specified directory service attribute or value already exists." },
{ WERR_DS_BUSY, "The directory service is busy." },
diff --git a/libcli/util/werror.h b/libcli/util/werror.h
index ac4fb37..3b717d2 100644
--- a/libcli/util/werror.h
+++ b/libcli/util/werror.h
@@ -234,63 +234,6 @@ typedef uint32_t WERROR;
#define WERR_SETUP_DOMAIN_CONTROLLER W_ERROR(0x00000A85)
#define WERR_DEFAULT_JOIN_REQUIRED W_ERROR(0x00000A86)
-/* DS errors */
-#define WERR_DS_NO_ATTRIBUTE_OR_VALUE W_ERROR(0x0000200A)
-#define WERR_DS_INVALID_ATTRIBUTE_SYNTAX W_ERROR(0x0000200B)
-#define WERR_DS_ATTRIBUTE_TYPE_UNDEFINED W_ERROR(0x0000200C)
-#define WERR_DS_ATTRIBUTE_OR_VALUE_EXISTS W_ERROR(0x0000200D)
-#define WERR_DS_BUSY W_ERROR(0x0000200E)
-#define WERR_DS_UNAVAILABLE W_ERROR(0x0000200F)
-#define WERR_DS_OBJ_CLASS_VIOLATION W_ERROR(0x00002014)
-#define WERR_DS_CANT_ON_NON_LEAF W_ERROR(0x00002015)
-#define WERR_DS_CANT_ON_RDN W_ERROR(0x00002016)
-#define WERR_DS_CANT_MOD_OBJ_CLASS W_ERROR(0x00002017)
-#define WERR_DS_OPERATIONS_ERROR W_ERROR(0x00002020)
-#define WERR_DS_PROTOCOL_ERROR W_ERROR(0x00002021)
-#define WERR_DS_TIMELIMIT_EXCEEDED W_ERROR(0x00002022)
-#define WERR_DS_SIZE_LIMIT_EXCEEDED W_ERROR(0x00002023)
-#define WERR_DS_ADMIN_LIMIT_EXCEEDED W_ERROR(0x00002024)
-#define WERR_DS_COMPARE_FALSE W_ERROR(0x00002025)
-#define WERR_DS_COMPARE_TRUE W_ERROR(0x00002026)
-#define WERR_DS_AUTH_METHOD_NOT_SUPPORTED W_ERROR(0x00002027)
-#define WERR_DS_STRONG_AUTH_REQUIRED W_ERROR(0x00002028)
-#define WERR_DS_INAPPROPRIATE_AUTH W_ERROR(0x00002029)
-#define WERR_DS_REFERRAL W_ERROR(0x0000202B)
-#define WERR_DS_UNAVAILABLE_CRIT_EXTENSION W_ERROR(0x0000202C)
-#define WERR_DS_CONFIDENTIALITY_REQUIRED W_ERROR(0x0000202D)
-#define WERR_DS_INAPPROPRIATE_MATCHING W_ERROR(0x0000202E)
-#define WERR_DS_CONSTRAINT_VIOLATION W_ERROR(0x0000202F)
-#define WERR_DS_NO_SUCH_OBJECT W_ERROR(0x00002030)
-#define WERR_DS_ALIAS_PROBLEM W_ERROR(0x00002031)
-#define WERR_DS_INVALID_DN_SYNTAX W_ERROR(0x00002032)
-#define WERR_DS_ALIAS_DEREF_PROBLEM W_ERROR(0x00002034)
-#define WERR_DS_UNWILLING_TO_PERFORM W_ERROR(0x00002035)
-#define WERR_DS_LOOP_DETECT W_ERROR(0x00002036)
-#define WERR_DS_NAMING_VIOLATION W_ERROR(0x00002037)
-#define WERR_DS_AFFECTS_MULTIPLE_DSAS W_ERROR(0x00002039)
-#define WERR_DS_OBJ_STRING_NAME_EXISTS W_ERROR(0x00002071)
-#define WERR_DS_OBJ_NOT_FOUND W_ERROR(0x0000208D)
-#define WERR_DS_GENERIC_ERROR W_ERROR(0x00002095)
-#define WERR_DS_INSUFF_ACCESS_RIGHTS W_ERROR(0x00002098)
-#define WERR_DS_SCHEMA_NOT_LOADED W_ERROR(0x20DE)
-#define WERR_DS_SCHEMA_ALLOC_FAILED W_ERROR(0x20DF)
-#define WERR_DS_ATT_SCHEMA_REQ_SYNTAX W_ERROR(0x000020E0)
-#define WERR_DS_DRA_SCHEMA_MISMATCH W_ERROR(0x000020E2)
-#define WERR_DS_DRA_INVALID_PARAMETER W_ERROR(0x000020F5)
-#define WERR_DS_DRA_BAD_DN W_ERROR(0x000020F7)
-#define WERR_DS_DRA_BAD_NC W_ERROR(0x000020F8)
-#define WERR_DS_DRA_INTERNAL_ERROR W_ERROR(0x000020FA)
-#define WERR_DS_DRA_OUT_OF_MEM W_ERROR(0x000020FE)
-#define WERR_DS_SINGLE_VALUE_CONSTRAINT W_ERROR(0x00002081)
-#define WERR_DS_DRA_DB_ERROR W_ERROR(0x00002103)
-#define WERR_DS_DRA_NO_REPLICA W_ERROR(0x00002104)
-#define WERR_DS_DRA_ACCESS_DENIED W_ERROR(0x00002105)
-#define WERR_DS_DRA_SOURCE_DISABLED W_ERROR(0x00002108)
-#define WERR_DS_DNS_LOOKUP_FAILURE W_ERROR(0x0000214C)
-#define WERR_DS_WRONG_LINKED_ATTRIBUTE_SYNTAX W_ERROR(0x00002150)
-#define WERR_DS_NO_MSDS_INTID W_ERROR(0x00002194)
-#define WERR_DS_DUP_MSDS_INTID W_ERROR(0x00002195)
-
/* FRS errors */
#define WERR_FRS_INSUFFICIENT_PRIV W_ERROR(0x00001F47)
#define WERR_FRS_SYSVOL_IS_BUSY W_ERROR(0x00001F4F)
@@ -2057,11 +2000,20 @@ typedef uint32_t WERROR;
#define WERR_FRS_ERR_INVALID_SERVICE_PARAMETER W_ERROR(0x00001F51)
#define WERR_DS_NOT_INSTALLED W_ERROR(0x00002008)
#define WERR_DS_MEMBERSHIP_EVALUATED_LOCALLY W_ERROR(0x00002009)
-#define WERR_DS_INVALID_ATTRIBUTE_YNTAX W_ERROR(0x0000200B)
+#define WERR_DS_NO_ATTRIBUTE_OR_VALUE W_ERROR(0x0000200A)
+#define WERR_DS_INVALID_ATTRIBUTE_SYNTAX W_ERROR(0x0000200B)
+#define WERR_DS_ATTRIBUTE_TYPE_UNDEFINED W_ERROR(0x0000200C)
+#define WERR_DS_ATTRIBUTE_OR_VALUE_EXISTS W_ERROR(0x0000200D)
+#define WERR_DS_BUSY W_ERROR(0x0000200E)
+#define WERR_DS_UNAVAILABLE W_ERROR(0x0000200F)
#define WERR_DS_NO_RIDS_ALLOCATED W_ERROR(0x00002010)
#define WERR_DS_NO_MORE_RIDS W_ERROR(0x00002011)
#define WERR_DS_INCORRECT_ROLE_OWNER W_ERROR(0x00002012)
#define WERR_DS_RIDMGR_INIT_ERROR W_ERROR(0x00002013)
+#define WERR_DS_OBJ_CLASS_VIOLATION W_ERROR(0x00002014)
+#define WERR_DS_CANT_ON_NON_LEAF W_ERROR(0x00002015)
+#define WERR_DS_CANT_ON_RDN W_ERROR(0x00002016)
+#define WERR_DS_CANT_MOD_OBJ_CLASS W_ERROR(0x00002017)
#define WERR_DS_CROSS_DOM_MOVE_ERROR W_ERROR(0x00002018)
#define WERR_DS_GC_NOT_AVAILABLE W_ERROR(0x00002019)
#define WERR_SHARED_POLICY W_ERROR(0x0000201A)
@@ -2069,10 +2021,32 @@ typedef uint32_t WERROR;
#define WERR_POLICY_ONLY_IN_DS W_ERROR(0x0000201C)
#define WERR_PROMOTION_ACTIVE W_ERROR(0x0000201D)
#define WERR_NO_PROMOTION_ACTIVE W_ERROR(0x0000201E)
+#define WERR_DS_OPERATIONS_ERROR W_ERROR(0x00002020)
+#define WERR_DS_PROTOCOL_ERROR W_ERROR(0x00002021)
+#define WERR_DS_TIMELIMIT_EXCEEDED W_ERROR(0x00002022)
#define WERR_DS_SIZELIMIT_EXCEEDED W_ERROR(0x00002023)
+#define WERR_DS_ADMIN_LIMIT_EXCEEDED W_ERROR(0x00002024)
+#define WERR_DS_COMPARE_FALSE W_ERROR(0x00002025)
+#define WERR_DS_COMPARE_TRUE W_ERROR(0x00002026)
+#define WERR_DS_AUTH_METHOD_NOT_SUPPORTED W_ERROR(0x00002027)
+#define WERR_DS_STRONG_AUTH_REQUIRED W_ERROR(0x00002028)
+#define WERR_DS_INAPPROPRIATE_AUTH W_ERROR(0x00002029)
#define WERR_DS_AUTH_UNKNOWN W_ERROR(0x0000202A)
+#define WERR_DS_REFERRAL W_ERROR(0x0000202B)
+#define WERR_DS_UNAVAILABLE_CRIT_EXTENSION W_ERROR(0x0000202C)
+#define WERR_DS_CONFIDENTIALITY_REQUIRED W_ERROR(0x0000202D)
+#define WERR_DS_INAPPROPRIATE_MATCHING W_ERROR(0x0000202E)
+#define WERR_DS_CONSTRAINT_VIOLATION W_ERROR(0x0000202F)
+#define WERR_DS_NO_SUCH_OBJECT W_ERROR(0x00002030)
+#define WERR_DS_ALIAS_PROBLEM W_ERROR(0x00002031)
+#define WERR_DS_INVALID_DN_SYNTAX W_ERROR(0x00002032)
#define WERR_DS_IS_LEAF W_ERROR(0x00002033)
+#define WERR_DS_ALIAS_DEREF_PROBLEM W_ERROR(0x00002034)
+#define WERR_DS_UNWILLING_TO_PERFORM W_ERROR(0x00002035)
+#define WERR_DS_LOOP_DETECT W_ERROR(0x00002036)
+#define WERR_DS_NAMING_VIOLATION W_ERROR(0x00002037)
#define WERR_DS_OBJECT_RESULTS_TOO_LARGE W_ERROR(0x00002038)
+#define WERR_DS_AFFECTS_MULTIPLE_DSAS W_ERROR(0x00002039)
#define WERR_DS_SERVER_DOWN W_ERROR(0x0000203A)
#define WERR_DS_LOCAL_ERROR W_ERROR(0x0000203B)
#define WERR_DS_ENCODING_ERROR W_ERROR(0x0000203C)
@@ -2090,6 +2064,7 @@ typedef uint32_t WERROR;
#define WERR_DS_ADD_REPLICA_INHIBITED W_ERROR(0x0000206E)
#define WERR_DS_ATT_NOT_DEF_IN_SCHEMA W_ERROR(0x0000206F)
#define WERR_DS_MAX_OBJ_SIZE_EXCEEDED W_ERROR(0x00002070)
+#define WERR_DS_OBJ_STRING_NAME_EXISTS W_ERROR(0x00002071)
#define WERR_DS_NO_RDN_DEFINED_IN_SCHEMA W_ERROR(0x00002072)
#define WERR_DS_RDN_DOESNT_MATCH_SCHEMA W_ERROR(0x00002073)
#define WERR_DS_NO_REQUESTED_ATTS_FOUND W_ERROR(0x00002074)
@@ -2104,6 +2079,7 @@ typedef uint32_t WERROR;
#define WERR_DS_ATT_NOT_DEF_FOR_CLASS W_ERROR(0x0000207D)
#define WERR_DS_ATT_ALREADY_EXISTS W_ERROR(0x0000207E)
#define WERR_DS_CANT_ADD_ATT_VALUES W_ERROR(0x00002080)
+#define WERR_DS_SINGLE_VALUE_CONSTRAINT W_ERROR(0x00002081)
#define WERR_DS_RANGE_CONSTRAINT W_ERROR(0x00002082)
#define WERR_DS_ATT_VAL_ALREADY_EXISTS W_ERROR(0x00002083)
#define WERR_DS_CANT_REM_MISSING_ATT W_ERROR(0x00002084)
@@ -2115,6 +2091,7 @@ typedef uint32_t WERROR;
#define WERR_DS_PARENT_IS_AN_ALIAS W_ERROR(0x0000208A)
#define WERR_DS_CANT_MIX_MASTER_AND_REPS W_ERROR(0x0000208B)
#define WERR_DS_CHILDREN_EXIST W_ERROR(0x0000208C)
+#define WERR_DS_OBJ_NOT_FOUND W_ERROR(0x0000208D)
#define WERR_DS_ALIASED_OBJ_MISSING W_ERROR(0x0000208E)
#define WERR_DS_BAD_NAME_SYNTAX W_ERROR(0x0000208F)
#define WERR_DS_ALIAS_POINTS_TO_ALIAS W_ERROR(0x00002090)
@@ -2122,8 +2099,10 @@ typedef uint32_t WERROR;
#define WERR_DS_OUT_OF_SCOPE W_ERROR(0x00002092)
#define WERR_DS_OBJECT_BEING_REMOVED W_ERROR(0x00002093)
#define WERR_DS_CANT_DELETE_DSA_OBJ W_ERROR(0x00002094)
+#define WERR_DS_GENERIC_ERROR W_ERROR(0x00002095)
#define WERR_DS_DSA_MUST_BE_INT_MASTER W_ERROR(0x00002096)
#define WERR_DS_CLASS_NOT_DSA W_ERROR(0x00002097)
+#define WERR_DS_INSUFF_ACCESS_RIGHTS W_ERROR(0x00002098)
#define WERR_DS_ILLEGAL_SUPERIOR W_ERROR(0x00002099)
#define WERR_DS_ATTRIBUTE_OWNED_BY_SAM W_ERROR(0x0000209A)
#define WERR_DS_NAME_TOO_MANY_PARTS W_ERROR(0x0000209B)
@@ -2192,7 +2171,11 @@ typedef uint32_t WERROR;
#define WERR_DS_MISSING_EXPECTED_ATT W_ERROR(0x000020DB)
#define WERR_DS_NCNAME_MISSING_CR_REF W_ERROR(0x000020DC)
#define WERR_DS_SECURITY_CHECKING_ERROR W_ERROR(0x000020DD)
+#define WERR_DS_SCHEMA_NOT_LOADED W_ERROR(0x20DE)
+#define WERR_DS_SCHEMA_ALLOC_FAILED W_ERROR(0x20DF)
+#define WERR_DS_ATT_SCHEMA_REQ_SYNTAX W_ERROR(0x000020E0)
#define WERR_DS_GCVERIFY_ERROR W_ERROR(0x000020E1)
+#define WERR_DS_DRA_SCHEMA_MISMATCH W_ERROR(0x000020E2)
#define WERR_DS_CANT_FIND_DSA_OBJ W_ERROR(0x000020E3)
#define WERR_DS_CANT_FIND_EXPECTED_NC W_ERROR(0x000020E4)
#define WERR_DS_CANT_FIND_NC_IN_CACHE W_ERROR(0x000020E5)
@@ -2211,17 +2194,26 @@ typedef uint32_t WERROR;
#define WERR_DS_MISSING_FSMO_SETTINGS W_ERROR(0x000020F2)
#define WERR_DS_UNABLE_TO_SURRENDER_ROLES W_ERROR(0x000020F3)
#define WERR_DS_DRA_GENERIC W_ERROR(0x000020F4)
+#define WERR_DS_DRA_INVALID_PARAMETER W_ERROR(0x000020F5)
#define WERR_DS_DRA_BUSY W_ERROR(0x000020F6)
+#define WERR_DS_DRA_BAD_DN W_ERROR(0x000020F7)
+#define WERR_DS_DRA_BAD_NC W_ERROR(0x000020F8)
#define WERR_DS_DRA_DN_EXISTS W_ERROR(0x000020F9)
+#define WERR_DS_DRA_INTERNAL_ERROR W_ERROR(0x000020FA)
#define WERR_DS_DRA_INCONSISTENT_DIT W_ERROR(0x000020FB)
#define WERR_DS_DRA_CONNECTION_FAILED W_ERROR(0x000020FC)
#define WERR_DS_DRA_BAD_INSTANCE_TYPE W_ERROR(0x000020FD)
+#define WERR_DS_DRA_OUT_OF_MEM W_ERROR(0x000020FE)
#define WERR_DS_DRA_MAIL_PROBLEM W_ERROR(0x000020FF)
#define WERR_DS_DRA_REF_ALREADY_EXISTS W_ERROR(0x00002100)
#define WERR_DS_DRA_REF_NOT_FOUND W_ERROR(0x00002101)
#define WERR_DS_DRA_OBJ_IS_REP_SOURCE W_ERROR(0x00002102)
+#define WERR_DS_DRA_DB_ERROR W_ERROR(0x00002103)
+#define WERR_DS_DRA_NO_REPLICA W_ERROR(0x00002104)
+#define WERR_DS_DRA_ACCESS_DENIED W_ERROR(0x00002105)
#define WERR_DS_DRA_NOT_SUPPORTED W_ERROR(0x00002106)
#define WERR_DS_DRA_RPC_CANCELLED W_ERROR(0x00002107)
+#define WERR_DS_DRA_SOURCE_DISABLED W_ERROR(0x00002108)
#define WERR_DS_DRA_SINK_DISABLED W_ERROR(0x00002109)
#define WERR_DS_DRA_NAME_COLLISION W_ERROR(0x0000210A)
#define WERR_DS_DRA_SOURCE_REINSTALLED W_ERROR(0x0000210B)
@@ -2287,6 +2279,7 @@ typedef uint32_t WERROR;
#define WERR_DS_HAVE_PRIMARY_MEMBERS W_ERROR(0x00002149)
#define WERR_DS_STRING_SD_CONVERSION_FAILED W_ERROR(0x0000214A)
#define WERR_DS_NAMING_MASTER_GC W_ERROR(0x0000214B)
+#define WERR_DS_DNS_LOOKUP_FAILURE W_ERROR(0x0000214C)
#define WERR_DS_COULDNT_UPDATE_SPNS W_ERROR(0x0000214D)
#define WERR_DS_CANT_RETRIEVE_SD W_ERROR(0x0000214E)
#define WERR_DS_KEY_NOT_UNIQUE W_ERROR(0x0000214F)
@@ -2356,6 +2349,8 @@ typedef uint32_t WERROR;
#define WERR_DS_DIFFERENT_REPL_EPOCHS W_ERROR(0x00002191)
#define WERR_DS_DRS_EXTENSIONS_CHANGED W_ERROR(0x00002192)
#define WERR_DS_REPLICA_SET_CHANGE_NOT_ALLOWED_ON_DISABLED_CR W_ERROR(0x00002193)
+#define WERR_DS_NO_MSDS_INTID W_ERROR(0x00002194)
+#define WERR_DS_DUP_MSDS_INTID W_ERROR(0x00002195)
#define WERR_DS_EXISTS_IN_RDNATTID W_ERROR(0x00002196)
#define WERR_DS_AUTHORIZATION_FAILED W_ERROR(0x00002197)
#define WERR_DS_INVALID_SCRIPT W_ERROR(0x00002198)
diff --git a/source4/dsdb/common/util.c b/source4/dsdb/common/util.c
index 7c5fd8a..be8e3a9 100644
--- a/source4/dsdb/common/util.c
+++ b/source4/dsdb/common/util.c
@@ -2147,6 +2147,8 @@ NTSTATUS samdb_set_password(struct ldb_context *ldb, TALLOC_CTX *mem_ctx,
status = NT_STATUS_WRONG_PASSWORD;
} else if (ret == LDB_ERR_CONSTRAINT_VIOLATION) {
status = NT_STATUS_PASSWORD_RESTRICTION;
+ } else if (ret == LDB_ERR_NO_SUCH_OBJECT) {
+ status = NT_STATUS_WRONG_PASSWORD;
} else if (ret != LDB_SUCCESS) {
status = NT_STATUS_UNSUCCESSFUL;
} else {
diff --git a/source4/dsdb/samdb/ldb_modules/password_hash.c b/source4/dsdb/samdb/ldb_modules/password_hash.c
index 0f078b5..cf239fb 100644
--- a/source4/dsdb/samdb/ldb_modules/password_hash.c
+++ b/source4/dsdb/samdb/ldb_modules/password_hash.c
@@ -1437,46 +1437,57 @@ static int check_password_restrictions(struct setup_password_fields_io *io)
/* First check the old password is correct, for password changes */
if (!io->ac->pwd_reset && !io->ac->change_old_pw_checked) {
+ bool nt_hash_checked = false;
+
/* we need to old nt or lm hash given by the client */
if (!io->og.nt_hash && !io->og.lm_hash) {
ldb_asprintf_errstring(ldb,
"check_password_restrictions: "
- "You need to provide the old password "
- "in order to change your password!");
+ "You need to provide the old password in order "
+ "to change it!");
return LDB_ERR_UNWILLING_TO_PERFORM;
}
+ /* The password modify through the NT hash is encouraged and
+ has no problems at all */
if (io->og.nt_hash) {
if (!io->o.nt_hash) {
ldb_asprintf_errstring(ldb,
"check_password_restrictions: "
"There's no old nt_hash, which is needed "
"in order to change your password!");
- return LDB_ERR_UNWILLING_TO_PERFORM;
+ return LDB_ERR_CONSTRAINT_VIOLATION;
}
- /* The password modify through the NT hash is encouraged
- and has no problems at all */
if (memcmp(io->og.nt_hash->hash, io->o.nt_hash->hash, 16) != 0) {
ldb_asprintf_errstring(ldb,
"check_password_restrictions: "
"The old password specified doesn't match!");
- return LDB_ERR_UNWILLING_TO_PERFORM;
+ return LDB_ERR_CONSTRAINT_VIOLATION;
}
- } else if (io->og.lm_hash) {
- if (!io->o.lm_hash) {
+
+ nt_hash_checked = true;
+ }
+
+ /* But it is also possible to change a password by the LM hash
+ * alone for compatibility reasons. This check is optional if
+ * the NT hash was already checked - otherwise it's mandatory.
+ * (as the SAMR operations request it). */
+ if (io->og.lm_hash) {
+ if (!io->o.lm_hash && !nt_hash_checked) {
ldb_asprintf_errstring(ldb,
"check_password_restrictions: "
"There's no old lm_hash, which is needed "
"in order to change your password!");
- return LDB_ERR_UNWILLING_TO_PERFORM;
+ return LDB_ERR_CONSTRAINT_VIOLATION;
}
- if (memcmp(io->og.lm_hash->hash, io->o.lm_hash->hash, 16) != 0) {
+ if (io->o.lm_hash &&
+ memcmp(io->og.lm_hash->hash, io->o.lm_hash->hash, 16) != 0) {
ldb_asprintf_errstring(ldb,
"check_password_restrictions: "
"The old password specified doesn't match!");
- return LDB_ERR_UNWILLING_TO_PERFORM;
+ return LDB_ERR_CONSTRAINT_VIOLATION;
}
}
}
diff --git a/source4/dsdb/tests/python/passwords.py b/source4/dsdb/tests/python/passwords.py
index de1889f..a8a19e1 100755
--- a/source4/dsdb/tests/python/passwords.py
+++ b/source4/dsdb/tests/python/passwords.py
@@ -79,14 +79,34 @@ class PasswordTests(samba.tests.TestCase):
self.ldb = ldb
self.base_dn = self.find_basedn(ldb)
- # (Re)adds the test user "testuser" with the inital password
- # "thatsAcomplPASS1"
+ # (Re)adds the test user "testuser" with no password atm
self.delete_force(self.ldb, "cn=testuser,cn=users," + self.base_dn)
self.ldb.add({
"dn": "cn=testuser,cn=users," + self.base_dn,
"objectclass": ["user", "person"],
- "sAMAccountName": "testuser",
- "userPassword": "thatsAcomplPASS1" })
+ "sAMAccountName": "testuser"})
+
+ # Tests a password change when we don't have a password yet
+ try:
+ self.ldb.modify_ldif("""
+dn: cn=testuser,cn=users,""" + self.base_dn + """
+changetype: modify
+delete: userPassword
+userPassword: thatsAcomplPASS1
+add: userPassword
+userPassword: thatsAcomplPASS2
+""")
+ self.fail()
+ except LdbError, (num, _):
+ self.assertEquals(num, ERR_CONSTRAINT_VIOLATION)
+
+ # Sets the initial user password and enables the account
+ self.ldb.modify_ldif("""
+dn: cn=testuser,cn=users,""" + self.base_dn + """
+changetype: modify
+replace: userPassword
+userPassword: thatsAcomplPASS1
+""")
self.ldb.enable_account("(sAMAccountName=testuser)")
# Open a second LDB connection with the user credentials. Use the
@@ -155,6 +175,20 @@ add: unicodePwd
unicodePwd:: """ + base64.b64encode("\"thatsAcomplPASS2\"".encode('utf-16-le')) + """
""")
+ # Wrong old password
+ try:
+ self.ldb2.modify_ldif("""
+dn: cn=testuser,cn=users,""" + self.base_dn + """
+changetype: modify
+delete: unicodePwd
+unicodePwd:: """ + base64.b64encode("\"thatsAcomplPASS3\"".encode('utf-16-le')) + """
+add: unicodePwd
+unicodePwd:: """ + base64.b64encode("\"thatsAcomplPASS4\"".encode('utf-16-le')) + """
+""")
+ self.fail()
+ except LdbError, (num, _):
+ self.assertEquals(num, ERR_CONSTRAINT_VIOLATION)
+
# A change to the same password again will not work (password history)
try:
self.ldb2.modify_ldif("""
@@ -225,6 +259,20 @@ add: userPassword
userPassword: thatsAcomplPASS2
""")
+ # Wrong old password
+ try:
+ self.ldb2.modify_ldif("""
+dn: cn=testuser,cn=users,""" + self.base_dn + """
+changetype: modify
+delete: userPassword
+userPassword: thatsAcomplPASS3
+add: userPassword
+userPassword: thatsAcomplPASS4
+""")
+ self.fail()
+ except LdbError, (num, _):
+ self.assertEquals(num, ERR_CONSTRAINT_VIOLATION)
+
# A change to the same password again will not work (password history)
try:
self.ldb2.modify_ldif("""
@@ -274,6 +322,22 @@ clearTextPassword:: """ + base64.b64encode("thatsAcomplPASS2".encode('utf-16-le'
if num != ERR_NO_SUCH_ATTRIBUTE:
raise LdbError(num, msg)
+ # Wrong old password
+ try:
--
Samba Shared Repository
More information about the samba-cvs
mailing list