/*
  zip_file_set_encryption.c -- set encryption for file in archive
  Copyright (C) 2016 Dieter Baron and Thomas Klausner

  This file is part of libzip, a library to manipulate ZIP archives.
  The authors can be contacted at <libzip@nih.at>

  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions
  are met:
  1. Redistributions of source code must retain the above copyright
     notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright
     notice, this list of conditions and the following disclaimer in
     the documentation and/or other materials provided with the
     distribution.
  3. The names of the authors may not be used to endorse or promote
     products derived from this software without specific prior
     written permission.
 
  THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
  GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
  IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/


#include "zipint.h"

#include <stdlib.h>
#include <string.h>

ZIP_EXTERN int
zip_file_set_encryption(zip_t *za, zip_uint64_t idx, zip_uint16_t method, const char *password)
{
    zip_entry_t *e;
    zip_uint16_t old_method;

    if (idx >= za->nentry) {
	zip_error_set(&za->error, ZIP_ER_INVAL, 0);
	return -1;
    }

    if (ZIP_IS_RDONLY(za)) {
	zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
	return -1;
    }

    if (_zip_get_encryption_implementation(method, ZIP_CODEC_ENCODE) == NULL) {
	zip_error_set(&za->error, ZIP_ER_COMPNOTSUPP, 0);
	return -1;
    }

    e = za->entry+idx;
    
    old_method = (e->orig == NULL ? ZIP_EM_NONE : e->orig->encryption_method);
    
    if (method == old_method && password == NULL) {
	if (e->changes) {
	    if (e->changes->changed & ZIP_DIRENT_PASSWORD) {
		_zip_crypto_clear(e->changes->password, strlen(e->changes->password));
		free(e->changes->password);
		e->changes->password = e->orig->password;
	    }
	    e->changes->changed &= ~(ZIP_DIRENT_ENCRYPTION_METHOD|ZIP_DIRENT_PASSWORD);
	    if (e->changes->changed == 0) {
		_zip_dirent_free(e->changes);
		e->changes = NULL;
	    }
	}
    }
    else {
	char *our_password = NULL;

	if (password) {
	    if ((our_password = strdup(password)) == NULL) {
		zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
		return -1;
	    }
	}
	
        if (e->changes == NULL) {
            if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) {
		if (our_password) {
		    _zip_crypto_clear(our_password, strlen(our_password));
		}
		free(our_password);
                zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
                return -1;
            }
        }

        e->changes->encryption_method = method;
        e->changes->changed |= ZIP_DIRENT_ENCRYPTION_METHOD;
	if (password) {
	    e->changes->password = our_password;
	    e->changes->changed |= ZIP_DIRENT_PASSWORD;
	}
	else {
	    if (e->changes->changed & ZIP_DIRENT_PASSWORD) {
		_zip_crypto_clear(e->changes->password, strlen(e->changes->password));
		free(e->changes->password);
		e->changes->password = e->orig ? e->orig->password : NULL;
		e->changes->changed &= ~ZIP_DIRENT_PASSWORD;
	    }
	}
    }
    
    return 0;
}
