From 91ff058420b2dc7ee55e0a0a5f4586ab2cd88387 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=BCnther=20Deschner?= Date: Mon, 8 Feb 2021 23:45:42 +0100 Subject: [PATCH] librpc: add custom odj_switch_level_from_guid() This function maintains an arbitrary mapping of GUID strings to integers. This is required as only integers can be used as discriminators for autogenerated ODJ unions. Guenther Signed-off-by: Guenther Deschner Reviewed-by: Alexander Bokovoy --- librpc/idl/ODJ.idl | 7 +++++ librpc/ndr/ndr_ODJ.c | 65 ++++++++++++++++++++++++++++++++++++++++++++ librpc/ndr/ndr_ODJ.h | 22 +++++++++++++++ librpc/wscript_build | 2 +- 4 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 librpc/ndr/ndr_ODJ.c create mode 100644 librpc/ndr/ndr_ODJ.h diff --git a/librpc/idl/ODJ.idl b/librpc/idl/ODJ.idl index b33d3db7f11..429db5518a8 100644 --- a/librpc/idl/ODJ.idl +++ b/librpc/idl/ODJ.idl @@ -28,6 +28,13 @@ import "misc.idl", "lsa.idl", "netlogon.idl", "security.idl"; cpp_quote("#define OP_JP2_FLAG_PERSISTENTSITE 0x00000001") +[ + uuid("11111111-3333-5555-7777-99999999"), + version(0.0), + pointer_default(unique), + helpstring("Offline Domain Join IDL"), + helper("../librpc/ndr/ndr_ODJ.h") +] interface ODJ { typedef struct { diff --git a/librpc/ndr/ndr_ODJ.c b/librpc/ndr/ndr_ODJ.c new file mode 100644 index 00000000000..86630b88827 --- /dev/null +++ b/librpc/ndr/ndr_ODJ.c @@ -0,0 +1,65 @@ +/* + Unix SMB/CIFS implementation. + + routines for marshalling/unmarshalling special ODJ structures + + Copyright (C) Guenther Deschner 2021 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "includes.h" +#include "../librpc/gen_ndr/ndr_ODJ.h" +#include "../librpc/ndr/ndr_ODJ.h" + +uint32_t odj_switch_level_from_guid(const struct GUID *r) +{ + struct { + uint16_t level; + const char *guid; + } levels[] = { + { + .level = 1, + .guid = ODJ_GUID_JOIN_PROVIDER + },{ + .level = 2, + .guid = ODJ_GUID_JOIN_PROVIDER2 + },{ + .level = 3, + .guid = ODJ_GUID_JOIN_PROVIDER3 + },{ + .level = 4, + .guid = ODJ_GUID_CERT_PROVIDER + },{ + .level = 5, + .guid = ODJ_GUID_POLICY_PROVIDER + } + }; + int i; + + for (i = 0; i < ARRAY_SIZE(levels); i++) { + struct GUID guid; + NTSTATUS status; + + status = GUID_from_string(levels[i].guid, &guid); + if (!NT_STATUS_IS_OK(status)) { + return 0; + } + if (GUID_equal(&guid, r)) { + return levels[i].level; + } + } + + return 0; +} diff --git a/librpc/ndr/ndr_ODJ.h b/librpc/ndr/ndr_ODJ.h new file mode 100644 index 00000000000..f57f2d77437 --- /dev/null +++ b/librpc/ndr/ndr_ODJ.h @@ -0,0 +1,22 @@ +/* + Unix SMB/CIFS implementation. + + routines for marshalling/unmarshalling special ODJ structures + + Copyright (C) Guenther Deschner 2021 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +uint32_t odj_switch_level_from_guid(const struct GUID *r); diff --git a/librpc/wscript_build b/librpc/wscript_build index 3354806349f..b82209b4299 100644 --- a/librpc/wscript_build +++ b/librpc/wscript_build @@ -362,7 +362,7 @@ bld.SAMBA_SUBSYSTEM('NDR_DRSBLOBS', ) bld.SAMBA_SUBSYSTEM('NDR_ODJ', - source='gen_ndr/ndr_ODJ.c', + source='gen_ndr/ndr_ODJ.c ndr/ndr_ODJ.c', public_deps='NDR_LSA NDR_NETLOGON NDR_SECURITY', deps='ndr')