db->getQueryBuilder(); $delete->delete('talk_attachments')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_attendees')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_bots_conversation')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_bots_server')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_bridges')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_commands') ->where($delete->expr()->neq('app', $delete->createNamedParameter(''))) ->andWhere($delete->expr()->neq('command', $delete->createNamedParameter('help'))) ->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_consent')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_internalsignaling')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_invitations')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_phone_numbers')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_polls')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_poll_votes')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_proxy_messages')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_reminders')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_retry_ocm')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_rooms')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_sessions')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_threads')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('talk_thread_attendees')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('share') ->where($delete->expr()->orX( $delete->expr()->eq('share_type', $delete->createNamedParameter(IShare::TYPE_ROOM)), $delete->expr()->eq('share_type', $delete->createNamedParameter(11 /*RoomShareProvider::SHARE_TYPE_USERROOM*/)) )) ->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('preferences') ->where($delete->expr()->in('configkey', $delete->createNamedParameter(['changelog', 'note_to_self', 'samples_created'], IQueryBuilder::PARAM_STR_ARRAY))) ->andWhere($delete->expr()->eq('appid', $delete->createNamedParameter('spreed'))) ->executeStatement(); try { $delete = $this->db->getQueryBuilder(); $delete->delete('notifications') ->where($delete->expr()->eq('app', $delete->createNamedParameter('spreed'))) ->executeStatement(); } catch (\Throwable $e) { // Ignore } $delete = $this->db->getQueryBuilder(); $delete->delete('calendarobjects')->executeStatement(); $delete = $this->db->getQueryBuilder(); $delete->delete('calendarobjects_props')->executeStatement(); return new DataResponse(); } public function ageChat(string $token, int $hours): DataResponse { $query = $this->db->getQueryBuilder(); $query->select('id', 'last_activity', 'object_id') ->from('talk_rooms') ->where($query->expr()->eq('token', $query->createNamedParameter($token))); $result = $query->executeQuery(); $room = $result->fetch(); $result->closeCursor(); if (!$room) { return new DataResponse(null, Http::STATUS_NOT_FOUND); } $roomId = (int)$room['id']; $lastActivity = new \DateTime($room['last_activity']); $lastActivity->sub(new \DateInterval('PT' . $hours . 'H')); $update = $this->db->getQueryBuilder(); $update->update('talk_rooms') ->set('last_activity', $update->createNamedParameter($lastActivity, IQueryBuilder::PARAM_DATETIME_MUTABLE)) ->where($update->expr()->eq('id', $update->createNamedParameter($roomId))); $eventConversationObjectId = explode('#', $room['object_id']); if (count($eventConversationObjectId) === 2) { $eventConversationObjectId[0] -= $hours * 3600; $eventConversationObjectId[1] -= $hours * 3600; $update->set('object_id', $update->createNamedParameter(implode('#', $eventConversationObjectId))); } $update->executeStatement(); $update = $this->db->getQueryBuilder(); $update->update('comments') ->set('creation_timestamp', $update->createParameter('creation_timestamp')) ->set('expire_date', $update->createParameter('expire_date')) ->set('meta_data', $update->createParameter('meta_data')) ->where($update->expr()->eq('id', $update->createParameter('id'))); $query = $this->db->getQueryBuilder(); $query->select('id', 'creation_timestamp', 'expire_date', 'meta_data') ->from('comments') ->where($query->expr()->eq('object_type', $query->createNamedParameter('chat'))) ->andWhere($query->expr()->eq('object_id', $query->createNamedParameter($roomId))); $result = $query->executeQuery(); while ($row = $result->fetch()) { $creationTimestamp = new \DateTime($row['creation_timestamp']); $creationTimestamp->sub(new \DateInterval('PT' . $hours . 'H')); $expireDate = null; if ($row['expire_date']) { $expireDate = new \DateTime($row['expire_date']); $expireDate->sub(new \DateInterval('PT' . $hours . 'H')); } $metaData = 'null'; if ($row['meta_data'] !== 'null') { $metaData = json_decode($row['meta_data'], true); if (isset($metaData['last_edited_time'])) { $metaData['last_edited_time'] -= $hours * 3600; } $metaData = json_encode($metaData); } $update->setParameter('id', $row['id']); $update->setParameter('creation_timestamp', $creationTimestamp, IQueryBuilder::PARAM_DATE); $update->setParameter('expire_date', $expireDate, IQueryBuilder::PARAM_DATE); $update->setParameter('meta_data', $metaData); $update->executeStatement(); } $result->closeCursor(); return new DataResponse(); } public function forgedFederationLeave(string $token, string $actingUser, string $targetUser): DataResponse { $query = $this->db->getQueryBuilder(); $query->select('id') ->from('talk_rooms') ->where($query->expr()->eq('token', $query->createNamedParameter($token))); $result = $query->executeQuery(); $roomId = (int)$result->fetchOne(); $result->closeCursor(); $query = $this->db->getQueryBuilder(); $query->select('access_token', 'invited_cloud_id') ->from('talk_attendees') ->where($query->expr()->eq('actor_id', $query->createNamedParameter($actingUser))) ->andWhere($query->expr()->eq('actor_type', $query->createNamedParameter(Attendee::ACTOR_USERS))) ->andWhere($query->expr()->eq('room_id', $query->createNamedParameter($roomId))); $result = $query->executeQuery(); $access = $result->fetch(); $result->closeCursor(); $query = $this->db->getQueryBuilder(); $query->select('s.session_id') ->from('talk_attendees', 'a') ->leftJoin('a', 'talk_sessions', 's', $query->expr()->eq('a.id', 's.attendee_id')) ->where($query->expr()->eq('actor_id', $query->createNamedParameter($targetUser))) ->andWhere($query->expr()->eq('actor_type', $query->createNamedParameter(Attendee::ACTOR_USERS))) ->andWhere($query->expr()->eq('room_id', $query->createNamedParameter($roomId))); $result = $query->executeQuery(); $session = $result->fetch(); $result->closeCursor(); return new DataResponse([ 'access' => $access, 'session' => $session, ]); } #[NoAdminRequired] public function createDashboardEvents(string $name, string $location): DataResponse { if ($this->userId === null) { return new DataResponse(null, Http::STATUS_UNAUTHORIZED); } $calendar = null; $calendars = $this->calendarManager->getCalendarsForPrincipal('principals/users/' . $this->userId); foreach ($calendars as $c) { if ($c instanceof ICreateFromString) { $calendar = $c; } } if ($calendar === null) { return new DataResponse(null, Http::STATUS_NOT_FOUND); } $start = time(); $end = time() + 3600; $events = EventGenerator::generateEvents($name, $location, $start, $end); foreach ($events as $event) { try { /** @var ICreateFromString $calendar */ $calendar->createFromString(random_int(0, 10000) . '.ics', $event); } catch (CalendarException) { return new DataResponse(null, Http::STATUS_FORBIDDEN); } } return new DataResponse(); } #[NoAdminRequired] public function createEventAndInviteParticipant(string $organizer, string $attendee): DataResponse { if ($this->userId === null) { return new DataResponse(null, Http::STATUS_UNAUTHORIZED); } $calendar = null; // Create a calendar event with LOCATION and time via OCP $calendars = $this->calendarManager->getCalendarsForPrincipal('principals/users/' . $this->userId); foreach ($calendars as $c) { if ($c instanceof ICreateFromString) { $calendar = $c; } } if ($calendar === null) { return new DataResponse(null, Http::STATUS_NOT_FOUND); } $start = time(); $end = $start + 3600; $startTime = (new \DateTime())->setTimestamp($start); $endTime = (new \DateTime())->setTimestamp($end); for ($i = 0; $i < 3; $i++) { $interval = new \DateInterval('PT2H'); $startTime->add($interval); $endTime->add($interval); $vCalendar = new VCalendar(); $vevent = $vCalendar->createComponent('VEVENT'); $vevent->add('UID', UUIDUtil::getUUID()); $vevent->add('DTSTART'); $vevent->DTSTART->setDateTime($startTime); $vevent->add('DTEND'); $vevent->DTEND->setDateTime($endTime); $vevent->add('SUMMARY', 'Test'); $vevent->add('DESCRIPTION', 'Test'); $vevent->add('ORGANIZER', 'mailto:' . $organizer . '@example.tld', ['CN' => $organizer]); $vevent->add('ATTENDEE', 'mailto:' . $attendee . '@example.tld', [ 'CN' => $attendee, 'CUTYPE' => 'INDIVIDUAL', 'PARTSTAT' => 'NEEDS-ACTION', 'ROLE' => 'REQ-PARTICIPANT', 'RSVP' => 'TRUE' ]); $vevent->add('STATUS', 'CONFIRMED'); $vCalendar->add($vevent); if ($i === 1) { $vevent->add('ATTACH', '/index.php/f/3226', [ 'FMTTYPE' => 'application/pdf', 'FILENAME' => 'test.pdf', ]); } if ($i === 2) { $vevent->add('ATTACH', '/index.php/f/3226', [ 'FMTTYPE' => 'application/pdf', 'FILENAME' => 'test.pdf', 'X-NC-FILE-ID' => '3226', 'X-NC-HAS-PREVIEW' => 'false' ]); } $cal = $vCalendar->serialize(); try { /** @var ICreateFromString $calendar */ $calendar->createFromString(random_int(0, 10000) . '.ics', $cal); } catch (CalendarException) { return new DataResponse(null, Http::STATUS_FORBIDDEN); } } return new DataResponse(); } }