librpc: add custom odj_switch_level_from_guid()
authorGünther Deschner <gd@samba.org>
Mon, 8 Feb 2021 22:45:42 +0000 (23:45 +0100)
committerGünther Deschner <gd@samba.org>
Wed, 14 Jul 2021 16:49:29 +0000 (16:49 +0000)
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 <gd@samba.org>
Reviewed-by: Alexander Bokovoy <ab@samba.org>
librpc/idl/ODJ.idl
librpc/ndr/ndr_ODJ.c [new file with mode: 0644]
librpc/ndr/ndr_ODJ.h [new file with mode: 0644]
librpc/wscript_build

index b33d3db7f115c7973df15a3edef56d137ac448a6..429db5518a836e029d524aa24465e3253f961bb3 100644 (file)
@@ -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 (file)
index 0000000..86630b8
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+*/
+
+#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 (file)
index 0000000..f57f2d7
--- /dev/null
@@ -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 <http://www.gnu.org/licenses/>.
+*/
+
+uint32_t odj_switch_level_from_guid(const struct GUID *r);
index 3354806349fb74d4a74cd2d3d29e0288e647e1e2..b82209b429939d19cd8636e3b42ad9c464a13ef7 100644 (file)
@@ -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')