1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/agendav_ynh.git synced 2024-09-03 20:36:12 +02:00
agendav_ynh/sources/web/application/models/shared_calendars.php
2014-01-07 17:53:08 +01:00

259 lines
8.1 KiB
PHP

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
/*
* Copyright 2011-2012 Jorge López Pérez <jorge@adobo.org>
*
* This file is part of AgenDAV.
*
* AgenDAV is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* AgenDAV is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with AgenDAV. If not, see <http://www.gnu.org/licenses/>.
*/
class Shared_calendars extends CI_Model {
function __construct() {
parent::__construct();
}
/**
* Get calendars which other users are sharing with a given user.
*
* @return array Array of calendars (sid, user_from, calendar)
*/
function get_shared_with($username) {
$res = $this->db->get_where('shared', array(
'user_which' => $username));
$tmp = $res->result_array();
$result = array();
foreach ($tmp as $c) {
$index = $c['user_from'] .':'. $c['calendar'];
$result[$index] = array(
'sid' => $c['sid'],
'user_from' => $c['user_from'],
'write_access' =>
$this->_bool_to_int($c['write_access']),
);
$options = unserialize($c['options']);
if (is_array($options)) {
$result[$index] = array_merge($result[$index], $options);
}
}
return $result;
}
/**
* Get calendars which current user is sharing with other users
*
* @param $username User which is sharing calendars
* @param $cond Additional conditions for this query (optional).
* Associative array
* @return array Array of calendars (sid, user_from, calendar)
*/
function get_shared_from($username, $cond = null) {
$conditions = array('user_from' => $username);
if (!is_null($cond) && is_array($cond)) {
$conditions = array_merge($conditions, $cond);
}
$res = $this->db->get_where('shared', $conditions);
$tmp = $res->result_array();
$result = array();
foreach ($tmp as $c) {
$index = $c['user_from'] .':'. $c['calendar'];
if (!isset($result[$index])) {
$result[$index] = array();
}
$sid = $c['sid'];
$c['write_access'] = $this->_bool_to_int($c['write_access']);
$options = unserialize($c['options']);
if (is_array($options)) {
$c = array_merge($c, $options);
}
$result[$index][$sid] = $c;
}
return $result;
}
/**
* Get a list of users who can access a calendar
*
* @param $calendar Complete calendar name (user:calendar)
* @return Array of the form:
* [ [ 'username' => username, 'sid' => sid, 'write_access' => write_access],
* ['username' => username2, 'sid' => sid2, 'write_access'
* => write_access2], ...],
*
*/
function users_with_access_to($calendar) {
$pieces = preg_split('/:/', $calendar);
if (count($pieces) != 2) {
log_message('ERROR', 'Call to users_with_access_to() '
.'without full calendar specified (' . $calendar .')');
return array();
}
$user_from = $pieces[0];
$calendar = $pieces[1];
$tmp = $this->get_shared_from($user_from, array(
'calendar' => $calendar));
$users = array();
if (count($tmp) > 0) {
$tmp = array_values($tmp);
foreach ($tmp[0] as $sid => $share) {
$users[] = array(
'username' => mb_strtolower($share['user_which']),
'sid' => $share['sid'],
'write_access' => $share['write_access'],
);
}
}
return $users;
}
/**
* Store a shared calendar.
*
* @param $sid Share id. Null means a new calendar sharing
* @param $from User id who is sharing a calendar
* @param $calendar Calendar being shared. Can be in the form
* 'user:calendar'
* @param $to User id who's getting calendar rights
* @param $options Associative array with options for this calendar
* (color, displayname, ...)
* @param $write_access (Optional) Use read+write profile on '1', read on '0'
* @return boolean FALSE on error, TRUE otherwise
*/
function store($sid = null, $from = '', $calendar = '', $to = '',
$options = array(), $write_access = null) {
if ($sid === null && (empty($from) || empty($calendar) ||
empty($to))) {
log_message('ERROR',
'Call to shared_calendars->store() with no enough parameters');
return FALSE;
}
$calendar = preg_replace('/^[^:]+:/', '', $calendar);
$from = mb_strtolower($from);
$to = mb_strtolower($to);
$data = array(
'user_from' => $from,
'calendar' => $calendar,
'user_which' => $to,
'options' => serialize($options),
);
if ($write_access !== null) {
$data['write_access'] = $write_access;
}
$res = false;
if (!is_null($sid)) {
$conditions = array('sid' => $sid);
unset($data['user_from']);
unset($data['user_which']);
unset($data['calendar']);
// Preserve options
if (is_null($options)) {
unset($data['options']);
}
$this->db->where($conditions);
$res = $this->db->update('shared', $data);
} else {
$res = $this->db->insert('shared', $data);
if ($res === TRUE) {
log_message('INTERNALS', 'Granted access on '
. $data['user_from'] . ':' . $data['calendar'] . ' to '
. $data['user_which']);
} else {
log_message('ERROR', 'Error granting access on '
. $data['user_from'] . ':' . $data['calendar'] . ' to '
. $data['user_which'] . ', SQL error');
}
}
return $res;
}
/**
* Removes a sharing from database
*
* @param $sid Sharing id
* @return boolean FALSE on error, TRUE otherwise
*/
function remove($sid = null) {
if (is_null($sid)) {
log_message('ERROR',
'Call to shared_calendars->remove() without sid');
return FALSE;
}
$this->db->where('sid', $sid);
$query = $this->db->get('shared');
$row = $query->result_array();
if (count($row) == 0) {
log_message('ERROR',
'Tried to remove nonexistant share id [' . $sid .']');
return FALSE;
} else {
$row = $row[0];
$this->db->where('sid', $sid);
$this->db->delete('shared');
log_message('INTERNALS', 'Revoked access on '
. $row['user_from'] . ':' . $row['calendar'] . ' to '
. $row['user_which']);
return TRUE;
}
}
/**
* Translates a boolean from PostgreSQL to 1/0
*/
function _bool_to_int($value) {
$ret = 0;
switch ($value) {
case 't':
$ret=1;
break;
case 'f':
$ret=0;
break;
default:
$ret = $value;
break;
}
return $ret;
}
}