Add GenericInfo level for SamLogon calls from the WSPP IDL.
authorAndrew Bartlett <abartlet@samba.org>
Tue, 12 Aug 2008 07:46:01 +0000 (17:46 +1000)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 12 Aug 2008 07:46:01 +0000 (17:46 +1000)
Andrew Bartlett
(This used to be commit ea58b650a81b48b0477edbcda1e4e26a3b2a9b9e)

source4/librpc/idl/netlogon.idl
source4/rpc_server/netlogon/dcerpc_netlogon.c

index d8f7d2f7e60b20dd779a9aacfe9c8d97ea624aa2..62f1b8843a0dffd02ab8d519b070e98f3cbada78 100644 (file)
@@ -123,12 +123,31 @@ interface netlogon
                netr_ChallengeResponse lm;
        } netr_NetworkInfo;
 
-       typedef [public,switch_type(uint16)] union {
-               [case(1)] netr_PasswordInfo *password;
-               [case(2)] netr_NetworkInfo  *network;
-               [case(3)] netr_PasswordInfo *password;
-               [case(5)] netr_PasswordInfo *password;
-               [case(6)] netr_NetworkInfo  *network;
+       typedef [flag(NDR_PAHEX)] struct {
+               netr_IdentityInfo identity_info;
+               lsa_String  package_name;
+               uint32 length;
+               [size_is(length),length_is(length)] uint8 *data;
+       } netr_GenericInfo;
+
+       typedef enum {
+               NetlogonInteractiveInformation = 1,
+               NetlogonNetworkInformation = 2,
+               NetlogonServiceInformation = 3,
+               NetlogonGenericInformation = 4,
+               NetlogonInteractiveTransitiveInformation = 5,
+               NetlogonNetworkTransitiveInformation = 6,
+               NetlogonServiceTransitiveInformation = 7
+       } netr_LogonInfoClass;
+
+       typedef [public,switch_type(netr_LogonInfoClass)] union {
+               [case(NetlogonInteractiveInformation)]           netr_PasswordInfo *password;
+               [case(NetlogonNetworkInformation)]               netr_NetworkInfo  *network;
+               [case(NetlogonServiceInformation)]               netr_PasswordInfo *password;
+               [case(NetlogonGenericInformation)]               netr_GenericInfo  *generic;
+               [case(NetlogonInteractiveTransitiveInformation)] netr_PasswordInfo *password;
+               [case(NetlogonNetworkTransitiveInformation)]     netr_NetworkInfo  *network;
+               [case(NetlogonServiceTransitiveInformation)]     netr_PasswordInfo *password;
        } netr_LogonLevel;
 
        typedef [public,flag(NDR_PAHEX)] struct {
@@ -239,15 +258,15 @@ interface netlogon
        } netr_Authenticator;
 
        NTSTATUS netr_LogonSamLogon(
-               [in,unique] [string,charset(UTF16)] uint16 *server_name,
-               [in,unique] [string,charset(UTF16)] uint16 *computer_name,
-               [in,unique] netr_Authenticator *credential,
-               [in,out,unique] netr_Authenticator *return_authenticator,
-               [in]  uint16 logon_level,
-               [in]  [switch_is(logon_level)] netr_LogonLevel logon,
-               [in]  uint16 validation_level,
+               [in,unique] [string,charset(UTF16)] uint16         *server_name,
+               [in,unique] [string,charset(UTF16)] uint16         *computer_name,
+               [in,unique] netr_Authenticator                     *credential,
+               [in,out,unique] netr_Authenticator                 *return_authenticator,
+               [in]  netr_LogonInfoClass                           logon_level,
+               [in]  [switch_is(logon_level)] netr_LogonLevel      logon,
+               [in]  uint16                                        validation_level,
                [out] [switch_is(validation_level)] netr_Validation validation,
-               [out] uint8 authoritative
+               [out] uint8                                         authoritative
                );
 
 
index d9ae92c0fa7002c918de4c29bf8a53d49b4592f4..763e6a327e1f7cfb93cdf265a21ae437c00b6dd6 100644 (file)
@@ -421,9 +421,10 @@ static NTSTATUS dcesrv_netr_LogonSamLogon_base(struct dcesrv_call_state *dce_cal
        user_info->remote_host = NULL;
 
        switch (r->in.logon_level) {
-       case 1:
-       case 3:
-       case 5:
+       case NetlogonInteractiveInformation:
+       case NetlogonServiceInformation:
+       case NetlogonInteractiveTransitiveInformation:
+       case NetlogonServiceTransitiveInformation:
                if (creds->negotiate_flags & NETLOGON_NEG_ARCFOUR) {
                        creds_arcfour_crypt(creds, 
                                            r->in.logon.password->lmpassword.hash, 
@@ -460,8 +461,8 @@ static NTSTATUS dcesrv_netr_LogonSamLogon_base(struct dcesrv_call_state *dce_cal
                *user_info->password.hash.nt = r->in.logon.password->ntpassword;
 
                break;
-       case 2:
-       case 6:
+       case NetlogonNetworkInformation:
+       case NetlogonNetworkTransitiveInformation:
 
                /* TODO: we need to deny anonymous access here */
                nt_status = auth_context_create(mem_ctx, 
@@ -483,6 +484,13 @@ static NTSTATUS dcesrv_netr_LogonSamLogon_base(struct dcesrv_call_state *dce_cal
                user_info->password.response.nt = data_blob_talloc(mem_ctx, r->in.logon.network->nt.data, r->in.logon.network->nt.length);
        
                break;
+
+               
+       case NetlogonGenericInformation:
+       {
+               /* Until we get enough information for an implemetnation */
+               return NT_STATUS_INVALID_PARAMETER;
+       }
        default:
                return NT_STATUS_INVALID_PARAMETER;
        }