Add two flags to allow for handling of Extended Signatures (Session Key Protection...
[samba.git] / source3 / smbd / mangle_hash.c
index 80cd3abc7b479919351908a20d404ea7c80cc10a..056879c8765b0a8d1b0215f6e50bd24dc99fc367 100644 (file)
@@ -25,6 +25,8 @@
 #include "smbd/smbd.h"
 #include "smbd/globals.h"
 #include "mangle.h"
+#include "util_tdb.h"
+#include "lib/param/loadparm.h"
 
 /* -------------------------------------------------------------------------- **
  * Other stuff...
@@ -86,7 +88,7 @@ static void init_valid_table(void)
                return;
        }
 
-       valid_table = (uint8 *)map_file(data_path("valid.dat"), 0x10000);
+       valid_table = (uint8 *)map_file(data_path(talloc_tos(), "valid.dat"), 0x10000);
        if (!valid_table) {
                smb_panic("Could not load valid.dat file required for mangle method=hash");
                return;
@@ -143,6 +145,25 @@ static NTSTATUS has_illegal_chars(const smb_ucs2_t *s, bool allow_wildcards)
        return NT_STATUS_OK;
 }
 
+/*******************************************************************
+ Duplicate string.
+********************************************************************/
+
+static smb_ucs2_t *strdup_w(const smb_ucs2_t *src)
+{
+       smb_ucs2_t *dest;
+       size_t len = strlen_w(src);
+       dest = SMB_MALLOC_ARRAY(smb_ucs2_t, len + 1);
+       if (!dest) {
+               DEBUG(0,("strdup_w: out of memory!\n"));
+               return NULL;
+       }
+
+       memcpy(dest, src, len * sizeof(smb_ucs2_t));
+       dest[len] = 0;
+       return dest;
+}
+
 /* return False if something fail and
  * return 2 alloced unicode strings that contain prefix and extension
  */
@@ -313,9 +334,6 @@ static bool is_8_3(const char *fname, bool check_case, bool allow_wildcards,
        smb_ucs2_t *ucs2name;
        NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
        size_t size;
-       char magic_char;
-
-       magic_char = lp_magicchar(p);
 
        if (!fname || !*fname)
                return False;
@@ -407,8 +425,8 @@ static bool is_mangled(const char *s, const struct share_params *p)
        magic = strchr_m( s, magic_char );
        while( magic && magic[1] && magic[2] ) {         /* 3 chars, 1st is magic. */
                if( ('.' == magic[3] || '/' == magic[3] || !(magic[3]))          /* Ends with '.' or nul or '/' ?  */
-                               && isbasechar( toupper_ascii(magic[1]) )           /* is 2nd char basechar?  */
-                               && isbasechar( toupper_ascii(magic[2]) ) )         /* is 3rd char basechar?  */
+                               && isbasechar( toupper_m(magic[1]) )           /* is 2nd char basechar?  */
+                               && isbasechar( toupper_m(magic[2]) ) )         /* is 3rd char basechar?  */
                        return( True );                           /* If all above, then true, */
                magic = strchr_m( magic+1, magic_char );      /*    else seek next magic. */
        }
@@ -454,7 +472,7 @@ static void cache_mangled_name( const char mangled_name[13],
                return;
 
        /* Init the string lengths. */
-       safe_strcpy(mangled_name_key, mangled_name, sizeof(mangled_name_key)-1);
+       strlcpy(mangled_name_key, mangled_name, sizeof(mangled_name_key));
 
        /* See if the extensions are unmangled.  If so, store the entry
         * without the extension, thus creating a "group" reverse map.
@@ -462,7 +480,7 @@ static void cache_mangled_name( const char mangled_name[13],
        s1 = strrchr( mangled_name_key, '.' );
        if( s1 && (s2 = strrchr( raw_name, '.' )) ) {
                size_t i = 1;
-               while( s1[i] && (tolower_ascii( s1[i] ) == s2[i]) )
+               while( s1[i] && (tolower_m( s1[i] ) == s2[i]) )
                        i++;
                if( !s1[i] && !s2[i] ) {
                        /* Truncate at the '.' */
@@ -514,9 +532,6 @@ static bool lookup_name_from_8_3(TALLOC_CTX *ctx,
        TDB_DATA data_val;
        char *saved_ext = NULL;
        char *s = talloc_strdup(ctx, in);
-       char magic_char;
-
-       magic_char = lp_magicchar(p);
 
        /* If the cache isn't initialized, give up. */
        if(!s || !tdb_mangled_cache ) {
@@ -568,6 +583,19 @@ static bool lookup_name_from_8_3(TALLOC_CTX *ctx,
        return *out ? True : False;
 }
 
+/**
+ Check if a string is in "normal" case.
+**/
+
+static bool strisnormal(const char *s, int case_default)
+{
+       if (case_default == CASE_UPPER)
+               return(!strhaslower(s));
+
+       return(!strhasupper(s));
+}
+
+
 /*****************************************************************************
  Do the actual mangling to 8.3 format.
 *****************************************************************************/
@@ -606,7 +634,7 @@ static bool to_8_3(char magic_char, const char *in, char out[13], int default_ca
 
        if( p ) {
                if( p == s )
-                       safe_strcpy( extension, "___", 3 );
+                       strlcpy( extension, "___", 4);
                else {
                        *p++ = 0;
                        while( *p && extlen < 3 ) {
@@ -638,7 +666,7 @@ static bool to_8_3(char magic_char, const char *in, char out[13], int default_ca
 
        if( *extension ) {
                out[baselen+3] = '.';
-               safe_strcpy(&out[baselen+4], extension, 3);
+               strlcpy(&out[baselen+4], extension, 4);
        }
 
        SAFE_FREE(s);
@@ -651,9 +679,6 @@ static bool must_mangle(const char *name,
        smb_ucs2_t *name_ucs2 = NULL;
        NTSTATUS status;
        size_t converted_size;
-       char magic_char;
-
-       magic_char = lp_magicchar(p);
 
        if (!push_ucs2_talloc(NULL, &name_ucs2, name, &converted_size)) {
                DEBUG(0, ("push_ucs2_talloc failed!\n"));
@@ -706,7 +731,7 @@ static bool hash_name_to_8_3(const char *in,
        if (NT_STATUS_IS_OK(is_valid_name(in_ucs2, False, False)) &&
                                NT_STATUS_IS_OK(is_8_3_w(in_ucs2, False))) {
                TALLOC_FREE(in_ucs2);
-               safe_strcpy(out, in, 12);
+               strlcpy(out, in, 13);
                return True;
        }