#!/usr/bin/perl

# VERSION : RELEASE 1.1

 #####     #    ######  ####### #     # ####### #######     #####         #        #     #
#     #   # #   #     # #       ##    # #          #       #     #       # #       #     #
#        #   #  #     # #       # #   # #          #       #            #   #      #     #
 #####  #     # ######  #####   #  #  # #####      #        #####      #     #     #     #
      # ####### #   #   #       #   # # #          #             # ### ####### ### #     #
#     # #     # #    #  #       #    ## #          #       #     # ### #     # ### #     #
 #####  #     # #     # ####### #     # #######    #        #####  ### #     # ###  #####


############################# LICENSE #############################
#
# Davical interface for command line is a software developed by
# Egoitz Aurrekoetxea at Sarenet S.A.U (http://www.sarenet.es/).
#
# It is under BSD license and is distributed as is without any
# other warranty. You can contact with me in the following
# email address : egoitz(at)sarenet.es
#
# Enjoy!
#
# Copyright (c) Sarenet S.A.U (http://www.sarenet.es/).
# All rights reserved.
#
# 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. Neither the name of Sarenet S.A.U nor the names of its contributors
#    may be used to endorse or promote products derived from this software
#    without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY SARENET S.A.U AND CONTRIBUTORS ``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 SARENET S.A.U OR CONTRIBUTORS 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.
#
######################### IMPORTANT NOTES #########################
#
# SEE ALSO: https://wiki.davical.org/index.php/DAViCal-cli
#
# This code has been created for and used in a FreeBSD machine with Davical
# installed from the own ports (at the beginning). This means that in this
# version the hardcoded paths and checks will have some customization for that
# environment. Even they have been hardcoded in this version (which probably
# will be improved in the following releases of this tool) they can be easily
# customed for your env.
#
# About hardcoded important notes:
#
# * This program does not hardcoded any admin of database for managing
#   different Davical domain instances. It fetches from the config file
#   credentials for each of the Davical database it manages. This way we make
#   more difficult for an attacker to try to do a massive change. It fetches
#   config files the way described in the next point.
#
# * Function obtener_conexion_a_bbdd --> Line 1971 --> my $fichero =
#   "/usr/local/etc/davical/".$dominioloc.".organizer.sarenet.es-conf.php";
#
#   This tool is being used in production env in a mail hosting service where
#   each domain contains it's own Davical instance and the config of each
#   instance is located under /usr/local/etc/davical.
#
# * This script assumes default collections, calendar and addresses should
#   never be removed for the fact of being the default ones... and for keeping a
#   default same content in all accounts.
#
# * It logs to syslog by default to the local2 facility and info priority. Can
#   easily be changed in ## SYSLOG STAFF section.
#
# * At present time it does only contemplate read only or read write
#   permissions. It allows too by default seeing if an account is busy or free in
#   the calendar.
#
#   Even being bynarily defined the rest of permissions and not being used at
#   this moment at least... as said. Everyone who needs to make use of them, the
#   code is pretty ordered for being to achieve some modifications which could
#   allow anyone use different permission types.
#
# * I wanted to excuse myself for being all syslogged comments, vars,
#   functions, etc in Spanish. This code had been done in some "free" and other
#   non free times I had at work but the coding having to be compatible with
#   other tasks I do as Sarenet sysadmin/postmaster, etc…. So the more
#   significant errors, var names, function names and so where for me... the most
#   easily I could get all job finished. So excuse me but at least in the first
#   times of this code (where I didn't know If I was going to be able to make it
#   open  even) was important to be in my native language.
#
# * The URL this code manages are basically :
#   https://the-customer-domain-without-dots-or-dash.organizer.sarenet.es/caldav.php/_______.
#   So for instance for a domain like acme-comp.com.es the URL would be :
#   https://acmecompcomes.organizer.sarenet.es/caldav.php/_______. When in the
#   code you see $dominioloc var is referring to the domain after this
#   transformation.
#
# * Lines containing the string "organizer.sarenet.es/caldav.php". The product
#   name at Sarenet is Organizer. And the URL always called is :
#   https://____________.organizer.sarenet.es/caldav.php/____ so it's too
#   hardcoded in the code.
#
# * 9987982389 is nothing but an invented error code which is pretty dificult
#   to any time be owned by any valid id.
#
# * Of course you can, have to... must... whatever any line you need to adapt
#   for your env. Mainly talking about literals. Specially literals like :
#
#   "Fallo en acceso a BBDD. CONTACTE CON SARENET."
#
#   As said previously this code was written for easily being understood in
#   literal terms and so... by anyone at Sarenet.
#
# * It has too some very light security meassures in function
#   comprobar_permiso_ejecutar. It does some checks that could help you at least
#   delaying slihtly an attack. Obviously you have to properly configure the
#   function for your env in order to use this code. You could too remove all
#   code inside this function if you prefer it.
#
# * The code reads database access credentials from a file in which the
#   pg_connect line has the format : $c->pg_connect[] = "host=XX.XX.XX.XX
#   port=5432 dbname=whatever user=whatever password=whatever”;
#
#
# In case of suffering issues or having doubts of it's working mode, please
# contact me at egoitz@sarenet.es email address and I'll help you happily :)
#
###################################################################

## REQUIRED PERL MODULES
use DBI;
use strict;
use warnings;
use Getopt::Long;
use Switch;
use Sys::Syslog qw(:DEFAULT setlogsock);


## SYSLOG STAFF
our $syslog_socktype = 'unix'; # inet, unix, stream, console
our $syslog_facility="local2";
our $syslog_options="pid";
our $syslog_priority="info";

openlog $0, $syslog_options, $syslog_facility;

## DATABASE CONNECTION VARIABLES
our $driver = "Pg";
our $host = "";
our $database = "";
our $dsn = "";
our $userid = "";
our $password = "";
our $dbh = "";

our $error_general = '9987982389';
our $mensaje_fallo_gen = "";
our $colec_default_calendar = 'calendar';
our $colec_default_addresses = 'addresses';
our $permisos_defecto_nada = 'NONE';

## GENERAL PURPOSE VARIABLES
our $usuario = "";
our $usudest = "";
our $grupo = "";
our $principal = "";
our $permisos = "";
our $coleccion = "";
our $tipocol = "";
our $email = "";
our $dominio = "";
our $coldispname = "";
our $idoperacion = 99;
our $dequien = "";

our $usercorriendo = "";

our $verbose = 0;

## DAVICAL PERMISSIONS
our $perm_all              = '000000001111111111111111';
our $perm_readwrite        = '000000001111111011100111';
our $perm_read             = '000000000001001000100001';
our $perm_readsched        = '000000001111111000100001';
our $perm_freebusy         = '000000000001001000000000';
our $perm_schedliv         = '000000000001110000000000';
our $perm_schedsend        = '000000001110000000000000';
our $perm_none             = '000000000000000000000000';
our $perm_resetprinc       = '000000001111111000100000';

#### POSSIBLE OPERATIONS
#
### 1  - CREATE COLLECTION
### 2  - REMOVE COLLECTION
### 3  - APPEND USER TO A GROUP OF AN OWNER (OWNERS ARE THE WAY OF UNIQUELY IDENTIFY A GROUP FROM A CONCRETE PRINCIPAL OR USER)
### 4  - REMOVE USER TO A GROUP OF AN OWNER (OWNERS ARE THE WAY OF UNIQUELY IDENTIFY A GROUP FROM A CONCRETE PRINCIPAL OR USER)
### 5  - GRANT CONCRETE PERMISSIONS TO A PRINCIPAL IN ANOTHER PRINCIPAL (PRINCIPALS ARE FINALLY JUST USERS)
### 6  - REVOKE PERMISSIONS TO A PRINCIPAL IN PRINCIPAL (PRINCIPALS ARE FINALLY JUST USERS)
### 7  - GRANT PERMISSIONS TO A PRINCIPAL (A USER FINALLY) IN A COLLECTION OF ANOTHER PRINCIPAL (ANOTHER USER FINALLY)
### 8  - REVOKE PERMISSIONS TO A PRINCIPAL (A USER FINALLY) IN A COLLECTION OF ANOTHER PRINCIPAL (ANOTHER USER FINALLY)
### 9  - CREATE GROUP OWNED BY USER (BY A PRINCIPAL FINALLY)
### 10 - REMOVE GROUP OWNED BY USER (BY A PRINCIPAL FINALLY)
### 11 - REMOVE PRINCIPAL/USER (AN ACCOUNT FINALLY WITH ALL THE COLLECTIONS)
### 12 - SET DEFAULT PERMISSIONS IN A COLLECTION OF A PRINCIPAL
### 13 - UNSET DEFAULT PERMISSIONS IN A COLLECTION OF A PRINCIPAL
### 14 - SET DEFAULT PERMISSIONS IN A PRINCIPAL
### 15 - UNSET DEFAULT PERMISSIONS IN A PRINCIPAL
### 16 - OBTAIN PRINCIPAL GRANTS FOR DISPLAYING THEM FOR EXAMPLE IN THE WEBMAIL....
### 17 - OBTAIN GROUP MEMBERS FROM A GROUP OWNED BY AN USER (A PRINCIPAL)
### 18 - OBTAIN GROUPS OWNED BY AN USER (OR PRINCIPAL)
### 19 - SET A COLLECTION'S (FROM A PRINCIPAL) DISPLAY NAME
### 20 - OBTAIN PERMISSIONS GRANTED TO OTHER USERS IN MY COLLECTIONS
### 21 - OBTAIN A LIST OF ALL CREATED USERS IN THE DAVICAL INSTANCE
### 22 - OBTAIN A LISTING WHICH DISPLAYS FROM A CONCRETE OWNER, GROUP:MEMBERS
### 23 - COMBINED LISTING OF 16,20,21,22
#
##########################

#### FUNCIONES BASICAS PARA SER COMBINADAS EN OTRAS FUNCIONES MAS COMPLEJAS QUE HAGAN LAS TAREAS

sub comprobar_error_variable {
	if (($_[0] == '9987982389') && ($_[1] eq ""))
	{
		syslog $syslog_priority, "Error general en rutina de comprobacion general, al comprobar valor de variable. CONTACTE CON SARENET.";
		$dbh->disconnect();
		closelog();
		die "Error general en rutina de comprobacion general, al comprobar valor de variable. CONTACTE CON SARENET.";
	}
	elsif (($_[0] == '9987982389') && ($_[1] ne ""))
	{
		syslog $syslog_priority, $_[1];
		$dbh->disconnect();
		closelog();
		die "Error general en rutina de comprobacion general, al comprobar valor de variable. CONTACTE CON SARENET.";
	}
}

sub comprobar_error_variable_texto {
	if (($_[0] eq '9987982389') && ($_[1] eq ""))
	{
		syslog $syslog_priority, "Error general en rutina de comprobacion general, al comprobar valor de variable. CONTACTE CON SARENET.";
		$dbh->disconnect();
		closelog();
		die "Error general en rutina de comprobacion general, al comprobar valor de variable. CONTACTE CON SARENET.";
	}
	elsif (($_[0] eq '9987982389') && ($_[1] ne ""))
	{
		syslog $syslog_priority, $_[1];
		$dbh->disconnect();
		closelog();
		die "Error general en rutina de comprobacion general, al comprobar valor de variable. CONTACTE CON SARENET.";
	}
}

sub comprobar_error_array {
	if (grep(/^$9987982389$/, @{$_[0]}) && ($_[1] eq ""))
	{
		syslog $syslog_priority, "Error general en rutina de comprobacion general, al comprobar valor de array. CONTACTE CON SARENET.";
		$dbh->disconnect();
		closelog();
		die "Error general en rutina de comprobacion general, al comprobar valor de array. CONTACTE CON SARENET.";
	}
	elsif (grep(/^$9987982389$/, @{$_[0]}) && ($_[1] ne ""))
	{
		syslog $syslog_priority, $_[1];
		$dbh->disconnect();
		closelog();
		die "Error general en rutina de comprobacion general, al comprobar valor de array. CONTACTE CON SARENET.";
	}
}

sub func_remplazo_die {
	$dbh->disconnect();
	closelog();
	syslog $syslog_priority, $_[0];
	die $_[0];
}

sub comprobar_version {
	my $stmt = qq(SELECT schema_major||'.'||schema_minor FROM awl_db_revision ORDER BY schema_id DESC LIMIT 1;);
	my $sth = $dbh->prepare( $stmt );
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my $i = 0;
	my $version = "";
	if($rv < 0){
		print $DBI::errstr;
	}
	@row = $sth->fetchrow_array();
	$version = $row[0];

	if ($version != '1.2')
	{
		func_remplazo_die("Version de esquema incompatible. CONTACTE CON SARENET.");
	}
}

sub sacar_userid {
	syslog $syslog_priority, "Obteniendo userid de usuario : ----$_[0]----" if ($verbose==1);
	## Se quotea el valor del nombre de usuario del que obtener el id. Nos lo pasan al llamar a la funcion
	my $entfuncq = $dbh->quote($_[0]);
	my $stmt = "SELECT user_no FROM usr WHERE username = "."$entfuncq"." LIMIT 1;";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare( $stmt );
	$entfuncq = $dbh->quote($_[0]);
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	if($rv < 0){
		print $DBI::errstr;
	}
	@row = $sth->fetchrow_array();
	my $usuarioid = $row[0];

	if (scalar(@row) > 0)
	{
		syslog $syslog_priority, "Para userid de usuario ----$_[0]---- devolvemos id de usuario ----$usuarioid----" if ($verbose==1);
	return($usuarioid);
	}
	else
	{
		syslog $syslog_priority, "Para userid de usuario ----$_[0]---- devolvemos id de usuario ----ERROR 9987982389----" if ($verbose==1);
		return($error_general);
	}
}

sub sacar_principalid {
	my $entfuncq = $dbh->quote($_[0]);
	## Se quotea el valor del ID de usuario del que obtener el id. Nos lo pasan al llamar a la funcion
	my $stmt = "SELECT principal_id FROM principal WHERE user_no = "."$entfuncq"." LIMIT 1;";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare( $stmt );
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my $principalid = "";
	if($rv < 0){
		print $DBI::errstr;
	}
	@row = $sth->fetchrow_array();
	$principalid = $row[0];

	if (scalar(@row) > 0)
	{
		syslog $syslog_priority, "El valor que devolvemos para ID de principal del usuario con usuario id ---$_[0]--- es ---$principalid---" if ($verbose==1);
		return($principalid);
	}
	else
	{
		syslog $syslog_priority, "El valor que devolvemos para ID de principal del usuario con usuario id ---$_[0]--- es ---ERROR 9987982389---" if ($verbose==1);
		return($error_general);
	}
}

sub sacar_userid_principal {
	my $entfuncq = $dbh->quote($_[0]);
	## Se quotea el valor del ID de principal de usuario del que obtener el id de usuario. Nos lo pasan al llamar a la funcion
	my $stmt = "SELECT user_no FROM principal WHERE principal_id = "."$entfuncq"." LIMIT 1;";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare( $stmt );
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my $userno = "";
	if($rv < 0){
		print $DBI::errstr;
	}
	@row = $sth->fetchrow_array();
	$userno = $row[0];

	if (scalar(@row) > 0)
	{
		syslog $syslog_priority, "El ID del usuario del ID del principal ----$_[0]---- es ---$userno---" if ($verbose==1);
		return($userno);
	}
	else
	{
		syslog $syslog_priority, "El ID del usuario del ID del principal ----$_[0]---- es ---ERROR 9987982389---" if ($verbose==1);
		return($error_general);
	}
}

sub sacar_username_deidusu {
	my $entfuncq = $dbh->quote($_[0]);
	## Se quotea el valor del ID de usuario del que obtener el nombre de usuario. Nos lo pasan al llamar a la funcion
	my $stmt = "SELECT username FROM usr WHERE user_no = "."$entfuncq"." LIMIT 1;";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare( $stmt );
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my $username = "";
	if($rv < 0){
		print $DBI::errstr;
	}
	@row = $sth->fetchrow_array();
	$username = $row[0];

	if (scalar(@row) > 0)
	{
		syslog $syslog_priority, "El username obtenido de userid : ----$_[0]---- es ---$username---" if ($verbose==1);
		return($username);
	}
	else
	{
		syslog $syslog_priority, "El username obtenido de userid : ----$_[0]---- es ---ERROR 9987982389---" if ($verbose==1);
		return($error_general);
	}
}

sub sacar_tipo_principal {
	my $entfuncq = $dbh->quote($_[0]);
	## Se quotea el valor del ID de usuario del que obtener el tipo de principal que es. Nos lo pasan al llamar a la funcion
	my $stmt = "SELECT principal_type_desc FROM ((usr LEFT JOIN principal USING (user_no)) LEFT JOIN role_member USING (user_no)) LEFT JOIN principal_type ON (principal_type_id = type_id) WHERE user_no = "."$entfuncq"." AND active = 't' and role_no IS DISTINCT FROM '1' LIMIT 1;";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare( $stmt );
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my $principaltype = "";
	if($rv < 0){
		print $DBI::errstr;
	}
	@row = $sth->fetchrow_array();
	$principaltype = $row[0];

	if (scalar(@row) > 0)
	{
		syslog $syslog_priority, "El tipo de principal obtenido al consultarlo para el id de usuario ----$_[0]---- es ----$principaltype-----" if ($verbose==1);
		return($principaltype);
	}
	else
	{
		syslog $syslog_priority, "El tipo de principal obtenido al consultarlo para el id de usuario ----$_[0]---- es ----ERROR 9987982389-----" if ($verbose==1);
		return($error_general);
	}
}

sub tipo_principal_es_persona {
	my $tipo_principal = sacar_tipo_principal($_[0]);

	if ($tipo_principal eq $error_general)
	{
		syslog $syslog_priority, "Al consultar si el tipo de principal del usuario ID ---$_[0]--- es Persona decimos NO y devolvemos 1" if ($verbose==1);
		return(1);
	}

	if ($tipo_principal eq "Person")
	{
		syslog $syslog_priority, "Al consultar si el tipo de principal del usuario ID ---$_[0]--- es Persona decimos SI y devolvemos 0" if ($verbose==1);
		return(0);
	}
	else
	{
		syslog $syslog_priority, "Al consultar si el tipo de principal del usuario ID ---$_[0]--- es Persona decimos NO y devolvemos 1" if ($verbose==1);
		return(1);
	}
}

sub tipo_principal_es_grupo {
	my $tipo_principal = sacar_tipo_principal($_[0]);

	if ($tipo_principal eq $error_general)
	{
		syslog $syslog_priority, "Al consultar si el tipo de principal del usuario ID ---$_[0]--- es Grupo decimos NO y devolvemos 1" if ($verbose==1);
		return(1);
	}

	if ($tipo_principal eq "Group")
	{
		syslog $syslog_priority, "Al consultar si el tipo de principal del usuario ID ---$_[0]--- es Grupo decimos SI y devolvemos 0" if ($verbose==1);
		return(0);
	}
	else
	{
		syslog $syslog_priority, "Al consultar si el tipo de principal del usuario ID ---$_[0]--- es Grupo decimos NO y devolvemos 1" if ($verbose==1);
		return(1);
	}
}

sub sacar_colecciones_usuario {
	my $entfuncq = $dbh->quote($_[0]);
	## Se quotea el valor del ID de usuario del que obtener que colecciones tiene. Nos lo pasan al llamar a la funcion
	my $stmt = "SELECT dav_name,is_addressbook,collection_id FROM collection WHERE user_no = "."$entfuncq".";";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare( $stmt );
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my @parte_collection = ();
	my @nombres_id_tipo_collections = ();
	my $contador = 0;
	if($rv < 0){
		print $DBI::errstr;
	}

	while(@row = $sth->fetchrow_array()) {
		@parte_collection = split(/\//, $row[0]);
		$nombres_id_tipo_collections[$contador][0] = $parte_collection[2];
		$nombres_id_tipo_collections[$contador][1] = $row[1];
		$nombres_id_tipo_collections[$contador][2] = $row[2];

		$contador = $contador + 1;
	}

	if (scalar(@nombres_id_tipo_collections) > 0)
	{
		return(@nombres_id_tipo_collections);
	}
	else
	{
	syslog $syslog_priority, "Del id de usuario ---$_[0]--- sacamos que tiene las colecciones ----ERROR 9987982389----" if ($verbose==1);
		@nombres_id_tipo_collections = ('9987982389');
		return(@nombres_id_tipo_collections);
	}
}

sub comprobar_existencia_permisos {
	my $en_princ_o_col = $_[0];
	my $permisos_supuestos_no_existen = $_[1];
	my $id_princ_origen = $_[2];
	my $id_princ_col_destino = $_[3];
	my $ok_adelante = '0';
	my $permisos_nombre_que_existen = "";

	if ($en_princ_o_col == '0')
	{
		my $entfuncq = $dbh->quote($id_princ_origen);
		my $entfuncq2 = $dbh->quote($id_princ_col_destino);
		## Se quotea el valor del ID de principal para el que sacar permisos externos en otras colecciones. Nos lo pasan al llamar a la funcion
		my $stmt = "SELECT privileges FROM grants WHERE to_principal = "."$entfuncq"." AND by_principal = "."$entfuncq2"." LIMIT 1;";
		syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
		my $sth = $dbh->prepare($stmt);
		my $rv = $sth->execute() or die $DBI::errstr;
		my @row = ();
		my @array_coles_permisos = ();
		my $contador = 0;
		if($rv < 0){
		print $DBI::errstr;
		die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
		}

		@row = $sth->fetchrow_array();
		my $permisos_que_existen = $row[0];
		$permisos_nombre_que_existen = permisosbin_a_nombre($permisos_que_existen);
		syslog $syslog_priority, "Para el principal ID origen ---$id_princ_origen--- en principal ID destino ---$id_princ_col_destino--- existen permisos de ---$permisos_nombre_que_existen---" if ($verbose==1);
	}
	elsif ($en_princ_o_col == '1')
	{
		my $entfuncq = $dbh->quote($id_princ_origen);
		my $entfuncq2 = $dbh->quote($id_princ_col_destino);
		## Se quotea el valor del ID de principal para el que sacar permisos externos en otras colecciones. Nos lo pasan al llamar a la funcion
		my $stmt = "SELECT privileges FROM grants WHERE to_principal = "."$entfuncq"." AND by_collection = "."$entfuncq2"." LIMIT 1;";
		syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
		my $sth = $dbh->prepare($stmt);
		my $rv = $sth->execute() or die $DBI::errstr;
		my @row = ();
		my @array_coles_permisos = ();
		my $contador = 0;
		if($rv < 0){
		print $DBI::errstr;
		die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
		}

		@row = $sth->fetchrow_array();
		my $permisos_que_existen = $row[0];
		$permisos_nombre_que_existen = permisosbin_a_nombre($permisos_que_existen);
		syslog $syslog_priority, "Para el principal ID origen ---$id_princ_origen--- en collection ID destino ---$id_princ_col_destino--- existen permisos de ---$permisos_nombre_que_existen---" if ($verbose==1);
	}

	if ($permisos_supuestos_no_existen ne $permisos_nombre_que_existen)
	{
		syslog $syslog_priority, "Adelante en aplicar esos permisos" if ($verbose==1);
		return($ok_adelante);
	}
	else
	{
		syslog $syslog_priority, "Los permisos ya estan aplicados y no se tiene que volver a aplicar" if ($verbose==1);
		return($error_general);
	}
}

sub sacar_id_colecc_usuario_nombre {
	my $entfuncq = $dbh->quote($_[0]);
	my $entfuncq2 = $dbh->quote($_[1]);
	## Se quotea el valor del id de usuario y nombre completo de la coleccion para obtener un id de coleccion. Nos lo pasan al llamar a la funcion
	my $stmt = "SELECT collection_id FROM collection WHERE user_no = "."$entfuncq"." AND dav_name = "."$entfuncq2"." LIMIT 1;";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare( $stmt );
	my $id_col = 998798238;
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	if($rv < 0){
		print $DBI::errstr;
	}

	@row = $sth->fetchrow_array();
	$id_col = $row[0];

	if (scalar(@row) > 0)
	{
		syslog $syslog_priority, "Para el ID de usuario ---$_[0]--- y nombre de coleccion ---$_[1]--- el id de coleccion vale ---$id_col---" if ($verbose==1);
		return($id_col);
	}
	else
	{
		syslog $syslog_priority, "Para el ID de usuario ---$_[0]--- y nombre de coleccion ---$_[1]--- el id de coleccion vale ---ERROR 9987982389---" if ($verbose==1);
		return($error_general);
	}
}

sub sacar_nombre_id_colecc {
	## Se quotea el valor del id de coleccion para obtener el nombre completo de coleccion. Nos lo pasan al llamar a la funcion
	my $entfuncq = $dbh->quote($_[0]);
	my $stmt = "SELECT dav_name FROM collection WHERE collection_id = "."$entfuncq"." LIMIT 1;";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare( $stmt );
	my $dav_name = 998798238;
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	if($rv < 0){
		print $DBI::errstr;
	}

	@row = $sth->fetchrow_array();
	$dav_name = $row[0];

	if (scalar(@row) > 0)
	{
		syslog $syslog_priority, "El valor que devolvemos de nombre de coleccion para id de coleccion ----$_[0]--- vale ---$dav_name---" if ($verbose==1);
		return($dav_name);
	}
	else
	{
		syslog $syslog_priority, "El valor que devolvemos de nombre de coleccion para id de coleccion ----$_[0]--- vale ---ERROR 9987982389---" if ($verbose==1);
		return($error_general);
	}
}


sub sacar_permisos_acceso_autorizados_defecto {

	## Se quotea el valor del id de coleccion para obtener el nombre completo de coleccion. Nos lo pasan al llamar a la funcion

	### PRIMERO SACO LAS COLECCIONES QUE TIENEN PERMISOS POR DEFECTO DE LECTURA
	my $colec_usu_opquetoca = "";
	my $stmt = "SELECT parent_container,dav_name,user_no,collection_id FROM collection WHERE default_privileges = "."'$perm_read'".";";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare($stmt);
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my @array_coles_permisos_defecto_lectura = ();
	my @array_coles_permisos_defecto_lecturaescritura = ();
	my @resultado_devolver = ();
	my $contador = 0;
	my $dominioloc = $dominio;
	$dominioloc =~ s/\.//g;
	$dominioloc =~ s/-//g;
	if($rv < 0){
		print $DBI::errstr;
		die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
	}

	while(@row = $sth->fetchrow_array()) {
		$array_coles_permisos_defecto_lectura[$contador][0] = $row[0];
		$array_coles_permisos_defecto_lectura[$contador][1] = $row[1];
		$array_coles_permisos_defecto_lectura[$contador][2] = $row[2];
		$array_coles_permisos_defecto_lectura[$contador][3] = $row[3];
		$contador = $contador + 1;
	}

	### LUEGO SACO LAS COLECCIONES QUE TIENEN PERMISOS POR DEFECTO DE LECTURA-ESCRITURA
	$contador = 0;
	$stmt = "SELECT parent_container,dav_name,user_no,collection_id FROM collection WHERE default_privileges = "."'$perm_readwrite'".";";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	$sth = $dbh->prepare($stmt);
	$rv = $sth->execute() or die $DBI::errstr;
	@row = ();
	$contador = 0;
	if($rv < 0){
		print $DBI::errstr;
		die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
	}

	while(@row = $sth->fetchrow_array()) {
		$array_coles_permisos_defecto_lecturaescritura[$contador][0] = $row[0];
		$array_coles_permisos_defecto_lecturaescritura[$contador][1] = $row[1];
		$array_coles_permisos_defecto_lecturaescritura[$contador][2] = $row[2];
		$array_coles_permisos_defecto_lecturaescritura[$contador][3] = $row[3];
		$contador = $contador + 1;
	}

	### AHORA SACO QUE PRINCIPALS TIENEN PERMISO DE LECTURA --- NOOO TIENE QUE HABER PRINCIPALS CON PERMISOS EN LECTURA-ESCRITURA
	$contador = 0;
	$stmt = "SELECT principal_id FROM principal WHERE (default_privileges = '".$perm_read."' OR default_privileges = '".$perm_readwrite."');";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	$sth = $dbh->prepare($stmt);
	$rv = $sth->execute() or die $DBI::errstr;
	@row = ();
	my @array_principal_permisos_defecto_lectura = ();
	$contador = 0;
	if($rv < 0){
		print $DBI::errstr;
		die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
	}

	while(@row = $sth->fetchrow_array()) {
		$array_principal_permisos_defecto_lectura[$contador] = $row[0];
		$contador = $contador + 1;
	}

	### AHORA CRUZAMOS LOS ARRAYS PARA VER QUE COLECCIONES PUEDEN SER ACCEDIDAS POR SUS PERMISOS POR DEFECTO POR TENERLOS TAMBIEN SUS RESPECTIVOS PRINCIPALS
	$contador = 0;
	my $principal_revisar = 0;
	my $princ_que_toca = 0;
	foreach $colec_usu_opquetoca (@array_coles_permisos_defecto_lectura) {
		$principal_revisar = sacar_principalid(@$colec_usu_opquetoca[2]);
		foreach $princ_que_toca (@array_principal_permisos_defecto_lectura)
		{
			if ($princ_que_toca == $principal_revisar)
			{
				$resultado_devolver[$contador][0] = 'https://'.$dominioloc.'.organizer.sarenet.es/caldav.php'.@$colec_usu_opquetoca[1].'';
				$resultado_devolver[$contador][1] = 'READ';
				$resultado_devolver[$contador][2] = coleccion_es_libreta_o_agenda(@$colec_usu_opquetoca[3]);
				$contador = $contador + 1;
				next;
			}
		}
	}

	foreach $colec_usu_opquetoca (@array_coles_permisos_defecto_lecturaescritura) {
		$principal_revisar = sacar_principalid(@$colec_usu_opquetoca[2]);
		foreach $princ_que_toca (@array_principal_permisos_defecto_lectura)
		{
			if ($princ_que_toca == $principal_revisar)
			{
				$resultado_devolver[$contador][0] = 'https://'.$dominioloc.'.organizer.sarenet.es/caldav.php'.@$colec_usu_opquetoca[1].'';
				$resultado_devolver[$contador][1] = 'READWRITE';
				$resultado_devolver[$contador][2] = coleccion_es_libreta_o_agenda(@$colec_usu_opquetoca[3]);
				$contador = $contador + 1;
				next;
			}
		}
	}

	return(@resultado_devolver);
}

sub colecc_tiene_permisos_por_defecto {
	my $colec_usu_opquetoca = "";
	my $stmt = "SELECT user_no FROM collection WHERE (default_privileges = '".$perm_read."' OR default_privileges = '".$perm_readwrite."') AND collection_id = '".$_[0]."' LIMIT 1;";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare($stmt);
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my @array_coles_permisos_defecto_lectura = ();
	my @array_coles_permisos_defecto_lecturaescritura = ();
	my @resultado_devolver = ();
	my $contador = 0;
	my $dominioloc = $dominio;
	my $userid_para_comp_principal = '0';
	$dominioloc =~ s/\.//g;
	$dominioloc =~ s/-//g;
	if($rv < 0){
		print $DBI::errstr;
		die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
	}

	@row = $sth->fetchrow_array();
	$userid_para_comp_principal = $row[0];
	if ((defined($userid_para_comp_principal)) && ($userid_para_comp_principal =~ /^[+-]?\d+$/))
	{
		if ($userid_para_comp_principal != '0')
		{
			syslog $syslog_priority, "El userid que miro vale ----$userid_para_comp_principal----" if ($verbose==1);

			my $stmt = "SELECT principal_id FROM principal WHERE (default_privileges = '".$perm_read."' OR default_privileges = '".$perm_readwrite."') AND user_no = '".$userid_para_comp_principal."';";
			syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
			$sth = $dbh->prepare($stmt);
			$rv = $sth->execute() or die $DBI::errstr;
			if($rv < 0){
				print $DBI::errstr;
				die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
			}

			@row = $sth->fetchrow_array();
			if (scalar(@row) > 0)
			{
				syslog $syslog_priority, "El tipo de coleccion para el ID de coleccion ---$_[0]--- tiene permisos por defecto" if ($verbose==1);
				my $devolvemos = 0;
				return($devolvemos);
			}
		}
		else
		{
			syslog $syslog_priority, "Nos ha salido userid 0... algo raro ocurre...." if ($verbose==1);
			my $devolvemos = 1;
			return($devolvemos);
		}
	}
	else
	{
		syslog $syslog_priority, "El tipo de coleccion para el ID de coleccion ---$_[0]--- NO tiene permisos por defecto---" if ($verbose==1);
		my $devolvemos = 1;
		return($devolvemos);
	}
}

sub ver_permisos_defecto_colecc {
	my $stmt = "SELECT default_privileges FROM collection WHERE (default_privileges = '".$perm_read."' OR default_privileges = '".$perm_readwrite."') AND collection_id = '".$_[0]."' LIMIT 1;";
	syslog $syslog_priority, "  Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare($stmt);
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my $default_privileges_collection = '9987982389';
	if($rv < 0){
		print $DBI::errstr;
		die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
	}

	@row = $sth->fetchrow_array();
	$default_privileges_collection = $row[0];

	if (defined($default_privileges_collection))
	{
		if (($default_privileges_collection ne '9987982389') && ($default_privileges_collection ne ''))
		{
			syslog $syslog_priority, (" Los permisos binarios que obtengo para colec id ----$_[0]---- valen ----$default_privileges_collection----");
			my $nombre_permisos_defecto = permisosbin_a_nombre($default_privileges_collection);
			return($nombre_permisos_defecto);
		}
	}
	else
	{
		syslog $syslog_priority, " La colecc ----$_[0]---- no tiene permisos por defecto de lectura o lectura-escritura" if ($verbose==1);
		return($error_general);
	}
}

sub sacar_permisos_de_principalconcreto_en_colecciones {
	my $entfuncq = $dbh->quote($_[0]);
	my $entfuncq2 = $dbh->quote($_[1]);
	## Se quotea el valor del ID de principal para el que sacar permisos externos en otras principals. Nos lo pasan al llamar a la funcion
	my $stmt = "SELECT to_principal,privileges FROM grants WHERE by_collection = "."$entfuncq"." AND to_principal = "."$entfuncq2".";";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare($stmt);
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my @array_coles_permisos = ();
	my $contador = 0;
	if($rv < 0){
		print $DBI::errstr;
		die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
	}

	while(@row = $sth->fetchrow_array()) {
		$array_coles_permisos[$contador][0] = $row[0];
		$array_coles_permisos[$contador][1] = $row[1];
		$contador = $contador + 1;
	}

	syslog $syslog_priority, "El ID de principal ---$_[0]--- tiene los siguientes permisos de array_coles_permisos--- en coleccion ---$_[0]--" if ($verbose==1);
	return(@array_coles_permisos);
}

sub existen_perm_defecto_princ {
	my $stmt = "SELECT default_privileges FROM dav_principal WHERE (default_privileges = '".$perm_read."' OR default_privileges = '".$perm_readwrite."') AND principal_id = '".$_[0]."' LIMIT 1;";
	syslog $syslog_priority, "  Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare($stmt);
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my $default_privileges_principal = '9987982389';
	if($rv < 0){
		print $DBI::errstr;
		die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
	}

	@row = $sth->fetchrow_array();
	$default_privileges_principal = $row[0];

	if (defined($default_privileges_principal))
	{
		if (($default_privileges_principal != '9987982389') && ($default_privileges_principal ne ''))
		{
			syslog $syslog_priority, (" Los permisos binarios que obtengo para principal id ----$_[0]---- valen ----$default_privileges_principal----");
			my $nombre_permisos_defecto = permisosbin_a_nombre($default_privileges_principal);
			return($nombre_permisos_defecto);
		}
	}
	else
	{
		syslog $syslog_priority, " El principal ----$_[0]---- NO tiene permisos por defecto de lectura o lectura-escritura" if ($verbose==1);
		return($error_general);
	}
}

sub sacar_permisos_externos_principal_en_coleccion {
	my $entfuncq = $dbh->quote($_[0]);
	## Se quotea el valor del ID de principal para el que sacar permisos externos en otras colecciones. Nos lo pasan al llamar a la funcion
	my $stmt = "SELECT by_collection,privileges FROM grants WHERE to_principal = "."$entfuncq"." AND by_collection IS NOT NULL;";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare($stmt);
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my @array_coles_permisos = ();
	my $contador = 0;
	if($rv < 0){
		print $DBI::errstr;
		die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
	}

	while(@row = $sth->fetchrow_array()) {
		$array_coles_permisos[$contador][0] = $row[0];
		$array_coles_permisos[$contador][1] = $row[1];
		$contador = $contador + 1;
	}

	return(@array_coles_permisos);
}

sub sacar_permisos_de_NOprincipal_en_colecciones {
	my $entfuncq = $dbh->quote($_[0]);
	my $entfuncq2 = $dbh->quote($_[1]);
	## Se quotea el valor del ID de principal para el que sacar permisos externos en otras principals. Nos lo pasan al llamar a la funcion
	my $stmt = "SELECT to_principal,privileges FROM grants WHERE by_collection = "."$entfuncq"." AND to_principal != "."$entfuncq2".";";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare($stmt);
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my @array_coles_permisos = ();
	my $contador = 0;
	if($rv < 0){
		print $DBI::errstr;
		die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
	}

	while(@row = $sth->fetchrow_array()) {
		$array_coles_permisos[$contador][0] = $row[0];
		$array_coles_permisos[$contador][1] = $row[1];
		$contador = $contador + 1;
	}

	syslog $syslog_priority, "El ID de principal ---$_[0]--- tiene los siguientes permisos en otras colecciones ---@array_coles_permisos---" if ($verbose==1);
	return(@array_coles_permisos);
}

sub sacar_permisos_de_principal_en_colecciones {
	my $entfuncq = $dbh->quote($_[0]);
	## Se quotea el valor del ID de principal para el que sacar permisos externos en otras principals. Nos lo pasan al llamar a la funcion
	my $stmt = "SELECT to_principal,privileges FROM grants WHERE by_collection = "."$entfuncq"." AND to_principal IS NOT NULL;";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare($stmt);
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my @array_coles_permisos = ();
	my $contador = 0;
	if($rv < 0){
		print $DBI::errstr;
		die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
	}

	while(@row = $sth->fetchrow_array()) {
		$array_coles_permisos[$contador][0] = $row[0];
		$array_coles_permisos[$contador][1] = $row[1];
		$contador = $contador + 1;
	}

	syslog $syslog_priority, "El ID de principal ---$_[0]--- tiene los siguientes permisos en otras colecciones ---@array_coles_permisos---" if ($verbose==1);
	return(@array_coles_permisos);
}

sub sacar_permisos_de_principals_en_principal {
	my $entfuncq = $dbh->quote($_[0]);
	my $entfuncq2 = $dbh->quote($_[1]);
	## Se quotea el valor del ID de principal para el que sacar permisos externos en otras principals. Nos lo pasan al llamar a la funcion
	my $stmt = "SELECT to_principal,privileges FROM grants WHERE by_principal = "."$entfuncq"." AND privileges != '000000000000000000000000';";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare($stmt);
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my @array_princs_permisos = ();
	my $contador = 0;
	if($rv < 0){
		print $DBI::errstr;
		die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
	}

	while(@row = $sth->fetchrow_array()) {
		$array_princs_permisos[$contador][0] = $row[0];
		$array_princs_permisos[$contador][1] = $row[1];
		$contador = $contador + 1;
	}

	syslog $syslog_priority, "Devolvemos si hay mas principals con permisos sobre otro principal" if ($verbose==1);
	return(@array_princs_permisos);
}

sub sacar_grupos_de_propietario {
	my $entfuncqtemp = $_[0].'%';
	## Se quotea el valor del ID de usuario propietario del que saber que grupos tiene. Todos los grupos empiezan con ID de usuario propietario + nombre de grupo. Nos pasan ID de propietario al llamar a la funcion
	my $entfuncq = $dbh->quote($entfuncqtemp);
	my $stmt = "SELECT username FROM dav_principal WHERE username like "."$entfuncq"." AND type_id = 3;";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare($stmt);
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my @array_grupos_prop = ();
	my $contador = 0;
	if($rv < 0){
		print $DBI::errstr;
		die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
	}

	while(@row = $sth->fetchrow_array()) {
		$array_grupos_prop[$contador] = $row[0];
		$contador = $contador + 1;
	}

	syslog $syslog_priority, "El usuario ID ---$_[0]--- es propietario de los grupos ---@array_grupos_prop---" if ($verbose==1);
	return(@array_grupos_prop);
}

sub sacar_listado_usuarios_davical {
	## Se quotea el valor del ID de usuario propietario del que saber que grupos tiene. Todos los grupos empiezan con ID de usuario propietario + nombre de grupo. Nos pasan ID de propietario al llamar a la funcion
	my $stmt = "SELECT username FROM dav_principal WHERE type_id = 1;";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare($stmt);
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my @listado_usuarios_davical = ();
	my $contador = 0;
	if($rv < 0){
		print $DBI::errstr;
		die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
	}

	while(@row = $sth->fetchrow_array()) {
		$listado_usuarios_davical[$contador] = $row[0];
		$contador = $contador + 1;
	}

	return(@listado_usuarios_davical);
}

sub grupo_conpermisos_asignados {
	## MIRAMOS SI EL ID DE PRINCIPAL DEL GRUPO TIENE MAS PERMISOS ASOCIADOS PARA SABER SI UN GRUPO SE PUEDE BORRAR O NO.....
	my $entfuncq = $dbh->quote($_[0]);
	my $stmt = "SELECT to_principal FROM grants WHERE to_principal = "."$entfuncq".";";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare($stmt);
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	my @listado_usuarios_davical = ();
	my $contador = 0;
	if($rv < 0){
		print $DBI::errstr;
		die("Fallo en acceso a BBDD. CONTACTE CON SARENET.");
	}

	while(@row = $sth->fetchrow_array()) {
		$listado_usuarios_davical[$contador] = $row[0];
		$contador = $contador + 1;
	}

	return(@listado_usuarios_davical);
}

sub coleccion_es_libreta_o_agenda {
	my $tipocole = 0;
	my $entfuncq = $dbh->quote($_[0]);
	## Se quotea el valor del ID de la coleccion de la que saber de QUE tipo es. Nos lo pasan al llamar a la funcion
	my $stmt = "SELECT is_addressbook FROM collection WHERE collection_id = "."$entfuncq"." LIMIT 1;";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare( $stmt );
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	if($rv < 0){
		print $DBI::errstr;
	}
	@row = $sth->fetchrow_array();
	$tipocole = $row[0];

	if (scalar(@row) > 0)
	{
		syslog $syslog_priority, "El tipo de coleccion para el ID de coleccion ---$_[0]--- es ---$tipocole---" if ($verbose==1);
		return($tipocole);
	}
	else
	{
		syslog $syslog_priority, "El tipo de coleccion para el ID de coleccion ---$_[0]--- es ---ERROR 9987982389---" if ($verbose==1);
		return($error_general);
	}
}

sub permisosbin_a_nombre{
	my $permnombre = 'NONE';
	switch ($_[0]) {
			case '000000001111111111111111'	{ $permnombre = 'ALL'; }
			case '000000001111111011100111'	{ $permnombre = 'READWRITE' }
			case '000000000001001000100001'	{ $permnombre = 'READ' }
			case '000000001111111000100001'	{ $permnombre = 'READSCHED' }
			case '000000000001001000000000'	{ $permnombre = 'FREEBUSY' }
			case '000000000001110000000000'	{ $permnombre = 'SCHEDLIV' }
			case '000000001110000000000000'	{ $permnombre = 'SCHEDSEND' }
			case '000000000000000000000000'	{ $permnombre = 'NONE' }
			else { $permnombre = '9987982389' }
		}
	return($permnombre);
}

sub permnombre_a_permbin{
	my $permbin = '000000000000000000000000';
	switch ($_[0]) {
			case 'ALL'		{ $permbin = $perm_all }
			case 'READWRITE'	{ $permbin = $perm_readwrite }
			case 'READ'		{ $permbin = $perm_read }
			case 'READSCHED'	{ $permbin = $perm_readsched }
			case 'FREEBUSY'		{ $permbin = $perm_freebusy }
			case 'SCHEDLIV'		{ $permbin = $perm_schedliv }
			case 'SCHEDSEND'	{ $permbin = $perm_schedsend }
			case 'NONE'		{ $permbin = $perm_none }
			else { $permbin = '9987982389' }
		}
	return($permbin);
}

sub sacar_colecc_permisos_usuario {
	my $userid = sacar_userid($_[0]);
	my $mensaje_fallo_gen = 'ERROR GRAVE : Intento de sacar permisos en colecciones para usuario --$_[0]-- inexistente';
	comprobar_error_variable($userid, $mensaje_fallo_gen);
	my $usuario_poner = "";
	my $grupoquetoca = "";
	my @permisosgrupoquetoca = ();
	my $colecquetoca = ();
	my @array_url_tipo_permisos = ();
	my $linea_array_url_tipo_permisos = "";
	my $contador = 0;
	my $dominioloc = $dominio;
	$dominioloc =~ s/\.//g;
	$dominioloc =~ s/-//g;
	my $idcolecc = 0;
	my $colec_nombre = "";
	my $colec_perm = "";
	my $tipo_colecc = 0;
	my $useridcolecc = 0;

	my @colec_prop_usuario = sacar_colecciones_usuario($userid);
	comprobar_existencia_colecciones_por_defecto($userid);

	my $principalid = sacar_principalid($userid);
	$mensaje_fallo_gen = 'ERROR GRAVE: Hemos obtenido un usuario --$_[0]-- por valido que no tiene ID de principal';
	comprobar_error_variable($principalid, $mensaje_fallo_gen);

	## SACAR ACCESOS POR PERMISO POR DEFECTO
	my @permisos_usuario_privilegios_defecto = sacar_permisos_acceso_autorizados_defecto();

	## SACAR PERMISOS POR SI MISMO
	my @permisos_usuario_comotal = sacar_permisos_externos_principal_en_coleccion($principalid);

	my @permisos_usuario_comogrupos = ();
	my @grupos_usuario = saca_grupos_usuario($principalid);

	## SACAR PERMISOS DE LOS GRUPOS
	foreach $grupoquetoca (@grupos_usuario) {
		@permisosgrupoquetoca = sacar_permisos_externos_principal_en_coleccion($grupoquetoca);
		push(@permisos_usuario_comogrupos, @permisosgrupoquetoca);
		@permisosgrupoquetoca = ();
	}

	## PINTAR POSIBILIDADES ACCESO POR PRINCIPAL LOCAL
	$usuario_poner = sacar_username_deidusu($userid);

	foreach $colecquetoca (@colec_prop_usuario) {
		$array_url_tipo_permisos[$contador][0] = 'https://'.$dominioloc.'.organizer.sarenet.es/caldav.php/'.$usuario_poner.'/'.@$colecquetoca[0].'/';
		$array_url_tipo_permisos[$contador][1] = 'READWRITE';
		$tipo_colecc = coleccion_es_libreta_o_agenda(@$colecquetoca[2]);
		$mensaje_fallo_gen = 'ERROR GRAVE : La coleccion --$colecquetoca-- no es calendario o libreta de direcciones';
		comprobar_error_variable($tipo_colecc, $mensaje_fallo_gen);
		$array_url_tipo_permisos[$contador][2] = $tipo_colecc;
		$contador = $contador + 1;
	}

	$colecquetoca = ();

	## PINTAR POSIBILIDADES ACCESO EXTERNOS SIN ESTAR EN GRUPO
	foreach $colecquetoca (@permisos_usuario_comotal) {
		$colec_nombre = sacar_nombre_id_colecc(@$colecquetoca[0]);
		$mensaje_fallo_gen = 'ERROR GRAVE : No puedo obtener el nombre de coleccion a partir del id ---@$colecquetoca[0]---';
		comprobar_error_variable_texto($colec_nombre, $mensaje_fallo_gen);
		$mensaje_fallo_gen = 'ERROR GRAVE : No puedo obtener el nombre de usuario para la URL de la coleccion ---$colec_nombre---';
		comprobar_error_variable_texto($usuario_poner, $mensaje_fallo_gen);
		$array_url_tipo_permisos[$contador][0] = 'https://'.$dominioloc.'.organizer.sarenet.es/caldav.php'.$colec_nombre;
		$colec_perm = permisosbin_a_nombre(@$colecquetoca[1]);
		$mensaje_fallo_gen = 'ERROR GRAVE : Para la coleccion --$colecquetoca-- no hemos obtenido un valor normal de nombre de permisos';
		comprobar_error_variable_texto($colec_perm, $mensaje_fallo_gen);
		$tipo_colecc = coleccion_es_libreta_o_agenda(@$colecquetoca[0]);
		$mensaje_fallo_gen = 'ERROR GRAVE : La coleccion --$colecquetoca-- no es calendario o libreta de direcciones';
		comprobar_error_variable($tipo_colecc, $mensaje_fallo_gen);
		$array_url_tipo_permisos[$contador][1] = $colec_perm;
		$array_url_tipo_permisos[$contador][2] = $tipo_colecc;
		$contador = $contador + 1;
	}

	$colecquetoca = ();

	## PINTAR POSIBILIDADES ACCESO POR GRUPO
	foreach $colecquetoca (@permisos_usuario_comogrupos) {
		$colec_nombre = sacar_nombre_id_colecc(@$colecquetoca[0]);
		$mensaje_fallo_gen = 'ERROR GRAVE : No puedo obtener el nombre de coleccion a partir del id ---@$colecquetoca[0]---';
		comprobar_error_variable_texto($colec_nombre, $mensaje_fallo_gen);
		$mensaje_fallo_gen = 'ERROR GRAVE : No puedo obtener el nombre de usuario para la URL de la coleccion ---$colec_nombre---';
		comprobar_error_variable_texto($usuario_poner, $mensaje_fallo_gen);
		$array_url_tipo_permisos[$contador][0] = 'https://'.$dominioloc.'.organizer.sarenet.es/caldav.php'.$colec_nombre;
		$colec_perm = permisosbin_a_nombre(@$colecquetoca[1]);
		$mensaje_fallo_gen = 'ERROR GRAVE : Para la coleccion --$colecquetoca-- no hemos obtenido un valor normal de nombre de permisos';
		comprobar_error_variable_texto($colec_perm, $mensaje_fallo_gen);
		$tipo_colecc = coleccion_es_libreta_o_agenda(@$colecquetoca[0]);
		$mensaje_fallo_gen = 'ERROR GRAVE : La coleccion --$colecquetoca-- no es calendario o libreta de direcciones';
		comprobar_error_variable($tipo_colecc, $mensaje_fallo_gen);
		$array_url_tipo_permisos[$contador][1] = $colec_perm;
		$array_url_tipo_permisos[$contador][2] = $tipo_colecc;
		$contador = $contador + 1;
	}

	$contador = 0;

	## ANADO PERMISOS CONCEDIDOS POR PRIVILEGIOS POR DEFECTO
	push(@array_url_tipo_permisos,@permisos_usuario_privilegios_defecto);

	## POR ULTIMO COMPRUEBO NO DAR RESULTADOS DUPLICADOS Y POR ELLO POSIBLE QUE CON DIFERENTES PERMISOS
	my $linea_array_url_tipo_permisos_resumen = "";
	my $cuenta_repeticiones = '0';
	my $permisos_escritura = '0';
	my $permisos_lectura = '0';
	my @array_cuentas_repetidas = ();
	foreach $linea_array_url_tipo_permisos (@array_url_tipo_permisos)
	{
		$cuenta_repeticiones = 0;
		$permisos_escritura = 0;
		$permisos_lectura = 0;

		foreach $linea_array_url_tipo_permisos_resumen (@array_url_tipo_permisos)
		{
			if (@$linea_array_url_tipo_permisos[0] eq @$linea_array_url_tipo_permisos_resumen[0])
			{
				$cuenta_repeticiones = $cuenta_repeticiones + 1;
				if (@$linea_array_url_tipo_permisos[1] eq "READWRITE")
				{
					$permisos_escritura = '1';
				}
				elsif (@$linea_array_url_tipo_permisos[1] eq "READ")
				{
					$permisos_lectura = '1';
				}

			}
		}

		if ($cuenta_repeticiones > '1')
		{
			if (!grep { @$linea_array_url_tipo_permisos[0] eq $_ } @array_cuentas_repetidas)
			{
				syslog $syslog_priority, "AAAA";
				push(@array_cuentas_repetidas,@$linea_array_url_tipo_permisos[0]);
				if ($permisos_escritura eq '1')
				{
					syslog $syslog_priority, "Para el usuario ---$_[0]--- sacamos que tiene acceso a : @$linea_array_url_tipo_permisos[0]|@$linea_array_url_tipo_permisos[1]|@$linea_array_url_tipo_permisos[2]|" if ($verbose==1);
					print ("@$linea_array_url_tipo_permisos[0]|READWRITE|@$linea_array_url_tipo_permisos[2]|\n");
				}
				elsif ($permisos_lectura eq '1')
				{
					syslog $syslog_priority, "Para el usuario ---$_[0]--- sacamos que tiene acceso a : @$linea_array_url_tipo_permisos[0]|@$linea_array_url_tipo_permisos[1]|@$linea_array_url_tipo_permisos[2]|" if ($verbose==1);
					print ("@$linea_array_url_tipo_permisos[0]|READ|@$linea_array_url_tipo_permisos[2]|\n");
				}
			}
			else
			{
				syslog $syslog_priority, "Evitando repetir ---@$linea_array_url_tipo_permisos[0]--- al citar colecciones con permisos" if ($verbose==1);
				next;
			}
		}
		elsif ($cuenta_repeticiones eq '1')
		{
			syslog $syslog_priority, "Para el usuario ---$_[0]--- sacamos que tiene acceso a : @$linea_array_url_tipo_permisos[0]|@$linea_array_url_tipo_permisos[1]|@$linea_array_url_tipo_permisos[2]|" if ($verbose==1);
			print ("@$linea_array_url_tipo_permisos[0]|@$linea_array_url_tipo_permisos[1]|@$linea_array_url_tipo_permisos[2]|\n");
		}
	}
}

sub sacar_ids_colecc_usuario {
	my $entfuncq = $dbh->quote($_[0]);
	## Se quotea el valor del ID de usuario del que obtener los ID de coleccion. Nos lo pasan al llamar a la funcion
	my $stmt = "SELECT collection_id FROM collection WHERE user_no = "."$entfuncq".";";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare( $stmt );
	my @id_col = ();
	my $contador = 0;
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	if($rv < 0){
		print $DBI::errstr;
	}

	while(@row = $sth->fetchrow_array()) {
	$id_col[$contador] = $row[0];
	$contador = $contador + 1;
	}

	if (scalar(@id_col) > 0)
	{
		syslog $syslog_priority, "El ID de usuario ---$_[0]--- tiene las colecciones ---@id_col---" if ($verbose==1);
		return(@id_col);
	}
	else
	{
		syslog $syslog_priority, "El ID de usuario ---$_[0]--- tiene las colecciones ---ERROR 9987982389---" if ($verbose==1);
		@id_col = ('9987982389');
		return(@id_col);
	}
}

sub sacar_id_coledavname {
	my $coleasacarid = '/'.$_[0].'/'.$_[1].'/';
	my $entfuncq = $dbh->quote($coleasacarid);
	## Se quotea el valor del ID de usuario del que obtener los ID de coleccion. Nos lo pasan al llamar a la funcion
	my $stmt = "SELECT collection_id FROM collection WHERE dav_name = "."$entfuncq"." LIMIT 1;";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare( $stmt );
	my @id_col = ();
	my $contador = 0;
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	if($rv < 0){
		print $DBI::errstr;
	}

	if (@row = $sth->fetchrow_array())
	{
		$id_col[$contador] = $row[0];
	}

	if (scalar(@id_col) > 0)
	{
		syslog $syslog_priority, "El ID de cole que tiene el DAV_NAME ---$_[0]--- es ---$row[0]---" if ($verbose==1);
		return($row[0]);
	}
	else
	{
		syslog $syslog_priority, "FALLO -- El ID de cole que tiene el DAV_NAME ---$coleasacarid--- es ---$row[0]---" if ($verbose==1);
		@id_col = ('9987982389');
		return($error_general);
	}
}

sub usuario_ya_tiene_coleccion {
	my @colecciones_usuario = @{$_[0]};
	my $coleccion_comprobar = $_[1];

	if (grep(/^$coleccion_comprobar$/, @colecciones_usuario))
	{
		return 1;
	}
	else
	{
		return 0;
	}
}

sub crear_coleccion {
	## Se quotea el valor de username, descripcion, tipo de coleccion para dar de alta una nueva. Nos lo pasan al llamar a la funcion
	my $usuarioid = sacar_userid($_[0]);
	comprobar_error_variable($usuarioid, 'ERROR GRAVE : Pidiendo crear coleccion para un ---$usuario--- inexistente.');
	my $entfuncq = $dbh->quote($usuarioid);
	my $entfuncq3 = $dbh->quote($_[2]);
	my $entfuncq4 = $dbh->quote($_[3]);
	my $tempentfunc5 = '/'.$_[0].'/';
	my $tempentfunc52 = '/'.$_[0].'/'.$_[1].'/';
	my $entfuncq52 = $dbh->quote($tempentfunc52);
	my $entfuncq5 = $dbh->quote($tempentfunc5);
	my $escaloag = $_[3];
	my $stmt = "";

	if ($escaloag == 0)
	{
	$stmt = "INSERT INTO collection (user_no, parent_container, dav_name, dav_displayname, is_calendar, publicly_readable, default_privileges, is_addressbook, resourcetypes, schedule_transp, description) VALUES( "."$entfuncq".", "."$entfuncq5".","."$entfuncq52".", "."$entfuncq3".", TRUE, FALSE, NULL, FALSE, '<DAV::collection/><urn:ietf:params:xml:ns:caldav:calendar/>', 'opaque', '' )";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	}
	else
	{
	$stmt = "INSERT INTO collection (user_no, parent_container, dav_name, dav_displayname, is_calendar, publicly_readable, default_privileges, is_addressbook, resourcetypes, schedule_transp, description) VALUES( "."$entfuncq".", "."$entfuncq5".","."$entfuncq52".", "."$entfuncq3".", FALSE, FALSE, NULL, TRUE, '<DAV::collection/><urn:ietf:params:xml:ns:carddav:addressbook/>', 'opaque', '' )";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	}
	my $rv = $dbh->do($stmt) or die $DBI::errstr;
}

sub borrar_coleccion {
	my $coleaborrar = '/'.$_[0].'/'.$_[1].'/';
	## Se quotea el valor del username propietario de la coleccion y la coleccion a borrar. Vamos, el nombre completo de la coleccion. Nos lo pasan al llamar a la funcion
	my $entfuncq = $dbh->quote($coleaborrar);
	my $stmt = "";

	$stmt = "DELETE FROM collection WHERE dav_name="."$entfuncq".";";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $rv = $dbh->do($stmt) or die $DBI::errstr;
	if( $rv < 0 ) {
		print $DBI::errstr;
	} else {
		syslog $syslog_priority, "La consulta ---$stmt---- devuelve ----Total number of rows deleted : $rv-----" if ($verbose==1);
	}
}

sub borrar_de_grupo {
	my $entfuncq = $dbh->quote($_[0]);
	my $entfuncq2 = $dbh->quote($_[1]);
	my $stmt = "";
	## Se quotea el valor del ID de grupo y ID de miembro que borrar del grupo del ID. Nos lo pasan al llamar a la funcion
	$stmt = "DELETE FROM group_member WHERE group_id="."$entfuncq"." AND member_id="."$entfuncq2".";";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $rv = $dbh->do($stmt) or die $DBI::errstr;
	if( $rv < 0 ){
		print $DBI::errstr;
	} else {
		syslog $syslog_priority, "La consulta ---$stmt---- devuelve ----Total number of rows deleted : $rv-----" if ($verbose==1);
	}
}

sub anadir_a_grupo {
	my $entfuncq = $dbh->quote($_[0]);
	my $entfuncq2 = $dbh->quote($_[1]);
	## Se quotea el valor del ID de grupo y ID de miembro que anadir al grupo del ID. Nos lo pasan al llamar a la funcion
	my $stmt = "INSERT INTO group_member (group_id, member_id) VALUES ("."$entfuncq".", "."$entfuncq2".");";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $rv = $dbh->do($stmt) or die $DBI::errstr;
}

sub crear_grupo {
	## Se quotea el valor de username, Nombre completo y email del grupo que se va a crear. Ademas los valores del nombre de grupo se forman con IDusuariopropietario + grupo. Nos lo pasan al llamar a la funcion
	my $tempentfuncq = $_[1].$_[0];
	my $entfuncq = $dbh->quote($tempentfuncq);

	my $tempentfuncq2 = $_[1].$_[0].'@'.$_[2];
	my $entfuncq2 = $dbh->quote($tempentfuncq2);

	my $stmt = "INSERT INTO dav_principal (user_active, username, password, fullname, email, date_format_type, locale, type_id, displayname, default_privileges) VALUES( TRUE, "."$entfuncq".", \'\', "."$entfuncq2".", "."$entfuncq2".", 'E', '', 3, "."$entfuncq".", '000000001111111000100000' );";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);

	my $rv = $dbh->do($stmt) or die $DBI::errstr;
}

sub elimina_principal{
	my $entfuncq = $dbh->quote($_[0]);
	## Se quotea el valor del ID de principal que dar de baja. Nos lo pasan al llamar a la funcion
	my $stmt = "DELETE FROM dav_principal WHERE principal_id="."$entfuncq".";";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $rv = $dbh->do($stmt) or die $DBI::errstr;
}

sub elimina_grupo{
	my $id_principal = $_[0];
	## Se quota el valor del id de principal del grupo a eliminar. Nos lo pasan al llamar a la funcion.
	syslog $syslog_priority, "Dando de baja grupo que tiene por ID de principal ---$_[0]---" if ($verbose==1);
	elimina_principal($id_principal);
}

sub elimina_usuario{
	my $id_principal = $_[0];
	## Se quota el valor del id de principal del usuario a eliminar. Nos lo pasan al llamar a la funcion.
	syslog $syslog_priority, "Dando de baja usuario que tiene por ID de principal ---$_[0]---" if ($verbose==1);
	elimina_principal($id_principal);
}

sub sacaid_princ_grupo {
	my $id_usuario = 0;
	my $id_principal = 0;
	my $tipo_principal = "9987982389";

	## Se quotea el valor del username del principal tipo grupo del que queremos sacar el principal ID. Nos lo pasan al llamar a la funcion.

	$id_usuario = sacar_userid($_[0]);
	$mensaje_fallo_gen = 'ERROR GRAVE : Intentando obtener id de principal para grupo ---$_[0]--- inexistente';
	comprobar_error_variable($id_usuario, $mensaje_fallo_gen);

	if ($id_usuario != 0)
	{
		$tipo_principal = sacar_tipo_principal($id_usuario);
		$mensaje_fallo_gen = 'ERROR GRAVE : Imposible obtener tipo de principal para ---$_[0]--- con ID Usuario --$id_usuario-- inexistente';
		comprobar_error_variable_texto($tipo_principal, $mensaje_fallo_gen);

		if ($tipo_principal eq "Group")
		{
				$id_principal = sacar_principalid($id_usuario);
				syslog $syslog_priority, "El grupo que tiene por usuario ---$_[0]--- tiene por id de principal ---$id_principal---" if ($verbose==1);
				return($id_principal);
		}
		else
		{
				syslog $syslog_priority, "El grupo que tiene por usuario ---$_[0]--- tiene por id de principal ---ERROR 9987982389---" if ($verbose==1);
				return($error_general);
		}
	}
	else
	{
		syslog $syslog_priority, "Fallo al obtener id de principal para el grupo que tiene por usuario ---$_[0]--- por no poderse sacar id de usuario ---ERROR 9987982389---" if ($verbose==1);
		return($error_general);
	}
}

sub saca_grupos_usuario {
	my $entfuncq = $dbh->quote($_[0]);
	## Se quota el valor del id de usuario del que queremos sacar que grupos tiene o de los que el usuario que nos pasan es propietario. Nos lo pasan al llamar a la funcion.

	my $stmt = "SELECT group_id FROM group_member WHERE member_id = "."$entfuncq".";";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare( $stmt );
	my @id_grupos = ();
	my $contador = 0;
	my $ids_grupos_sacados = "";
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	if($rv < 0){
		print $DBI::errstr;
		die ("Error de acceso a BBDD");
	}

	while(@row = $sth->fetchrow_array()) {
	$id_grupos[$contador] = $row[0];
	$contador = $contador + 1;
	$ids_grupos_sacados = $ids_grupos_sacados." $row[0]";
	}

	syslog $syslog_priority, "El ID de usuario ---$_[0]--- tiene los grupos ---$ids_grupos_sacados---" if ($verbose==1);
	return(@id_grupos);
}

sub saca_usuarios_grupo {
	my $entfuncq = $dbh->quote($_[0]);
	## Se quotea el valor del ID de grupo del que obtener que miembros tiene. Nos lo pasan al llamar a la funcion
	my $stmt = "SELECT member_id FROM group_member WHERE group_id = "."$entfuncq".";";
	syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	my $sth = $dbh->prepare( $stmt );
	my @id_usu = ();
	my $contador = 0;
	my $rv = $sth->execute() or die $DBI::errstr;
	my @row = ();
	if($rv < 0){
		print $DBI::errstr;
		die ("Error de acceso a BBDD");
	}

	while(@row = $sth->fetchrow_array()) {
	$id_usu[$contador] = $row[0];
	$contador = $contador + 1;
	}

	syslog $syslog_priority, "El ID de grupo ---$_[0]--- tiene los id de miembros ---@id_usu---" if ($verbose==1);
	return(@id_usu);
}

sub existe_usuario_en_grupo {
	my $id_usuario = 0;
	my $id_grupo = 0;
	my $id_principal = 0;
	my $respuesta = 0;
	my $respuesta2 = 0;
	$respuesta = existe_usuario($usuario);
	$respuesta2 = existe_usuario($grupo);
	if (($respuesta != 1) || ($respuesta2 != 1))
	{
		func_remplazo_die("No existe el usuario o grupo");
	}

	$id_usuario = sacar_userid($usuario);
	$mensaje_fallo_gen = 'ERROR GRAVE : Imposible obtener id de usuario para ---$usuario---';
	comprobar_error_variable($id_usuario, $mensaje_fallo_gen);
	$id_grupo = sacar_userid($grupo);
	$mensaje_fallo_gen = 'ERROR GRAVE : Imposible obtener id de grupo para ---$grupo---';
	comprobar_error_variable($id_grupo, $mensaje_fallo_gen);

	syslog $syslog_priority, "El id_usuario vale ---$id_usuario---. El id_usuario que nos pasan a la func vale ---$_[1]---" if ($verbose==1);
	syslog $syslog_priority, "El id_grupo vale ---$id_grupo---. El id_grupo que nos pasan a la func vale ---$_[0]---" if ($verbose==1);

	my $id_principal_origen = sacar_principalid($id_usuario);
	$mensaje_fallo_gen = 'ERROR GRAVE : Imposible obtener id de principal para ---$usuario--- con id de usuario ---$id_usuario---';
	comprobar_error_variable($id_principal_origen, $mensaje_fallo_gen);
	my $id_principal_grupo = sacaid_princ_grupo($grupo);
	my $mensaje_fallo_gen = 'ERROR GRAVE : Imposible obtener id de principal para ---$grupo--- con id de grupo ---$id_grupo---';
	comprobar_error_variable($id_principal_grupo, $mensaje_fallo_gen);
	my $entfuncq = $dbh->quote($id_principal_origen);
	my $entfuncq2 = $dbh->quote($id_principal_grupo);

	if (($id_principal_grupo != 0) && ($id_principal_origen != 0))
	{

		my $stmt = "SELECT group_id,member_id from group_member where group_id="."$entfuncq2"." and member_id="."$entfuncq"." LIMIT 1;";
		syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
		my $sth = $dbh->prepare( $stmt );
		my $rv = $sth->execute() or die $DBI::errstr;
		my @row = ();
		if($rv < 0){
			print $DBI::errstr;
		}
		if (@row = $sth->fetchrow_array())
		{
			syslog $syslog_priority, "El usuario $usuario existe en grupo $grupo. Devolvemos 1." if ($verbose==1);
			return (1);
		}
		else
		{
			syslog $syslog_priority, "El usuario $usuario NO existe en grupo $grupo. Devolvemos 0." if ($verbose==1);
			return (0);
		}
	}
	else
	{
		syslog $syslog_priority, "El usuario $usuario o grupo $grupo no existen. Devolvemos ERROR 9987982389." if ($verbose==1);
		return($error_general);
	}
}

sub existe_usuario {
	my $id_usuario = 0;
	my $id_principal = 0;
	$id_usuario = sacar_userid($_[0]);
	## Se quota el valor del username de quien comprobar su existencia. Nos lo pasan al llamar a la funcion.

	if ($id_usuario != '9987982389')
	{
		syslog $syslog_priority, "El usuario ---$_[0]--- existe. El ID de usuario es ---$id_usuario----" if ($verbose==1);
		return(1);
	}
	else
	{
		syslog $syslog_priority, "El usuario ---$_[0]--- NO existe. El ID de usuario es ---ERROR 9987982389----" if ($verbose==1);
		return(0);
	}
}

sub fijar_permisos_defect_col {
	my $entfuncq = $dbh->quote($_[0]);
	## Se quotea el valor del ID de coleccion sobre la que aplicar los permisos que nos digan. Nos pasan ambas cosas al llamar la funcion.

	my $stmt = "";
	my $permbin = $perm_none;

	if ($_[1] eq "defecto")
	{
		$stmt = "UPDATE collection SET default_privileges = NULL WHERE collection_id="."$entfuncq".";";
		syslog $syslog_priority, "Logueando consulta para instancia Davical para dominio $dominio : ---$stmt----" if ($verbose==1);
	}
	else
	{
		my $perm = $_[1];
		my $permbin = permnombre_a_permbin($perm);
		$mensaje_fallo_gen = 'ERROR GRAVE : Imposible obtener permisos binarios para nombre ---$perm---';
		comprobar_error_variable_texto($permbin, $mensaje_fallo_gen);
		my $entfuncq2 = $dbh->quote($permbin);
		$stmt = "UPDATE collection SET default_privileges = "."$entfuncq2"." WHERE collection_id="."$entfuncq".";";
		syslog $syslo                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        