Mony
Mony

Reputation: 103

DotNetZip wrong password while unzipping

Scenario: upload file than try zip it using DotNetZip with password protection, password is generated with Membership.GeneratePassword() method. Everything is working fine except that sometimes user is not able to unzip files with generated password. Wired thing is that this happens only sometimes let's say 1 out of 15 times. Generate password:

public static String FilePassword()
{
    while (_filePassword.Length < 12)
    {
        _filePassword += string.Concat(Membership.GeneratePassword(1, 0).Where(char.IsLetterOrDigit));
    }

    return _filePassword;
}

Save file:

if (FileUploadControl.HasFile)
{

    fileName = Path.GetFileName(FileUploadControl.FileName);
    FileUploadControl.SaveAs(FileSavePath + fileName);

        // Archive uploaded file to zip.
        using (ZipFile zip = new ZipFile())
        {
            // File to be archived.
            var file = FileUploadControl.PostedFile;

            // Enable encryption of file
            zip.Encryption = EncryptionAlgorithm.PkzipWeak;

            // Set password.
            zip.Password = Settings.FilePassword();

            // Set temporary folder path for archive process.
            zip.TempFileFolder = tempPath;

            // Add file to archive with its path.
            zip.AddFile(FileSavePath + file.FileName, "");

            File objFile = new File(file.FileName, FileSavePath); 

            // Save zip file with the name as file ID.
            zip.Save(FileSavePath + file.FileName);
        }
}

I logged password while creating in method and also while protecting zip file with password, they are always matching, I cannot see what's wrong, why sometimes while unzipping file it shows wrong password.

Upvotes: 0

Views: 597

Answers (1)

Why do you use the static global variable _filePassword in FilePassword() instead of one in scope?

This way it could be modified from outside, or possible even still contain the last used value. Also it isn't thread safe without lock.

Settle with a local variable and it should be fine.

public static String FilePassword()
{
    string retString = string.Empty;
    while (retString.Length < 12)
    {
        retString += string.Concat(Membership.GeneratePassword(1, 0).Where(char.IsLetterOrDigit));
    }    
    return retString;
}

You can log a return Value too.


Sample for understanding

if (FileUploadControl.HasFile)
{

    fileName = Path.GetFileName(FileUploadControl.FileName);
    FileUploadControl.SaveAs(FileSavePath + fileName);
    string filePassword = Settings.FilePassword(); // Contains the Password

    using (ZipFile zip = new ZipFile())
    {
        var file = FileUploadControl.PostedFile;
        zip.Encryption = EncryptionAlgorithm.PkzipWeak;            
        zip.Password = filePassword; // <-- Set password for ZIP
        zip.TempFileFolder = tempPath;
        zip.AddFile(FileSavePath + file.FileName, "");
        File objFile = new File(file.FileName, FileSavePath);
        zip.Save(FileSavePath + file.FileName);
    }

    // Log this value!
    Log(filePassword);
}

Upvotes: 1

Related Questions