libcli/auth: add netlogon_creds_shallow_copy_logon()
authorStefan Metzmacher <metze@samba.org>
Wed, 24 Apr 2013 10:53:27 +0000 (12:53 +0200)
committerAndreas Schneider <asn@samba.org>
Mon, 5 Aug 2013 08:30:01 +0000 (10:30 +0200)
This can be used before netlogon_creds_encrypt_samlogon_logon()
in order to keep the provided buffers unchanged.

Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
libcli/auth/credentials.c
libcli/auth/proto.h

index 78a8d7ad6c8fa1ea9f777ae60cc09d273e91c30c..1f664d35b61d763fd368e1471ac115632e1e1afd 100644 (file)
@@ -719,6 +719,79 @@ void netlogon_creds_encrypt_samlogon_logon(struct netlogon_creds_CredentialState
        netlogon_creds_crypt_samlogon_logon(creds, level, logon, true);
 }
 
+union netr_LogonLevel *netlogon_creds_shallow_copy_logon(TALLOC_CTX *mem_ctx,
+                                       enum netr_LogonInfoClass level,
+                                       const union netr_LogonLevel *in)
+{
+       union netr_LogonLevel *out;
+
+       if (in == NULL) {
+               return NULL;
+       }
+
+       out = talloc(mem_ctx, union netr_LogonLevel);
+       if (out == NULL) {
+               return NULL;
+       }
+
+       *out = *in;
+
+       switch (level) {
+       case NetlogonInteractiveInformation:
+       case NetlogonInteractiveTransitiveInformation:
+       case NetlogonServiceInformation:
+       case NetlogonServiceTransitiveInformation:
+               if (in->password == NULL) {
+                       return out;
+               }
+
+               out->password = talloc(out, struct netr_PasswordInfo);
+               if (out->password == NULL) {
+                       talloc_free(out);
+                       return NULL;
+               }
+               *out->password = *in->password;
+
+               return out;
+
+       case NetlogonNetworkInformation:
+       case NetlogonNetworkTransitiveInformation:
+               break;
+
+       case NetlogonGenericInformation:
+               if (in->generic == NULL) {
+                       return out;
+               }
+
+               out->generic = talloc(out, struct netr_GenericInfo);
+               if (out->generic == NULL) {
+                       talloc_free(out);
+                       return NULL;
+               }
+               *out->generic = *in->generic;
+
+               if (in->generic->data == NULL) {
+                       return out;
+               }
+
+               if (in->generic->length == 0) {
+                       return out;
+               }
+
+               out->generic->data = talloc_memdup(out->generic,
+                                                  in->generic->data,
+                                                  in->generic->length);
+               if (out->generic->data == NULL) {
+                       talloc_free(out);
+                       return NULL;
+               }
+
+               return out;
+       }
+
+       return out;
+}
+
 /*
   copy a netlogon_creds_CredentialState struct
 */
index 110e039eaecb523ad7d839906502cd8e44989f48..0c319d32e7bfaf093f733aa3c69ed7f9a3b5b273 100644 (file)
@@ -70,6 +70,9 @@ void netlogon_creds_decrypt_samlogon_logon(struct netlogon_creds_CredentialState
 void netlogon_creds_encrypt_samlogon_logon(struct netlogon_creds_CredentialState *creds,
                                           enum netr_LogonInfoClass level,
                                           union netr_LogonLevel *logon);
+union netr_LogonLevel *netlogon_creds_shallow_copy_logon(TALLOC_CTX *mem_ctx,
+                                       enum netr_LogonInfoClass level,
+                                       const union netr_LogonLevel *in);
 
 /* The following definitions come from /home/jeremy/src/samba/git/master/source3/../source4/../libcli/auth/session.c  */