e5b36c
diff -up openchange-openchange-2.3-VULCAN/libmapiadmin/libmapiadmin.h.samba-4.12 openchange-openchange-2.3-VULCAN/libmapiadmin/libmapiadmin.h
e5b36c
--- openchange-openchange-2.3-VULCAN/libmapiadmin/libmapiadmin.h.samba-4.12	2020-01-27 11:33:02.941846935 +0100
e5b36c
+++ openchange-openchange-2.3-VULCAN/libmapiadmin/libmapiadmin.h	2020-01-27 11:33:19.170846710 +0100
e5b36c
@@ -103,7 +103,9 @@ __BEGIN_DECLS
e5b36c
 struct ldb_dn *samdb_search_dn(struct ldb_context *, TALLOC_CTX *, struct ldb_dn *, const char *, ...) _PRINTF_ATTRIBUTE(4,5);
e5b36c
 struct dom_sid *dom_sid_add_rid(TALLOC_CTX *, const struct dom_sid *, uint32_t);
e5b36c
 bool encode_pw_buffer(uint8_t buffer[516], const char *, int);
e5b36c
+#if 0 /* removed in samba 4.12 */
e5b36c
 void arcfour_crypt_blob(uint8_t *, int, const DATA_BLOB *);
e5b36c
+#endif
e5b36c
 
e5b36c
 /* The following public definitions come from libmapiadmin/mapiadmin.c */
e5b36c
 struct mapiadmin_ctx *mapiadmin_init(struct mapi_session *);
e5b36c
diff -up openchange-openchange-2.3-VULCAN/libmapiadmin/mapiadmin_user.c.samba-4.12 openchange-openchange-2.3-VULCAN/libmapiadmin/mapiadmin_user.c
e5b36c
--- openchange-openchange-2.3-VULCAN/libmapiadmin/mapiadmin_user.c.samba-4.12	2020-01-27 11:25:31.398853179 +0100
e5b36c
+++ openchange-openchange-2.3-VULCAN/libmapiadmin/mapiadmin_user.c	2020-01-27 11:31:27.490848255 +0100
e5b36c
@@ -592,6 +592,9 @@ _PUBLIC_ enum MAPISTATUS mapiadmin_user_
e5b36c
  */
e5b36c
 _PUBLIC_ enum MAPISTATUS mapiadmin_user_add(struct mapiadmin_ctx *mapiadmin_ctx)
e5b36c
 {
e5b36c
+	OC_DEBUG(3, "mapiadmin_user_add(): is disabled");
e5b36c
+	return MAPI_E_UNABLE_TO_COMPLETE;
e5b36c
+#if 0 /* disable it, use samba function directly, if needed (no 'arcfour_crypt_blob' in samba 4.12) */
e5b36c
 	TALLOC_CTX			*mem_ctx;
e5b36c
 	NTSTATUS			status;
e5b36c
 	enum MAPISTATUS			retval;
e5b36c
@@ -732,6 +735,7 @@ again:
e5b36c
 
e5b36c
 	talloc_free(mem_ctx);
e5b36c
 	return MAPI_E_SUCCESS;
e5b36c
+#endif
e5b36c
 }
e5b36c
 
e5b36c
 /**
e5b36c
diff -up openchange-openchange-2.3-VULCAN/ndr_mapi.c.samba-4.12 openchange-openchange-2.3-VULCAN/ndr_mapi.c
e5b36c
--- openchange-openchange-2.3-VULCAN/ndr_mapi.c.samba-4.12	2020-01-27 11:04:07.136870938 +0100
e5b36c
+++ openchange-openchange-2.3-VULCAN/ndr_mapi.c	2020-01-27 11:12:29.978863985 +0100
e5b36c
@@ -2151,7 +2151,11 @@ enum ndr_err_code ndr_push_RestrictionVa
e5b36c
 		uint32_t _flags_save_STRUCT = ndr->flags;
e5b36c
 		ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
e5b36c
 		if (ndr_flags & NDR_SCALARS) {
e5b36c
-			int level = ndr_push_get_switch_value(ndr, r);
e5b36c
+			uint32_t level = 0;
e5b36c
+
e5b36c
+			if (!NDR_ERR_CODE_IS_SUCCESS(ndr_push_steal_switch_value(ndr, r, &level)))
e5b36c
+				level = 0;
e5b36c
+
e5b36c
 			switch (level) {
e5b36c
 				case 0x0: {
e5b36c
 					break; }
e5b36c
@@ -2165,7 +2169,9 @@ enum ndr_err_code ndr_push_RestrictionVa
e5b36c
 			}
e5b36c
 		}
e5b36c
 		if (ndr_flags & NDR_BUFFERS) {
e5b36c
-			int level = ndr_push_get_switch_value(ndr, r);
e5b36c
+			uint32_t level;
e5b36c
+			if (!NDR_ERR_CODE_IS_SUCCESS(ndr_push_steal_switch_value(ndr, r, &level)))
e5b36c
+				level = 0;
e5b36c
 			switch (level) {
e5b36c
 				case 0x0:
e5b36c
 				break;
e5b36c
@@ -2187,9 +2193,10 @@ enum ndr_err_code ndr_push_RestrictionVa
e5b36c
 
e5b36c
 enum ndr_err_code  ndr_pull_RestrictionVariable(struct ndr_pull *ndr, int ndr_flags, union RestrictionVariable *r)
e5b36c
 {
e5b36c
-	int level;
e5b36c
+	uint32_t level;
e5b36c
 	TALLOC_CTX *_mem_save_res_0;
e5b36c
-	level = ndr_pull_get_switch_value(ndr, r);
e5b36c
+	if (!NDR_ERR_CODE_IS_SUCCESS(ndr_pull_steal_switch_value(ndr, r, &level)))
e5b36c
+		level = 0;
e5b36c
 	{
e5b36c
 		uint32_t _flags_save_STRUCT = ndr->flags;
e5b36c
 		ndr_set_flags(&ndr->flags, LIBNDR_FLAG_NOALIGN);
e5b36c
@@ -2237,8 +2244,8 @@ enum ndr_err_code  ndr_pull_RestrictionV
e5b36c
 
e5b36c
 _PUBLIC_ void ndr_print_RestrictionVariable(struct ndr_print *ndr, const char *name, const union RestrictionVariable *r)
e5b36c
 {
e5b36c
-	int level;
e5b36c
-	level = ndr_print_get_switch_value(ndr, r);
e5b36c
+	uint32_t level;
e5b36c
+	level = ndr_print_steal_switch_value(ndr, r);
e5b36c
 	ndr_print_union(ndr, name, level, "RestrictionVariable");
e5b36c
 	switch (level) {
e5b36c
 		case 0x0: