public function tearDown()
 {
     parent::tearDown();
     if (is_null($this->backend)) {
         return;
     }
     $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
     foreach ($books as $book) {
         $this->backend->deleteCalendar($book['id']);
     }
     $subscriptions = $this->backend->getSubscriptionsForUser(self::UNIT_TEST_USER);
     foreach ($subscriptions as $subscription) {
         $this->backend->deleteSubscription($subscription['id']);
     }
 }
示例#2
0
 public function testCalendarOperations()
 {
     $calendarId = $this->createTestCalendar();
     // update it's display name
     $patch = new PropPatch(['{DAV:}displayname' => 'Unit test', '{urn:ietf:params:xml:ns:caldav}calendar-description' => 'Calendar used for unit testing']);
     $this->backend->updateCalendar($calendarId, $patch);
     $patch->commit();
     $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
     $this->assertEquals(1, count($books));
     $this->assertEquals('Unit test', $books[0]['{DAV:}displayname']);
     $this->assertEquals('Calendar used for unit testing', $books[0]['{urn:ietf:params:xml:ns:caldav}calendar-description']);
     // delete the address book
     $this->backend->deleteCalendar($books[0]['id']);
     $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
     $this->assertEquals(0, count($books));
 }
示例#3
0
    /**
     * @dataProvider providesSharingData
     */
    public function testCalendarSharing($userCanRead, $userCanWrite, $groupCanRead, $groupCanWrite, $add)
    {
        /** @var IL10N | \PHPUnit_Framework_MockObject_MockObject $l10n */
        $l10n = $this->getMockBuilder('\\OCP\\IL10N')->disableOriginalConstructor()->getMock();
        $l10n->expects($this->any())->method('t')->will($this->returnCallback(function ($text, $parameters = array()) {
            return vsprintf($text, $parameters);
        }));
        $calendarId = $this->createTestCalendar();
        $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
        $this->assertEquals(1, count($books));
        $calendar = new Calendar($this->backend, $books[0], $l10n);
        $this->backend->updateShares($calendar, $add, []);
        $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER1);
        $this->assertEquals(1, count($books));
        $calendar = new Calendar($this->backend, $books[0], $l10n);
        $acl = $calendar->getACL();
        $this->assertAcl(self::UNIT_TEST_USER, '{DAV:}read', $acl);
        $this->assertAcl(self::UNIT_TEST_USER, '{DAV:}write', $acl);
        $this->assertAccess($userCanRead, self::UNIT_TEST_USER1, '{DAV:}read', $acl);
        $this->assertAccess($userCanWrite, self::UNIT_TEST_USER1, '{DAV:}write', $acl);
        $this->assertAccess($groupCanRead, self::UNIT_TEST_GROUP, '{DAV:}read', $acl);
        $this->assertAccess($groupCanWrite, self::UNIT_TEST_GROUP, '{DAV:}write', $acl);
        $this->assertEquals(self::UNIT_TEST_USER, $calendar->getOwner());
        // test acls on the child
        $uri = $this->getUniqueID('calobj');
        $calData = <<<'EOD'
BEGIN:VCALENDAR
VERSION:2.0
PRODID:ownCloud Calendar
BEGIN:VEVENT
CREATED;VALUE=DATE-TIME:20130910T125139Z
UID:47d15e3ec8
LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z
DTSTAMP;VALUE=DATE-TIME:20130910T125139Z
SUMMARY:Test Event
DTSTART;VALUE=DATE-TIME:20130912T130000Z
DTEND;VALUE=DATE-TIME:20130912T140000Z
CLASS:PUBLIC
END:VEVENT
END:VCALENDAR
EOD;
        $this->backend->createCalendarObject($calendarId, $uri, $calData);
        /** @var IACL $child */
        $child = $calendar->getChild($uri);
        $acl = $child->getACL();
        $this->assertAcl(self::UNIT_TEST_USER, '{DAV:}read', $acl);
        $this->assertAcl(self::UNIT_TEST_USER, '{DAV:}write', $acl);
        $this->assertAccess($userCanRead, self::UNIT_TEST_USER1, '{DAV:}read', $acl);
        $this->assertAccess($userCanWrite, self::UNIT_TEST_USER1, '{DAV:}write', $acl);
        $this->assertAccess($groupCanRead, self::UNIT_TEST_GROUP, '{DAV:}read', $acl);
        $this->assertAccess($groupCanWrite, self::UNIT_TEST_GROUP, '{DAV:}write', $acl);
        // delete the address book
        $this->backend->deleteCalendar($books[0]['id']);
        $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
        $this->assertEquals(0, count($books));
    }
示例#4
0
    /**
     * @dataProvider providesSharingData
     */
    public function testCalendarSharing($userCanRead, $userCanWrite, $groupCanRead, $groupCanWrite, $add)
    {
        $calendarId = $this->createTestCalendar();
        $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
        $this->assertEquals(1, count($books));
        $calendar = new Calendar($this->backend, $books[0]);
        $this->backend->updateShares($calendar, $add, []);
        $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER1);
        $this->assertEquals(1, count($books));
        $calendar = new Calendar($this->backend, $books[0]);
        $acl = $calendar->getACL();
        $this->assertAcl(self::UNIT_TEST_USER, '{DAV:}read', $acl);
        $this->assertAcl(self::UNIT_TEST_USER, '{DAV:}write', $acl);
        $this->assertAccess($userCanRead, self::UNIT_TEST_USER1, '{DAV:}read', $acl);
        $this->assertAccess($userCanWrite, self::UNIT_TEST_USER1, '{DAV:}write', $acl);
        $this->assertAccess($groupCanRead, self::UNIT_TEST_GROUP, '{DAV:}read', $acl);
        $this->assertAccess($groupCanWrite, self::UNIT_TEST_GROUP, '{DAV:}write', $acl);
        $this->assertEquals(self::UNIT_TEST_USER, $calendar->getOwner());
        // test acls on the child
        $uri = $this->getUniqueID('calobj');
        $calData = <<<'EOD'
BEGIN:VCALENDAR
VERSION:2.0
PRODID:ownCloud Calendar
BEGIN:VEVENT
CREATED;VALUE=DATE-TIME:20130910T125139Z
UID:47d15e3ec8
LAST-MODIFIED;VALUE=DATE-TIME:20130910T125139Z
DTSTAMP;VALUE=DATE-TIME:20130910T125139Z
SUMMARY:Test Event
DTSTART;VALUE=DATE-TIME:20130912T130000Z
DTEND;VALUE=DATE-TIME:20130912T140000Z
CLASS:PUBLIC
END:VEVENT
END:VCALENDAR
EOD;
        $this->backend->createCalendarObject($calendarId, $uri, $calData);
        /** @var IACL $child */
        $child = $calendar->getChild($uri);
        $acl = $child->getACL();
        $this->assertAcl(self::UNIT_TEST_USER, '{DAV:}read', $acl);
        $this->assertAcl(self::UNIT_TEST_USER, '{DAV:}write', $acl);
        $this->assertAccess($userCanRead, self::UNIT_TEST_USER1, '{DAV:}read', $acl);
        $this->assertAccess($userCanWrite, self::UNIT_TEST_USER1, '{DAV:}write', $acl);
        $this->assertAccess($groupCanRead, self::UNIT_TEST_GROUP, '{DAV:}read', $acl);
        $this->assertAccess($groupCanWrite, self::UNIT_TEST_GROUP, '{DAV:}write', $acl);
        // delete the address book
        $this->backend->deleteCalendar($books[0]['id']);
        $books = $this->backend->getCalendarsForUser(self::UNIT_TEST_USER);
        $this->assertEquals(0, count($books));
    }
示例#5
0
 /**
  * @PublicPage
  * @NoAdminRequired
  * @NoCSRFRequired
  */
 public function index()
 {
     $pKey = Helper::post('key');
     $pApp = Helper::post('app');
     if ($pKey != 'jasj765Uyt87ouIIfars' || $pApp != 'owncollab_chart') {
         return false;
     }
     //название календаря тасков в которых пользователь берет участие как отдельный пользователь
     $userTaskName = 'project';
     //все id пользователей
     $allUsers = $this->connect->users->get();
     //таблица тасков
     $allTasks = $this->connect->task()->get();
     //массив тасков, ключами которого является id таска
     $arrIdTasks = [];
     for ($i = 0; $i < count($allTasks); $i++) {
         $arrIdTasks[$allTasks[$i]['id']] = $allTasks[$i];
     }
     $userTaskName = $arrIdTasks[1]['text'];
     //массив id тасков, ключами которого являются id пользователей
     $userTasks = [];
     for ($i = 0; $i < count($allUsers); $i++) {
         $temp_arr = [];
         for ($j = 0; $j < count($allTasks); $j++) {
             $taskUser = json_decode($allTasks[$j]['users'])->users;
             if (in_array($allUsers[$i]['uid'], $taskUser)) {
                 $temp_arr[$allTasks[$j]['id']] = '';
             }
         }
         $userTasks[$allUsers[$i]['uid']] = $temp_arr;
         unset($temp_arr);
     }
     //id текущих пользователей
     $usersId = array_keys($userTasks);
     //id пользователей с таблицы синхронизации
     $usersIdCal = $this->connect->calendar()->getUsersId();
     //добавление в таблицу синхронизации новых пользователей
     $newUserId = array_diff($usersId, $usersIdCal);
     $this->connect->calendar()->insertAllById($newUserId);
     //удаление удаленных пользователей с таблицы синхронизации
     $deleteUserId = array_diff($usersIdCal, $usersId);
     $this->connect->calendar()->deleteAllById($deleteUserId);
     //синхронизация тасков
     //uid  id_tasks (json)
     $tasksIdCalTable = $this->connect->calendar()->get();
     for ($i = 0; $i < count($tasksIdCalTable); $i++) {
         //создание рабочего календаря для каждого пользователя
         $user = $tasksIdCalTable[$i]['uid'];
         if (!$this->userManager->userExists($user)) {
             throw new \InvalidArgumentException("User <{$user}> in unknown.");
         }
         $principalBackend = new Principal($this->userManager, $this->groupManager);
         $caldav = new CalDAV\CalDavBackend($this->connect->db, $principalBackend);
         //проверка существования календаря
         if (!$caldav->getCalendarByUri("principals/users/{$user}", $userTaskName)) {
             //создание календаря если его нет
             $caldav->createCalendar("principals/users/{$user}", $userTaskName, []);
         }
         //находим id календаря пользователя $calendarId
         $userCalendar = $caldav->getCalendarByUri("principals/users/{$user}", $userTaskName);
         if (array_key_exists($tasksIdCalTable[$i]['uid'], $userTasks)) {
             //массив тасков одного пользователя с таблицы синхронизации
             $taskArr = (array) json_decode($tasksIdCalTable[$i]['id_tasks']);
             if ($taskArr == '') {
                 $taskArr = [];
             }
             //массив тасков одного пользователя с чартов
             $mainTasksArr = $userTasks[$tasksIdCalTable[$i]['uid']];
             if ($mainTasksArr == '') {
                 $mainTasksArr = [];
             }
             //новые таски------------------------------------------------------------------
             $idNewTasks = array_values(array_diff(array_keys($mainTasksArr), array_keys($taskArr)));
             if (count($idNewTasks)) {
                 //создаем новые события календаря
                 //проходим в цыкле по новых тасках пользователя
                 for ($j = 0; $j < count($idNewTasks); $j++) {
                     $uid = $this->connect->calendarObjects()->randhesh(25);
                     $etag = $this->connect->calendarObjects()->randhesh(32);
                     $uri = 'ownCloud-';
                     $uri .= $this->connect->calendarObjects()->randhesh(50);
                     $uri .= '.ics';
                     $description = '';
                     //                        $key = array_keys($idNewTasks);
                     $this->connect->calendarChanges()->insert($uri, $userCalendar['id']);
                     //id созданого события
                     $insertId = $this->connect->calendarObjects()->insert($userCalendar['id'], $uri, $etag, $uid, $arrIdTasks[$idNewTasks[$j]]['text'], $description, $arrIdTasks[$idNewTasks[$j]]['start_date'], $arrIdTasks[$idNewTasks[$j]]['end_date']);
                     //записываем id события в таблицу синхронизации
                     $res = $this->connect->calendar()->getById($tasksIdCalTable[$i]['uid']);
                     $res[$idNewTasks[$j]] = (int) $insertId;
                     $this->connect->calendar()->update($tasksIdCalTable[$i]['uid'], json_encode($res));
                 }
             }
             //удаленные таски----------------------------------------------------------------
             $idDeleteTask = array_values(array_diff(array_keys($taskArr), array_keys($mainTasksArr)));
             if (count($idDeleteTask)) {
                 //удаляем старые события
                 $deleteId = [];
                 foreach ($taskArr as $k => $v) {
                     if (in_array($k, $idDeleteTask)) {
                         $deleteId[] = $v;
                     }
                 }
                 $this->connect->calendarObjects()->delete($deleteId);
                 //удаляем таск с таблицы синхронизации
                 $res = $this->connect->calendar()->getById($tasksIdCalTable[$i]['uid']);
                 foreach ($res as $k => $v) {
                     if (!in_array($k, $idDeleteTask)) {
                         $newRes[$k] = $v;
                     }
                 }
                 $this->connect->calendar()->update($tasksIdCalTable[$i]['uid'], json_encode($newRes));
             }
             //обновляем события текущих тасков-----------------------------------------------
             if (count($taskArr)) {
                 //обновляем события текущих тасков
                 for ($k = 0; $k < count($taskArr); $k++) {
                     $uid = $this->connect->calendarObjects()->randhesh(25);
                     $description = '';
                     $etag = $this->connect->calendarObjects()->randhesh(32);
                     $uri = 'ownCloud-';
                     $uri .= $this->connect->calendarObjects()->randhesh(50);
                     $uri .= '.ics';
                     $result = $this->connect->calendarObjects()->updateFromTasks(array_values($taskArr)[$k], $uid, $arrIdTasks[array_keys($taskArr)[$k]]['text'], $description, $arrIdTasks[array_keys($taskArr)[$k]]['start_date'], $arrIdTasks[array_keys($taskArr)[$k]]['end_date'], $uri, $etag, $userCalendar['id']);
                 }
             }
         }
     }
     //все id групп
     $allGroups = $this->connect->groups->get();
     //массив id тасков, ключами которого являются id груп
     $groupTasks = [];
     //перебираем группы
     for ($i = 0; $i < count($allGroups); $i++) {
         //юзеры i-той группы
         $usersGroup = $this->connect->groupUser()->getByGid($allGroups[$i]['gid']);
         $temp = [];
         $temp_arr = [];
         for ($k = 0; $k < count($allTasks); $k++) {
             $taskGroup = json_decode($allTasks[$k]['users'])->groups;
             if (in_array($allGroups[$i]['gid'], $taskGroup)) {
                 $temp_arr[$allTasks[$k]['id']] = '';
             }
         }
         for ($j = 0; $j < count($usersGroup); $j++) {
             $temp[$usersGroup[$j]] = $temp_arr;
         }
         $groupTasks[$allGroups[$i]['gid']] = $temp;
         unset($temp_arr);
     }
     //id текущих груп
     $groupId = array_keys($groupTasks);
     //id груп с таблицы синхронизации
     $groupIdCal = $this->connect->calendarGroup()->getGroupsId();
     //добавление в таблицу синхронизации новых груп
     $newGroupId = array_diff($groupId, $groupIdCal);
     $this->connect->calendarGroup()->insertAllById($newGroupId);
     //удаление удаленных груп с таблицы синхронизации
     $deleteGroupId = array_diff($groupIdCal, $groupId);
     $this->connect->calendarGroup()->deleteAllById($deleteGroupId);
     //синхронизация тасков
     //gid[$i]=>admin
     //users (json)["bogdan","oleg","alex","ivan"]
     //id_tasks (json){"2":81,"3":82,"4":83,"5":84}
     $tasksIdCalTable = $this->connect->calendarGroup()->get();
     //$tasksIdCalTable[0]['gid']=admin;
     //$tasksIdCalTable[0]['id_tasks']=json(id_tasks);
     //проходим по всех группах
     for ($i = 0; $i < count($tasksIdCalTable); $i++) {
         $group = $tasksIdCalTable[$i]['gid'];
         //admin
         //вытаскиваем всех юзеров i-той группы (admin)
         //$userGroup[0]['uid'] = 'bogdan';
         $usersGroup = array_keys($groupTasks[$group]);
         //находим учасников с группы таблицы синхронизации
         $usersGroupTable = json_decode($tasksIdCalTable[$i]['id_tasks'], true);
         if (!$usersGroupTable) {
             $usersGroupTable = [];
         }
         //добавляем новых юзеров в группу--------------------------------------------------
         $newUsers = array_values(array_diff($usersGroup, array_keys($usersGroupTable)));
         if (count($newUsers)) {
             //---------------------------------------------------------------------------------
             //создание рабочего календаря для каждого пользователя
             for ($j = 0; $j < count($newUsers); $j++) {
                 $user = $newUsers[$j];
                 if (!$this->userManager->userExists($user)) {
                     throw new \InvalidArgumentException("User <{$user}> in unknown.");
                 }
                 $principalBackend = new Principal($this->userManager, $this->groupManager);
                 $caldav = new CalDAV\CalDavBackend($this->connect->db, $principalBackend);
                 //проверка существования календаря
                 if (!$caldav->getCalendarByUri("principals/users/{$user}", $group)) {
                     //создание календаря если его нет
                     $caldav->createCalendar("principals/users/{$user}", $group, []);
                 }
             }
             //---------------------------------------------------------------------------------
             for ($j = 0; $j < count($newUsers); $j++) {
                 $arr = [];
                 $usersGroupTable[$newUsers[$j]] = $arr;
             }
         }
         //удаляем старых юзеров с группы---------------------------------------------------
         $deletedUsers = array_values(array_diff(array_keys($usersGroupTable), $usersGroup));
         if (count($deletedUsers)) {
             for ($j = 0; $j < count($deletedUsers); $j++) {
                 //удаляем календарь и таски этого юзера
                 $userCalendar = $caldav->getCalendarByUri("principals/users/{$deletedUsers[$j]}", $group);
                 $caldav->deleteCalendar($userCalendar['id']);
                 //удаляем ячейку юзера с таблицы синхронизации
                 unset($usersGroupTable[$deletedUsers[$j]]);
             }
         }
         //проверяем таски каждого юзера
         foreach ($usersGroupTable as $k => $v) {
             $newTasks = array_values(array_diff(array_keys($groupTasks[$group][$k]), array_keys($v)));
             //находим id календаря пользователя $calendarId, если его пользователь удалил - создаем обратно
             $userCalendar = $caldav->getCalendarByUri("principals/users/{$k}", $group);
             if (!$userCalendar) {
                 $result = $caldav->createCalendar("principals/users/{$k}", $group, []);
                 $userCalendar = [];
                 $userCalendar['id'] = $result;
             }
             if (count($newTasks)) {
                 for ($n = 0; $n < count($newTasks); $n++) {
                     //-------------------------------------
                     //создание нового события
                     $uid = $this->connect->calendarObjects()->randhesh(25);
                     $etag = $this->connect->calendarObjects()->randhesh(32);
                     $uri = 'ownCloud-';
                     $uri .= $this->connect->calendarObjects()->randhesh(50);
                     $uri .= '.ics';
                     $description = '';
                     $this->connect->calendarChanges()->insert($uri, $userCalendar['id']);
                     //id созданого события
                     $insertId = $this->connect->calendarObjects()->insert($userCalendar['id'], $uri, $etag, $uid, $arrIdTasks[$newTasks[$n]]['text'], $description, $arrIdTasks[$newTasks[$n]]['start_date'], $arrIdTasks[$newTasks[$n]]['end_date']);
                     //-------------------------------------
                     $v[$newTasks[$n]] = (int) $insertId;
                 }
             }
             //удаленные таски
             $deleteTasks = array_values(array_diff(array_keys($v), array_keys($groupTasks[$group][$k])));
             if (count($deleteTasks)) {
                 $arr_del = [];
                 for ($n = 0; $n < count($deleteTasks); $n++) {
                     $arr_del[] = $v[$deleteTasks[$n]];
                     unset($v[$deleteTasks[$n]]);
                 }
                 $this->connect->calendarObjects()->delete($arr_del);
             }
             $usersGroupTable[$k] = $v;
             if (!$usersGroupTable) {
                 $usersGroupTable = '';
             }
             foreach ($v as $taskId => $eventId) {
                 $uid = $this->connect->calendarObjects()->randhesh(25);
                 $description = '';
                 $etag = $this->connect->calendarObjects()->randhesh(32);
                 $uri = 'ownCloud-';
                 $uri .= $this->connect->calendarObjects()->randhesh(50);
                 $uri .= '.ics';
                 $result = $this->connect->calendarObjects()->updateFromTasks($eventId, $uid, $arrIdTasks[$taskId]['text'], $description, $arrIdTasks[$taskId]['start_date'], $arrIdTasks[$taskId]['end_date'], $uri, $etag, $userCalendar['id']);
             }
         }
         $this->connect->calendarGroup()->updateUsersTasks($group, $usersGroupTable);
     }
 }