├── .github ├── CODEOWNERS ├── dependabot.yml └── workflows │ ├── block-merge-freeze.yml │ ├── documentation.yml │ ├── lint-php-cs.yml │ ├── lint-php.yml │ ├── phpunit-mysql.yml │ ├── phpunit-oci.yml │ ├── phpunit-pgsql.yml │ ├── phpunit-sqlite.yml │ ├── pr-feedback.yml │ ├── psalm.yml │ ├── reuse.yml │ └── update-nextcloud-ocp.yml ├── .gitignore ├── .php-cs-fixer.dist.php ├── .tx └── config ├── AUTHORS.md ├── CHANGELOG.md ├── LICENSE ├── LICENSES ├── AGPL-3.0-only.txt ├── AGPL-3.0-or-later.txt ├── Apache-2.0.txt ├── CC0-1.0.txt └── MIT.txt ├── Makefile ├── README.md ├── REUSE.toml ├── appinfo ├── info.xml └── routes.php ├── composer.json ├── composer.lock ├── files └── list.php ├── img ├── circles-dark.svg └── circles.svg ├── l10n ├── .gitkeep ├── af.js ├── af.json ├── ar.js ├── ar.json ├── ast.js ├── ast.json ├── az.js ├── az.json ├── bg.js ├── bg.json ├── bn_BD.js ├── bn_BD.json ├── br.js ├── br.json ├── bs.js ├── bs.json ├── ca.js ├── ca.json ├── cs.js ├── cs.json ├── cy_GB.js ├── cy_GB.json ├── da.js ├── da.json ├── de.js ├── de.json ├── de_DE.js ├── de_DE.json ├── el.js ├── el.json ├── en_GB.js ├── en_GB.json ├── eo.js ├── eo.json ├── es.js ├── es.json ├── es_419.js ├── es_419.json ├── es_AR.js ├── es_AR.json ├── es_CL.js ├── es_CL.json ├── es_CO.js ├── es_CO.json ├── es_CR.js ├── es_CR.json ├── es_DO.js ├── es_DO.json ├── es_EC.js ├── es_EC.json ├── es_GT.js ├── es_GT.json ├── es_HN.js ├── es_HN.json ├── es_MX.js ├── es_MX.json ├── es_NI.js ├── es_NI.json ├── es_PA.js ├── es_PA.json ├── es_PE.js ├── es_PE.json ├── es_PR.js ├── es_PR.json ├── es_PY.js ├── es_PY.json ├── es_SV.js ├── es_SV.json ├── es_UY.js ├── es_UY.json ├── et_EE.js ├── et_EE.json ├── eu.js ├── eu.json ├── fa.js ├── fa.json ├── fi.js ├── fi.json ├── fr.js ├── fr.json ├── ga.js ├── ga.json ├── gl.js ├── gl.json ├── he.js ├── he.json ├── hr.js ├── hr.json ├── hu.js ├── hu.json ├── ia.js ├── ia.json ├── id.js ├── id.json ├── is.js ├── is.json ├── it.js ├── it.json ├── ja.js ├── ja.json ├── ka.js ├── ka.json ├── ka_GE.js ├── ka_GE.json ├── kab.js ├── kab.json ├── km.js ├── km.json ├── kn.js ├── kn.json ├── ko.js ├── ko.json ├── lb.js ├── lb.json ├── lo.js ├── lo.json ├── lt_LT.js ├── lt_LT.json ├── lv.js ├── lv.json ├── mk.js ├── mk.json ├── mn.js ├── mn.json ├── ms_MY.js ├── ms_MY.json ├── nb.js ├── nb.json ├── nl.js ├── nl.json ├── nn_NO.js ├── nn_NO.json ├── oc.js ├── oc.json ├── pl.js ├── pl.json ├── ps.js ├── ps.json ├── pt_BR.js ├── pt_BR.json ├── pt_PT.js ├── pt_PT.json ├── ro.js ├── ro.json ├── ru.js ├── ru.json ├── sc.js ├── sc.json ├── si.js ├── si.json ├── sk.js ├── sk.json ├── sl.js ├── sl.json ├── sq.js ├── sq.json ├── sr.js ├── sr.json ├── sv.js ├── sv.json ├── th.js ├── th.json ├── tr.js ├── tr.json ├── ug.js ├── ug.json ├── uk.js ├── uk.json ├── uz.js ├── uz.json ├── vi.js ├── vi.json ├── zh_CN.js ├── zh_CN.json ├── zh_HK.js ├── zh_HK.json ├── zh_TW.js └── zh_TW.json ├── lib ├── Activity │ ├── Filter.php │ ├── Provider.php │ ├── ProviderParser.php │ ├── ProviderSubjectCircle.php │ ├── ProviderSubjectCircleMember.php │ ├── ProviderSubjectMember.php │ ├── SettingAsMember.php │ ├── SettingAsModerator.php │ └── SettingAsNonMember.php ├── Api │ └── v1 │ │ └── Circles.php ├── AppInfo │ ├── Application.php │ └── Capabilities.php ├── Circles │ └── FileSharingBroadcaster.php ├── CirclesManager.php ├── CirclesQueryHelper.php ├── Collaboration │ └── v2 │ │ └── CollaboratorSearchPlugin.php ├── Command │ ├── CirclesCheck.php │ ├── CirclesConfig.php │ ├── CirclesCreate.php │ ├── CirclesDestroy.php │ ├── CirclesDetails.php │ ├── CirclesEdit.php │ ├── CirclesJoin.php │ ├── CirclesLeave.php │ ├── CirclesList.php │ ├── CirclesMaintenance.php │ ├── CirclesMemberships.php │ ├── CirclesRemote.php │ ├── CirclesReport.php │ ├── CirclesSetting.php │ ├── CirclesSync.php │ ├── CirclesTest.php │ ├── MembersAdd.php │ ├── MembersDetails.php │ ├── MembersLevel.php │ ├── MembersList.php │ ├── MembersRemove.php │ ├── MembersSearch.php │ ├── MigrateCustomGroups.php │ └── SharesFiles.php ├── Controller │ ├── AdminController.php │ ├── DeprecatedController.php │ ├── EventWrapperController.php │ ├── LocalController.php │ └── RemoteController.php ├── Cron │ ├── Maintenance.php │ └── MaintenanceHeavy.php ├── Dashboard │ └── TeamDashboardWidget.php ├── Db │ ├── AccountsRequest.php │ ├── AccountsRequestBuilder.php │ ├── CircleRequest.php │ ├── CircleRequestBuilder.php │ ├── CoreQueryBuilder.php │ ├── CoreRequestBuilder.php │ ├── DeprecatedRequestBuilder.php │ ├── EventWrapperRequest.php │ ├── EventWrapperRequestBuilder.php │ ├── FileSharesRequest.php │ ├── FileSharesRequestBuilder.php │ ├── GSSharesRequest.php │ ├── GSSharesRequestBuilder.php │ ├── MemberRequest.php │ ├── MemberRequestBuilder.php │ ├── MembershipRequest.php │ ├── MembershipRequestBuilder.php │ ├── MountPointRequest.php │ ├── MountPointRequestBuilder.php │ ├── MountRequest.php │ ├── MountRequestBuilder.php │ ├── RemoteRequest.php │ ├── RemoteRequestBuilder.php │ ├── ShareLockRequest.php │ ├── ShareLockRequestBuilder.php │ ├── ShareTokenRequest.php │ ├── ShareTokenRequestBuilder.php │ ├── ShareWrapperRequest.php │ ├── ShareWrapperRequestBuilder.php │ ├── TokensRequest.php │ └── TokensRequestBuilder.php ├── Events │ ├── AddingCircleMemberEvent.php │ ├── CircleCreatedEvent.php │ ├── CircleDestroyedEvent.php │ ├── CircleEditedEvent.php │ ├── CircleGenericEvent.php │ ├── CircleMemberAddedEvent.php │ ├── CircleMemberEditedEvent.php │ ├── CircleMemberGenericEvent.php │ ├── CircleMemberRemovedEvent.php │ ├── CircleMemberRequestedEvent.php │ ├── CircleResultGenericEvent.php │ ├── CreatingCircleEvent.php │ ├── DestroyingCircleEvent.php │ ├── EditingCircleEvent.php │ ├── EditingCircleMemberEvent.php │ ├── Files │ │ ├── CreatingFileShareEvent.php │ │ ├── FileShareCreatedEvent.php │ │ └── PreparingFileShareEvent.php │ ├── MembershipsCreatedEvent.php │ ├── MembershipsEditedEvent.php │ ├── MembershipsRemovedEvent.php │ ├── PreparingCircleMemberEvent.php │ ├── RemovingCircleMemberEvent.php │ ├── RequestingCircleMemberEvent.php │ └── SharedItemsSyncRequestedEvent.php ├── Exceptions │ ├── ApiVersionIncompatibleException.php │ ├── BroadcasterIsNotCompatibleException.php │ ├── CircleAlreadyExistsException.php │ ├── CircleDoesNotExistException.php │ ├── CircleNameFirstCharException.php │ ├── CircleNameTooShortException.php │ ├── CircleNotFoundException.php │ ├── CircleTypeDisabledException.php │ ├── CircleTypeIsEmptyException.php │ ├── CircleTypeNotValidException.php │ ├── CommandMissingArgumentException.php │ ├── ConfigNoCircleAvailableException.php │ ├── ContactAddressBookNotFoundException.php │ ├── ContactFormatException.php │ ├── ContactNotFoundException.php │ ├── EmailAccountInvalidFormatException.php │ ├── EventWrapperNotFoundException.php │ ├── FakeException.php │ ├── FederatedCircleLinkFormatException.php │ ├── FederatedCircleNotAllowedException.php │ ├── FederatedCircleStatusUpdateException.php │ ├── FederatedEventDSyncException.php │ ├── FederatedEventException.php │ ├── FederatedItemBadRequestException.php │ ├── FederatedItemConflictException.php │ ├── FederatedItemException.php │ ├── FederatedItemForbiddenException.php │ ├── FederatedItemNotFoundException.php │ ├── FederatedItemRemoteException.php │ ├── FederatedItemServerException.php │ ├── FederatedItemUnauthorizedException.php │ ├── FederatedLinkCircleNotFoundException.php │ ├── FederatedLinkCreationException.php │ ├── FederatedLinkDoesNotExistException.php │ ├── FederatedLinkUpdateException.php │ ├── FederatedRemoteCircleDoesNotExistException.php │ ├── FederatedRemoteDoesNotAllowException.php │ ├── FederatedRemoteIsDownException.php │ ├── FederatedShareAlreadyLockedException.php │ ├── FederatedShareBelongingException.php │ ├── FederatedShareNotFoundException.php │ ├── FederatedUserException.php │ ├── FederatedUserNotFoundException.php │ ├── FileCacheNotFoundException.php │ ├── FrontendException.php │ ├── GSKeyException.php │ ├── GSStatusException.php │ ├── GlobalScaleDSyncException.php │ ├── GlobalScaleEventException.php │ ├── GroupCannotBeOwnerException.php │ ├── GroupDoesNotExistException.php │ ├── GroupNotFoundException.php │ ├── InitiatorNotConfirmedException.php │ ├── InitiatorNotFoundException.php │ ├── InsufficientPermissionException.php │ ├── InvalidIdException.php │ ├── InvalidModelException.php │ ├── JsonException.php │ ├── JsonNotRequestedException.php │ ├── LinkedGroupNotAllowedException.php │ ├── MaintenanceException.php │ ├── MemberAlreadyExistsException.php │ ├── MemberCantJoinCircleException.php │ ├── MemberDoesNotExistException.php │ ├── MemberHelperException.php │ ├── MemberIsBlockedException.php │ ├── MemberIsNotAdminException.php │ ├── MemberIsNotModeratorException.php │ ├── MemberIsNotOwnerException.php │ ├── MemberIsOwnerException.php │ ├── MemberLevelException.php │ ├── MemberNotFoundException.php │ ├── MemberTypeCantEditLevelException.php │ ├── MembersLimitException.php │ ├── MembershipNotFoundException.php │ ├── MigrationException.php │ ├── MissingKeyInArrayException.php │ ├── ModelException.php │ ├── ModeratorIsNotHighEnoughException.php │ ├── MountNotFoundException.php │ ├── MountPointConstructionException.php │ ├── MountPointNotFoundException.php │ ├── NotContactAddressException.php │ ├── NotLocalMemberException.php │ ├── OwnerNotFoundException.php │ ├── ParseMemberLevelException.php │ ├── PayloadDeliveryException.php │ ├── RemoteAlreadyExistsException.php │ ├── RemoteCircleException.php │ ├── RemoteInstanceException.php │ ├── RemoteNotFoundException.php │ ├── RemoteResourceNotFoundException.php │ ├── RemoteUidException.php │ ├── RequestBuilderException.php │ ├── ShareTokenAlreadyExistException.php │ ├── ShareTokenNotFoundException.php │ ├── ShareWrapperNotFoundException.php │ ├── SharingFrameAlreadyDeliveredException.php │ ├── SharingFrameAlreadyExistException.php │ ├── SharingFrameDoesNotExistException.php │ ├── SharingFrameSourceCannotBeAppCirclesException.php │ ├── SingleCircleNotFoundException.php │ ├── SuperSessionException.php │ ├── TokenDoesNotExistException.php │ ├── UnknownFederatedItemException.php │ ├── UnknownInterfaceException.php │ ├── UnknownRemoteException.php │ └── UserTypeNotFoundException.php ├── FederatedItems │ ├── CircleConfig.php │ ├── CircleCreate.php │ ├── CircleDestroy.php │ ├── CircleEdit.php │ ├── CircleJoin.php │ ├── CircleLeave.php │ ├── CircleSetting.php │ ├── CircleSettings.php │ ├── Files │ │ ├── FileShare.php │ │ └── FileUnshare.php │ ├── ItemLock.php │ ├── LoopbackTest.php │ ├── MassiveMemberAdd.php │ ├── MemberDisplayName.php │ ├── MemberLevel.php │ ├── MemberRemove.php │ ├── SharedItemsSync.php │ └── SingleMemberAdd.php ├── FileSharingTeamResourceProvider.php ├── Handlers │ └── WebfingerHandler.php ├── IBroadcaster.php ├── IEntity.php ├── IFederatedItem.php ├── IFederatedItemAsyncProcess.php ├── IFederatedItemCircleCheckNotRequired.php ├── IFederatedItemDataRequestOnly.php ├── IFederatedItemHighSeverity.php ├── IFederatedItemInitiatorCheckNotRequired.php ├── IFederatedItemInitiatorMembershipNotRequired.php ├── IFederatedItemLimitedToInstanceWithMembership.php ├── IFederatedItemLoopbackTest.php ├── IFederatedItemMemberCheckNotRequired.php ├── IFederatedItemMemberEmpty.php ├── IFederatedItemMemberOptional.php ├── IFederatedItemMemberRequired.php ├── IFederatedItemMustBeInitializedLocally.php ├── IFederatedItemShareManagement.php ├── IFederatedItemSharedItem.php ├── IFederatedModel.php ├── IFederatedSync.php ├── IFederatedUser.php ├── IQueryProbe.php ├── ISearch.php ├── Listeners │ ├── AccountUpdated.php │ ├── DeprecatedListener.php │ ├── Examples │ │ ├── ExampleAddingCircleMember.php │ │ ├── ExampleMembershipsCreated.php │ │ ├── ExampleMembershipsRemoved.php │ │ └── ExampleRequestingCircleMember.php │ ├── Files │ │ ├── AddingMemberSendMail.php │ │ ├── CreatingShareSendMail.php │ │ ├── DestroyingCircle.php │ │ ├── MemberAddedSendMail.php │ │ ├── MembershipsRemoved.php │ │ ├── PreparingMemberSendMail.php │ │ ├── PreparingShareSendMail.php │ │ ├── RemovingMember.php │ │ └── ShareCreatedSendMail.php │ ├── GroupChanged.php │ ├── GroupCreated.php │ ├── GroupDeleted.php │ ├── GroupMemberAdded.php │ ├── GroupMemberRemoved.php │ ├── Notifications │ │ └── RequestingMember.php │ ├── UserCreated.php │ └── UserDeleted.php ├── Migration │ ├── Migration.php │ ├── Version0022Date20220526111723.php │ ├── Version0022Date20220526113601.php │ ├── Version0022Date20220703115023.php │ ├── Version0023Date20211216113101.php │ ├── Version0024Date20220203123901.php │ ├── Version0024Date20220203123902.php │ ├── Version0024Date20220317190331.php │ ├── Version0028Date20230705222601.php │ └── Version0031Date20241105133904.php ├── Model │ ├── BaseCircle.php │ ├── BaseMember.php │ ├── Circle.php │ ├── DavCard.php │ ├── DeprecatedCircle.php │ ├── DeprecatedMember.php │ ├── Federated │ │ ├── EventWrapper.php │ │ ├── FederatedEvent.php │ │ ├── FederatedShare.php │ │ └── RemoteInstance.php │ ├── FederatedLink.php │ ├── FederatedUser.php │ ├── FileCacheWrapper.php │ ├── GlobalScale │ │ ├── GSEvent.php │ │ ├── GSShare.php │ │ ├── GSShareMountpoint.php │ │ └── GSWrapper.php │ ├── Helpers │ │ └── MemberHelper.php │ ├── ManagedModel.php │ ├── Member.php │ ├── Membership.php │ ├── ModelManager.php │ ├── Mount.php │ ├── Mountpoint.php │ ├── Probes │ │ ├── BasicProbe.php │ │ ├── CircleProbe.php │ │ ├── DataProbe.php │ │ └── MemberProbe.php │ ├── Report.php │ ├── SearchResult.php │ ├── ShareToken.php │ ├── ShareWrapper.php │ ├── SharesToken.php │ └── SharingFrame.php ├── MountManager │ ├── CircleMount.php │ ├── CircleMountManager.php │ └── CircleMountProvider.php ├── Notification │ └── Notifier.php ├── Search │ ├── Contacts.php │ ├── FederatedUsers.php │ ├── GlobalScaleUsers.php │ ├── LocalGroups.php │ ├── LocalUsers.php │ ├── UnifiedSearchProvider.php │ └── UnifiedSearchResult.php ├── Service │ ├── ActivityService.php │ ├── CircleService.php │ ├── ConfigService.php │ ├── ContactService.php │ ├── EventService.php │ ├── EventWrapperService.php │ ├── FederatedEventService.php │ ├── FederatedShareService.php │ ├── FederatedUserService.php │ ├── GlobalScaleService.php │ ├── InterfaceService.php │ ├── MaintenanceService.php │ ├── MemberService.php │ ├── MembershipService.php │ ├── MigrationService.php │ ├── MiscService.php │ ├── NotificationService.php │ ├── OutputService.php │ ├── PermissionService.php │ ├── RemoteDownstreamService.php │ ├── RemoteService.php │ ├── RemoteStreamService.php │ ├── RemoteUpstreamService.php │ ├── SearchService.php │ ├── SendMailService.php │ ├── ShareService.php │ ├── ShareTokenService.php │ ├── ShareWrapperService.php │ ├── SyncService.php │ └── TimezoneService.php ├── ShareByCircleProvider.php ├── StatusCode.php ├── Tools │ ├── ActivityPub │ │ └── NCSignature.php │ ├── Db │ │ ├── ExtendedQueryBuilder.php │ │ └── IQueryRow.php │ ├── Exceptions │ │ ├── ArrayNotFoundException.php │ │ ├── DateTimeException.php │ │ ├── InvalidItemException.php │ │ ├── InvalidOriginException.php │ │ ├── ItemNotFoundException.php │ │ ├── MalformedArrayException.php │ │ ├── RequestContentException.php │ │ ├── RequestNetworkException.php │ │ ├── RequestResultNotJsonException.php │ │ ├── RequestResultSizeException.php │ │ ├── RequestServerException.php │ │ ├── RowNotFoundException.php │ │ ├── SignatoryException.php │ │ ├── SignatureException.php │ │ ├── UnknownTypeException.php │ │ └── WellKnownLinkNotFoundException.php │ ├── IDeserializable.php │ ├── Model │ │ ├── NCRequest.php │ │ ├── NCRequestResult.php │ │ ├── NCSignatory.php │ │ ├── NCSignedRequest.php │ │ ├── NCWebfinger.php │ │ ├── NCWellKnownLink.php │ │ ├── Request.php │ │ ├── SimpleDataStore.php │ │ └── TreeNode.php │ └── Traits │ │ ├── TArrayTools.php │ │ ├── TAsync.php │ │ ├── TConsoleTree.php │ │ ├── TDeserialize.php │ │ ├── TNCLocalSignatory.php │ │ ├── TNCLogger.php │ │ ├── TNCRequest.php │ │ ├── TNCSetup.php │ │ ├── TNCSignatory.php │ │ ├── TNCWellKnown.php │ │ └── TStringTools.php └── UnifiedSearch │ └── UnifiedSearchResult.php ├── phpDocumentor.sh ├── psalm.xml ├── psalm.xml.license ├── rector.php ├── screenshots ├── 0.12.0.png ├── 1.png └── contacts_backend.png ├── templates └── files │ └── list.php ├── testConfiguration.json ├── testConfiguration.json.license ├── tests ├── TestSuiteListener.php ├── bootstrap.php ├── phpunit.xml ├── psalm-baseline.xml ├── psalm-baseline.xml.license ├── stubs │ ├── doctrine_dbal_connection.php │ ├── doctrine_dbal_connections_primaryreadreplicaconnection.php │ ├── doctrine_dbal_driver_exception.php │ ├── doctrine_dbal_exception.php │ ├── doctrine_dbal_exception_constraintviolationexception.php │ ├── doctrine_dbal_exception_driverexception.php │ ├── doctrine_dbal_exception_serverexception.php │ ├── doctrine_dbal_exception_uniqueconstraintviolationexception.php │ ├── doctrine_dbal_query_querybuilder.php │ ├── doctrine_dbal_schema_abstractasset.php │ ├── doctrine_dbal_schema_constraint.php │ ├── doctrine_dbal_schema_index.php │ ├── doctrine_dbal_schema_schema.php │ ├── doctrine_dbal_schema_schemaexception.php │ ├── doctrine_dbal_schema_table.php │ ├── oc.php │ ├── oc_appframework_bootstrap_aregistration.php │ ├── oc_appframework_bootstrap_coordinator.php │ ├── oc_appframework_bootstrap_registrationcontext.php │ ├── oc_appframework_bootstrap_serviceregistration.php │ ├── oc_appframework_middleware_security_exceptions_notloggedinexception.php │ ├── oc_appframework_middleware_security_exceptions_securityexception.php │ ├── oc_appframework_utility_simplecontainer.php │ ├── oc_core_command_base.php │ ├── oc_db_connection.php │ ├── oc_db_connectionadapter.php │ ├── oc_db_exceptions_dbalexception.php │ ├── oc_db_querybuilder_querybuilder.php │ ├── oc_db_schemawrapper.php │ ├── oc_files_cache_cache.php │ ├── oc_files_cache_cacheentry.php │ ├── oc_files_mount_manager.php │ ├── oc_files_mount_mountpoint.php │ ├── oc_group_group.php │ ├── oc_group_manager.php │ ├── oc_hooks_basicemitter.php │ ├── oc_hooks_emitter.php │ ├── oc_hooks_publicemitter.php │ ├── oc_server.php │ ├── oc_servercontainer.php │ ├── oc_share20_share.php │ ├── oc_share20_shareattributes.php │ ├── oc_systemconfig.php │ ├── oc_user_manager.php │ ├── oc_user_nouserexception.php │ ├── oc_user_user.php │ ├── oca_dav_carddav_contactsmanager.php │ ├── oca_federatedfilesharing_notifications.php │ ├── oca_files_sharing_external_manager.php │ ├── stecman_component_symfony_console_bashcompletion_completion_completionawareinterface.php │ ├── symfony_component_console_command_command.php │ ├── symfony_component_console_helper_helper.php │ ├── symfony_component_console_helper_helperinterface.php │ ├── symfony_component_console_helper_questionhelper.php │ ├── symfony_component_console_helper_table.php │ ├── symfony_component_console_input_inputargument.php │ ├── symfony_component_console_input_inputinterface.php │ ├── symfony_component_console_input_inputoption.php │ ├── symfony_component_console_output_consoleoutput.php │ ├── symfony_component_console_output_consoleoutputinterface.php │ ├── symfony_component_console_output_consolesectionoutput.php │ ├── symfony_component_console_output_output.php │ ├── symfony_component_console_output_outputinterface.php │ ├── symfony_component_console_output_streamoutput.php │ ├── symfony_component_console_question_confirmationquestion.php │ ├── symfony_component_console_question_question.php │ └── symfony_component_process_process.php └── unit │ ├── CirclesManagerTest.php │ └── lib │ └── Controller │ ├── AdminControllerTest.php │ └── LocalControllerTest.php └── vendor-bin ├── cs-fixer ├── composer.json └── composer.lock ├── phpunit ├── composer.json └── composer.lock ├── psalm ├── composer.json └── composer.lock └── rector ├── composer.json └── composer.lock /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | /appinfo/info.xml @ArtificialOwl @provokateurin 2 | 3 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2021-2024 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: CC0-1.0 3 | version: 2 4 | updates: 5 | - package-ecosystem: composer 6 | directory: "/" 7 | schedule: 8 | interval: weekly 9 | day: saturday 10 | time: "03:00" 11 | timezone: Europe/Paris 12 | labels: 13 | - "3. to review" 14 | - "dependencies" 15 | reviewers: 16 | - "ArtificialOwl" 17 | 18 | - package-ecosystem: npm 19 | directory: "/" 20 | schedule: 21 | interval: weekly 22 | day: saturday 23 | time: "03:00" 24 | timezone: Europe/Paris 25 | open-pull-requests-limit: 10 26 | labels: 27 | - "3. to review" 28 | - "dependencies" 29 | reviewers: 30 | - "ArtificialOwl" 31 | -------------------------------------------------------------------------------- /.github/workflows/block-merge-freeze.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Block merges during freezes 10 | 11 | on: 12 | pull_request: 13 | types: [opened, ready_for_review, reopened, synchronize] 14 | 15 | permissions: 16 | contents: read 17 | 18 | concurrency: 19 | group: block-merge-freeze-${{ github.head_ref || github.run_id }} 20 | cancel-in-progress: true 21 | 22 | jobs: 23 | block-merges-during-freeze: 24 | name: Block merges during freezes 25 | 26 | if: github.event.pull_request.draft == false 27 | 28 | runs-on: ubuntu-latest-low 29 | 30 | steps: 31 | - name: Register server reference to fallback to master branch 32 | run: | 33 | server_ref="$(if [ '${{ github.base_ref }}' = 'main' ]; then echo -n 'master'; else echo -n '${{ github.base_ref }}'; fi)" 34 | echo "server_ref=$server_ref" >> $GITHUB_ENV 35 | - name: Download version.php from ${{ env.server_ref }} 36 | run: curl 'https://raw.githubusercontent.com/nextcloud/server/${{ env.server_ref }}/version.php' --output version.php 37 | 38 | - name: Run check 39 | run: cat version.php | grep 'OC_VersionString' | grep -i -v 'RC' 40 | -------------------------------------------------------------------------------- /.github/workflows/psalm.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | # 6 | # SPDX-FileCopyrightText: 2022-2024 Nextcloud GmbH and Nextcloud contributors 7 | # SPDX-License-Identifier: MIT 8 | 9 | name: Static analysis 10 | 11 | on: pull_request 12 | 13 | concurrency: 14 | group: psalm-${{ github.head_ref || github.run_id }} 15 | cancel-in-progress: true 16 | 17 | jobs: 18 | static-analysis: 19 | runs-on: ubuntu-latest 20 | 21 | name: static-psalm-analysis 22 | steps: 23 | - name: Checkout 24 | uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 25 | 26 | - name: Get php version 27 | id: versions 28 | uses: icewind1991/nextcloud-version-matrix@58becf3b4bb6dc6cef677b15e2fd8e7d48c0908f # v1.3.1 29 | 30 | - name: Set up php${{ steps.versions.outputs.php-available }} 31 | uses: shivammathur/setup-php@c541c155eee45413f5b09a52248675b1a2575231 # v2.31.1 32 | with: 33 | php-version: ${{ steps.versions.outputs.php-available }} 34 | extensions: bz2, ctype, curl, dom, fileinfo, gd, iconv, intl, json, libxml, mbstring, openssl, pcntl, posix, session, simplexml, xmlreader, xmlwriter, zip, zlib, sqlite, pdo_sqlite 35 | coverage: none 36 | ini-file: development 37 | env: 38 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 39 | 40 | - name: Install dependencies 41 | run: composer i 42 | 43 | - name: Run coding standards check 44 | run: composer run psalm 45 | -------------------------------------------------------------------------------- /.github/workflows/reuse.yml: -------------------------------------------------------------------------------- 1 | # This workflow is provided via the organization template repository 2 | # 3 | # https://github.com/nextcloud/.github 4 | # https://docs.github.com/en/actions/learn-github-actions/sharing-workflows-with-your-organization 5 | 6 | # SPDX-FileCopyrightText: 2022 Free Software Foundation Europe e.V. 7 | # 8 | # SPDX-License-Identifier: CC0-1.0 9 | 10 | name: REUSE Compliance Check 11 | 12 | on: [pull_request] 13 | 14 | jobs: 15 | reuse-compliance-check: 16 | runs-on: ubuntu-latest 17 | steps: 18 | - name: Checkout 19 | uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 20 | 21 | - name: REUSE Compliance Check 22 | uses: fsfe/reuse-action@3ae3c6bdf1257ab19397fab11fd3312144692083 # v4.0.0 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # SPDX-FileCopyrightText: 2017 Nextcloud GmbH and Nextcloud contributors 2 | # SPDX-License-Identifier: AGPL-3.0-or-later 3 | \.idea/ 4 | .buildpath 5 | .project 6 | .settings/ 7 | .php-cs-fixer.cache 8 | .php_cs.cache 9 | .phpdoc/ 10 | .vscode/settings.json 11 | build/ 12 | phpDocumentor.phar 13 | vendor/ 14 | -------------------------------------------------------------------------------- /.php-cs-fixer.dist.php: -------------------------------------------------------------------------------- 1 | getFinder() 15 | ->ignoreVCSIgnored(true) 16 | ->notPath('build') 17 | ->notPath('l10n') 18 | ->notPath('src') 19 | ->notPath('vendor') 20 | ->notPath('tests/stubs') 21 | ->in(__DIR__); 22 | return $config; 23 | -------------------------------------------------------------------------------- /.tx/config: -------------------------------------------------------------------------------- 1 | [main] 2 | host = https://www.transifex.com 3 | lang_map = sk_SK: sk, th_TH: th, ja_JP: ja, bg_BG: bg, cs_CZ: cs, fi_FI: fi, hu_HU: hu, nb_NO: nb 4 | 5 | [o:nextcloud:p:nextcloud:r:circles] 6 | file_filter = translationfiles//circles.po 7 | source_file = translationfiles/templates/circles.pot 8 | source_lang = en 9 | type = PO 10 | 11 | -------------------------------------------------------------------------------- /AUTHORS.md: -------------------------------------------------------------------------------- 1 | 5 | # Authors 6 | 7 | - Daniel Tygel 8 | - Flávio Gomes da Silva Lisboa 9 | - Joas Schilling 10 | - Julius Härtl 11 | - Maxence Lange 12 | - Robin Appelman 13 | - Thomas Citharel 14 | - Vinicius Cubas Brand 15 | - Cooperativa EITA 16 | - Nextcloud GmbH 17 | -------------------------------------------------------------------------------- /LICENSES/MIT.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 6 | 7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 5 | # Nextcloud Teams 6 | [![REUSE status](https://api.reuse.software/badge/github.com/nextcloud/circles)](https://api.reuse.software/info/github.com/nextcloud/circles) 7 | 8 | ### Bring cloud-users closer together 9 | 10 | Nextcloud Teams allow people to create their own groups of people/colleagues/friends. 11 | Those groups of people can then be used by any other app for sharing purpose. 12 | 13 | The app was formerly named circles which is still used as internal identifier a lot. 14 | 15 | 16 | # Installation 17 | The *Teams* app is installed and enabled by default. 18 | 19 | # Documentation 20 | You can use the `\Psr\Container\ContainerInterface`, see [dependency injection](https://docs.nextcloud.com/server/stable/developer_manual/basics/dependency_injection.html), to get the `\OCA\Circles\CireclesManager` class, see our [API documentation](https://nextcloud.github.io/circles/) for its interface. 21 | -------------------------------------------------------------------------------- /files/list.php: -------------------------------------------------------------------------------- 1 | printPage(); 11 | -------------------------------------------------------------------------------- /img/circles-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | -------------------------------------------------------------------------------- /img/circles.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /l10n/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/circles/a47c3acb879784bd56bb8f34b8c3720a51872813/l10n/.gitkeep -------------------------------------------------------------------------------- /l10n/af.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "Persoonlik", 5 | "System" : "Stelsel", 6 | "Visible" : "Sigbaar", 7 | "Open" : "Open", 8 | "Hidden" : "Versteek", 9 | "Email address" : "E-posadres", 10 | "Contact" : "Kontak", 11 | "Admin" : "Admin", 12 | "Owner" : "Eienaar", 13 | "Open »%s«" : "Open »%s«", 14 | "Files" : "Lêer ", 15 | "Accept" : "Aanvaar", 16 | "No files in here" : "Geen lêers hier nie", 17 | "No entries found in this folder" : "Geen inskrwyings in hierdie gids gevind", 18 | "Name" : "Naam", 19 | "Size" : "Grootte", 20 | "Modified" : "Gewysig" 21 | }, 22 | "nplurals=2; plural=(n != 1);"); 23 | -------------------------------------------------------------------------------- /l10n/af.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "Persoonlik", 3 | "System" : "Stelsel", 4 | "Visible" : "Sigbaar", 5 | "Open" : "Open", 6 | "Hidden" : "Versteek", 7 | "Email address" : "E-posadres", 8 | "Contact" : "Kontak", 9 | "Admin" : "Admin", 10 | "Owner" : "Eienaar", 11 | "Open »%s«" : "Open »%s«", 12 | "Files" : "Lêer ", 13 | "Accept" : "Aanvaar", 14 | "No files in here" : "Geen lêers hier nie", 15 | "No entries found in this folder" : "Geen inskrwyings in hierdie gids gevind", 16 | "Name" : "Naam", 17 | "Size" : "Grootte", 18 | "Modified" : "Gewysig" 19 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 20 | } -------------------------------------------------------------------------------- /l10n/az.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "Şəxsi", 5 | "System" : "Sistem", 6 | "Visible" : "Görünən", 7 | "Hidden" : "Gizli", 8 | "Local" : "Yerli", 9 | "Root" : "Root", 10 | "Federated" : "Federated", 11 | "Admin" : "İnzibatçı", 12 | "Owner" : "Owner", 13 | "Accept" : "Qəbul et", 14 | "No files in here" : "Burda fayl yoxdur", 15 | "No entries found in this folder" : "Bu qovluqda heç bir verilən tapılmadı", 16 | "Name" : "Ad", 17 | "Size" : "Həcm", 18 | "Modified" : "Dəyişdirildi" 19 | }, 20 | "nplurals=2; plural=(n != 1);"); 21 | -------------------------------------------------------------------------------- /l10n/az.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "Şəxsi", 3 | "System" : "Sistem", 4 | "Visible" : "Görünən", 5 | "Hidden" : "Gizli", 6 | "Local" : "Yerli", 7 | "Root" : "Root", 8 | "Federated" : "Federated", 9 | "Admin" : "İnzibatçı", 10 | "Owner" : "Owner", 11 | "Accept" : "Qəbul et", 12 | "No files in here" : "Burda fayl yoxdur", 13 | "No entries found in this folder" : "Bu qovluqda heç bir verilən tapılmadı", 14 | "Name" : "Ad", 15 | "Size" : "Həcm", 16 | "Modified" : "Dəyişdirildi" 17 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 18 | } -------------------------------------------------------------------------------- /l10n/bn_BD.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "ব্যক্তিগত", 5 | "Visible" : "দর্শনযোগ্য", 6 | "Password protected" : "কূটশব্দদ্বারা সুরক্ষিত", 7 | "Hidden" : "লুকনো", 8 | "Local" : "স্থানীয়", 9 | "Root" : "শেকড়", 10 | "Federated" : "Federated", 11 | "Admin" : "প্রশাসন", 12 | "Owner" : "Owner", 13 | "Name" : "নাম", 14 | "Size" : "আকার", 15 | "Modified" : "পরিবর্তিত" 16 | }, 17 | "nplurals=2; plural=(n != 1);"); 18 | -------------------------------------------------------------------------------- /l10n/bn_BD.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "ব্যক্তিগত", 3 | "Visible" : "দর্শনযোগ্য", 4 | "Password protected" : "কূটশব্দদ্বারা সুরক্ষিত", 5 | "Hidden" : "লুকনো", 6 | "Local" : "স্থানীয়", 7 | "Root" : "শেকড়", 8 | "Federated" : "Federated", 9 | "Admin" : "প্রশাসন", 10 | "Owner" : "Owner", 11 | "Name" : "নাম", 12 | "Size" : "আকার", 13 | "Modified" : "পরিবর্তিত" 14 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 15 | } -------------------------------------------------------------------------------- /l10n/br.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "You deleted {circle}" : "Dilamet ho peus {circle}", 5 | "Personal" : "Personel", 6 | "System" : "Sistem", 7 | "Open" : "Digeriñ", 8 | "Hidden" : "Koachet", 9 | "Local" : "Diabarzh", 10 | "Root" : "Gwrizienn", 11 | "Federated" : "Kevredet", 12 | "Member" : "Ezel", 13 | "Admin" : "Merour", 14 | "Owner" : "Perc'henner", 15 | "Open »%s«" : "Digeriñ »%s«", 16 | "Accept" : "Kadarnaat", 17 | "%s" : "%s", 18 | "No files in here" : "Restr ebet amañ", 19 | "No entries found in this folder" : "Disoc'h ebet en teuliad-mañ", 20 | "Name" : "Anv", 21 | "Size" : "Ment", 22 | "Modified" : "Cheñchet" 23 | }, 24 | "nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);"); 25 | -------------------------------------------------------------------------------- /l10n/br.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You deleted {circle}" : "Dilamet ho peus {circle}", 3 | "Personal" : "Personel", 4 | "System" : "Sistem", 5 | "Open" : "Digeriñ", 6 | "Hidden" : "Koachet", 7 | "Local" : "Diabarzh", 8 | "Root" : "Gwrizienn", 9 | "Federated" : "Kevredet", 10 | "Member" : "Ezel", 11 | "Admin" : "Merour", 12 | "Owner" : "Perc'henner", 13 | "Open »%s«" : "Digeriñ »%s«", 14 | "Accept" : "Kadarnaat", 15 | "%s" : "%s", 16 | "No files in here" : "Restr ebet amañ", 17 | "No entries found in this folder" : "Disoc'h ebet en teuliad-mañ", 18 | "Name" : "Anv", 19 | "Size" : "Ment", 20 | "Modified" : "Cheñchet" 21 | },"pluralForm" :"nplurals=5; plural=((n%10 == 1) && (n%100 != 11) && (n%100 !=71) && (n%100 !=91) ? 0 :(n%10 == 2) && (n%100 != 12) && (n%100 !=72) && (n%100 !=92) ? 1 :(n%10 ==3 || n%10==4 || n%10==9) && (n%100 < 10 || n% 100 > 19) && (n%100 < 70 || n%100 > 79) && (n%100 < 90 || n%100 > 99) ? 2 :(n != 0 && n % 1000000 == 0) ? 3 : 4);" 22 | } -------------------------------------------------------------------------------- /l10n/bs.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "Osobno", 5 | "Password protected" : "Zaštićeno lozinkom", 6 | "Local" : "Lokalno", 7 | "Federated" : "Federated", 8 | "Circle" : "Krug", 9 | "Member" : "Član", 10 | "Admin" : "Administrator", 11 | "Owner" : "Vlasnik", 12 | "Accept" : "Prihvati", 13 | "Name" : "Ime", 14 | "Size" : "Veličina", 15 | "Modified" : "Izmijenjeno" 16 | }, 17 | "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"); 18 | -------------------------------------------------------------------------------- /l10n/bs.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "Osobno", 3 | "Password protected" : "Zaštićeno lozinkom", 4 | "Local" : "Lokalno", 5 | "Federated" : "Federated", 6 | "Circle" : "Krug", 7 | "Member" : "Član", 8 | "Admin" : "Administrator", 9 | "Owner" : "Vlasnik", 10 | "Accept" : "Prihvati", 11 | "Name" : "Ime", 12 | "Size" : "Veličina", 13 | "Modified" : "Izmijenjeno" 14 | },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);" 15 | } -------------------------------------------------------------------------------- /l10n/ia.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "Personal", 5 | "System" : "Systema", 6 | "Visible" : "Visibile", 7 | "Password protected" : "Protegite per contrasigno", 8 | "Hidden" : "Occultate", 9 | "Local" : "Local", 10 | "Root" : "Root", 11 | "Federated" : "Federated", 12 | "Owner" : "Owner", 13 | "Accept" : "Acceptar", 14 | "%s" : "%s", 15 | "No files in here" : "Nulle files ci", 16 | "No entries found in this folder" : "Nulle entratas trovate in iste dossier", 17 | "Name" : "Nomine", 18 | "Size" : "Dimension", 19 | "Modified" : "Modificate" 20 | }, 21 | "nplurals=2; plural=(n != 1);"); 22 | -------------------------------------------------------------------------------- /l10n/ia.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "Personal", 3 | "System" : "Systema", 4 | "Visible" : "Visibile", 5 | "Password protected" : "Protegite per contrasigno", 6 | "Hidden" : "Occultate", 7 | "Local" : "Local", 8 | "Root" : "Root", 9 | "Federated" : "Federated", 10 | "Owner" : "Owner", 11 | "Accept" : "Acceptar", 12 | "%s" : "%s", 13 | "No files in here" : "Nulle files ci", 14 | "No entries found in this folder" : "Nulle entratas trovate in iste dossier", 15 | "Name" : "Nomine", 16 | "Size" : "Dimension", 17 | "Modified" : "Modificate" 18 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 19 | } -------------------------------------------------------------------------------- /l10n/id.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "{member} has been invited to join {circle} by {author}" : "{member} telah diundang untuk bergabung dengan {circle} oleh {author}", 5 | "Personal" : "Personal", 6 | "System" : "Sistem", 7 | "Visible" : "Tampak", 8 | "Open" : "Buka", 9 | "Password protected" : "Kata sandi dilindungi", 10 | "Hidden" : "Sembunyi", 11 | "Local" : "Lokal", 12 | "Root" : "Root", 13 | "Federated" : "Federated", 14 | "Email address" : "Alamat surel", 15 | "Contact" : "Kontak", 16 | "Admin" : "Admin", 17 | "Owner" : "Owner", 18 | "Open »%s«" : "Buka »%s«", 19 | "Accept" : "Terima", 20 | "%s" : "%s", 21 | "Password to access content shared with you by %1$s" : "Kata sandi untuk mengakses konten yabg dibagikan dengan Anda oleh %1$s", 22 | "No files in here" : "Tidak ada berkas di sini", 23 | "No entries found in this folder" : "Tidak ada entri yang ditemukan dalam folder ini", 24 | "Name" : "Nama", 25 | "Size" : "Ukuran", 26 | "Modified" : "Dimodifikasi" 27 | }, 28 | "nplurals=1; plural=0;"); 29 | -------------------------------------------------------------------------------- /l10n/id.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "{member} has been invited to join {circle} by {author}" : "{member} telah diundang untuk bergabung dengan {circle} oleh {author}", 3 | "Personal" : "Personal", 4 | "System" : "Sistem", 5 | "Visible" : "Tampak", 6 | "Open" : "Buka", 7 | "Password protected" : "Kata sandi dilindungi", 8 | "Hidden" : "Sembunyi", 9 | "Local" : "Lokal", 10 | "Root" : "Root", 11 | "Federated" : "Federated", 12 | "Email address" : "Alamat surel", 13 | "Contact" : "Kontak", 14 | "Admin" : "Admin", 15 | "Owner" : "Owner", 16 | "Open »%s«" : "Buka »%s«", 17 | "Accept" : "Terima", 18 | "%s" : "%s", 19 | "Password to access content shared with you by %1$s" : "Kata sandi untuk mengakses konten yabg dibagikan dengan Anda oleh %1$s", 20 | "No files in here" : "Tidak ada berkas di sini", 21 | "No entries found in this folder" : "Tidak ada entri yang ditemukan dalam folder ini", 22 | "Name" : "Nama", 23 | "Size" : "Ukuran", 24 | "Modified" : "Dimodifikasi" 25 | },"pluralForm" :"nplurals=1; plural=0;" 26 | } -------------------------------------------------------------------------------- /l10n/kab.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "Udmawan", 5 | "Open" : "Ldi", 6 | "Local" : "Adigan", 7 | "Email address" : "Tansa imayl", 8 | "Circle" : "Tawinest", 9 | "Moderator" : "Amaẓrag", 10 | "Admin" : "Anedbal", 11 | "Owner" : "Bab", 12 | "No entries found in this folder" : "Ulac inekcumen i yettwafen deg ukaram-a", 13 | "Name" : "Nom", 14 | "Size" : "Teɣzi", 15 | "Modified" : "Yettwabeddel" 16 | }, 17 | "nplurals=2; plural=(n != 1);"); 18 | -------------------------------------------------------------------------------- /l10n/kab.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "Udmawan", 3 | "Open" : "Ldi", 4 | "Local" : "Adigan", 5 | "Email address" : "Tansa imayl", 6 | "Circle" : "Tawinest", 7 | "Moderator" : "Amaẓrag", 8 | "Admin" : "Anedbal", 9 | "Owner" : "Bab", 10 | "No entries found in this folder" : "Ulac inekcumen i yettwafen deg ukaram-a", 11 | "Name" : "Nom", 12 | "Size" : "Teɣzi", 13 | "Modified" : "Yettwabeddel" 14 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 15 | } -------------------------------------------------------------------------------- /l10n/km.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "ផ្ទាល់​ខ្លួន", 5 | "Password protected" : "បាន​ការ​ពារ​ដោយ​ពាក្យ​សម្ងាត់", 6 | "Federated" : "Federated", 7 | "Admin" : "អ្នក​គ្រប់​គ្រង", 8 | "Owner" : "Owner", 9 | "Name" : "ឈ្មោះ", 10 | "Size" : "ទំហំ", 11 | "Modified" : "បាន​កែ​ប្រែ" 12 | }, 13 | "nplurals=1; plural=0;"); 14 | -------------------------------------------------------------------------------- /l10n/km.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "ផ្ទាល់​ខ្លួន", 3 | "Password protected" : "បាន​ការ​ពារ​ដោយ​ពាក្យ​សម្ងាត់", 4 | "Federated" : "Federated", 5 | "Admin" : "អ្នក​គ្រប់​គ្រង", 6 | "Owner" : "Owner", 7 | "Name" : "ឈ្មោះ", 8 | "Size" : "ទំហំ", 9 | "Modified" : "បាន​កែ​ប្រែ" 10 | },"pluralForm" :"nplurals=1; plural=0;" 11 | } -------------------------------------------------------------------------------- /l10n/kn.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "ವೈಯಕ್ತಿಕ", 5 | "Open" : "ತೆರೆಯಿರಿ", 6 | "Password protected" : "ಗುಪ್ತಪದದಿಂದ ರಕ್ಷಿಸಲಾಗಿದೆ", 7 | "Local" : "ಸ್ಥಳೀಯ", 8 | "Federated" : "Federated", 9 | "Admin" : "ನಿರ್ವಹಕ", 10 | "Owner" : "Owner", 11 | "Files" : "ಕಡತಗಳು", 12 | "Name" : "ಹೆಸರು", 13 | "Size" : " ಗಾತ್ರ", 14 | "Modified" : "ಬದಲಾಯಿಸಿದ" 15 | }, 16 | "nplurals=2; plural=(n > 1);"); 17 | -------------------------------------------------------------------------------- /l10n/kn.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "ವೈಯಕ್ತಿಕ", 3 | "Open" : "ತೆರೆಯಿರಿ", 4 | "Password protected" : "ಗುಪ್ತಪದದಿಂದ ರಕ್ಷಿಸಲಾಗಿದೆ", 5 | "Local" : "ಸ್ಥಳೀಯ", 6 | "Federated" : "Federated", 7 | "Admin" : "ನಿರ್ವಹಕ", 8 | "Owner" : "Owner", 9 | "Files" : "ಕಡತಗಳು", 10 | "Name" : "ಹೆಸರು", 11 | "Size" : " ಗಾತ್ರ", 12 | "Modified" : "ಬದಲಾಯಿಸಿದ" 13 | },"pluralForm" :"nplurals=2; plural=(n > 1);" 14 | } -------------------------------------------------------------------------------- /l10n/lb.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "Perséinlech", 5 | "Visible" : "Visibel", 6 | "Password protected" : "Passwuertgeschützt", 7 | "Hidden" : "Verstoppt", 8 | "Federated" : "Federated", 9 | "Admin" : "Admin", 10 | "Owner" : "Owner", 11 | "Files" : "Dateien", 12 | "No files in here" : "Keng Dokumenter hei", 13 | "No entries found in this folder" : "Keng Elementer an dësem Dossier fonnt", 14 | "Name" : "Numm", 15 | "Size" : "Gréisst", 16 | "Modified" : "Geännert" 17 | }, 18 | "nplurals=2; plural=(n != 1);"); 19 | -------------------------------------------------------------------------------- /l10n/lb.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "Perséinlech", 3 | "Visible" : "Visibel", 4 | "Password protected" : "Passwuertgeschützt", 5 | "Hidden" : "Verstoppt", 6 | "Federated" : "Federated", 7 | "Admin" : "Admin", 8 | "Owner" : "Owner", 9 | "Files" : "Dateien", 10 | "No files in here" : "Keng Dokumenter hei", 11 | "No entries found in this folder" : "Keng Elementer an dësem Dossier fonnt", 12 | "Name" : "Numm", 13 | "Size" : "Gréisst", 14 | "Modified" : "Geännert" 15 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 16 | } -------------------------------------------------------------------------------- /l10n/lo.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "ສ່ວນບຸກຄົນ", 5 | "Federated" : "ການຕິດຕໍ່", 6 | "Admin" : "ຜູ້ເບິ່ງເເຍງລະບົບ", 7 | "Owner" : "ເຈົ້າຂອງ", 8 | "Files" : "ຟາຍ", 9 | "No files in here" : "ບໍ່ມີຟາຍໃນທີ່ນີ້", 10 | "Name" : "ຊື່", 11 | "Size" : "ຂະຫນາດ", 12 | "Modified" : "\"{name}\" ແມ່ນຊື່ໄຟລ໌ທີ່ບໍ່ຖືກຕ້ອງ." 13 | }, 14 | "nplurals=1; plural=0;"); 15 | -------------------------------------------------------------------------------- /l10n/lo.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "ສ່ວນບຸກຄົນ", 3 | "Federated" : "ການຕິດຕໍ່", 4 | "Admin" : "ຜູ້ເບິ່ງເເຍງລະບົບ", 5 | "Owner" : "ເຈົ້າຂອງ", 6 | "Files" : "ຟາຍ", 7 | "No files in here" : "ບໍ່ມີຟາຍໃນທີ່ນີ້", 8 | "Name" : "ຊື່", 9 | "Size" : "ຂະຫນາດ", 10 | "Modified" : "\"{name}\" ແມ່ນຊື່ໄຟລ໌ທີ່ບໍ່ຖືກຕ້ອງ." 11 | },"pluralForm" :"nplurals=1; plural=0;" 12 | } -------------------------------------------------------------------------------- /l10n/lv.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "You deleted {circle}" : "Tu izdzēsi {circle}", 5 | "Personal" : "Personīgs", 6 | "System" : "Sistēma", 7 | "Visible" : "Redzams", 8 | "Open" : "Atvērt", 9 | "Invite" : "Uzaicināt", 10 | "Password protected" : "Aizsargāts ar paroli", 11 | "Hidden" : "Paslēpts", 12 | "Local" : "Vietējs", 13 | "Root" : "Root", 14 | "Federated" : "Federated", 15 | "Email address" : "E-pasta adrese", 16 | "Contact" : "Kontakts", 17 | "Circle" : "Loks", 18 | "Admin" : "Pārvaldītājs", 19 | "Owner" : "Īpašnieks", 20 | "Open »%s«" : "Atvērt »%s«", 21 | "Files" : "Datnes", 22 | "Accept" : "Akceptēt", 23 | "%s" : "%s", 24 | "No files in here" : "Šeit nav datņu", 25 | "No entries found in this folder" : "Šajā mapē nekas nav atrasts", 26 | "Name" : "Vārds", 27 | "Size" : "Izmērs", 28 | "Modified" : "Mainīts" 29 | }, 30 | "nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"); 31 | -------------------------------------------------------------------------------- /l10n/lv.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You deleted {circle}" : "Tu izdzēsi {circle}", 3 | "Personal" : "Personīgs", 4 | "System" : "Sistēma", 5 | "Visible" : "Redzams", 6 | "Open" : "Atvērt", 7 | "Invite" : "Uzaicināt", 8 | "Password protected" : "Aizsargāts ar paroli", 9 | "Hidden" : "Paslēpts", 10 | "Local" : "Vietējs", 11 | "Root" : "Root", 12 | "Federated" : "Federated", 13 | "Email address" : "E-pasta adrese", 14 | "Contact" : "Kontakts", 15 | "Circle" : "Loks", 16 | "Admin" : "Pārvaldītājs", 17 | "Owner" : "Īpašnieks", 18 | "Open »%s«" : "Atvērt »%s«", 19 | "Files" : "Datnes", 20 | "Accept" : "Akceptēt", 21 | "%s" : "%s", 22 | "No files in here" : "Šeit nav datņu", 23 | "No entries found in this folder" : "Šajā mapē nekas nav atrasts", 24 | "Name" : "Vārds", 25 | "Size" : "Izmērs", 26 | "Modified" : "Mainīts" 27 | },"pluralForm" :"nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);" 28 | } -------------------------------------------------------------------------------- /l10n/mk.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "Сопствен", 5 | "System" : "Систем", 6 | "Visible" : "Видлив", 7 | "Open" : "Отвори", 8 | "Invite" : "Покани", 9 | "Password protected" : "Заштитено со лозинка", 10 | "Hidden" : "Сокриен", 11 | "Local" : "Локално", 12 | "Root" : "Корен", 13 | "Federated" : "Федерален", 14 | "Email address" : "Е-пошта адреса", 15 | "Contact" : "Контакт", 16 | "Circle" : "Круг", 17 | "Member" : "Член", 18 | "Moderator" : "Модератор", 19 | "Admin" : "Администратор", 20 | "Owner" : "Сопственик", 21 | "%s shared »%s« with you." : "%s сподели »%s« со вас.", 22 | "Password to access »%1$s« shared to you by %2$s" : "Лозинката за пристап до »%1$s« е споделена со вас од %2$s", 23 | "Password to access »%s«" : "Лозинка за пристап »%s«", 24 | "It is protected with the following password:" : "Заштитено е со следнава лозинка:", 25 | "%1$s via %2$s" : "%1$s преку %2$s", 26 | "Click the button below to open it." : "Кликнете на копчето подолу за да ја отворите.", 27 | "Open »%s«" : "Отвори »%s«", 28 | "Files" : "Датотеки", 29 | "Accept" : "Прифати", 30 | "%s" : "%s", 31 | "No files in here" : "Тука нема датотеки", 32 | "No entries found in this folder" : "Нема ништо во оваа папка", 33 | "Name" : "Име", 34 | "Size" : "Големина", 35 | "Modified" : "Изменето", 36 | "Shared to Circles" : "Споделено со кругови" 37 | }, 38 | "nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;"); 39 | -------------------------------------------------------------------------------- /l10n/mk.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "Сопствен", 3 | "System" : "Систем", 4 | "Visible" : "Видлив", 5 | "Open" : "Отвори", 6 | "Invite" : "Покани", 7 | "Password protected" : "Заштитено со лозинка", 8 | "Hidden" : "Сокриен", 9 | "Local" : "Локално", 10 | "Root" : "Корен", 11 | "Federated" : "Федерален", 12 | "Email address" : "Е-пошта адреса", 13 | "Contact" : "Контакт", 14 | "Circle" : "Круг", 15 | "Member" : "Член", 16 | "Moderator" : "Модератор", 17 | "Admin" : "Администратор", 18 | "Owner" : "Сопственик", 19 | "%s shared »%s« with you." : "%s сподели »%s« со вас.", 20 | "Password to access »%1$s« shared to you by %2$s" : "Лозинката за пристап до »%1$s« е споделена со вас од %2$s", 21 | "Password to access »%s«" : "Лозинка за пристап »%s«", 22 | "It is protected with the following password:" : "Заштитено е со следнава лозинка:", 23 | "%1$s via %2$s" : "%1$s преку %2$s", 24 | "Click the button below to open it." : "Кликнете на копчето подолу за да ја отворите.", 25 | "Open »%s«" : "Отвори »%s«", 26 | "Files" : "Датотеки", 27 | "Accept" : "Прифати", 28 | "%s" : "%s", 29 | "No files in here" : "Тука нема датотеки", 30 | "No entries found in this folder" : "Нема ништо во оваа папка", 31 | "Name" : "Име", 32 | "Size" : "Големина", 33 | "Modified" : "Изменето", 34 | "Shared to Circles" : "Споделено со кругови" 35 | },"pluralForm" :"nplurals=2; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : 1;" 36 | } -------------------------------------------------------------------------------- /l10n/mn.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "You joined {circle}" : "Та нэвтэрлээ {тойрогт}", 5 | "You left {circle}" : " Та гарлаа {тойрог} ", 6 | "Personal" : "Хувийн", 7 | "System" : "сисмем", 8 | "Open" : "Онгойлгох", 9 | "Password protected" : "Нууц үгээх хамгаалагдсан", 10 | "Hidden" : "Далд", 11 | "Federated" : "Federated", 12 | "Circle" : "Тойрог", 13 | "Member" : "Гишүүн", 14 | "Moderator" : "Шалгагч", 15 | "Admin" : "Админ", 16 | "Owner" : "Эзэмшигч", 17 | "Open »%s«" : "»%s« нээх", 18 | "Files" : "Файлууд", 19 | "This member is not a moderator" : "Энэ гишүүн нь зохицуулагч биш", 20 | "This member does not exist" : "ийм гишүүн байхгүй байна", 21 | "You are already a member of this circle" : "та аль хэдийн энэ тойргийн гишүүн болсон", 22 | "You have been blocked from this circle" : "та энэ тойргоос хасагдсан ", 23 | "Accept" : "Хүлээн зөвшөөрөх", 24 | "No files in here" : "Энд файл алга", 25 | "No entries found in this folder" : "Энэ хавтаст юм олдсонгүй", 26 | "Name" : "Нэр", 27 | "Size" : "Хэмжээ", 28 | "Modified" : "Өөрчлөгдсөн" 29 | }, 30 | "nplurals=2; plural=(n != 1);"); 31 | -------------------------------------------------------------------------------- /l10n/mn.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "You joined {circle}" : "Та нэвтэрлээ {тойрогт}", 3 | "You left {circle}" : " Та гарлаа {тойрог} ", 4 | "Personal" : "Хувийн", 5 | "System" : "сисмем", 6 | "Open" : "Онгойлгох", 7 | "Password protected" : "Нууц үгээх хамгаалагдсан", 8 | "Hidden" : "Далд", 9 | "Federated" : "Federated", 10 | "Circle" : "Тойрог", 11 | "Member" : "Гишүүн", 12 | "Moderator" : "Шалгагч", 13 | "Admin" : "Админ", 14 | "Owner" : "Эзэмшигч", 15 | "Open »%s«" : "»%s« нээх", 16 | "Files" : "Файлууд", 17 | "This member is not a moderator" : "Энэ гишүүн нь зохицуулагч биш", 18 | "This member does not exist" : "ийм гишүүн байхгүй байна", 19 | "You are already a member of this circle" : "та аль хэдийн энэ тойргийн гишүүн болсон", 20 | "You have been blocked from this circle" : "та энэ тойргоос хасагдсан ", 21 | "Accept" : "Хүлээн зөвшөөрөх", 22 | "No files in here" : "Энд файл алга", 23 | "No entries found in this folder" : "Энэ хавтаст юм олдсонгүй", 24 | "Name" : "Нэр", 25 | "Size" : "Хэмжээ", 26 | "Modified" : "Өөрчлөгдсөн" 27 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 28 | } -------------------------------------------------------------------------------- /l10n/ms_MY.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "Peribadi", 5 | "Federated" : "Federated", 6 | "Admin" : "Admin", 7 | "Owner" : "Owner", 8 | "Open »%s«" : "Buka %s", 9 | "Files" : "Fail-fail", 10 | "Name" : "Nama", 11 | "Size" : "Saiz", 12 | "Modified" : "Dimodifikasi" 13 | }, 14 | "nplurals=1; plural=0;"); 15 | -------------------------------------------------------------------------------- /l10n/ms_MY.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "Peribadi", 3 | "Federated" : "Federated", 4 | "Admin" : "Admin", 5 | "Owner" : "Owner", 6 | "Open »%s«" : "Buka %s", 7 | "Files" : "Fail-fail", 8 | "Name" : "Nama", 9 | "Size" : "Saiz", 10 | "Modified" : "Dimodifikasi" 11 | },"pluralForm" :"nplurals=1; plural=0;" 12 | } -------------------------------------------------------------------------------- /l10n/nn_NO.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "Personleg", 5 | "System" : "System", 6 | "Password protected" : "Passordverna", 7 | "Local" : "Lokal", 8 | "Federated" : "Federated", 9 | "Contact" : "Kontakt", 10 | "Circle" : "Sirkel", 11 | "Moderator" : "Moderator", 12 | "Admin" : "Administrer", 13 | "Owner" : "Owner", 14 | "Open »%s«" : "Opna »%s«", 15 | "No files in here" : "Ingen filer her", 16 | "No entries found in this folder" : "Ingen oppføringar funne i denne mappa", 17 | "Name" : "Namn", 18 | "Size" : "Storleik", 19 | "Modified" : "Endra" 20 | }, 21 | "nplurals=2; plural=(n != 1);"); 22 | -------------------------------------------------------------------------------- /l10n/nn_NO.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "Personleg", 3 | "System" : "System", 4 | "Password protected" : "Passordverna", 5 | "Local" : "Lokal", 6 | "Federated" : "Federated", 7 | "Contact" : "Kontakt", 8 | "Circle" : "Sirkel", 9 | "Moderator" : "Moderator", 10 | "Admin" : "Administrer", 11 | "Owner" : "Owner", 12 | "Open »%s«" : "Opna »%s«", 13 | "No files in here" : "Ingen filer her", 14 | "No entries found in this folder" : "Ingen oppføringar funne i denne mappa", 15 | "Name" : "Namn", 16 | "Size" : "Storleik", 17 | "Modified" : "Endra" 18 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 19 | } -------------------------------------------------------------------------------- /l10n/oc.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "Personal", 5 | "Visible" : "Visible", 6 | "Open" : "Dobrir", 7 | "Password protected" : "Protegit per senhal", 8 | "Hidden" : "Amagat", 9 | "Local" : "Local", 10 | "Federated" : "Federated", 11 | "Email address" : "Adreça mail", 12 | "Contact" : "Contacte", 13 | "Admin" : "Admin", 14 | "Owner" : "Owner", 15 | "Open »%s«" : "Dobrir « %s »", 16 | "Accept" : "Acceptar", 17 | "No files in here" : "Cap de fichièr aicí", 18 | "Name" : "Nom", 19 | "Size" : "Talha", 20 | "Modified" : "Modificat" 21 | }, 22 | "nplurals=2; plural=(n > 1);"); 23 | -------------------------------------------------------------------------------- /l10n/oc.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "Personal", 3 | "Visible" : "Visible", 4 | "Open" : "Dobrir", 5 | "Password protected" : "Protegit per senhal", 6 | "Hidden" : "Amagat", 7 | "Local" : "Local", 8 | "Federated" : "Federated", 9 | "Email address" : "Adreça mail", 10 | "Contact" : "Contacte", 11 | "Admin" : "Admin", 12 | "Owner" : "Owner", 13 | "Open »%s«" : "Dobrir « %s »", 14 | "Accept" : "Acceptar", 15 | "No files in here" : "Cap de fichièr aicí", 16 | "Name" : "Nom", 17 | "Size" : "Talha", 18 | "Modified" : "Modificat" 19 | },"pluralForm" :"nplurals=2; plural=(n > 1);" 20 | } -------------------------------------------------------------------------------- /l10n/ps.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "شخصي", 5 | "Open" : "پرانيستل", 6 | "Circle" : "حلقه", 7 | "Admin" : "ستر کارن", 8 | "No files in here" : "دلته فایلونه نشته", 9 | "No entries found in this folder" : "په دې فولډر کې څه نشته", 10 | "Name" : "نوم", 11 | "Size" : "کچه", 12 | "Modified" : "د بدلون نېټه" 13 | }, 14 | "nplurals=2; plural=(n != 1);"); 15 | -------------------------------------------------------------------------------- /l10n/ps.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "شخصي", 3 | "Open" : "پرانيستل", 4 | "Circle" : "حلقه", 5 | "Admin" : "ستر کارن", 6 | "No files in here" : "دلته فایلونه نشته", 7 | "No entries found in this folder" : "په دې فولډر کې څه نشته", 8 | "Name" : "نوم", 9 | "Size" : "کچه", 10 | "Modified" : "د بدلون نېټه" 11 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 12 | } -------------------------------------------------------------------------------- /l10n/si.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "පුද්ගලික", 5 | "System" : "පද්ධතිය", 6 | "Open" : "විවෘත", 7 | "Member" : "සාමාජික", 8 | "Admin" : "පරිපාලක", 9 | "Owner" : "හිමිකරු", 10 | "Files" : "ගොනු", 11 | "Accept" : "පිළිගන්න", 12 | "%s" : "%s", 13 | "Name" : "නම", 14 | "Size" : "ප්‍රමාණය" 15 | }, 16 | "nplurals=2; plural=(n != 1);"); 17 | -------------------------------------------------------------------------------- /l10n/si.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "පුද්ගලික", 3 | "System" : "පද්ධතිය", 4 | "Open" : "විවෘත", 5 | "Member" : "සාමාජික", 6 | "Admin" : "පරිපාලක", 7 | "Owner" : "හිමිකරු", 8 | "Files" : "ගොනු", 9 | "Accept" : "පිළිගන්න", 10 | "%s" : "%s", 11 | "Name" : "නම", 12 | "Size" : "ප්‍රමාණය" 13 | },"pluralForm" :"nplurals=2; plural=(n != 1);" 14 | } -------------------------------------------------------------------------------- /l10n/th.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "ส่วนตัว", 5 | "System" : "ระบบ", 6 | "Visible" : "มองเห็นได้", 7 | "Open" : "เปิด", 8 | "Password protected" : "ใส่รหัสผ่านไว้", 9 | "Hidden" : "ซ่อนอยู่", 10 | "Local" : "ต้นทาง", 11 | "Root" : "รูท", 12 | "Federated" : "ที่ติดต่อกับภายนอก", 13 | "Email address" : "ที่อยู่อีเมล", 14 | "Admin" : "ผู้ดูแล", 15 | "Owner" : "เจ้าของ", 16 | "Open »%s«" : "เปิด »%s«", 17 | "Accept" : "ยอมรับ", 18 | "%s" : "%s", 19 | "No files in here" : "ไม่มีไฟล์ที่นี่", 20 | "No entries found in this folder" : "ไม่พบรายการในโฟลเดอร์นี้", 21 | "Name" : "ชื่อ", 22 | "Size" : "ขนาด", 23 | "Modified" : "แก้ไขเมื่อ" 24 | }, 25 | "nplurals=1; plural=0;"); 26 | -------------------------------------------------------------------------------- /l10n/th.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "ส่วนตัว", 3 | "System" : "ระบบ", 4 | "Visible" : "มองเห็นได้", 5 | "Open" : "เปิด", 6 | "Password protected" : "ใส่รหัสผ่านไว้", 7 | "Hidden" : "ซ่อนอยู่", 8 | "Local" : "ต้นทาง", 9 | "Root" : "รูท", 10 | "Federated" : "ที่ติดต่อกับภายนอก", 11 | "Email address" : "ที่อยู่อีเมล", 12 | "Admin" : "ผู้ดูแล", 13 | "Owner" : "เจ้าของ", 14 | "Open »%s«" : "เปิด »%s«", 15 | "Accept" : "ยอมรับ", 16 | "%s" : "%s", 17 | "No files in here" : "ไม่มีไฟล์ที่นี่", 18 | "No entries found in this folder" : "ไม่พบรายการในโฟลเดอร์นี้", 19 | "Name" : "ชื่อ", 20 | "Size" : "ขนาด", 21 | "Modified" : "แก้ไขเมื่อ" 22 | },"pluralForm" :"nplurals=1; plural=0;" 23 | } -------------------------------------------------------------------------------- /l10n/uz.js: -------------------------------------------------------------------------------- 1 | OC.L10N.register( 2 | "circles", 3 | { 4 | "Personal" : "Personal", 5 | "System" : "System", 6 | "Open" : "Open", 7 | "Invite" : "Taklif qiling", 8 | "Hidden" : "Yashirin", 9 | "Local" : "Local", 10 | "Email address" : "E-pochta manzili", 11 | "Contact" : "Aloqa", 12 | "Member" : "Member", 13 | "Admin" : "Admin", 14 | "Owner" : "Owner", 15 | "Open »%s«" : "ochish »%s«", 16 | "Files" : "Files", 17 | "Accept" : "Qabul qiling", 18 | "No files in here" : "No files in here", 19 | "No entries found in this folder" : "Ushbu papkada hech qanday yozuv topilmadi", 20 | "Name" : "Name", 21 | "Size" : "Size", 22 | "Modified" : "Modified" 23 | }, 24 | "nplurals=1; plural=0;"); 25 | -------------------------------------------------------------------------------- /l10n/uz.json: -------------------------------------------------------------------------------- 1 | { "translations": { 2 | "Personal" : "Personal", 3 | "System" : "System", 4 | "Open" : "Open", 5 | "Invite" : "Taklif qiling", 6 | "Hidden" : "Yashirin", 7 | "Local" : "Local", 8 | "Email address" : "E-pochta manzili", 9 | "Contact" : "Aloqa", 10 | "Member" : "Member", 11 | "Admin" : "Admin", 12 | "Owner" : "Owner", 13 | "Open »%s«" : "ochish »%s«", 14 | "Files" : "Files", 15 | "Accept" : "Qabul qiling", 16 | "No files in here" : "No files in here", 17 | "No entries found in this folder" : "Ushbu papkada hech qanday yozuv topilmadi", 18 | "Name" : "Name", 19 | "Size" : "Size", 20 | "Modified" : "Modified" 21 | },"pluralForm" :"nplurals=1; plural=0;" 22 | } -------------------------------------------------------------------------------- /lib/Activity/ProviderSubjectCircle.php: -------------------------------------------------------------------------------- 1 | getSubject() !== 'circle_create') { 25 | return; 26 | } 27 | 28 | $this->parseCircleEvent( 29 | $event, $circle, 30 | $this->l10n->t('You created the team {circle}'), 31 | $this->l10n->t('{author} created the team {circle}') 32 | ); 33 | 34 | throw new FakeException(); 35 | } 36 | 37 | /** 38 | * @param IEvent $event 39 | * @param Circle $circle 40 | * 41 | * @throws FakeException 42 | */ 43 | public function parseSubjectCircleDelete(IEvent $event, Circle $circle): void { 44 | if ($event->getSubject() !== 'circle_delete') { 45 | return; 46 | } 47 | 48 | $this->parseCircleEvent( 49 | $event, $circle, 50 | $this->l10n->t('You deleted {circle}'), 51 | $this->l10n->t('{author} deleted {circle}') 52 | ); 53 | 54 | throw new FakeException(); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /lib/Cron/Maintenance.php: -------------------------------------------------------------------------------- 1 | setInterval(10); 31 | $this->setTimeSensitivity(IJob::TIME_SENSITIVE); 32 | 33 | $this->maintenanceService = $maintenanceService; 34 | } 35 | 36 | 37 | /** 38 | * @param $argument 39 | */ 40 | protected function run($argument) { 41 | $this->maintenanceService->runMaintenances(); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /lib/Cron/MaintenanceHeavy.php: -------------------------------------------------------------------------------- 1 | setInterval(24 * 3600); 31 | $this->setTimeSensitivity(IJob::TIME_INSENSITIVE); 32 | 33 | $this->maintenanceService = $maintenanceService; 34 | } 35 | 36 | 37 | /** 38 | * @param $argument 39 | */ 40 | protected function run($argument) { 41 | $this->maintenanceService->runMaintenances(true); 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /lib/Db/FileSharesRequestBuilder.php: -------------------------------------------------------------------------------- 1 | dbConnection->getQueryBuilder(); 26 | $qb->delete(self::TABLE_FILE_SHARES); 27 | $qb->where( 28 | $qb->expr() 29 | ->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE)) 30 | ); 31 | 32 | return $qb; 33 | } 34 | 35 | 36 | /** 37 | * @return IQueryBuilder 38 | */ 39 | protected function getFileSharesSelectSql(): IQueryBuilder { 40 | $qb = $this->dbConnection->getQueryBuilder(); 41 | 42 | /** @noinspection PhpMethodParametersCountMismatchInspection */ 43 | $qb->select( 44 | 's.id', 45 | 's.share_with', 46 | 's.file_source', 47 | 's.uid_owner', 48 | 's.uid_initiator', 49 | 's.permissions', 50 | 's.token', 51 | 's.password', 52 | 's.file_target' 53 | ) 54 | ->from(self::TABLE_FILE_SHARES, 's'); 55 | 56 | $this->default_select_alias = 's'; 57 | 58 | return $qb; 59 | } 60 | 61 | 62 | /** 63 | * @return IQueryBuilder 64 | */ 65 | protected function getFileSharesUpdateSql(): IQueryBuilder { 66 | $qb = $this->dbConnection->getQueryBuilder(); 67 | $qb->update(self::TABLE_FILE_SHARES); 68 | 69 | return $qb; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /lib/Db/ShareLockRequest.php: -------------------------------------------------------------------------------- 1 | confirmValidIds([$share->getItemId()]); 31 | 32 | $qb = $this->getShareLockInsertSql(); 33 | $qb->setValue('item_id', $qb->createNamedParameter($share->getItemId())) 34 | ->setValue('circle_id', $qb->createNamedParameter($share->getCircleId())) 35 | ->setValue('instance', $qb->createNamedParameter($qb->getInstance($share))); 36 | 37 | $qb->execute(); 38 | } 39 | 40 | 41 | /** 42 | * @param string $itemId 43 | * @param string $circleId 44 | * 45 | * @return FederatedShare 46 | * @throws FederatedShareNotFoundException 47 | */ 48 | public function getShare(string $itemId, string $circleId = ''): FederatedShare { 49 | $qb = $this->getShareLockSelectSql(); 50 | 51 | $qb->limitToItemId($itemId); 52 | if ($circleId !== '') { 53 | $qb->limitToCircleId($circleId); 54 | } 55 | 56 | return $this->getItemFromRequest($qb); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /lib/Events/AddingCircleMemberEvent.php: -------------------------------------------------------------------------------- 1 | getFederatedEvent()->setResultEntry(string $key, array $data); 29 | * 30 | * @package OCA\Circles\Events 31 | */ 32 | class AddingCircleMemberEvent extends CircleMemberGenericEvent { 33 | /** @var int */ 34 | private $type = 0; 35 | 36 | 37 | /** 38 | * AddingCircleMemberEvent constructor. 39 | * 40 | * @param FederatedEvent $federatedEvent 41 | */ 42 | public function __construct(FederatedEvent $federatedEvent) { 43 | parent::__construct($federatedEvent); 44 | } 45 | 46 | 47 | /** 48 | * @param int $type 49 | * 50 | * @return $this 51 | */ 52 | public function setType(int $type): self { 53 | $this->type = $type; 54 | 55 | return $this; 56 | } 57 | 58 | /** 59 | * @return int 60 | */ 61 | public function getType(): int { 62 | return $this->type; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /lib/Events/CircleCreatedEvent.php: -------------------------------------------------------------------------------- 1 | circle = $federatedEvent->getCircle(); 35 | } 36 | 37 | 38 | /** 39 | * @return FederatedEvent 40 | */ 41 | public function getFederatedEvent(): FederatedEvent { 42 | return $this->federatedEvent; 43 | } 44 | 45 | /** 46 | * @return Circle 47 | */ 48 | public function getCircle(): Circle { 49 | return $this->circle; 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /lib/Events/CircleMemberAddedEvent.php: -------------------------------------------------------------------------------- 1 | type = $type; 51 | 52 | return $this; 53 | } 54 | 55 | /** 56 | * @return int 57 | */ 58 | public function getType(): int { 59 | return $this->type; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /lib/Events/CircleMemberGenericEvent.php: -------------------------------------------------------------------------------- 1 | member = $federatedEvent->getMember(); 36 | } 37 | 38 | 39 | /** 40 | * @return Member 41 | */ 42 | public function getMember(): Member { 43 | return $this->member; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /lib/Events/CircleMemberRemovedEvent.php: -------------------------------------------------------------------------------- 1 | type = $type; 51 | 52 | return $this; 53 | } 54 | 55 | /** 56 | * @return int 57 | */ 58 | public function getType(): int { 59 | return $this->type; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /lib/Events/CircleMemberRequestedEvent.php: -------------------------------------------------------------------------------- 1 | type = $type; 51 | 52 | return $this; 53 | } 54 | 55 | /** 56 | * @return int 57 | */ 58 | public function getType(): int { 59 | return $this->type; 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /lib/Events/CreatingCircleEvent.php: -------------------------------------------------------------------------------- 1 | getFederatedEvent()->setResultEntry(string $key, array $data); 30 | * 31 | * @package OCA\Circles\Events 32 | */ 33 | class CreatingCircleEvent extends CircleGenericEvent { 34 | /** 35 | * CreatingCircleEvent constructor. 36 | * 37 | * @param FederatedEvent $federatedEvent 38 | */ 39 | public function __construct(FederatedEvent $federatedEvent) { 40 | parent::__construct($federatedEvent); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lib/Events/DestroyingCircleEvent.php: -------------------------------------------------------------------------------- 1 | getFederatedEvent()->setResultEntry(string $key, array $data); 30 | * * 31 | * @package OCA\Circles\Events 32 | */ 33 | class DestroyingCircleEvent extends CircleGenericEvent { 34 | /** 35 | * DestroyingCircleEvent constructor. 36 | * 37 | * @param FederatedEvent $federatedEvent 38 | */ 39 | public function __construct(FederatedEvent $federatedEvent) { 40 | parent::__construct($federatedEvent); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lib/Events/EditingCircleEvent.php: -------------------------------------------------------------------------------- 1 | getFederatedEvent()->setResultEntry(string $key, array $data); 29 | * 30 | * @package OCA\Circles\Events 31 | */ 32 | class EditingCircleEvent extends CircleGenericEvent { 33 | /** 34 | * EditingCircleEvent constructor. 35 | * 36 | * @param FederatedEvent $federatedEvent 37 | */ 38 | public function __construct(FederatedEvent $federatedEvent) { 39 | parent::__construct($federatedEvent); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /lib/Events/Files/CreatingFileShareEvent.php: -------------------------------------------------------------------------------- 1 | mount = $mount; 44 | } 45 | 46 | /** 47 | * @return Mount 48 | */ 49 | public function getMount(): Mount { 50 | return $this->mount; 51 | } 52 | 53 | /** 54 | * @return bool 55 | */ 56 | public function hasMount(): bool { 57 | return !is_null($this->mount); 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /lib/Events/Files/FileShareCreatedEvent.php: -------------------------------------------------------------------------------- 1 | memberships = $memberships; 36 | } 37 | 38 | 39 | /** 40 | * @return Membership[] 41 | */ 42 | public function getMemberships(): array { 43 | return $this->memberships; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /lib/Events/MembershipsEditedEvent.php: -------------------------------------------------------------------------------- 1 | memberships = $memberships; 36 | } 37 | 38 | 39 | /** 40 | * @return Membership[] 41 | */ 42 | public function getMemberships(): array { 43 | return $this->memberships; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /lib/Events/MembershipsRemovedEvent.php: -------------------------------------------------------------------------------- 1 | memberships = $memberships; 36 | } 37 | 38 | 39 | /** 40 | * @return Membership[] 41 | */ 42 | public function getMemberships(): array { 43 | return $this->memberships; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /lib/Events/PreparingCircleMemberEvent.php: -------------------------------------------------------------------------------- 1 | getFederatedEvent()->setResultEntry(string $key, array $data); 29 | * 30 | * @package OCA\Circles\Events 31 | */ 32 | class RemovingCircleMemberEvent extends CircleMemberGenericEvent { 33 | /** @var int */ 34 | private $type = 0; 35 | 36 | 37 | /** 38 | * RemovingCircleMemberEvent constructor. 39 | * 40 | * @param FederatedEvent $federatedEvent 41 | */ 42 | public function __construct(FederatedEvent $federatedEvent) { 43 | parent::__construct($federatedEvent); 44 | } 45 | 46 | 47 | /** 48 | * @param int $type 49 | * 50 | * @return $this 51 | */ 52 | public function setType(int $type): self { 53 | $this->type = $type; 54 | 55 | return $this; 56 | } 57 | 58 | /** 59 | * @return int 60 | */ 61 | public function getType(): int { 62 | return $this->type; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /lib/Events/RequestingCircleMemberEvent.php: -------------------------------------------------------------------------------- 1 | getFederatedEvent()->setResultEntry(string $key, array $data); 28 | * 29 | * @package OCA\Circles\Events 30 | */ 31 | class RequestingCircleMemberEvent extends CircleMemberGenericEvent { 32 | /** @var int */ 33 | private $type = 0; 34 | 35 | 36 | /** 37 | * RequestingCircleMemberEvent constructor. 38 | * 39 | * @param FederatedEvent $federatedEvent 40 | */ 41 | public function __construct(FederatedEvent $federatedEvent) { 42 | parent::__construct($federatedEvent); 43 | } 44 | 45 | 46 | /** 47 | * @param int $type 48 | * 49 | * @return $this 50 | */ 51 | public function setType(int $type): self { 52 | $this->type = $type; 53 | 54 | return $this; 55 | } 56 | 57 | /** 58 | * @return int 59 | */ 60 | public function getType(): int { 61 | return $this->type; 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /lib/Exceptions/ApiVersionIncompatibleException.php: -------------------------------------------------------------------------------- 1 | 0) ? $code : self::STATUS, $previous); 38 | $this->setStatus(self::STATUS); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/Exceptions/FederatedItemConflictException.php: -------------------------------------------------------------------------------- 1 | 0) ? $code : self::STATUS, $previous); 38 | $this->setStatus(self::STATUS); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/Exceptions/FederatedItemForbiddenException.php: -------------------------------------------------------------------------------- 1 | 0) ? $code : self::STATUS, $previous); 38 | $this->setStatus(self::STATUS); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/Exceptions/FederatedItemNotFoundException.php: -------------------------------------------------------------------------------- 1 | 0) ? $code : self::STATUS, $previous); 38 | $this->setStatus(self::STATUS); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/Exceptions/FederatedItemRemoteException.php: -------------------------------------------------------------------------------- 1 | 0) ? $code : self::STATUS, $previous); 38 | $this->setStatus(self::STATUS); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/Exceptions/FederatedItemServerException.php: -------------------------------------------------------------------------------- 1 | 0) ? $code : self::STATUS, $previous); 38 | $this->setStatus(self::STATUS); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/Exceptions/FederatedItemUnauthorizedException.php: -------------------------------------------------------------------------------- 1 | setStatus(self::STATUS); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/Exceptions/FederatedLinkCircleNotFoundException.php: -------------------------------------------------------------------------------- 1 | circleRequest = $circleRequest; 39 | } 40 | 41 | 42 | /** 43 | * @param FederatedEvent $event 44 | */ 45 | public function verify(FederatedEvent $event): void { 46 | $circle = $event->getCircle(); 47 | $new = clone $circle; 48 | $event->setOutcome($this->serialize($new)); 49 | } 50 | 51 | 52 | /** 53 | * @param FederatedEvent $event 54 | */ 55 | public function manage(FederatedEvent $event): void { 56 | } 57 | 58 | 59 | /** 60 | * @param FederatedEvent $event 61 | * @param array $results 62 | */ 63 | public function result(FederatedEvent $event, array $results): void { 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /lib/FederatedItems/LoopbackTest.php: -------------------------------------------------------------------------------- 1 | setData(new SimpleDataStore(['verify' => self::VERIFY])); 45 | } 46 | 47 | 48 | /** 49 | * @param FederatedEvent $event 50 | */ 51 | public function manage(FederatedEvent $event): void { 52 | $event->setResult(new SimpleDataStore(['manage' => self::MANAGE])); 53 | } 54 | 55 | 56 | /** 57 | * @param FederatedEvent $event 58 | * @param array $results 59 | */ 60 | public function result(FederatedEvent $event, array $results): void { 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /lib/FederatedItems/SharedItemsSync.php: -------------------------------------------------------------------------------- 1 | circleEventService = $circleEventService; 37 | } 38 | 39 | 40 | /** 41 | * @param FederatedEvent $event 42 | */ 43 | public function verify(FederatedEvent $event): void { 44 | } 45 | 46 | 47 | /** 48 | * @param FederatedEvent $event 49 | */ 50 | public function manage(FederatedEvent $event): void { 51 | $this->circleEventService->onSharedItemsSyncRequested($event); 52 | 53 | $event->setResult(new SimpleDataStore(['shares' => 'ok'])); 54 | } 55 | 56 | 57 | /** 58 | * @param FederatedEvent $event 59 | * @param array $results 60 | */ 61 | public function result(FederatedEvent $event, array $results): void { 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /lib/IEntity.php: -------------------------------------------------------------------------------- 1 | 26 | */ 27 | public function search(string $needle): array; 28 | } 29 | -------------------------------------------------------------------------------- /lib/Listeners/Files/DestroyingCircle.php: -------------------------------------------------------------------------------- 1 | */ 24 | class DestroyingCircle implements IEventListener { 25 | use TStringTools; 26 | use TNCLogger; 27 | 28 | 29 | /** @var ShareWrapperService */ 30 | private $shareWrapperService; 31 | 32 | 33 | /** 34 | * AddingMember constructor. 35 | * 36 | * @param ShareWrapperService $shareWrapperService 37 | */ 38 | public function __construct(ShareWrapperService $shareWrapperService) { 39 | $this->shareWrapperService = $shareWrapperService; 40 | 41 | $this->setup('app', Application::APP_ID); 42 | } 43 | 44 | 45 | /** 46 | * @throws RequestBuilderException 47 | */ 48 | public function handle(Event $event): void { 49 | if (!$event instanceof DestroyingCircleEvent) { 50 | return; 51 | } 52 | 53 | $circle = $event->getCircle(); 54 | $this->shareWrapperService->deleteAllSharesToCircle($circle->getSingleId()); 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /lib/Listeners/GroupCreated.php: -------------------------------------------------------------------------------- 1 | */ 21 | class GroupCreated implements IEventListener { 22 | /** @var SyncService */ 23 | private $syncService; 24 | 25 | public function __construct(SyncService $syncService) { 26 | $this->syncService = $syncService; 27 | } 28 | 29 | public function handle(Event $event): void { 30 | if (!($event instanceof GroupCreatedEvent)) { 31 | return; 32 | } 33 | 34 | $group = $event->getGroup(); 35 | try { 36 | $this->syncService->syncNextcloudGroup($group->getGID()); 37 | } catch (Exception $e) { 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/Listeners/GroupDeleted.php: -------------------------------------------------------------------------------- 1 | */ 21 | class GroupDeleted implements IEventListener { 22 | /** @var SyncService */ 23 | private $syncService; 24 | 25 | 26 | /** 27 | * GroupDeleted constructor. 28 | * 29 | * @param SyncService $syncService 30 | */ 31 | public function __construct(SyncService $syncService) { 32 | $this->syncService = $syncService; 33 | } 34 | 35 | public function handle(Event $event): void { 36 | if (!($event instanceof GroupDeletedEvent)) { 37 | return; 38 | } 39 | 40 | $group = $event->getGroup(); 41 | try { 42 | $this->syncService->groupDeleted($group->getGID()); 43 | } catch (Exception $e) { 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /lib/Listeners/GroupMemberAdded.php: -------------------------------------------------------------------------------- 1 | */ 21 | class GroupMemberAdded implements IEventListener { 22 | /** @var SyncService */ 23 | private $syncService; 24 | 25 | public function __construct(SyncService $syncService) { 26 | $this->syncService = $syncService; 27 | } 28 | 29 | public function handle(Event $event): void { 30 | if (!($event instanceof UserAddedEvent)) { 31 | return; 32 | } 33 | 34 | $group = $event->getGroup(); 35 | $user = $event->getUser(); 36 | try { 37 | $this->syncService->groupMemberAdded($group->getGID(), $user->getUID()); 38 | } catch (Exception $e) { 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /lib/Listeners/GroupMemberRemoved.php: -------------------------------------------------------------------------------- 1 | */ 21 | class GroupMemberRemoved implements IEventListener { 22 | /** @var SyncService */ 23 | private $syncService; 24 | 25 | public function __construct(SyncService $syncService) { 26 | $this->syncService = $syncService; 27 | } 28 | 29 | public function handle(Event $event): void { 30 | if (!($event instanceof UserRemovedEvent)) { 31 | return; 32 | } 33 | 34 | $group = $event->getGroup(); 35 | $user = $event->getUser(); 36 | try { 37 | $this->syncService->groupMemberRemoved($group->getGID(), $user->getUID()); 38 | } catch (Exception $e) { 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /lib/Listeners/UserCreated.php: -------------------------------------------------------------------------------- 1 | */ 21 | class UserCreated implements IEventListener { 22 | /** @var SyncService */ 23 | private $syncService; 24 | 25 | 26 | /** 27 | * UserCreated constructor. 28 | * 29 | * @param SyncService $syncService 30 | */ 31 | public function __construct(SyncService $syncService) { 32 | $this->syncService = $syncService; 33 | } 34 | 35 | 36 | /** 37 | * @param Event $event 38 | */ 39 | public function handle(Event $event): void { 40 | if (!($event instanceof UserCreatedEvent)) { 41 | return; 42 | } 43 | 44 | $user = $event->getUser(); 45 | 46 | try { 47 | $this->syncService->syncNextcloudUser($user->getUID()); 48 | } catch (Exception $e) { 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /lib/Listeners/UserDeleted.php: -------------------------------------------------------------------------------- 1 | */ 21 | class UserDeleted implements IEventListener { 22 | /** @var SyncService */ 23 | private $syncService; 24 | 25 | /** 26 | * UserDeleted constructor. 27 | * 28 | * @param SyncService $syncService 29 | */ 30 | public function __construct(SyncService $syncService) { 31 | $this->syncService = $syncService; 32 | } 33 | 34 | 35 | /** 36 | * @param Event $event 37 | */ 38 | public function handle(Event $event): void { 39 | if (!($event instanceof UserDeletedEvent)) { 40 | return; 41 | } 42 | 43 | $user = $event->getUser(); 44 | 45 | try { 46 | $this->syncService->userDeleted($user->getUID()); 47 | } catch (Exception $e) { 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /lib/Migration/Version0023Date20211216113101.php: -------------------------------------------------------------------------------- 1 | hasTable('circles_membership')) { 34 | $table = $schema->getTable('circles_membership'); 35 | if (!$table->hasPrimaryKey()) { 36 | $indexes = $table->getIndexes(); 37 | // conflict in Oracle with existing unique index, duplicate of primaryKey. 38 | foreach ($indexes as $index) { 39 | if ($index->isUnique()) { 40 | $table->dropIndex($index->getName()); 41 | } 42 | } 43 | $table->setPrimaryKey(['single_id', 'circle_id']); 44 | } 45 | } 46 | 47 | return $schema; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /lib/Migration/Version0028Date20230705222601.php: -------------------------------------------------------------------------------- 1 | getTable('circles_circle'); 33 | if (!$table->hasIndex('dname')) { 34 | $table->addIndex(['display_name'], 'dname'); 35 | } 36 | } catch (SchemaException $e) { 37 | $this->logger->warning('Could not find circles_circle', ['exception' => $e]); 38 | } 39 | 40 | return $schema; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /lib/Migration/Version0031Date20241105133904.php: -------------------------------------------------------------------------------- 1 | getTable('circles_mountpoint'); 36 | if (!$table->hasIndex('mp_sid_hash')) { 37 | $table->addUniqueIndex(['single_id', 'mountpoint_hash'], 'mp_sid_hash'); 38 | } 39 | } catch (SchemaException $e) { 40 | $this->logger->warning('Could not find circles_mountpoint', ['exception' => $e]); 41 | } 42 | 43 | return $schema; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /lib/Model/ManagedModel.php: -------------------------------------------------------------------------------- 1 | modelManager === null) { 35 | $this->modelManager = Server::get(ModelManager::class); 36 | } 37 | 38 | return $this->modelManager; 39 | } 40 | 41 | 42 | /** @noinspection PhpPossiblePolymorphicInvocationInspection */ 43 | public function importFromIFederatedUser(IFederatedUser $orig): void { 44 | if (!($this instanceof IFederatedUser)) { 45 | return; 46 | } 47 | 48 | // TODO : move those methods to this class ? 49 | $this->setSingleId($orig->getSingleId()); 50 | $this->setUserId($orig->getUserId()); 51 | $this->setUserType($orig->getUserType()); 52 | $this->setDisplayName($orig->getDisplayName()); 53 | 54 | if ($orig->hasBasedOn()) { 55 | $this->setBasedOn($orig->getBasedOn()); 56 | } 57 | 58 | $this->setInstance($orig->getInstance()); 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /lib/Model/SearchResult.php: -------------------------------------------------------------------------------- 1 | ident = $ident; 24 | return $this; 25 | } 26 | 27 | public function getIdent(): string { 28 | return $this->ident; 29 | } 30 | 31 | public function setInstance(string $instance): self { 32 | $this->instance = $instance; 33 | return $this; 34 | } 35 | 36 | public function getInstance(): string { 37 | return $this->instance; 38 | } 39 | 40 | public function setType(int $type): self { 41 | $this->type = $type; 42 | return $this; 43 | } 44 | 45 | public function getType(): int { 46 | return $this->type; 47 | } 48 | 49 | public function setData(array $data): self { 50 | $this->data = $data; 51 | return $this; 52 | } 53 | 54 | public function getData(): array { 55 | if (!key_exists('display', $this->data)) { 56 | return ['display' => $this->getIdent()]; 57 | } 58 | return $this->data; 59 | } 60 | 61 | public function jsonSerialize(): array { 62 | return [ 63 | 'ident' => $this->getIdent(), 64 | 'instance' => $this->getInstance(), 65 | 'type' => $this->getType(), 66 | 'data' => $this->getData() 67 | ]; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /lib/Search/Contacts.php: -------------------------------------------------------------------------------- 1 | search($needle, ['FN', 'ORG', 'EMAIL']); 27 | foreach ($contacts as $contact) { 28 | if (($contact['isLocalSystemBook'] ?? false) === true) { 29 | continue; 30 | } 31 | 32 | $data = $this->generateDataArray($contact); 33 | $result[] = new SearchResult($contact['UID'], DeprecatedMember::TYPE_CONTACT, '', $data); 34 | } 35 | 36 | return $result; 37 | } 38 | 39 | 40 | /** 41 | * @param array $contact 42 | * 43 | * @return array 44 | */ 45 | private function generateDataArray($contact) { 46 | $data = [ 47 | 'display' => '', 48 | 'email' => '', 49 | 'organization' => '' 50 | ]; 51 | 52 | $data['display'] = $data['email'] = MiscService::get($contact, 'EMAIL'); 53 | $data['display'] = MiscService::get($contact, 'FN', $data['display']); 54 | $data['organization'] = MiscService::get($contact, 'ORG'); 55 | 56 | return $data; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /lib/Search/FederatedUsers.php: -------------------------------------------------------------------------------- 1 | memberRequest = $memberRequest; 32 | } 33 | 34 | /** 35 | * {@inheritdoc} 36 | */ 37 | public function search(string $needle): array { 38 | return $this->memberRequest->searchFederatedUsers($needle); 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /lib/Search/LocalGroups.php: -------------------------------------------------------------------------------- 1 | search($needle); 25 | foreach ($groups as $group) { 26 | $result[] = new SearchResult($group->getGID(), DeprecatedMember::TYPE_GROUP); 27 | } 28 | 29 | return $result; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lib/Service/ShareService.php: -------------------------------------------------------------------------------- 1 | federatedEventService = $federatedEventService; 38 | $this->configService = $configService; 39 | } 40 | 41 | 42 | /** 43 | * @param Circle $circle 44 | */ 45 | public function syncRemoteShares(Circle $circle) { 46 | // $event = new FederatedEvent(SharedItemsSync::class); 47 | // $event->setCircle($circle); 48 | // $this->federatedEventService->newEvent($event); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /lib/Tools/Db/IQueryRow.php: -------------------------------------------------------------------------------- 1 | setupInt(self::$SETUP_TIME_LIMIT); 38 | set_time_limit(($timeLimit > 0) ? $timeLimit : 0); 39 | ob_start(); 40 | 41 | echo($result); 42 | 43 | $size = ob_get_length(); 44 | header('Content-Length: ' . $size); 45 | ob_end_flush(); 46 | flush(); 47 | } 48 | 49 | /** 50 | * @param JsonSerializable $obj 51 | */ 52 | public function asyncObj(JsonSerializable $obj): void { 53 | $this->async(json_encode($obj)); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /lib/UnifiedSearch/UnifiedSearchResult.php: -------------------------------------------------------------------------------- 1 | withPaths([ 15 | __DIR__ . '/appinfo', 16 | __DIR__ . '/lib', 17 | __DIR__ . '/tests/unit', 18 | ]) 19 | ->withImportNames(importShortClasses: false) 20 | ->withSets([ 21 | NextcloudSets::NEXTCLOUD_25, 22 | ]); 23 | -------------------------------------------------------------------------------- /screenshots/0.12.0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/circles/a47c3acb879784bd56bb8f34b8c3720a51872813/screenshots/0.12.0.png -------------------------------------------------------------------------------- /screenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/circles/a47c3acb879784bd56bb8f34b8c3720a51872813/screenshots/1.png -------------------------------------------------------------------------------- /screenshots/contacts_backend.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nextcloud/circles/a47c3acb879784bd56bb8f34b8c3720a51872813/screenshots/contacts_backend.png -------------------------------------------------------------------------------- /templates/files/list.php: -------------------------------------------------------------------------------- 1 | 7 |
8 |
9 | 10 |
11 |
12 |

t('No files in here')); ?>

13 | 14 |
15 | 16 | 21 | 22 | 23 | 24 | 25 | 30 | 33 | 36 | 37 | 38 | 39 | 40 | 41 | 42 |
43 | -------------------------------------------------------------------------------- /testConfiguration.json.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors 2 | SPDX-License-Identifier: AGPL-3.0-or-later 3 | -------------------------------------------------------------------------------- /tests/bootstrap.php: -------------------------------------------------------------------------------- 1 | addPsr4('Tests\\', OC::$SERVERROOT . '/tests/unit/', true); 13 | 14 | \OC_App::loadApp('circles'); 15 | 16 | OC_Hook::clear(); 17 | -------------------------------------------------------------------------------- /tests/phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 8 | . 9 | 10 | 11 | 12 | 13 | 14 | 15 | ../appinfo 16 | ../lib 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /tests/psalm-baseline.xml.license: -------------------------------------------------------------------------------- 1 | SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors 2 | SPDX-License-Identifier: AGPL-3.0-or-later 3 | -------------------------------------------------------------------------------- /tests/stubs/doctrine_dbal_driver_exception.php: -------------------------------------------------------------------------------- 1 | $service 18 | */ 19 | public function __construct(string $appId, string $service) 20 | { 21 | } 22 | 23 | /** 24 | * @psalm-return class-string 25 | */ 26 | public function getService(): string 27 | { 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /tests/stubs/oc_appframework_middleware_security_exceptions_notloggedinexception.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Symfony\Component\Console\Helper; 13 | 14 | /** 15 | * HelperInterface is the interface all helpers must implement. 16 | * 17 | * @author Fabien Potencier 18 | */ 19 | interface HelperInterface 20 | { 21 | /** 22 | * Sets the helper set associated with this helper. 23 | * 24 | * @return void 25 | */ 26 | public function setHelperSet(?HelperSet $helperSet) 27 | { 28 | } 29 | 30 | /** 31 | * Gets the helper set associated with this helper. 32 | */ 33 | public function getHelperSet(): ?HelperSet 34 | { 35 | } 36 | 37 | /** 38 | * Returns the canonical name of this helper. 39 | * 40 | * @return string 41 | */ 42 | public function getName() 43 | { 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /tests/stubs/symfony_component_console_output_consoleoutputinterface.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Symfony\Component\Console\Output; 13 | 14 | /** 15 | * ConsoleOutputInterface is the interface implemented by ConsoleOutput class. 16 | * This adds information about stderr and section output stream. 17 | * 18 | * @author Dariusz Górecki 19 | */ 20 | interface ConsoleOutputInterface extends OutputInterface 21 | { 22 | /** 23 | * Gets the OutputInterface for errors. 24 | */ 25 | public function getErrorOutput(): OutputInterface 26 | { 27 | } 28 | 29 | /** 30 | * @return void 31 | */ 32 | public function setErrorOutput(OutputInterface $error) 33 | { 34 | } 35 | 36 | public function section(): ConsoleSectionOutput 37 | { 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /tests/stubs/symfony_component_console_question_confirmationquestion.php: -------------------------------------------------------------------------------- 1 | 7 | * 8 | * For the full copyright and license information, please view the LICENSE 9 | * file that was distributed with this source code. 10 | */ 11 | 12 | namespace Symfony\Component\Console\Question; 13 | 14 | /** 15 | * Represents a yes/no question. 16 | * 17 | * @author Fabien Potencier 18 | */ 19 | class ConfirmationQuestion extends Question 20 | { 21 | /** 22 | * @param string $question The question to ask to the user 23 | * @param bool $default The default answer to return, true or false 24 | * @param string $trueAnswerRegex A regex to match the "yes" answer 25 | */ 26 | public function __construct(string $question, bool $default = true, string $trueAnswerRegex = '/^y/i') 27 | { 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /vendor-bin/cs-fixer/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require-dev": { 3 | "nextcloud/coding-standard": "^1.3" 4 | }, 5 | "config": { 6 | "platform": { 7 | "php": "8.1.17" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /vendor-bin/phpunit/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require-dev": { 3 | "phpunit/phpunit": "^10.5" 4 | }, 5 | "config": { 6 | "platform": { 7 | "php": "8.1.17" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /vendor-bin/psalm/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require-dev": { 3 | "vimeo/psalm": "^6" 4 | }, 5 | "config": { 6 | "platform": { 7 | "php": "8.1.17" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /vendor-bin/rector/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "require-dev": { 3 | "nextcloud/rector": "^0.4.1" 4 | } 5 | } 6 | --------------------------------------------------------------------------------