/*
  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 (method != ZIP_EM_NONE && _zip_get_encryption_implementation(method, ZIP_CODEC_ENCODE) == NULL) {
	zip_error_set(&za->error, ZIP_ER_ENCRNOTSUPP, 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 == NULL ? NULL : 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;
}
