Fix nonempty blank lines in vfs_gpfs.c
[abartlet/samba.git/.git] / source3 / auth / auth_ntlmssp.c
index 738af73f49691d3287c36c9135d48cabee1901cf..0d46b14f97e54f1e560c7f2216d45c13905fc5e6 100644 (file)
@@ -8,7 +8,7 @@
 
    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 2 of the License, or
+   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,
@@ -17,8 +17,7 @@
    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, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
 
 #include "includes.h"
@@ -30,7 +29,8 @@
 
 static const uint8 *auth_ntlmssp_get_challenge(const struct ntlmssp_state *ntlmssp_state)
 {
-       AUTH_NTLMSSP_STATE *auth_ntlmssp_state = ntlmssp_state->auth_context;
+       AUTH_NTLMSSP_STATE *auth_ntlmssp_state =
+               (AUTH_NTLMSSP_STATE *)ntlmssp_state->auth_context;
        return auth_ntlmssp_state->auth_context->get_ntlm_challenge(auth_ntlmssp_state->auth_context);
 }
 
@@ -39,9 +39,10 @@ static const uint8 *auth_ntlmssp_get_challenge(const struct ntlmssp_state *ntlms
  *
  * @return If the effective challenge used by the auth subsystem may be modified
  */
-static BOOL auth_ntlmssp_may_set_challenge(const struct ntlmssp_state *ntlmssp_state)
+static bool auth_ntlmssp_may_set_challenge(const struct ntlmssp_state *ntlmssp_state)
 {
-       AUTH_NTLMSSP_STATE *auth_ntlmssp_state = ntlmssp_state->auth_context;
+       AUTH_NTLMSSP_STATE *auth_ntlmssp_state =
+               (AUTH_NTLMSSP_STATE *)ntlmssp_state->auth_context;
        struct auth_context *auth_context = auth_ntlmssp_state->auth_context;
 
        return auth_context->challenge_may_be_modified;
@@ -53,7 +54,8 @@ static BOOL auth_ntlmssp_may_set_challenge(const struct ntlmssp_state *ntlmssp_s
  */
 static NTSTATUS auth_ntlmssp_set_challenge(struct ntlmssp_state *ntlmssp_state, DATA_BLOB *challenge)
 {
-       AUTH_NTLMSSP_STATE *auth_ntlmssp_state = ntlmssp_state->auth_context;
+       AUTH_NTLMSSP_STATE *auth_ntlmssp_state =
+               (AUTH_NTLMSSP_STATE *)ntlmssp_state->auth_context;
        struct auth_context *auth_context = auth_ntlmssp_state->auth_context;
 
        SMB_ASSERT(challenge->length == 8);
@@ -65,7 +67,7 @@ static NTSTATUS auth_ntlmssp_set_challenge(struct ntlmssp_state *ntlmssp_state,
 
        DEBUG(5, ("auth_context challenge set by %s\n", auth_context->challenge_set_by));
        DEBUG(5, ("challenge is: \n"));
-       dump_data(5, (const char *)auth_context->challenge.data, auth_context->challenge.length);
+       dump_data(5, auth_context->challenge.data, auth_context->challenge.length);
        return NT_STATUS_OK;
 }
 
@@ -77,9 +79,11 @@ static NTSTATUS auth_ntlmssp_set_challenge(struct ntlmssp_state *ntlmssp_state,
 
 static NTSTATUS auth_ntlmssp_check_password(struct ntlmssp_state *ntlmssp_state, DATA_BLOB *user_session_key, DATA_BLOB *lm_session_key) 
 {
-       AUTH_NTLMSSP_STATE *auth_ntlmssp_state = ntlmssp_state->auth_context;
+       AUTH_NTLMSSP_STATE *auth_ntlmssp_state =
+               (AUTH_NTLMSSP_STATE *)ntlmssp_state->auth_context;
        auth_usersupplied_info *user_info = NULL;
        NTSTATUS nt_status;
+       bool username_was_mapped;
 
        /* the client has given us its machine name (which we otherwise would not get on port 445).
           we need to possibly reload smb.conf if smb.conf includes depend on the machine name */
@@ -101,6 +105,8 @@ static NTSTATUS auth_ntlmssp_check_password(struct ntlmssp_state *ntlmssp_state,
                                       NULL, NULL, NULL,
                                       True);
 
+       user_info->logon_parameters = MSV1_0_ALLOW_SERVER_TRUST_ACCOUNT | MSV1_0_ALLOW_WORKSTATION_TRUST_ACCOUNT;
+
        if (!NT_STATUS_IS_OK(nt_status)) {
                return nt_status;
        }
@@ -108,11 +114,24 @@ static NTSTATUS auth_ntlmssp_check_password(struct ntlmssp_state *ntlmssp_state,
        nt_status = auth_ntlmssp_state->auth_context->check_ntlm_password(auth_ntlmssp_state->auth_context, 
                                                                          user_info, &auth_ntlmssp_state->server_info); 
 
+       username_was_mapped = user_info->was_mapped;
+
        free_user_info(&user_info);
 
        if (!NT_STATUS_IS_OK(nt_status)) {
                return nt_status;
        }
+
+       auth_ntlmssp_state->server_info->nss_token |= username_was_mapped;
+
+       nt_status = create_local_token(auth_ntlmssp_state->server_info);
+
+       if (!NT_STATUS_IS_OK(nt_status)) {
+               DEBUG(10, ("create_local_token failed: %s\n",
+                       nt_errstr(nt_status)));
+               return nt_status;
+       }
+
        if (auth_ntlmssp_state->server_info->user_session_key.length) {
                DEBUG(10, ("Got NT session key of length %u\n",
                        (unsigned int)auth_ntlmssp_state->server_info->user_session_key.length));
@@ -161,15 +180,20 @@ NTSTATUS auth_ntlmssp_start(AUTH_NTLMSSP_STATE **auth_ntlmssp_state)
        (*auth_ntlmssp_state)->ntlmssp_state->may_set_challenge = auth_ntlmssp_may_set_challenge;
        (*auth_ntlmssp_state)->ntlmssp_state->set_challenge = auth_ntlmssp_set_challenge;
        (*auth_ntlmssp_state)->ntlmssp_state->check_password = auth_ntlmssp_check_password;
-       (*auth_ntlmssp_state)->ntlmssp_state->server_role = lp_server_role();
+       (*auth_ntlmssp_state)->ntlmssp_state->server_role = (enum server_types)lp_server_role();
 
        return NT_STATUS_OK;
 }
 
 void auth_ntlmssp_end(AUTH_NTLMSSP_STATE **auth_ntlmssp_state)
 {
-       TALLOC_CTX *mem_ctx = (*auth_ntlmssp_state)->mem_ctx;
+       TALLOC_CTX *mem_ctx;
+
+       if (*auth_ntlmssp_state == NULL) {
+               return;
+       }
 
+       mem_ctx = (*auth_ntlmssp_state)->mem_ctx;
        if ((*auth_ntlmssp_state)->ntlmssp_state) {
                ntlmssp_end(&(*auth_ntlmssp_state)->ntlmssp_state);
        }
@@ -177,7 +201,7 @@ void auth_ntlmssp_end(AUTH_NTLMSSP_STATE **auth_ntlmssp_state)
                ((*auth_ntlmssp_state)->auth_context->free)(&(*auth_ntlmssp_state)->auth_context);
        }
        if ((*auth_ntlmssp_state)->server_info) {
-               free_server_info(&(*auth_ntlmssp_state)->server_info);
+               TALLOC_FREE((*auth_ntlmssp_state)->server_info);
        }
        talloc_destroy(mem_ctx);
        *auth_ntlmssp_state = NULL;