s3-vfs: include smbd/smbd.h in vfs modules.
[samba.git] / source3 / modules / vfs_smb_traffic_analyzer.c
index 35a0ccbd873d3345a689dd4412a4aed5f6bfa476..a8a6cb75a7eca075c4f71b3a640f3f4589bb6d41 100644 (file)
  */
 
 #include "includes.h"
+#include "smbd/smbd.h"
+#include "../smbd/globals.h"
 #include "../lib/crypto/crypto.h"
 #include "vfs_smb_traffic_analyzer.h"
+#include "../libcli/security/security.h"
+#include "secrets.h"
+#include "../librpc/gen_ndr/ndr_netlogon.h"
 
 /* abstraction for the send_over_network function */
 enum sock_type {INTERNET_SOCKET = 0, UNIX_DOMAIN_SOCKET};
@@ -164,11 +169,11 @@ static char *smb_traffic_analyzer_encrypt( TALLOC_CTX *ctx,
 {
        int s1,s2,h,d;
        AES_KEY key;
-       char filler[17]= "................";
+       unsigned char filler[17]= "................";
        char *output;
-       char crypted[18];
+       unsigned char crypted[18];
        if (akey == NULL) return NULL;
-       samba_AES_set_encrypt_key(akey, 128, &key);
+       samba_AES_set_encrypt_key((unsigned char *) akey, 128, &key);
        s1 = strlen(str) / 16;
        s2 = strlen(str) % 16;
        for (h = 0; h < s2; h++) *(filler+h)=*(str+(s1*16)+h);
@@ -177,10 +182,10 @@ static char *smb_traffic_analyzer_encrypt( TALLOC_CTX *ctx,
        output = talloc_array(ctx, char, (s1*16)+17 );
        d=0;
        for (h = 0; h < s1; h++) {
-               samba_AES_encrypt(str+(16*h), crypted, &key);
+               samba_AES_encrypt((unsigned char *) str+(16*h), crypted, &key);
                for (d = 0; d<16; d++) output[d+(16*h)]=crypted[d];
        }
-       samba_AES_encrypt( str+(16*h), filler, &key );
+       samba_AES_encrypt( (unsigned char *) str+(16*h), filler, &key );
        for (d = 0;d < 16; d++) output[d+(16*h)]=*(filler+d);
        *len = (s1*16)+16;
        return output;  
@@ -196,7 +201,7 @@ static char *smb_traffic_analyzer_create_header( TALLOC_CTX *ctx,
        const char *state_flags, size_t data_len)
 {
        char *header = talloc_asprintf( ctx, "V2.%s%017u",
-                                       state_flags, data_len);
+                                       state_flags, (unsigned int) data_len);
        DEBUG(10, ("smb_traffic_analyzer_send_data_socket: created Header:\n"));
        dump_data(10, (uint8_t *)header, strlen(header));
        return header;
@@ -298,6 +303,8 @@ static char *smb_traffic_analyzer_create_string( TALLOC_CTX *ctx,
        char *usersid = NULL;
        char *buf = NULL;
        char *vfs_operation_str = NULL;
+       const char *service_name = lp_const_servicename(handle->conn->params->service);
+
        /*
         * first create the data that is transfered with any VFS op
         * These are, in the following order:
@@ -308,6 +315,7 @@ static char *smb_traffic_analyzer_create_string( TALLOC_CTX *ctx,
         * 4.affected share
         * 5.domain
         * 6.timestamp
+        * 7.IP Addresss of client
         */
 
        /*
@@ -325,7 +333,7 @@ static char *smb_traffic_analyzer_create_string( TALLOC_CTX *ctx,
         * anonymized if needed, by the calling function.
         */
        usersid = dom_sid_string( common_data_count_str,
-               &handle->conn->server_info->ptok->user_sids[0]);
+               &handle->conn->session_info->security_token->sids[0]);
 
        sidstr = smb_traffic_analyzer_anonymize(
                common_data_count_str,
@@ -345,20 +353,23 @@ static char *smb_traffic_analyzer_create_string( TALLOC_CTX *ctx,
        len = strlen( timestr );
        /* create the string of common data */
        buf = talloc_asprintf(ctx,
-               "%s%04u%s%04u%s%04u%s%04u%s%04u%s%04u%s",
+               "%s%04u%s%04u%s%04u%s%04u%s%04u%s%04u%s%04u%s",
                common_data_count_str,
-               strlen(vfs_operation_str),
+               (unsigned int) strlen(vfs_operation_str),
                vfs_operation_str,
-               strlen(username),
+               (unsigned int) strlen(username),
                username,
-               strlen(sidstr),
+               (unsigned int) strlen(sidstr),
                sidstr,
-               strlen(handle->conn->connectpath),
-               handle->conn->connectpath,
-               strlen(pdb_get_domain(handle->conn->server_info->sam_account)),
-               pdb_get_domain(handle->conn->server_info->sam_account),
-               strlen(timestr),
-               timestr);
+               (unsigned int) strlen(service_name),
+               service_name,
+               (unsigned int)
+               strlen(handle->conn->session_info->info3->base.domain.string),
+               handle->conn->session_info->info3->base.domain.string,
+               (unsigned int) strlen(timestr),
+               timestr,
+               (unsigned int) strlen(handle->conn->sconn->client_id.addr),
+               handle->conn->sconn->client_id.addr);
 
        talloc_free(common_data_count_str);
 
@@ -414,7 +425,7 @@ static void smb_traffic_analyzer_send_data(vfs_handle_struct *handle,
        }
 
        GetTimeOfDay(&tv);
-       tv_sec = convert_timespec_to_time_t(convert_timeval_to_timespec(tv));
+       tv_sec = tv.tv_sec;
        tm = localtime(&tv_sec);
        if (!tm) {
                return;
@@ -428,7 +439,7 @@ static void smb_traffic_analyzer_send_data(vfs_handle_struct *handle,
         * function.
         */
        username = smb_traffic_analyzer_anonymize( talloc_tos(),
-                       handle->conn->server_info->sanitized_username,
+                       handle->conn->session_info->sanitized_username,
                        handle);
 
        if (!username) {
@@ -459,7 +470,7 @@ static void smb_traffic_analyzer_send_data(vfs_handle_struct *handle,
                        "\"%04d-%02d-%02d %02d:%02d:%02d.%03d\"\n",
                        (unsigned int) s_data->len,
                        username,
-                       pdb_get_domain(handle->conn->server_info->sam_account),
+                       handle->conn->session_info->info3->base.domain.string,
                        Write ? 'W' : 'R',
                        handle->conn->connectpath,
                        s_data->filename,
@@ -470,6 +481,7 @@ static void smb_traffic_analyzer_send_data(vfs_handle_struct *handle,
                        tm->tm_min,
                        tm->tm_sec,
                        (int)seconds);
+               len = strlen(str);
                if (write_data(rf_sock->sock, str, len) != len) {
                        DEBUG(1, ("smb_traffic_analyzer_send_data_socket: "
                        "error sending V1 protocol data to socket!\n"));
@@ -535,7 +547,8 @@ static void smb_traffic_analyzer_send_data(vfs_handle_struct *handle,
                                tm, seconds, handle, username, vfs_operation,
                                2, ((struct rw_data *) data)->filename, \
                                talloc_asprintf(talloc_tos(), "%u", \
-                               ((struct rw_data *) data)->len));
+                               (unsigned int)
+                                       ((struct rw_data *) data)->len));
                        break;
                default:
                        DEBUG(1, ("smb_traffic_analyzer: error! "
@@ -545,7 +558,7 @@ static void smb_traffic_analyzer_send_data(vfs_handle_struct *handle,
 
        } else {
                DEBUG(1, ("smb_traffic_analyzer_send_data_socket: "
-                       "error, unkown protocol given!\n"));
+                       "error, unknown protocol given!\n"));
                return;
        }
 
@@ -569,6 +582,7 @@ static void smb_traffic_analyzer_send_data(vfs_handle_struct *handle,
                        " found, encrypting data!\n"));
                output = smb_traffic_analyzer_encrypt( talloc_tos(),
                                                akey, str, &len);
+               SAFE_FREE(akey);
                header = smb_traffic_analyzer_create_header( talloc_tos(),
                                                state_flags, len);
 
@@ -708,7 +722,6 @@ static int smb_traffic_analyzer_rename(vfs_handle_struct *handle, \
        return s_data.result;
 }
 
-#if 0
 static int smb_traffic_analyzer_rmdir(vfs_handle_struct *handle, \
                        const char *path)
 {
@@ -719,7 +732,6 @@ static int smb_traffic_analyzer_rmdir(vfs_handle_struct *handle, \
        smb_traffic_analyzer_send_data(handle, &s_data, vfs_id_rmdir);
        return s_data.result;
 }
-#endif
 
 static int smb_traffic_analyzer_mkdir(vfs_handle_struct *handle, \
                        const char *path, mode_t mode)
@@ -811,6 +823,7 @@ static int smb_traffic_analyzer_open(vfs_handle_struct *handle, \
        DEBUG(10,("smb_traffic_analyzer_open: OPEN: %s\n",
                fsp_str_dbg(fsp)));
        s_data.filename = fsp->fsp_name->base_name;
+       s_data.mode = mode;
        smb_traffic_analyzer_send_data(handle,
                        &s_data,
                        vfs_id_open);
@@ -842,6 +855,7 @@ static struct vfs_fn_pointers vfs_smb_traffic_analyzer_fns = {
        .rename = smb_traffic_analyzer_rename,
        .chdir = smb_traffic_analyzer_chdir,
        .open = smb_traffic_analyzer_open,
+       .rmdir = smb_traffic_analyzer_rmdir,
        .close_fn = smb_traffic_analyzer_close
 };