Showing preview only (5,939K chars total). Download the full file or copy to clipboard to get everything.
Repository: zapek/Xeres
Branch: master
Commit: 866a13a92fc3
Files: 1421
Total size: 5.3 MB
Directory structure:
gitextract_qxi8ntma/
├── .agents/
│ └── skills/
│ ├── archunit-rules/
│ │ └── SKILL.md
│ ├── crypto/
│ │ └── SKILL.md
│ ├── dto-mappers/
│ │ └── SKILL.md
│ ├── flyway-migrations/
│ │ └── SKILL.md
│ ├── gradle-build/
│ │ └── SKILL.md
│ ├── java-conventions/
│ │ └── SKILL.md
│ ├── javafx-patterns/
│ │ └── SKILL.md
│ ├── junit-testing/
│ │ └── SKILL.md
│ ├── spring-boot-patterns/
│ │ └── SKILL.md
│ └── ui-testing/
│ └── SKILL.md
├── .aiignore
├── .editorconfig
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yaml
│ │ └── feature_request.yaml
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── analysis.yml
│ ├── build-docker.yml
│ ├── build-installer.yml
│ ├── dependencies.yaml
│ └── qodana_code_quality.yml
├── .gitignore
├── .run/
│ └── All Tests.run.xml
├── AGENTS.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── SECURITY.md
├── SandBox.wsb
├── app/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── io/
│ │ │ └── xeres/
│ │ │ └── app/
│ │ │ ├── XeresApplication.java
│ │ │ ├── api/
│ │ │ │ ├── DefaultHandler.java
│ │ │ │ ├── controller/
│ │ │ │ │ ├── board/
│ │ │ │ │ │ └── BoardController.java
│ │ │ │ │ ├── channel/
│ │ │ │ │ │ └── ChannelController.java
│ │ │ │ │ ├── chat/
│ │ │ │ │ │ ├── ChatController.java
│ │ │ │ │ │ ├── ChatMessageController.java
│ │ │ │ │ │ ├── doc-files/
│ │ │ │ │ │ │ └── websocket.puml
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ ├── config/
│ │ │ │ │ │ ├── ConfigController.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ ├── connection/
│ │ │ │ │ │ └── ConnectionController.java
│ │ │ │ │ ├── contact/
│ │ │ │ │ │ └── ContactController.java
│ │ │ │ │ ├── file/
│ │ │ │ │ │ └── FileController.java
│ │ │ │ │ ├── forum/
│ │ │ │ │ │ └── ForumController.java
│ │ │ │ │ ├── geoip/
│ │ │ │ │ │ └── GeoIpController.java
│ │ │ │ │ ├── identity/
│ │ │ │ │ │ └── IdentityController.java
│ │ │ │ │ ├── location/
│ │ │ │ │ │ └── LocationController.java
│ │ │ │ │ ├── notification/
│ │ │ │ │ │ └── NotificationController.java
│ │ │ │ │ ├── profile/
│ │ │ │ │ │ └── ProfileController.java
│ │ │ │ │ ├── settings/
│ │ │ │ │ │ └── SettingsController.java
│ │ │ │ │ ├── share/
│ │ │ │ │ │ └── ShareController.java
│ │ │ │ │ ├── statistics/
│ │ │ │ │ │ ├── StatisticsController.java
│ │ │ │ │ │ └── StatisticsMapper.java
│ │ │ │ │ └── voip/
│ │ │ │ │ └── VoipMessageController.java
│ │ │ │ ├── converter/
│ │ │ │ │ └── BufferedImageConverter.java
│ │ │ │ ├── exception/
│ │ │ │ │ ├── InternalServerErrorException.java
│ │ │ │ │ └── UnprocessableEntityException.java
│ │ │ │ └── package-info.java
│ │ │ ├── application/
│ │ │ │ ├── SingleInstanceRun.java
│ │ │ │ ├── Startup.java
│ │ │ │ ├── autostart/
│ │ │ │ │ ├── AutoStart.java
│ │ │ │ │ ├── AutoStarter.java
│ │ │ │ │ └── autostarter/
│ │ │ │ │ ├── AutoStarterGeneric.java
│ │ │ │ │ └── AutoStarterWindows.java
│ │ │ │ ├── environment/
│ │ │ │ │ ├── Cloud.java
│ │ │ │ │ ├── CommandArgument.java
│ │ │ │ │ ├── DefaultProperties.java
│ │ │ │ │ ├── HostVariable.java
│ │ │ │ │ └── LocalPortFinder.java
│ │ │ │ └── events/
│ │ │ │ ├── DhtNodeFoundEvent.java
│ │ │ │ ├── IpChangedEvent.java
│ │ │ │ ├── LocationReadyEvent.java
│ │ │ │ ├── NetworkReadyEvent.java
│ │ │ │ ├── PeerConnectedEvent.java
│ │ │ │ ├── PeerDisconnectedEvent.java
│ │ │ │ ├── SettingsChangedEvent.java
│ │ │ │ ├── UpnpEvent.java
│ │ │ │ └── package-info.java
│ │ │ ├── configuration/
│ │ │ │ ├── AsynchronousEventsConfiguration.java
│ │ │ │ ├── AutoStartConfiguration.java
│ │ │ │ ├── CacheDirConfiguration.java
│ │ │ │ ├── CustomCsrfChannelInterceptor.java
│ │ │ │ ├── DataDirConfiguration.java
│ │ │ │ ├── DataSourceConfiguration.java
│ │ │ │ ├── EnumMappingConfiguration.java
│ │ │ │ ├── GeoIpConfiguration.java
│ │ │ │ ├── IdleTimeConfiguration.java
│ │ │ │ ├── SchedulerConfiguration.java
│ │ │ │ ├── SelfCertificateConfiguration.java
│ │ │ │ ├── WebConfiguration.java
│ │ │ │ ├── WebSecurityConfiguration.java
│ │ │ │ ├── WebServerConfiguration.java
│ │ │ │ ├── WebSocketConfiguration.java
│ │ │ │ ├── WebSocketLoggingConfiguration.java
│ │ │ │ ├── WebSocketMessageBrokerConfiguration.java
│ │ │ │ └── WebSocketSecurityConfiguration.java
│ │ │ ├── crypto/
│ │ │ │ ├── aead/
│ │ │ │ │ └── AEAD.java
│ │ │ │ ├── aes/
│ │ │ │ │ └── AES.java
│ │ │ │ ├── dh/
│ │ │ │ │ └── DiffieHellman.java
│ │ │ │ ├── ec/
│ │ │ │ │ └── Ed25519.java
│ │ │ │ ├── hash/
│ │ │ │ │ ├── AbstractMessageDigest.java
│ │ │ │ │ ├── chat/
│ │ │ │ │ │ └── ChatChallenge.java
│ │ │ │ │ ├── sha1/
│ │ │ │ │ │ └── Sha1MessageDigest.java
│ │ │ │ │ └── sha256/
│ │ │ │ │ └── Sha256MessageDigest.java
│ │ │ │ ├── hmac/
│ │ │ │ │ ├── AbstractHMac.java
│ │ │ │ │ ├── sha1/
│ │ │ │ │ │ └── Sha1HMac.java
│ │ │ │ │ └── sha256/
│ │ │ │ │ └── Sha256HMac.java
│ │ │ │ ├── pgp/
│ │ │ │ │ ├── PGP.java
│ │ │ │ │ ├── PGPSigner.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── rsa/
│ │ │ │ │ └── RSA.java
│ │ │ │ ├── rscrypto/
│ │ │ │ │ ├── RsCrypto.java
│ │ │ │ │ └── doc-files/
│ │ │ │ │ └── format.puml
│ │ │ │ ├── rsid/
│ │ │ │ │ ├── RSCertificate.java
│ │ │ │ │ ├── RSId.java
│ │ │ │ │ ├── RSIdArmor.java
│ │ │ │ │ ├── RSIdBuilder.java
│ │ │ │ │ ├── RSIdCrc.java
│ │ │ │ │ ├── RSSerialVersion.java
│ │ │ │ │ └── ShortInvite.java
│ │ │ │ └── x509/
│ │ │ │ └── X509.java
│ │ │ ├── database/
│ │ │ │ ├── DatabaseSession.java
│ │ │ │ ├── DatabaseSessionManager.java
│ │ │ │ ├── converter/
│ │ │ │ │ ├── AvailabilityConverter.java
│ │ │ │ │ ├── EnumConverter.java
│ │ │ │ │ ├── EnumSetConverter.java
│ │ │ │ │ ├── FileTypeConverter.java
│ │ │ │ │ ├── GxsCircleTypeConverter.java
│ │ │ │ │ ├── GxsPrivacyFlagsConverter.java
│ │ │ │ │ ├── GxsSignatureFlagsConverter.java
│ │ │ │ │ ├── IdentityTypeConverter.java
│ │ │ │ │ ├── NetModeConverter.java
│ │ │ │ │ ├── PeerAddressTypeConverter.java
│ │ │ │ │ ├── SecurityKeyFlagsConverter.java
│ │ │ │ │ ├── SignatureTypeConverter.java
│ │ │ │ │ ├── TrustConverter.java
│ │ │ │ │ └── VoteTypeConverter.java
│ │ │ │ ├── model/
│ │ │ │ │ ├── board/
│ │ │ │ │ │ └── BoardMapper.java
│ │ │ │ │ ├── channel/
│ │ │ │ │ │ └── ChannelMapper.java
│ │ │ │ │ ├── chat/
│ │ │ │ │ │ ├── ChatBacklog.java
│ │ │ │ │ │ ├── ChatMapper.java
│ │ │ │ │ │ ├── ChatRoom.java
│ │ │ │ │ │ ├── ChatRoomBacklog.java
│ │ │ │ │ │ └── DistantChatBacklog.java
│ │ │ │ │ ├── connection/
│ │ │ │ │ │ ├── Connection.java
│ │ │ │ │ │ └── ConnectionMapper.java
│ │ │ │ │ ├── file/
│ │ │ │ │ │ ├── File.java
│ │ │ │ │ │ └── FileDownload.java
│ │ │ │ │ ├── forum/
│ │ │ │ │ │ ├── ForumMapper.java
│ │ │ │ │ │ └── ForumMessageItemSummary.java
│ │ │ │ │ ├── gxs/
│ │ │ │ │ │ ├── GxsCircleType.java
│ │ │ │ │ │ ├── GxsClientUpdate.java
│ │ │ │ │ │ ├── GxsConstants.java
│ │ │ │ │ │ ├── GxsGroupItem.java
│ │ │ │ │ │ ├── GxsMessageItem.java
│ │ │ │ │ │ ├── GxsMetaAndData.java
│ │ │ │ │ │ ├── GxsPrivacyFlags.java
│ │ │ │ │ │ ├── GxsServiceSetting.java
│ │ │ │ │ │ └── GxsSignatureFlags.java
│ │ │ │ │ ├── identity/
│ │ │ │ │ │ └── IdentityMapper.java
│ │ │ │ │ ├── location/
│ │ │ │ │ │ ├── Location.java
│ │ │ │ │ │ └── LocationMapper.java
│ │ │ │ │ ├── profile/
│ │ │ │ │ │ ├── Profile.java
│ │ │ │ │ │ └── ProfileMapper.java
│ │ │ │ │ ├── settings/
│ │ │ │ │ │ ├── Settings.java
│ │ │ │ │ │ └── SettingsMapper.java
│ │ │ │ │ └── share/
│ │ │ │ │ ├── Share.java
│ │ │ │ │ └── ShareMapper.java
│ │ │ │ └── repository/
│ │ │ │ ├── ChatBacklogRepository.java
│ │ │ │ ├── ChatRoomBacklogRepository.java
│ │ │ │ ├── ChatRoomRepository.java
│ │ │ │ ├── DistantChatBacklogRepository.java
│ │ │ │ ├── FileDownloadRepository.java
│ │ │ │ ├── FileRepository.java
│ │ │ │ ├── GxsBoardGroupRepository.java
│ │ │ │ ├── GxsBoardMessageRepository.java
│ │ │ │ ├── GxsChannelGroupRepository.java
│ │ │ │ ├── GxsChannelMessageRepository.java
│ │ │ │ ├── GxsClientUpdateRepository.java
│ │ │ │ ├── GxsCommentMessageRepository.java
│ │ │ │ ├── GxsForumGroupRepository.java
│ │ │ │ ├── GxsForumMessageRepository.java
│ │ │ │ ├── GxsGroupItemRepository.java
│ │ │ │ ├── GxsIdentityRepository.java
│ │ │ │ ├── GxsMessageItemRepository.java
│ │ │ │ ├── GxsServiceSettingRepository.java
│ │ │ │ ├── GxsVoteMessageRepository.java
│ │ │ │ ├── LocationRepository.java
│ │ │ │ ├── ProfileRepository.java
│ │ │ │ ├── SettingsRepository.java
│ │ │ │ └── ShareRepository.java
│ │ │ ├── job/
│ │ │ │ ├── DhtFinderJob.java
│ │ │ │ ├── FileIndexingJob.java
│ │ │ │ ├── IdleDetectionJob.java
│ │ │ │ ├── JobUtils.java
│ │ │ │ └── PeerConnectionJob.java
│ │ │ ├── net/
│ │ │ │ ├── bdisc/
│ │ │ │ │ ├── BroadcastDiscoveryService.java
│ │ │ │ │ ├── ProtocolVersion.java
│ │ │ │ │ ├── UdpDiscoveryPeer.java
│ │ │ │ │ └── UdpDiscoveryProtocol.java
│ │ │ │ ├── dht/
│ │ │ │ │ ├── DHTSpringLog.java
│ │ │ │ │ ├── DhtService.java
│ │ │ │ │ ├── NodeId.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── external/
│ │ │ │ │ └── ExternalIpResolver.java
│ │ │ │ ├── peer/
│ │ │ │ │ ├── ConnectionType.java
│ │ │ │ │ ├── DefaultItemFuture.java
│ │ │ │ │ ├── ItemFuture.java
│ │ │ │ │ ├── PeerAttribute.java
│ │ │ │ │ ├── PeerConnection.java
│ │ │ │ │ ├── PeerConnectionManager.java
│ │ │ │ │ ├── bootstrap/
│ │ │ │ │ │ ├── PeerClient.java
│ │ │ │ │ │ ├── PeerI2pClient.java
│ │ │ │ │ │ ├── PeerInitializer.java
│ │ │ │ │ │ ├── PeerServer.java
│ │ │ │ │ │ ├── PeerTcpClient.java
│ │ │ │ │ │ ├── PeerTcpServer.java
│ │ │ │ │ │ └── PeerTorClient.java
│ │ │ │ │ ├── packet/
│ │ │ │ │ │ ├── MultiPacket.java
│ │ │ │ │ │ ├── Packet.java
│ │ │ │ │ │ ├── SimplePacket.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ ├── pipeline/
│ │ │ │ │ │ ├── IdleEventHandler.java
│ │ │ │ │ │ ├── ItemDecoder.java
│ │ │ │ │ │ ├── ItemEncoder.java
│ │ │ │ │ │ ├── MultiPacketEncoder.java
│ │ │ │ │ │ ├── PacketDecoder.java
│ │ │ │ │ │ ├── PeerHandler.java
│ │ │ │ │ │ ├── SimplePacketEncoder.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ └── ssl/
│ │ │ │ │ └── SSL.java
│ │ │ │ ├── protocol/
│ │ │ │ │ ├── DomainNameSocketAddress.java
│ │ │ │ │ └── PeerAddress.java
│ │ │ │ ├── upnp/
│ │ │ │ │ ├── ControlPoint.java
│ │ │ │ │ ├── Device.java
│ │ │ │ │ ├── DeviceSpecs.java
│ │ │ │ │ ├── HttpuHeader.java
│ │ │ │ │ ├── PortMapping.java
│ │ │ │ │ ├── Protocol.java
│ │ │ │ │ ├── Soap.java
│ │ │ │ │ ├── UPNPService.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── util/
│ │ │ │ └── NetworkMode.java
│ │ │ ├── package-info.java
│ │ │ ├── properties/
│ │ │ │ ├── DatabaseProperties.java
│ │ │ │ └── NetworkProperties.java
│ │ │ ├── service/
│ │ │ │ ├── BoardMessageService.java
│ │ │ │ ├── CapabilityService.java
│ │ │ │ ├── ChannelMessageService.java
│ │ │ │ ├── ContactService.java
│ │ │ │ ├── ForumMessageService.java
│ │ │ │ ├── GeoIpService.java
│ │ │ │ ├── IdentityService.java
│ │ │ │ ├── InfoService.java
│ │ │ │ ├── LocationService.java
│ │ │ │ ├── MessageService.java
│ │ │ │ ├── NetworkService.java
│ │ │ │ ├── PeerService.java
│ │ │ │ ├── ProfileService.java
│ │ │ │ ├── QrCodeService.java
│ │ │ │ ├── ResourceCreationState.java
│ │ │ │ ├── SettingsService.java
│ │ │ │ ├── UiBridgeService.java
│ │ │ │ ├── UnHtmlService.java
│ │ │ │ ├── UpgradeService.java
│ │ │ │ ├── audio/
│ │ │ │ │ └── AudioService.java
│ │ │ │ ├── backup/
│ │ │ │ │ ├── BackupService.java
│ │ │ │ │ ├── Export.java
│ │ │ │ │ ├── Group.java
│ │ │ │ │ ├── Identity.java
│ │ │ │ │ ├── Local.java
│ │ │ │ │ ├── Location.java
│ │ │ │ │ ├── LocationIdentifierXmlAdapter.java
│ │ │ │ │ ├── PgpId.java
│ │ │ │ │ ├── Profile.java
│ │ │ │ │ ├── RSIdXmlAdapter.java
│ │ │ │ │ ├── Root.java
│ │ │ │ │ └── SslId.java
│ │ │ │ ├── file/
│ │ │ │ │ ├── FileService.java
│ │ │ │ │ ├── HashBloomFilter.java
│ │ │ │ │ └── TrackingFileVisitor.java
│ │ │ │ ├── identicon/
│ │ │ │ │ └── IdenticonService.java
│ │ │ │ ├── notification/
│ │ │ │ │ ├── NotificationService.java
│ │ │ │ │ ├── availability/
│ │ │ │ │ │ └── AvailabilityNotificationService.java
│ │ │ │ │ ├── board/
│ │ │ │ │ │ └── BoardNotificationService.java
│ │ │ │ │ ├── channel/
│ │ │ │ │ │ └── ChannelNotificationService.java
│ │ │ │ │ ├── contact/
│ │ │ │ │ │ └── ContactNotificationService.java
│ │ │ │ │ ├── file/
│ │ │ │ │ │ ├── FileNotificationService.java
│ │ │ │ │ │ ├── FileSearchNotificationService.java
│ │ │ │ │ │ └── FileTrendNotificationService.java
│ │ │ │ │ ├── forum/
│ │ │ │ │ │ └── ForumNotificationService.java
│ │ │ │ │ └── status/
│ │ │ │ │ └── StatusNotificationService.java
│ │ │ │ ├── script/
│ │ │ │ │ ├── Console.java
│ │ │ │ │ ├── ScriptEvent.java
│ │ │ │ │ └── ScriptService.java
│ │ │ │ └── shell/
│ │ │ │ ├── History.java
│ │ │ │ └── ShellService.java
│ │ │ ├── util/
│ │ │ │ ├── DevUtils.java
│ │ │ │ ├── GxsUtils.java
│ │ │ │ ├── XmlUtils.java
│ │ │ │ └── expression/
│ │ │ │ ├── CompoundExpression.java
│ │ │ │ ├── DateExpression.java
│ │ │ │ ├── Expression.java
│ │ │ │ ├── ExpressionMapper.java
│ │ │ │ ├── ExpressionType.java
│ │ │ │ ├── ExtensionExpression.java
│ │ │ │ ├── HashExpression.java
│ │ │ │ ├── NameExpression.java
│ │ │ │ ├── PathExpression.java
│ │ │ │ ├── PopularityExpression.java
│ │ │ │ ├── RelationalExpression.java
│ │ │ │ ├── SizeExpression.java
│ │ │ │ ├── SizeMbExpression.java
│ │ │ │ └── StringExpression.java
│ │ │ └── xrs/
│ │ │ ├── common/
│ │ │ │ ├── CommentMessageItem.java
│ │ │ │ ├── FileData.java
│ │ │ │ ├── FileItem.java
│ │ │ │ ├── FileSet.java
│ │ │ │ ├── SecurityKey.java
│ │ │ │ ├── Signature.java
│ │ │ │ └── VoteMessageItem.java
│ │ │ ├── item/
│ │ │ │ ├── Item.java
│ │ │ │ ├── ItemHeader.java
│ │ │ │ ├── ItemPriority.java
│ │ │ │ ├── ItemUtils.java
│ │ │ │ └── RawItem.java
│ │ │ ├── serialization/
│ │ │ │ ├── AnnotationSerializer.java
│ │ │ │ ├── ArraySerializer.java
│ │ │ │ ├── BigIntegerSerializer.java
│ │ │ │ ├── BooleanSerializer.java
│ │ │ │ ├── ByteArraySerializer.java
│ │ │ │ ├── ByteSerializer.java
│ │ │ │ ├── DoubleSerializer.java
│ │ │ │ ├── EnumSerializer.java
│ │ │ │ ├── EnumSetSerializer.java
│ │ │ │ ├── FieldSize.java
│ │ │ │ ├── FloatSerializer.java
│ │ │ │ ├── GxsMetaAndDataResult.java
│ │ │ │ ├── GxsMetaAndDataSerializer.java
│ │ │ │ ├── IdentifierSerializer.java
│ │ │ │ ├── IntSerializer.java
│ │ │ │ ├── ListSerializer.java
│ │ │ │ ├── LongSerializer.java
│ │ │ │ ├── MapSerializer.java
│ │ │ │ ├── RsClassSerializedReversed.java
│ │ │ │ ├── RsSerializable.java
│ │ │ │ ├── RsSerializableSerializer.java
│ │ │ │ ├── RsSerialized.java
│ │ │ │ ├── SerializationFlags.java
│ │ │ │ ├── Serializer.java
│ │ │ │ ├── SerializerSizeCache.java
│ │ │ │ ├── ShortSerializer.java
│ │ │ │ ├── StringSerializer.java
│ │ │ │ ├── TlvAddressSerializer.java
│ │ │ │ ├── TlvBinarySerializer.java
│ │ │ │ ├── TlvFileDataSerializer.java
│ │ │ │ ├── TlvFileItemSerializer.java
│ │ │ │ ├── TlvFileSetSerializer.java
│ │ │ │ ├── TlvImageSerializer.java
│ │ │ │ ├── TlvSecurityKeySerializer.java
│ │ │ │ ├── TlvSecurityKeySetSerializer.java
│ │ │ │ ├── TlvSerializer.java
│ │ │ │ ├── TlvSetSerializer.java
│ │ │ │ ├── TlvSignatureSerializer.java
│ │ │ │ ├── TlvSignatureSetSerializer.java
│ │ │ │ ├── TlvStringSerializer.java
│ │ │ │ ├── TlvStringSetRefSerializer.java
│ │ │ │ ├── TlvType.java
│ │ │ │ ├── TlvUint32Serializer.java
│ │ │ │ ├── TlvUint64Serializer.java
│ │ │ │ └── TlvUtils.java
│ │ │ └── service/
│ │ │ ├── DefaultItem.java
│ │ │ ├── RsService.java
│ │ │ ├── RsServiceInitPriority.java
│ │ │ ├── RsServiceMaster.java
│ │ │ ├── RsServiceRegistry.java
│ │ │ ├── RsServiceSlave.java
│ │ │ ├── bandwidth/
│ │ │ │ ├── BandwidthRsService.java
│ │ │ │ ├── BandwidthUtils.java
│ │ │ │ └── item/
│ │ │ │ └── BandwidthAllowedItem.java
│ │ │ ├── board/
│ │ │ │ ├── BoardRsService.java
│ │ │ │ └── item/
│ │ │ │ ├── BoardGroupItem.java
│ │ │ │ └── BoardMessageItem.java
│ │ │ ├── channel/
│ │ │ │ ├── ChannelRsService.java
│ │ │ │ └── item/
│ │ │ │ ├── ChannelGroupItem.java
│ │ │ │ └── ChannelMessageItem.java
│ │ │ ├── chat/
│ │ │ │ ├── ChatBacklogService.java
│ │ │ │ ├── ChatFlags.java
│ │ │ │ ├── ChatRoom.java
│ │ │ │ ├── ChatRoomService.java
│ │ │ │ ├── ChatRsService.java
│ │ │ │ ├── DistantLocation.java
│ │ │ │ ├── MessageCache.java
│ │ │ │ ├── RoomFlags.java
│ │ │ │ └── item/
│ │ │ │ ├── ChatAvatarItem.java
│ │ │ │ ├── ChatMessageItem.java
│ │ │ │ ├── ChatRoomBounce.java
│ │ │ │ ├── ChatRoomConfigItem.java
│ │ │ │ ├── ChatRoomConnectChallengeItem.java
│ │ │ │ ├── ChatRoomEvent.java
│ │ │ │ ├── ChatRoomEventItem.java
│ │ │ │ ├── ChatRoomInviteItem.java
│ │ │ │ ├── ChatRoomInviteOldItem.java
│ │ │ │ ├── ChatRoomListItem.java
│ │ │ │ ├── ChatRoomListRequestItem.java
│ │ │ │ ├── ChatRoomMessageItem.java
│ │ │ │ ├── ChatRoomUnsubscribeItem.java
│ │ │ │ ├── ChatStatusItem.java
│ │ │ │ ├── PrivateChatMessageConfigItem.java
│ │ │ │ ├── PrivateOutgoingMapItem.java
│ │ │ │ ├── SubscribedChatRoomConfigItem.java
│ │ │ │ └── VisibleChatRoomInfo.java
│ │ │ ├── discovery/
│ │ │ │ ├── DiscoveryRsService.java
│ │ │ │ └── item/
│ │ │ │ ├── DiscoveryContactItem.java
│ │ │ │ ├── DiscoveryIdentityListItem.java
│ │ │ │ ├── DiscoveryPgpKeyItem.java
│ │ │ │ └── DiscoveryPgpListItem.java
│ │ │ ├── filetransfer/
│ │ │ │ ├── Action.java
│ │ │ │ ├── ActionAddPeer.java
│ │ │ │ ├── ActionDownload.java
│ │ │ │ ├── ActionGetDownloadsProgress.java
│ │ │ │ ├── ActionGetUploadsProgress.java
│ │ │ │ ├── ActionReceiveChunkMap.java
│ │ │ │ ├── ActionReceiveChunkMapRequest.java
│ │ │ │ ├── ActionReceiveData.java
│ │ │ │ ├── ActionReceiveDataRequest.java
│ │ │ │ ├── ActionReceiveSingleChunkCrc.java
│ │ │ │ ├── ActionReceiveSingleChunkCrcRequest.java
│ │ │ │ ├── ActionRemoveDownload.java
│ │ │ │ ├── ActionRemovePeer.java
│ │ │ │ ├── Chunk.java
│ │ │ │ ├── ChunkDistributor.java
│ │ │ │ ├── ChunkMapUtils.java
│ │ │ │ ├── ChunkReceiver.java
│ │ │ │ ├── FileDownload.java
│ │ │ │ ├── FileLeecher.java
│ │ │ │ ├── FilePeer.java
│ │ │ │ ├── FileProvider.java
│ │ │ │ ├── FileSeeder.java
│ │ │ │ ├── FileTransferAgent.java
│ │ │ │ ├── FileTransferEncryptionKey.java
│ │ │ │ ├── FileTransferManager.java
│ │ │ │ ├── FileTransferRsService.java
│ │ │ │ ├── FileTransferStrategy.java
│ │ │ │ ├── FileUpload.java
│ │ │ │ ├── SliceSender.java
│ │ │ │ ├── doc-files/
│ │ │ │ │ └── filetransfer.puml
│ │ │ │ └── item/
│ │ │ │ ├── FileTransferChunkMapItem.java
│ │ │ │ ├── FileTransferChunkMapRequestItem.java
│ │ │ │ ├── FileTransferDataItem.java
│ │ │ │ ├── FileTransferDataRequestItem.java
│ │ │ │ ├── FileTransferSingleChunkCrcItem.java
│ │ │ │ ├── FileTransferSingleChunkCrcRequestItem.java
│ │ │ │ ├── TurtleChunkCrcItem.java
│ │ │ │ ├── TurtleChunkCrcRequestItem.java
│ │ │ │ ├── TurtleFileDataItem.java
│ │ │ │ ├── TurtleFileMapItem.java
│ │ │ │ ├── TurtleFileMapRequestItem.java
│ │ │ │ └── TurtleFileRequestItem.java
│ │ │ ├── forum/
│ │ │ │ ├── ForumRsService.java
│ │ │ │ └── item/
│ │ │ │ ├── ForumGroupItem.java
│ │ │ │ └── ForumMessageItem.java
│ │ │ ├── gxs/
│ │ │ │ ├── GxsAuthentication.java
│ │ │ │ ├── GxsHelperService.java
│ │ │ │ ├── GxsRsService.java
│ │ │ │ ├── GxsTransactionManager.java
│ │ │ │ ├── Transaction.java
│ │ │ │ ├── doc-files/
│ │ │ │ │ ├── transaction.puml
│ │ │ │ │ └── transfer.puml
│ │ │ │ └── item/
│ │ │ │ ├── DynamicServiceType.java
│ │ │ │ ├── GxsExchange.java
│ │ │ │ ├── GxsSyncGroupItem.java
│ │ │ │ ├── GxsSyncGroupRequestItem.java
│ │ │ │ ├── GxsSyncGroupStatsItem.java
│ │ │ │ ├── GxsSyncMessageItem.java
│ │ │ │ ├── GxsSyncMessageRequestItem.java
│ │ │ │ ├── GxsSyncNotifyItem.java
│ │ │ │ ├── GxsTransactionItem.java
│ │ │ │ ├── GxsTransferGroupItem.java
│ │ │ │ ├── GxsTransferMessageItem.java
│ │ │ │ ├── RequestType.java
│ │ │ │ └── TransactionFlags.java
│ │ │ ├── gxstunnel/
│ │ │ │ ├── DestinationHash.java
│ │ │ │ ├── GxsTunnelRsClient.java
│ │ │ │ ├── GxsTunnelRsService.java
│ │ │ │ ├── GxsTunnelStatus.java
│ │ │ │ ├── TunnelDhInfo.java
│ │ │ │ ├── TunnelPeerInfo.java
│ │ │ │ ├── VirtualLocation.java
│ │ │ │ └── item/
│ │ │ │ ├── GxsTunnelDataAckItem.java
│ │ │ │ ├── GxsTunnelDataItem.java
│ │ │ │ ├── GxsTunnelDhPublicKeyItem.java
│ │ │ │ ├── GxsTunnelItem.java
│ │ │ │ └── GxsTunnelStatusItem.java
│ │ │ ├── heartbeat/
│ │ │ │ ├── HeartbeatRsService.java
│ │ │ │ └── item/
│ │ │ │ └── HeartbeatItem.java
│ │ │ ├── identity/
│ │ │ │ ├── IdentityManager.java
│ │ │ │ ├── IdentityReputation.java
│ │ │ │ ├── IdentityRsService.java
│ │ │ │ ├── ValidationResult.java
│ │ │ │ ├── ValidationState.java
│ │ │ │ └── item/
│ │ │ │ └── IdentityGroupItem.java
│ │ │ ├── rtt/
│ │ │ │ ├── RttRsService.java
│ │ │ │ └── item/
│ │ │ │ ├── RttPingItem.java
│ │ │ │ └── RttPongItem.java
│ │ │ ├── serviceinfo/
│ │ │ │ ├── ServiceInfoRsService.java
│ │ │ │ └── item/
│ │ │ │ ├── ServiceInfo.java
│ │ │ │ └── ServiceListItem.java
│ │ │ ├── sliceprobe/
│ │ │ │ ├── SliceProbeRsService.java
│ │ │ │ └── item/
│ │ │ │ └── SliceProbeItem.java
│ │ │ ├── status/
│ │ │ │ ├── ChatStatus.java
│ │ │ │ ├── GetIdleTime.java
│ │ │ │ ├── IdleChecker.java
│ │ │ │ ├── StatusRsService.java
│ │ │ │ ├── idletimer/
│ │ │ │ │ ├── GetIdleTimeGeneric.java
│ │ │ │ │ ├── GetIdleTimeLinux.java
│ │ │ │ │ ├── GetIdleTimeMac.java
│ │ │ │ │ └── GetIdleTimeWindows.java
│ │ │ │ └── item/
│ │ │ │ └── StatusItem.java
│ │ │ ├── turtle/
│ │ │ │ ├── HashInfo.java
│ │ │ │ ├── SearchRequest.java
│ │ │ │ ├── Tunnel.java
│ │ │ │ ├── TunnelProbability.java
│ │ │ │ ├── TunnelRequest.java
│ │ │ │ ├── TurtleRouter.java
│ │ │ │ ├── TurtleRsClient.java
│ │ │ │ ├── TurtleRsService.java
│ │ │ │ ├── TurtleStatistics.java
│ │ │ │ ├── VirtualLocation.java
│ │ │ │ ├── doc-files/
│ │ │ │ │ └── search.puml
│ │ │ │ └── item/
│ │ │ │ ├── TunnelDirection.java
│ │ │ │ ├── TurtleFileInfo.java
│ │ │ │ ├── TurtleFileSearchRequestItem.java
│ │ │ │ ├── TurtleFileSearchResultItem.java
│ │ │ │ ├── TurtleGenericDataItem.java
│ │ │ │ ├── TurtleGenericFastDataItem.java
│ │ │ │ ├── TurtleGenericSearchRequestItem.java
│ │ │ │ ├── TurtleGenericSearchResultItem.java
│ │ │ │ ├── TurtleGenericTunnelItem.java
│ │ │ │ ├── TurtleRegExpSearchRequestItem.java
│ │ │ │ ├── TurtleSearchRequestItem.java
│ │ │ │ ├── TurtleSearchResultItem.java
│ │ │ │ ├── TurtleStringSearchRequestItem.java
│ │ │ │ ├── TurtleTunnelRequestItem.java
│ │ │ │ └── TurtleTunnelResultItem.java
│ │ │ └── voip/
│ │ │ ├── LockBasedSingleEntrySupplier.java
│ │ │ ├── VoipRsService.java
│ │ │ └── item/
│ │ │ ├── VoipDataItem.java
│ │ │ ├── VoipPingItem.java
│ │ │ ├── VoipPongItem.java
│ │ │ └── VoipProtocolItem.java
│ │ ├── javadoc/
│ │ │ └── overview.html
│ │ └── resources/
│ │ ├── GeoLite2-Country.mmdb
│ │ ├── LICENSE
│ │ ├── META-INF/
│ │ │ └── additional-spring-configuration-metadata.json
│ │ ├── application-cloud.properties
│ │ ├── application-dev.properties
│ │ ├── application.properties
│ │ ├── banner.txt
│ │ ├── bdboot.txt
│ │ ├── db/
│ │ │ └── migration/
│ │ │ ├── V00_0_10_202407122208__AlterFileDownloadCompleted.sql
│ │ │ ├── V00_0_11_202408021538__AddEncryptedHashes.sql
│ │ │ ├── V00_0_12_202408021849__AddEncryptedHashIndex.sql
│ │ │ ├── V00_0_13_202408121618__AddLocationToFileDownload.sql
│ │ │ ├── V00_0_14_202408221303__AddAvailabilityToLocation.sql
│ │ │ ├── V00_0_15_202409220053__AddChatBacklog.sql
│ │ │ ├── V00_0_16_202410061715__AddProfileValidation.sql
│ │ │ ├── V00_0_17_202410112205__AddProfileCreation.sql
│ │ │ ├── V00_0_18_202410201950__AddLocationVersion.sql
│ │ │ ├── V00_0_19_202411171309__AddExtendedFingerprint.sql
│ │ │ ├── V00_0_1_202001232214__InitDb.sql
│ │ │ ├── V00_0_20_202411212150__AlterShareLastScanned.sql
│ │ │ ├── V00_0_21_202412142109__AddRemoteOptions.sql
│ │ │ ├── V00_0_22_202412211327__AddRemotePort.sql
│ │ │ ├── V00_0_23_202412242306__AddChatRoomLocations.sql
│ │ │ ├── V00_0_24_202502252128__AddDistantChatBacklog.sql
│ │ │ ├── V00_0_25_202504051643__AcceptNullNamedLocations.sql
│ │ │ ├── V00_0_26_202504152033__AdjustBacklogMessageSizes.sql
│ │ │ ├── V00_0_27_202511240013__AddBoards.sql
│ │ │ ├── V00_0_28_202511281815__AddChannels.sql
│ │ │ ├── V00_0_29_202512212323__FixGxsSizeLimits.sql
│ │ │ ├── V00_0_2_202312151830__AddIncomingDirectory.sql
│ │ │ ├── V00_0_30_202602161830__ImproveGxsGroupsAndMessage.sql
│ │ │ ├── V00_0_31_202602121929__AddLastActivity.sql
│ │ │ ├── V00_0_32_202603092327__AddIndices.sql
│ │ │ ├── V00_0_33_202604260021__FixVotes.sql
│ │ │ ├── V00_0_3_202401151840__AddSharesAndFiles.sql
│ │ │ ├── V00_0_4_202402211850__AlterTimestampPrecision.sql
│ │ │ ├── V00_0_5_202405122038__AddSizeToFiles.sql
│ │ │ ├── V00_0_6_202405242209__AddNewFileEnumTypes.sql
│ │ │ ├── V00_0_7_202406181840__AddFileDownload.sql
│ │ │ ├── V00_0_8_202406191850__AddRemotePassword.sql
│ │ │ └── V00_0_9_202406201855__AddSettingsVersion.sql
│ │ ├── public/
│ │ │ └── index.html
│ │ └── public.asc
│ └── test/
│ ├── java/
│ │ └── io/
│ │ └── xeres/
│ │ ├── app/
│ │ │ ├── ApiTest.java
│ │ │ ├── AppCodingRulesTest.java
│ │ │ ├── api/
│ │ │ │ └── controller/
│ │ │ │ ├── AbstractControllerTest.java
│ │ │ │ ├── PathConfigTest.java
│ │ │ │ ├── board/
│ │ │ │ │ └── BoardControllerTest.java
│ │ │ │ ├── channel/
│ │ │ │ │ └── ChannelControllerTest.java
│ │ │ │ ├── chat/
│ │ │ │ │ ├── ChatControllerTest.java
│ │ │ │ │ └── ChatMessageControllerTest.java
│ │ │ │ ├── config/
│ │ │ │ │ └── ConfigControllerTest.java
│ │ │ │ ├── connection/
│ │ │ │ │ └── ConnectionControllerTest.java
│ │ │ │ ├── contact/
│ │ │ │ │ └── ContactControllerTest.java
│ │ │ │ ├── file/
│ │ │ │ │ └── FileControllerTest.java
│ │ │ │ ├── forum/
│ │ │ │ │ └── ForumControllerTest.java
│ │ │ │ ├── geoip/
│ │ │ │ │ └── GeoIpControllerTest.java
│ │ │ │ ├── identity/
│ │ │ │ │ └── IdentityControllerTest.java
│ │ │ │ ├── location/
│ │ │ │ │ └── LocationControllerTest.java
│ │ │ │ ├── notification/
│ │ │ │ │ └── NotificationControllerTest.java
│ │ │ │ ├── profile/
│ │ │ │ │ └── ProfileControllerTest.java
│ │ │ │ ├── settings/
│ │ │ │ │ └── SettingsControllerTest.java
│ │ │ │ ├── share/
│ │ │ │ │ └── ShareControllerTest.java
│ │ │ │ ├── statistics/
│ │ │ │ │ └── StatisticsControllerTest.java
│ │ │ │ └── voip/
│ │ │ │ └── VoipMessageControllerTest.java
│ │ │ ├── application/
│ │ │ │ ├── SingleInstanceRunTest.java
│ │ │ │ ├── autostart/
│ │ │ │ │ ├── AutoStartTest.java
│ │ │ │ │ └── autostarter/
│ │ │ │ │ └── AutoStarterGenericTest.java
│ │ │ │ └── environment/
│ │ │ │ └── DefaultPropertiesTest.java
│ │ │ ├── configuration/
│ │ │ │ └── DataDirConfigurationTest.java
│ │ │ ├── crypto/
│ │ │ │ ├── aead/
│ │ │ │ │ └── AEADTest.java
│ │ │ │ ├── aes/
│ │ │ │ │ └── AESTest.java
│ │ │ │ ├── chatcipher/
│ │ │ │ │ └── ChatChallengeTest.java
│ │ │ │ ├── dh/
│ │ │ │ │ └── DiffieHellmanTest.java
│ │ │ │ ├── ec/
│ │ │ │ │ └── Ed25519Test.java
│ │ │ │ ├── hmac/
│ │ │ │ │ ├── sha1/
│ │ │ │ │ │ └── Sha1HMacTest.java
│ │ │ │ │ └── sha256/
│ │ │ │ │ └── Sha256HMacTest.java
│ │ │ │ ├── pgp/
│ │ │ │ │ └── PGPTest.java
│ │ │ │ ├── rsa/
│ │ │ │ │ └── RSATest.java
│ │ │ │ ├── rscrypto/
│ │ │ │ │ └── RsCryptoTest.java
│ │ │ │ ├── rsid/
│ │ │ │ │ ├── RSCertificateTest.java
│ │ │ │ │ ├── RSIdArmorTest.java
│ │ │ │ │ ├── RSIdCrcTest.java
│ │ │ │ │ ├── RSIdFakes.java
│ │ │ │ │ ├── RSSerialVersionTest.java
│ │ │ │ │ └── RSShortInviteTest.java
│ │ │ │ └── x509/
│ │ │ │ └── X509Test.java
│ │ │ ├── database/
│ │ │ │ ├── model/
│ │ │ │ │ ├── chat/
│ │ │ │ │ │ ├── ChatMapperTest.java
│ │ │ │ │ │ └── ChatRoomFakes.java
│ │ │ │ │ ├── connection/
│ │ │ │ │ │ ├── ConnectionFakes.java
│ │ │ │ │ │ ├── ConnectionMapperTest.java
│ │ │ │ │ │ └── ConnectionTest.java
│ │ │ │ │ ├── file/
│ │ │ │ │ │ └── FileFakes.java
│ │ │ │ │ ├── gxs/
│ │ │ │ │ │ ├── BoardGroupItemFakes.java
│ │ │ │ │ │ ├── BoardMessageItemFakes.java
│ │ │ │ │ │ ├── ChannelGroupItemFakes.java
│ │ │ │ │ │ ├── ChannelMessageItemFakes.java
│ │ │ │ │ │ ├── ForumGroupItemFakes.java
│ │ │ │ │ │ ├── ForumMessageItemFakes.java
│ │ │ │ │ │ ├── ForumMessageItemSummaryFake.java
│ │ │ │ │ │ ├── GxsCircleTypeTest.java
│ │ │ │ │ │ ├── GxsClientUpdateFakes.java
│ │ │ │ │ │ ├── GxsPrivacyFlagsTest.java
│ │ │ │ │ │ ├── GxsServiceSettingFakes.java
│ │ │ │ │ │ ├── GxsSignatureFlagsTest.java
│ │ │ │ │ │ └── IdentityGroupItemFakes.java
│ │ │ │ │ ├── identity/
│ │ │ │ │ │ ├── IdentityFakes.java
│ │ │ │ │ │ └── IdentityMapperTest.java
│ │ │ │ │ ├── location/
│ │ │ │ │ │ ├── LocationFakes.java
│ │ │ │ │ │ └── LocationMapperTest.java
│ │ │ │ │ ├── profile/
│ │ │ │ │ │ ├── ProfileFakes.java
│ │ │ │ │ │ └── ProfileMapperTest.java
│ │ │ │ │ ├── settings/
│ │ │ │ │ │ └── SettingsFakes.java
│ │ │ │ │ └── share/
│ │ │ │ │ └── ShareFakes.java
│ │ │ │ └── repository/
│ │ │ │ ├── ChatRoomRepositoryTest.java
│ │ │ │ ├── FileRepositoryTest.java
│ │ │ │ ├── GxsClientUpdateRepositoryTest.java
│ │ │ │ ├── GxsIdentityRepositoryTest.java
│ │ │ │ ├── GxsServiceSettingRepositoryTest.java
│ │ │ │ ├── LocationRepositoryTest.java
│ │ │ │ ├── ProfileRepositoryTest.java
│ │ │ │ └── SettingsRepositoryTest.java
│ │ │ ├── environment/
│ │ │ │ ├── CloudTest.java
│ │ │ │ ├── CommandArgumentTest.java
│ │ │ │ └── HostVariableTest.java
│ │ │ ├── job/
│ │ │ │ ├── IdleDetectionJobTest.java
│ │ │ │ └── PeerConnectionJobTest.java
│ │ │ ├── net/
│ │ │ │ ├── bdisc/
│ │ │ │ │ ├── BroadcastDiscoveryServiceTest.java
│ │ │ │ │ └── UdpDiscoveryProtocolTest.java
│ │ │ │ ├── dht/
│ │ │ │ │ └── NodeIdTest.java
│ │ │ │ ├── peer/
│ │ │ │ │ ├── AbstractPipelineTest.java
│ │ │ │ │ ├── ChannelFake.java
│ │ │ │ │ ├── ChannelHandlerContextFake.java
│ │ │ │ │ ├── PacketDecoderPipelineTest.java
│ │ │ │ │ ├── PacketEncoderPipelineTest.java
│ │ │ │ │ ├── PeerAttributeTest.java
│ │ │ │ │ ├── PeerConnectionFakes.java
│ │ │ │ │ ├── PeerConnectionManagerTest.java
│ │ │ │ │ ├── RawItemDecoderPipelineTest.java
│ │ │ │ │ ├── packet/
│ │ │ │ │ │ ├── MultiPacketBuilder.java
│ │ │ │ │ │ ├── PacketTest.java
│ │ │ │ │ │ └── SimplePacketBuilder.java
│ │ │ │ │ └── ssl/
│ │ │ │ │ └── SSLTest.java
│ │ │ │ ├── protocol/
│ │ │ │ │ ├── PeerAddressTest.java
│ │ │ │ │ ├── i2p/
│ │ │ │ │ │ └── I2pAddressTest.java
│ │ │ │ │ └── tor/
│ │ │ │ │ └── OnionAddressTest.java
│ │ │ │ ├── upnp/
│ │ │ │ │ ├── ControlPointTest.java
│ │ │ │ │ ├── DeviceTest.java
│ │ │ │ │ ├── PortMappingTest.java
│ │ │ │ │ ├── SoapTest.java
│ │ │ │ │ └── UPNPServiceTest.java
│ │ │ │ └── util/
│ │ │ │ └── NetworkModeTest.java
│ │ │ ├── service/
│ │ │ │ ├── CapabilityServiceTest.java
│ │ │ │ ├── ContactServiceTest.java
│ │ │ │ ├── ForumMessageServiceTest.java
│ │ │ │ ├── GeoIpServiceTest.java
│ │ │ │ ├── LocationServiceTest.java
│ │ │ │ ├── ProfileServiceTest.java
│ │ │ │ ├── QrCodeServiceTest.java
│ │ │ │ ├── ServiceRulesTest.java
│ │ │ │ ├── SettingsServiceTest.java
│ │ │ │ ├── UnHtmlServiceTest.java
│ │ │ │ ├── file/
│ │ │ │ │ └── FileServiceTest.java
│ │ │ │ └── shell/
│ │ │ │ ├── HistoryTest.java
│ │ │ │ └── ShellServiceTest.java
│ │ │ ├── util/
│ │ │ │ ├── OsUtilsTest.java
│ │ │ │ └── expression/
│ │ │ │ ├── ExpressionCriteriaTest.java
│ │ │ │ ├── ExpressionMapperTest.java
│ │ │ │ └── ExpressionTest.java
│ │ │ └── xrs/
│ │ │ ├── common/
│ │ │ │ └── SecurityKeyTest.java
│ │ │ ├── item/
│ │ │ │ ├── ItemHeaderTest.java
│ │ │ │ ├── ItemPriorityTest.java
│ │ │ │ └── ItemTest.java
│ │ │ ├── serialization/
│ │ │ │ ├── SerialAll.java
│ │ │ │ ├── SerialEnum.java
│ │ │ │ ├── SerialList.java
│ │ │ │ ├── SerialMap.java
│ │ │ │ ├── SerializerTest.java
│ │ │ │ ├── TlvImageSerializerTest.java
│ │ │ │ └── TlvUtilsTest.java
│ │ │ └── service/
│ │ │ ├── RsServiceInitPriorityTest.java
│ │ │ ├── RsServiceRulesTest.java
│ │ │ ├── bandwidth/
│ │ │ │ └── BandwidthUtilsTest.java
│ │ │ ├── chat/
│ │ │ │ ├── ChatFlagsTest.java
│ │ │ │ ├── ChatRoomEventTest.java
│ │ │ │ ├── ChatRoomServiceTest.java
│ │ │ │ ├── ChatRsServiceTest.java
│ │ │ │ └── RoomFlagsTest.java
│ │ │ ├── discovery/
│ │ │ │ ├── DiscoveryPgpListItemTest.java
│ │ │ │ └── DiscoveryRsServiceTest.java
│ │ │ ├── filetransfer/
│ │ │ │ ├── ChunkDistributorTest.java
│ │ │ │ ├── ChunkMapUtilsTest.java
│ │ │ │ ├── ChunkTest.java
│ │ │ │ ├── FileDownloadTest.java
│ │ │ │ ├── FileTransferAgentTest.java
│ │ │ │ └── FileUploadTest.java
│ │ │ ├── gxs/
│ │ │ │ ├── GxsRequestTypeTest.java
│ │ │ │ ├── GxsSignatureTest.java
│ │ │ │ ├── TransactionFlagsTest.java
│ │ │ │ ├── TransactionTest.java
│ │ │ │ └── item/
│ │ │ │ └── GxsSyncMessageRequestItemTest.java
│ │ │ ├── gxstunnel/
│ │ │ │ └── TunnelPeerInfoTest.java
│ │ │ ├── heartbeat/
│ │ │ │ └── HeartbeatTest.java
│ │ │ ├── identity/
│ │ │ │ ├── IdentityManagerTest.java
│ │ │ │ └── IdentityRsServiceTest.java
│ │ │ ├── rtt/
│ │ │ │ └── RttRsServiceTest.java
│ │ │ ├── status/
│ │ │ │ ├── IdleCheckerTest.java
│ │ │ │ ├── StatusRsServiceTest.java
│ │ │ │ └── StatusTest.java
│ │ │ └── turtle/
│ │ │ ├── HashBloomFilterTest.java
│ │ │ └── TurtleRsServiceTest.java
│ │ └── testutils/
│ │ ├── FakeHttpServer.java
│ │ └── ResourceUtils.java
│ └── resources/
│ ├── application-default.properties
│ └── upnp/
│ └── routers/
│ └── RT-AC87U.xml
├── build.gradle
├── common/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── io/
│ │ │ └── xeres/
│ │ │ └── common/
│ │ │ ├── AppName.java
│ │ │ ├── Features.java
│ │ │ ├── annotation/
│ │ │ │ └── RsDeprecated.java
│ │ │ ├── condition/
│ │ │ │ ├── OnLinuxCondition.java
│ │ │ │ ├── OnMacCondition.java
│ │ │ │ └── OnWindowsCondition.java
│ │ │ ├── dto/
│ │ │ │ ├── board/
│ │ │ │ │ ├── BoardGroupDTO.java
│ │ │ │ │ └── BoardMessageDTO.java
│ │ │ │ ├── channel/
│ │ │ │ │ ├── ChannelFileDTO.java
│ │ │ │ │ ├── ChannelGroupDTO.java
│ │ │ │ │ └── ChannelMessageDTO.java
│ │ │ │ ├── chat/
│ │ │ │ │ ├── ChatBacklogDTO.java
│ │ │ │ │ ├── ChatIdentityDTO.java
│ │ │ │ │ ├── ChatRoomBacklogDTO.java
│ │ │ │ │ ├── ChatRoomContextDTO.java
│ │ │ │ │ ├── ChatRoomDTO.java
│ │ │ │ │ └── ChatRoomsDTO.java
│ │ │ │ ├── connection/
│ │ │ │ │ └── ConnectionDTO.java
│ │ │ │ ├── forum/
│ │ │ │ │ ├── ForumGroupDTO.java
│ │ │ │ │ └── ForumMessageDTO.java
│ │ │ │ ├── identity/
│ │ │ │ │ ├── IdentityConstants.java
│ │ │ │ │ └── IdentityDTO.java
│ │ │ │ ├── location/
│ │ │ │ │ ├── LocationConstants.java
│ │ │ │ │ └── LocationDTO.java
│ │ │ │ ├── profile/
│ │ │ │ │ ├── ProfileConstants.java
│ │ │ │ │ └── ProfileDTO.java
│ │ │ │ ├── settings/
│ │ │ │ │ └── SettingsDTO.java
│ │ │ │ └── share/
│ │ │ │ ├── ShareConstants.java
│ │ │ │ └── ShareDTO.java
│ │ │ ├── events/
│ │ │ │ ├── ConnectWebSocketsEvent.java
│ │ │ │ ├── StartupEvent.java
│ │ │ │ └── SynchronousEvent.java
│ │ │ ├── file/
│ │ │ │ └── FileType.java
│ │ │ ├── geoip/
│ │ │ │ └── Country.java
│ │ │ ├── gxs/
│ │ │ │ └── GxsGroupConstants.java
│ │ │ ├── i18n/
│ │ │ │ ├── I18nEnum.java
│ │ │ │ └── I18nUtils.java
│ │ │ ├── id/
│ │ │ │ ├── GxsId.java
│ │ │ │ ├── Id.java
│ │ │ │ ├── Identifier.java
│ │ │ │ ├── LocationIdentifier.java
│ │ │ │ ├── MsgId.java
│ │ │ │ ├── ProfileFingerprint.java
│ │ │ │ └── Sha1Sum.java
│ │ │ ├── identity/
│ │ │ │ └── Type.java
│ │ │ ├── location/
│ │ │ │ └── Availability.java
│ │ │ ├── message/
│ │ │ │ ├── MessageHeaders.java
│ │ │ │ ├── MessagePath.java
│ │ │ │ ├── MessageType.java
│ │ │ │ ├── MessagingConfiguration.java
│ │ │ │ ├── chat/
│ │ │ │ │ ├── ChatAvatar.java
│ │ │ │ │ ├── ChatBacklog.java
│ │ │ │ │ ├── ChatConstants.java
│ │ │ │ │ ├── ChatMessage.java
│ │ │ │ │ ├── ChatRoomBacklog.java
│ │ │ │ │ ├── ChatRoomContext.java
│ │ │ │ │ ├── ChatRoomInfo.java
│ │ │ │ │ ├── ChatRoomInviteEvent.java
│ │ │ │ │ ├── ChatRoomLists.java
│ │ │ │ │ ├── ChatRoomMessage.java
│ │ │ │ │ ├── ChatRoomTimeoutEvent.java
│ │ │ │ │ ├── ChatRoomUser.java
│ │ │ │ │ ├── ChatRoomUserEvent.java
│ │ │ │ │ └── RoomType.java
│ │ │ │ └── voip/
│ │ │ │ ├── VoipAction.java
│ │ │ │ └── VoipMessage.java
│ │ │ ├── mui/
│ │ │ │ ├── MUI.java
│ │ │ │ ├── MUIScrollBar.java
│ │ │ │ ├── Shell.java
│ │ │ │ ├── ShellAction.java
│ │ │ │ └── ShellResult.java
│ │ │ ├── pgp/
│ │ │ │ └── Trust.java
│ │ │ ├── properties/
│ │ │ │ └── StartupProperties.java
│ │ │ ├── protocol/
│ │ │ │ ├── HostPort.java
│ │ │ │ ├── NetMode.java
│ │ │ │ ├── dns/
│ │ │ │ │ ├── DNS.java
│ │ │ │ │ ├── DnsRequest.java
│ │ │ │ │ └── DnsResponse.java
│ │ │ │ ├── i2p/
│ │ │ │ │ └── I2pAddress.java
│ │ │ │ ├── ip/
│ │ │ │ │ ├── IP.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── tor/
│ │ │ │ │ ├── OnionAddress.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── xrs/
│ │ │ │ └── RsServiceType.java
│ │ │ ├── rest/
│ │ │ │ ├── PathConfig.java
│ │ │ │ ├── board/
│ │ │ │ │ └── UpdateBoardMessageReadRequest.java
│ │ │ │ ├── channel/
│ │ │ │ │ └── UpdateChannelMessageReadRequest.java
│ │ │ │ ├── chat/
│ │ │ │ │ ├── ChatRoomVisibility.java
│ │ │ │ │ ├── CreateChatRoomRequest.java
│ │ │ │ │ ├── DistantChatRequest.java
│ │ │ │ │ └── InviteToChatRoomRequest.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── Capabilities.java
│ │ │ │ │ ├── HostnameResponse.java
│ │ │ │ │ ├── ImportRsFriendsResponse.java
│ │ │ │ │ ├── IpAddressResponse.java
│ │ │ │ │ ├── OwnIdentityRequest.java
│ │ │ │ │ ├── OwnLocationRequest.java
│ │ │ │ │ ├── OwnProfileRequest.java
│ │ │ │ │ ├── UsernameResponse.java
│ │ │ │ │ └── VerifyUpdateRequest.java
│ │ │ │ ├── connection/
│ │ │ │ │ └── ConnectionRequest.java
│ │ │ │ ├── contact/
│ │ │ │ │ └── Contact.java
│ │ │ │ ├── file/
│ │ │ │ │ ├── AddDownloadRequest.java
│ │ │ │ │ ├── FileDownloadRequest.java
│ │ │ │ │ ├── FileProgress.java
│ │ │ │ │ ├── FileSearchRequest.java
│ │ │ │ │ └── FileSearchResponse.java
│ │ │ │ ├── forum/
│ │ │ │ │ ├── CreateForumMessageRequest.java
│ │ │ │ │ ├── CreateOrUpdateForumGroupRequest.java
│ │ │ │ │ ├── ForumPostRequest.java
│ │ │ │ │ └── UpdateForumMessageReadRequest.java
│ │ │ │ ├── geoip/
│ │ │ │ │ └── CountryResponse.java
│ │ │ │ ├── location/
│ │ │ │ │ └── RSIdResponse.java
│ │ │ │ ├── notification/
│ │ │ │ │ ├── Notification.java
│ │ │ │ │ ├── availability/
│ │ │ │ │ │ ├── AvailabilityChange.java
│ │ │ │ │ │ └── AvailabilityNotification.java
│ │ │ │ │ ├── board/
│ │ │ │ │ │ ├── AddOrUpdateBoardGroups.java
│ │ │ │ │ │ ├── AddOrUpdateBoardMessages.java
│ │ │ │ │ │ ├── BoardNotification.java
│ │ │ │ │ │ ├── SetBoardGroupMessagesReadState.java
│ │ │ │ │ │ └── SetBoardMessageReadState.java
│ │ │ │ │ ├── channel/
│ │ │ │ │ │ ├── AddOrUpdateChannelGroups.java
│ │ │ │ │ │ ├── AddOrUpdateChannelMessages.java
│ │ │ │ │ │ ├── ChannelNotification.java
│ │ │ │ │ │ ├── SetChannelGroupMessagesReadState.java
│ │ │ │ │ │ └── SetChannelMessageReadState.java
│ │ │ │ │ ├── contact/
│ │ │ │ │ │ ├── AddOrUpdateContacts.java
│ │ │ │ │ │ ├── ContactNotification.java
│ │ │ │ │ │ └── RemoveContacts.java
│ │ │ │ │ ├── file/
│ │ │ │ │ │ ├── FileNotification.java
│ │ │ │ │ │ ├── FileNotificationAction.java
│ │ │ │ │ │ ├── FileSearchNotification.java
│ │ │ │ │ │ └── FileTrendNotification.java
│ │ │ │ │ ├── forum/
│ │ │ │ │ │ ├── AddOrUpdateForumGroups.java
│ │ │ │ │ │ ├── AddOrUpdateForumMessages.java
│ │ │ │ │ │ ├── ForumNotification.java
│ │ │ │ │ │ ├── SetForumGroupMessagesReadState.java
│ │ │ │ │ │ └── SetForumMessageReadState.java
│ │ │ │ │ └── status/
│ │ │ │ │ ├── DhtInfo.java
│ │ │ │ │ ├── DhtStatus.java
│ │ │ │ │ ├── NatStatus.java
│ │ │ │ │ └── StatusNotification.java
│ │ │ │ ├── profile/
│ │ │ │ │ ├── ProfileKeyAttributes.java
│ │ │ │ │ └── RsIdRequest.java
│ │ │ │ ├── share/
│ │ │ │ │ ├── TemporaryShareRequest.java
│ │ │ │ │ ├── TemporaryShareResponse.java
│ │ │ │ │ └── UpdateShareRequest.java
│ │ │ │ └── statistics/
│ │ │ │ ├── DataCounterPeer.java
│ │ │ │ ├── DataCounterStatisticsResponse.java
│ │ │ │ ├── RttPeer.java
│ │ │ │ ├── RttStatisticsResponse.java
│ │ │ │ └── TurtleStatisticsResponse.java
│ │ │ ├── rsid/
│ │ │ │ └── Type.java
│ │ │ ├── tray/
│ │ │ │ └── TrayNotificationType.java
│ │ │ └── util/
│ │ │ ├── ByteUnitUtils.java
│ │ │ ├── DebugUtils.java
│ │ │ ├── ExecutorUtils.java
│ │ │ ├── FileNameUtils.java
│ │ │ ├── NoSuppressedRunnable.java
│ │ │ ├── OsUtils.java
│ │ │ ├── RemoteUtils.java
│ │ │ ├── SecureRandomUtils.java
│ │ │ ├── ThreadUtils.java
│ │ │ └── image/
│ │ │ ├── ImageUtils.java
│ │ │ ├── JpegUtils.java
│ │ │ └── PngUtils.java
│ │ ├── javadoc/
│ │ │ └── overview.html
│ │ └── resources/
│ │ └── i18n/
│ │ ├── messages.properties
│ │ ├── messages_es.properties
│ │ ├── messages_fr.properties
│ │ ├── messages_ru.properties
│ │ └── messages_zh.properties
│ ├── test/
│ │ └── java/
│ │ └── io/
│ │ └── xeres/
│ │ └── common/
│ │ ├── AppNameTest.java
│ │ ├── CommonCodingRulesTest.java
│ │ ├── file/
│ │ │ └── FileTypeTest.java
│ │ ├── id/
│ │ │ └── IdTest.java
│ │ ├── identity/
│ │ │ └── TypeTest.java
│ │ ├── pgp/
│ │ │ └── TrustTest.java
│ │ ├── protocol/
│ │ │ ├── HostPortTest.java
│ │ │ ├── NetModeTest.java
│ │ │ ├── dns/
│ │ │ │ └── DNSTest.java
│ │ │ └── ip/
│ │ │ └── IPTest.java
│ │ ├── rest/
│ │ │ └── notification/
│ │ │ └── StatusNotificationTest.java
│ │ └── util/
│ │ ├── ByteUnitUtilsTest.java
│ │ ├── FileNameUtilsTest.java
│ │ ├── SecureRandomUtilsTest.java
│ │ └── image/
│ │ └── ImageUtilsTest.java
│ └── testFixtures/
│ └── java/
│ └── io/
│ └── xeres/
│ ├── common/
│ │ └── dto/
│ │ ├── chat/
│ │ │ ├── ChatIdentityDTOFakes.java
│ │ │ ├── ChatRoomContextDTOFakes.java
│ │ │ ├── ChatRoomDTOFakes.java
│ │ │ └── ChatRoomsDTOFakes.java
│ │ ├── connection/
│ │ │ └── ConnectionDTOFakes.java
│ │ ├── identity/
│ │ │ └── IdentityDTOFakes.java
│ │ ├── location/
│ │ │ └── LocationDTOFakes.java
│ │ ├── profile/
│ │ │ └── ProfileDTOFakes.java
│ │ ├── settings/
│ │ │ └── SettingsDTOFakes.java
│ │ └── share/
│ │ └── ShareDTOFakes.java
│ └── testutils/
│ ├── BooleanFakes.java
│ ├── EnumFakes.java
│ ├── IdFakes.java
│ ├── Sha1SumFakes.java
│ ├── StringFakes.java
│ ├── TestUtils.java
│ └── TimeFakes.java
├── docker-compose.yml
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── icon.icns
├── qodana.yaml
├── scripts/
│ ├── api/
│ │ └── user.js
│ ├── bot/
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── bot.py
│ │ └── requirements.txt
│ └── helper/
│ └── i18n_find_dupe.py
├── settings.gradle
├── transifex.yml
└── ui/
├── build.gradle
└── src/
├── main/
│ ├── java/
│ │ └── io/
│ │ └── xeres/
│ │ └── ui/
│ │ ├── JavaFxApplication.java
│ │ ├── PrimaryStageInitializer.java
│ │ ├── UiStarter.java
│ │ ├── client/
│ │ │ ├── BoardClient.java
│ │ │ ├── ChannelClient.java
│ │ │ ├── ChatClient.java
│ │ │ ├── ConfigClient.java
│ │ │ ├── ConnectionClient.java
│ │ │ ├── ContactClient.java
│ │ │ ├── FileClient.java
│ │ │ ├── ForumClient.java
│ │ │ ├── GeneralClient.java
│ │ │ ├── GeoIpClient.java
│ │ │ ├── GxsGroupClient.java
│ │ │ ├── GxsMessageClient.java
│ │ │ ├── IdentityClient.java
│ │ │ ├── LocationClient.java
│ │ │ ├── NotificationClient.java
│ │ │ ├── PaginatedResponse.java
│ │ │ ├── ProfileClient.java
│ │ │ ├── SettingsClient.java
│ │ │ ├── ShareClient.java
│ │ │ ├── StatisticsClient.java
│ │ │ ├── message/
│ │ │ │ ├── BroadcastChatFrameHandler.java
│ │ │ │ ├── ChatRoomFrameHandler.java
│ │ │ │ ├── DistantChatFrameHandler.java
│ │ │ │ ├── MessageClient.java
│ │ │ │ ├── PendingSubscription.java
│ │ │ │ ├── PrivateChatFrameHandler.java
│ │ │ │ ├── SessionHandler.java
│ │ │ │ └── VoipFrameHandler.java
│ │ │ ├── preview/
│ │ │ │ ├── OEmbedResponse.java
│ │ │ │ ├── PreviewClient.java
│ │ │ │ ├── PreviewResponse.java
│ │ │ │ └── SizeLimitingCollector.java
│ │ │ └── update/
│ │ │ ├── ReleaseAsset.java
│ │ │ ├── ReleaseResponse.java
│ │ │ ├── UpdateClient.java
│ │ │ └── UpdateProgress.java
│ │ ├── configuration/
│ │ │ ├── I18nConfiguration.java
│ │ │ └── WebClientConfiguration.java
│ │ ├── controller/
│ │ │ ├── Controller.java
│ │ │ ├── MainWindowController.java
│ │ │ ├── TabActivation.java
│ │ │ ├── WindowController.java
│ │ │ ├── about/
│ │ │ │ └── AboutWindowController.java
│ │ │ ├── account/
│ │ │ │ └── AccountCreationWindowController.java
│ │ │ ├── board/
│ │ │ │ ├── BoardGroupCell.java
│ │ │ │ ├── BoardGroupWindowController.java
│ │ │ │ ├── BoardMessageCell.java
│ │ │ │ ├── BoardMessageWindowController.java
│ │ │ │ └── BoardViewController.java
│ │ │ ├── channel/
│ │ │ │ ├── ChannelFileSizeCell.java
│ │ │ │ ├── ChannelGroupCell.java
│ │ │ │ ├── ChannelGroupWindowController.java
│ │ │ │ ├── ChannelMessageCell.java
│ │ │ │ ├── ChannelMessageRow.java
│ │ │ │ ├── ChannelMessageWindowController.java
│ │ │ │ └── ChannelViewController.java
│ │ │ ├── chat/
│ │ │ │ ├── ChatListCell.java
│ │ │ │ ├── ChatListDragSelection.java
│ │ │ │ ├── ChatListView.java
│ │ │ │ ├── ChatListViewContextMenu.java
│ │ │ │ ├── ChatRoomCell.java
│ │ │ │ ├── ChatRoomCreationWindowController.java
│ │ │ │ ├── ChatRoomInfoController.java
│ │ │ │ ├── ChatRoomInvitationWindowController.java
│ │ │ │ ├── ChatRoomUser.java
│ │ │ │ ├── ChatUserCell.java
│ │ │ │ ├── ChatViewController.java
│ │ │ │ ├── PeerHolder.java
│ │ │ │ └── RoomHolder.java
│ │ │ ├── common/
│ │ │ │ ├── GxsGroup.java
│ │ │ │ ├── GxsGroupCellCount.java
│ │ │ │ ├── GxsGroupTreeTableAction.java
│ │ │ │ ├── GxsGroupTreeTableView.java
│ │ │ │ └── GxsMessage.java
│ │ │ ├── contact/
│ │ │ │ ├── AvailabilityCellStatus.java
│ │ │ │ ├── AvailabilityCellUtil.java
│ │ │ │ ├── AvailabilityTreeCellStatus.java
│ │ │ │ ├── ContactCellName.java
│ │ │ │ ├── ContactFilter.java
│ │ │ │ ├── ContactViewController.java
│ │ │ │ └── LocationRow.java
│ │ │ ├── debug/
│ │ │ │ └── DebugRequesterWindowController.java
│ │ │ ├── file/
│ │ │ │ ├── FileAddDownloadViewWindowController.java
│ │ │ │ ├── FileDownloadViewController.java
│ │ │ │ ├── FileMainController.java
│ │ │ │ ├── FileProgressDisplay.java
│ │ │ │ ├── FileProgressSizeCell.java
│ │ │ │ ├── FileResult.java
│ │ │ │ ├── FileResultNameCell.java
│ │ │ │ ├── FileResultSizeCell.java
│ │ │ │ ├── FileResultView.java
│ │ │ │ ├── FileSearchViewController.java
│ │ │ │ ├── FileTrendViewController.java
│ │ │ │ ├── FileUploadViewController.java
│ │ │ │ ├── TimeCell.java
│ │ │ │ └── TrendResult.java
│ │ │ ├── forum/
│ │ │ │ ├── DateCell.java
│ │ │ │ ├── ForumCell.java
│ │ │ │ ├── ForumCellAuthor.java
│ │ │ │ ├── ForumEditorWindowController.java
│ │ │ │ ├── ForumGroupWindowController.java
│ │ │ │ ├── ForumMessageCell.java
│ │ │ │ ├── ForumViewController.java
│ │ │ │ └── MessageVersion.java
│ │ │ ├── help/
│ │ │ │ ├── HelpWindowController.java
│ │ │ │ ├── IndexCell.java
│ │ │ │ └── Navigator.java
│ │ │ ├── id/
│ │ │ │ ├── AddRsIdWindowController.java
│ │ │ │ ├── AddressCell.java
│ │ │ │ ├── AddressConverter.java
│ │ │ │ ├── AddressCountry.java
│ │ │ │ └── FlagUtils.java
│ │ │ ├── messaging/
│ │ │ │ ├── BroadcastWindowController.java
│ │ │ │ ├── Destination.java
│ │ │ │ └── MessagingWindowController.java
│ │ │ ├── qrcode/
│ │ │ │ ├── CameraWindowController.java
│ │ │ │ ├── QrCodeWindowController.java
│ │ │ │ └── QrPrintController.java
│ │ │ ├── settings/
│ │ │ │ ├── SettingsCell.java
│ │ │ │ ├── SettingsController.java
│ │ │ │ ├── SettingsGeneralController.java
│ │ │ │ ├── SettingsGroup.java
│ │ │ │ ├── SettingsNetworksController.java
│ │ │ │ ├── SettingsNotificationController.java
│ │ │ │ ├── SettingsRemoteController.java
│ │ │ │ ├── SettingsSoundController.java
│ │ │ │ ├── SettingsTransferController.java
│ │ │ │ ├── SettingsWindowController.java
│ │ │ │ └── ThemeCell.java
│ │ │ ├── share/
│ │ │ │ ├── ShareWindowController.java
│ │ │ │ └── TrustConverter.java
│ │ │ ├── statistics/
│ │ │ │ ├── StatisticsDataCounterController.java
│ │ │ │ ├── StatisticsMainWindowController.java
│ │ │ │ ├── StatisticsRttController.java
│ │ │ │ └── StatisticsTurtleController.java
│ │ │ └── voip/
│ │ │ ├── TimeCounter.java
│ │ │ └── VoipWindowController.java
│ │ ├── custom/
│ │ │ ├── DelayedAction.java
│ │ │ ├── DelayedTooltip.java
│ │ │ ├── DisclosedHyperlink.java
│ │ │ ├── EditorView.java
│ │ │ ├── ImageSelectorView.java
│ │ │ ├── InfoView.java
│ │ │ ├── InputArea.java
│ │ │ ├── InputAreaGroup.java
│ │ │ ├── NullSelectionModel.java
│ │ │ ├── ProgressPane.java
│ │ │ ├── ReadOnlyTextField.java
│ │ │ ├── ResizeableImageView.java
│ │ │ ├── StickerView.java
│ │ │ ├── TypingNotificationView.java
│ │ │ ├── WaveDotsView.java
│ │ │ ├── alias/
│ │ │ │ ├── AliasCell.java
│ │ │ │ ├── AliasView.java
│ │ │ │ └── PopupAlias.java
│ │ │ ├── asyncimage/
│ │ │ │ ├── AsyncImageView.java
│ │ │ │ ├── ContactImageView.java
│ │ │ │ ├── ImageCache.java
│ │ │ │ └── PlaceholderImageView.java
│ │ │ ├── event/
│ │ │ │ ├── FileSelectedEvent.java
│ │ │ │ ├── ImageSelectedEvent.java
│ │ │ │ └── StickerSelectedEvent.java
│ │ │ └── led/
│ │ │ ├── LedControl.java
│ │ │ ├── LedSkin.java
│ │ │ └── LedStatus.java
│ │ ├── event/
│ │ │ ├── OpenUriEvent.java
│ │ │ ├── StageReadyEvent.java
│ │ │ └── UnreadEvent.java
│ │ ├── model/
│ │ │ ├── board/
│ │ │ │ ├── BoardGroup.java
│ │ │ │ ├── BoardMapper.java
│ │ │ │ └── BoardMessage.java
│ │ │ ├── channel/
│ │ │ │ ├── ChannelFile.java
│ │ │ │ ├── ChannelGroup.java
│ │ │ │ ├── ChannelMapper.java
│ │ │ │ └── ChannelMessage.java
│ │ │ ├── chat/
│ │ │ │ └── ChatMapper.java
│ │ │ ├── connection/
│ │ │ │ ├── Connection.java
│ │ │ │ └── ConnectionMapper.java
│ │ │ ├── forum/
│ │ │ │ ├── ForumGroup.java
│ │ │ │ ├── ForumMapper.java
│ │ │ │ └── ForumMessage.java
│ │ │ ├── identity/
│ │ │ │ ├── Identity.java
│ │ │ │ └── IdentityMapper.java
│ │ │ ├── location/
│ │ │ │ ├── Location.java
│ │ │ │ └── LocationMapper.java
│ │ │ ├── profile/
│ │ │ │ ├── Profile.java
│ │ │ │ └── ProfileMapper.java
│ │ │ ├── settings/
│ │ │ │ ├── Settings.java
│ │ │ │ └── SettingsMapper.java
│ │ │ └── share/
│ │ │ ├── Share.java
│ │ │ └── ShareMapper.java
│ │ ├── properties/
│ │ │ └── UiClientProperties.java
│ │ └── support/
│ │ ├── ImageCacheService.java
│ │ ├── chat/
│ │ │ ├── AliasEntry.java
│ │ │ ├── ChatAction.java
│ │ │ ├── ChatCommand.java
│ │ │ ├── ChatLine.java
│ │ │ ├── ChatParser.java
│ │ │ ├── ColorGenerator.java
│ │ │ └── NicknameCompleter.java
│ │ ├── clipboard/
│ │ │ ├── ClipboardUtils.java
│ │ │ └── ImageSelection.java
│ │ ├── contact/
│ │ │ └── ContactUtils.java
│ │ ├── contentline/
│ │ │ ├── Content.java
│ │ │ ├── ContentCode.java
│ │ │ ├── ContentEmoji.java
│ │ │ ├── ContentEmphasis.java
│ │ │ ├── ContentHeader.java
│ │ │ ├── ContentHorizontalRule.java
│ │ │ ├── ContentImage.java
│ │ │ ├── ContentStrikethrough.java
│ │ │ ├── ContentText.java
│ │ │ ├── ContentUri.java
│ │ │ └── ContentUriPreview.java
│ │ ├── contextmenu/
│ │ │ └── XContextMenu.java
│ │ ├── emoji/
│ │ │ ├── EmojiService.java
│ │ │ └── RsEmojiAlias.java
│ │ ├── loader/
│ │ │ ├── FetchMode.java
│ │ │ ├── FetchRequest.java
│ │ │ ├── InfiniteScrollable.java
│ │ │ ├── InfiniteTreeListView.java
│ │ │ ├── InfiniteVirtualizedScrollPane.java
│ │ │ ├── OnDemandLoader.java
│ │ │ └── OnDemandLoaderAction.java
│ │ ├── markdown/
│ │ │ ├── AltTextVisitor.java
│ │ │ ├── ContentRenderer.java
│ │ │ ├── ContentVisitor.java
│ │ │ ├── MarkdownService.java
│ │ │ └── UriAction.java
│ │ ├── notification/
│ │ │ └── NotificationSettings.java
│ │ ├── oembed/
│ │ │ ├── OEmbedProvider.java
│ │ │ └── OEmbedService.java
│ │ ├── preference/
│ │ │ └── PreferenceUtils.java
│ │ ├── sound/
│ │ │ ├── SoundPlayerService.java
│ │ │ └── SoundSettings.java
│ │ ├── splash/
│ │ │ └── SplashService.java
│ │ ├── theme/
│ │ │ ├── AppTheme.java
│ │ │ └── AppThemeManager.java
│ │ ├── tray/
│ │ │ └── TrayService.java
│ │ ├── unread/
│ │ │ └── UnreadService.java
│ │ ├── updater/
│ │ │ ├── UpdateService.java
│ │ │ ├── Version.java
│ │ │ ├── VersionCheckTask.java
│ │ │ └── VersionChecker.java
│ │ ├── uri/
│ │ │ ├── AbstractUriFactory.java
│ │ │ ├── BoardUri.java
│ │ │ ├── BoardUriFactory.java
│ │ │ ├── CertificateUri.java
│ │ │ ├── CertificateUriFactory.java
│ │ │ ├── ChannelUri.java
│ │ │ ├── ChannelUriFactory.java
│ │ │ ├── ChatRoomUri.java
│ │ │ ├── ChatRoomUriFactory.java
│ │ │ ├── CollectionUri.java
│ │ │ ├── CollectionUriFactory.java
│ │ │ ├── ExternalUri.java
│ │ │ ├── ExternalUriFactory.java
│ │ │ ├── FileUri.java
│ │ │ ├── FileUriFactory.java
│ │ │ ├── ForumUri.java
│ │ │ ├── ForumUriFactory.java
│ │ │ ├── IdentityUri.java
│ │ │ ├── IdentityUriFactory.java
│ │ │ ├── MessageUri.java
│ │ │ ├── MessageUriFactory.java
│ │ │ ├── ProfileUri.java
│ │ │ ├── ProfileUriFactory.java
│ │ │ ├── SearchUri.java
│ │ │ ├── SearchUriFactory.java
│ │ │ ├── Uri.java
│ │ │ ├── UriFactory.java
│ │ │ └── UriService.java
│ │ ├── util/
│ │ │ ├── ChooserUtils.java
│ │ │ ├── ClientUtils.java
│ │ │ ├── DateUtils.java
│ │ │ ├── ImageViewUtils.java
│ │ │ ├── PublicKeyUtils.java
│ │ │ ├── Range.java
│ │ │ ├── SmileyUtils.java
│ │ │ ├── TextFieldUtils.java
│ │ │ ├── TextFlowDragSelection.java
│ │ │ ├── TextFlowUtils.java
│ │ │ ├── TextInputControlUtils.java
│ │ │ ├── TextSelectRange.java
│ │ │ ├── TooltipUtils.java
│ │ │ ├── UiUtils.java
│ │ │ └── UriUtils.java
│ │ └── window/
│ │ ├── UiNativeWindow.java
│ │ ├── WindowBorder.java
│ │ ├── WindowManager.java
│ │ └── WindowResizer.java
│ ├── javadoc/
│ │ └── overview.html
│ └── resources/
│ ├── help/
│ │ ├── en/
│ │ │ ├── 00.Index.md
│ │ │ ├── 01.Quick Setup.md
│ │ │ ├── 02.Network.md
│ │ │ ├── 03.Markdown.md
│ │ │ ├── 04.Emojis.md
│ │ │ ├── 05.Startup arguments.md
│ │ │ └── 06.Links.md
│ │ ├── es/
│ │ │ ├── 00.Index.md
│ │ │ ├── 01.Configuración rápida.md
│ │ │ ├── 02.Red.md
│ │ │ ├── 04.Emojis.md
│ │ │ ├── 05.Argumentos de inicio.md
│ │ │ └── 06.Enlaces.md
│ │ ├── fr/
│ │ │ ├── 00.Index.md
│ │ │ ├── 01.Configuration rapide.md
│ │ │ ├── 02.Réseau.md
│ │ │ ├── 04.Emojis.md
│ │ │ ├── 05.Arguments de démarrage.md
│ │ │ └── 06.Liens.md
│ │ ├── ru/
│ │ │ ├── 00.Index.md
│ │ │ ├── 01.Быстрая настройка.md
│ │ │ ├── 02.Сеть.md
│ │ │ ├── 04.Эмодзи.md
│ │ │ ├── 05.Аргументы запуска.md
│ │ │ └── 06.Ссылки.md
│ │ └── zh/
│ │ ├── 00.Index.md
│ │ ├── 01.快速设置.md
│ │ ├── 02.网络.md
│ │ ├── 04.表情符号.md
│ │ ├── 05.启动参数.md
│ │ └── 06.链接
│ ├── oembed-providers.json
│ ├── retroshare-emojis.json
│ └── view/
│ ├── about/
│ │ └── about.fxml
│ ├── account/
│ │ └── account_creation.fxml
│ ├── board/
│ │ ├── board_group_view.fxml
│ │ ├── board_message_view.fxml
│ │ ├── board_view.fxml
│ │ └── message_cell.fxml
│ ├── channel/
│ │ ├── channel_group_view.fxml
│ │ ├── channel_message_view.fxml
│ │ ├── channel_view.fxml
│ │ └── message_cell.fxml
│ ├── chat/
│ │ ├── chat_roominfo.fxml
│ │ ├── chat_view.fxml
│ │ ├── chatroom_create.fxml
│ │ └── chatroom_invite.fxml
│ ├── contact/
│ │ └── contact_view.fxml
│ ├── custom/
│ │ ├── alias_view.fxml
│ │ ├── editor_view.fxml
│ │ ├── file_results_view.fxml
│ │ ├── gxs_group_tree_table_view.fxml
│ │ ├── image_selector_view.fxml
│ │ ├── info_view.fxml
│ │ ├── input_area_group.fxml
│ │ ├── sticker_view.fxml
│ │ ├── typing_notification_view.fxml
│ │ └── wave_dots_view.fxml
│ ├── debug/
│ │ └── debug_requester_view.fxml
│ ├── default.css
│ ├── file/
│ │ ├── add_download.fxml
│ │ ├── download.fxml
│ │ ├── main.fxml
│ │ ├── search.fxml
│ │ ├── share.fxml
│ │ ├── trend.fxml
│ │ └── upload.fxml
│ ├── forum/
│ │ ├── forum_editor_view.fxml
│ │ ├── forum_group_view.fxml
│ │ └── forum_view.fxml
│ ├── help/
│ │ └── help.fxml
│ ├── id/
│ │ └── rsid_add.fxml
│ ├── linux.css
│ ├── mac.css
│ ├── main.fxml
│ ├── messaging/
│ │ ├── broadcast.fxml
│ │ └── messaging.fxml
│ ├── printer.css
│ ├── qrcode/
│ │ ├── camera.fxml
│ │ ├── qrcode.fxml
│ │ └── qrprint.fxml
│ ├── settings/
│ │ ├── settings.fxml
│ │ ├── settings_general.fxml
│ │ ├── settings_networks.fxml
│ │ ├── settings_notifications.fxml
│ │ ├── settings_remote.fxml
│ │ ├── settings_sound.fxml
│ │ └── settings_transfer.fxml
│ ├── statistics/
│ │ ├── datacounter.fxml
│ │ ├── main.fxml
│ │ ├── rtt.fxml
│ │ └── turtle.fxml
│ ├── voip/
│ │ └── voip.fxml
│ └── windows.css
└── test/
└── java/
└── io/
└── xeres/
└── ui/
├── FXTest.java
├── UiCodingRulesTest.java
├── client/
│ └── PaginatedResponseTest.java
├── controller/
│ ├── about/
│ │ └── AboutWindowControllerTest.java
│ ├── account/
│ │ └── AccountCreationWindowControllerTest.java
│ ├── chat/
│ │ ├── ChatRoomCreationWindowControllerTest.java
│ │ ├── ChatRoomInvitationWindowControllerTest.java
│ │ └── ChatViewControllerTest.java
│ ├── contact/
│ │ └── ContactViewControllerTest.java
│ ├── help/
│ │ ├── HelpWindowControllerTest.java
│ │ └── NavigatorTest.java
│ ├── id/
│ │ └── AddRsIdWindowControllerTest.java
│ ├── messaging/
│ │ ├── BroadcastWindowControllerTest.java
│ │ └── MessagingWindowControllerTest.java
│ ├── qrcode/
│ │ └── QrCodeWindowControllerTest.java
│ └── share/
│ └── ShareWindowControllerTest.java
├── custom/
│ ├── AsyncImageViewTest.java
│ └── EditorViewTest.java
├── model/
│ ├── chat/
│ │ └── ChatMapperTest.java
│ ├── connection/
│ │ └── ConnectionMapperTest.java
│ ├── identity/
│ │ └── IdentityMapperTest.java
│ ├── location/
│ │ └── LocationMapperTest.java
│ ├── profile/
│ │ └── ProfileMapperTest.java
│ ├── settings/
│ │ └── SettingsMapperTest.java
│ └── share/
│ └── ShareMapperTest.java
└── support/
├── chat/
│ ├── ChatActionTest.java
│ ├── ChatParserTest.java
│ ├── ColorGeneratorTest.java
│ └── NicknameCompleterTest.java
├── emoji/
│ └── EmojiServiceTest.java
├── markdown/
│ └── MarkdownServiceTest.java
├── uri/
│ ├── BoardUriFactoryTest.java
│ ├── CertificateUriFactoryTest.java
│ ├── FileUriFactoryTest.java
│ └── UriFactoryUtils.java
└── util/
├── ImageViewUtilsTest.java
├── RangeTest.java
├── SmileyUtilsTest.java
├── TextInputControlUtilsTest.java
├── UiUtilsTest.java
└── UriUtilsTest.java
================================================
FILE CONTENTS
================================================
================================================
FILE: .agents/skills/archunit-rules/SKILL.md
================================================
---
name: archunit-rules
description: ArchUnit architecture rules enforced in Xeres including common module rules (logging, utility classes), app module rules (no field injection, RsService naming), and UI module rules (WindowController naming).
---
# ArchUnit Rules for Xeres
Architecture rules are enforced via ArchUnit tests in `common/src/test/` and `common/src/testFixtures/`.
## Running Rules
```bash
./gradlew test --tests "*CodingRulesTest"
```
## Common Module Rules (`CommonCodingRulesTest`)
### Logging
- No `java.util.logging` allowed
- Use SLF4J only
### Logger Declaration
```java
private static final Logger log; // Correct
Logger logger; // Wrong
```
### Utility Classes
```java
public final class FooUtils
{ // Correct
private FooUtils()
{
throw new UnsupportedOperationException("Utility class");
}
}
```
### Identifier Classes
Must have `public static final int LENGTH`:
```java
public class ProfileIdentifier extends Identifier
{
public static final int LENGTH = 32;
}
```
## App Module Rules (`AppCodingRulesTest`)
### No Field Injection
```java
// Allowed
private final ProfileService profileService;
public Service(ProfileService profileService)
{ ...}
// Forbidden
@Autowired
private ProfileService profileService;
```
### RsService Naming
Service subclasses must end with `RsService`:
```java
public class AvatarRsService extends RsService
{
} // Correct
public class AvatarService extends RsService
{
} // Wrong
```
### JPA Entities
Must have public or protected no-arg constructor:
```java
@Entity
public class Profile
{
protected Profile() { } // Required
}
```
### Item Classes
- Public no-arg constructor
- `clone()` method implemented
- Meaningful `toString()` method
### No UI Access
`app` module cannot access `ui` module packages:
```java
noClasses().
that().
resideInPackage("io.xeres.app..")
.
should().
accessClassesThat().
resideInPackage("io.xeres.ui..")
```
## UI Module Rules (`UiCodingRulesTest`)
### WindowController Naming
```java
public class SettingsWindowController
{
} // Correct
public class SettingsController
{
} // Wrong
```
### No FileChooser Initial Directory
Use `ChooserUtils` instead:
```java
// Forbidden
fileChooser.setInitialDirectory(path);
// Use instead
ChooserUtils.
setInitialDirectory(fileChooser, path);
```
### No Field Injection
Same rule as app module.
================================================
FILE: .agents/skills/crypto/SKILL.md
================================================
---
name: crypto
description: Cryptography patterns for Xeres including PGP operations, key generation, and hash functions with best practices.
---
# Cryptography Patterns for Xeres
## JCE/JCA and BouncyCastle Usage
Xeres uses JCE/JCA and BouncyCastle for cryptographic operations. Always use the registered providers.
## Common Patterns
### OpenPGP Operations
```java
import org.bouncycastle.openpgp.*;
PGPSecretKeyRingCollection secretKeys = ...
PGPPublicKeyRingCollection publicKeys = ...
// Encrypt
PGPEncryptedDataGenerator encryptedDataGenerator = new PGPEncryptedDataGenerator(
new JcePGPDataEncryptorBuilder(PGPEncryptedData.CAST5)
.setWithIntegrityPacket(true)
.setSecureRandom(new SecureRandom())
.useInsecureRandom() // Only for testing
);
// Decrypt
PGPPrivateKey privateKey = secretKeys.getSecretKey(keyId)
.extractPrivateKey(new JcePBESecretKeyDecryptorBuilder()
.setProvider("BC")
.build(passphrase.toCharArray()));
```
### Key Generation
```java
import org.bouncycastle.bcpg.*;
import org.bouncycastle.openpgp.*;
var keyRingGenerator = new PGPKeyRingGenerator(
V3PGPSignature.POSITIVE_CERTIFICATION,
new PGPSignatureSubpacketGenerator(),
algorithm,
encryptionKey,
creationTime,
"User ID",
symmetricKeyEncryption,
hashedGen,
unhashedGen,
new SecureRandom(),
"BC"
);
```
### Hash Functions
```java
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.security.MessageDigest;
Security.addProvider(new BouncyCastleProvider());
MessageDigest digest = MessageDigest.getInstance("SHA-256", "BC");
byte[] hash = digest.digest(data);
```
## Best Practices
1. Use the `SecureRandomUtils` class for all random operations
2. Prefer JCA/JCE, otherwise use BouncyCastle
3. Use constant-time comparisons for secrets
4. Clear sensitive data from memory when done
5. Use appropriate key sizes (RSA 2048+)
## Identifier Classes
Cryptographic identifiers extend `Identifier`:
```java
public class RsPkIdentifier extends Identifier
{
public static final int LENGTH = 16;
}
```
================================================
FILE: .agents/skills/dto-mappers/SKILL.md
================================================
---
name: dto-mappers
description: DTO and mapper patterns for Xeres using Java records, canonical constructors with validation, and static mapper utility classes.
---
# DTO and Mapper Patterns for Xeres
## DTOs as Records (Java 21+)
Use Java records for immutable DTOs:
```java
public record ProfileDTO(
long id,
@NotNull @Size String name,
String pgpIdentifier,
Instant created,
byte[] pgpFingerprint,
byte[] pgpPublicKeyData,
boolean accepted,
Trust trust,
@JsonInclude(NON_EMPTY) List<LocationDTO> locations
)
{
public ProfileDTO
{
if (locations == null) locations = new ArrayList<>();
}
}
```
## Canonical Constructor with Validation
```java
public record ProfileDTO(...)
{
public ProfileDTO
{
Objects.requireNonNull(name, "Name must not be null");
if (locations == null)
{
locations = new ArrayList<>();
}
locations = List.copyOf(locations); // Make immutable
}
}
```
## Mapper Pattern
Static utility class with mapping methods:
```java
public final class ProfileMapper
{
private ProfileMapper()
{
throw new UnsupportedOperationException("Utility class");
}
public static ProfileDTO toDTO(Profile profile)
{
if (profile == null)
{
return null;
}
return new ProfileDTO(
profile.getId(),
profile.getName(),
// ... other fields
);
}
public static Profile toEntity(ProfileDTO dto)
{
if (dto == null)
{
return null;
}
var profile = new Profile();
profile.setId(dto.id());
profile.setName(dto.name());
// ... other fields
return profile;
}
}
```
## Usage
```java
// Entity to DTO
ProfileDTO dto = ProfileMapper.toDTO(profile);
// DTO to Entity
Profile profile = ProfileMapper.toEntity(dto);
// List mapping
List<ProfileDTO> dtos = profiles.stream()
.map(ProfileMapper::toDTO)
.toList();
```
## JsonInclude for Optional Fields
```java
@JsonInclude(NON_EMPTY) // Don't serialize null or empty collections
List<LocationDTO> locations
```
## Validation Annotations
Use Bean Validation on DTO fields:
```java
@NotNull
@Size(min = 1, max = 255)
String name
@Email
String email
@Min(0)
@Max(100)
int percentage
```
## Collection Handling
Always handle null collections in constructor:
```java
public ProfileDTO
{
if (locations == null)
{
locations = new ArrayList<>();
}
}
```
================================================
FILE: .agents/skills/flyway-migrations/SKILL.md
================================================
---
name: flyway-migrations
description: Flyway SQL migration patterns for Xeres including naming conventions, H2 database patterns, enum types, foreign keys, and best practices.
---
# Flyway Migration Patterns for Xeres
## Migration Location
`app/src/main/resources/db/migration/`
## Naming Convention
`V<major>_<minor>_<timestamp>__<description>.sql`
Examples:
- `V00_0_1_202001232214__InitDb.sql`
- `V00_0_32_202603092327__AddIndices.sql`
## Table Creation Pattern
```sql
CREATE TABLE profile (
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name VARCHAR(255) NOT NULL,
pgp_id BIGINT,
created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT profile_pkey PRIMARY KEY (id)
);
CREATE INDEX idx_profile_name ON profile(name);
```
## Enum Types
```sql
CREATE TYPE trust_level AS ENUM ('UNKNOWN', 'NEVER', 'MARGINAL', 'FULLY', 'ULTIMATE');
ALTER TABLE profile ADD COLUMN trust trust_level NOT NULL DEFAULT 'UNKNOWN';
```
## Foreign Keys
```sql
ALTER TABLE contact
ADD CONSTRAINT fk_contact_profile
FOREIGN KEY (profile_id) REFERENCES profile(id)
ON DELETE CASCADE;
```
## Best Practices
1. **Separate index creation** from table creation
2. **Name all constraints** explicitly for easier debugging
3. **Use `BIGINT` for IDs** with `GENERATED BY DEFAULT AS IDENTITY`
4. **Include `NOT NULL`** constraints where appropriate
5. **Default values** for optional columns
6. **One concern per migration** when possible
7. **Timestamp precision** must always be of TIMESTAMP(9)
## Rolling Back
Add downward migrations with `V<version>__<name>.sql` (no timestamp):
```sql
-- V00_0_33__AddLocations.sql
ALTER TABLE location DROP COLUMN IF EXISTS last_seen;
```
## Testing Migrations
Flyway runs automatically on application startup with H2 database.
================================================
FILE: .agents/skills/gradle-build/SKILL.md
================================================
---
name: gradle-build
description: Gradle build configuration for Xeres including build commands, version management, module structure, and key plugins.
---
# Gradle Build for Xeres
## Project Structure
Multi-module Gradle project:
```
Xeres/
├── app/ - Spring Boot application
├── ui/ - JavaFX desktop UI
├── common/ - Shared code
├── build.gradle - Root configuration
└── settings.gradle
```
## Build Commands
```bash
# Run the application
./gradlew bootRun
# Build without tests
./gradlew build -x test
# Run tests
./gradlew test
# Run UI tests specifically
./gradlew :ui:test
# Package application (MSI on Windows, .deb on Linux)
./gradlew :app:jpackage
# Create portable zip
./gradlew :app:jpackage -Pjpackage.portable=true
# Build Docker image
./gradlew :app:bootBuildImage
# Clean build
./gradlew clean
```
## Version Management
Versions are defined in root `build.gradle` ext block:
```groovy
ext {
set('version.java', 25)
set('version.spring-boot', '4.0.5')
// etc.
}
```
Never modify version numbers directly. Update in root build.gradle.
## Module Dependencies
```
app → common
ui → common
app ✗→ ui (forbidden by archunit)
```
## Key Plugins
- `java` - Java compilation
- `application` - Runnable application
- `org.springframework.boot` - Spring Boot
- `io.github.goooler.java` - BOM management
- `jacoco` - Code coverage
- `org.openjfx.javafxplugin` - JavaFX
## Subproject Configuration
Subprojects inherit common configuration from root build.gradle. Module-specific settings go in `app/build.gradle`, `ui/build.gradle`, etc.
## Running Application
```bash
# Development mode with hot reload
./gradlew bootRun
# With specific JVM args
./gradlew bootRun -PjvmArgs="-Xmx512m"
```
================================================
FILE: .agents/skills/java-conventions/SKILL.md
================================================
---
name: java-conventions
description: Code style, naming conventions, license headers, and patterns for Xeres Java project. Covers Allman braces, utility classes, package structure, and field injection rules.
---
# Java Conventions for Xeres
## Code Style
- **Brace Style**: Allman (braces on next line)
- **Indentation**: tabs only
- **Max line length**: 320 characters
## License Header
Every source file must include the GPL v3 header:
```java
/*
* Copyright (c) [year-range] by David Gerber - https://zapek.com
*
* This file is part of Xeres.
*
* Xeres is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation...
*/
```
## Version
The version of Java used in Java 25.
## Utility Classes
- Must be `final` class
- Private no-arg constructor that throws `UnsupportedOperationException`
- No instance fields
```java
public final class FooUtils
{
private ProfileMapper()
{
throw new UnsupportedOperationException("Utility class");
}
public static void doSomething(int count)
{ ...}
}
```
## Naming Conventions
| Type | Pattern |
|---------------------|------------------------------------------------|
| Services | `*Service.java` |
| Controllers | `*Controller.java` or `*WindowController.java` |
| REST Controllers | `*Controller.java` in `api/controller/` |
| Client classes | `*Client.java` |
| Utility classes | `*Utils.java` |
| Fakes/Test fixtures | `*Fakes.java` |
| Mappers | `*Mapper.java` (static utility class) |
## Package Structure
`io.xeres.<module>.<feature>`
| Module | Packages |
|--------|---------------------------------------------------------------------------------------------|
| app | `api`, `application`, `configuration`, `crypto`, `database`, `job`, `net`, `service`, `xrs` |
| ui | `client`, `controller`, `custom`, `event`, `model`, `support` |
| common | `dto`, `events`, `id`, `message`, `rest`, `protocol` |
## Logging
- Use SLF4J (not `java.util.logging`)
- Logger declaration: `private static final Logger log = LoggerFactory.getLogger(ClassName.class);`
- Logging sensitive data is fine with the `debug` facility
## Field Injection
Field injection is prohibited. Use constructor injection instead:
```java
// Bad
@Autowired
private ProfileService profileService;
// Good
private final ProfileService profileService;
public ContactService(ProfileService profileService)
{
this.profileService = profileService;
}
```
================================================
FILE: .agents/skills/javafx-patterns/SKILL.md
================================================
---
name: javafx-patterns
description: JavaFX patterns for Xeres including controller structure with FXML views, WindowController lifecycle, WindowManager usage, and JavaFX-Spring integration.
---
# JavaFX Patterns for Xeres
## Controller Structure
Controllers are Spring components with FXML views:
```java
@Component
@FxmlView(value = "/view/contact/contact_view.fxml")
public class ContactViewController implements Controller
{
@FXML
private TreeTableView<Contact> contactTreeTableView;
@Override
public void initialize()
{ ...}
}
```
## Window Controllers
For windows/dialogs, implement `WindowController` interface:
```java
@Component
@FxmlView(value = "/view/settings/settings_window.fxml")
public class SettingsWindowController implements WindowController
{
@Override
public void onShowing()
{ ...}
@Override
public void onShown()
{ ...}
@Override
public void onClose()
{ ...}
}
```
Naming convention: `*WindowController`
## Window Management
Use `WindowManager` for window lifecycle.
## JavaFX-App Integration
```java
public class JavaFxApplication extends Application
{
private ConfigurableApplicationContext springContext;
@Override
public void init()
{
springContext = new SpringApplicationBuilder()
.sources(springApplicationClass)
.headless(false)
.initializers(initializers())
.run(getParameters().getRaw().toArray(new String[0]));
}
}
```
## File Choosers
Never call `FileChooser.setInitialDirectory()` directly. Use `ChooserUtils`:
```java
// Bad
fileChooser.setInitialDirectory(someDirectory);
// Good
ChooserUtils.
setInitialDirectory(fileChooser, someDirectory);
```
## FXML Location Convention
```
ui/src/main/resources/view/<feature>/<feature>_view.fxml
ui/src/main/resources/view/<feature>/<feature>_window.fxml (for dialogs)
```
## Binding Patterns
Use JavaFX properties for observable data:
```java
private final StringProperty nameProperty = new SimpleStringProperty();
private final ObjectProperty<Profile> selectedProfile = new SimpleObjectProperty<>();
```
## UI Event Handling
Dispatch events through Spring's `ApplicationEventPublisher`:
```java
public record ContactSelectedEvent(Contact contact)
{
}
```
================================================
FILE: .agents/skills/junit-testing/SKILL.md
================================================
---
name: junit-testing
description: JUnit 6 testing patterns for Xeres including Mockito with constructor injection, test fixtures via *Fakes.java classes, and AssertJ assertions.
---
# JUnit Testing Patterns for Xeres
## Test Structure
- Location: `src/test/java/` mirrors main source structure
- Naming: `*Test.java` suffix
- Framework: JUnit 6 with Jupiter
## Mockito Extension Pattern
```java
@ExtendWith(MockitoExtension.class)
class ContactServiceTest
{
@Mock
private ProfileService profileService;
@InjectMocks
private ContactService contactService;
@Test
void getContacts_ShouldReturnCombinedList()
{
when(profileService.getProfiles()).thenReturn(List.of());
var result = contactService.getContacts();
assertTrue(result.isEmpty());
}
}
```
## Key Points
- Use constructor injection (Mockito injects via `@InjectMocks`)
- `@Mock` creates a mock, `@Spy` creates a partial mock
- `when(...).thenReturn(...)` for stubbing
- `verify(...).method()` for interaction testing
- Prefer JUnit assertions: `assertTrue(...)` but it's also possible to use assertJ for more complex cases
## Test Fixtures
Use `*Fakes.java` in `common/src/testFixtures/java/io/xeres/`:
```java
public final class ProfileFakes
{
private ProfileFakes()
{
throw new UnsupportedOperationException("Utility class");
}
public static Profile createProfile()
{
return createProfile(1L, "Test Profile");
}
public static Profile createProfile(long id, String name)
{
var profile = new Profile();
profile.setId(id);
profile.setName(name);
return profile;
}
public static Profile createOwnProfile()
{
var profile = createProfile();
profile.setOwn(true);
return profile;
}
}
```
## Assertion Examples
```java
import static org.junit.jupiter.api.Assertions.*;
import static org.assertj.core.api.Assertions.*;
assertNotNull(result);
assertEquals("Test",result.getName);
assertThat(list).
hasSize(2).
contains(profile1, profile2);
assertThatThrownBy(() ->service.
save(null))
.
isInstanceOf(IllegalArgumentException .class);
```
## Exception Testing
```java
@Test
void save_WithNullProfile_ShouldThrow()
{
assertThatThrownBy(() -> contactService.save(null))
.isInstanceOf(NullPointerException.class)
.hasMessage("Profile must not be null");
}
```
## See Also
- `ui-testing` skill for JavaFX controller testing
- `archunit-rules` skill for testing architecture rules
================================================
FILE: .agents/skills/spring-boot-patterns/SKILL.md
================================================
---
name: spring-boot-patterns
description: Spring Boot patterns for Xeres including constructor injection, @Transactional boundaries, REST controllers with OpenAPI annotations, and reactive WebClient usage in the UI module.
---
# Spring Boot Patterns for Xeres
## Application Entry Point
```java
@SpringBootApplication(scanBasePackageClasses = {
io.xeres.app.XeresApplication.class,
io.xeres.ui.UiStarter.class
})
public class XeresApplication
```
## Service Patterns
### Constructor Injection
Always use constructor injection. Dependencies are `final`.
```java
@Service
public class ContactService
{
private final ProfileService profileService;
private final LocationService locationService;
public ContactService(ProfileService profileService, LocationService locationService)
{
this.profileService = profileService;
this.locationService = locationService;
}
}
```
### Transactional Boundaries
```java
@Transactional(readOnly = true)
public List<Contact> getContacts()
{ ...}
@Transactional
public void saveContact(Contact contact)
{ ...}
```
### Circular Dependencies
Use `@Lazy` annotation, but avoid them if possible:
```java
public ContactService(@Lazy ProfileService profileService)
{ ...}
```
## REST Controllers
### OpenAPI Annotations
```java
@RestController
@Tag(name = "Profiles", description = "Profile management")
public class ProfileController
{
@GetMapping("/{id}")
@Operation(summary = "Get profile by ID")
@ApiResponse(responseCode = "200", description = "Profile found")
public ResponseEntity<ProfileDTO> getProfile(@PathVariable long id)
{ ...}
}
```
### Exception Handling
Use custom exceptions with appropriate HTTP status codes.
## Reactive WebClient Clients (UI Module)
```java
@Component
public class ProfileClient
{
private WebClient webClient;
@EventListener
public void init(StartupEvent event)
{
webClient = webClientBuilder.clone()
.baseUrl(RemoteUtils.getControlUrl() + PROFILES_PATH)
.build();
}
public Mono<Profile> findById(long id)
{
return webClient.get()
.uri("/{id}", id)
.retrieve()
.bodyToMono(Profile.class);
}
}
```
## Configuration Classes
Use `@Configuration` for feature-specific beans. Keep `@Bean` methods small and focused.
## Testing Services
See `junit-testing` skill for testing patterns with mocks.
================================================
FILE: .agents/skills/ui-testing/SKILL.md
================================================
---
name: ui-testing
description: TestFX patterns for JavaFX controller testing in Xeres including FXML loading with controller factories, mocking reactive clients, and user interaction testing.
---
# UI Testing Patterns for Xeres
## TestFX Setup
UI tests use TestFX with both `ApplicationExtension` and `MockitoExtension`:
```java
@ExtendWith({ApplicationExtension.class, MockitoExtension.class})
class ContactViewControllerTest
{
@Mock
private ProfileClient profileClient;
@InjectMocks
private ContactViewController controller;
@Test
void testFxmlLoading() throws IOException
{
FXMLLoader loader = new FXMLLoader(getClass().getResource("/view/contact/contact_view.fxml"));
loader.setControllerFactory(_ -> controller);
Parent root = loader.load();
assertThat(root).isNotNull();
}
}
```
## FXTest Base Class
For tests requiring JavaFX initialization, extend `FXTest`:
```java
class SomeJavaFXTest extends FXTest
{
@Test
void test
javafx components()
{
// JavaFX is initialized
}
}
```
## FXML Loading Pattern
```java
@Test
void initialize_ShouldLoadContacts() throws IOException
{
// Load FXML with controller factory
FXMLLoader loader = new FXMLLoader(
getClass().getResource("/view/contact/contact_view.fxml")
);
loader.setControllerFactory(javaClass -> controller);
// Initialize controller manually for unit-like tests
controller.initialize();
// Verify initial state
assertThat(controller.getContactTreeTableView()).isNotNull();
}
```
## Testing User Interactions
```java
@Test
void clickButton_ShouldTriggerAction()
{
// Find button in loaded FXML
var button = lookup("#saveButton").query();
// Click and verify
clickOn(button);
// Verify interaction with mock
verify(profileClient).save(any(Profile.class));
}
```
## Mocking Reactive Clients
For WebClient-based clients returning `Mono`:
```java
when(profileClient.findById(anyLong()))
.
thenReturn(Mono.just(testProfile));
```
## See Also
- `junit-testing` skill for basic testing patterns
- `javafx-patterns` skill for controller structure
================================================
FILE: .aiignore
================================================
/data*/
/.idea/
/.vscode/
/.gradle/
/.venv/
./jpb/
/*/build/
/build/
/*/out/
/*/bin/
.xeres.lock
/.jpb/persistence-units.xml
.run/XeresApplication.run.xml
/scripts/bot/config.json
/scripts/bot/avatar.png
/cache/
/.proxyai/
================================================
FILE: .editorconfig
================================================
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = tab
insert_final_newline = false
max_line_length = 320
tab_width = 4
ij_continuation_indent_size = 8
ij_formatter_off_tag = @formatter:off
ij_formatter_on_tag = @formatter:on
ij_formatter_tags_enabled = false
ij_smart_tabs = true
ij_wrap_on_typing = false
[*.css]
indent_style = space
ij_smart_tabs = false
ij_css_align_closing_brace_with_properties = false
ij_css_blank_lines_around_nested_selector = 1
ij_css_blank_lines_between_blocks = 1
ij_css_enforce_quotes_on_format = false
ij_css_hex_color_long_format = false
ij_css_hex_color_lower_case = false
ij_css_hex_color_short_format = false
ij_css_hex_color_upper_case = false
ij_css_keep_blank_lines_in_code = 2
ij_css_keep_indents_on_empty_lines = false
ij_css_keep_single_line_blocks = false
ij_css_properties_order = font,font-family,font-size,font-weight,font-style,font-variant,font-size-adjust,font-stretch,line-height,position,z-index,top,right,bottom,left,display,visibility,float,clear,overflow,overflow-x,overflow-y,clip,zoom,align-content,align-items,align-self,flex,flex-flow,flex-basis,flex-direction,flex-grow,flex-shrink,flex-wrap,justify-content,order,box-sizing,width,min-width,max-width,height,min-height,max-height,margin,margin-top,margin-right,margin-bottom,margin-left,padding,padding-top,padding-right,padding-bottom,padding-left,table-layout,empty-cells,caption-side,border-spacing,border-collapse,list-style,list-style-position,list-style-type,list-style-image,content,quotes,counter-reset,counter-increment,resize,cursor,user-select,nav-index,nav-up,nav-right,nav-down,nav-left,transition,transition-delay,transition-timing-function,transition-duration,transition-property,transform,transform-origin,animation,animation-name,animation-duration,animation-play-state,animation-timing-function,animation-delay,animation-iteration-count,animation-direction,text-align,text-align-last,vertical-align,white-space,text-decoration,text-emphasis,text-emphasis-color,text-emphasis-style,text-emphasis-position,text-indent,text-justify,letter-spacing,word-spacing,text-outline,text-transform,text-wrap,text-overflow,text-overflow-ellipsis,text-overflow-mode,word-wrap,word-break,tab-size,hyphens,pointer-events,opacity,color,border,border-width,border-style,border-color,border-top,border-top-width,border-top-style,border-top-color,border-right,border-right-width,border-right-style,border-right-color,border-bottom,border-bottom-width,border-bottom-style,border-bottom-color,border-left,border-left-width,border-left-style,border-left-color,border-radius,border-top-left-radius,border-top-right-radius,border-bottom-right-radius,border-bottom-left-radius,border-image,border-image-source,border-image-slice,border-image-width,border-image-outset,border-image-repeat,outline,outline-width,outline-style,outline-color,outline-offset,background,background-color,background-image,background-repeat,background-attachment,background-position,background-position-x,background-position-y,background-clip,background-origin,background-size,box-decoration-break,box-shadow,text-shadow
ij_css_space_after_colon = true
ij_css_space_before_opening_brace = true
ij_css_use_double_quotes = true
[*.java]
ij_java_align_consecutive_assignments = false
ij_java_align_consecutive_variable_declarations = false
ij_java_align_group_field_declarations = false
ij_java_align_multiline_annotation_parameters = false
ij_java_align_multiline_array_initializer_expression = false
ij_java_align_multiline_assignment = false
ij_java_align_multiline_binary_operation = false
ij_java_align_multiline_chained_methods = false
ij_java_align_multiline_extends_list = false
ij_java_align_multiline_for = true
ij_java_align_multiline_method_parentheses = false
ij_java_align_multiline_parameters = true
ij_java_align_multiline_parameters_in_calls = false
ij_java_align_multiline_parenthesized_expression = false
ij_java_align_multiline_resources = true
ij_java_align_multiline_ternary_operation = false
ij_java_align_multiline_text_blocks = false
ij_java_align_multiline_throws_list = false
ij_java_align_subsequent_simple_methods = false
ij_java_align_throws_keyword = false
ij_java_annotation_parameter_wrap = off
ij_java_array_initializer_new_line_after_left_brace = false
ij_java_array_initializer_right_brace_on_new_line = false
ij_java_array_initializer_wrap = off
ij_java_assert_statement_colon_on_next_line = false
ij_java_assert_statement_wrap = off
ij_java_assignment_wrap = off
ij_java_binary_operation_sign_on_next_line = false
ij_java_binary_operation_wrap = off
ij_java_blank_lines_after_anonymous_class_header = 0
ij_java_blank_lines_after_class_header = 0
ij_java_blank_lines_after_imports = 1
ij_java_blank_lines_after_package = 1
ij_java_blank_lines_around_class = 1
ij_java_blank_lines_around_field = 0
ij_java_blank_lines_around_field_in_interface = 0
ij_java_blank_lines_around_initializer = 1
ij_java_blank_lines_around_method = 1
ij_java_blank_lines_around_method_in_interface = 1
ij_java_blank_lines_before_class_end = 0
ij_java_blank_lines_before_imports = 1
ij_java_blank_lines_before_method_body = 0
ij_java_blank_lines_before_package = 0
ij_java_block_brace_style = next_line
ij_java_block_comment_at_first_column = true
ij_java_call_parameters_new_line_after_left_paren = false
ij_java_call_parameters_right_paren_on_new_line = false
ij_java_call_parameters_wrap = off
ij_java_case_statement_on_separate_line = true
ij_java_catch_on_new_line = true
ij_java_class_annotation_wrap = split_into_lines
ij_java_class_brace_style = next_line
ij_java_class_count_to_use_import_on_demand = 5
ij_java_class_names_in_javadoc = 1
ij_java_do_not_indent_top_level_class_members = false
ij_java_do_not_wrap_after_single_annotation = false
ij_java_do_while_brace_force = never
ij_java_doc_add_blank_line_after_description = true
ij_java_doc_add_blank_line_after_param_comments = false
ij_java_doc_add_blank_line_after_return = false
ij_java_doc_add_p_tag_on_empty_lines = true
ij_java_doc_align_exception_comments = true
ij_java_doc_align_param_comments = true
ij_java_doc_do_not_wrap_if_one_line = false
ij_java_doc_enable_formatting = true
ij_java_doc_enable_leading_asterisks = true
ij_java_doc_indent_on_continuation = false
ij_java_doc_keep_empty_lines = true
ij_java_doc_keep_empty_parameter_tag = true
ij_java_doc_keep_empty_return_tag = true
ij_java_doc_keep_empty_throws_tag = true
ij_java_doc_keep_invalid_tags = true
ij_java_doc_param_description_on_new_line = false
ij_java_doc_preserve_line_breaks = false
ij_java_doc_use_throws_not_exception_tag = true
ij_java_else_on_new_line = true
ij_java_entity_dd_suffix = EJB
ij_java_entity_eb_suffix = Bean
ij_java_entity_hi_suffix = Home
ij_java_entity_lhi_prefix = Local
ij_java_entity_lhi_suffix = Home
ij_java_entity_li_prefix = Local
ij_java_entity_pk_class = java.lang.String
ij_java_entity_vo_suffix = VO
ij_java_enum_constants_wrap = off
ij_java_extends_keyword_wrap = off
ij_java_extends_list_wrap = off
ij_java_field_annotation_wrap = split_into_lines
ij_java_finally_on_new_line = true
ij_java_for_brace_force = never
ij_java_for_statement_new_line_after_left_paren = false
ij_java_for_statement_right_paren_on_new_line = false
ij_java_for_statement_wrap = off
ij_java_generate_final_locals = false
ij_java_generate_final_parameters = false
ij_java_if_brace_force = never
ij_java_imports_layout = *,|,javax.**,java.**,|,$*
ij_java_indent_case_from_switch = true
ij_java_insert_inner_class_imports = false
ij_java_insert_override_annotation = true
ij_java_keep_blank_lines_before_right_brace = 2
ij_java_keep_blank_lines_between_package_declaration_and_header = 2
ij_java_keep_blank_lines_in_code = 2
ij_java_keep_blank_lines_in_declarations = 2
ij_java_keep_control_statement_in_one_line = true
ij_java_keep_first_column_comment = true
ij_java_keep_indents_on_empty_lines = false
ij_java_keep_line_breaks = true
ij_java_keep_multiple_expressions_in_one_line = false
ij_java_keep_simple_blocks_in_one_line = false
ij_java_keep_simple_classes_in_one_line = false
ij_java_keep_simple_lambdas_in_one_line = false
ij_java_keep_simple_methods_in_one_line = false
ij_java_label_indent_absolute = false
ij_java_label_indent_size = 0
ij_java_lambda_brace_style = end_of_line
ij_java_layout_static_imports_separately = true
ij_java_line_comment_add_space = false
ij_java_line_comment_at_first_column = true
ij_java_message_dd_suffix = EJB
ij_java_message_eb_suffix = Bean
ij_java_method_annotation_wrap = split_into_lines
ij_java_method_brace_style = next_line
ij_java_method_call_chain_wrap = off
ij_java_method_parameters_new_line_after_left_paren = false
ij_java_method_parameters_right_paren_on_new_line = false
ij_java_method_parameters_wrap = off
ij_java_modifier_list_wrap = false
ij_java_names_count_to_use_import_on_demand = 3
ij_java_packages_to_use_import_on_demand = java.awt.*,javax.swing.*
ij_java_parameter_annotation_wrap = off
ij_java_parentheses_expression_new_line_after_left_paren = false
ij_java_parentheses_expression_right_paren_on_new_line = false
ij_java_place_assignment_sign_on_next_line = false
ij_java_prefer_longer_names = true
ij_java_prefer_parameters_wrap = false
ij_java_repeat_synchronized = true
ij_java_replace_instanceof_and_cast = false
ij_java_replace_null_check = true
ij_java_replace_sum_lambda_with_method_ref = true
ij_java_resource_list_new_line_after_left_paren = false
ij_java_resource_list_right_paren_on_new_line = false
ij_java_resource_list_wrap = off
ij_java_session_dd_suffix = EJB
ij_java_session_eb_suffix = Bean
ij_java_session_hi_suffix = Home
ij_java_session_lhi_prefix = Local
ij_java_session_lhi_suffix = Home
ij_java_session_li_prefix = Local
ij_java_session_si_suffix = Service
ij_java_space_after_closing_angle_bracket_in_type_argument = false
ij_java_space_after_colon = true
ij_java_space_after_comma = true
ij_java_space_after_comma_in_type_arguments = true
ij_java_space_after_for_semicolon = true
ij_java_space_after_quest = true
ij_java_space_after_type_cast = true
ij_java_space_before_annotation_array_initializer_left_brace = false
ij_java_space_before_annotation_parameter_list = false
ij_java_space_before_array_initializer_left_brace = false
ij_java_space_before_catch_keyword = true
ij_java_space_before_catch_left_brace = true
ij_java_space_before_catch_parentheses = true
ij_java_space_before_class_left_brace = true
ij_java_space_before_colon = true
ij_java_space_before_colon_in_foreach = true
ij_java_space_before_comma = false
ij_java_space_before_do_left_brace = true
ij_java_space_before_else_keyword = true
ij_java_space_before_else_left_brace = true
ij_java_space_before_finally_keyword = true
ij_java_space_before_finally_left_brace = true
ij_java_space_before_for_left_brace = true
ij_java_space_before_for_parentheses = true
ij_java_space_before_for_semicolon = false
ij_java_space_before_if_left_brace = true
ij_java_space_before_if_parentheses = true
ij_java_space_before_method_call_parentheses = false
ij_java_space_before_method_left_brace = true
ij_java_space_before_method_parentheses = false
ij_java_space_before_opening_angle_bracket_in_type_parameter = false
ij_java_space_before_quest = true
ij_java_space_before_switch_left_brace = true
ij_java_space_before_switch_parentheses = true
ij_java_space_before_synchronized_left_brace = true
ij_java_space_before_synchronized_parentheses = true
ij_java_space_before_try_left_brace = true
ij_java_space_before_try_parentheses = true
ij_java_space_before_type_parameter_list = false
ij_java_space_before_while_keyword = true
ij_java_space_before_while_left_brace = true
ij_java_space_before_while_parentheses = true
ij_java_space_inside_one_line_enum_braces = false
ij_java_space_within_empty_array_initializer_braces = false
ij_java_space_within_empty_method_call_parentheses = false
ij_java_space_within_empty_method_parentheses = false
ij_java_spaces_around_additive_operators = true
ij_java_spaces_around_assignment_operators = true
ij_java_spaces_around_bitwise_operators = true
ij_java_spaces_around_equality_operators = true
ij_java_spaces_around_lambda_arrow = true
ij_java_spaces_around_logical_operators = true
ij_java_spaces_around_method_ref_dbl_colon = false
ij_java_spaces_around_multiplicative_operators = true
ij_java_spaces_around_relational_operators = true
ij_java_spaces_around_shift_operators = true
ij_java_spaces_around_type_bounds_in_type_parameters = true
ij_java_spaces_around_unary_operator = false
ij_java_spaces_within_angle_brackets = false
ij_java_spaces_within_annotation_parentheses = false
ij_java_spaces_within_array_initializer_braces = false
ij_java_spaces_within_braces = false
ij_java_spaces_within_brackets = false
ij_java_spaces_within_cast_parentheses = false
ij_java_spaces_within_catch_parentheses = false
ij_java_spaces_within_for_parentheses = false
ij_java_spaces_within_if_parentheses = false
ij_java_spaces_within_method_call_parentheses = false
ij_java_spaces_within_method_parentheses = false
ij_java_spaces_within_parentheses = false
ij_java_spaces_within_switch_parentheses = false
ij_java_spaces_within_synchronized_parentheses = false
ij_java_spaces_within_try_parentheses = false
ij_java_spaces_within_while_parentheses = false
ij_java_special_else_if_treatment = true
ij_java_subclass_name_suffix = Impl
ij_java_ternary_operation_signs_on_next_line = false
ij_java_ternary_operation_wrap = off
ij_java_test_name_suffix = Test
ij_java_throws_keyword_wrap = off
ij_java_throws_list_wrap = off
ij_java_use_external_annotations = false
ij_java_use_fq_class_names = false
ij_java_use_relative_indents = false
ij_java_use_single_class_imports = true
ij_java_variable_annotation_wrap = off
ij_java_visibility = public
ij_java_while_brace_force = always
ij_java_while_on_new_line = false
ij_java_wrap_comments = false
ij_java_wrap_first_method_in_call_chain = false
ij_java_wrap_long_lines = false
[.editorconfig]
ij_editorconfig_align_group_field_declarations = false
ij_editorconfig_space_after_colon = false
ij_editorconfig_space_after_comma = true
ij_editorconfig_space_before_colon = false
ij_editorconfig_space_before_comma = false
ij_editorconfig_spaces_around_assignment_operators = true
[{*.gant,*.groovy,*.gradle,*.gdsl,*.gy}]
indent_style = space
ij_smart_tabs = false
ij_groovy_align_group_field_declarations = false
ij_groovy_align_multiline_array_initializer_expression = false
ij_groovy_align_multiline_assignment = false
ij_groovy_align_multiline_binary_operation = false
ij_groovy_align_multiline_chained_methods = false
ij_groovy_align_multiline_extends_list = false
ij_groovy_align_multiline_for = true
ij_groovy_align_multiline_method_parentheses = false
ij_groovy_align_multiline_parameters = true
ij_groovy_align_multiline_parameters_in_calls = false
ij_groovy_align_multiline_resources = true
ij_groovy_align_multiline_ternary_operation = false
ij_groovy_align_multiline_throws_list = false
ij_groovy_align_throws_keyword = false
ij_groovy_array_initializer_new_line_after_left_brace = false
ij_groovy_array_initializer_right_brace_on_new_line = false
ij_groovy_array_initializer_wrap = off
ij_groovy_assert_statement_wrap = off
ij_groovy_assignment_wrap = off
ij_groovy_binary_operation_wrap = off
ij_groovy_blank_lines_after_class_header = 0
ij_groovy_blank_lines_after_imports = 1
ij_groovy_blank_lines_after_package = 1
ij_groovy_blank_lines_around_class = 1
ij_groovy_blank_lines_around_field = 0
ij_groovy_blank_lines_around_field_in_interface = 0
ij_groovy_blank_lines_around_method = 1
ij_groovy_blank_lines_around_method_in_interface = 1
ij_groovy_blank_lines_before_imports = 1
ij_groovy_blank_lines_before_method_body = 0
ij_groovy_blank_lines_before_package = 0
ij_groovy_block_brace_style = end_of_line
ij_groovy_block_comment_at_first_column = true
ij_groovy_call_parameters_new_line_after_left_paren = false
ij_groovy_call_parameters_right_paren_on_new_line = false
ij_groovy_call_parameters_wrap = off
ij_groovy_catch_on_new_line = false
ij_groovy_class_annotation_wrap = split_into_lines
ij_groovy_class_brace_style = end_of_line
ij_groovy_do_while_brace_force = never
ij_groovy_else_on_new_line = false
ij_groovy_enum_constants_wrap = off
ij_groovy_extends_keyword_wrap = off
ij_groovy_extends_list_wrap = off
ij_groovy_field_annotation_wrap = split_into_lines
ij_groovy_finally_on_new_line = false
ij_groovy_for_brace_force = never
ij_groovy_for_statement_new_line_after_left_paren = false
ij_groovy_for_statement_right_paren_on_new_line = false
ij_groovy_for_statement_wrap = off
ij_groovy_if_brace_force = never
ij_groovy_indent_case_from_switch = true
ij_groovy_keep_blank_lines_before_right_brace = 2
ij_groovy_keep_blank_lines_in_code = 2
ij_groovy_keep_blank_lines_in_declarations = 2
ij_groovy_keep_control_statement_in_one_line = true
ij_groovy_keep_first_column_comment = true
ij_groovy_keep_indents_on_empty_lines = false
ij_groovy_keep_line_breaks = true
ij_groovy_keep_multiple_expressions_in_one_line = false
ij_groovy_keep_simple_blocks_in_one_line = false
ij_groovy_keep_simple_classes_in_one_line = true
ij_groovy_keep_simple_lambdas_in_one_line = true
ij_groovy_keep_simple_methods_in_one_line = true
ij_groovy_label_indent_absolute = false
ij_groovy_label_indent_size = 0
ij_groovy_lambda_brace_style = end_of_line
ij_groovy_line_comment_add_space = false
ij_groovy_line_comment_at_first_column = true
ij_groovy_method_annotation_wrap = split_into_lines
ij_groovy_method_brace_style = end_of_line
ij_groovy_method_call_chain_wrap = off
ij_groovy_method_parameters_new_line_after_left_paren = false
ij_groovy_method_parameters_right_paren_on_new_line = false
ij_groovy_method_parameters_wrap = off
ij_groovy_modifier_list_wrap = false
ij_groovy_parameter_annotation_wrap = off
ij_groovy_parentheses_expression_new_line_after_left_paren = false
ij_groovy_parentheses_expression_right_paren_on_new_line = false
ij_groovy_prefer_parameters_wrap = false
ij_groovy_resource_list_new_line_after_left_paren = false
ij_groovy_resource_list_right_paren_on_new_line = false
ij_groovy_resource_list_wrap = off
ij_groovy_space_after_colon = true
ij_groovy_space_after_comma = true
ij_groovy_space_after_comma_in_type_arguments = true
ij_groovy_space_after_for_semicolon = true
ij_groovy_space_after_quest = true
ij_groovy_space_after_type_cast = true
ij_groovy_space_before_annotation_parameter_list = false
ij_groovy_space_before_array_initializer_left_brace = false
ij_groovy_space_before_catch_keyword = true
ij_groovy_space_before_catch_left_brace = true
ij_groovy_space_before_catch_parentheses = true
ij_groovy_space_before_class_left_brace = true
ij_groovy_space_before_colon = true
ij_groovy_space_before_comma = false
ij_groovy_space_before_do_left_brace = true
ij_groovy_space_before_else_keyword = true
ij_groovy_space_before_else_left_brace = true
ij_groovy_space_before_finally_keyword = true
ij_groovy_space_before_finally_left_brace = true
ij_groovy_space_before_for_left_brace = true
ij_groovy_space_before_for_parentheses = true
ij_groovy_space_before_for_semicolon = false
ij_groovy_space_before_if_left_brace = true
ij_groovy_space_before_if_parentheses = true
ij_groovy_space_before_method_call_parentheses = false
ij_groovy_space_before_method_left_brace = true
ij_groovy_space_before_method_parentheses = false
ij_groovy_space_before_quest = true
ij_groovy_space_before_switch_left_brace = true
ij_groovy_space_before_switch_parentheses = true
ij_groovy_space_before_synchronized_left_brace = true
ij_groovy_space_before_synchronized_parentheses = true
ij_groovy_space_before_try_left_brace = true
ij_groovy_space_before_try_parentheses = true
ij_groovy_space_before_while_keyword = true
ij_groovy_space_before_while_left_brace = true
ij_groovy_space_before_while_parentheses = true
ij_groovy_space_within_empty_array_initializer_braces = false
ij_groovy_space_within_empty_method_call_parentheses = false
ij_groovy_spaces_around_additive_operators = true
ij_groovy_spaces_around_assignment_operators = true
ij_groovy_spaces_around_bitwise_operators = true
ij_groovy_spaces_around_equality_operators = true
ij_groovy_spaces_around_lambda_arrow = true
ij_groovy_spaces_around_logical_operators = true
ij_groovy_spaces_around_multiplicative_operators = true
ij_groovy_spaces_around_relational_operators = true
ij_groovy_spaces_around_shift_operators = true
ij_groovy_spaces_within_annotation_parentheses = false
ij_groovy_spaces_within_array_initializer_braces = false
ij_groovy_spaces_within_braces = true
ij_groovy_spaces_within_brackets = false
ij_groovy_spaces_within_cast_parentheses = false
ij_groovy_spaces_within_catch_parentheses = false
ij_groovy_spaces_within_for_parentheses = false
ij_groovy_spaces_within_if_parentheses = false
ij_groovy_spaces_within_method_call_parentheses = false
ij_groovy_spaces_within_method_parentheses = false
ij_groovy_spaces_within_parentheses = false
ij_groovy_spaces_within_switch_parentheses = false
ij_groovy_spaces_within_synchronized_parentheses = false
ij_groovy_spaces_within_try_parentheses = false
ij_groovy_spaces_within_while_parentheses = false
ij_groovy_special_else_if_treatment = true
ij_groovy_ternary_operation_wrap = off
ij_groovy_throws_keyword_wrap = off
ij_groovy_throws_list_wrap = off
ij_groovy_use_relative_indents = false
ij_groovy_variable_annotation_wrap = off
ij_groovy_while_brace_force = never
ij_groovy_while_on_new_line = false
ij_groovy_wrap_long_lines = false
[{*.js,*.cjs}]
ij_javascript_align_imports = false
ij_javascript_align_multiline_array_initializer_expression = false
ij_javascript_align_multiline_binary_operation = false
ij_javascript_align_multiline_chained_methods = false
ij_javascript_align_multiline_extends_list = false
ij_javascript_align_multiline_for = true
ij_javascript_align_multiline_parameters = true
ij_javascript_align_multiline_parameters_in_calls = false
ij_javascript_align_multiline_ternary_operation = false
ij_javascript_align_object_properties = 0
ij_javascript_align_union_types = false
ij_javascript_align_var_statements = 0
ij_javascript_array_initializer_new_line_after_left_brace = false
ij_javascript_array_initializer_right_brace_on_new_line = false
ij_javascript_array_initializer_wrap = off
ij_javascript_assignment_wrap = off
ij_javascript_binary_operation_sign_on_next_line = false
ij_javascript_binary_operation_wrap = off
ij_javascript_blacklist_imports = rxjs/Rx,node_modules/**/*,@angular/material,@angular/material/typings/**,~/node_modules/**/*,@/node_modules/**/*
ij_javascript_blank_lines_after_imports = 1
ij_javascript_blank_lines_around_class = 1
ij_javascript_blank_lines_around_field = 0
ij_javascript_blank_lines_around_function = 1
ij_javascript_blank_lines_around_method = 1
ij_javascript_block_brace_style = next_line
ij_javascript_call_parameters_new_line_after_left_paren = false
ij_javascript_call_parameters_right_paren_on_new_line = false
ij_javascript_call_parameters_wrap = off
ij_javascript_catch_on_new_line = true
ij_javascript_chained_call_dot_on_new_line = true
ij_javascript_class_brace_style = next_line
ij_javascript_comma_on_new_line = false
ij_javascript_do_while_brace_force = always
ij_javascript_else_on_new_line = true
ij_javascript_enforce_trailing_comma = keep
ij_javascript_extends_keyword_wrap = off
ij_javascript_extends_list_wrap = off
ij_javascript_field_prefix = _
ij_javascript_file_name_style = relaxed
ij_javascript_finally_on_new_line = true
ij_javascript_for_brace_force = always
ij_javascript_for_statement_new_line_after_left_paren = false
ij_javascript_for_statement_right_paren_on_new_line = false
ij_javascript_for_statement_wrap = off
ij_javascript_force_quote_style = false
ij_javascript_force_semicolon_style = false
ij_javascript_function_expression_brace_style = next_line
ij_javascript_if_brace_force = always
ij_javascript_import_merge_members = global
ij_javascript_import_prefer_absolute_path = global
ij_javascript_import_sort_members = true
ij_javascript_import_sort_module_name = false
ij_javascript_import_use_node_resolution = true
ij_javascript_imports_wrap = on_every_item
ij_javascript_indent_case_from_switch = true
ij_javascript_indent_chained_calls = true
ij_javascript_indent_package_children = 0
ij_javascript_jsx_attribute_value = braces
ij_javascript_keep_blank_lines_in_code = 2
ij_javascript_keep_first_column_comment = true
ij_javascript_keep_indents_on_empty_lines = false
ij_javascript_keep_line_breaks = true
ij_javascript_keep_simple_blocks_in_one_line = false
ij_javascript_keep_simple_methods_in_one_line = false
ij_javascript_line_comment_add_space = true
ij_javascript_line_comment_at_first_column = false
ij_javascript_method_brace_style = next_line
ij_javascript_method_call_chain_wrap = off
ij_javascript_method_parameters_new_line_after_left_paren = false
ij_javascript_method_parameters_right_paren_on_new_line = false
ij_javascript_method_parameters_wrap = off
ij_javascript_object_literal_wrap = on_every_item
ij_javascript_parentheses_expression_new_line_after_left_paren = false
ij_javascript_parentheses_expression_right_paren_on_new_line = false
ij_javascript_place_assignment_sign_on_next_line = false
ij_javascript_prefer_as_type_cast = false
ij_javascript_prefer_parameters_wrap = false
ij_javascript_reformat_c_style_comments = false
ij_javascript_space_after_colon = true
ij_javascript_space_after_comma = true
ij_javascript_space_after_dots_in_rest_parameter = false
ij_javascript_space_after_generator_mult = true
ij_javascript_space_after_property_colon = true
ij_javascript_space_after_quest = true
ij_javascript_space_after_type_colon = true
ij_javascript_space_after_unary_not = false
ij_javascript_space_before_async_arrow_lparen = true
ij_javascript_space_before_catch_keyword = true
ij_javascript_space_before_catch_left_brace = true
ij_javascript_space_before_catch_parentheses = true
ij_javascript_space_before_class_lbrace = true
ij_javascript_space_before_class_left_brace = true
ij_javascript_space_before_colon = true
ij_javascript_space_before_comma = false
ij_javascript_space_before_do_left_brace = true
ij_javascript_space_before_else_keyword = true
ij_javascript_space_before_else_left_brace = true
ij_javascript_space_before_finally_keyword = true
ij_javascript_space_before_finally_left_brace = true
ij_javascript_space_before_for_left_brace = true
ij_javascript_space_before_for_parentheses = true
ij_javascript_space_before_for_semicolon = false
ij_javascript_space_before_function_left_parenth = true
ij_javascript_space_before_generator_mult = false
ij_javascript_space_before_if_left_brace = true
ij_javascript_space_before_if_parentheses = true
ij_javascript_space_before_method_call_parentheses = false
ij_javascript_space_before_method_left_brace = true
ij_javascript_space_before_method_parentheses = false
ij_javascript_space_before_property_colon = false
ij_javascript_space_before_quest = true
ij_javascript_space_before_switch_left_brace = true
ij_javascript_space_before_switch_parentheses = true
ij_javascript_space_before_try_left_brace = true
ij_javascript_space_before_type_colon = false
ij_javascript_space_before_unary_not = false
ij_javascript_space_before_while_keyword = true
ij_javascript_space_before_while_left_brace = true
ij_javascript_space_before_while_parentheses = true
ij_javascript_spaces_around_additive_operators = true
ij_javascript_spaces_around_arrow_function_operator = true
ij_javascript_spaces_around_assignment_operators = true
ij_javascript_spaces_around_bitwise_operators = true
ij_javascript_spaces_around_equality_operators = true
ij_javascript_spaces_around_logical_operators = true
ij_javascript_spaces_around_multiplicative_operators = true
ij_javascript_spaces_around_relational_operators = true
ij_javascript_spaces_around_shift_operators = true
ij_javascript_spaces_around_unary_operator = false
ij_javascript_spaces_within_array_initializer_brackets = false
ij_javascript_spaces_within_brackets = false
ij_javascript_spaces_within_catch_parentheses = false
ij_javascript_spaces_within_for_parentheses = false
ij_javascript_spaces_within_if_parentheses = false
ij_javascript_spaces_within_imports = false
ij_javascript_spaces_within_interpolation_expressions = false
ij_javascript_spaces_within_method_call_parentheses = false
ij_javascript_spaces_within_method_parentheses = false
ij_javascript_spaces_within_object_literal_braces = false
ij_javascript_spaces_within_object_type_braces = true
ij_javascript_spaces_within_parentheses = false
ij_javascript_spaces_within_switch_parentheses = false
ij_javascript_spaces_within_type_assertion = false
ij_javascript_spaces_within_union_types = true
ij_javascript_spaces_within_while_parentheses = false
ij_javascript_special_else_if_treatment = true
ij_javascript_ternary_operation_signs_on_next_line = false
ij_javascript_ternary_operation_wrap = off
ij_javascript_union_types_wrap = on_every_item
ij_javascript_use_chained_calls_group_indents = false
ij_javascript_use_double_quotes = true
ij_javascript_use_path_mapping = always
ij_javascript_use_public_modifier = false
ij_javascript_use_semicolon_after_statement = true
ij_javascript_var_declaration_wrap = normal
ij_javascript_while_brace_force = always
ij_javascript_while_on_new_line = true
ij_javascript_wrap_comments = false
[{*.ng,*.sht,*.html,*.shtm,*.shtml,*.htm}]
indent_style = space
ij_smart_tabs = false
ij_html_add_new_line_before_tags = body,div,p,form,h1,h2,h3
ij_html_align_attributes = true
ij_html_align_text = false
ij_html_attribute_wrap = normal
ij_html_block_comment_at_first_column = true
ij_html_do_not_align_children_of_min_lines = 0
ij_html_do_not_break_if_inline_tags = title,h1,h2,h3,h4,h5,h6,p
ij_html_do_not_indent_children_of_tags = html,body,thead,tbody,tfoot
ij_html_enforce_quotes = false
ij_html_inline_tags = a,abbr,acronym,b,basefont,bdo,big,br,cite,cite,code,dfn,em,font,i,img,input,kbd,label,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var
ij_html_keep_blank_lines = 2
ij_html_keep_indents_on_empty_lines = false
ij_html_keep_line_breaks = true
ij_html_keep_line_breaks_in_text = true
ij_html_keep_whitespaces = false
ij_html_keep_whitespaces_inside = span,pre,textarea
ij_html_line_comment_at_first_column = true
ij_html_new_line_after_last_attribute = never
ij_html_new_line_before_first_attribute = never
ij_html_quote_style = double
ij_html_remove_new_line_before_tags = br
ij_html_space_after_tag_name = false
ij_html_space_around_equality_in_attribute = false
ij_html_space_inside_empty_tag = false
ij_html_text_wrap = normal
[{*.yml,*.yaml}]
ij_yaml_keep_indents_on_empty_lines = false
ij_yaml_keep_line_breaks = true
indent_style = space
indent_size = 2
[{.eslintrc,.babelrc,composer.lock,.stylelintrc,jest.config,bowerrc,*.json,*.jsb3,*.jsb2}]
indent_style = space
ij_smart_tabs = false
ij_json_keep_blank_lines_in_code = 0
ij_json_keep_indents_on_empty_lines = false
ij_json_keep_line_breaks = true
ij_json_space_after_colon = true
ij_json_space_after_comma = true
ij_json_space_before_colon = true
ij_json_space_before_comma = false
ij_json_spaces_within_braces = false
ij_json_spaces_within_brackets = false
ij_json_wrap_long_lines = false
[{phpunit.xml.dist,*.xslt,*.xul,*.rng,*.xsl,*.xsd,*.ant,*.wadl,*.jhm,*.tld,*.fxml,*.jrxml,*.xml,*.jnlp,*.wsdl,*.wsdd,*.xjb}]
indent_style = space
ij_smart_tabs = false
ij_xml_block_comment_at_first_column = true
ij_xml_keep_indents_on_empty_lines = false
ij_xml_line_comment_at_first_column = true
ij_xml_space_inside_empty_tag = false
[{spring.schemas,spring.handlers,*.properties}]
ij_properties_align_group_field_declarations = false
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yaml
================================================
name: Bug report
description: Something doesn't work properly and you want it fixed.
labels: [ bug ]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report.
- type: textarea
id: what-happened
attributes:
label: What happened?
description: Also tell us, what did you expect to happen.
placeholder: Tell us what you see!
validations:
required: true
- type: textarea
id: how-to-reproduce
attributes:
label: How to reproduce
description: List all steps as precisely as possible
placeholder: |
1. Go to menu XYZ
2. Select option A
3. etc...
validations:
required: true
- type: input
id: version
attributes:
label: Version
description: Which version of Xeres are you running? See Help/About menu.
placeholder: ex. 0.2.0
validations:
required: false
- type: dropdown
id: os
attributes:
label: Which OS are you running?
options:
- Windows
- Linux
- MacOS
validations:
required: true
- type: textarea
id: logs
attributes:
label: Relevant log output
description: |
Please paste any relevant log output here, if you have them.
If you have an error requester, click the clipboard icon and paste the output here.
Otherwise the logs location are:
- Windows: %APPDATA%\Xeres\Logs\xeres.log
- Linux: $HOME/.local/share/Xeres/Logs/xeres.log
render: shell
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yaml
================================================
name: Feature request
description: You have some cool idea or suggestion for improvement.
labels: [ feature ]
body:
- type: markdown
attributes:
value: |
Thanks for your interest in improving Xeres.
- type: textarea
id: feature
attributes:
label: Description
description: Your idea or improvement
validations:
required: true
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: "gradle"
directory: "/"
schedule:
interval: "daily"
ignore:
- dependency-name: "org.flywaydb.flyway"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "daily"
- package-ecosystem: "pip"
directory: "/scripts/bot"
schedule:
interval: "daily"
================================================
FILE: .github/pull_request_template.md
================================================
Describe the change here
Fixes #issue_number
================================================
FILE: .github/workflows/analysis.yml
================================================
name: "Analysis"
on:
push:
branches:
- master
pull_request:
branches:
- master
types:
- opened
- synchronize
- reopened
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read # CodeQL
contents: read # CodeQL
security-events: write # CodeQL
pull-requests: read # Sonarqube
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0 # Disable shallow clone for sonarqube analysis
- name: Check gradle wrapper
uses: gradle/actions/wrapper-validation@v6
- name: Set up JDK
uses: actions/setup-java@v5
with:
java-version: 25.0.3
distribution: 'graalvm'
- name: Initialize CodeQL
uses: github/codeql-action/init@v4
with:
languages: java
queries: security-and-quality
- name: Cache SonarCloud packages
uses: actions/cache@v5
with:
path: ~/.sonar/cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Build, test and generate reports
run: ./gradlew build test jacocoTestReport --no-build-cache --info # Disabling the build cache is needed for CodeQL (otherwise compilation output might not be generated)
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v4
- name: Perform Sonarqube Analysis
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: ./gradlew sonar --no-parallel --no-configuration-cache # The 2 flags make sonar work with Gradle 9. Go figure...
================================================
FILE: .github/workflows/build-docker.yml
================================================
# Docker image builder
name: build-docker.yml
on:
workflow_dispatch:
env:
JAVA_VERSION: '25.0.3'
JAVA_DISTRIBUTION: 'graalvm'
jobs:
build-docker-release:
name: Build ${{ matrix.arch }} release
runs-on: ${{ matrix.runner }}
strategy:
matrix:
include:
- arch: amd64
runner: ubuntu-24.04
- arch: arm64
runner: ubuntu-24.04-arm
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Get version from git tag
id: get_version
run: echo "VERSION=$(git describe --tags --abbrev=0 | sed 's/^v//')" >> $GITHUB_OUTPUT
- name: Validate Gradle
uses: gradle/actions/wrapper-validation@v6
- name: Setup JDK
uses: graalvm/setup-graalvm@v1
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: ${{ env.JAVA_DISTRIBUTION }}
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Build Docker image
run: ./gradlew bootBuildImage --imageName=${{ secrets.DOCKERHUB_USERNAME }}/xeres:${{ steps.get_version.outputs.VERSION }}-${{ matrix.arch }}
- name: Log in to Docker Hub
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Push Docker image
run: |
docker push ${{ secrets.DOCKERHUB_USERNAME }}/xeres:${{ steps.get_version.outputs.VERSION }}-${{ matrix.arch }}
create-manifest:
needs: build-docker-release
runs-on: ubuntu-24.04
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Get version from git tag
id: get_version
run: |
git fetch --tags
echo "VERSION=$(git describe --tags --abbrev=0 | sed 's/^v//')" >> $GITHUB_OUTPUT
- name: Log in to Docker Hub
uses: docker/login-action@v4
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Create and push manifest
run: |
docker manifest create ${{ secrets.DOCKERHUB_USERNAME }}/xeres:${{ steps.get_version.outputs.VERSION }} \
${{ secrets.DOCKERHUB_USERNAME }}/xeres:${{ steps.get_version.outputs.VERSION }}-amd64 \
${{ secrets.DOCKERHUB_USERNAME }}/xeres:${{ steps.get_version.outputs.VERSION }}-arm64
docker manifest create ${{ secrets.DOCKERHUB_USERNAME }}/xeres:latest \
${{ secrets.DOCKERHUB_USERNAME }}/xeres:${{ steps.get_version.outputs.VERSION }}-amd64 \
${{ secrets.DOCKERHUB_USERNAME }}/xeres:${{ steps.get_version.outputs.VERSION }}-arm64
docker manifest push ${{ secrets.DOCKERHUB_USERNAME }}/xeres:${{ steps.get_version.outputs.VERSION }}
docker manifest push ${{ secrets.DOCKERHUB_USERNAME }}/xeres:latest
================================================
FILE: .github/workflows/build-installer.yml
================================================
# This is the installer builder.
#
# It's triggered automatically when a version tag is pushed.
#
# For manual builds, add automatic_release_tag: "Nightly", otherwise the release creation will fail.
# The previous steps will work though so this can be used to check that it builds the installers.
# fetch-depth has been set to 0 so that manual builds will work, otherwise it might not find the version tag
# as it only fetches the latest commit history by default.
#
# When setting the java version, always use x.y.z even if there's more numbers, otherwise @setup-java will fail.
#
name: Installer build
on:
workflow_dispatch:
push:
tags:
- "v*"
env:
JAVA_VERSION: '25.0.3'
JAVA_DISTRIBUTION: 'graalvm'
jobs:
build-windows-installer-msi:
name: Build windows installer
runs-on: windows-2025
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Validate Gradle
uses: gradle/actions/wrapper-validation@v6
- name: Setup JDK
uses: graalvm/setup-graalvm@v1
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: ${{ env.JAVA_DISTRIBUTION }}
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Build
run: .\gradlew.bat jpackage
- name: Sign
uses: dlemstra/code-sign-action@v1
with:
certificate: '${{ secrets.CERTIFICATE }}'
files: |
./app/build/distributions/Xeres-*.msi
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
path: ./app/build/distributions/Xeres-*.msi
name: windows-installer-msi
retention-days: 1
build-windows-installer-portable:
name: Build windows portable installer
runs-on: windows-2025
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Validate Gradle
uses: gradle/actions/wrapper-validation@v6
- name: Setup JDK
uses: graalvm/setup-graalvm@v1
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: ${{ env.JAVA_DISTRIBUTION }}
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Build
run: .\gradlew.bat jpackage -P"jpackage.portable=true"
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
path: ./app/build/distributions/Xeres-*.zip
name: windows-installer-portable
retention-days: 1
build-macos-installer:
name: Build ${{ matrix.macos-version }} installer
runs-on: ${{ matrix.macos-version }}
strategy:
matrix:
macos-version: [ macos-26 ]
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Validate Gradle
uses: gradle/actions/wrapper-validation@v6
- name: Setup JDK
uses: graalvm/setup-graalvm@v1
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: ${{ env.JAVA_DISTRIBUTION }}
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Build
run: ./gradlew jpackage
- name: Rename .dmg file
run: |
# Extract filename
DMG_FILE=$(find ./app/build/distributions -name "*.dmg" -type f | head -n 1)
FILENAME=$(basename "$DMG_FILE" .dmg)
# Split into components
NAME_PART=$(echo "$FILENAME" | cut -d'-' -f1) # xeres
VERSION_PART=$(echo "$FILENAME" | cut -d'-' -f2) # x.y.z
# Create new filename
NEW_FILENAME="${NAME_PART}-${VERSION_PART}-${{ matrix.macos-version }}.dmg"
# Rename the file
mv "./app/build/distributions/${FILENAME}.dmg" "./app/build/distributions/${NEW_FILENAME}"
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
path: ./app/build/distributions/Xeres-*.dmg
name: macos-installer-${{ matrix.macos-version }}
retention-days: 1
build-ubuntu-installer-deb:
name: Build ${{ matrix.ubuntu-version }} installer
runs-on: ${{ matrix.ubuntu-version }}
strategy:
matrix:
ubuntu-version: [ ubuntu-22.04, ubuntu-22.04-arm, ubuntu-24.04, ubuntu-24.04-arm ]
steps:
- name: Checkout
uses: actions/checkout@v6
with:
fetch-depth: 0
- name: Validate Gradle
uses: gradle/actions/wrapper-validation@v6
- name: Setup JDK
uses: graalvm/setup-graalvm@v1
with:
java-version: ${{ env.JAVA_VERSION }}
distribution: ${{ env.JAVA_DISTRIBUTION }}
github-token: ${{ secrets.GITHUB_TOKEN }}
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v6
- name: Build
run: ./gradlew jpackage
- name: Rename .deb file
run: |
# Extract filename
DEB_FILE=$(find ./app/build/distributions -name "*.deb" -type f | head -n 1)
FILENAME=$(basename "$DEB_FILE" .deb)
# Split into components
NAME_PART=$(echo "$FILENAME" | cut -d'_' -f1) # xeres
VERSION_PART=$(echo "$FILENAME" | cut -d'_' -f2) # x.y.z
ARCH_PART=$(echo "$FILENAME" | cut -d'_' -f3-) # amd64
# Make sure we don't include the '-arm' ending as it's redundant
UBUNTU_VERSION=$(echo "${{ matrix.ubuntu-version }}" | sed 's/-arm$//')
# Create new filename
NEW_FILENAME="${NAME_PART}_${VERSION_PART}_${UBUNTU_VERSION}_${ARCH_PART}.deb"
# Rename the file
mv "./app/build/distributions/${FILENAME}.deb" "./app/build/distributions/${NEW_FILENAME}"
- name: Upload artifact
uses: actions/upload-artifact@v7
with:
path: ./app/build/distributions/xeres_*.deb
name: ubuntu-installer-deb-${{ matrix.ubuntu-version }}
retention-days: 1
create-release:
name: Create release
runs-on: ubuntu-latest
needs: [ build-windows-installer-msi,
build-windows-installer-portable,
build-ubuntu-installer-deb,
build-macos-installer ]
steps:
- name: Download windows installer
uses: actions/download-artifact@v8
with:
name: windows-installer-msi
- name: Download windows portable installer
uses: actions/download-artifact@v8
with:
name: windows-installer-portable
- name: Download ubuntu-22.04 installer
uses: actions/download-artifact@v8
with:
name: ubuntu-installer-deb-ubuntu-22.04
- name: Download ubuntu-24.04 installer
uses: actions/download-artifact@v8
with:
name: ubuntu-installer-deb-ubuntu-24.04
- name: Download ubuntu-22.04-arm installer
uses: actions/download-artifact@v8
with:
name: ubuntu-installer-deb-ubuntu-22.04-arm
- name: Download ubuntu-24.04-arm installer
uses: actions/download-artifact@v8
with:
name: ubuntu-installer-deb-ubuntu-24.04-arm
# ARM
- name: Download macos-26 installer
uses: actions/download-artifact@v8
with:
name: macos-installer-macos-26
- name: Generate checksum
uses: jmgilman/actions-generate-checksum@v1
with:
patterns: |
*.exe
*.msi
*.deb
*.rpm
*.dmg
*.zip
- name: Create Github release
uses: marvinpinto/action-automatic-releases@v1.2.1
with:
repo_token: "${{ secrets.GITHUB_TOKEN }}"
prerelease: false
draft: true
files: |
checksum.txt
*.exe
*.msi
*.deb
*.rpm
*.dmg
*.zip
================================================
FILE: .github/workflows/dependencies.yaml
================================================
name: "Gradle dependencies"
on:
push:
branches:
- master
jobs:
build:
name: Dependencies
runs-on: ubuntu-latest
permissions:
contents: write # Dependency Submission API
steps:
- name: Checkout repository
uses: actions/checkout@v6
with:
fetch-depth: 0 # A tag is needed for git version generation to work
- name: Setup JDK
uses: actions/setup-java@v5
with:
java-version: 25.0.3
distribution: 'graalvm'
- name: Generate and submit dependency graph
uses: gradle/actions/dependency-submission@v6
================================================
FILE: .github/workflows/qodana_code_quality.yml
================================================
#-------------------------------------------------------------------------------#
# Discover additional configuration options in our documentation #
# https://www.jetbrains.com/help/qodana/github.html #
#-------------------------------------------------------------------------------#
name: Qodana
on:
workflow_dispatch:
pull_request:
push:
branches:
- master
jobs:
qodana:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
checks: write
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
- name: 'Qodana Scan'
uses: JetBrains/qodana-action@v2026.1.0
env:
QODANA_TOKEN: ${{ secrets.QODANA_TOKEN }}
with:
# When pr-mode is set to true, Qodana analyzes only the files that have been changed
pr-mode: false
use-caches: true
post-pr-comment: true
use-annotations: true
# Upload Qodana results (SARIF, other artifacts, logs) as an artifact to the job
upload-result: false
# quick-fixes available in Ultimate and Ultimate Plus plans
push-fixes: 'none'
================================================
FILE: .gitignore
================================================
/data*/
/.idea/
/.vscode/
/.gradle/
/.venv/
./jpb/
/*/build/
/build/
/*/out/
/*/bin/
.xeres.lock
/.jpb/persistence-units.xml
.run/XeresApplication.run.xml
/scripts/bot/config.json
/scripts/bot/avatar.png
/cache/
/.proxyai/
/.project
/*/.project
================================================
FILE: .run/All Tests.run.xml
================================================
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="All Tests" type="GradleRunConfiguration" factoryName="Gradle">
<ExternalSystemSettings>
<option name="executionName"/>
<option name="externalProjectPath" value="$PROJECT_DIR$"/>
<option name="externalSystemIdString" value="GRADLE"/>
<option name="scriptParameters" value=""/>
<option name="taskDescriptions">
<list/>
</option>
<option name="taskNames">
<list>
<option value="test"/>
</list>
</option>
<option name="vmOptions"/>
</ExternalSystemSettings>
<ExternalSystemDebugServerProcess>true</ExternalSystemDebugServerProcess>
<ExternalSystemReattachDebugProcess>true</ExternalSystemReattachDebugProcess>
<DebugAllEnabled>false</DebugAllEnabled>
<RunAsTest>false</RunAsTest>
<method v="2"/>
</configuration>
</component>
================================================
FILE: AGENTS.md
================================================
# Xeres Development Guidelines
## Project Overview
Xeres is a Friend-to-Friend, decentralized, and secure communication application. It's a Gradle-based Java project with three subprojects:
- **app**: Main Spring Boot application with business logic
- **ui**: JavaFX desktop UI
- **common**: Shared code used by both app and ui
## Build Commands
```bash
# Run the application
./gradlew bootRun
# Build without tests
./gradlew build -x test
# Run tests
./gradlew test
# Run tests with UI (if applicable)
./gradlew :ui:test
# Package the application (creates MSI on Windows, AppImage on Linux)
./gradlew :app:jpackage
# Create portable zip
./gradlew :app:jpackage -Pjpackage.portable=true
# Clean build
./gradlew clean
# Build Docker image
./gradlew :app:bootBuildImage
```
## Architecture
- Java 25
- Spring Boot 4.0.5
- JavaFX 26 (UI module)
- JUnit 6 for testing
- ArchUnit for architecture testing
- Jacoco for code coverage
- H2 database with Flyway migrations
- JCA/JCE and BouncyCastle for cryptography
## Code Conventions
- Follow existing code style (enforced by .editorconfig, Allman Style)
- Use GPL v3 license header on new files
- Branch naming: `feature/<issue-number>-description` or `bugfix/<issue-number>-description`
- Package structure: `io.xeres.<module>.<feature>`
## Key Directories
```
app/src/main/java/io/xeres/app/ - Application entry point and services
ui/src/main/java/io/xeres/ui/ - JavaFX controllers and views
common/src/main/java/io/xeres/common/ - Shared models and utilities
app/src/main/resources/db/migration/ - Flyway database migrations
```
## Testing
- Unit tests use JUnit 6 with Jupiter
- UI tests use TestFX
- Architecture rules are enforced via ArchUnit in `common/src/test/` and `common/src/testFixtures/`
## Dependencies
- Never modify versions directly; update in `build.gradle` root version properties
- Keep Spring Boot BOM and related dependencies in sync
## Skills
For agents, there's a list of skills in `.agents/skills`.
## Source code file format
When you create code, use UTF-8 and LF as end of lines, on all architectures.
================================================
FILE: CODE_OF_CONDUCT.md
================================================
No trolling.
================================================
FILE: CONTRIBUTING.md
================================================
# How to contribute
Contributions are welcome! Please read the following in order to make it easier.
## Reporting a bug
* use the [issue tracker](https://github.com/zapek/Xeres/issues)
* make sure the bug is not already in the list, to avoid duplicates (a simple search should do)
* if in doubt, feel free to [discuss it](https://github.com/zapek/Xeres/discussions) first
## Making a feature request
* use the [issue tracker](https://github.com/zapek/Xeres/issues)
* make sure the feature request is not already in the list, to avoid duplicates (a simple search should do)
* if in doubt, feel free to [discuss it](https://github.com/zapek/Xeres/discussions) first
## Submitting changes
* make sure you use the same formatting and style (there's an .editorconfig file that does it automatically)
* create a branch using either `feature`/name if it's for adding a feature or `bugfix`/name for **simple** bugfixes (otherwise use `feature`). Use a meaningful name like `25-add-multiple-locations` (the first number being the number of the corresponding issue, if any)
* write a meaningful commit message, [this link](https://chris.beams.io/posts/git-commit/) contains useful information on how to do it
* create a [pull request](https://github.com/zapek/Xeres/pulls)
* if in doubt, feel free to [discuss it](https://github.com/zapek/Xeres/discussions) first
Thank you!
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
================================================
FILE: README.md
================================================
[](https://xeres.io)
[](https://github.com/zapek/Xeres/releases/latest)
[](https://github.com/zapek/Xeres/releases/latest)
[](https://github.com/zapek/Xeres/blob/master/LICENSE)
[](https://github.com/zapek/Xeres/actions/workflows/analysis.yml)
[](https://sonarcloud.io/summary/new_code?id=zapek_Xeres)
[](https://www.bestpractices.dev/projects/9469)
[](https://deepwiki.com/zapek/Xeres)
[Xeres](https://xeres.io) is a Friend-to-Friend, decentralized and secure application for communication and sharing.

[More screenshots](https://xeres.io/screenshots/)
---
## Features
- 🤝 Peer-to-Peer ([Friend-to-Friend](https://en.wikipedia.org/wiki/Friend-to-friend)), fully decentralized
- 🚫 No censorship
- 💬 Chat directly with your friends or in chat rooms
- 📢 Participate in forums and discuss any topic
- 📺 Publish files and news in channels
- 🖼️ Share pictures and links in boards
- 📞 Make voice calls with your friends
- 📂 Share and search files anonymously
- 👋 Compatible with [Retroshare](https://retroshare.cc) 0.6.6 or higher
- 🛠️ Hardware accelerated encryption
- 🖥️ Modern looking GPU-accelerated desktop user interface with several themes including dark mode
- 📶 Remote access, access your instance on the go (Android mobile client available [here](https://github.com/zapek/Xeres-Android))
- 📖 Free software ([GPL](https://www.gnu.org/licenses/quick-guide-gplv3.html))
- 😃 Available for Windows, Linux and macOS
## Releases
[Latest release](https://github.com/zapek/Xeres/releases/latest)
[Android mobile client](https://github.com/zapek/Xeres-Android)
[Docker image](https://hub.docker.com/r/zapek/xeres) (for headless installations)
## Quick try
Install Xeres then connect to a [ChatServer](https://retroshare.ch).
## Running from source
[Install JDK 25](https://github.com/zapek/Xeres/wiki/Java) then type `./gradlew bootRun`
## Getting Help
- [User Documentation & FAQ](https://xeres.io/docs/)
- [Discussions & Forums](https://github.com/zapek/Xeres/discussions)
- [Issues Reporting](https://github.com/zapek/Xeres/issues)
## Documentation
- [Technical Documentation](https://github.com/zapek/Xeres/wiki)
- [Roadmap](https://github.com/users/zapek/projects/4)
## Development
- [Development Help](https://github.com/zapek/Xeres/wiki#development)
- [Contributing](CONTRIBUTING.md)
================================================
FILE: SECURITY.md
================================================
# Security Policy
## Supported Versions
Only the latest version is supported. If a security bug is found, a new version will be released as quickly as possible. If there's too much work remaining in the pipeline for the next version, a patch will be released (for example, 0.3.1 -> 0.3.2 while the next version will be 0.3.3).
## Reporting a Vulnerability
Either [fill an issue on GitHub](https://github.com/zapek/Xeres/issues/new?assignees=zapek&labels=bug,security&template=bug_report.yaml) if you believe the issue can be public. If you prefer to keep it quiet, use the contact form [here](https://zapek.com/contact/). You should get a reply quickly (from a few hours for
up to 48 hours).
If the vulnerability is accepted, it will be patched as soon as possible and a new release will be made if it is present in the latest release. You will be credited in the changelog.
If the vulnerability is declined, you'll get an explanation of why.
================================================
FILE: SandBox.wsb
================================================
<Configuration>
<vGPU>disable</vGPU>
<Networking>Default</Networking>
<MappedFolders>
<MappedFolder>
<HostFolder>C:\Users\zapek\workspace\Xeres\app\build\distributions</HostFolder>
<ReadOnly>true</ReadOnly>
</MappedFolder>
</MappedFolders>
<LogonCommand>
<Command>powershell -Command "Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Bypass -Command Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\CI\Policy -Name VerifiedAndReputablePolicyState -Value 0; CiTool.exe -r' -Verb RunAs"</Command>
<!-- <Command>msiexec /i C:\Users\WDAGutilityAccount\Desktop\distributions\Xeres-0.8.1.msi</Command>-->
</LogonCommand>
</Configuration>
================================================
FILE: app/build.gradle
================================================
/*
* Copyright (c) 2025-2026 by David Gerber - https://zapek.com
*
* This file is part of Xeres.
*
* Xeres is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Xeres is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Xeres. If not, see <http://www.gnu.org/licenses/>.
*/
import org.panteleyev.jpackage.ImageType
import org.springframework.boot.gradle.plugin.SpringBootPlugin
plugins {
id 'org.springframework.boot'
id 'org.flywaydb.flyway'
id 'org.panteleyev.jpackageplugin'
id 'com.bakdata.mockito'
}
flyway {
url = "jdbc:h2:file:${project.rootDir}/data/userdata"
user = 'sa'
}
tasks.register('cleanLibs', Delete) {
delete layout.buildDirectory.dir("libs")
}
bootJar {
dependsOn cleanLibs
manifest {
attributes 'Implementation-Version': "${project.version}"
attributes 'Implementation-Title': "${project.name}"
}
}
bootRun {
bootRun.jvmArgs "-ea", "-Djava.net.preferIPv4Stack=true", "-Dfile.encoding=UTF-8"
bootRun.systemProperty 'spring.profiles.active', 'dev'
}
springBoot {
buildInfo {
excludes = ['time'] // make the build repeatable
properties {
name = rootProject.name
}
}
}
test {
useJUnitPlatform()
test.jvmArgs "-ea", "-Djava.net.preferIPv4Stack=true", "-Dfile.encoding=UTF-8"
}
tasks.register('copyInstaller', Copy) {
dependsOn cleanLibs
from layout.settingsDirectory.dir("installer")
into layout.buildDirectory.dir("libs")
}
bootBuildImage {
// Don't forget to set the image platform, for example: -Dimage.platform=linux-x86_64 or -Dimage.platform=linux-aarch_64
imageName = "zapek/${rootProject.name.toLowerCase(Locale.ROOT)}:${project.version}"
}
tasks.register('deletePortable', Delete) {
delete layout.buildDirectory.dir("distributions").get().dir(rootProject.name)
}
tasks.register('createPortableFile') {
notCompatibleWithConfigurationCache("Uses execution-time configuration filtering")
doLast {
def portable = new File("${layout.buildDirectory.dir("distributions").get().dir(rootProject.name)}", "Portable")
if (!portable.getParentFile().exists()) {
portable.getParentFile().mkdirs()
}
portable.createNewFile()
}
}
tasks.register('packagePortable', Zip) {
dependsOn createPortableFile
finalizedBy deletePortable
archiveFileName = "${rootProject.name}-${project.version}-portable.zip"
destinationDirectory = layout.buildDirectory.dir("distributions")
from layout.buildDirectory.dir("distributions").get().dir(rootProject.name)
}
jpackage {
dependsOn bootJar, copyInstaller
finalizedBy packagePortable
appName = parent.project.name
appVersion = "${project.version}".split("-")[0]
vendor = "David Gerber"
copyright = "Copyright 2019-2026 by David Gerber. All Rights Reserved"
appDescription = parent.project.name
input = layout.buildDirectory.dir("libs")
destination = layout.buildDirectory.dir("distributions")
mainJar = tasks.bootJar.archiveFileName.get()
if (project.hasProperty("jpackage.portable")) {
type = ImageType.APP_IMAGE
} else {
licenseFile = layout.settingsDirectory.file("LICENSE")
aboutUrl = "https://xeres.io"
}
// Do not supply files relative to currentDir. It can change depending on how the executable is started
javaOptions = ['-Djava.net.preferIPv4Stack=true',
'-Dfile.encoding=UTF-8',
'-splash:$APPDIR/startup.png',
'-Xms256m',
'-Xmx1g',
'-XX:+UseZGC',
'-XX:MaxMetaspaceSize=256m',
'-XX:+UseCompactObjectHeaders',
'-Dvisualvm.display.name=Xeres',
'-Dlogging.logback.rollingpolicy.clean-history-on-start=true',
'-Dlogging.logback.rollingpolicy.max-file-size=20MB',
'-Dlogging.logback.rollingpolicy.max-history=3',
'-Dspring.output.ansi.enabled=never']
windows {
if (!project.hasProperty("jpackage.portable")) {
type = ImageType.MSI
winMenu = true
winPerUserInstall = true
winDirChooser = true
winMenuGroup = parent.project.name
winUpgradeUuid = "97a4aaa5-0a3f-47f9-b0a2-f91876d9e7dd"
}
icon = layout.settingsDirectory.file("icon.ico")
}
linux {
if (project.hasProperty("jpackage.rpm")) {
type = ImageType.RPM
}
linuxShortcut = true
icon = layout.settingsDirectory.file("icon.png")
}
mac {
icon = layout.settingsDirectory.file("icon.icns")
}
}
jacocoTestReport {
reports {
xml.required = true
html.required = false
}
}
javadoc {
options.overview = "src/main/javadoc/overview.html"
}
dependencies {
implementation(platform(SpringBootPlugin.BOM_COORDINATES))
annotationProcessor(platform(SpringBootPlugin.BOM_COORDINATES))
developmentOnly(platform(SpringBootPlugin.BOM_COORDINATES))
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor' // handles @ConfigurationProperties
implementation project(':common')
implementation project(':ui')
implementation 'org.springframework.boot:spring-boot-starter-jackson'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'com.h2database:h2'
implementation 'org.springframework.boot:spring-boot-starter-webmvc'
implementation 'org.springframework.boot:spring-boot-starter-websocket'
implementation('org.springframework.boot:spring-boot-starter-webclient') { // to bring in netty, but also the WebClient that we configure
exclude group: 'io.netty', module: 'netty-transport-native-epoll' // We don't use epoll
exclude group: 'io.netty', module: 'netty-codec-native-quic' // Real programmer don't eat quiche (aka we don't need HTTP/3 and it adds 10 MB by using the google quiche library)
}
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.security:spring-security-messaging' // seems to be missing from spring-boot-starter-security
implementation 'org.springframework.boot:spring-boot-starter-flyway'
implementation 'tools.jackson.datatype:jackson-datatype-jakarta-jsonp'
runtimeOnly 'org.leadpony.joy:joy-classic:2.1.0' // JSON-P implementation
implementation "org.bouncycastle:bcpg-jdk18on:$bouncycastleVersion" // use bcpg-debug-jdk18on for debugger support
implementation "org.bouncycastle:bcpkix-jdk18on:$bouncycastleVersion" // use bcpkix-debug-jkd18on for debugger support
implementation "org.jsoup:jsoup:$jsoupVersion"
implementation 'com.github.atomashpolskiy:bt-dht:1.10'
implementation "org.apache.commons:commons-lang3:$apacheCommonsLangVersion"
implementation "org.apache.commons:commons-collections4:$apacheCommonsCollectionsVersion"
implementation "org.springdoc:springdoc-openapi-starter-webmvc-api:$springOpenApiVersion"
implementation "net.java.dev.jna:jna-platform:$jnaVersion"
implementation 'com.maxmind.geoip2:geoip2:5.1.0'
implementation "com.google.zxing:javase:$zxingVersion"
implementation 'com.sangupta:bloomfilter:0.9.0'
implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:$springOpenApiVersion"
implementation "org.commonmark:commonmark:$commonMarkVersion"
implementation "org.commonmark:commonmark-ext-gfm-strikethrough:$commonMarkVersion"
implementation "org.graalvm.polyglot:polyglot:$graalvmVersion"
implementation "org.graalvm.polyglot:js:$graalvmVersion"
implementation 'com.tianscar.javasound:javasound-speex:0.9.8'
implementation "com.twelvemonkeys.imageio:imageio-webp:$twelveMonkeysVersion"
implementation "com.twelvemonkeys.imageio:imageio-jpeg:$twelveMonkeysVersion" // Improved formats
implementation "com.twelvemonkeys.imageio:imageio-bmp:$twelveMonkeysVersion" // Adds .ico support
implementation "com.twelvemonkeys.imageio:imageio-iff:$twelveMonkeysVersion" // A blast from the past :)
implementation("com.twelvemonkeys.imageio:imageio-batik:$twelveMonkeysVersion")
implementation("org.apache.xmlgraphics:batik-all:1.19")
developmentOnly 'org.springframework.boot:spring-boot-starter-actuator'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation "org.junit.jupiter:junit-jupiter:$junitVersion"
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: "com.vaadin.external.google", module: "android-json"
}
testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test'
testImplementation 'org.springframework.boot:spring-boot-starter-data-jpa-test'
testImplementation 'org.springframework.boot:spring-boot-starter-webflux-test'
testImplementation(testFixtures(project(":common")))
testImplementation "com.tngtech.archunit:archunit-junit5:$archunitVersion"
}
================================================
FILE: app/src/main/java/io/xeres/app/XeresApplication.java
================================================
/*
* Copyright (c) 2019-2026 by David Gerber - https://zapek.com
*
* This file is part of Xeres.
*
* Xeres is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Xeres is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Xeres. If not, see <http://www.gnu.org/licenses/>.
*/
package io.xeres.app;
import io.xeres.app.application.environment.*;
import io.xeres.common.properties.StartupProperties;
import io.xeres.ui.UiStarter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import static io.xeres.common.properties.StartupProperties.Property.UI;
@SpringBootApplication(scanBasePackageClasses = {io.xeres.app.XeresApplication.class, io.xeres.ui.UiStarter.class})
public class XeresApplication
{
private static final Logger log = LoggerFactory.getLogger(XeresApplication.class);
// Spring Boot requires main to be static, always
static void main(String[] args)
{
DefaultProperties.setDefaults();
Cloud.checkIfRunningOnCloud();
HostVariable.parse();
CommandArgument.parse(args);
LocalPortFinder.ensureFreePort();
if (!StartupProperties.getBoolean(UI, true))
{
log.info("no gui mode");
SpringApplication.run(XeresApplication.class, args);
}
else
{
log.info("gui mode");
UiStarter.start(XeresApplication.class, args); // this starts spring as well
}
}
}
================================================
FILE: app/src/main/java/io/xeres/app/api/DefaultHandler.java
================================================
/*
* Copyright (c) 2019-2026 by David Gerber - https://zapek.com
*
* This file is part of Xeres.
*
* Xeres is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Xeres is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Xeres. If not, see <http://www.gnu.org/licenses/>.
*/
package io.xeres.app.api;
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.enums.SecuritySchemeIn;
import io.swagger.v3.oas.annotations.enums.SecuritySchemeType;
import io.swagger.v3.oas.annotations.info.Contact;
import io.swagger.v3.oas.annotations.info.Info;
import io.swagger.v3.oas.annotations.info.License;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.security.SecurityScheme;
import io.xeres.app.api.exception.UnprocessableEntityException;
import io.xeres.common.AppName;
import jakarta.persistence.EntityExistsException;
import jakarta.persistence.EntityNotFoundException;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.*;
import org.springframework.web.ErrorResponse;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import java.net.UnknownHostException;
import java.util.Arrays;
import java.util.NoSuchElementException;
import java.util.Optional;
@RestControllerAdvice
@OpenAPIDefinition(
info = @Info(
title = AppName.NAME,
version = "1.0",
summary = "A decentralized and secure application for communication and sharing",
license = @License(name = "GPL v3", url = "https://www.gnu.org/licenses/gpl-3.0.en.html"),
contact = @Contact(name = "Xeres", url = "https://xeres.io"),
description = """
This is the REST interface for controlling the application. Don't forget to use the _Authorize_ button on the right to enter the same
credentials as the ones in _Settings / Remote_ (you can cut & paste, don't forget to make the password visible first or it will copy asterisks).
**Note**: because some swagger-ui developers are [braindead](https://github.com/swagger-api/swagger-ui/issues/2030), 64-bit values output are truncated to 53-bit ones.
"""
),
security = @SecurityRequirement(
name = "api" // Mark all endpoints as authenticated. Otherwise, remove and add @SecurityRequirement(name = "api") separately to all controller classes or methods
)
)
@SecurityScheme(name = "api", scheme = "basic", type = SecuritySchemeType.HTTP, in = SecuritySchemeIn.HEADER)
public class DefaultHandler extends ResponseEntityExceptionHandler
{
private static final Logger log = LoggerFactory.getLogger(DefaultHandler.class);
public static final String TRACE = "trace";
@ExceptionHandler({
NoSuchElementException.class,
EntityNotFoundException.class,
UnknownHostException.class})
public ErrorResponse handleNotFoundException(Exception e)
{
logError(e, log.isDebugEnabled());
return ErrorResponse.builder(e, HttpStatus.NOT_FOUND, e.getMessage())
.property(TRACE, ExceptionUtils.getStackTrace(e))
.build();
}
@ExceptionHandler(UnprocessableEntityException.class)
public ErrorResponse handleUnprocessableEntityException(UnprocessableEntityException e)
{
logError(e, log.isDebugEnabled());
return ErrorResponse.builder(e, HttpStatus.UNPROCESSABLE_CONTENT, e.getMessage())
.property(TRACE, ExceptionUtils.getStackTrace(e))
.build();
}
@ExceptionHandler(EntityExistsException.class)
public ErrorResponse handleEntityExistsException(EntityExistsException e)
{
logError(e, log.isDebugEnabled());
return ErrorResponse.builder(e, HttpStatus.CONFLICT, e.getMessage())
.property(TRACE, ExceptionUtils.getStackTrace(e))
.build();
}
@ExceptionHandler(IllegalArgumentException.class)
public ErrorResponse handleIllegalArgumentException(IllegalArgumentException e)
{
logError(e, log.isDebugEnabled());
return ErrorResponse.builder(e, HttpStatus.BAD_REQUEST, e.getMessage())
.property(TRACE, ExceptionUtils.getStackTrace(e))
.build();
}
@ExceptionHandler(Exception.class)
public ErrorResponse handleException(Exception e)
{
logError(e, true);
return ErrorResponse.builder(e, HttpStatus.INTERNAL_SERVER_ERROR, e.getMessage())
.property(TRACE, ExceptionUtils.getStackTrace(e))
.build();
}
/**
* Generates a ResponseStatusException. Those are typically done from media endpoints
* and there's no way to put JSON error messages in there, so just ignore them.
*
* @param e the exception
* @return a ResponseEntity with just the status code and no message
*/
@ExceptionHandler(ResponseStatusException.class)
public ResponseEntity<Void> handleResponseStatusException(ResponseStatusException e)
{
return new ResponseEntity<>(e.getStatusCode());
}
// This one has to use an override
@Override
protected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatusCode status, WebRequest request)
{
var problemDetail = handleValidationException(ex);
return ResponseEntity.status(status.value()).body(problemDetail);
}
private ProblemDetail handleValidationException(MethodArgumentNotValidException ex)
{
var details = Optional.of(ex.getDetailMessageArguments())
.map(args -> Arrays.stream(args)
.filter(msg -> !ObjectUtils.isEmpty(msg))
.reduce("Wrong input,", (a, b) -> a + " " + b)
)
.orElse("").toString();
var problemDetail = ProblemDetail.forStatusAndDetail(ex.getStatusCode(), details);
problemDetail.setInstance(ex.getBody().getInstance());
return problemDetail;
}
private void logError(Exception e, boolean withStackTrace)
{
if (withStackTrace)
{
log.error("{}: {}", e.getClass().getSimpleName(), e.getMessage(), e);
}
else
{
log.error("{}: {}", e.getClass().getSimpleName(), e.getMessage());
}
}
}
================================================
FILE: app/src/main/java/io/xeres/app/api/controller/board/BoardController.java
================================================
/*
* Copyright (c) 2025-2026 by David Gerber - https://zapek.com
*
* This file is part of Xeres.
*
* Xeres is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Xeres is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Xeres. If not, see <http://www.gnu.org/licenses/>.
*/
package io.xeres.app.api.controller.board;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.headers.Header;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.xeres.app.database.model.gxs.GxsGroupItem;
import io.xeres.app.service.BoardMessageService;
import io.xeres.app.service.IdentityService;
import io.xeres.app.service.UnHtmlService;
import io.xeres.app.xrs.service.board.BoardRsService;
import io.xeres.app.xrs.service.board.item.BoardMessageItem;
import io.xeres.common.dto.board.BoardGroupDTO;
import io.xeres.common.dto.board.BoardMessageDTO;
import io.xeres.common.id.MsgId;
import io.xeres.common.rest.board.UpdateBoardMessageReadRequest;
import io.xeres.common.util.image.ImageUtils;
import jakarta.validation.Valid;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.core.io.InputStreamResource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.ErrorResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import static io.xeres.app.database.model.board.BoardMapper.*;
import static io.xeres.common.rest.PathConfig.BOARDS_PATH;
@Tag(name = "Boards", description = "Boards")
@RestController
@RequestMapping(value = BOARDS_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
public class BoardController
{
private final BoardRsService boardRsService;
private final IdentityService identityService;
private final BoardMessageService boardMessageService;
private final UnHtmlService unHtmlService;
public BoardController(BoardRsService boardRsService, IdentityService identityService, BoardMessageService boardMessageService, UnHtmlService unHtmlService)
{
this.boardRsService = boardRsService;
this.identityService = identityService;
this.boardMessageService = boardMessageService;
this.unHtmlService = unHtmlService;
}
@GetMapping("/groups")
@Operation(summary = "Gets the list of boards")
public List<BoardGroupDTO> getBoardGroups()
{
return toDTOs(boardRsService.findAllGroups());
}
@PostMapping(value = "/groups", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "Creates a board")
@ApiResponse(responseCode = "201", description = "Board created successfully", headers = @Header(name = "Board", description = "The location of the created board", schema = @Schema(type = "string")))
public ResponseEntity<Void> createBoardGroup(@RequestParam(value = "name") String name,
@RequestParam(value = "description") String description,
@RequestParam(value = "image", required = false) MultipartFile imageFile) throws IOException
{
var ownIdentity = identityService.getOwnIdentity();
var id = boardRsService.createBoardGroup(ownIdentity.getGxsId(), name, description, imageFile);
var location = ServletUriComponentsBuilder.fromCurrentRequest().replacePath(BOARDS_PATH + "/groups/{id}").buildAndExpand(id).toUri();
return ResponseEntity.created(location).build();
}
@PutMapping(value = "/groups/{groupId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "Updates a board")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void updateBoardGroup(@PathVariable long groupId,
@RequestParam(value = "name") String name,
@RequestParam(value = "description") String description,
@RequestParam(value = "image", required = false) MultipartFile imageFile,
@RequestParam(value = "updateImage", required = false) Boolean updateImage) throws IOException
{
boardRsService.updateBoardGroup(groupId, name, description, imageFile, updateImage != null ? updateImage : false);
}
@GetMapping(value = "/groups/{id}/image", produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE})
@Operation(summary = "Returns an board's image")
@ApiResponse(responseCode = "200", description = "Board image found")
@ApiResponse(responseCode = "204", description = "Board image is empty")
@ApiResponse(responseCode = "404", description = "Board not found", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public ResponseEntity<InputStreamResource> downloadBoardGroupImage(@PathVariable long id)
{
var group = boardRsService.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); // Bypass the global controller advice because it only knows about application/json mimetype
var imageType = ImageUtils.getImageMimeType(group.getImage());
if (imageType == null)
{
return ResponseEntity.noContent().build();
}
return ResponseEntity.ok()
.contentLength(group.getImage().length)
.contentType(imageType)
.body(new InputStreamResource(new ByteArrayInputStream(group.getImage())));
}
@GetMapping("/groups/{groupId}")
@Operation(summary = "Gets the details of a board")
@ApiResponse(responseCode = "200", description = "Request successful")
public BoardGroupDTO getBoardGroupById(@PathVariable long groupId)
{
return toDTO(boardRsService.findById(groupId).orElseThrow());
}
@GetMapping("/groups/{groupId}/unread-count")
@Operation(summary = "Get the unread count of a board")
public int getBoardUnreadCount(@PathVariable long groupId)
{
return boardRsService.getUnreadCount(groupId);
}
@PutMapping("/groups/{groupId}/subscription")
@Operation(summary = "Subscribes to a board")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void subscribeToBoardGroup(@PathVariable long groupId)
{
boardRsService.subscribeToBoardGroup(groupId);
}
@PutMapping("/groups/{groupId}/read")
@Operation(summary = "Sets all messages in the group as read or unread")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void setAllGroupMessagesReadState(@PathVariable long groupId, @RequestParam(value = "read") Boolean read)
{
boardRsService.setAllGroupMessagesReadState(groupId, read);
}
@DeleteMapping("/groups/{groupId}/subscription")
@Operation(summary = "Unsubscribes from a board")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void unsubscribeFromBoardGroup(@PathVariable long groupId)
{
boardRsService.unsubscribeFromBoardGroup(groupId);
}
@GetMapping("/groups/{groupId}/messages")
@Operation(summary = "Gets the messages from a group")
public Page<BoardMessageDTO> getBoardMessages(@PathVariable long groupId, @PageableDefault(size = 50, sort = {"published"}, direction = Direction.DESC) Pageable pageable)
{
var boardMessages = boardRsService.findAllMessages(groupId, pageable);
return new PageImpl<>(toBoardMessageDTOs(unHtmlService,
boardMessages,
boardMessageService.getAuthorsMapFromMessages(boardMessages),
boardMessageService.getMessagesMapFromSummaries(groupId, boardMessages)),
pageable,
boardMessages.getTotalElements());
}
@GetMapping("/messages/{messageId}")
@Operation(summary = "Gets a message")
@ApiResponse(responseCode = "200", description = "Request successful")
public BoardMessageDTO getBoardMessage(@PathVariable long messageId)
{
var boardMessage = boardRsService.findMessageById(messageId).orElseThrow();
Objects.requireNonNull(boardMessage, "Board message " + messageId + " not found");
var author = identityService.findByGxsId(boardMessage.getAuthorGxsId());
HashSet<MsgId> messageSet = HashSet.newHashSet(2); // they can be null so no Set.of() possible
CollectionUtils.addIgnoreNull(messageSet, boardMessage.getOriginalMsgId());
CollectionUtils.addIgnoreNull(messageSet, boardMessage.getParentMsgId());
var messages = boardRsService.findAllMessagesIncludingOlds(boardMessage.getGxsId(), messageSet).stream()
.collect(Collectors.toMap(BoardMessageItem::getMsgId, BoardMessageItem::getId));
return toDTO(
unHtmlService,
boardMessage,
author.map(GxsGroupItem::getName).orElse(null),
messages.getOrDefault(boardMessage.getOriginalMsgId(), 0L),
messages.getOrDefault(boardMessage.getParentMsgId(), 0L)
);
}
@PostMapping(value = "/messages", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "Creates a board message")
@ApiResponse(responseCode = "201", description = "Board message created successfully", headers = @Header(name = "Message", description = "The location of the created message", schema = @Schema(type = "string")))
public ResponseEntity<Void> createBoardMessage(@RequestParam(value = "boardId") long boardId,
@RequestParam(value = "title") String title,
@RequestParam(value = "content", required = false) String content,
@RequestParam(value = "link", required = false) String link,
@RequestParam(value = "image", required = false) MultipartFile imageFile) throws IOException
{
var ownIdentity = identityService.getOwnIdentity();
var id = boardRsService.createBoardMessage(
ownIdentity,
boardId,
title,
content,
link,
imageFile
);
var location = ServletUriComponentsBuilder.fromCurrentRequest().replacePath(BOARDS_PATH + "/messages/{id}").buildAndExpand(id).toUri();
return ResponseEntity.created(location).build();
}
@GetMapping(value = "/messages/{id}/image", produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE, MediaType.IMAGE_GIF_VALUE, "image/webp"})
@Operation(summary = "Returns an board message's image")
@ApiResponse(responseCode = "200", description = "Board message image found")
@ApiResponse(responseCode = "204", description = "Board message image is empty")
@ApiResponse(responseCode = "404", description = "Board not found", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public ResponseEntity<InputStreamResource> downloadBoardMessageImage(@PathVariable long id)
{
var group = boardRsService.findMessageById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); // Bypass the global controller advice because it only knows about application/json mimetype
var imageType = ImageUtils.getImageMimeType(group.getImage());
if (imageType == null)
{
return ResponseEntity.noContent().build();
}
return ResponseEntity.ok()
.contentLength(group.getImage().length)
.contentType(imageType)
.body(new InputStreamResource(new ByteArrayInputStream(group.getImage())));
}
@PatchMapping("/messages")
@Operation(summary = "Modifies board message read state")
@ResponseStatus(HttpStatus.OK)
public void setBoardMessageReadState(@Valid @RequestBody UpdateBoardMessageReadRequest request)
{
boardRsService.setMessageReadState(request.messageId(), request.read());
}
}
================================================
FILE: app/src/main/java/io/xeres/app/api/controller/channel/ChannelController.java
================================================
/*
* Copyright (c) 2025-2026 by David Gerber - https://zapek.com
*
* This file is part of Xeres.
*
* Xeres is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Xeres is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Xeres. If not, see <http://www.gnu.org/licenses/>.
*/
package io.xeres.app.api.controller.channel;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.headers.Header;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.xeres.app.database.model.channel.ChannelMapper;
import io.xeres.app.database.model.gxs.GxsGroupItem;
import io.xeres.app.service.ChannelMessageService;
import io.xeres.app.service.IdentityService;
import io.xeres.app.service.UnHtmlService;
import io.xeres.app.xrs.service.channel.ChannelRsService;
import io.xeres.app.xrs.service.channel.item.ChannelMessageItem;
import io.xeres.common.dto.channel.ChannelFileDTO;
import io.xeres.common.dto.channel.ChannelGroupDTO;
import io.xeres.common.dto.channel.ChannelMessageDTO;
import io.xeres.common.id.MsgId;
import io.xeres.common.rest.channel.UpdateChannelMessageReadRequest;
import io.xeres.common.util.image.ImageUtils;
import jakarta.validation.Valid;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.core.io.InputStreamResource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.ErrorResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.server.ResponseStatusException;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import static io.xeres.app.database.model.channel.ChannelMapper.*;
import static io.xeres.common.rest.PathConfig.CHANNELS_PATH;
@Tag(name = "Channels", description = "Channels")
@RestController
@RequestMapping(value = CHANNELS_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
public class ChannelController
{
private final ChannelRsService channelRsService;
private final IdentityService identityService;
private final ChannelMessageService channelMessageService;
private final UnHtmlService unHtmlService;
public ChannelController(ChannelRsService channelRsService, IdentityService identityService, ChannelMessageService channelMessageService, UnHtmlService unHtmlService)
{
this.channelRsService = channelRsService;
this.identityService = identityService;
this.channelMessageService = channelMessageService;
this.unHtmlService = unHtmlService;
}
@GetMapping("/groups")
@Operation(summary = "Gets the list of channels")
public List<ChannelGroupDTO> getChannelGroups()
{
return toDTOs(channelRsService.findAllGroups());
}
@PostMapping(value = "/groups", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "Creates a channel")
@ApiResponse(responseCode = "201", description = "Channel created successfully", headers = @Header(name = "Channel", description = "The location of the created channel", schema = @Schema(type = "string")))
public ResponseEntity<Void> createChannelGroup(@RequestParam(value = "name") String name,
@RequestParam(value = "description") String description,
@RequestParam(value = "image", required = false) MultipartFile imageFile) throws IOException
{
var ownIdentity = identityService.getOwnIdentity();
var id = channelRsService.createChannelGroup(ownIdentity.getGxsId(), name, description, imageFile);
var location = ServletUriComponentsBuilder.fromCurrentRequest().replacePath(CHANNELS_PATH + "/groups/{id}").buildAndExpand(id).toUri();
return ResponseEntity.created(location).build();
}
@PutMapping(value = "/groups/{groupId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "Updates a channel")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void updateChannelGroup(@PathVariable long groupId,
@RequestParam(value = "name") String name,
@RequestParam(value = "description") String description,
@RequestParam(value = "image", required = false) MultipartFile imageFile,
@RequestParam(value = "updateImage", required = false) Boolean updateImage) throws IOException
{
channelRsService.updateChannelGroup(groupId, name, description, imageFile, updateImage != null ? updateImage : false);
}
@GetMapping(value = "/groups/{id}/image", produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE})
@Operation(summary = "Returns a channel's image")
@ApiResponse(responseCode = "200", description = "Channel's image found")
@ApiResponse(responseCode = "204", description = "Channel's image is empty")
@ApiResponse(responseCode = "404", description = "Channel not found", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public ResponseEntity<InputStreamResource> downloadChannelGroupImage(@PathVariable long id)
{
var group = channelRsService.findById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); // Bypass the global controller advice because it only knows about application/json mimetype
var imageType = ImageUtils.getImageMimeType(group.getImage());
if (imageType == null)
{
return ResponseEntity.noContent().build();
}
return ResponseEntity.ok()
.contentLength(group.getImage().length)
.contentType(imageType)
.body(new InputStreamResource(new ByteArrayInputStream(group.getImage())));
}
@GetMapping("/groups/{groupId}")
@Operation(summary = "Gets the details of a channel")
@ApiResponse(responseCode = "200", description = "Request successful")
public ChannelGroupDTO getChannelGroupById(@PathVariable long groupId)
{
return toDTO(channelRsService.findById(groupId).orElseThrow());
}
@GetMapping("/groups/{groupId}/unread-count")
@Operation(summary = "Get the unread count of a channel")
public int getChannelUnreadCount(@PathVariable long groupId)
{
return channelRsService.getUnreadCount(groupId);
}
@PutMapping("/groups/{groupId}/subscription")
@Operation(summary = "Subscribes to a channel")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void subscribeToChannelGroup(@PathVariable long groupId)
{
channelRsService.subscribeToChannelGroup(groupId);
}
@PutMapping("/groups/{groupId}/read")
@Operation(summary = "Sets all messages in the group as read or unread")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void setAllGroupMessagesReadState(@PathVariable long groupId, @RequestParam(value = "read") Boolean read)
{
channelRsService.setAllGroupMessagesReadState(groupId, read);
}
@DeleteMapping("/groups/{groupId}/subscription")
@Operation(summary = "Unsubscribes from a channel")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void unsubscribeFromChannelGroup(@PathVariable long groupId)
{
channelRsService.unsubscribeFromChannelGroup(groupId);
}
@GetMapping("/groups/{groupId}/messages")
@Operation(summary = "Gets the summary of messages in a group")
public Page<ChannelMessageDTO> getChannelMessages(@PathVariable long groupId, @PageableDefault(size = 50, sort = {"published"}, direction = Sort.Direction.DESC) Pageable pageable)
{
var channelMessages = channelRsService.findAllMessages(groupId, pageable);
return new PageImpl<>(toSummaryMessageDTOs(channelMessages,
channelMessageService.getAuthorsMapFromMessages(channelMessages),
channelMessageService.getMessagesMapFromSummaries(groupId, channelMessages)),
pageable,
channelMessages.getTotalElements());
}
@GetMapping("/messages/{messageId}")
@Operation(summary = "Gets a message")
@ApiResponse(responseCode = "200", description = "Request successful")
public ChannelMessageDTO getChannelMessage(@PathVariable long messageId)
{
var channelMessage = channelRsService.findMessageById(messageId).orElseThrow();
Objects.requireNonNull(channelMessage, "Channel message " + messageId + " not found");
var author = identityService.findByGxsId(channelMessage.getAuthorGxsId());
HashSet<MsgId> messageSet = HashSet.newHashSet(2); // they can be null so no Set.of() possible
CollectionUtils.addIgnoreNull(messageSet, channelMessage.getOriginalMsgId());
CollectionUtils.addIgnoreNull(messageSet, channelMessage.getParentMsgId());
var messages = channelRsService.findAllMessagesIncludingOlds(channelMessage.getGxsId(), messageSet).stream()
.collect(Collectors.toMap(ChannelMessageItem::getMsgId, ChannelMessageItem::getId));
return toDTO(
unHtmlService,
channelMessage,
author.map(GxsGroupItem::getName).orElse(null),
messages.getOrDefault(channelMessage.getOriginalMsgId(), 0L),
messages.getOrDefault(channelMessage.getParentMsgId(), 0L),
true
);
}
@PostMapping(value = "/messages", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "Creates a channel message")
@ApiResponse(responseCode = "201", description = "Channel message created successfully", headers = @Header(name = "Message", description = "The location of the created message", schema = @Schema(type = "string")))
public ResponseEntity<Void> createChannelMessage(@RequestParam(value = "channelId") long channelId,
@RequestParam(value = "title") String title,
@RequestParam(value = "content", required = false) String content,
@RequestParam(value = "originalId", required = false) Long originalId,
@RequestParam(value = "image", required = false) MultipartFile imageFile,
@RequestPart(value = "files", required = false) List<ChannelFileDTO> files) throws IOException
{
var ownIdentity = identityService.getOwnIdentity();
var id = channelRsService.createChannelMessage(
ownIdentity,
channelId,
title,
content,
imageFile,
ChannelMapper.toFileItems(files),
originalId != null ? originalId : 0L
);
var location = ServletUriComponentsBuilder.fromCurrentRequest().replacePath(CHANNELS_PATH + "/messages/{id}").buildAndExpand(id).toUri();
return ResponseEntity.created(location).build();
}
@GetMapping(value = "/messages/{id}/image", produces = {MediaType.IMAGE_JPEG_VALUE, MediaType.IMAGE_PNG_VALUE})
@Operation(summary = "Returns a channel message's image")
@ApiResponse(responseCode = "200", description = "Channel message image found")
@ApiResponse(responseCode = "204", description = "Channel message image is empty")
@ApiResponse(responseCode = "404", description = "Channel not found", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public ResponseEntity<InputStreamResource> downloadChannelMessageImage(@PathVariable long id)
{
var group = channelRsService.findMessageById(id).orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND)); // Bypass the global controller advice because it only knows about application/json mimetype
var imageType = ImageUtils.getImageMimeType(group.getImage());
if (imageType == null)
{
return ResponseEntity.noContent().build();
}
return ResponseEntity.ok()
.contentLength(group.getImage().length)
.contentType(imageType)
.body(new InputStreamResource(new ByteArrayInputStream(group.getImage())));
}
@PatchMapping("/messages")
@Operation(summary = "Modifies channel message read state")
@ResponseStatus(HttpStatus.OK)
public void setChannelMessageReadState(@Valid @RequestBody UpdateChannelMessageReadRequest request)
{
channelRsService.setMessageReadState(request.messageId(), request.read());
}
}
================================================
FILE: app/src/main/java/io/xeres/app/api/controller/chat/ChatController.java
================================================
/*
* Copyright (c) 2019-2025 by David Gerber - https://zapek.com
*
* This file is part of Xeres.
*
* Xeres is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Xeres is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Xeres. If not, see <http://www.gnu.org/licenses/>.
*/
package io.xeres.app.api.controller.chat;
import io.swagger.v3.oas.annotations.ExternalDocumentation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.headers.Header;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.xeres.app.service.IdentityService;
import io.xeres.app.service.LocationService;
import io.xeres.app.xrs.service.chat.ChatBacklogService;
import io.xeres.app.xrs.service.chat.ChatRsService;
import io.xeres.app.xrs.service.chat.RoomFlags;
import io.xeres.common.dto.chat.ChatBacklogDTO;
import io.xeres.common.dto.chat.ChatRoomBacklogDTO;
import io.xeres.common.dto.chat.ChatRoomContextDTO;
import io.xeres.common.dto.location.LocationDTO;
import io.xeres.common.id.LocationIdentifier;
import io.xeres.common.rest.chat.ChatRoomVisibility;
import io.xeres.common.rest.chat.CreateChatRoomRequest;
import io.xeres.common.rest.chat.DistantChatRequest;
import io.xeres.common.rest.chat.InviteToChatRoomRequest;
import jakarta.persistence.EntityExistsException;
import jakarta.persistence.EntityNotFoundException;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.ErrorResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.EnumSet;
import java.util.List;
import java.util.stream.Collectors;
import static io.xeres.app.database.model.chat.ChatMapper.fromDistantChatBacklogToChatBacklogDTOs;
import static io.xeres.app.database.model.chat.ChatMapper.toChatBacklogDTOs;
import static io.xeres.app.database.model.chat.ChatMapper.toChatRoomBacklogDTOs;
import static io.xeres.app.database.model.chat.ChatMapper.toDTO;
import static io.xeres.app.database.model.location.LocationMapper.toDTO;
import static io.xeres.common.rest.PathConfig.CHAT_PATH;
@Tag(name = "Chat", description = "Chat rooms, private messages, distant chats, ...", externalDocs = @ExternalDocumentation(url = "https://github.com/zapek/Xeres/wiki/Chat", description = "Chat protocol"))
@RestController
@RequestMapping(value = CHAT_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
public class ChatController
{
private static final int PRIVATE_CHAT_DEFAULT_MAX_LINES = 20;
private static final Duration PRIVATE_CHAT_DEFAULT_DURATION = Duration.ofDays(7);
private static final int ROOM_CHAT_DEFAULT_MAX_LINES = 50;
private static final Duration ROOM_CHAT_DEFAULT_DURATION = Duration.ofDays(7);
private final ChatRsService chatRsService;
private final ChatBacklogService chatBacklogService;
private final LocationService locationService;
private final IdentityService identityService;
public ChatController(ChatRsService chatRsService, ChatBacklogService chatBacklogService, LocationService locationService, IdentityService identityService)
{
this.chatRsService = chatRsService;
this.chatBacklogService = chatBacklogService;
this.locationService = locationService;
this.identityService = identityService;
}
@PostMapping("/rooms")
@Operation(summary = "Creates a chat room")
@ApiResponse(responseCode = "201", description = "Chat room created successfully", headers = @Header(name = "Room", description = "The location of the created chat room", schema = @Schema(type = "string")))
public ResponseEntity<Void> createChatRoom(@Valid @RequestBody CreateChatRoomRequest createChatRoomRequest)
{
var id = chatRsService.createChatRoom(createChatRoomRequest.name(),
createChatRoomRequest.topic(),
createChatRoomRequest.visibility() == ChatRoomVisibility.PUBLIC ? EnumSet.of(RoomFlags.PUBLIC) : EnumSet.noneOf(RoomFlags.class),
createChatRoomRequest.signedIdentities());
var location = ServletUriComponentsBuilder.fromCurrentRequest().replacePath(CHAT_PATH + "/rooms/{id}").buildAndExpand(id).toUri();
return ResponseEntity.created(location).build();
}
@PostMapping("/rooms/invite")
@Operation(summary = "Invites one or several locations to a chat room")
public void inviteToChatRoom(@Valid @RequestBody InviteToChatRoomRequest inviteToChatRoomRequest)
{
chatRsService.inviteLocationsToChatRoom(inviteToChatRoomRequest.chatRoomId(), inviteToChatRoomRequest.locationIdentifiers().stream()
.map(LocationIdentifier::fromString)
.collect(Collectors.toSet()));
}
@PutMapping("/rooms/{id}/subscription")
@Operation(summary = "Subscribes to a chat room")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void subscribeToChatRoom(@PathVariable @Parameter(description = "The room's unique 64-bit identifier") long id)
{
chatRsService.joinChatRoom(id);
}
@DeleteMapping("/rooms/{id}/subscription")
@Operation(summary = "Unsubscribes from a chat room")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void unsubscribeFromChatRoom(@PathVariable @Parameter(description = "The room's unique 64-bit identifier") long id)
{
chatRsService.leaveChatRoom(id);
}
@GetMapping("/rooms")
@Operation(summary = "Gets a chat room context", description = "The context contains all rooms, status, current nickname, etc...")
public ChatRoomContextDTO getChatRoomContext()
{
return toDTO(chatRsService.getChatRoomContext());
}
@GetMapping("/rooms/{roomId}/messages")
@Operation(summary = "Gets the chat room messages backlog")
@ApiResponse(responseCode = "200", description = "OK")
@ApiResponse(responseCode = "404", description = "No room found for given id", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public List<ChatRoomBacklogDTO> getChatRoomMessages(@PathVariable @Parameter(description = "The room's unique 64-bit identifier") long roomId,
@RequestParam(value = "maxLines", required = false) @Min(1) @Max(500) Integer maxLines,
@RequestParam(value = "from", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime from)
{
return toChatRoomBacklogDTOs(chatBacklogService.getChatRoomMessages(
roomId,
from != null ? from.toInstant(ZoneOffset.UTC) : Instant.now().minus(ROOM_CHAT_DEFAULT_DURATION),
maxLines != null ? maxLines : ROOM_CHAT_DEFAULT_MAX_LINES));
}
@DeleteMapping("/rooms/{roomId}/messages")
@Operation(summary = "Clears the chat room messages backlog of a given chat room")
@ResponseStatus(HttpStatus.NO_CONTENT)
@ApiResponse(responseCode = "404", description = "No chat room found for given id", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public void deleteChatRoomMessages(@PathVariable @Parameter(description = "The room's unique 64-bit identifier") long roomId)
{
chatBacklogService.deleteChatRoomMessages(roomId);
}
@GetMapping("/chats/{locationId}/messages")
@Operation(summary = "Gets the private chat messages backlog")
@ApiResponse(responseCode = "200", description = "OK")
@ApiResponse(responseCode = "404", description = "No location found for given id", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public List<ChatBacklogDTO> getChatMessages(@PathVariable @Parameter(description = "The location id") long locationId,
@RequestParam(value = "maxLines", required = false) @Min(1) @Max(500) Integer maxLines,
@RequestParam(value = "from", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime from)
{
var location = locationService.findLocationById(locationId).orElseThrow();
return toChatBacklogDTOs(chatBacklogService.getMessages(
location,
from != null ? from.toInstant(ZoneOffset.UTC) : Instant.now().minus(PRIVATE_CHAT_DEFAULT_DURATION),
maxLines != null ? maxLines : PRIVATE_CHAT_DEFAULT_MAX_LINES));
}
@DeleteMapping("/chats/{locationId}/messages")
@Operation(summary = "Clears the private chat messages backlog of a given location")
@ResponseStatus(HttpStatus.NO_CONTENT)
@ApiResponse(responseCode = "404", description = "No location found for given id", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public void deleteChatMessages(@PathVariable @Parameter(description = "The location id") long locationId)
{
var location = locationService.findLocationById(locationId).orElseThrow();
chatBacklogService.deleteMessages(location);
}
@PostMapping("/distant-chats")
@Operation(summary = "Creates a distant chat")
@ApiResponse(responseCode = "200", description = "OK")
@ApiResponse(responseCode = "404", description = "No identity found for given id", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
@ApiResponse(responseCode = "409", description = "Tunnel already exists", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public LocationDTO createDistantChat(@Valid @RequestBody DistantChatRequest distantChatRequest)
{
var identity = identityService.findById(distantChatRequest.identityId()).orElseThrow();
var location = toDTO(chatRsService.createDistantChat(identity));
if (location == null)
{
throw new EntityExistsException("Distant chat already active");
}
return location;
}
@DeleteMapping("/distant-chats/{identityId}")
@Operation(summary = "Closes a distant chat")
@ResponseStatus(HttpStatus.NO_CONTENT)
@ApiResponse(responseCode = "404", description = "No identity found for given id", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
void closeDistantChat(@PathVariable long identityId)
{
var identity = identityService.findById(identityId).orElseThrow();
if (!chatRsService.closeDistantChat(identity))
{
throw new EntityNotFoundException("No distant chat for identity id " + identityId);
}
}
@GetMapping("/distant-chats/{identityId}/messages")
@Operation(summary = "Gets the distant chat messages backlog of a given identity")
@ApiResponse(responseCode = "200", description = "OK")
@ApiResponse(responseCode = "404", description = "No identity found for given id", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public List<ChatBacklogDTO> getDistantChatMessages(@PathVariable @Parameter(description = "The identity id") long identityId,
@RequestParam(value = "maxLines", required = false) @Min(1) @Max(500) Integer maxLines,
@RequestParam(value = "from", required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime from)
{
var identity = identityService.findById(identityId).orElseThrow();
return fromDistantChatBacklogToChatBacklogDTOs(chatBacklogService.getDistantMessages(
identity,
from != null ? from.toInstant(ZoneOffset.UTC) : Instant.now().minus(PRIVATE_CHAT_DEFAULT_DURATION),
maxLines != null ? maxLines : PRIVATE_CHAT_DEFAULT_MAX_LINES));
}
@DeleteMapping("/distant-chats/{identityId}/messages")
@Operation(summary = "Clears the distant chat messages backlog of a given identity")
@ResponseStatus(HttpStatus.NO_CONTENT)
@ApiResponse(responseCode = "404", description = "No identity found for given id", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public void deleteDistantChatMessages(@PathVariable @Parameter(description = "The identity id") long identityId)
{
var identity = identityService.findById(identityId).orElseThrow();
chatBacklogService.deleteDistantMessages(identity);
}
}
================================================
FILE: app/src/main/java/io/xeres/app/api/controller/chat/ChatMessageController.java
================================================
/*
* Copyright (c) 2019-2025 by David Gerber - https://zapek.com
*
* This file is part of Xeres.
*
* Xeres is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Xeres is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Xeres. If not, see <http://www.gnu.org/licenses/>.
*/
package io.xeres.app.api.controller.chat;
import io.xeres.app.service.MessageService;
import io.xeres.app.xrs.service.chat.ChatRsService;
import io.xeres.common.id.GxsId;
import io.xeres.common.id.LocationIdentifier;
import io.xeres.common.message.MessageType;
import io.xeres.common.message.chat.ChatMessage;
import io.xeres.common.message.chat.ChatRoomMessage;
import jakarta.validation.Valid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.messaging.handler.annotation.Header;
import org.springframework.messaging.handler.annotation.MessageExceptionHandler;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.messaging.simp.annotation.SendToUser;
import org.springframework.stereotype.Controller;
import java.util.Objects;
import static io.xeres.common.message.MessageHeaders.DESTINATION_ID;
import static io.xeres.common.message.MessageHeaders.MESSAGE_TYPE;
import static io.xeres.common.message.MessagePath.*;
/**
* This controller receives WebSocket messages sent to /app, which means they're produced by the app user.
* <p>
* <img src="doc-files/websocket.svg" alt="WebSocket diagram">
*/
@Controller
@MessageMapping(CHAT_ROOT)
public class ChatMessageController
{
private static final Logger log = LoggerFactory.getLogger(ChatMessageController.class);
private final ChatRsService chatRsService;
private final MessageService messageService;
public ChatMessageController(ChatRsService chatRsService, MessageService messageService)
{
this.chatRsService = chatRsService;
this.messageService = messageService;
}
@MessageMapping(CHAT_PRIVATE_DESTINATION)
public void processPrivateChatMessageFromProducer(@Header(DESTINATION_ID) String destinationId, @Header(MESSAGE_TYPE) MessageType messageType, @Payload @Valid ChatMessage chatMessage)
{
switch (messageType)
{
case CHAT_PRIVATE_MESSAGE ->
{
logMessage("Received private chat websocket message, sending to peer location: " + destinationId, chatMessage.getContent());
var locationIdentifier = LocationIdentifier.fromString(destinationId);
chatRsService.sendPrivateMessage(locationIdentifier, chatMessage.getContent());
chatMessage.setOwn(true);
messageService.sendToConsumers(chatPrivateDestination(), messageType, locationIdentifier, chatMessage);
}
case CHAT_TYPING_NOTIFICATION ->
{
log.debug("Sending private chat typing notification...");
Objects.requireNonNull(destinationId);
chatRsService.sendPrivateTypingNotification(LocationIdentifier.fromString(destinationId));
}
case CHAT_AVATAR ->
{
log.debug("Requesting private chat avatar...");
Objects.requireNonNull(destinationId);
chatRsService.sendAvatarRequest(LocationIdentifier.fromString(destinationId));
}
default -> throw new IllegalStateException("Unexpected value: " + messageType);
}
}
@MessageMapping(CHAT_DISTANT_DESTINATION)
public void processDistantChatMessageFromProducer(@Header(DESTINATION_ID) String destinationId, @Header(MESSAGE_TYPE) MessageType messageType, @Payload @Valid ChatMessage chatMessage)
{
switch (messageType)
{
case CHAT_PRIVATE_MESSAGE ->
{
logMessage("Received distant chat websocket message, sending to peer gxsId: " + destinationId, chatMessage.getContent());
var gxsId = GxsId.fromString(destinationId);
chatRsService.sendPrivateMessage(gxsId, chatMessage.getContent());
chatMessage.setOwn(true);
messageService.sendToConsumers(chatDistantDestination(), messageType, gxsId, chatMessage);
}
case CHAT_TYPING_NOTIFICATION ->
{
log.debug("Sending distant chat typing notification...");
Objects.requireNonNull(destinationId);
chatRsService.sendPrivateTypingNotification(GxsId.fromString(destinationId));
}
default -> throw new IllegalStateException("Unexpected value: " + messageType);
}
}
@MessageMapping(CHAT_ROOM_DESTINATION)
public void processChatRoomMessageFromProducer(@Header(DESTINATION_ID) String destinationId, @Header(MESSAGE_TYPE) MessageType messageType, @Payload @Valid ChatRoomMessage chatRoomMessage)
{
switch (messageType)
{
case CHAT_ROOM_MESSAGE ->
{
logMessage("Sending to room " + destinationId + ", size: " + (chatRoomMessage.isEmpty() ? 0 : chatRoomMessage.getContent().length()), chatRoomMessage.getContent());
Objects.requireNonNull(destinationId);
var chatRoomId = Long.parseLong(destinationId);
chatRsService.sendChatRoomMessage(chatRoomId, chatRoomMessage.getContent());
messageService.sendToConsumers(chatRoomDestination(), messageType, chatRoomId, chatRoomMessage);
}
case CHAT_ROOM_TYPING_NOTIFICATION ->
{
log.debug("Sending chat room typing notification...");
Objects.requireNonNull(destinationId);
chatRsService.sendChatRoomTypingNotification(Long.parseLong(destinationId));
}
default -> throw new IllegalStateException("Unexpected value: " + messageType);
}
}
@MessageMapping(CHAT_BROADCAST_DESTINATION)
public void processBroadcastMessageFromProducer(@Header(MESSAGE_TYPE) MessageType messageType, @Payload @Valid ChatMessage chatMessage)
{
switch (messageType)
{
case CHAT_BROADCAST_MESSAGE ->
{
logMessage("Sending broadcast message", chatMessage.getContent());
chatRsService.sendBroadcastMessage(chatMessage.getContent());
}
default -> throw new IllegalStateException("Unexpected value: " + messageType);
}
}
@MessageExceptionHandler
@SendToUser(DIRECT_PREFIX + "/errors") // XXX: how can we use this? Well, it works... just have to subscribe to it
public String handleException(Throwable e)
{
log.debug("Got exception: {}", e.getMessage(), e);
return e.getMessage();
}
private void logMessage(String info, String message)
{
if (log.isTraceEnabled())
{
log.trace("{}, content: {}", info, message);
}
else if (log.isDebugEnabled())
{
log.debug("{}", info);
}
}
}
================================================
FILE: app/src/main/java/io/xeres/app/api/controller/chat/doc-files/websocket.puml
================================================
@startuml
'https://plantuml.com/component-diagram
package "UI Client" {
component producer #Cyan [
Producer
/app/chat/private
]
component consumer #Cyan [
Consumer
/topic/chat/private
]
}
package "App Server" {
[MessageHandler] #Green
}
cloud "RS Network" {
[Friend]
}
[producer] --> [MessageHandler] : /app
[MessageHandler] --> [consumer] : /topic
[MessageHandler] <-> [Friend]
@enduml
================================================
FILE: app/src/main/java/io/xeres/app/api/controller/chat/package-info.java
================================================
/*
* Copyright (c) 2024 by David Gerber - https://zapek.com
*
* This file is part of Xeres.
*
* Xeres is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Xeres is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Xeres. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* Chat rooms and private messaging REST controller
*/
package io.xeres.app.api.controller.chat;
================================================
FILE: app/src/main/java/io/xeres/app/api/controller/config/ConfigController.java
================================================
/*
* Copyright (c) 2019-2026 by David Gerber - https://zapek.com
*
* This file is part of Xeres.
*
* Xeres is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Xeres is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Xeres. If not, see <http://www.gnu.org/licenses/>.
*/
package io.xeres.app.api.controller.config;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.headers.Header;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.xeres.app.api.exception.InternalServerErrorException;
import io.xeres.app.database.model.connection.Connection;
import io.xeres.app.service.CapabilityService;
import io.xeres.app.service.LocationService;
import io.xeres.app.service.NetworkService;
import io.xeres.app.service.ProfileService;
import io.xeres.app.service.backup.BackupService;
import io.xeres.app.xrs.service.identity.IdentityRsService;
import io.xeres.app.xrs.service.status.StatusRsService;
import io.xeres.common.location.Availability;
import io.xeres.common.rest.config.*;
import jakarta.validation.Valid;
import jakarta.xml.bind.JAXBException;
import org.bouncycastle.openpgp.PGPException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.ErrorResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import javax.xml.stream.XMLStreamException;
import java.io.IOException;
import java.net.UnknownHostException;
import java.nio.file.Paths;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.spec.InvalidKeySpecException;
import java.util.Optional;
import java.util.Set;
import static io.xeres.app.service.ResourceCreationState.ALREADY_EXISTS;
import static io.xeres.app.service.ResourceCreationState.FAILED;
import static io.xeres.common.rest.PathConfig.*;
@Tag(name = "Configuration", description = "Runtime general configuration")
@RestController
@RequestMapping(value = CONFIG_PATH, produces = MediaType.APPLICATION_JSON_VALUE)
public class ConfigController
{
private static final Logger log = LoggerFactory.getLogger(ConfigController.class);
private final ProfileService profileService;
private final LocationService locationService;
private final IdentityRsService identityRsService;
private final CapabilityService capabilityService;
private final BackupService backupService;
private final NetworkService networkService;
private final StatusRsService statusRsService;
public ConfigController(ProfileService profileService, LocationService locationService, IdentityRsService identityRsService, CapabilityService capabilityService, BackupService backupService, NetworkService networkService, StatusRsService statusRsService)
{
this.profileService = profileService;
this.locationService = locationService;
this.identityRsService = identityRsService;
this.capabilityService = capabilityService;
this.backupService = backupService;
this.networkService = networkService;
this.statusRsService = statusRsService;
}
@PostMapping("/profile")
@Operation(summary = "Creates own profile")
@ApiResponse(responseCode = "200", description = "Profile already exists")
@ApiResponse(responseCode = "201", description = "Profile created successfully", headers = @Header(name = "Location", description = "The location of the created profile", schema = @Schema(type = "string")))
@ApiResponse(responseCode = "422", description = "Profile entity cannot be processed", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
@ApiResponse(responseCode = "500", description = "Serious error", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public ResponseEntity<Void> createOwnProfile(@Valid @RequestBody OwnProfileRequest ownProfileRequest)
{
var name = ownProfileRequest.name();
log.debug("Processing creation of Profile {}", name);
var status = profileService.generateProfileKeys(name);
if (status == FAILED)
{
throw new InternalServerErrorException("Failed to generate profile keys");
}
networkService.checkReadiness();
var location = ServletUriComponentsBuilder.fromCurrentRequest().replacePath(PROFILES_PATH + "/{id}").buildAndExpand(1L).toUri();
return status == ALREADY_EXISTS ? ResponseEntity.ok().build() : ResponseEntity.created(location).build();
}
@PostMapping("/location")
@Operation(summary = "Creates own location")
@ApiResponse(responseCode = "200", description = "Location already exists")
@ApiResponse(responseCode = "201", description = "Location created successfully", headers = @Header(name = "Location", description = "The location of the created location", schema = @Schema(type = "string")))
@ApiResponse(responseCode = "500", description = "Serious error", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public ResponseEntity<Void> createOwnLocation(@Valid @RequestBody OwnLocationRequest ownLocationRequest)
{
var name = ownLocationRequest.name();
log.debug("Processing creation of Location {}", name);
var status = locationService.generateOwnLocation(name);
if (status == FAILED)
{
throw new InternalServerErrorException("Failed to generate location");
}
networkService.checkReadiness();
var location = ServletUriComponentsBuilder.fromCurrentRequest().replacePath(LOCATIONS_PATH + "/{id}").buildAndExpand(1L).toUri();
return status == ALREADY_EXISTS ? ResponseEntity.ok().build() : ResponseEntity.created(location).build();
}
@PutMapping("/location/availability")
@Operation(summary = "Changes our own availability")
@ApiResponse(responseCode = "200", description = "Availability changed successfully")
@ApiResponse(responseCode = "400", description = "Location does not exist", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public ResponseEntity<Void> changeAvailability(@RequestBody Availability availability)
{
if (!locationService.hasOwnLocation())
{
throw new IllegalArgumentException("Location does not exist");
}
statusRsService.changeAvailability(availability);
return ResponseEntity.ok().build();
}
@PostMapping("/identity")
@Operation(summary = "Creates own identity")
@ApiResponse(responseCode = "200", description = "Identity already exists")
@ApiResponse(responseCode = "201", description = "Identity created successfully")
@ApiResponse(responseCode = "500", description = "Serious error", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public ResponseEntity<Void> createOwnIdentity(@Valid @RequestBody OwnIdentityRequest ownIdentityRequest)
{
var name = ownIdentityRequest.name();
log.debug("Creating identity {}", name);
var status = identityRsService.generateOwnIdentity(name, !ownIdentityRequest.anonymous());
if (status == FAILED)
{
throw new InternalServerErrorException("Failed to generate identity");
}
networkService.checkReadiness();
var location = ServletUriComponentsBuilder.fromCurrentRequest().replacePath(IDENTITIES_PATH + "/{id}").buildAndExpand(1L).toUri();
return status == ALREADY_EXISTS ? ResponseEntity.ok().build() : ResponseEntity.created(location).build();
}
@GetMapping("/external-ip")
@Operation(summary = "Gets the external IP address and port", description = "Note that an external IP address is not strictly required if for example the host is on a public IP already.")
@ApiResponse(responseCode = "200", description = "Request successful")
@ApiResponse(responseCode = "404", description = "No location or no external IP address", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public IpAddressResponse getExternalIpAddress()
{
var connection = locationService.findOwnLocation().orElseThrow()
.getConnections()
.stream()
.filter(Connection::isExternal)
.findFirst().orElseThrow();
return new IpAddressResponse(connection.getIp(), connection.getPort());
}
@GetMapping("/internal-ip")
@Operation(summary = "Gets the internal IP address and port")
@ApiResponse(responseCode = "200", description = "Request successful")
@ApiResponse(responseCode = "404", description = "No location or no internal IP address", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public IpAddressResponse getInternalIpAddress()
{
return new IpAddressResponse(Optional.ofNullable(networkService.getLocalIpAddress()).orElseThrow(), networkService.getPort());
}
@GetMapping("/hostname")
@Operation(summary = "Gets the machine's hostname")
@ApiResponse(responseCode = "200", description = "Request successful")
@ApiResponse(responseCode = "404", description = "No hostname (host configuration problem)", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public HostnameResponse getHostname() throws UnknownHostException
{
return new HostnameResponse(locationService.getHostname());
}
@GetMapping("/username")
@Operation(summary = "Gets the OS session's username")
@ApiResponse(responseCode = "200", description = "Request successful")
@ApiResponse(responseCode = "404", description = "No username (no user session)", content = @Content(schema = @Schema(implementation = ErrorResponse.class)))
public UsernameResponse getUsername()
{
return new UsernameResponse(locationService.getUsername());
}
@GetMapping("/capabilities")
@Operation(summary = "Gets the system's capabilities")
@ApiResponse(responseCode = "200", description = "Request successful")
public Set<String> getCapabilities()
{
return capabilityService.getCapabilities();
}
@GetMapping(value = "/export", produces = MediaType.APPLICATION_XML_VALUE)
@Operation(summary = "Exports a minimal configuration")
@ApiResponse(responseCode = "200", description = "Request successful")
public ResponseEntity<byte[]> getBackup() throws JAXBException
{
return ResponseEntity.ok()
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"xeres_backup.xml\"")
.body(backupService.backup());
}
@PostMapping(value = "/import", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "Imports a minimal configuration")
@ApiResponse(responseCode = "200", description = "Request successful")
public ResponseEntity<Void> restoreFromBackup(@RequestBody MultipartFile file) throws JAXBException, IOException, InvalidKeyException, CertificateException, NoSuchAlgorithmException, InvalidKeySpecException, PGPException, XMLStreamException
{
backupService.restore(file);
networkService.checkReadiness();
return ResponseEntity.ok().build();
}
@PostMapping(value = "/import-profile-from-rs", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "Imports a RS keyring")
@ApiResponse(responseCode = "200", description = "Request successful")
public ResponseEntity<Void> importProfileFromRs(@RequestBody MultipartFile file, @RequestParam(value = "locationName") String locationName, @RequestParam(value = "password", required = false) String password)
{
backupService.importProfileFromRs(file, locationName, password);
networkService.checkReadiness();
return ResponseEntity.ok().build();
}
@PostMapping(value = "/import-friends-from-rs", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "Imports RS friends")
@ApiResponse(responseCode = "200", description = "Request successful")
public ResponseEntity<ImportRsFriendsResponse> importFriendsFromRs(@RequestBody MultipartFile file) throws JAXBException, IOException, XMLStreamException
{
var response = backupService.importFriendsFromRs(file);
return ResponseEntity.status(response.errors() > 0 ? HttpStatus.MULTI_STATUS : HttpStatus.OK)
.body(response);
}
@PostMapping("/verify-update")
@Operation(summary = "Verify an update file")
@ApiResponse(responseCode = "200", description = "File verified successfully")
public boolean verifyUpdate(@Valid @RequestBody VerifyUpdateRequest request)
{
//noinspection JvmTaintAnalysis
var path = Paths.get(request.filePath());
return backupService.verifyUpdate(path, request.signature());
}
}
================================================
FILE: app/src/main/java/io/xeres/app/api/controller/config/package-info.java
================================================
/*
* Copyright (c) 2024 by David Gerber - https://zapek.com
*
* This file is part of Xeres.
*
* Xeres is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Xeres is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Xeres. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* Configuration related REST controller.
* <p>This is used to store and retrieve user settings.
* <p>Note: do not store anything UI related in there because the UI can
* be run separately.
*/
package io.xeres.app.api.controller.config;
================================================
FILE: app/src/main/java/io/xeres/app/api/controller/connection/ConnectionController.java
================================================
/*
* Copyright (c) 2019-2025 by David Gerber - https:/
gitextract_qxi8ntma/
├── .agents/
│ └── skills/
│ ├── archunit-rules/
│ │ └── SKILL.md
│ ├── crypto/
│ │ └── SKILL.md
│ ├── dto-mappers/
│ │ └── SKILL.md
│ ├── flyway-migrations/
│ │ └── SKILL.md
│ ├── gradle-build/
│ │ └── SKILL.md
│ ├── java-conventions/
│ │ └── SKILL.md
│ ├── javafx-patterns/
│ │ └── SKILL.md
│ ├── junit-testing/
│ │ └── SKILL.md
│ ├── spring-boot-patterns/
│ │ └── SKILL.md
│ └── ui-testing/
│ └── SKILL.md
├── .aiignore
├── .editorconfig
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.yaml
│ │ └── feature_request.yaml
│ ├── dependabot.yml
│ ├── pull_request_template.md
│ └── workflows/
│ ├── analysis.yml
│ ├── build-docker.yml
│ ├── build-installer.yml
│ ├── dependencies.yaml
│ └── qodana_code_quality.yml
├── .gitignore
├── .run/
│ └── All Tests.run.xml
├── AGENTS.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── SECURITY.md
├── SandBox.wsb
├── app/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── io/
│ │ │ └── xeres/
│ │ │ └── app/
│ │ │ ├── XeresApplication.java
│ │ │ ├── api/
│ │ │ │ ├── DefaultHandler.java
│ │ │ │ ├── controller/
│ │ │ │ │ ├── board/
│ │ │ │ │ │ └── BoardController.java
│ │ │ │ │ ├── channel/
│ │ │ │ │ │ └── ChannelController.java
│ │ │ │ │ ├── chat/
│ │ │ │ │ │ ├── ChatController.java
│ │ │ │ │ │ ├── ChatMessageController.java
│ │ │ │ │ │ ├── doc-files/
│ │ │ │ │ │ │ └── websocket.puml
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ ├── config/
│ │ │ │ │ │ ├── ConfigController.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ ├── connection/
│ │ │ │ │ │ └── ConnectionController.java
│ │ │ │ │ ├── contact/
│ │ │ │ │ │ └── ContactController.java
│ │ │ │ │ ├── file/
│ │ │ │ │ │ └── FileController.java
│ │ │ │ │ ├── forum/
│ │ │ │ │ │ └── ForumController.java
│ │ │ │ │ ├── geoip/
│ │ │ │ │ │ └── GeoIpController.java
│ │ │ │ │ ├── identity/
│ │ │ │ │ │ └── IdentityController.java
│ │ │ │ │ ├── location/
│ │ │ │ │ │ └── LocationController.java
│ │ │ │ │ ├── notification/
│ │ │ │ │ │ └── NotificationController.java
│ │ │ │ │ ├── profile/
│ │ │ │ │ │ └── ProfileController.java
│ │ │ │ │ ├── settings/
│ │ │ │ │ │ └── SettingsController.java
│ │ │ │ │ ├── share/
│ │ │ │ │ │ └── ShareController.java
│ │ │ │ │ ├── statistics/
│ │ │ │ │ │ ├── StatisticsController.java
│ │ │ │ │ │ └── StatisticsMapper.java
│ │ │ │ │ └── voip/
│ │ │ │ │ └── VoipMessageController.java
│ │ │ │ ├── converter/
│ │ │ │ │ └── BufferedImageConverter.java
│ │ │ │ ├── exception/
│ │ │ │ │ ├── InternalServerErrorException.java
│ │ │ │ │ └── UnprocessableEntityException.java
│ │ │ │ └── package-info.java
│ │ │ ├── application/
│ │ │ │ ├── SingleInstanceRun.java
│ │ │ │ ├── Startup.java
│ │ │ │ ├── autostart/
│ │ │ │ │ ├── AutoStart.java
│ │ │ │ │ ├── AutoStarter.java
│ │ │ │ │ └── autostarter/
│ │ │ │ │ ├── AutoStarterGeneric.java
│ │ │ │ │ └── AutoStarterWindows.java
│ │ │ │ ├── environment/
│ │ │ │ │ ├── Cloud.java
│ │ │ │ │ ├── CommandArgument.java
│ │ │ │ │ ├── DefaultProperties.java
│ │ │ │ │ ├── HostVariable.java
│ │ │ │ │ └── LocalPortFinder.java
│ │ │ │ └── events/
│ │ │ │ ├── DhtNodeFoundEvent.java
│ │ │ │ ├── IpChangedEvent.java
│ │ │ │ ├── LocationReadyEvent.java
│ │ │ │ ├── NetworkReadyEvent.java
│ │ │ │ ├── PeerConnectedEvent.java
│ │ │ │ ├── PeerDisconnectedEvent.java
│ │ │ │ ├── SettingsChangedEvent.java
│ │ │ │ ├── UpnpEvent.java
│ │ │ │ └── package-info.java
│ │ │ ├── configuration/
│ │ │ │ ├── AsynchronousEventsConfiguration.java
│ │ │ │ ├── AutoStartConfiguration.java
│ │ │ │ ├── CacheDirConfiguration.java
│ │ │ │ ├── CustomCsrfChannelInterceptor.java
│ │ │ │ ├── DataDirConfiguration.java
│ │ │ │ ├── DataSourceConfiguration.java
│ │ │ │ ├── EnumMappingConfiguration.java
│ │ │ │ ├── GeoIpConfiguration.java
│ │ │ │ ├── IdleTimeConfiguration.java
│ │ │ │ ├── SchedulerConfiguration.java
│ │ │ │ ├── SelfCertificateConfiguration.java
│ │ │ │ ├── WebConfiguration.java
│ │ │ │ ├── WebSecurityConfiguration.java
│ │ │ │ ├── WebServerConfiguration.java
│ │ │ │ ├── WebSocketConfiguration.java
│ │ │ │ ├── WebSocketLoggingConfiguration.java
│ │ │ │ ├── WebSocketMessageBrokerConfiguration.java
│ │ │ │ └── WebSocketSecurityConfiguration.java
│ │ │ ├── crypto/
│ │ │ │ ├── aead/
│ │ │ │ │ └── AEAD.java
│ │ │ │ ├── aes/
│ │ │ │ │ └── AES.java
│ │ │ │ ├── dh/
│ │ │ │ │ └── DiffieHellman.java
│ │ │ │ ├── ec/
│ │ │ │ │ └── Ed25519.java
│ │ │ │ ├── hash/
│ │ │ │ │ ├── AbstractMessageDigest.java
│ │ │ │ │ ├── chat/
│ │ │ │ │ │ └── ChatChallenge.java
│ │ │ │ │ ├── sha1/
│ │ │ │ │ │ └── Sha1MessageDigest.java
│ │ │ │ │ └── sha256/
│ │ │ │ │ └── Sha256MessageDigest.java
│ │ │ │ ├── hmac/
│ │ │ │ │ ├── AbstractHMac.java
│ │ │ │ │ ├── sha1/
│ │ │ │ │ │ └── Sha1HMac.java
│ │ │ │ │ └── sha256/
│ │ │ │ │ └── Sha256HMac.java
│ │ │ │ ├── pgp/
│ │ │ │ │ ├── PGP.java
│ │ │ │ │ ├── PGPSigner.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── rsa/
│ │ │ │ │ └── RSA.java
│ │ │ │ ├── rscrypto/
│ │ │ │ │ ├── RsCrypto.java
│ │ │ │ │ └── doc-files/
│ │ │ │ │ └── format.puml
│ │ │ │ ├── rsid/
│ │ │ │ │ ├── RSCertificate.java
│ │ │ │ │ ├── RSId.java
│ │ │ │ │ ├── RSIdArmor.java
│ │ │ │ │ ├── RSIdBuilder.java
│ │ │ │ │ ├── RSIdCrc.java
│ │ │ │ │ ├── RSSerialVersion.java
│ │ │ │ │ └── ShortInvite.java
│ │ │ │ └── x509/
│ │ │ │ └── X509.java
│ │ │ ├── database/
│ │ │ │ ├── DatabaseSession.java
│ │ │ │ ├── DatabaseSessionManager.java
│ │ │ │ ├── converter/
│ │ │ │ │ ├── AvailabilityConverter.java
│ │ │ │ │ ├── EnumConverter.java
│ │ │ │ │ ├── EnumSetConverter.java
│ │ │ │ │ ├── FileTypeConverter.java
│ │ │ │ │ ├── GxsCircleTypeConverter.java
│ │ │ │ │ ├── GxsPrivacyFlagsConverter.java
│ │ │ │ │ ├── GxsSignatureFlagsConverter.java
│ │ │ │ │ ├── IdentityTypeConverter.java
│ │ │ │ │ ├── NetModeConverter.java
│ │ │ │ │ ├── PeerAddressTypeConverter.java
│ │ │ │ │ ├── SecurityKeyFlagsConverter.java
│ │ │ │ │ ├── SignatureTypeConverter.java
│ │ │ │ │ ├── TrustConverter.java
│ │ │ │ │ └── VoteTypeConverter.java
│ │ │ │ ├── model/
│ │ │ │ │ ├── board/
│ │ │ │ │ │ └── BoardMapper.java
│ │ │ │ │ ├── channel/
│ │ │ │ │ │ └── ChannelMapper.java
│ │ │ │ │ ├── chat/
│ │ │ │ │ │ ├── ChatBacklog.java
│ │ │ │ │ │ ├── ChatMapper.java
│ │ │ │ │ │ ├── ChatRoom.java
│ │ │ │ │ │ ├── ChatRoomBacklog.java
│ │ │ │ │ │ └── DistantChatBacklog.java
│ │ │ │ │ ├── connection/
│ │ │ │ │ │ ├── Connection.java
│ │ │ │ │ │ └── ConnectionMapper.java
│ │ │ │ │ ├── file/
│ │ │ │ │ │ ├── File.java
│ │ │ │ │ │ └── FileDownload.java
│ │ │ │ │ ├── forum/
│ │ │ │ │ │ ├── ForumMapper.java
│ │ │ │ │ │ └── ForumMessageItemSummary.java
│ │ │ │ │ ├── gxs/
│ │ │ │ │ │ ├── GxsCircleType.java
│ │ │ │ │ │ ├── GxsClientUpdate.java
│ │ │ │ │ │ ├── GxsConstants.java
│ │ │ │ │ │ ├── GxsGroupItem.java
│ │ │ │ │ │ ├── GxsMessageItem.java
│ │ │ │ │ │ ├── GxsMetaAndData.java
│ │ │ │ │ │ ├── GxsPrivacyFlags.java
│ │ │ │ │ │ ├── GxsServiceSetting.java
│ │ │ │ │ │ └── GxsSignatureFlags.java
│ │ │ │ │ ├── identity/
│ │ │ │ │ │ └── IdentityMapper.java
│ │ │ │ │ ├── location/
│ │ │ │ │ │ ├── Location.java
│ │ │ │ │ │ └── LocationMapper.java
│ │ │ │ │ ├── profile/
│ │ │ │ │ │ ├── Profile.java
│ │ │ │ │ │ └── ProfileMapper.java
│ │ │ │ │ ├── settings/
│ │ │ │ │ │ ├── Settings.java
│ │ │ │ │ │ └── SettingsMapper.java
│ │ │ │ │ └── share/
│ │ │ │ │ ├── Share.java
│ │ │ │ │ └── ShareMapper.java
│ │ │ │ └── repository/
│ │ │ │ ├── ChatBacklogRepository.java
│ │ │ │ ├── ChatRoomBacklogRepository.java
│ │ │ │ ├── ChatRoomRepository.java
│ │ │ │ ├── DistantChatBacklogRepository.java
│ │ │ │ ├── FileDownloadRepository.java
│ │ │ │ ├── FileRepository.java
│ │ │ │ ├── GxsBoardGroupRepository.java
│ │ │ │ ├── GxsBoardMessageRepository.java
│ │ │ │ ├── GxsChannelGroupRepository.java
│ │ │ │ ├── GxsChannelMessageRepository.java
│ │ │ │ ├── GxsClientUpdateRepository.java
│ │ │ │ ├── GxsCommentMessageRepository.java
│ │ │ │ ├── GxsForumGroupRepository.java
│ │ │ │ ├── GxsForumMessageRepository.java
│ │ │ │ ├── GxsGroupItemRepository.java
│ │ │ │ ├── GxsIdentityRepository.java
│ │ │ │ ├── GxsMessageItemRepository.java
│ │ │ │ ├── GxsServiceSettingRepository.java
│ │ │ │ ├── GxsVoteMessageRepository.java
│ │ │ │ ├── LocationRepository.java
│ │ │ │ ├── ProfileRepository.java
│ │ │ │ ├── SettingsRepository.java
│ │ │ │ └── ShareRepository.java
│ │ │ ├── job/
│ │ │ │ ├── DhtFinderJob.java
│ │ │ │ ├── FileIndexingJob.java
│ │ │ │ ├── IdleDetectionJob.java
│ │ │ │ ├── JobUtils.java
│ │ │ │ └── PeerConnectionJob.java
│ │ │ ├── net/
│ │ │ │ ├── bdisc/
│ │ │ │ │ ├── BroadcastDiscoveryService.java
│ │ │ │ │ ├── ProtocolVersion.java
│ │ │ │ │ ├── UdpDiscoveryPeer.java
│ │ │ │ │ └── UdpDiscoveryProtocol.java
│ │ │ │ ├── dht/
│ │ │ │ │ ├── DHTSpringLog.java
│ │ │ │ │ ├── DhtService.java
│ │ │ │ │ ├── NodeId.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── external/
│ │ │ │ │ └── ExternalIpResolver.java
│ │ │ │ ├── peer/
│ │ │ │ │ ├── ConnectionType.java
│ │ │ │ │ ├── DefaultItemFuture.java
│ │ │ │ │ ├── ItemFuture.java
│ │ │ │ │ ├── PeerAttribute.java
│ │ │ │ │ ├── PeerConnection.java
│ │ │ │ │ ├── PeerConnectionManager.java
│ │ │ │ │ ├── bootstrap/
│ │ │ │ │ │ ├── PeerClient.java
│ │ │ │ │ │ ├── PeerI2pClient.java
│ │ │ │ │ │ ├── PeerInitializer.java
│ │ │ │ │ │ ├── PeerServer.java
│ │ │ │ │ │ ├── PeerTcpClient.java
│ │ │ │ │ │ ├── PeerTcpServer.java
│ │ │ │ │ │ └── PeerTorClient.java
│ │ │ │ │ ├── packet/
│ │ │ │ │ │ ├── MultiPacket.java
│ │ │ │ │ │ ├── Packet.java
│ │ │ │ │ │ ├── SimplePacket.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ ├── pipeline/
│ │ │ │ │ │ ├── IdleEventHandler.java
│ │ │ │ │ │ ├── ItemDecoder.java
│ │ │ │ │ │ ├── ItemEncoder.java
│ │ │ │ │ │ ├── MultiPacketEncoder.java
│ │ │ │ │ │ ├── PacketDecoder.java
│ │ │ │ │ │ ├── PeerHandler.java
│ │ │ │ │ │ ├── SimplePacketEncoder.java
│ │ │ │ │ │ └── package-info.java
│ │ │ │ │ └── ssl/
│ │ │ │ │ └── SSL.java
│ │ │ │ ├── protocol/
│ │ │ │ │ ├── DomainNameSocketAddress.java
│ │ │ │ │ └── PeerAddress.java
│ │ │ │ ├── upnp/
│ │ │ │ │ ├── ControlPoint.java
│ │ │ │ │ ├── Device.java
│ │ │ │ │ ├── DeviceSpecs.java
│ │ │ │ │ ├── HttpuHeader.java
│ │ │ │ │ ├── PortMapping.java
│ │ │ │ │ ├── Protocol.java
│ │ │ │ │ ├── Soap.java
│ │ │ │ │ ├── UPNPService.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── util/
│ │ │ │ └── NetworkMode.java
│ │ │ ├── package-info.java
│ │ │ ├── properties/
│ │ │ │ ├── DatabaseProperties.java
│ │ │ │ └── NetworkProperties.java
│ │ │ ├── service/
│ │ │ │ ├── BoardMessageService.java
│ │ │ │ ├── CapabilityService.java
│ │ │ │ ├── ChannelMessageService.java
│ │ │ │ ├── ContactService.java
│ │ │ │ ├── ForumMessageService.java
│ │ │ │ ├── GeoIpService.java
│ │ │ │ ├── IdentityService.java
│ │ │ │ ├── InfoService.java
│ │ │ │ ├── LocationService.java
│ │ │ │ ├── MessageService.java
│ │ │ │ ├── NetworkService.java
│ │ │ │ ├── PeerService.java
│ │ │ │ ├── ProfileService.java
│ │ │ │ ├── QrCodeService.java
│ │ │ │ ├── ResourceCreationState.java
│ │ │ │ ├── SettingsService.java
│ │ │ │ ├── UiBridgeService.java
│ │ │ │ ├── UnHtmlService.java
│ │ │ │ ├── UpgradeService.java
│ │ │ │ ├── audio/
│ │ │ │ │ └── AudioService.java
│ │ │ │ ├── backup/
│ │ │ │ │ ├── BackupService.java
│ │ │ │ │ ├── Export.java
│ │ │ │ │ ├── Group.java
│ │ │ │ │ ├── Identity.java
│ │ │ │ │ ├── Local.java
│ │ │ │ │ ├── Location.java
│ │ │ │ │ ├── LocationIdentifierXmlAdapter.java
│ │ │ │ │ ├── PgpId.java
│ │ │ │ │ ├── Profile.java
│ │ │ │ │ ├── RSIdXmlAdapter.java
│ │ │ │ │ ├── Root.java
│ │ │ │ │ └── SslId.java
│ │ │ │ ├── file/
│ │ │ │ │ ├── FileService.java
│ │ │ │ │ ├── HashBloomFilter.java
│ │ │ │ │ └── TrackingFileVisitor.java
│ │ │ │ ├── identicon/
│ │ │ │ │ └── IdenticonService.java
│ │ │ │ ├── notification/
│ │ │ │ │ ├── NotificationService.java
│ │ │ │ │ ├── availability/
│ │ │ │ │ │ └── AvailabilityNotificationService.java
│ │ │ │ │ ├── board/
│ │ │ │ │ │ └── BoardNotificationService.java
│ │ │ │ │ ├── channel/
│ │ │ │ │ │ └── ChannelNotificationService.java
│ │ │ │ │ ├── contact/
│ │ │ │ │ │ └── ContactNotificationService.java
│ │ │ │ │ ├── file/
│ │ │ │ │ │ ├── FileNotificationService.java
│ │ │ │ │ │ ├── FileSearchNotificationService.java
│ │ │ │ │ │ └── FileTrendNotificationService.java
│ │ │ │ │ ├── forum/
│ │ │ │ │ │ └── ForumNotificationService.java
│ │ │ │ │ └── status/
│ │ │ │ │ └── StatusNotificationService.java
│ │ │ │ ├── script/
│ │ │ │ │ ├── Console.java
│ │ │ │ │ ├── ScriptEvent.java
│ │ │ │ │ └── ScriptService.java
│ │ │ │ └── shell/
│ │ │ │ ├── History.java
│ │ │ │ └── ShellService.java
│ │ │ ├── util/
│ │ │ │ ├── DevUtils.java
│ │ │ │ ├── GxsUtils.java
│ │ │ │ ├── XmlUtils.java
│ │ │ │ └── expression/
│ │ │ │ ├── CompoundExpression.java
│ │ │ │ ├── DateExpression.java
│ │ │ │ ├── Expression.java
│ │ │ │ ├── ExpressionMapper.java
│ │ │ │ ├── ExpressionType.java
│ │ │ │ ├── ExtensionExpression.java
│ │ │ │ ├── HashExpression.java
│ │ │ │ ├── NameExpression.java
│ │ │ │ ├── PathExpression.java
│ │ │ │ ├── PopularityExpression.java
│ │ │ │ ├── RelationalExpression.java
│ │ │ │ ├── SizeExpression.java
│ │ │ │ ├── SizeMbExpression.java
│ │ │ │ └── StringExpression.java
│ │ │ └── xrs/
│ │ │ ├── common/
│ │ │ │ ├── CommentMessageItem.java
│ │ │ │ ├── FileData.java
│ │ │ │ ├── FileItem.java
│ │ │ │ ├── FileSet.java
│ │ │ │ ├── SecurityKey.java
│ │ │ │ ├── Signature.java
│ │ │ │ └── VoteMessageItem.java
│ │ │ ├── item/
│ │ │ │ ├── Item.java
│ │ │ │ ├── ItemHeader.java
│ │ │ │ ├── ItemPriority.java
│ │ │ │ ├── ItemUtils.java
│ │ │ │ └── RawItem.java
│ │ │ ├── serialization/
│ │ │ │ ├── AnnotationSerializer.java
│ │ │ │ ├── ArraySerializer.java
│ │ │ │ ├── BigIntegerSerializer.java
│ │ │ │ ├── BooleanSerializer.java
│ │ │ │ ├── ByteArraySerializer.java
│ │ │ │ ├── ByteSerializer.java
│ │ │ │ ├── DoubleSerializer.java
│ │ │ │ ├── EnumSerializer.java
│ │ │ │ ├── EnumSetSerializer.java
│ │ │ │ ├── FieldSize.java
│ │ │ │ ├── FloatSerializer.java
│ │ │ │ ├── GxsMetaAndDataResult.java
│ │ │ │ ├── GxsMetaAndDataSerializer.java
│ │ │ │ ├── IdentifierSerializer.java
│ │ │ │ ├── IntSerializer.java
│ │ │ │ ├── ListSerializer.java
│ │ │ │ ├── LongSerializer.java
│ │ │ │ ├── MapSerializer.java
│ │ │ │ ├── RsClassSerializedReversed.java
│ │ │ │ ├── RsSerializable.java
│ │ │ │ ├── RsSerializableSerializer.java
│ │ │ │ ├── RsSerialized.java
│ │ │ │ ├── SerializationFlags.java
│ │ │ │ ├── Serializer.java
│ │ │ │ ├── SerializerSizeCache.java
│ │ │ │ ├── ShortSerializer.java
│ │ │ │ ├── StringSerializer.java
│ │ │ │ ├── TlvAddressSerializer.java
│ │ │ │ ├── TlvBinarySerializer.java
│ │ │ │ ├── TlvFileDataSerializer.java
│ │ │ │ ├── TlvFileItemSerializer.java
│ │ │ │ ├── TlvFileSetSerializer.java
│ │ │ │ ├── TlvImageSerializer.java
│ │ │ │ ├── TlvSecurityKeySerializer.java
│ │ │ │ ├── TlvSecurityKeySetSerializer.java
│ │ │ │ ├── TlvSerializer.java
│ │ │ │ ├── TlvSetSerializer.java
│ │ │ │ ├── TlvSignatureSerializer.java
│ │ │ │ ├── TlvSignatureSetSerializer.java
│ │ │ │ ├── TlvStringSerializer.java
│ │ │ │ ├── TlvStringSetRefSerializer.java
│ │ │ │ ├── TlvType.java
│ │ │ │ ├── TlvUint32Serializer.java
│ │ │ │ ├── TlvUint64Serializer.java
│ │ │ │ └── TlvUtils.java
│ │ │ └── service/
│ │ │ ├── DefaultItem.java
│ │ │ ├── RsService.java
│ │ │ ├── RsServiceInitPriority.java
│ │ │ ├── RsServiceMaster.java
│ │ │ ├── RsServiceRegistry.java
│ │ │ ├── RsServiceSlave.java
│ │ │ ├── bandwidth/
│ │ │ │ ├── BandwidthRsService.java
│ │ │ │ ├── BandwidthUtils.java
│ │ │ │ └── item/
│ │ │ │ └── BandwidthAllowedItem.java
│ │ │ ├── board/
│ │ │ │ ├── BoardRsService.java
│ │ │ │ └── item/
│ │ │ │ ├── BoardGroupItem.java
│ │ │ │ └── BoardMessageItem.java
│ │ │ ├── channel/
│ │ │ │ ├── ChannelRsService.java
│ │ │ │ └── item/
│ │ │ │ ├── ChannelGroupItem.java
│ │ │ │ └── ChannelMessageItem.java
│ │ │ ├── chat/
│ │ │ │ ├── ChatBacklogService.java
│ │ │ │ ├── ChatFlags.java
│ │ │ │ ├── ChatRoom.java
│ │ │ │ ├── ChatRoomService.java
│ │ │ │ ├── ChatRsService.java
│ │ │ │ ├── DistantLocation.java
│ │ │ │ ├── MessageCache.java
│ │ │ │ ├── RoomFlags.java
│ │ │ │ └── item/
│ │ │ │ ├── ChatAvatarItem.java
│ │ │ │ ├── ChatMessageItem.java
│ │ │ │ ├── ChatRoomBounce.java
│ │ │ │ ├── ChatRoomConfigItem.java
│ │ │ │ ├── ChatRoomConnectChallengeItem.java
│ │ │ │ ├── ChatRoomEvent.java
│ │ │ │ ├── ChatRoomEventItem.java
│ │ │ │ ├── ChatRoomInviteItem.java
│ │ │ │ ├── ChatRoomInviteOldItem.java
│ │ │ │ ├── ChatRoomListItem.java
│ │ │ │ ├── ChatRoomListRequestItem.java
│ │ │ │ ├── ChatRoomMessageItem.java
│ │ │ │ ├── ChatRoomUnsubscribeItem.java
│ │ │ │ ├── ChatStatusItem.java
│ │ │ │ ├── PrivateChatMessageConfigItem.java
│ │ │ │ ├── PrivateOutgoingMapItem.java
│ │ │ │ ├── SubscribedChatRoomConfigItem.java
│ │ │ │ └── VisibleChatRoomInfo.java
│ │ │ ├── discovery/
│ │ │ │ ├── DiscoveryRsService.java
│ │ │ │ └── item/
│ │ │ │ ├── DiscoveryContactItem.java
│ │ │ │ ├── DiscoveryIdentityListItem.java
│ │ │ │ ├── DiscoveryPgpKeyItem.java
│ │ │ │ └── DiscoveryPgpListItem.java
│ │ │ ├── filetransfer/
│ │ │ │ ├── Action.java
│ │ │ │ ├── ActionAddPeer.java
│ │ │ │ ├── ActionDownload.java
│ │ │ │ ├── ActionGetDownloadsProgress.java
│ │ │ │ ├── ActionGetUploadsProgress.java
│ │ │ │ ├── ActionReceiveChunkMap.java
│ │ │ │ ├── ActionReceiveChunkMapRequest.java
│ │ │ │ ├── ActionReceiveData.java
│ │ │ │ ├── ActionReceiveDataRequest.java
│ │ │ │ ├── ActionReceiveSingleChunkCrc.java
│ │ │ │ ├── ActionReceiveSingleChunkCrcRequest.java
│ │ │ │ ├── ActionRemoveDownload.java
│ │ │ │ ├── ActionRemovePeer.java
│ │ │ │ ├── Chunk.java
│ │ │ │ ├── ChunkDistributor.java
│ │ │ │ ├── ChunkMapUtils.java
│ │ │ │ ├── ChunkReceiver.java
│ │ │ │ ├── FileDownload.java
│ │ │ │ ├── FileLeecher.java
│ │ │ │ ├── FilePeer.java
│ │ │ │ ├── FileProvider.java
│ │ │ │ ├── FileSeeder.java
│ │ │ │ ├── FileTransferAgent.java
│ │ │ │ ├── FileTransferEncryptionKey.java
│ │ │ │ ├── FileTransferManager.java
│ │ │ │ ├── FileTransferRsService.java
│ │ │ │ ├── FileTransferStrategy.java
│ │ │ │ ├── FileUpload.java
│ │ │ │ ├── SliceSender.java
│ │ │ │ ├── doc-files/
│ │ │ │ │ └── filetransfer.puml
│ │ │ │ └── item/
│ │ │ │ ├── FileTransferChunkMapItem.java
│ │ │ │ ├── FileTransferChunkMapRequestItem.java
│ │ │ │ ├── FileTransferDataItem.java
│ │ │ │ ├── FileTransferDataRequestItem.java
│ │ │ │ ├── FileTransferSingleChunkCrcItem.java
│ │ │ │ ├── FileTransferSingleChunkCrcRequestItem.java
│ │ │ │ ├── TurtleChunkCrcItem.java
│ │ │ │ ├── TurtleChunkCrcRequestItem.java
│ │ │ │ ├── TurtleFileDataItem.java
│ │ │ │ ├── TurtleFileMapItem.java
│ │ │ │ ├── TurtleFileMapRequestItem.java
│ │ │ │ └── TurtleFileRequestItem.java
│ │ │ ├── forum/
│ │ │ │ ├── ForumRsService.java
│ │ │ │ └── item/
│ │ │ │ ├── ForumGroupItem.java
│ │ │ │ └── ForumMessageItem.java
│ │ │ ├── gxs/
│ │ │ │ ├── GxsAuthentication.java
│ │ │ │ ├── GxsHelperService.java
│ │ │ │ ├── GxsRsService.java
│ │ │ │ ├── GxsTransactionManager.java
│ │ │ │ ├── Transaction.java
│ │ │ │ ├── doc-files/
│ │ │ │ │ ├── transaction.puml
│ │ │ │ │ └── transfer.puml
│ │ │ │ └── item/
│ │ │ │ ├── DynamicServiceType.java
│ │ │ │ ├── GxsExchange.java
│ │ │ │ ├── GxsSyncGroupItem.java
│ │ │ │ ├── GxsSyncGroupRequestItem.java
│ │ │ │ ├── GxsSyncGroupStatsItem.java
│ │ │ │ ├── GxsSyncMessageItem.java
│ │ │ │ ├── GxsSyncMessageRequestItem.java
│ │ │ │ ├── GxsSyncNotifyItem.java
│ │ │ │ ├── GxsTransactionItem.java
│ │ │ │ ├── GxsTransferGroupItem.java
│ │ │ │ ├── GxsTransferMessageItem.java
│ │ │ │ ├── RequestType.java
│ │ │ │ └── TransactionFlags.java
│ │ │ ├── gxstunnel/
│ │ │ │ ├── DestinationHash.java
│ │ │ │ ├── GxsTunnelRsClient.java
│ │ │ │ ├── GxsTunnelRsService.java
│ │ │ │ ├── GxsTunnelStatus.java
│ │ │ │ ├── TunnelDhInfo.java
│ │ │ │ ├── TunnelPeerInfo.java
│ │ │ │ ├── VirtualLocation.java
│ │ │ │ └── item/
│ │ │ │ ├── GxsTunnelDataAckItem.java
│ │ │ │ ├── GxsTunnelDataItem.java
│ │ │ │ ├── GxsTunnelDhPublicKeyItem.java
│ │ │ │ ├── GxsTunnelItem.java
│ │ │ │ └── GxsTunnelStatusItem.java
│ │ │ ├── heartbeat/
│ │ │ │ ├── HeartbeatRsService.java
│ │ │ │ └── item/
│ │ │ │ └── HeartbeatItem.java
│ │ │ ├── identity/
│ │ │ │ ├── IdentityManager.java
│ │ │ │ ├── IdentityReputation.java
│ │ │ │ ├── IdentityRsService.java
│ │ │ │ ├── ValidationResult.java
│ │ │ │ ├── ValidationState.java
│ │ │ │ └── item/
│ │ │ │ └── IdentityGroupItem.java
│ │ │ ├── rtt/
│ │ │ │ ├── RttRsService.java
│ │ │ │ └── item/
│ │ │ │ ├── RttPingItem.java
│ │ │ │ └── RttPongItem.java
│ │ │ ├── serviceinfo/
│ │ │ │ ├── ServiceInfoRsService.java
│ │ │ │ └── item/
│ │ │ │ ├── ServiceInfo.java
│ │ │ │ └── ServiceListItem.java
│ │ │ ├── sliceprobe/
│ │ │ │ ├── SliceProbeRsService.java
│ │ │ │ └── item/
│ │ │ │ └── SliceProbeItem.java
│ │ │ ├── status/
│ │ │ │ ├── ChatStatus.java
│ │ │ │ ├── GetIdleTime.java
│ │ │ │ ├── IdleChecker.java
│ │ │ │ ├── StatusRsService.java
│ │ │ │ ├── idletimer/
│ │ │ │ │ ├── GetIdleTimeGeneric.java
│ │ │ │ │ ├── GetIdleTimeLinux.java
│ │ │ │ │ ├── GetIdleTimeMac.java
│ │ │ │ │ └── GetIdleTimeWindows.java
│ │ │ │ └── item/
│ │ │ │ └── StatusItem.java
│ │ │ ├── turtle/
│ │ │ │ ├── HashInfo.java
│ │ │ │ ├── SearchRequest.java
│ │ │ │ ├── Tunnel.java
│ │ │ │ ├── TunnelProbability.java
│ │ │ │ ├── TunnelRequest.java
│ │ │ │ ├── TurtleRouter.java
│ │ │ │ ├── TurtleRsClient.java
│ │ │ │ ├── TurtleRsService.java
│ │ │ │ ├── TurtleStatistics.java
│ │ │ │ ├── VirtualLocation.java
│ │ │ │ ├── doc-files/
│ │ │ │ │ └── search.puml
│ │ │ │ └── item/
│ │ │ │ ├── TunnelDirection.java
│ │ │ │ ├── TurtleFileInfo.java
│ │ │ │ ├── TurtleFileSearchRequestItem.java
│ │ │ │ ├── TurtleFileSearchResultItem.java
│ │ │ │ ├── TurtleGenericDataItem.java
│ │ │ │ ├── TurtleGenericFastDataItem.java
│ │ │ │ ├── TurtleGenericSearchRequestItem.java
│ │ │ │ ├── TurtleGenericSearchResultItem.java
│ │ │ │ ├── TurtleGenericTunnelItem.java
│ │ │ │ ├── TurtleRegExpSearchRequestItem.java
│ │ │ │ ├── TurtleSearchRequestItem.java
│ │ │ │ ├── TurtleSearchResultItem.java
│ │ │ │ ├── TurtleStringSearchRequestItem.java
│ │ │ │ ├── TurtleTunnelRequestItem.java
│ │ │ │ └── TurtleTunnelResultItem.java
│ │ │ └── voip/
│ │ │ ├── LockBasedSingleEntrySupplier.java
│ │ │ ├── VoipRsService.java
│ │ │ └── item/
│ │ │ ├── VoipDataItem.java
│ │ │ ├── VoipPingItem.java
│ │ │ ├── VoipPongItem.java
│ │ │ └── VoipProtocolItem.java
│ │ ├── javadoc/
│ │ │ └── overview.html
│ │ └── resources/
│ │ ├── GeoLite2-Country.mmdb
│ │ ├── LICENSE
│ │ ├── META-INF/
│ │ │ └── additional-spring-configuration-metadata.json
│ │ ├── application-cloud.properties
│ │ ├── application-dev.properties
│ │ ├── application.properties
│ │ ├── banner.txt
│ │ ├── bdboot.txt
│ │ ├── db/
│ │ │ └── migration/
│ │ │ ├── V00_0_10_202407122208__AlterFileDownloadCompleted.sql
│ │ │ ├── V00_0_11_202408021538__AddEncryptedHashes.sql
│ │ │ ├── V00_0_12_202408021849__AddEncryptedHashIndex.sql
│ │ │ ├── V00_0_13_202408121618__AddLocationToFileDownload.sql
│ │ │ ├── V00_0_14_202408221303__AddAvailabilityToLocation.sql
│ │ │ ├── V00_0_15_202409220053__AddChatBacklog.sql
│ │ │ ├── V00_0_16_202410061715__AddProfileValidation.sql
│ │ │ ├── V00_0_17_202410112205__AddProfileCreation.sql
│ │ │ ├── V00_0_18_202410201950__AddLocationVersion.sql
│ │ │ ├── V00_0_19_202411171309__AddExtendedFingerprint.sql
│ │ │ ├── V00_0_1_202001232214__InitDb.sql
│ │ │ ├── V00_0_20_202411212150__AlterShareLastScanned.sql
│ │ │ ├── V00_0_21_202412142109__AddRemoteOptions.sql
│ │ │ ├── V00_0_22_202412211327__AddRemotePort.sql
│ │ │ ├── V00_0_23_202412242306__AddChatRoomLocations.sql
│ │ │ ├── V00_0_24_202502252128__AddDistantChatBacklog.sql
│ │ │ ├── V00_0_25_202504051643__AcceptNullNamedLocations.sql
│ │ │ ├── V00_0_26_202504152033__AdjustBacklogMessageSizes.sql
│ │ │ ├── V00_0_27_202511240013__AddBoards.sql
│ │ │ ├── V00_0_28_202511281815__AddChannels.sql
│ │ │ ├── V00_0_29_202512212323__FixGxsSizeLimits.sql
│ │ │ ├── V00_0_2_202312151830__AddIncomingDirectory.sql
│ │ │ ├── V00_0_30_202602161830__ImproveGxsGroupsAndMessage.sql
│ │ │ ├── V00_0_31_202602121929__AddLastActivity.sql
│ │ │ ├── V00_0_32_202603092327__AddIndices.sql
│ │ │ ├── V00_0_33_202604260021__FixVotes.sql
│ │ │ ├── V00_0_3_202401151840__AddSharesAndFiles.sql
│ │ │ ├── V00_0_4_202402211850__AlterTimestampPrecision.sql
│ │ │ ├── V00_0_5_202405122038__AddSizeToFiles.sql
│ │ │ ├── V00_0_6_202405242209__AddNewFileEnumTypes.sql
│ │ │ ├── V00_0_7_202406181840__AddFileDownload.sql
│ │ │ ├── V00_0_8_202406191850__AddRemotePassword.sql
│ │ │ └── V00_0_9_202406201855__AddSettingsVersion.sql
│ │ ├── public/
│ │ │ └── index.html
│ │ └── public.asc
│ └── test/
│ ├── java/
│ │ └── io/
│ │ └── xeres/
│ │ ├── app/
│ │ │ ├── ApiTest.java
│ │ │ ├── AppCodingRulesTest.java
│ │ │ ├── api/
│ │ │ │ └── controller/
│ │ │ │ ├── AbstractControllerTest.java
│ │ │ │ ├── PathConfigTest.java
│ │ │ │ ├── board/
│ │ │ │ │ └── BoardControllerTest.java
│ │ │ │ ├── channel/
│ │ │ │ │ └── ChannelControllerTest.java
│ │ │ │ ├── chat/
│ │ │ │ │ ├── ChatControllerTest.java
│ │ │ │ │ └── ChatMessageControllerTest.java
│ │ │ │ ├── config/
│ │ │ │ │ └── ConfigControllerTest.java
│ │ │ │ ├── connection/
│ │ │ │ │ └── ConnectionControllerTest.java
│ │ │ │ ├── contact/
│ │ │ │ │ └── ContactControllerTest.java
│ │ │ │ ├── file/
│ │ │ │ │ └── FileControllerTest.java
│ │ │ │ ├── forum/
│ │ │ │ │ └── ForumControllerTest.java
│ │ │ │ ├── geoip/
│ │ │ │ │ └── GeoIpControllerTest.java
│ │ │ │ ├── identity/
│ │ │ │ │ └── IdentityControllerTest.java
│ │ │ │ ├── location/
│ │ │ │ │ └── LocationControllerTest.java
│ │ │ │ ├── notification/
│ │ │ │ │ └── NotificationControllerTest.java
│ │ │ │ ├── profile/
│ │ │ │ │ └── ProfileControllerTest.java
│ │ │ │ ├── settings/
│ │ │ │ │ └── SettingsControllerTest.java
│ │ │ │ ├── share/
│ │ │ │ │ └── ShareControllerTest.java
│ │ │ │ ├── statistics/
│ │ │ │ │ └── StatisticsControllerTest.java
│ │ │ │ └── voip/
│ │ │ │ └── VoipMessageControllerTest.java
│ │ │ ├── application/
│ │ │ │ ├── SingleInstanceRunTest.java
│ │ │ │ ├── autostart/
│ │ │ │ │ ├── AutoStartTest.java
│ │ │ │ │ └── autostarter/
│ │ │ │ │ └── AutoStarterGenericTest.java
│ │ │ │ └── environment/
│ │ │ │ └── DefaultPropertiesTest.java
│ │ │ ├── configuration/
│ │ │ │ └── DataDirConfigurationTest.java
│ │ │ ├── crypto/
│ │ │ │ ├── aead/
│ │ │ │ │ └── AEADTest.java
│ │ │ │ ├── aes/
│ │ │ │ │ └── AESTest.java
│ │ │ │ ├── chatcipher/
│ │ │ │ │ └── ChatChallengeTest.java
│ │ │ │ ├── dh/
│ │ │ │ │ └── DiffieHellmanTest.java
│ │ │ │ ├── ec/
│ │ │ │ │ └── Ed25519Test.java
│ │ │ │ ├── hmac/
│ │ │ │ │ ├── sha1/
│ │ │ │ │ │ └── Sha1HMacTest.java
│ │ │ │ │ └── sha256/
│ │ │ │ │ └── Sha256HMacTest.java
│ │ │ │ ├── pgp/
│ │ │ │ │ └── PGPTest.java
│ │ │ │ ├── rsa/
│ │ │ │ │ └── RSATest.java
│ │ │ │ ├── rscrypto/
│ │ │ │ │ └── RsCryptoTest.java
│ │ │ │ ├── rsid/
│ │ │ │ │ ├── RSCertificateTest.java
│ │ │ │ │ ├── RSIdArmorTest.java
│ │ │ │ │ ├── RSIdCrcTest.java
│ │ │ │ │ ├── RSIdFakes.java
│ │ │ │ │ ├── RSSerialVersionTest.java
│ │ │ │ │ └── RSShortInviteTest.java
│ │ │ │ └── x509/
│ │ │ │ └── X509Test.java
│ │ │ ├── database/
│ │ │ │ ├── model/
│ │ │ │ │ ├── chat/
│ │ │ │ │ │ ├── ChatMapperTest.java
│ │ │ │ │ │ └── ChatRoomFakes.java
│ │ │ │ │ ├── connection/
│ │ │ │ │ │ ├── ConnectionFakes.java
│ │ │ │ │ │ ├── ConnectionMapperTest.java
│ │ │ │ │ │ └── ConnectionTest.java
│ │ │ │ │ ├── file/
│ │ │ │ │ │ └── FileFakes.java
│ │ │ │ │ ├── gxs/
│ │ │ │ │ │ ├── BoardGroupItemFakes.java
│ │ │ │ │ │ ├── BoardMessageItemFakes.java
│ │ │ │ │ │ ├── ChannelGroupItemFakes.java
│ │ │ │ │ │ ├── ChannelMessageItemFakes.java
│ │ │ │ │ │ ├── ForumGroupItemFakes.java
│ │ │ │ │ │ ├── ForumMessageItemFakes.java
│ │ │ │ │ │ ├── ForumMessageItemSummaryFake.java
│ │ │ │ │ │ ├── GxsCircleTypeTest.java
│ │ │ │ │ │ ├── GxsClientUpdateFakes.java
│ │ │ │ │ │ ├── GxsPrivacyFlagsTest.java
│ │ │ │ │ │ ├── GxsServiceSettingFakes.java
│ │ │ │ │ │ ├── GxsSignatureFlagsTest.java
│ │ │ │ │ │ └── IdentityGroupItemFakes.java
│ │ │ │ │ ├── identity/
│ │ │ │ │ │ ├── IdentityFakes.java
│ │ │ │ │ │ └── IdentityMapperTest.java
│ │ │ │ │ ├── location/
│ │ │ │ │ │ ├── LocationFakes.java
│ │ │ │ │ │ └── LocationMapperTest.java
│ │ │ │ │ ├── profile/
│ │ │ │ │ │ ├── ProfileFakes.java
│ │ │ │ │ │ └── ProfileMapperTest.java
│ │ │ │ │ ├── settings/
│ │ │ │ │ │ └── SettingsFakes.java
│ │ │ │ │ └── share/
│ │ │ │ │ └── ShareFakes.java
│ │ │ │ └── repository/
│ │ │ │ ├── ChatRoomRepositoryTest.java
│ │ │ │ ├── FileRepositoryTest.java
│ │ │ │ ├── GxsClientUpdateRepositoryTest.java
│ │ │ │ ├── GxsIdentityRepositoryTest.java
│ │ │ │ ├── GxsServiceSettingRepositoryTest.java
│ │ │ │ ├── LocationRepositoryTest.java
│ │ │ │ ├── ProfileRepositoryTest.java
│ │ │ │ └── SettingsRepositoryTest.java
│ │ │ ├── environment/
│ │ │ │ ├── CloudTest.java
│ │ │ │ ├── CommandArgumentTest.java
│ │ │ │ └── HostVariableTest.java
│ │ │ ├── job/
│ │ │ │ ├── IdleDetectionJobTest.java
│ │ │ │ └── PeerConnectionJobTest.java
│ │ │ ├── net/
│ │ │ │ ├── bdisc/
│ │ │ │ │ ├── BroadcastDiscoveryServiceTest.java
│ │ │ │ │ └── UdpDiscoveryProtocolTest.java
│ │ │ │ ├── dht/
│ │ │ │ │ └── NodeIdTest.java
│ │ │ │ ├── peer/
│ │ │ │ │ ├── AbstractPipelineTest.java
│ │ │ │ │ ├── ChannelFake.java
│ │ │ │ │ ├── ChannelHandlerContextFake.java
│ │ │ │ │ ├── PacketDecoderPipelineTest.java
│ │ │ │ │ ├── PacketEncoderPipelineTest.java
│ │ │ │ │ ├── PeerAttributeTest.java
│ │ │ │ │ ├── PeerConnectionFakes.java
│ │ │ │ │ ├── PeerConnectionManagerTest.java
│ │ │ │ │ ├── RawItemDecoderPipelineTest.java
│ │ │ │ │ ├── packet/
│ │ │ │ │ │ ├── MultiPacketBuilder.java
│ │ │ │ │ │ ├── PacketTest.java
│ │ │ │ │ │ └── SimplePacketBuilder.java
│ │ │ │ │ └── ssl/
│ │ │ │ │ └── SSLTest.java
│ │ │ │ ├── protocol/
│ │ │ │ │ ├── PeerAddressTest.java
│ │ │ │ │ ├── i2p/
│ │ │ │ │ │ └── I2pAddressTest.java
│ │ │ │ │ └── tor/
│ │ │ │ │ └── OnionAddressTest.java
│ │ │ │ ├── upnp/
│ │ │ │ │ ├── ControlPointTest.java
│ │ │ │ │ ├── DeviceTest.java
│ │ │ │ │ ├── PortMappingTest.java
│ │ │ │ │ ├── SoapTest.java
│ │ │ │ │ └── UPNPServiceTest.java
│ │ │ │ └── util/
│ │ │ │ └── NetworkModeTest.java
│ │ │ ├── service/
│ │ │ │ ├── CapabilityServiceTest.java
│ │ │ │ ├── ContactServiceTest.java
│ │ │ │ ├── ForumMessageServiceTest.java
│ │ │ │ ├── GeoIpServiceTest.java
│ │ │ │ ├── LocationServiceTest.java
│ │ │ │ ├── ProfileServiceTest.java
│ │ │ │ ├── QrCodeServiceTest.java
│ │ │ │ ├── ServiceRulesTest.java
│ │ │ │ ├── SettingsServiceTest.java
│ │ │ │ ├── UnHtmlServiceTest.java
│ │ │ │ ├── file/
│ │ │ │ │ └── FileServiceTest.java
│ │ │ │ └── shell/
│ │ │ │ ├── HistoryTest.java
│ │ │ │ └── ShellServiceTest.java
│ │ │ ├── util/
│ │ │ │ ├── OsUtilsTest.java
│ │ │ │ └── expression/
│ │ │ │ ├── ExpressionCriteriaTest.java
│ │ │ │ ├── ExpressionMapperTest.java
│ │ │ │ └── ExpressionTest.java
│ │ │ └── xrs/
│ │ │ ├── common/
│ │ │ │ └── SecurityKeyTest.java
│ │ │ ├── item/
│ │ │ │ ├── ItemHeaderTest.java
│ │ │ │ ├── ItemPriorityTest.java
│ │ │ │ └── ItemTest.java
│ │ │ ├── serialization/
│ │ │ │ ├── SerialAll.java
│ │ │ │ ├── SerialEnum.java
│ │ │ │ ├── SerialList.java
│ │ │ │ ├── SerialMap.java
│ │ │ │ ├── SerializerTest.java
│ │ │ │ ├── TlvImageSerializerTest.java
│ │ │ │ └── TlvUtilsTest.java
│ │ │ └── service/
│ │ │ ├── RsServiceInitPriorityTest.java
│ │ │ ├── RsServiceRulesTest.java
│ │ │ ├── bandwidth/
│ │ │ │ └── BandwidthUtilsTest.java
│ │ │ ├── chat/
│ │ │ │ ├── ChatFlagsTest.java
│ │ │ │ ├── ChatRoomEventTest.java
│ │ │ │ ├── ChatRoomServiceTest.java
│ │ │ │ ├── ChatRsServiceTest.java
│ │ │ │ └── RoomFlagsTest.java
│ │ │ ├── discovery/
│ │ │ │ ├── DiscoveryPgpListItemTest.java
│ │ │ │ └── DiscoveryRsServiceTest.java
│ │ │ ├── filetransfer/
│ │ │ │ ├── ChunkDistributorTest.java
│ │ │ │ ├── ChunkMapUtilsTest.java
│ │ │ │ ├── ChunkTest.java
│ │ │ │ ├── FileDownloadTest.java
│ │ │ │ ├── FileTransferAgentTest.java
│ │ │ │ └── FileUploadTest.java
│ │ │ ├── gxs/
│ │ │ │ ├── GxsRequestTypeTest.java
│ │ │ │ ├── GxsSignatureTest.java
│ │ │ │ ├── TransactionFlagsTest.java
│ │ │ │ ├── TransactionTest.java
│ │ │ │ └── item/
│ │ │ │ └── GxsSyncMessageRequestItemTest.java
│ │ │ ├── gxstunnel/
│ │ │ │ └── TunnelPeerInfoTest.java
│ │ │ ├── heartbeat/
│ │ │ │ └── HeartbeatTest.java
│ │ │ ├── identity/
│ │ │ │ ├── IdentityManagerTest.java
│ │ │ │ └── IdentityRsServiceTest.java
│ │ │ ├── rtt/
│ │ │ │ └── RttRsServiceTest.java
│ │ │ ├── status/
│ │ │ │ ├── IdleCheckerTest.java
│ │ │ │ ├── StatusRsServiceTest.java
│ │ │ │ └── StatusTest.java
│ │ │ └── turtle/
│ │ │ ├── HashBloomFilterTest.java
│ │ │ └── TurtleRsServiceTest.java
│ │ └── testutils/
│ │ ├── FakeHttpServer.java
│ │ └── ResourceUtils.java
│ └── resources/
│ ├── application-default.properties
│ └── upnp/
│ └── routers/
│ └── RT-AC87U.xml
├── build.gradle
├── common/
│ ├── build.gradle
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── io/
│ │ │ └── xeres/
│ │ │ └── common/
│ │ │ ├── AppName.java
│ │ │ ├── Features.java
│ │ │ ├── annotation/
│ │ │ │ └── RsDeprecated.java
│ │ │ ├── condition/
│ │ │ │ ├── OnLinuxCondition.java
│ │ │ │ ├── OnMacCondition.java
│ │ │ │ └── OnWindowsCondition.java
│ │ │ ├── dto/
│ │ │ │ ├── board/
│ │ │ │ │ ├── BoardGroupDTO.java
│ │ │ │ │ └── BoardMessageDTO.java
│ │ │ │ ├── channel/
│ │ │ │ │ ├── ChannelFileDTO.java
│ │ │ │ │ ├── ChannelGroupDTO.java
│ │ │ │ │ └── ChannelMessageDTO.java
│ │ │ │ ├── chat/
│ │ │ │ │ ├── ChatBacklogDTO.java
│ │ │ │ │ ├── ChatIdentityDTO.java
│ │ │ │ │ ├── ChatRoomBacklogDTO.java
│ │ │ │ │ ├── ChatRoomContextDTO.java
│ │ │ │ │ ├── ChatRoomDTO.java
│ │ │ │ │ └── ChatRoomsDTO.java
│ │ │ │ ├── connection/
│ │ │ │ │ └── ConnectionDTO.java
│ │ │ │ ├── forum/
│ │ │ │ │ ├── ForumGroupDTO.java
│ │ │ │ │ └── ForumMessageDTO.java
│ │ │ │ ├── identity/
│ │ │ │ │ ├── IdentityConstants.java
│ │ │ │ │ └── IdentityDTO.java
│ │ │ │ ├── location/
│ │ │ │ │ ├── LocationConstants.java
│ │ │ │ │ └── LocationDTO.java
│ │ │ │ ├── profile/
│ │ │ │ │ ├── ProfileConstants.java
│ │ │ │ │ └── ProfileDTO.java
│ │ │ │ ├── settings/
│ │ │ │ │ └── SettingsDTO.java
│ │ │ │ └── share/
│ │ │ │ ├── ShareConstants.java
│ │ │ │ └── ShareDTO.java
│ │ │ ├── events/
│ │ │ │ ├── ConnectWebSocketsEvent.java
│ │ │ │ ├── StartupEvent.java
│ │ │ │ └── SynchronousEvent.java
│ │ │ ├── file/
│ │ │ │ └── FileType.java
│ │ │ ├── geoip/
│ │ │ │ └── Country.java
│ │ │ ├── gxs/
│ │ │ │ └── GxsGroupConstants.java
│ │ │ ├── i18n/
│ │ │ │ ├── I18nEnum.java
│ │ │ │ └── I18nUtils.java
│ │ │ ├── id/
│ │ │ │ ├── GxsId.java
│ │ │ │ ├── Id.java
│ │ │ │ ├── Identifier.java
│ │ │ │ ├── LocationIdentifier.java
│ │ │ │ ├── MsgId.java
│ │ │ │ ├── ProfileFingerprint.java
│ │ │ │ └── Sha1Sum.java
│ │ │ ├── identity/
│ │ │ │ └── Type.java
│ │ │ ├── location/
│ │ │ │ └── Availability.java
│ │ │ ├── message/
│ │ │ │ ├── MessageHeaders.java
│ │ │ │ ├── MessagePath.java
│ │ │ │ ├── MessageType.java
│ │ │ │ ├── MessagingConfiguration.java
│ │ │ │ ├── chat/
│ │ │ │ │ ├── ChatAvatar.java
│ │ │ │ │ ├── ChatBacklog.java
│ │ │ │ │ ├── ChatConstants.java
│ │ │ │ │ ├── ChatMessage.java
│ │ │ │ │ ├── ChatRoomBacklog.java
│ │ │ │ │ ├── ChatRoomContext.java
│ │ │ │ │ ├── ChatRoomInfo.java
│ │ │ │ │ ├── ChatRoomInviteEvent.java
│ │ │ │ │ ├── ChatRoomLists.java
│ │ │ │ │ ├── ChatRoomMessage.java
│ │ │ │ │ ├── ChatRoomTimeoutEvent.java
│ │ │ │ │ ├── ChatRoomUser.java
│ │ │ │ │ ├── ChatRoomUserEvent.java
│ │ │ │ │ └── RoomType.java
│ │ │ │ └── voip/
│ │ │ │ ├── VoipAction.java
│ │ │ │ └── VoipMessage.java
│ │ │ ├── mui/
│ │ │ │ ├── MUI.java
│ │ │ │ ├── MUIScrollBar.java
│ │ │ │ ├── Shell.java
│ │ │ │ ├── ShellAction.java
│ │ │ │ └── ShellResult.java
│ │ │ ├── pgp/
│ │ │ │ └── Trust.java
│ │ │ ├── properties/
│ │ │ │ └── StartupProperties.java
│ │ │ ├── protocol/
│ │ │ │ ├── HostPort.java
│ │ │ │ ├── NetMode.java
│ │ │ │ ├── dns/
│ │ │ │ │ ├── DNS.java
│ │ │ │ │ ├── DnsRequest.java
│ │ │ │ │ └── DnsResponse.java
│ │ │ │ ├── i2p/
│ │ │ │ │ └── I2pAddress.java
│ │ │ │ ├── ip/
│ │ │ │ │ ├── IP.java
│ │ │ │ │ └── package-info.java
│ │ │ │ ├── tor/
│ │ │ │ │ ├── OnionAddress.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── xrs/
│ │ │ │ └── RsServiceType.java
│ │ │ ├── rest/
│ │ │ │ ├── PathConfig.java
│ │ │ │ ├── board/
│ │ │ │ │ └── UpdateBoardMessageReadRequest.java
│ │ │ │ ├── channel/
│ │ │ │ │ └── UpdateChannelMessageReadRequest.java
│ │ │ │ ├── chat/
│ │ │ │ │ ├── ChatRoomVisibility.java
│ │ │ │ │ ├── CreateChatRoomRequest.java
│ │ │ │ │ ├── DistantChatRequest.java
│ │ │ │ │ └── InviteToChatRoomRequest.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── Capabilities.java
│ │ │ │ │ ├── HostnameResponse.java
│ │ │ │ │ ├── ImportRsFriendsResponse.java
│ │ │ │ │ ├── IpAddressResponse.java
│ │ │ │ │ ├── OwnIdentityRequest.java
│ │ │ │ │ ├── OwnLocationRequest.java
│ │ │ │ │ ├── OwnProfileRequest.java
│ │ │ │ │ ├── UsernameResponse.java
│ │ │ │ │ └── VerifyUpdateRequest.java
│ │ │ │ ├── connection/
│ │ │ │ │ └── ConnectionRequest.java
│ │ │ │ ├── contact/
│ │ │ │ │ └── Contact.java
│ │ │ │ ├── file/
│ │ │ │ │ ├── AddDownloadRequest.java
│ │ │ │ │ ├── FileDownloadRequest.java
│ │ │ │ │ ├── FileProgress.java
│ │ │ │ │ ├── FileSearchRequest.java
│ │ │ │ │ └── FileSearchResponse.java
│ │ │ │ ├── forum/
│ │ │ │ │ ├── CreateForumMessageRequest.java
│ │ │ │ │ ├── CreateOrUpdateForumGroupRequest.java
│ │ │ │ │ ├── ForumPostRequest.java
│ │ │ │ │ └── UpdateForumMessageReadRequest.java
│ │ │ │ ├── geoip/
│ │ │ │ │ └── CountryResponse.java
│ │ │ │ ├── location/
│ │ │ │ │ └── RSIdResponse.java
│ │ │ │ ├── notification/
│ │ │ │ │ ├── Notification.java
│ │ │ │ │ ├── availability/
│ │ │ │ │ │ ├── AvailabilityChange.java
│ │ │ │ │ │ └── AvailabilityNotification.java
│ │ │ │ │ ├── board/
│ │ │ │ │ │ ├── AddOrUpdateBoardGroups.java
│ │ │ │ │ │ ├── AddOrUpdateBoardMessages.java
│ │ │ │ │ │ ├── BoardNotification.java
│ │ │ │ │ │ ├── SetBoardGroupMessagesReadState.java
│ │ │ │ │ │ └── SetBoardMessageReadState.java
│ │ │ │ │ ├── channel/
│ │ │ │ │ │ ├── AddOrUpdateChannelGroups.java
│ │ │ │ │ │ ├── AddOrUpdateChannelMessages.java
│ │ │ │ │ │ ├── ChannelNotification.java
│ │ │ │ │ │ ├── SetChannelGroupMessagesReadState.java
│ │ │ │ │ │ └── SetChannelMessageReadState.java
│ │ │ │ │ ├── contact/
│ │ │ │ │ │ ├── AddOrUpdateContacts.java
│ │ │ │ │ │ ├── ContactNotification.java
│ │ │ │ │ │ └── RemoveContacts.java
│ │ │ │ │ ├── file/
│ │ │ │ │ │ ├── FileNotification.java
│ │ │ │ │ │ ├── FileNotificationAction.java
│ │ │ │ │ │ ├── FileSearchNotification.java
│ │ │ │ │ │ └── FileTrendNotification.java
│ │ │ │ │ ├── forum/
│ │ │ │ │ │ ├── AddOrUpdateForumGroups.java
│ │ │ │ │ │ ├── AddOrUpdateForumMessages.java
│ │ │ │ │ │ ├── ForumNotification.java
│ │ │ │ │ │ ├── SetForumGroupMessagesReadState.java
│ │ │ │ │ │ └── SetForumMessageReadState.java
│ │ │ │ │ └── status/
│ │ │ │ │ ├── DhtInfo.java
│ │ │ │ │ ├── DhtStatus.java
│ │ │ │ │ ├── NatStatus.java
│ │ │ │ │ └── StatusNotification.java
│ │ │ │ ├── profile/
│ │ │ │ │ ├── ProfileKeyAttributes.java
│ │ │ │ │ └── RsIdRequest.java
│ │ │ │ ├── share/
│ │ │ │ │ ├── TemporaryShareRequest.java
│ │ │ │ │ ├── TemporaryShareResponse.java
│ │ │ │ │ └── UpdateShareRequest.java
│ │ │ │ └── statistics/
│ │ │ │ ├── DataCounterPeer.java
│ │ │ │ ├── DataCounterStatisticsResponse.java
│ │ │ │ ├── RttPeer.java
│ │ │ │ ├── RttStatisticsResponse.java
│ │ │ │ └── TurtleStatisticsResponse.java
│ │ │ ├── rsid/
│ │ │ │ └── Type.java
│ │ │ ├── tray/
│ │ │ │ └── TrayNotificationType.java
│ │ │ └── util/
│ │ │ ├── ByteUnitUtils.java
│ │ │ ├── DebugUtils.java
│ │ │ ├── ExecutorUtils.java
│ │ │ ├── FileNameUtils.java
│ │ │ ├── NoSuppressedRunnable.java
│ │ │ ├── OsUtils.java
│ │ │ ├── RemoteUtils.java
│ │ │ ├── SecureRandomUtils.java
│ │ │ ├── ThreadUtils.java
│ │ │ └── image/
│ │ │ ├── ImageUtils.java
│ │ │ ├── JpegUtils.java
│ │ │ └── PngUtils.java
│ │ ├── javadoc/
│ │ │ └── overview.html
│ │ └── resources/
│ │ └── i18n/
│ │ ├── messages.properties
│ │ ├── messages_es.properties
│ │ ├── messages_fr.properties
│ │ ├── messages_ru.properties
│ │ └── messages_zh.properties
│ ├── test/
│ │ └── java/
│ │ └── io/
│ │ └── xeres/
│ │ └── common/
│ │ ├── AppNameTest.java
│ │ ├── CommonCodingRulesTest.java
│ │ ├── file/
│ │ │ └── FileTypeTest.java
│ │ ├── id/
│ │ │ └── IdTest.java
│ │ ├── identity/
│ │ │ └── TypeTest.java
│ │ ├── pgp/
│ │ │ └── TrustTest.java
│ │ ├── protocol/
│ │ │ ├── HostPortTest.java
│ │ │ ├── NetModeTest.java
│ │ │ ├── dns/
│ │ │ │ └── DNSTest.java
│ │ │ └── ip/
│ │ │ └── IPTest.java
│ │ ├── rest/
│ │ │ └── notification/
│ │ │ └── StatusNotificationTest.java
│ │ └── util/
│ │ ├── ByteUnitUtilsTest.java
│ │ ├── FileNameUtilsTest.java
│ │ ├── SecureRandomUtilsTest.java
│ │ └── image/
│ │ └── ImageUtilsTest.java
│ └── testFixtures/
│ └── java/
│ └── io/
│ └── xeres/
│ ├── common/
│ │ └── dto/
│ │ ├── chat/
│ │ │ ├── ChatIdentityDTOFakes.java
│ │ │ ├── ChatRoomContextDTOFakes.java
│ │ │ ├── ChatRoomDTOFakes.java
│ │ │ └── ChatRoomsDTOFakes.java
│ │ ├── connection/
│ │ │ └── ConnectionDTOFakes.java
│ │ ├── identity/
│ │ │ └── IdentityDTOFakes.java
│ │ ├── location/
│ │ │ └── LocationDTOFakes.java
│ │ ├── profile/
│ │ │ └── ProfileDTOFakes.java
│ │ ├── settings/
│ │ │ └── SettingsDTOFakes.java
│ │ └── share/
│ │ └── ShareDTOFakes.java
│ └── testutils/
│ ├── BooleanFakes.java
│ ├── EnumFakes.java
│ ├── IdFakes.java
│ ├── Sha1SumFakes.java
│ ├── StringFakes.java
│ ├── TestUtils.java
│ └── TimeFakes.java
├── docker-compose.yml
├── gradle/
│ └── wrapper/
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
├── icon.icns
├── qodana.yaml
├── scripts/
│ ├── api/
│ │ └── user.js
│ ├── bot/
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── bot.py
│ │ └── requirements.txt
│ └── helper/
│ └── i18n_find_dupe.py
├── settings.gradle
├── transifex.yml
└── ui/
├── build.gradle
└── src/
├── main/
│ ├── java/
│ │ └── io/
│ │ └── xeres/
│ │ └── ui/
│ │ ├── JavaFxApplication.java
│ │ ├── PrimaryStageInitializer.java
│ │ ├── UiStarter.java
│ │ ├── client/
│ │ │ ├── BoardClient.java
│ │ │ ├── ChannelClient.java
│ │ │ ├── ChatClient.java
│ │ │ ├── ConfigClient.java
│ │ │ ├── ConnectionClient.java
│ │ │ ├── ContactClient.java
│ │ │ ├── FileClient.java
│ │ │ ├── ForumClient.java
│ │ │ ├── GeneralClient.java
│ │ │ ├── GeoIpClient.java
│ │ │ ├── GxsGroupClient.java
│ │ │ ├── GxsMessageClient.java
│ │ │ ├── IdentityClient.java
│ │ │ ├── LocationClient.java
│ │ │ ├── NotificationClient.java
│ │ │ ├── PaginatedResponse.java
│ │ │ ├── ProfileClient.java
│ │ │ ├── SettingsClient.java
│ │ │ ├── ShareClient.java
│ │ │ ├── StatisticsClient.java
│ │ │ ├── message/
│ │ │ │ ├── BroadcastChatFrameHandler.java
│ │ │ │ ├── ChatRoomFrameHandler.java
│ │ │ │ ├── DistantChatFrameHandler.java
│ │ │ │ ├── MessageClient.java
│ │ │ │ ├── PendingSubscription.java
│ │ │ │ ├── PrivateChatFrameHandler.java
│ │ │ │ ├── SessionHandler.java
│ │ │ │ └── VoipFrameHandler.java
│ │ │ ├── preview/
│ │ │ │ ├── OEmbedResponse.java
│ │ │ │ ├── PreviewClient.java
│ │ │ │ ├── PreviewResponse.java
│ │ │ │ └── SizeLimitingCollector.java
│ │ │ └── update/
│ │ │ ├── ReleaseAsset.java
│ │ │ ├── ReleaseResponse.java
│ │ │ ├── UpdateClient.java
│ │ │ └── UpdateProgress.java
│ │ ├── configuration/
│ │ │ ├── I18nConfiguration.java
│ │ │ └── WebClientConfiguration.java
│ │ ├── controller/
│ │ │ ├── Controller.java
│ │ │ ├── MainWindowController.java
│ │ │ ├── TabActivation.java
│ │ │ ├── WindowController.java
│ │ │ ├── about/
│ │ │ │ └── AboutWindowController.java
│ │ │ ├── account/
│ │ │ │ └── AccountCreationWindowController.java
│ │ │ ├── board/
│ │ │ │ ├── BoardGroupCell.java
│ │ │ │ ├── BoardGroupWindowController.java
│ │ │ │ ├── BoardMessageCell.java
│ │ │ │ ├── BoardMessageWindowController.java
│ │ │ │ └── BoardViewController.java
│ │ │ ├── channel/
│ │ │ │ ├── ChannelFileSizeCell.java
│ │ │ │ ├── ChannelGroupCell.java
│ │ │ │ ├── ChannelGroupWindowController.java
│ │ │ │ ├── ChannelMessageCell.java
│ │ │ │ ├── ChannelMessageRow.java
│ │ │ │ ├── ChannelMessageWindowController.java
│ │ │ │ └── ChannelViewController.java
│ │ │ ├── chat/
│ │ │ │ ├── ChatListCell.java
│ │ │ │ ├── ChatListDragSelection.java
│ │ │ │ ├── ChatListView.java
│ │ │ │ ├── ChatListViewContextMenu.java
│ │ │ │ ├── ChatRoomCell.java
│ │ │ │ ├── ChatRoomCreationWindowController.java
│ │ │ │ ├── ChatRoomInfoController.java
│ │ │ │ ├── ChatRoomInvitationWindowController.java
│ │ │ │ ├── ChatRoomUser.java
│ │ │ │ ├── ChatUserCell.java
│ │ │ │ ├── ChatViewController.java
│ │ │ │ ├── PeerHolder.java
│ │ │ │ └── RoomHolder.java
│ │ │ ├── common/
│ │ │ │ ├── GxsGroup.java
│ │ │ │ ├── GxsGroupCellCount.java
│ │ │ │ ├── GxsGroupTreeTableAction.java
│ │ │ │ ├── GxsGroupTreeTableView.java
│ │ │ │ └── GxsMessage.java
│ │ │ ├── contact/
│ │ │ │ ├── AvailabilityCellStatus.java
│ │ │ │ ├── AvailabilityCellUtil.java
│ │ │ │ ├── AvailabilityTreeCellStatus.java
│ │ │ │ ├── ContactCellName.java
│ │ │ │ ├── ContactFilter.java
│ │ │ │ ├── ContactViewController.java
│ │ │ │ └── LocationRow.java
│ │ │ ├── debug/
│ │ │ │ └── DebugRequesterWindowController.java
│ │ │ ├── file/
│ │ │ │ ├── FileAddDownloadViewWindowController.java
│ │ │ │ ├── FileDownloadViewController.java
│ │ │ │ ├── FileMainController.java
│ │ │ │ ├── FileProgressDisplay.java
│ │ │ │ ├── FileProgressSizeCell.java
│ │ │ │ ├── FileResult.java
│ │ │ │ ├── FileResultNameCell.java
│ │ │ │ ├── FileResultSizeCell.java
│ │ │ │ ├── FileResultView.java
│ │ │ │ ├── FileSearchViewController.java
│ │ │ │ ├── FileTrendViewController.java
│ │ │ │ ├── FileUploadViewController.java
│ │ │ │ ├── TimeCell.java
│ │ │ │ └── TrendResult.java
│ │ │ ├── forum/
│ │ │ │ ├── DateCell.java
│ │ │ │ ├── ForumCell.java
│ │ │ │ ├── ForumCellAuthor.java
│ │ │ │ ├── ForumEditorWindowController.java
│ │ │ │ ├── ForumGroupWindowController.java
│ │ │ │ ├── ForumMessageCell.java
│ │ │ │ ├── ForumViewController.java
│ │ │ │ └── MessageVersion.java
│ │ │ ├── help/
│ │ │ │ ├── HelpWindowController.java
│ │ │ │ ├── IndexCell.java
│ │ │ │ └── Navigator.java
│ │ │ ├── id/
│ │ │ │ ├── AddRsIdWindowController.java
│ │ │ │ ├── AddressCell.java
│ │ │ │ ├── AddressConverter.java
│ │ │ │ ├── AddressCountry.java
│ │ │ │ └── FlagUtils.java
│ │ │ ├── messaging/
│ │ │ │ ├── BroadcastWindowController.java
│ │ │ │ ├── Destination.java
│ │ │ │ └── MessagingWindowController.java
│ │ │ ├── qrcode/
│ │ │ │ ├── CameraWindowController.java
│ │ │ │ ├── QrCodeWindowController.java
│ │ │ │ └── QrPrintController.java
│ │ │ ├── settings/
│ │ │ │ ├── SettingsCell.java
│ │ │ │ ├── SettingsController.java
│ │ │ │ ├── SettingsGeneralController.java
│ │ │ │ ├── SettingsGroup.java
│ │ │ │ ├── SettingsNetworksController.java
│ │ │ │ ├── SettingsNotificationController.java
│ │ │ │ ├── SettingsRemoteController.java
│ │ │ │ ├── SettingsSoundController.java
│ │ │ │ ├── SettingsTransferController.java
│ │ │ │ ├── SettingsWindowController.java
│ │ │ │ └── ThemeCell.java
│ │ │ ├── share/
│ │ │ │ ├── ShareWindowController.java
│ │ │ │ └── TrustConverter.java
│ │ │ ├── statistics/
│ │ │ │ ├── StatisticsDataCounterController.java
│ │ │ │ ├── StatisticsMainWindowController.java
│ │ │ │ ├── StatisticsRttController.java
│ │ │ │ └── StatisticsTurtleController.java
│ │ │ └── voip/
│ │ │ ├── TimeCounter.java
│ │ │ └── VoipWindowController.java
│ │ ├── custom/
│ │ │ ├── DelayedAction.java
│ │ │ ├── DelayedTooltip.java
│ │ │ ├── DisclosedHyperlink.java
│ │ │ ├── EditorView.java
│ │ │ ├── ImageSelectorView.java
│ │ │ ├── InfoView.java
│ │ │ ├── InputArea.java
│ │ │ ├── InputAreaGroup.java
│ │ │ ├── NullSelectionModel.java
│ │ │ ├── ProgressPane.java
│ │ │ ├── ReadOnlyTextField.java
│ │ │ ├── ResizeableImageView.java
│ │ │ ├── StickerView.java
│ │ │ ├── TypingNotificationView.java
│ │ │ ├── WaveDotsView.java
│ │ │ ├── alias/
│ │ │ │ ├── AliasCell.java
│ │ │ │ ├── AliasView.java
│ │ │ │ └── PopupAlias.java
│ │ │ ├── asyncimage/
│ │ │ │ ├── AsyncImageView.java
│ │ │ │ ├── ContactImageView.java
│ │ │ │ ├── ImageCache.java
│ │ │ │ └── PlaceholderImageView.java
│ │ │ ├── event/
│ │ │ │ ├── FileSelectedEvent.java
│ │ │ │ ├── ImageSelectedEvent.java
│ │ │ │ └── StickerSelectedEvent.java
│ │ │ └── led/
│ │ │ ├── LedControl.java
│ │ │ ├── LedSkin.java
│ │ │ └── LedStatus.java
│ │ ├── event/
│ │ │ ├── OpenUriEvent.java
│ │ │ ├── StageReadyEvent.java
│ │ │ └── UnreadEvent.java
│ │ ├── model/
│ │ │ ├── board/
│ │ │ │ ├── BoardGroup.java
│ │ │ │ ├── BoardMapper.java
│ │ │ │ └── BoardMessage.java
│ │ │ ├── channel/
│ │ │ │ ├── ChannelFile.java
│ │ │ │ ├── ChannelGroup.java
│ │ │ │ ├── ChannelMapper.java
│ │ │ │ └── ChannelMessage.java
│ │ │ ├── chat/
│ │ │ │ └── ChatMapper.java
│ │ │ ├── connection/
│ │ │ │ ├── Connection.java
│ │ │ │ └── ConnectionMapper.java
│ │ │ ├── forum/
│ │ │ │ ├── ForumGroup.java
│ │ │ │ ├── ForumMapper.java
│ │ │ │ └── ForumMessage.java
│ │ │ ├── identity/
│ │ │ │ ├── Identity.java
│ │ │ │ └── IdentityMapper.java
│ │ │ ├── location/
│ │ │ │ ├── Location.java
│ │ │ │ └── LocationMapper.java
│ │ │ ├── profile/
│ │ │ │ ├── Profile.java
│ │ │ │ └── ProfileMapper.java
│ │ │ ├── settings/
│ │ │ │ ├── Settings.java
│ │ │ │ └── SettingsMapper.java
│ │ │ └── share/
│ │ │ ├── Share.java
│ │ │ └── ShareMapper.java
│ │ ├── properties/
│ │ │ └── UiClientProperties.java
│ │ └── support/
│ │ ├── ImageCacheService.java
│ │ ├── chat/
│ │ │ ├── AliasEntry.java
│ │ │ ├── ChatAction.java
│ │ │ ├── ChatCommand.java
│ │ │ ├── ChatLine.java
│ │ │ ├── ChatParser.java
│ │ │ ├── ColorGenerator.java
│ │ │ └── NicknameCompleter.java
│ │ ├── clipboard/
│ │ │ ├── ClipboardUtils.java
│ │ │ └── ImageSelection.java
│ │ ├── contact/
│ │ │ └── ContactUtils.java
│ │ ├── contentline/
│ │ │ ├── Content.java
│ │ │ ├── ContentCode.java
│ │ │ ├── ContentEmoji.java
│ │ │ ├── ContentEmphasis.java
│ │ │ ├── ContentHeader.java
│ │ │ ├── ContentHorizontalRule.java
│ │ │ ├── ContentImage.java
│ │ │ ├── ContentStrikethrough.java
│ │ │ ├── ContentText.java
│ │ │ ├── ContentUri.java
│ │ │ └── ContentUriPreview.java
│ │ ├── contextmenu/
│ │ │ └── XContextMenu.java
│ │ ├── emoji/
│ │ │ ├── EmojiService.java
│ │ │ └── RsEmojiAlias.java
│ │ ├── loader/
│ │ │ ├── FetchMode.java
│ │ │ ├── FetchRequest.java
│ │ │ ├── InfiniteScrollable.java
│ │ │ ├── InfiniteTreeListView.java
│ │ │ ├── InfiniteVirtualizedScrollPane.java
│ │ │ ├── OnDemandLoader.java
│ │ │ └── OnDemandLoaderAction.java
│ │ ├── markdown/
│ │ │ ├── AltTextVisitor.java
│ │ │ ├── ContentRenderer.java
│ │ │ ├── ContentVisitor.java
│ │ │ ├── MarkdownService.java
│ │ │ └── UriAction.java
│ │ ├── notification/
│ │ │ └── NotificationSettings.java
│ │ ├── oembed/
│ │ │ ├── OEmbedProvider.java
│ │ │ └── OEmbedService.java
│ │ ├── preference/
│ │ │ └── PreferenceUtils.java
│ │ ├── sound/
│ │ │ ├── SoundPlayerService.java
│ │ │ └── SoundSettings.java
│ │ ├── splash/
│ │ │ └── SplashService.java
│ │ ├── theme/
│ │ │ ├── AppTheme.java
│ │ │ └── AppThemeManager.java
│ │ ├── tray/
│ │ │ └── TrayService.java
│ │ ├── unread/
│ │ │ └── UnreadService.java
│ │ ├── updater/
│ │ │ ├── UpdateService.java
│ │ │ ├── Version.java
│ │ │ ├── VersionCheckTask.java
│ │ │ └── VersionChecker.java
│ │ ├── uri/
│ │ │ ├── AbstractUriFactory.java
│ │ │ ├── BoardUri.java
│ │ │ ├── BoardUriFactory.java
│ │ │ ├── CertificateUri.java
│ │ │ ├── CertificateUriFactory.java
│ │ │ ├── ChannelUri.java
│ │ │ ├── ChannelUriFactory.java
│ │ │ ├── ChatRoomUri.java
│ │ │ ├── ChatRoomUriFactory.java
│ │ │ ├── CollectionUri.java
│ │ │ ├── CollectionUriFactory.java
│ │ │ ├── ExternalUri.java
│ │ │ ├── ExternalUriFactory.java
│ │ │ ├── FileUri.java
│ │ │ ├── FileUriFactory.java
│ │ │ ├── ForumUri.java
│ │ │ ├── ForumUriFactory.java
│ │ │ ├── IdentityUri.java
│ │ │ ├── IdentityUriFactory.java
│ │ │ ├── MessageUri.java
│ │ │ ├── MessageUriFactory.java
│ │ │ ├── ProfileUri.java
│ │ │ ├── ProfileUriFactory.java
│ │ │ ├── SearchUri.java
│ │ │ ├── SearchUriFactory.java
│ │ │ ├── Uri.java
│ │ │ ├── UriFactory.java
│ │ │ └── UriService.java
│ │ ├── util/
│ │ │ ├── ChooserUtils.java
│ │ │ ├── ClientUtils.java
│ │ │ ├── DateUtils.java
│ │ │ ├── ImageViewUtils.java
│ │ │ ├── PublicKeyUtils.java
│ │ │ ├── Range.java
│ │ │ ├── SmileyUtils.java
│ │ │ ├── TextFieldUtils.java
│ │ │ ├── TextFlowDragSelection.java
│ │ │ ├── TextFlowUtils.java
│ │ │ ├── TextInputControlUtils.java
│ │ │ ├── TextSelectRange.java
│ │ │ ├── TooltipUtils.java
│ │ │ ├── UiUtils.java
│ │ │ └── UriUtils.java
│ │ └── window/
│ │ ├── UiNativeWindow.java
│ │ ├── WindowBorder.java
│ │ ├── WindowManager.java
│ │ └── WindowResizer.java
│ ├── javadoc/
│ │ └── overview.html
│ └── resources/
│ ├── help/
│ │ ├── en/
│ │ │ ├── 00.Index.md
│ │ │ ├── 01.Quick Setup.md
│ │ │ ├── 02.Network.md
│ │ │ ├── 03.Markdown.md
│ │ │ ├── 04.Emojis.md
│ │ │ ├── 05.Startup arguments.md
│ │ │ └── 06.Links.md
│ │ ├── es/
│ │ │ ├── 00.Index.md
│ │ │ ├── 01.Configuración rápida.md
│ │ │ ├── 02.Red.md
│ │ │ ├── 04.Emojis.md
│ │ │ ├── 05.Argumentos de inicio.md
│ │ │ └── 06.Enlaces.md
│ │ ├── fr/
│ │ │ ├── 00.Index.md
│ │ │ ├── 01.Configuration rapide.md
│ │ │ ├── 02.Réseau.md
│ │ │ ├── 04.Emojis.md
│ │ │ ├── 05.Arguments de démarrage.md
│ │ │ └── 06.Liens.md
│ │ ├── ru/
│ │ │ ├── 00.Index.md
│ │ │ ├── 01.Быстрая настройка.md
│ │ │ ├── 02.Сеть.md
│ │ │ ├── 04.Эмодзи.md
│ │ │ ├── 05.Аргументы запуска.md
│ │ │ └── 06.Ссылки.md
│ │ └── zh/
│ │ ├── 00.Index.md
│ │ ├── 01.快速设置.md
│ │ ├── 02.网络.md
│ │ ├── 04.表情符号.md
│ │ ├── 05.启动参数.md
│ │ └── 06.链接
│ ├── oembed-providers.json
│ ├── retroshare-emojis.json
│ └── view/
│ ├── about/
│ │ └── about.fxml
│ ├── account/
│ │ └── account_creation.fxml
│ ├── board/
│ │ ├── board_group_view.fxml
│ │ ├── board_message_view.fxml
│ │ ├── board_view.fxml
│ │ └── message_cell.fxml
│ ├── channel/
│ │ ├── channel_group_view.fxml
│ │ ├── channel_message_view.fxml
│ │ ├── channel_view.fxml
│ │ └── message_cell.fxml
│ ├── chat/
│ │ ├── chat_roominfo.fxml
│ │ ├── chat_view.fxml
│ │ ├── chatroom_create.fxml
│ │ └── chatroom_invite.fxml
│ ├── contact/
│ │ └── contact_view.fxml
│ ├── custom/
│ │ ├── alias_view.fxml
│ │ ├── editor_view.fxml
│ │ ├── file_results_view.fxml
│ │ ├── gxs_group_tree_table_view.fxml
│ │ ├── image_selector_view.fxml
│ │ ├── info_view.fxml
│ │ ├── input_area_group.fxml
│ │ ├── sticker_view.fxml
│ │ ├── typing_notification_view.fxml
│ │ └── wave_dots_view.fxml
│ ├── debug/
│ │ └── debug_requester_view.fxml
│ ├── default.css
│ ├── file/
│ │ ├── add_download.fxml
│ │ ├── download.fxml
│ │ ├── main.fxml
│ │ ├── search.fxml
│ │ ├── share.fxml
│ │ ├── trend.fxml
│ │ └── upload.fxml
│ ├── forum/
│ │ ├── forum_editor_view.fxml
│ │ ├── forum_group_view.fxml
│ │ └── forum_view.fxml
│ ├── help/
│ │ └── help.fxml
│ ├── id/
│ │ └── rsid_add.fxml
│ ├── linux.css
│ ├── mac.css
│ ├── main.fxml
│ ├── messaging/
│ │ ├── broadcast.fxml
│ │ └── messaging.fxml
│ ├── printer.css
│ ├── qrcode/
│ │ ├── camera.fxml
│ │ ├── qrcode.fxml
│ │ └── qrprint.fxml
│ ├── settings/
│ │ ├── settings.fxml
│ │ ├── settings_general.fxml
│ │ ├── settings_networks.fxml
│ │ ├── settings_notifications.fxml
│ │ ├── settings_remote.fxml
│ │ ├── settings_sound.fxml
│ │ └── settings_transfer.fxml
│ ├── statistics/
│ │ ├── datacounter.fxml
│ │ ├── main.fxml
│ │ ├── rtt.fxml
│ │ └── turtle.fxml
│ ├── voip/
│ │ └── voip.fxml
│ └── windows.css
└── test/
└── java/
└── io/
└── xeres/
└── ui/
├── FXTest.java
├── UiCodingRulesTest.java
├── client/
│ └── PaginatedResponseTest.java
├── controller/
│ ├── about/
│ │ └── AboutWindowControllerTest.java
│ ├── account/
│ │ └── AccountCreationWindowControllerTest.java
│ ├── chat/
│ │ ├── ChatRoomCreationWindowControllerTest.java
│ │ ├── ChatRoomInvitationWindowControllerTest.java
│ │ └── ChatViewControllerTest.java
│ ├── contact/
│ │ └── ContactViewControllerTest.java
│ ├── help/
│ │ ├── HelpWindowControllerTest.java
│ │ └── NavigatorTest.java
│ ├── id/
│ │ └── AddRsIdWindowControllerTest.java
│ ├── messaging/
│ │ ├── BroadcastWindowControllerTest.java
│ │ └── MessagingWindowControllerTest.java
│ ├── qrcode/
│ │ └── QrCodeWindowControllerTest.java
│ └── share/
│ └── ShareWindowControllerTest.java
├── custom/
│ ├── AsyncImageViewTest.java
│ └── EditorViewTest.java
├── model/
│ ├── chat/
│ │ └── ChatMapperTest.java
│ ├── connection/
│ │ └── ConnectionMapperTest.java
│ ├── identity/
│ │ └── IdentityMapperTest.java
│ ├── location/
│ │ └── LocationMapperTest.java
│ ├── profile/
│ │ └── ProfileMapperTest.java
│ ├── settings/
│ │ └── SettingsMapperTest.java
│ └── share/
│ └── ShareMapperTest.java
└── support/
├── chat/
│ ├── ChatActionTest.java
│ ├── ChatParserTest.java
│ ├── ColorGeneratorTest.java
│ └── NicknameCompleterTest.java
├── emoji/
│ └── EmojiServiceTest.java
├── markdown/
│ └── MarkdownServiceTest.java
├── uri/
│ ├── BoardUriFactoryTest.java
│ ├── CertificateUriFactoryTest.java
│ ├── FileUriFactoryTest.java
│ └── UriFactoryUtils.java
└── util/
├── ImageViewUtilsTest.java
├── RangeTest.java
├── SmileyUtilsTest.java
├── TextInputControlUtilsTest.java
├── UiUtilsTest.java
└── UriUtilsTest.java
Showing preview only (733K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (8860 symbols across 1133 files)
FILE: app/src/main/java/io/xeres/app/XeresApplication.java
class XeresApplication (line 32) | @SpringBootApplication(scanBasePackageClasses = {io.xeres.app.XeresAppli...
method main (line 38) | static void main(String[] args)
FILE: app/src/main/java/io/xeres/app/api/DefaultHandler.java
class DefaultHandler (line 52) | @RestControllerAdvice
method handleNotFoundException (line 77) | @ExceptionHandler({
method handleUnprocessableEntityException (line 89) | @ExceptionHandler(UnprocessableEntityException.class)
method handleEntityExistsException (line 98) | @ExceptionHandler(EntityExistsException.class)
method handleIllegalArgumentException (line 107) | @ExceptionHandler(IllegalArgumentException.class)
method handleException (line 116) | @ExceptionHandler(Exception.class)
method handleResponseStatusException (line 132) | @ExceptionHandler(ResponseStatusException.class)
method handleMethodArgumentNotValid (line 139) | @Override
method handleValidationException (line 146) | private ProblemDetail handleValidationException(MethodArgumentNotValid...
method logError (line 159) | private void logError(Exception e, boolean withStackTrace)
FILE: app/src/main/java/io/xeres/app/api/controller/board/BoardController.java
class BoardController (line 66) | @Tag(name = "Boards", description = "Boards")
method BoardController (line 76) | public BoardController(BoardRsService boardRsService, IdentityService ...
method getBoardGroups (line 84) | @GetMapping("/groups")
method createBoardGroup (line 91) | @PostMapping(value = "/groups", consumes = MediaType.MULTIPART_FORM_DA...
method updateBoardGroup (line 105) | @PutMapping(value = "/groups/{groupId}", consumes = MediaType.MULTIPAR...
method downloadBoardGroupImage (line 117) | @GetMapping(value = "/groups/{id}/image", produces = {MediaType.IMAGE_...
method getBoardGroupById (line 136) | @GetMapping("/groups/{groupId}")
method getBoardUnreadCount (line 144) | @GetMapping("/groups/{groupId}/unread-count")
method subscribeToBoardGroup (line 151) | @PutMapping("/groups/{groupId}/subscription")
method setAllGroupMessagesReadState (line 159) | @PutMapping("/groups/{groupId}/read")
method unsubscribeFromBoardGroup (line 167) | @DeleteMapping("/groups/{groupId}/subscription")
method getBoardMessages (line 175) | @GetMapping("/groups/{groupId}/messages")
method getBoardMessage (line 189) | @GetMapping("/messages/{messageId}")
method createBoardMessage (line 215) | @PostMapping(value = "/messages", consumes = MediaType.MULTIPART_FORM_...
method downloadBoardMessageImage (line 238) | @GetMapping(value = "/messages/{id}/image", produces = {MediaType.IMAG...
method setBoardMessageReadState (line 257) | @PatchMapping("/messages")
FILE: app/src/main/java/io/xeres/app/api/controller/channel/ChannelController.java
class ChannelController (line 68) | @Tag(name = "Channels", description = "Channels")
method ChannelController (line 78) | public ChannelController(ChannelRsService channelRsService, IdentitySe...
method getChannelGroups (line 86) | @GetMapping("/groups")
method createChannelGroup (line 93) | @PostMapping(value = "/groups", consumes = MediaType.MULTIPART_FORM_DA...
method updateChannelGroup (line 107) | @PutMapping(value = "/groups/{groupId}", consumes = MediaType.MULTIPAR...
method downloadChannelGroupImage (line 119) | @GetMapping(value = "/groups/{id}/image", produces = {MediaType.IMAGE_...
method getChannelGroupById (line 138) | @GetMapping("/groups/{groupId}")
method getChannelUnreadCount (line 146) | @GetMapping("/groups/{groupId}/unread-count")
method subscribeToChannelGroup (line 153) | @PutMapping("/groups/{groupId}/subscription")
method setAllGroupMessagesReadState (line 161) | @PutMapping("/groups/{groupId}/read")
method unsubscribeFromChannelGroup (line 169) | @DeleteMapping("/groups/{groupId}/subscription")
method getChannelMessages (line 177) | @GetMapping("/groups/{groupId}/messages")
method getChannelMessage (line 190) | @GetMapping("/messages/{messageId}")
method createChannelMessage (line 217) | @PostMapping(value = "/messages", consumes = MediaType.MULTIPART_FORM_...
method downloadChannelMessageImage (line 243) | @GetMapping(value = "/messages/{id}/image", produces = {MediaType.IMAG...
method setChannelMessageReadState (line 262) | @PatchMapping("/messages")
FILE: app/src/main/java/io/xeres/app/api/controller/chat/ChatController.java
class ChatController (line 72) | @Tag(name = "Chat", description = "Chat rooms, private messages, distant...
method ChatController (line 87) | public ChatController(ChatRsService chatRsService, ChatBacklogService ...
method createChatRoom (line 95) | @PostMapping("/rooms")
method inviteToChatRoom (line 109) | @PostMapping("/rooms/invite")
method subscribeToChatRoom (line 118) | @PutMapping("/rooms/{id}/subscription")
method unsubscribeFromChatRoom (line 126) | @DeleteMapping("/rooms/{id}/subscription")
method getChatRoomContext (line 134) | @GetMapping("/rooms")
method getChatRoomMessages (line 141) | @GetMapping("/rooms/{roomId}/messages")
method deleteChatRoomMessages (line 155) | @DeleteMapping("/rooms/{roomId}/messages")
method getChatMessages (line 164) | @GetMapping("/chats/{locationId}/messages")
method deleteChatMessages (line 179) | @DeleteMapping("/chats/{locationId}/messages")
method createDistantChat (line 189) | @PostMapping("/distant-chats")
method closeDistantChat (line 205) | @DeleteMapping("/distant-chats/{identityId}")
method getDistantChatMessages (line 218) | @GetMapping("/distant-chats/{identityId}/messages")
method deleteDistantChatMessages (line 233) | @DeleteMapping("/distant-chats/{identityId}/messages")
FILE: app/src/main/java/io/xeres/app/api/controller/chat/ChatMessageController.java
class ChatMessageController (line 50) | @Controller
method ChatMessageController (line 59) | public ChatMessageController(ChatRsService chatRsService, MessageServi...
method processPrivateChatMessageFromProducer (line 65) | @MessageMapping(CHAT_PRIVATE_DESTINATION)
method processDistantChatMessageFromProducer (line 94) | @MessageMapping(CHAT_DISTANT_DESTINATION)
method processChatRoomMessageFromProducer (line 117) | @MessageMapping(CHAT_ROOM_DESTINATION)
method processBroadcastMessageFromProducer (line 140) | @MessageMapping(CHAT_BROADCAST_DESTINATION)
method handleException (line 154) | @MessageExceptionHandler
method logMessage (line 162) | private void logMessage(String info, String message)
FILE: app/src/main/java/io/xeres/app/api/controller/config/ConfigController.java
class ConfigController (line 68) | @Tag(name = "Configuration", description = "Runtime general configuration")
method ConfigController (line 83) | public ConfigController(ProfileService profileService, LocationService...
method createOwnProfile (line 94) | @PostMapping("/profile")
method createOwnLocation (line 117) | @PostMapping("/location")
method changeAvailability (line 139) | @PutMapping("/location/availability")
method createOwnIdentity (line 155) | @PostMapping("/identity")
method getExternalIpAddress (line 177) | @GetMapping("/external-ip")
method getInternalIpAddress (line 192) | @GetMapping("/internal-ip")
method getHostname (line 201) | @GetMapping("/hostname")
method getUsername (line 210) | @GetMapping("/username")
method getCapabilities (line 219) | @GetMapping("/capabilities")
method getBackup (line 227) | @GetMapping(value = "/export", produces = MediaType.APPLICATION_XML_VA...
method restoreFromBackup (line 237) | @PostMapping(value = "/import", consumes = MediaType.MULTIPART_FORM_DA...
method importProfileFromRs (line 248) | @PostMapping(value = "/import-profile-from-rs", consumes = MediaType.M...
method importFriendsFromRs (line 259) | @PostMapping(value = "/import-friends-from-rs", consumes = MediaType.M...
method verifyUpdate (line 270) | @PostMapping("/verify-update")
FILE: app/src/main/java/io/xeres/app/api/controller/connection/ConnectionController.java
class ConnectionController (line 45) | @Tag(name = "Connection", description = "Connected peers")
method ConnectionController (line 53) | public ConnectionController(LocationService locationService, PeerConne...
method getConnectedProfiles (line 59) | @GetMapping("/profiles")
method connect (line 69) | @PutMapping("/connect")
FILE: app/src/main/java/io/xeres/app/api/controller/contact/ContactController.java
class ContactController (line 35) | @Tag(name = "Contact", description = "Contacts")
method ContactController (line 42) | public ContactController(ContactService contactService)
method getContacts (line 47) | @GetMapping("")
FILE: app/src/main/java/io/xeres/app/api/controller/file/FileController.java
class FileController (line 40) | @Tag(name = "File", description = "File service")
method FileController (line 47) | public FileController(FileTransferRsService fileTransferRsService)
method search (line 52) | @PostMapping("/search")
method download (line 59) | @PostMapping("/download")
method getDownloads (line 73) | @GetMapping("/downloads")
method getUploads (line 80) | @GetMapping("/uploads")
method removeDownload (line 87) | @DeleteMapping("/downloads/{id}")
FILE: app/src/main/java/io/xeres/app/api/controller/forum/ForumController.java
class ForumController (line 60) | @Tag(name = "Forums", description = "Forums")
method ForumController (line 70) | public ForumController(ForumRsService forumRsService, IdentityService ...
method getForumGroups (line 78) | @GetMapping("/groups")
method createForumGroup (line 85) | @PostMapping("/groups")
method updateForumGroup (line 97) | @PutMapping("/groups/{groupId}")
method getForumGroupById (line 105) | @GetMapping("/groups/{groupId}")
method getForumUnreadCount (line 113) | @GetMapping("/groups/{groupId}/unread-count")
method subscribeToForumGroup (line 120) | @PutMapping("/groups/{groupId}/subscription")
method markAllMessagesAsRead (line 128) | @PutMapping("/groups/{groupId}/read")
method unsubscribeFromForumGroup (line 136) | @DeleteMapping("/groups/{groupId}/subscription")
method getForumMessages (line 144) | @GetMapping("/groups/{groupId}/messages")
method getForumMessage (line 157) | @GetMapping("/messages/{messageId}")
method createForumMessage (line 184) | @PostMapping("/messages")
method setForumMessageReadState (line 203) | @PatchMapping("/messages")
FILE: app/src/main/java/io/xeres/app/api/controller/geoip/GeoIpController.java
class GeoIpController (line 41) | @Tag(name = "GeoIP", description = "GeoIP lookups")
method GeoIpController (line 48) | public GeoIpController(GeoIpService geoIpService)
method getIsoCountry (line 53) | @GetMapping("/{ip}")
FILE: app/src/main/java/io/xeres/app/api/controller/identity/IdentityController.java
class IdentityController (line 55) | @Tag(name = "Identities", description = "Identities")
method IdentityController (line 65) | public IdentityController(IdentityService identityService, IdentityRsS...
method findIdentityById (line 73) | @GetMapping("/{id}")
method downloadIdentityImage (line 82) | @GetMapping(value = "/{id}/image", produces = {MediaType.IMAGE_JPEG_VA...
method downloadImageByGxsId (line 105) | @GetMapping(value = "/image", produces = {MediaType.IMAGE_JPEG_VALUE, ...
method uploadIdentityImage (line 133) | @PostMapping(value = "/{id}/image", consumes = MediaType.MULTIPART_FOR...
method deleteIdentityImage (line 148) | @DeleteMapping("/{id}/image")
method findIdentities (line 157) | @GetMapping
FILE: app/src/main/java/io/xeres/app/api/controller/location/LocationController.java
class LocationController (line 44) | @Tag(name = "Location", description = "Local instance")
method LocationController (line 53) | public LocationController(LocationService locationService, QrCodeServi...
method findLocationById (line 59) | @GetMapping("/{id}")
method getRSIdOfLocation (line 68) | @GetMapping("/{id}/rs-id")
method getRSIdOfLocationAsQrCode (line 79) | @GetMapping(value = "/{id}/rs-id/qr-code", produces = MediaType.IMAGE_...
method isServiceSupported (line 90) | @GetMapping("/{id}/service/{serviceId}")
FILE: app/src/main/java/io/xeres/app/api/controller/notification/NotificationController.java
class NotificationController (line 41) | @Tag(name = "Notification", description = "Out of band notifications")
method NotificationController (line 56) | public NotificationController(StatusNotificationService statusNotifica...
method setupStatusNotification (line 69) | @GetMapping("/status")
method setupForumNotification (line 76) | @GetMapping("/forum")
method setupBoardNotification (line 83) | @GetMapping("/board")
method setupChannelNotification (line 90) | @GetMapping("/channel")
method setupFileNotification (line 97) | @GetMapping("/file")
method setupFileSearchNotification (line 104) | @GetMapping("/file-search")
method setupFileTrendNotification (line 111) | @GetMapping("/file-trend")
method setupContactNotification (line 118) | @GetMapping("/contact")
method setupConnectionNotification (line 125) | @GetMapping("/availability")
FILE: app/src/main/java/io/xeres/app/api/controller/profile/ProfileController.java
class ProfileController (line 64) | @Tag(name = "Profile", description = "User's profiles")
method ProfileController (line 78) | public ProfileController(ProfileService profileService, IdentityServic...
method findProfileById (line 89) | @GetMapping("/{id}")
method findProfileKeyAttributes (line 98) | @GetMapping("/{id}/key-attributes")
method findContactsForProfile (line 108) | @GetMapping("/{id}/contacts")
method downloadImage (line 115) | @GetMapping(value = "/{id}/image", produces = {MediaType.IMAGE_JPEG_VA...
method findProfiles (line 129) | @GetMapping
method createProfileFromRsId (line 155) | @PostMapping
method checkProfileFromRsId (line 195) | @PostMapping("/check")
method setTrust (line 206) | @PutMapping("/{id}/trust")
method deleteProfile (line 225) | @DeleteMapping("/{id}")
FILE: app/src/main/java/io/xeres/app/api/controller/settings/SettingsController.java
class SettingsController (line 35) | @Tag(name = "Settings", description = "Persisted settings")
method SettingsController (line 42) | public SettingsController(SettingsService settingsService)
method getSettings (line 47) | @GetMapping
method updateSettings (line 54) | @PatchMapping(consumes = "application/json-patch+json")
method updateSettings (line 62) | @PutMapping
FILE: app/src/main/java/io/xeres/app/api/controller/share/ShareController.java
class ShareController (line 47) | @Tag(name = "Share", description = "File shares")
method ShareController (line 54) | public ShareController(FileService fileService)
method getShares (line 59) | @GetMapping
method createAndUpdateShares (line 68) | @PostMapping
method shareTemporarily (line 79) | @PostMapping("/temporary")
FILE: app/src/main/java/io/xeres/app/api/controller/statistics/StatisticsController.java
class StatisticsController (line 38) | @Tag(name = "Statistics", description = "Statistics service")
method StatisticsController (line 47) | public StatisticsController(TurtleRsService turtleRsService, RttRsServ...
method getTurtleStatistics (line 54) | @GetMapping("/turtle")
method getRttStatistics (line 61) | @GetMapping("/rtt")
method getDataCounterStatistics (line 68) | @GetMapping("/data-counter")
FILE: app/src/main/java/io/xeres/app/api/controller/statistics/StatisticsMapper.java
class StatisticsMapper (line 25) | final class StatisticsMapper
method StatisticsMapper (line 27) | private StatisticsMapper()
method toDTO (line 32) | public static TurtleStatisticsResponse toDTO(TurtleStatistics turtleSt...
FILE: app/src/main/java/io/xeres/app/api/controller/voip/VoipMessageController.java
class VoipMessageController (line 36) | @Controller
method VoipMessageController (line 42) | public VoipMessageController(VoipRsService voipRsService)
method processPrivateVoipMessageFromProducer (line 47) | @MessageMapping(VOIP_PRIVATE_DESTINATION)
FILE: app/src/main/java/io/xeres/app/api/converter/BufferedImageConverter.java
class BufferedImageConverter (line 10) | @Component
method createBufferedImageHttpMessageConverter (line 13) | @Bean
FILE: app/src/main/java/io/xeres/app/api/exception/InternalServerErrorException.java
class InternalServerErrorException (line 24) | public class InternalServerErrorException extends RuntimeException
method InternalServerErrorException (line 29) | public InternalServerErrorException(String message)
FILE: app/src/main/java/io/xeres/app/api/exception/UnprocessableEntityException.java
class UnprocessableEntityException (line 24) | public class UnprocessableEntityException extends RuntimeException
method UnprocessableEntityException (line 29) | public UnprocessableEntityException(String message)
FILE: app/src/main/java/io/xeres/app/application/SingleInstanceRun.java
class SingleInstanceRun (line 38) | public final class SingleInstanceRun
method SingleInstanceRun (line 48) | private SingleInstanceRun()
method enforceSingleInstance (line 60) | public static boolean enforceSingleInstance(String dataDir)
class ShutdownHook (line 89) | private static class ShutdownHook implements Runnable
method run (line 91) | @Override
FILE: app/src/main/java/io/xeres/app/application/Startup.java
class Startup (line 53) | @Component
method Startup (line 79) | public Startup(LocationService locationService, SettingsService settin...
method run (line 98) | @Override
method onApplicationEvent (line 135) | @EventListener
method onSettingsChangedEvent (line 148) | @EventListener
method onApplicationEvent (line 154) | @EventListener // We don't use @PreDestroy because netty uses other be...
method backupUserData (line 169) | private void backupUserData()
method checkRequirements (line 177) | private static void checkRequirements()
method compareSettingsAndApplyActions (line 185) | private void compareSettingsAndApplyActions(Settings oldSettings, Sett...
method applyAutoStart (line 191) | private void applyAutoStart(Settings oldSettings, Settings newSettings)
method syncAutoStart (line 206) | private void syncAutoStart()
FILE: app/src/main/java/io/xeres/app/application/autostart/AutoStart.java
class AutoStart (line 24) | @Component
method AutoStart (line 29) | public AutoStart(AutoStarter autoStarter)
method isSupported (line 34) | public boolean isSupported()
method isEnabled (line 39) | public boolean isEnabled()
method enable (line 48) | public void enable()
method disable (line 56) | public void disable()
FILE: app/src/main/java/io/xeres/app/application/autostart/AutoStarter.java
type AutoStarter (line 22) | public interface AutoStarter
method isSupported (line 31) | boolean isSupported();
method isEnabled (line 38) | boolean isEnabled();
method enable (line 43) | void enable();
method disable (line 48) | void disable();
FILE: app/src/main/java/io/xeres/app/application/autostart/autostarter/AutoStarterGeneric.java
class AutoStarterGeneric (line 24) | public class AutoStarterGeneric implements AutoStarter
method isSupported (line 26) | @Override
method isEnabled (line 32) | @Override
method enable (line 38) | @Override
method disable (line 44) | @Override
FILE: app/src/main/java/io/xeres/app/application/autostart/autostarter/AutoStarterWindows.java
class AutoStarterWindows (line 41) | public class AutoStarterWindows implements AutoStarter
method isSupported (line 50) | @Override
method isEnabled (line 56) | @Override
method enable (line 62) | @Override
method disable (line 68) | @Override
method getApplicationPath (line 79) | private String getApplicationPath()
FILE: app/src/main/java/io/xeres/app/application/environment/Cloud.java
class Cloud (line 31) | public final class Cloud
method Cloud (line 33) | private Cloud()
method isRunningOnCloud (line 43) | private static boolean isRunningOnCloud()
method checkIfRunningOnCloud (line 55) | public static void checkIfRunningOnCloud()
FILE: app/src/main/java/io/xeres/app/application/environment/CommandArgument.java
class CommandArgument (line 37) | public final class CommandArgument
method CommandArgument (line 39) | private CommandArgument()
method parse (line 65) | public static void parse(String[] args)
method setBoolean (line 110) | private static void setBoolean(StartupProperties.Property property, Ap...
method setBooleanInverted (line 119) | private static void setBooleanInverted(StartupProperties.Property prop...
method setString (line 128) | private static void setString(StartupProperties.Property property, App...
method setPort (line 140) | private static void setPort(StartupProperties.Property property, Appli...
method getValue (line 152) | private static String getValue(ApplicationArguments appArgs, String arg)
method showHelp (line 166) | private static void showHelp()
method showVersion (line 193) | private static void showVersion()
method portableOutput (line 215) | private static void portableOutput(String s)
FILE: app/src/main/java/io/xeres/app/application/environment/DefaultProperties.java
class DefaultProperties (line 32) | public final class DefaultProperties
method DefaultProperties (line 34) | private DefaultProperties()
method setDefaults (line 39) | public static void setDefaults()
FILE: app/src/main/java/io/xeres/app/application/environment/HostVariable.java
class HostVariable (line 33) | public final class HostVariable
method HostVariable (line 67) | private HostVariable()
method parse (line 75) | public static void parse()
method get (line 89) | private static Optional<String> get(String key)
method setString (line 94) | private static void setString(String name, Property property, String v...
method setBoolean (line 106) | private static void setBoolean(String name, Property property, String ...
method setPort (line 118) | private static void setPort(String name, Property property, String value)
FILE: app/src/main/java/io/xeres/app/application/environment/LocalPortFinder.java
class LocalPortFinder (line 31) | public final class LocalPortFinder
method LocalPortFinder (line 38) | private LocalPortFinder()
method ensureFreePort (line 43) | public static void ensureFreePort()
FILE: app/src/main/java/io/xeres/app/configuration/AsynchronousEventsConfiguration.java
class AsynchronousEventsConfiguration (line 40) | @Configuration
method simpleApplicationEventMulticaster (line 43) | @Bean(name = "applicationEventMulticaster")
method isSynchronousEvent (line 78) | private static boolean isSynchronousEvent(ApplicationEvent event)
FILE: app/src/main/java/io/xeres/app/configuration/AutoStartConfiguration.java
class AutoStartConfiguration (line 35) | @Configuration
method windowsAutoStarter (line 38) | @Bean
method genericAutoStarter (line 45) | @Bean
FILE: app/src/main/java/io/xeres/app/configuration/CacheDirConfiguration.java
class CacheDirConfiguration (line 40) | @Configuration
method CacheDirConfiguration (line 49) | public CacheDirConfiguration(Environment environment)
method getCacheDir (line 54) | public String getCacheDir()
method getCacheDirFromPortableFileLocation (line 98) | private static String getCacheDirFromPortableFileLocation()
FILE: app/src/main/java/io/xeres/app/configuration/CustomCsrfChannelInterceptor.java
class CustomCsrfChannelInterceptor (line 28) | @Component("csrfChannelInterceptor")
FILE: app/src/main/java/io/xeres/app/configuration/DataDirConfiguration.java
class DataDirConfiguration (line 42) | @Configuration
method DataDirConfiguration (line 51) | public DataDirConfiguration(Environment environment)
method getDataDir (line 61) | @Bean
method getDataDirFromArgs (line 114) | private static String getDataDirFromArgs()
method getDataDirFromPortableFileLocation (line 119) | private static String getDataDirFromPortableFileLocation()
FILE: app/src/main/java/io/xeres/app/configuration/DataSourceConfiguration.java
class DataSourceConfiguration (line 45) | @Configuration
method DataSourceConfiguration (line 60) | public DataSourceConfiguration(DatabaseProperties databaseProperties, ...
method getDataSource (line 67) | @Bean
method upgradeIfNeeded (line 104) | private static void upgradeIfNeeded(String url)
FILE: app/src/main/java/io/xeres/app/configuration/EnumMappingConfiguration.java
class EnumMappingConfiguration (line 31) | @Configuration
method addFormatters (line 34) | @Override
FILE: app/src/main/java/io/xeres/app/configuration/GeoIpConfiguration.java
class GeoIpConfiguration (line 34) | @Configuration
method getDatabaseReader (line 39) | @Bean
FILE: app/src/main/java/io/xeres/app/configuration/IdleTimeConfiguration.java
class IdleTimeConfiguration (line 39) | @Configuration
method windowsIdleTime (line 42) | @Bean
method linuxIdleTime (line 49) | @Bean
method macIdleTime (line 56) | @Bean
method genericIdleTime (line 63) | @Bean
FILE: app/src/main/java/io/xeres/app/configuration/SchedulerConfiguration.java
class SchedulerConfiguration (line 29) | @Configuration
FILE: app/src/main/java/io/xeres/app/configuration/SelfCertificateConfiguration.java
class SelfCertificateConfiguration (line 56) | @Configuration
method SelfCertificateConfiguration (line 66) | public SelfCertificateConfiguration(ServerProperties serverProperties,...
method createKeystoreIfNeeded (line 81) | private void createKeystoreIfNeeded()
method getKeystoreFile (line 96) | private File getKeystoreFile()
method parseCertificateKeystoreFilePath (line 102) | private String parseCertificateKeystoreFilePath(String path)
method createKeystoreWithSelfSignedCertificate (line 107) | private KeyStore createKeystoreWithSelfSignedCertificate()
method selfSign (line 125) | private Certificate selfSign(KeyPair keyPair, @SuppressWarnings("SameP...
method keyPassword (line 150) | private String keyPassword()
method saveKeystore (line 156) | private void saveKeystore(File keystoreFile, KeyStore keystore)
method customize (line 169) | @Override
FILE: app/src/main/java/io/xeres/app/configuration/WebConfiguration.java
class WebConfiguration (line 32) | @Configuration
FILE: app/src/main/java/io/xeres/app/configuration/WebSecurityConfiguration.java
class WebSecurityConfiguration (line 39) | @Configuration
method securityFilterChain (line 43) | @Bean
method userDetailsService (line 79) | @Bean
FILE: app/src/main/java/io/xeres/app/configuration/WebServerConfiguration.java
class WebServerConfiguration (line 35) | @Configuration
method WebServerConfiguration (line 40) | public WebServerConfiguration(SettingsService settingsService)
method customize (line 45) | @Override
method getAllInterfaces (line 63) | private static InetAddress getAllInterfaces()
FILE: app/src/main/java/io/xeres/app/configuration/WebSocketConfiguration.java
class WebSocketConfiguration (line 32) | @Configuration
method createServletServerContainerFactoryBean (line 37) | @Bean
method registerWebSocketHandlers (line 46) | @Override
FILE: app/src/main/java/io/xeres/app/configuration/WebSocketLoggingConfiguration.java
class WebSocketLoggingConfiguration (line 26) | @Configuration
method WebSocketLoggingConfiguration (line 31) | public WebSocketLoggingConfiguration(WebSocketMessageBrokerStats webSo...
method init (line 36) | @PostConstruct
FILE: app/src/main/java/io/xeres/app/configuration/WebSocketMessageBrokerConfiguration.java
class WebSocketMessageBrokerConfiguration (line 43) | @Configuration
method registerStompEndpoints (line 49) | @Override
method configureMessageBroker (line 56) | @Override
method handleSessionSubscribeEvent (line 63) | @EventListener
method handleSessionUnsubscribeEvent (line 69) | @EventListener
method handleSessionDisconnectEvent (line 75) | @EventListener
method configureWebSocketTransport (line 81) | @Override
FILE: app/src/main/java/io/xeres/app/configuration/WebSocketSecurityConfiguration.java
class WebSocketSecurityConfiguration (line 34) | @Configuration
method messageAuthorizationManager (line 38) | @Bean
FILE: app/src/main/java/io/xeres/app/crypto/aead/AEAD.java
class AEAD (line 42) | public final class AEAD
method AEAD (line 49) | private AEAD()
method generateKey (line 59) | public static SecretKey generateKey()
method encryptChaCha20Poly1305 (line 82) | public static byte[] encryptChaCha20Poly1305(SecretKey key, byte[] non...
method decryptChaCha20Poly1305 (line 112) | public static byte[] decryptChaCha20Poly1305(SecretKey key, byte[] non...
method doChaCha20Poly1305 (line 133) | private static byte[] doChaCha20Poly1305(SecretKey key, int operation,...
method encryptChaCha20Sha256 (line 153) | public static byte[] encryptChaCha20Sha256(SecretKey key, byte[] nonce...
method decryptChaCha20Sha256 (line 190) | public static byte[] decryptChaCha20Sha256(SecretKey key, byte[] nonce...
method doChaCha20 (line 226) | private static byte[] doChaCha20(SecretKey key, int operation, byte[] ...
method doSha256Hash (line 235) | private static byte[] doSha256Hash(SecretKey key, byte[] encryptedData...
FILE: app/src/main/java/io/xeres/app/crypto/aes/AES.java
class AES (line 37) | public final class AES
method AES (line 46) | private AES()
method encrypt (line 59) | public static byte[] encrypt(byte[] key, byte[] iv, byte[] plainText)
method decrypt (line 72) | public static byte[] decrypt(byte[] key, byte[] iv, byte[] encryptedText)
method process (line 77) | private static byte[] process(int opMode, byte[] key, byte[] iv, byte[...
method EVP_BytesToKey (line 122) | @SuppressWarnings("SameParameterValue")
FILE: app/src/main/java/io/xeres/app/crypto/dh/DiffieHellman.java
class DiffieHellman (line 31) | public final class DiffieHellman
method DiffieHellman (line 39) | private DiffieHellman()
method generateKeys (line 44) | public static KeyPair generateKeys()
method getPublicKey (line 61) | public static PublicKey getPublicKey(BigInteger pubKeyBigInteger)
method generateCommonSecretKey (line 76) | public static byte[] generateCommonSecretKey(PrivateKey privateKey, Pu...
FILE: app/src/main/java/io/xeres/app/crypto/ec/Ed25519.java
class Ed25519 (line 26) | public final class Ed25519
method Ed25519 (line 30) | private Ed25519()
method generateKeys (line 35) | public static KeyPair generateKeys(int size)
FILE: app/src/main/java/io/xeres/app/crypto/hash/AbstractMessageDigest.java
class AbstractMessageDigest (line 26) | public abstract class AbstractMessageDigest
method AbstractMessageDigest (line 31) | protected AbstractMessageDigest(String algorithm)
method update (line 43) | public void update(byte[] input)
method update (line 49) | public void update(byte[] input, int offset, int length)
method update (line 55) | public void update(ByteBuffer input)
method getBytes (line 61) | public byte[] getBytes()
method completeIfNeeded (line 67) | private void completeIfNeeded()
method resetCompletion (line 75) | private void resetCompletion()
FILE: app/src/main/java/io/xeres/app/crypto/hash/chat/ChatChallenge.java
class ChatChallenge (line 28) | public final class ChatChallenge
method ChatChallenge (line 30) | private ChatChallenge()
method code (line 35) | public static long code(Identifier identifier, long chatRoomId, long m...
FILE: app/src/main/java/io/xeres/app/crypto/hash/sha1/Sha1MessageDigest.java
class Sha1MessageDigest (line 25) | public class Sha1MessageDigest extends AbstractMessageDigest
method Sha1MessageDigest (line 27) | public Sha1MessageDigest()
method getSum (line 32) | public Sha1Sum getSum()
FILE: app/src/main/java/io/xeres/app/crypto/hash/sha256/Sha256MessageDigest.java
class Sha256MessageDigest (line 24) | public class Sha256MessageDigest extends AbstractMessageDigest
method Sha256MessageDigest (line 26) | public Sha256MessageDigest()
FILE: app/src/main/java/io/xeres/app/crypto/hmac/AbstractHMac.java
class AbstractHMac (line 29) | public abstract class AbstractHMac
method AbstractHMac (line 34) | protected AbstractHMac(SecretKey secretKey, String algorithm)
method update (line 47) | public void update(byte[] input)
method update (line 53) | public void update(byte[] input, int offset, int length)
method update (line 59) | public void update(ByteBuffer input)
method getBytes (line 65) | public byte[] getBytes()
method completeIfNeeded (line 71) | private void completeIfNeeded()
method resetCompletion (line 79) | private void resetCompletion()
FILE: app/src/main/java/io/xeres/app/crypto/hmac/sha1/Sha1HMac.java
class Sha1HMac (line 26) | public class Sha1HMac extends AbstractHMac
method Sha1HMac (line 28) | public Sha1HMac(SecretKey secretKey)
FILE: app/src/main/java/io/xeres/app/crypto/hmac/sha256/Sha256HMac.java
class Sha256HMac (line 26) | public class Sha256HMac extends AbstractHMac
method Sha256HMac (line 28) | public Sha256HMac(SecretKey secretKey)
FILE: app/src/main/java/io/xeres/app/crypto/pgp/PGP.java
class PGP (line 57) | public final class PGP
method PGP (line 59) | private PGP()
type Armor (line 64) | public enum Armor
method getPublicKeyArmored (line 77) | public static void getPublicKeyArmored(PGPPublicKey pgpPublicKey, Outp...
method getPublicKeyArmored (line 89) | public static void getPublicKeyArmored(byte[] data, OutputStream out) ...
method getPGPSecretKey (line 119) | public static PGPSecretKey getPGPSecretKey(byte[] data)
method getPGPPublicKey (line 153) | public static PGPPublicKey getPGPPublicKey(byte[] data) throws Invalid...
method generateSecretKey (line 194) | public static PGPSecretKey generateSecretKey(String id, String suffix,...
method encryptKeyPair (line 212) | public static PGPSecretKey encryptKeyPair(PGPKeyPair pgpKeyPair, Strin...
method certifiedPublicKey (line 221) | private static PGPPublicKey certifiedPublicKey(PGPKeyPair keyPair, Str...
method sign (line 244) | public static void sign(PGPSecretKey pgpSecretKey, InputStream in, Out...
method verify (line 283) | public static void verify(PGPPublicKey pgpPublicKey, byte[] signature,...
method getIssuer (line 296) | public static long getIssuer(byte[] signature)
method getUpdateSigningKey (line 316) | public static PGPPublicKey getUpdateSigningKey() throws IOException, P...
method getSignature (line 350) | private static PGPSignature getSignature(byte[] signature) throws Sign...
method getPGPIdentifierFromFingerprint (line 393) | public static long getPGPIdentifierFromFingerprint(byte[] fingerprint)
FILE: app/src/main/java/io/xeres/app/crypto/pgp/PGPSigner.java
class PGPSigner (line 36) | public class PGPSigner implements ContentSigner
method PGPSigner (line 41) | public PGPSigner(PGPSecretKey pgpSecretKey)
method getAlgorithmIdentifier (line 47) | @Override
method getOutputStream (line 53) | @Override
method getSignature (line 59) | @Override
FILE: app/src/main/java/io/xeres/app/crypto/rsa/RSA.java
class RSA (line 46) | public final class RSA
method RSA (line 51) | private RSA()
method generateKeys (line 62) | public static KeyPair generateKeys(int size)
method getPublicKey (line 86) | public static PublicKey getPublicKey(byte[] data) throws NoSuchAlgorit...
method getPrivateKey (line 100) | public static PrivateKey getPrivateKey(byte[] data) throws NoSuchAlgor...
method sign (line 113) | public static byte[] sign(PrivateKey privateKey, byte[] data)
method verify (line 138) | public static boolean verify(PublicKey publicKey, byte[] signature, by...
method getPrivateKeyAsPkcs1 (line 163) | public static byte[] getPrivateKeyAsPkcs1(PrivateKey privateKey) throw...
method getPrivateKeyFromPkcs1 (line 181) | public static PrivateKey getPrivateKeyFromPkcs1(byte[] data) throws IO...
method getPublicKeyAsPkcs1 (line 200) | public static byte[] getPublicKeyAsPkcs1(PublicKey publicKey) throws I...
method getPublicKeyFromPkcs1 (line 217) | public static PublicKey getPublicKeyFromPkcs1(byte[] data) throws IOEx...
method getGxsId (line 232) | public static GxsId getGxsId(PublicKey publicKey)
method makeGxsId (line 242) | private static GxsId makeGxsId(byte[] modulus, byte[] exponent)
method getGxsIdInsecure (line 260) | @RsDeprecated
method makeGxsIdInsecure (line 268) | private static GxsId makeGxsIdInsecure(byte[] modulus)
FILE: app/src/main/java/io/xeres/app/crypto/rscrypto/RsCrypto.java
class RsCrypto (line 33) | public final class RsCrypto
type EncryptionFormat (line 35) | public enum EncryptionFormat
method EncryptionFormat (line 42) | EncryptionFormat(int value)
method getValue (line 47) | public int getValue()
method RsCrypto (line 58) | private RsCrypto()
method encryptAuthenticateData (line 63) | public static byte[] encryptAuthenticateData(SecretKey key, byte[] pla...
method decryptAuthenticateData (line 113) | public static byte[] decryptAuthenticateData(SecretKey key, byte[] cip...
FILE: app/src/main/java/io/xeres/app/crypto/rsid/RSCertificate.java
class RSCertificate (line 47) | class RSCertificate extends RSId
method RSCertificate (line 76) | RSCertificate()
method parseInternal (line 80) | @SuppressWarnings("DuplicatedCode")
method checkRequiredFields (line 166) | @Override
method addPortToDnsName (line 185) | private void addPortToDnsName()
method setPgpPublicKey (line 201) | void setPgpPublicKey(byte[] data) throws CertificateParsingException
method setVerifiedPgpPublicKey (line 219) | void setVerifiedPgpPublicKey(byte[] data)
method setPgpPublicKey (line 231) | void setPgpPublicKey(PGPPublicKey pgpPublicKey)
method setInternalIp (line 237) | private void setInternalIp(byte[] data)
method setInternalIp (line 242) | void setInternalIp(String ipAndPort)
method setExternalIp (line 247) | private void setExternalIp(byte[] data)
method setExternalIp (line 252) | void setExternalIp(String ipAndPort)
method setLocationName (line 257) | private void setLocationName(byte[] name) throws CertificateParsingExc...
method setLocationIdentifier (line 266) | void setLocationIdentifier(LocationIdentifier locationIdentifier)
method setHiddenNodeAddress (line 271) | private void setHiddenNodeAddress(byte[] hiddenNodeAddress)
method setHiddenNodeAddress (line 283) | private void setHiddenNodeAddress(String hiddenNodeAddress)
method getInternalIp (line 288) | @Override
method getExternalIp (line 298) | @Override
method getPgpFingerprint (line 308) | @Override
method getPgpPublicKey (line 314) | @Override
method getName (line 320) | @Override
method setName (line 326) | void setName(byte[] name)
method getLocationIdentifier (line 331) | @Override
method getDnsName (line 337) | @Override
method setDnsName (line 347) | private void setDnsName(byte[] dnsName)
method setDnsName (line 352) | void setDnsName(String dnsName)
method getHiddenNodeAddress (line 357) | @Override
method addLocator (line 367) | void addLocator(String locator)
method getLocators (line 377) | @Override
method getArmored (line 383) | @Override
method getPgpPublicKeyData (line 412) | private static byte[] getPgpPublicKeyData(PGPPublicKey pgpPublicKey)
FILE: app/src/main/java/io/xeres/app/crypto/rsid/RSId.java
class RSId (line 48) | public abstract class RSId
method parse (line 67) | public static Optional<RSId> parse(String data, Type type)
method parseInternal (line 111) | abstract void parseInternal(String data) throws CertificateParsingExce...
method checkRequiredFields (line 113) | abstract void checkRequiredFields();
method getInternalIp (line 120) | public abstract Optional<PeerAddress> getInternalIp();
method getExternalIp (line 127) | public abstract Optional<PeerAddress> getExternalIp();
method getPgpFingerprint (line 134) | public abstract ProfileFingerprint getPgpFingerprint();
method getPgpPublicKey (line 141) | public abstract Optional<PGPPublicKey> getPgpPublicKey();
method getName (line 148) | public abstract String getName();
method getLocationIdentifier (line 155) | public abstract LocationIdentifier getLocationIdentifier();
method getDnsName (line 162) | public abstract Optional<PeerAddress> getDnsName();
method getHiddenNodeAddress (line 169) | public abstract Optional<PeerAddress> getHiddenNodeAddress();
method getLocators (line 176) | public abstract Set<PeerAddress> getLocators();
method getArmored (line 184) | public abstract String getArmored();
method getPgpIdentifier (line 191) | public Long getPgpIdentifier()
method cleanupInput (line 200) | protected static byte[] cleanupInput(byte[] data)
method getPacketSize (line 220) | protected static int getPacketSize(InputStream in) throws IOException
method checkRequiredFieldsAndThrow (line 240) | private void checkRequiredFieldsAndThrow() throws CertificateParsingEx...
FILE: app/src/main/java/io/xeres/app/crypto/rsid/RSIdArmor.java
class RSIdArmor (line 30) | final class RSIdArmor
type WrapMode (line 34) | enum WrapMode
method RSIdArmor (line 40) | private RSIdArmor()
method addPacket (line 45) | static void addPacket(int pTag, byte[] data, ByteArrayOutputStream out)
method addCrcPacket (line 75) | static void addCrcPacket(int pTag, ByteArrayOutputStream out)
method wrapWithBase64 (line 90) | static String wrapWithBase64(byte[] data, WrapMode wrapMode)
FILE: app/src/main/java/io/xeres/app/crypto/rsid/RSIdBuilder.java
class RSIdBuilder (line 32) | public class RSIdBuilder
method RSIdBuilder (line 44) | public RSIdBuilder(Type type)
method setName (line 49) | public RSIdBuilder setName(byte[] name)
method setLocationIdentifier (line 55) | public RSIdBuilder setLocationIdentifier(LocationIdentifier locationId...
method setProfile (line 61) | public RSIdBuilder setProfile(Profile profile)
method setPgpFingerprint (line 67) | public RSIdBuilder setPgpFingerprint(byte[] pgpFingerprint)
method addLocator (line 73) | public RSIdBuilder addLocator(Connection connection)
method build (line 94) | public RSId build()
FILE: app/src/main/java/io/xeres/app/crypto/rsid/RSIdCrc.java
class RSIdCrc (line 22) | final class RSIdCrc
method RSIdCrc (line 24) | private RSIdCrc()
method calculate24bitsCrc (line 29) | static int calculate24bitsCrc(byte[] data, int length)
FILE: app/src/main/java/io/xeres/app/crypto/rsid/RSSerialVersion.java
type RSSerialVersion (line 24) | public enum RSSerialVersion
method RSSerialVersion (line 33) | RSSerialVersion(String versionString, String description)
method serialNumber (line 39) | public BigInteger serialNumber()
method versionString (line 44) | public String versionString()
method toString (line 49) | @Override
method getFromSerialNumber (line 55) | public static RSSerialVersion getFromSerialNumber(BigInteger serialNum...
FILE: app/src/main/java/io/xeres/app/crypto/rsid/ShortInvite.java
class ShortInvite (line 40) | class ShortInvite extends RSId
method ShortInvite (line 64) | ShortInvite()
method parseInternal (line 68) | @SuppressWarnings("DuplicatedCode")
method checkRequiredFields (line 129) | @Override
method setExt4Locator (line 146) | void setExt4Locator(byte[] data)
method setExt4Locator (line 151) | void setExt4Locator(String ipAndPort)
method setLoc4Locator (line 156) | void setLoc4Locator(byte[] data)
method setLoc4Locator (line 161) | void setLoc4Locator(String ipAndPort)
method getInternalIp (line 166) | @Override
method getExternalIp (line 176) | @Override
method setPgpFingerprint (line 186) | void setPgpFingerprint(byte[] pgpFingerprint)
method getPgpFingerprint (line 191) | @Override
method getPgpPublicKey (line 197) | @Override
method getName (line 203) | @Override
method setName (line 209) | void setName(byte[] name)
method getLocationIdentifier (line 214) | @Override
method setLocationIdentifier (line 220) | void setLocationIdentifier(LocationIdentifier locationIdentifier)
method getDnsName (line 225) | @Override
method setDnsName (line 231) | void setDnsName(String dnsName)
method setDnsName (line 236) | private void setDnsName(byte[] portAndDns)
method getHiddenNodeAddress (line 248) | @Override
method setHiddenNodeAddress (line 258) | private void setHiddenNodeAddress(String hiddenNodeAddress)
method setHiddenNodeAddress (line 263) | private void setHiddenNodeAddress(byte[] hiddenNodeAddress)
method addLocator (line 276) | void addLocator(String locator)
method getLocators (line 286) | @Override
method getArmored (line 292) | @Override
method swapBytes (line 328) | static byte[] swapBytes(byte[] data)
method swapDnsBytes (line 345) | private static byte[] swapDnsBytes(byte[] data)
FILE: app/src/main/java/io/xeres/app/crypto/x509/X509.java
class X509 (line 45) | public final class X509
method X509 (line 49) | private X509()
method generateCertificate (line 68) | public static X509Certificate generateCertificate(PGPSecretKey pgpSecr...
method getCertificate (line 92) | public static X509Certificate getCertificate(byte[] data) throws Certi...
method getLocationIdentifier (line 103) | public static LocationIdentifier getLocationIdentifier(X509Certificate...
FILE: app/src/main/java/io/xeres/app/database/DatabaseSession.java
class DatabaseSession (line 32) | public class DatabaseSession implements AutoCloseable
method DatabaseSession (line 37) | public DatabaseSession(DatabaseSessionManager databaseSessionManager)
method close (line 43) | @Override
FILE: app/src/main/java/io/xeres/app/database/DatabaseSessionManager.java
class DatabaseSessionManager (line 33) | @Component
method bindSession (line 39) | public boolean bindSession()
method unbindSession (line 50) | public void unbindSession()
FILE: app/src/main/java/io/xeres/app/database/converter/AvailabilityConverter.java
class AvailabilityConverter (line 25) | @Converter(autoApply = true)
method getEnumClass (line 28) | @Override
FILE: app/src/main/java/io/xeres/app/database/converter/EnumConverter.java
class EnumConverter (line 30) | @SuppressWarnings("ConverterNotAnnotatedInspection")
method getEnumClass (line 33) | abstract Class<E> getEnumClass();
method convertToDatabaseColumn (line 35) | @Override
method convertToEntityAttribute (line 45) | @Override
FILE: app/src/main/java/io/xeres/app/database/converter/EnumSetConverter.java
class EnumSetConverter (line 33) | @SuppressWarnings("ConverterNotAnnotatedInspection")
method getEnumClass (line 36) | abstract Class<E> getEnumClass();
method convertToDatabaseColumn (line 38) | @Override
method convertToEntityAttribute (line 53) | @Override
FILE: app/src/main/java/io/xeres/app/database/converter/FileTypeConverter.java
class FileTypeConverter (line 25) | @Converter(autoApply = true)
method getEnumClass (line 28) | @Override
FILE: app/src/main/java/io/xeres/app/database/converter/GxsCircleTypeConverter.java
class GxsCircleTypeConverter (line 25) | @Converter(autoApply = true)
method getEnumClass (line 28) | @Override
FILE: app/src/main/java/io/xeres/app/database/converter/GxsPrivacyFlagsConverter.java
class GxsPrivacyFlagsConverter (line 25) | @Converter(autoApply = true)
method getEnumClass (line 28) | @Override
FILE: app/src/main/java/io/xeres/app/database/converter/GxsSignatureFlagsConverter.java
class GxsSignatureFlagsConverter (line 25) | @Converter(autoApply = true)
method getEnumClass (line 28) | @Override
FILE: app/src/main/java/io/xeres/app/database/converter/IdentityTypeConverter.java
class IdentityTypeConverter (line 25) | @Converter(autoApply = true)
method getEnumClass (line 28) | @Override
FILE: app/src/main/java/io/xeres/app/database/converter/NetModeConverter.java
class NetModeConverter (line 25) | @Converter(autoApply = true)
method getEnumClass (line 28) | @Override
FILE: app/src/main/java/io/xeres/app/database/converter/PeerAddressTypeConverter.java
class PeerAddressTypeConverter (line 25) | @Converter(autoApply = true)
method getEnumClass (line 28) | @Override
FILE: app/src/main/java/io/xeres/app/database/converter/SecurityKeyFlagsConverter.java
class SecurityKeyFlagsConverter (line 25) | @Converter(autoApply = true)
method getEnumClass (line 28) | @Override
FILE: app/src/main/java/io/xeres/app/database/converter/SignatureTypeConverter.java
class SignatureTypeConverter (line 25) | @Converter(autoApply = true)
method getEnumClass (line 28) | @Override
FILE: app/src/main/java/io/xeres/app/database/converter/TrustConverter.java
class TrustConverter (line 25) | @Converter(autoApply = true)
method getEnumClass (line 28) | @Override
FILE: app/src/main/java/io/xeres/app/database/converter/VoteTypeConverter.java
class VoteTypeConverter (line 25) | @Converter(autoApply = true)
method getEnumClass (line 28) | @Override
FILE: app/src/main/java/io/xeres/app/database/model/board/BoardMapper.java
class BoardMapper (line 37) | public final class BoardMapper
method BoardMapper (line 39) | private BoardMapper()
method toDTO (line 44) | public static BoardGroupDTO toDTO(BoardGroupItem item)
method toDTOs (line 64) | public static List<BoardGroupDTO> toDTOs(List<BoardGroupItem> items)
method toDTO (line 71) | public static BoardMessageDTO toDTO(UnHtmlService unHtmlService, Board...
method toBoardMessageDTOs (line 97) | public static List<BoardMessageDTO> toBoardMessageDTOs(UnHtmlService u...
FILE: app/src/main/java/io/xeres/app/database/model/channel/ChannelMapper.java
class ChannelMapper (line 39) | public final class ChannelMapper
method ChannelMapper (line 41) | private ChannelMapper()
method toDTO (line 46) | public static ChannelGroupDTO toDTO(ChannelGroupItem item)
method toDTOs (line 66) | public static List<ChannelGroupDTO> toDTOs(List<ChannelGroupItem> items)
method toDTO (line 73) | public static ChannelMessageDTO toDTO(ChannelMessageItem item, String ...
method toSummaryMessageDTOs (line 100) | public static List<ChannelMessageDTO> toSummaryMessageDTOs(Page<Channe...
method toDTO (line 111) | public static ChannelMessageDTO toDTO(UnHtmlService unHtmlService, Cha...
method toChannelFileDTOs (line 138) | private static List<ChannelFileDTO> toChannelFileDTOs(List<FileItem> f...
method toChannelFileDTO (line 145) | private static ChannelFileDTO toChannelFileDTO(FileItem item)
method toChannelMessageDTOs (line 160) | public static List<ChannelMessageDTO> toChannelMessageDTOs(UnHtmlServi...
method toFileItems (line 173) | public static List<FileItem> toFileItems(List<ChannelFileDTO> dtos)
method toFileItem (line 180) | public static FileItem toFileItem(ChannelFileDTO dto)
FILE: app/src/main/java/io/xeres/app/database/model/chat/ChatBacklog.java
class ChatBacklog (line 28) | @Entity
method ChatBacklog (line 46) | protected ChatBacklog()
method ChatBacklog (line 51) | public ChatBacklog(Location location, boolean own, String message)
method getId (line 58) | public long getId()
method setId (line 63) | public void setId(long id)
method getLocation (line 68) | public Location getLocation()
method setLocation (line 73) | public void setLocation(Location location)
method getCreated (line 78) | public Instant getCreated()
method setCreated (line 83) | public void setCreated(Instant created)
method isOwn (line 88) | public boolean isOwn()
method setOwn (line 93) | public void setOwn(boolean own)
method getMessage (line 98) | public String getMessage()
method setMessage (line 103) | public void setMessage(String message)
FILE: app/src/main/java/io/xeres/app/database/model/chat/ChatMapper.java
class ChatMapper (line 30) | public final class ChatMapper
method ChatMapper (line 32) | private ChatMapper()
method toDTO (line 37) | public static ChatRoomContextDTO toDTO(ChatRoomContext chatRoomContext)
method toDTOs (line 49) | public static List<ChatRoomDTO> toDTOs(List<ChatRoomInfo> chatRoomInfo...
method toDTO (line 56) | public static ChatRoomDTO toDTO(ChatRoomInfo chatRoomInfo)
method toChatRoomBacklogDTOs (line 68) | public static List<ChatRoomBacklogDTO> toChatRoomBacklogDTOs(List<Chat...
method toDTO (line 75) | public static ChatRoomBacklogDTO toDTO(ChatRoomBacklog chatRoomBackLog)
method toChatBacklogDTOs (line 85) | public static List<ChatBacklogDTO> toChatBacklogDTOs(List<ChatBacklog>...
method toDTO (line 92) | public static ChatBacklogDTO toDTO(ChatBacklog chatBacklog)
method fromDistantChatBacklogToChatBacklogDTOs (line 101) | public static List<ChatBacklogDTO> fromDistantChatBacklogToChatBacklog...
method toDTO (line 108) | public static ChatBacklogDTO toDTO(DistantChatBacklog distantChatBacklog)
FILE: app/src/main/java/io/xeres/app/database/model/chat/ChatRoom.java
class ChatRoom (line 31) | @Entity
method ChatRoom (line 56) | protected ChatRoom()
method ChatRoom (line 61) | protected ChatRoom(long roomId, IdentityGroupItem identityGroupItem, S...
method createChatRoom (line 70) | public static ChatRoom createChatRoom(io.xeres.app.xrs.service.chat.Ch...
method getId (line 79) | public long getId()
method setId (line 84) | public void setId(long id)
method getRoomId (line 89) | public long getRoomId()
method setRoomId (line 94) | public void setRoomId(long roomId)
method getGxsIdGroupItem (line 99) | public IdentityGroupItem getGxsIdGroupItem()
method setGxsIdGroupItem (line 104) | public void setGxsIdGroupItem(IdentityGroupItem identityGroupItem)
method getName (line 109) | public String getName()
method setName (line 114) | public void setName(String name)
method getTopic (line 119) | public String getTopic()
method setTopic (line 124) | public void setTopic(String topic)
method getFlags (line 129) | public Set<RoomFlags> getFlags()
method setFlags (line 134) | public void setFlags(Set<RoomFlags> flags)
method isSubscribed (line 139) | public boolean isSubscribed()
method setSubscribed (line 144) | public void setSubscribed(boolean subscribed)
method isJoined (line 149) | public boolean isJoined()
method setJoined (line 154) | public void setJoined(boolean joined)
method getLocations (line 159) | public Set<Location> getLocations()
method addLocation (line 164) | public void addLocation(Location location)
method removeLocation (line 169) | public void removeLocation(Location location)
method clearLocations (line 174) | public void clearLocations()
FILE: app/src/main/java/io/xeres/app/database/model/chat/ChatRoomBacklog.java
class ChatRoomBacklog (line 28) | @Entity
method ChatRoomBacklog (line 50) | protected ChatRoomBacklog()
method ChatRoomBacklog (line 55) | public ChatRoomBacklog(ChatRoom room, GxsId gxsId, String nickname, St...
method ChatRoomBacklog (line 63) | public ChatRoomBacklog(ChatRoom room, String nickname, String message)
method getId (line 70) | public long getId()
method setId (line 75) | public void setId(long id)
method getRoom (line 80) | public ChatRoom getRoom()
method setRoom (line 85) | public void setRoom(ChatRoom room)
method getCreated (line 90) | public Instant getCreated()
method setCreated (line 95) | public void setCreated(Instant timestamp)
method getGxsId (line 100) | public GxsId getGxsId()
method setGxsId (line 105) | public void setGxsId(GxsId gxsId)
method getNickname (line 110) | public String getNickname()
method setNickname (line 115) | public void setNickname(String nickname)
method getMessage (line 120) | public String getMessage()
method setMessage (line 125) | public void setMessage(String message)
FILE: app/src/main/java/io/xeres/app/database/model/chat/DistantChatBacklog.java
class DistantChatBacklog (line 28) | @Entity
method DistantChatBacklog (line 46) | protected DistantChatBacklog()
method DistantChatBacklog (line 51) | public DistantChatBacklog(IdentityGroupItem identityGroupItem, boolean...
method getId (line 58) | public long getId()
method setId (line 63) | public void setId(long id)
method getIdentityGroupItem (line 68) | public IdentityGroupItem getIdentityGroupItem()
method setIdentityGroupItem (line 73) | public void setIdentityGroupItem(IdentityGroupItem identityGroupItem)
method getCreated (line 78) | public Instant getCreated()
method setCreated (line 83) | public void setCreated(Instant created)
method isOwn (line 88) | public boolean isOwn()
method setOwn (line 93) | public void setOwn(boolean own)
method getMessage (line 98) | public String getMessage()
method setMessage (line 103) | public void setMessage(String message)
FILE: app/src/main/java/io/xeres/app/database/model/connection/Connection.java
class Connection (line 34) | @Entity
method Connection (line 53) | protected Connection()
method from (line 57) | public static Connection from(PeerAddress peerAddress)
method Connection (line 62) | private Connection(PeerAddress peerAddress)
method getId (line 69) | long getId()
method setId (line 74) | void setId(long id)
method getLocation (line 79) | public Location getLocation()
method setLocation (line 84) | public void setLocation(Location location)
method getType (line 89) | public PeerAddress.Type getType()
method setType (line 94) | public void setType(PeerAddress.Type type)
method getAddress (line 99) | public String getAddress()
method setAddress (line 104) | public void setAddress(String address)
method getLastConnected (line 109) | public Instant getLastConnected()
method setLastConnected (line 114) | public void setLastConnected(Instant lastConnected)
method isExternal (line 119) | public boolean isExternal()
method setExternal (line 124) | public void setExternal(boolean external)
method isLan (line 129) | @JsonIgnore
method getPort (line 135) | public int getPort()
method getIp (line 145) | public String getIp()
method getHostname (line 155) | public String getHostname()
method equals (line 165) | @Override
method hashCode (line 180) | @Override
method toString (line 186) | @Override
FILE: app/src/main/java/io/xeres/app/database/model/connection/ConnectionMapper.java
class ConnectionMapper (line 24) | @SuppressWarnings("DuplicatedCode")
method ConnectionMapper (line 27) | private ConnectionMapper()
method toDTO (line 32) | public static ConnectionDTO toDTO(Connection connection)
method fromDTO (line 46) | public static Connection fromDTO(ConnectionDTO dto)
FILE: app/src/main/java/io/xeres/app/database/model/file/File.java
class File (line 36) | @Entity
method createDirectory (line 73) | public static File createDirectory(File parent, String name, Instant m...
method createFile (line 83) | public static File createFile(File parent, String name, long size, Ins...
method createFile (line 94) | public static File createFile(Path path)
method getCanonicalPath (line 108) | private static Path getCanonicalPath(Path path)
method createFile (line 121) | private static File createFile(String name, File parent)
method getId (line 133) | public long getId()
method setId (line 138) | public void setId(long id)
method hasParent (line 143) | public boolean hasParent()
method getParent (line 148) | public File getParent()
method setParent (line 153) | public void setParent(File parent)
method getChildren (line 159) | public Set<File> getChildren()
method setChildren (line 164) | public void setChildren(Set<File> children)
method getName (line 169) | public @NotNull @Size(min = NAME_SIZE_MIN, max = NAME_SIZE_MAX) String...
method setName (line 174) | public void setName(@NotNull @Size(min = NAME_SIZE_MIN, max = NAME_SIZ...
method getSize (line 179) | public long getSize()
method setSize (line 184) | public void setSize(long size)
method getType (line 189) | public FileType getType()
method setType (line 194) | public void setType(FileType type)
method getHash (line 199) | public Sha1Sum getHash()
method setHash (line 204) | public void setHash(Sha1Sum hash)
method getEncryptedHash (line 209) | public Sha1Sum getEncryptedHash()
method setEncryptedHash (line 214) | public void setEncryptedHash(Sha1Sum encryptedHash)
method getModified (line 219) | public Instant getModified()
method setModified (line 224) | public void setModified(Instant modified)
method toString (line 229) | @Override
FILE: app/src/main/java/io/xeres/app/database/model/file/FileDownload.java
class FileDownload (line 30) | @Entity
method getId (line 58) | public long getId()
method setId (line 63) | public void setId(long id)
method getName (line 68) | public @NotNull @Size(min = NAME_SIZE_MIN, max = NAME_SIZE_MAX) String...
method setName (line 73) | public void setName(@NotNull @Size(min = NAME_SIZE_MIN, max = NAME_SIZ...
method getSize (line 78) | public long getSize()
method setSize (line 83) | public void setSize(long size)
method getHash (line 88) | public Sha1Sum getHash()
method setHash (line 93) | public void setHash(Sha1Sum hash)
method getChunkMap (line 98) | public BitSet getChunkMap()
method setChunkMap (line 103) | public void setChunkMap(BitSet chunkMap)
method hasLocation (line 108) | public boolean hasLocation()
method getLocation (line 113) | public Location getLocation()
method setLocation (line 118) | public void setLocation(Location location)
method isCompleted (line 123) | public boolean isCompleted()
method setCompleted (line 128) | public void setCompleted(boolean completed)
method toString (line 133) | @Override
FILE: app/src/main/java/io/xeres/app/database/model/forum/ForumMapper.java
class ForumMapper (line 37) | public final class ForumMapper
method ForumMapper (line 39) | private ForumMapper()
method toDTO (line 44) | public static ForumGroupDTO toDTO(ForumGroupItem item)
method toDTOs (line 63) | public static List<ForumGroupDTO> toDTOs(List<ForumGroupItem> items)
method toDTO (line 70) | public static ForumMessageDTO toDTO(ForumMessageItemSummary item, Stri...
method toSummaryMessageDTOs (line 92) | public static List<ForumMessageDTO> toSummaryMessageDTOs(Page<ForumMes...
method toDTO (line 103) | public static ForumMessageDTO toDTO(UnHtmlService unHtmlService, Forum...
method toForumMessageDTOs (line 125) | public static List<ForumMessageDTO> toForumMessageDTOs(UnHtmlService u...
FILE: app/src/main/java/io/xeres/app/database/model/forum/ForumMessageItemSummary.java
type ForumMessageItemSummary (line 32) | public interface ForumMessageItemSummary
method getId (line 34) | long getId();
method getGxsId (line 36) | GxsId getGxsId();
method getMsgId (line 38) | MsgId getMsgId();
method getOriginalMsgId (line 40) | MsgId getOriginalMsgId();
method getParentMsgId (line 42) | MsgId getParentMsgId();
method getAuthorGxsId (line 44) | GxsId getAuthorGxsId();
method getName (line 46) | String getName();
method getPublished (line 48) | Instant getPublished();
method isRead (line 50) | boolean isRead();
FILE: app/src/main/java/io/xeres/app/database/model/gxs/GxsCircleType.java
type GxsCircleType (line 22) | public enum GxsCircleType
FILE: app/src/main/java/io/xeres/app/database/model/gxs/GxsClientUpdate.java
class GxsClientUpdate (line 31) | @Entity
method GxsClientUpdate (line 51) | public GxsClientUpdate()
method GxsClientUpdate (line 56) | public GxsClientUpdate(Location location, int serviceType, Instant las...
method GxsClientUpdate (line 63) | public GxsClientUpdate(Location location, int serviceType, GxsId gxsId...
method getId (line 70) | public long getId()
method setId (line 75) | public void setId(long id)
method getLocation (line 80) | public Location getLocation()
method setLocation (line 85) | public void setLocation(Location location)
method getServiceType (line 90) | public int getServiceType()
method setServiceType (line 95) | public void setServiceType(int serviceType)
method getLastSynced (line 100) | public Instant getLastSynced()
method setLastSynced (line 105) | public void setLastSynced(Instant lastSynced)
method getMessageUpdate (line 110) | public Instant getMessageUpdate(GxsId gxsId)
method putMessageUpdate (line 115) | public void putMessageUpdate(GxsId gxsId, Instant lastSynced)
method removeMessageUpdate (line 120) | public void removeMessageUpdate(GxsId gxsId)
method toString (line 125) | @Override
FILE: app/src/main/java/io/xeres/app/database/model/gxs/GxsConstants.java
class GxsConstants (line 22) | final class GxsConstants
method GxsConstants (line 26) | private GxsConstants()
FILE: app/src/main/java/io/xeres/app/database/model/gxs/GxsGroupItem.java
class GxsGroupItem (line 54) | @Entity(name = "gxs_group")
method retainValues (line 160) | public void retainValues(GxsGroupItem oldGroup)
method getServiceType (line 173) | @Override
method setServiceType (line 179) | @Override
method getId (line 185) | public long getId()
method setId (line 190) | public void setId(long id)
method getGxsId (line 195) | public GxsId getGxsId()
method setGxsId (line 200) | public void setGxsId(GxsId gxsId)
method getName (line 205) | public @NotNull String getName()
method setName (line 210) | public void setName(@NotNull String name)
method getDiffusionFlags (line 215) | public Set<GxsPrivacyFlags> getDiffusionFlags()
method setDiffusionFlags (line 220) | public void setDiffusionFlags(Set<GxsPrivacyFlags> diffusionFlags)
method getSignatureFlags (line 225) | public Set<GxsSignatureFlags> getSignatureFlags()
method setSignatureFlags (line 230) | public void setSignatureFlags(Set<GxsSignatureFlags> signatureFlags)
method getPublished (line 235) | public Instant getPublished()
method updatePublished (line 240) | public void updatePublished()
method getAuthorGxsId (line 245) | public GxsId getAuthorGxsId()
method setAuthorGxsId (line 250) | public void setAuthorGxsId(GxsId authorGxsId)
method getCircleGxsId (line 255) | public GxsId getCircleGxsId()
method setCircleGxsId (line 260) | public void setCircleGxsId(GxsId circleGxsId)
method getCircleType (line 265) | public GxsCircleType getCircleType()
method setCircleType (line 270) | public void setCircleType(GxsCircleType circleType)
method getAuthenticationFlags (line 275) | public int getAuthenticationFlags()
method setAuthenticationFlags (line 280) | public void setAuthenticationFlags(int authenticationFlags)
method getParentGxsId (line 285) | public GxsId getParentGxsId()
method setParentGxsId (line 290) | public void setParentGxsId(GxsId parentGxsId)
method isSubscribed (line 295) | public boolean isSubscribed()
method setSubscribed (line 300) | public void setSubscribed(boolean subscribed)
method getPopularity (line 305) | public int getPopularity()
method setPopularity (line 310) | public void setPopularity(int popularity)
method getVisibleMessageCount (line 315) | public int getVisibleMessageCount()
method setVisibleMessageCount (line 320) | public void setVisibleMessageCount(int visibleMessageCount)
method getLastUpdated (line 325) | public Instant getLastUpdated()
method setLastUpdated (line 330) | public void setLastUpdated(Instant lastUpdated)
method getLastActivity (line 335) | public Instant getLastActivity()
method setLastActivity (line 340) | public void setLastActivity(Instant lastActivity)
method getLastStatistics (line 345) | public Instant getLastStatistics()
method setLastStatistics (line 350) | public void setLastStatistics(Instant lastStatistics)
method getOriginator (line 355) | public LocationIdentifier getOriginator()
method setOriginator (line 360) | public void setOriginator(LocationIdentifier originator)
method getInternalCircleGxsId (line 365) | public GxsId getInternalCircleGxsId()
method setInternalCircleGxsId (line 370) | public void setInternalCircleGxsId(GxsId internalCircleGxsId)
method isExternal (line 380) | public boolean isExternal()
method getAdminPrivateKey (line 386) | public PrivateKey getAdminPrivateKey()
method setAdminKeys (line 402) | public void setAdminKeys(PrivateKey privateKey, PublicKey publicKey, I...
method getAdminPublicKey (line 425) | public PublicKey getAdminPublicKey()
method isAdminKey (line 446) | private static boolean isAdminKey(SecurityKey securityKey)
method getPublishPrivateKey (line 451) | public PrivateKey getPublishPrivateKey()
method setPublishKeys (line 472) | public void setPublishKeys(GxsId keyId, PrivateKey privateKey, PublicK...
method getPublishPublicKey (line 494) | public PublicKey getPublishPublicKey()
method isPublishKey (line 515) | private static boolean isPublishKey(SecurityKey securityKey)
method isValidKey (line 520) | private boolean isValidKey(SecurityKey securityKey)
method getAdminSignature (line 530) | public byte[] getAdminSignature()
method setAdminSignature (line 538) | public void setAdminSignature(byte[] adminSignature)
method getAuthorSignature (line 548) | public byte[] getAuthorSignature()
method setAuthorSignature (line 556) | public void setAuthorSignature(byte[] authorSignature)
method writeMetaObject (line 566) | @Override
method readMetaObject (line 593) | @Override
method deserializeSecurityKeySet (line 625) | private void deserializeSecurityKeySet(ByteBuf buf)
method deserializeSignatures (line 640) | private void deserializeSignatures(ByteBuf buf)
method clone (line 656) | @Override
method equals (line 662) | @Override
method hashCode (line 677) | @Override
method toString (line 683) | @Override
FILE: app/src/main/java/io/xeres/app/database/model/gxs/GxsMessageItem.java
class GxsMessageItem (line 43) | @Entity(name = "gxs_message")
method getServiceType (line 90) | @Override
method setServiceType (line 96) | @Override
method getId (line 102) | public long getId()
method setId (line 107) | public void setId(long id)
method getGxsId (line 112) | public GxsId getGxsId()
method setGxsId (line 117) | public void setGxsId(GxsId gxsId)
method getMsgId (line 122) | public MsgId getMsgId()
method setMsgId (line 127) | public void setMsgId(MsgId msgId)
method getOriginalMsgId (line 132) | public MsgId getOriginalMsgId()
method setOriginalMsgId (line 137) | public void setOriginalMsgId(MsgId originalMsgId)
method getParentMsgId (line 142) | public MsgId getParentMsgId()
method setParentMsgId (line 147) | public void setParentMsgId(MsgId parentMsgId)
method isChild (line 152) | public boolean isChild()
method getAuthorGxsId (line 157) | public GxsId getAuthorGxsId()
method setAuthorGxsId (line 162) | public void setAuthorGxsId(GxsId authorGxsId)
method hasAuthor (line 167) | public boolean hasAuthor()
method getName (line 172) | public String getName()
method setName (line 177) | public void setName(String name)
method getPublished (line 182) | public Instant getPublished()
method updatePublished (line 187) | public void updatePublished()
method isHidden (line 192) | public boolean isHidden()
method setHidden (line 197) | public void setHidden(boolean hidden)
method getPublishSignature (line 202) | public byte[] getPublishSignature()
method setPublishSignature (line 209) | public void setPublishSignature(byte[] publishSignature)
method getAuthorSignature (line 218) | public byte[] getAuthorSignature()
method setAuthorSignature (line 225) | public void setAuthorSignature(byte[] authorSignature)
method writeMetaObject (line 235) | @Override
method readMetaObject (line 258) | @Override
method deserializeSignature (line 288) | private void deserializeSignature(ByteBuf buf)
method clone (line 304) | @Override
method toString (line 310) | @Override
FILE: app/src/main/java/io/xeres/app/database/model/gxs/GxsMetaAndData.java
type GxsMetaAndData (line 27) | public interface GxsMetaAndData
method writeDataObject (line 29) | int writeDataObject(ByteBuf buf, Set<SerializationFlags> serialization...
method readDataObject (line 31) | void readDataObject(ByteBuf buf);
method writeMetaObject (line 33) | int writeMetaObject(ByteBuf buf, Set<SerializationFlags> serialization...
method readMetaObject (line 35) | void readMetaObject(ByteBuf buf);
FILE: app/src/main/java/io/xeres/app/database/model/gxs/GxsPrivacyFlags.java
type GxsPrivacyFlags (line 22) | public enum GxsPrivacyFlags
FILE: app/src/main/java/io/xeres/app/database/model/gxs/GxsServiceSetting.java
class GxsServiceSetting (line 27) | @Entity
method GxsServiceSetting (line 35) | public GxsServiceSetting()
method GxsServiceSetting (line 40) | public GxsServiceSetting(int id, Instant lastUpdated)
method getId (line 46) | public int getId()
method setId (line 51) | public void setId(int id)
method getLastUpdated (line 56) | public Instant getLastUpdated()
method setLastUpdated (line 61) | public void setLastUpdated(Instant lastUpdated)
method toString (line 66) | @Override
FILE: app/src/main/java/io/xeres/app/database/model/gxs/GxsSignatureFlags.java
type GxsSignatureFlags (line 22) | public enum GxsSignatureFlags
FILE: app/src/main/java/io/xeres/app/database/model/identity/IdentityMapper.java
class IdentityMapper (line 29) | public final class IdentityMapper
method IdentityMapper (line 31) | private IdentityMapper()
method toDTO (line 36) | public static IdentityDTO toDTO(IdentityGroupItem identityGroupItem)
method toDTOs (line 53) | public static List<IdentityDTO> toDTOs(List<IdentityGroupItem> identit...
FILE: app/src/main/java/io/xeres/app/database/model/location/Location.java
class Location (line 51) | @Entity
method Location (line 90) | protected Location()
method Location (line 95) | protected Location(String name)
method Location (line 100) | protected Location(long id, String name, Profile profile, LocationIden...
method Location (line 108) | protected Location(String name, Profile profile, LocationIdentifier lo...
method createLocation (line 115) | public static Location createLocation(RSId rsId)
method createLocation (line 120) | public static Location createLocation(String name)
method createLocation (line 125) | public static Location createLocation(String name, Profile profile, Lo...
method createLocation (line 130) | public static Location createLocation(String name, LocationIdentifier ...
method addOrUpdateLocations (line 137) | public static void addOrUpdateLocations(Profile profile, Location newL...
method Location (line 147) | public Location(RSId rsId)
method getCertificate (line 159) | @XmlAttribute
method getRsId (line 167) | public RSId getRsId(Type type)
method addConnection (line 189) | public void addConnection(Connection connection)
method getProfile (line 202) | public Profile getProfile()
method setProfile (line 207) | public void setProfile(Profile profile)
method getId (line 212) | public long getId()
method setId (line 217) | void setId(long id)
method setName (line 222) | public void setName(String name)
method getSafeName (line 227) | public String getSafeName()
method getName (line 237) | @XmlAttribute
method isConnected (line 243) | public boolean isConnected()
method setConnected (line 248) | public void setConnected(boolean connected)
method isDiscoverable (line 254) | public boolean isDiscoverable()
method setDiscoverable (line 259) | public void setDiscoverable(boolean discoverable)
method isDht (line 264) | public boolean isDht()
method setDht (line 269) | public void setDht(boolean dht)
method getVersion (line 274) | public String getVersion()
method setVersion (line 279) | public void setVersion(String version)
method getNetMode (line 284) | public NetMode getNetMode()
method setNetMode (line 289) | public void setNetMode(NetMode netMode)
method getAvailability (line 294) | public Availability getAvailability()
method setAvailability (line 299) | public void setAvailability(Availability availability)
method setLocationIdentifier (line 304) | public void setLocationIdentifier(LocationIdentifier locationIdentifier)
method getLocationIdentifier (line 309) | @XmlAttribute(name = "locationId")
method getConnections (line 316) | public List<Connection> getConnections()
method getClientUpdates (line 321) | public List<GxsClientUpdate> getClientUpdates()
method getLastConnected (line 326) | public Instant getLastConnected()
method setLastConnected (line 331) | public void setLastConnected(Instant lastConnected)
method isOwn (line 336) | public boolean isOwn()
method getBestConnection (line 349) | public Stream<Connection> getBestConnection(int index, String ipToAvoid)
method equals (line 363) | @Override
method hashCode (line 378) | @Override
method toString (line 384) | @Override
method getConnectionAsIpv4 (line 390) | private static String getConnectionAsIpv4(Connection connection)
method compareTo (line 399) | @Override
class OwnIpComparator (line 410) | static final class OwnIpComparator<T> implements Comparator<T>
method OwnIpComparator (line 414) | OwnIpComparator(String ipToAvoid)
method compare (line 419) | @Override
FILE: app/src/main/java/io/xeres/app/database/model/location/LocationMapper.java
class LocationMapper (line 28) | @SuppressWarnings("DuplicatedCode")
method LocationMapper (line 31) | private LocationMapper()
method toDTO (line 36) | public static LocationDTO toDTO(Location location)
method toDeepDTO (line 56) | public static LocationDTO toDeepDTO(Location location)
method fromDTO (line 71) | public static Location fromDTO(LocationDTO dto)
FILE: app/src/main/java/io/xeres/app/database/model/profile/Profile.java
class Profile (line 44) | @Entity
method Profile (line 74) | protected Profile()
method Profile (line 79) | protected Profile(long id, String name, long pgpIdentifier, Instant cr...
method createOwnProfile (line 85) | public static Profile createOwnProfile(String name, long pgpIdentifier...
method createProfile (line 93) | public static Profile createProfile(String name, long pgpIdentifier, I...
method createProfile (line 105) | public static Profile createProfile(String name, long pgpIdentifier, I...
method createEmptyProfile (line 110) | public static Profile createEmptyProfile(String name, long pgpIdentifi...
method Profile (line 115) | private Profile(String name, long pgpIdentifier, Instant created, Prof...
method sanitizeProfileName (line 124) | private static String sanitizeProfileName(String profileName)
method updateWith (line 138) | public Profile updateWith(Profile other)
method addLocation (line 148) | public void addLocation(Location location)
method getId (line 154) | public long getId()
method setId (line 159) | void setId(long id)
method getName (line 164) | @XmlAttribute
method setName (line 170) | void setName(String name)
method getPgpIdentifier (line 175) | @XmlAttribute
method setPgpIdentifier (line 181) | void setPgpIdentifier(long pgpIdentifier)
method getCreated (line 186) | public Instant getCreated()
method setCreated (line 191) | public void setCreated(Instant created)
method getProfileFingerprint (line 196) | public ProfileFingerprint getProfileFingerprint()
method setProfileFingerprint (line 201) | public void setProfileFingerprint(ProfileFingerprint profileFingerprint)
method getPgpPublicKeyData (line 206) | @XmlAttribute
method setPgpPublicKeyData (line 212) | public void setPgpPublicKeyData(byte[] pgpPublicKeyData)
method isAccepted (line 217) | public boolean isAccepted()
method setAccepted (line 222) | public void setAccepted(boolean accepted)
method getTrust (line 227) | @XmlAttribute
method setTrust (line 233) | public void setTrust(Trust trust)
method getLocations (line 238) | @XmlElement(name = "location")
method isOwn (line 244) | public static boolean isOwn(long id)
method isOwn (line 249) | public boolean isOwn()
method isComplete (line 254) | public boolean isComplete()
method isPartial (line 259) | public boolean isPartial()
method isConnected (line 264) | public boolean isConnected()
method getBestAvailability (line 269) | public Availability getBestAvailability()
method toString (line 279) | @Override
FILE: app/src/main/java/io/xeres/app/database/model/profile/ProfileMapper.java
class ProfileMapper (line 32) | @SuppressWarnings("DuplicatedCode")
method ProfileMapper (line 35) | private ProfileMapper()
method toDTO (line 40) | public static ProfileDTO toDTO(Profile profile)
method toDeepDTO (line 59) | public static ProfileDTO toDeepDTO(Profile profile)
method toDeepDTO (line 64) | public static ProfileDTO toDeepDTO(Profile profile, LocationIdentifier...
method toDTOs (line 94) | public static List<ProfileDTO> toDTOs(List<Profile> profiles)
method toDeepDTOs (line 101) | public static List<ProfileDTO> toDeepDTOs(List<Profile> profiles)
method fromDTO (line 108) | public static Profile fromDTO(ProfileDTO dto)
FILE: app/src/main/java/io/xeres/app/database/model/settings/Settings.java
class Settings (line 28) | @Entity
method Settings (line 71) | public Settings()
method getVersion (line 75) | public int getVersion()
method setVersion (line 80) | public void setVersion(int version)
method getPgpPrivateKeyData (line 85) | @XmlAttribute
method setPgpPrivateKeyData (line 91) | public void setPgpPrivateKeyData(byte[] keyData)
method getLocationPrivateKeyData (line 96) | @XmlAttribute
method setLocationPrivateKeyData (line 102) | public void setLocationPrivateKeyData(byte[] keyData)
method getLocationPublicKeyData (line 107) | @XmlAttribute
method setLocationPublicKeyData (line 113) | public void setLocationPublicKeyData(byte[] keyData)
method getLocationCertificate (line 118) | @XmlAttribute
method setLocationCertificate (line 124) | public void setLocationCertificate(byte[] certificate)
method hasLocationCertificate (line 129) | public boolean hasLocationCertificate()
method getTorSocksHost (line 134) | public String getTorSocksHost()
method setTorSocksHost (line 139) | public void setTorSocksHost(String torSocksHost)
method getTorSocksPort (line 144) | public int getTorSocksPort()
method setTorSocksPort (line 149) | public void setTorSocksPort(int torSocksPort)
method getI2pSocksHost (line 154) | public String getI2pSocksHost()
method setI2pSocksHost (line 159) | public void setI2pSocksHost(String i2pSocksHost)
method getI2pSocksPort (line 164) | public int getI2pSocksPort()
method setI2pSocksPort (line 169) | public void setI2pSocksPort(int i2pSocksPort)
method isUpnpEnabled (line 174) | public boolean isUpnpEnabled()
method setUpnpEnabled (line 179) | public void setUpnpEnabled(boolean enabled)
method isBroadcastDiscoveryEnabled (line 184) | public boolean isBroadcastDiscoveryEnabled()
method setBroadcastDiscoveryEnabled (line 189) | public void setBroadcastDiscoveryEnabled(boolean enabled)
method isDhtEnabled (line 194) | public boolean isDhtEnabled()
method setDhtEnabled (line 199) | public void setDhtEnabled(boolean dhtEnabled)
method getLocalPort (line 204) | @XmlAttribute
method setLocalPort (line 210) | public void setLocalPort(int localPort)
method isAutoStartEnabled (line 215) | public boolean isAutoStartEnabled()
method setAutoStartEnabled (line 220) | public void setAutoStartEnabled(boolean autoStartEnabled)
method getIncomingDirectory (line 225) | public String getIncomingDirectory()
method setIncomingDirectory (line 230) | public void setIncomingDirectory(String incomingDirectory)
method getRemotePassword (line 235) | public String getRemotePassword()
method setRemotePassword (line 240) | public void setRemotePassword(String remotePassword)
method isRemoteEnabled (line 245) | public boolean isRemoteEnabled()
method setRemoteEnabled (line 250) | public void setRemoteEnabled(boolean remoteEnabled)
method isUpnpRemoteEnabled (line 255) | public boolean isUpnpRemoteEnabled()
method setUpnpRemoteEnabled (line 260) | public void setUpnpRemoteEnabled(boolean upnpRemoteEnabled)
method getRemotePort (line 265) | public int getRemotePort()
method setRemotePort (line 270) | public void setRemotePort(int remotePort)
FILE: app/src/main/java/io/xeres/app/database/model/settings/SettingsMapper.java
class SettingsMapper (line 24) | public final class SettingsMapper
method SettingsMapper (line 26) | private SettingsMapper()
method toDTO (line 31) | public static SettingsDTO toDTO(Settings settings)
method fromDTO (line 55) | public static Settings fromDTO(SettingsDTO dto)
FILE: app/src/main/java/io/xeres/app/database/model/share/Share.java
class Share (line 33) | @Entity
method createShare (line 54) | public static Share createShare(String name, File directory, boolean s...
method Share (line 64) | protected Share()
method getId (line 68) | public long getId()
method setId (line 73) | public void setId(long id)
method getFile (line 78) | public File getFile()
method setFile (line 83) | public void setFile(File file)
method getName (line 88) | public String getName()
method setName (line 93) | public void setName(String name)
method isSearchable (line 98) | public boolean isSearchable()
method setSearchable (line 103) | public void setSearchable(boolean searchable)
method getBrowsable (line 108) | public Trust getBrowsable()
method setBrowsable (line 113) | public void setBrowsable(Trust browsable)
method getLastScanned (line 118) | public Instant getLastScanned()
method setLastScanned (line 123) | public void setLastScanned(Instant lastScanned)
method toString (line 128) | @Override
FILE: app/src/main/java/io/xeres/app/database/model/share/ShareMapper.java
class ShareMapper (line 31) | public final class ShareMapper
method ShareMapper (line 33) | private ShareMapper()
method toDTO (line 38) | public static ShareDTO toDTO(Share share, String path)
method toDTOs (line 55) | public static List<ShareDTO> toDTOs(List<Share> shares, Map<Long, Stri...
method fromDTO (line 62) | public static Share fromDTO(ShareDTO shareDTO)
method fromDTOs (line 79) | public static List<Share> fromDTOs(List<ShareDTO> shares)
FILE: app/src/main/java/io/xeres/app/database/repository/ChatBacklogRepository.java
type ChatBacklogRepository (line 31) | @Transactional(readOnly = true)
method findAllByLocationAndCreatedAfterOrderByCreatedDesc (line 34) | List<ChatBacklog> findAllByLocationAndCreatedAfterOrderByCreatedDesc(L...
method deleteAllByCreatedBefore (line 36) | @Transactional
method deleteAllByLocation (line 39) | @Transactional
FILE: app/src/main/java/io/xeres/app/database/repository/ChatRoomBacklogRepository.java
type ChatRoomBacklogRepository (line 31) | @Transactional(readOnly = true)
method findAllByRoomAndCreatedAfterOrderByCreatedDesc (line 34) | List<ChatRoomBacklog> findAllByRoomAndCreatedAfterOrderByCreatedDesc(C...
method deleteAllByCreatedBefore (line 36) | @Transactional
method deleteAllByRoom (line 39) | @Transactional
FILE: app/src/main/java/io/xeres/app/database/repository/ChatRoomRepository.java
type ChatRoomRepository (line 32) | @Transactional(readOnly = true)
method findByRoomIdAndIdentityGroupItem (line 35) | Optional<ChatRoom> findByRoomIdAndIdentityGroupItem(long roomId, Ident...
method findByRoomId (line 37) | Optional<ChatRoom> findByRoomId(long roomId);
method findAllBySubscribedTrueAndJoinedFalse (line 39) | List<ChatRoom> findAllBySubscribedTrueAndJoinedFalse();
method putAllJoinedToFalse (line 41) | @Modifying
FILE: app/src/main/java/io/xeres/app/database/repository/DistantChatBacklogRepository.java
type DistantChatBacklogRepository (line 31) | @Transactional(readOnly = true)
method findAllByIdentityGroupItemAndCreatedAfterOrderByCreatedDesc (line 34) | List<DistantChatBacklog> findAllByIdentityGroupItemAndCreatedAfterOrde...
method deleteAllByCreatedBefore (line 36) | @Transactional
method deleteAllByIdentityGroupItem (line 39) | @Transactional
FILE: app/src/main/java/io/xeres/app/database/repository/FileDownloadRepository.java
type FileDownloadRepository (line 31) | @Transactional(readOnly = true)
method findByHash (line 34) | Optional<FileDownload> findByHash(Sha1Sum hash);
method findAllByLocationIsNull (line 36) | List<FileDownload> findAllByLocationIsNull();
method findAllByLocation (line 38) | List<FileDownload> findAllByLocation(Location location);
method deleteAllByCompletedTrue (line 40) | @Transactional
FILE: app/src/main/java/io/xeres/app/database/repository/FileRepository.java
type FileRepository (line 30) | @Transactional(readOnly = true)
method findAllByName (line 33) | List<File> findAllByName(String name);
method findAllByNameContainingIgnoreCase (line 35) | List<File> findAllByNameContainingIgnoreCase(String name);
method findByNameAndParent (line 37) | Optional<File> findByNameAndParent(String name, File parent);
method findByNameAndParentName (line 39) | Optional<File> findByNameAndParentName(String name, String parentName);
method countByParent (line 41) | int countByParent(File parent);
method findByHash (line 43) | List<File> findByHash(Sha1Sum hash);
method findByEncryptedHash (line 45) | List<File> findByEncryptedHash(Sha1Sum encryptedHash);
FILE: app/src/main/java/io/xeres/app/database/repository/GxsBoardGroupRepository.java
type GxsBoardGroupRepository (line 31) | @Transactional(readOnly = true)
method findByGxsId (line 34) | Optional<BoardGroupItem> findByGxsId(GxsId gxsId);
method findAllByGxsIdIn (line 36) | List<BoardGroupItem> findAllByGxsIdIn(Set<GxsId> gxsIds);
method findAllBySubscribedIsTrue (line 38) | List<BoardGroupItem> findAllBySubscribedIsTrue();
FILE: app/src/main/java/io/xeres/app/database/repository/GxsBoardMessageRepository.java
type GxsBoardMessageRepository (line 37) | @Transactional(readOnly = true)
method findByGxsIdAndMsgId (line 40) | Optional<BoardMessageItem> findByGxsIdAndMsgId(GxsId gxsId, MsgId msgId);
method findAllByGxsIdAndHiddenFalse (line 42) | Page<BoardMessageItem> findAllByGxsIdAndHiddenFalse(GxsId gxsId, Pagea...
method findAllByGxsIdAndPublishedAfterAndHiddenFalse (line 44) | List<BoardMessageItem> findAllByGxsIdAndPublishedAfterAndHiddenFalse(G...
method findAllByGxsIdAndMsgIdIn (line 46) | List<BoardMessageItem> findAllByGxsIdAndMsgIdIn(GxsId gxsId, Set<MsgId...
method findAllByGxsIdAndMsgIdInAndHiddenFalse (line 48) | List<BoardMessageItem> findAllByGxsIdAndMsgIdInAndHiddenFalse(GxsId gx...
method findAllByMsgIdInAndHiddenFalse (line 50) | List<BoardMessageItem> findAllByMsgIdInAndHiddenFalse(Set<MsgId> msgIds);
method countUnreadMessages (line 52) | @Query("SELECT COUNT(m.id) FROM board_message m WHERE m.gxsId = :gxsId...
method setAllGroupMessagesReadState (line 55) | @Modifying
FILE: app/src/main/java/io/xeres/app/database/repository/GxsChannelGroupRepository.java
type GxsChannelGroupRepository (line 31) | @Transactional(readOnly = true)
method findByGxsId (line 34) | Optional<ChannelGroupItem> findByGxsId(GxsId gxsId);
method findAllByGxsIdIn (line 36) | List<ChannelGroupItem> findAllByGxsIdIn(Set<GxsId> gxsIds);
method findAllBySubscribedIsTrue (line 38) | List<ChannelGroupItem> findAllBySubscribedIsTrue();
FILE: app/src/main/java/io/xeres/app/database/repository/GxsChannelMessageRepository.java
type GxsChannelMessageRepository (line 37) | @Transactional(readOnly = true)
method findByGxsIdAndMsgId (line 40) | Optional<ChannelMessageItem> findByGxsIdAndMsgId(GxsId gxsId, MsgId ms...
method findAllByGxsIdAndHiddenFalse (line 42) | Page<ChannelMessageItem> findAllByGxsIdAndHiddenFalse(GxsId gxsId, Pag...
method findAllByGxsIdAndPublishedAfterAndHiddenFalse (line 44) | List<ChannelMessageItem> findAllByGxsIdAndPublishedAfterAndHiddenFalse...
method findAllByGxsIdAndMsgIdIn (line 46) | List<ChannelMessageItem> findAllByGxsIdAndMsgIdIn(GxsId gxsId, Set<Msg...
method findAllByGxsIdAndMsgIdInAndHiddenFalse (line 48) | List<ChannelMessageItem> findAllByGxsIdAndMsgIdInAndHiddenFalse(GxsId ...
method findAllByMsgIdInAndHiddenFalse (line 50) | List<ChannelMessageItem> findAllByMsgIdInAndHiddenFalse(Set<MsgId> msg...
method countUnreadMessages (line 52) | @Query("SELECT COUNT(m.id) FROM channel_message m WHERE m.gxsId = :gxs...
method setAllGroupMessagesReadState (line 55) | @Modifying
FILE: app/src/main/java/io/xeres/app/database/repository/GxsClientUpdateRepository.java
type GxsClientUpdateRepository (line 29) | @Transactional(readOnly = true)
method findByLocationAndServiceType (line 32) | Optional<GxsClientUpdate> findByLocationAndServiceType(Location locati...
FILE: app/src/main/java/io/xeres/app/database/repository/GxsCommentMessageRepository.java
type GxsCommentMessageRepository (line 31) | @Transactional(readOnly = true)
method findAllByGxsIdAndMsgIdIn (line 34) | List<CommentMessageItem> findAllByGxsIdAndMsgIdIn(GxsId gxsId, Set<Msg...
FILE: app/src/main/java/io/xeres/app/database/repository/GxsForumGroupRepository.java
type GxsForumGroupRepository (line 31) | @Transactional(readOnly = true)
method findByGxsId (line 34) | Optional<ForumGroupItem> findByGxsId(GxsId gxsId);
method findAllByGxsIdIn (line 36) | List<ForumGroupItem> findAllByGxsIdIn(Set<GxsId> gxsIds);
method findAllBySubscribedIsTrue (line 38) | List<ForumGroupItem> findAllBySubscribedIsTrue();
FILE: app/src/main/java/io/xeres/app/database/repository/GxsForumMessageRepository.java
type GxsForumMessageRepository (line 38) | @Transactional(readOnly = true)
method findByGxsIdAndMsgId (line 41) | Optional<ForumMessageItem> findByGxsIdAndMsgId(GxsId gxsId, MsgId msgId);
method findAllByGxsIdAndPublishedAfterAndHiddenFalse (line 43) | List<ForumMessageItem> findAllByGxsIdAndPublishedAfterAndHiddenFalse(G...
method findAllByGxsIdAndMsgIdIn (line 45) | List<ForumMessageItem> findAllByGxsIdAndMsgIdIn(GxsId gxsId, Set<MsgId...
method findAllByGxsIdAndMsgIdInAndHiddenFalse (line 47) | List<ForumMessageItem> findAllByGxsIdAndMsgIdInAndHiddenFalse(GxsId gx...
method findSummaryAllByGxsIdAndHiddenFalse (line 49) | Page<ForumMessageItemSummary> findSummaryAllByGxsIdAndHiddenFalse(GxsI...
method findAllByMsgIdInAndHiddenFalse (line 51) | List<ForumMessageItem> findAllByMsgIdInAndHiddenFalse(Set<MsgId> msgIds);
method findAllByMsgIdInAndHiddenTrue (line 53) | List<ForumMessageItem> findAllByMsgIdInAndHiddenTrue(Set<MsgId> msgIds);
method countUnreadMessages (line 55) | @Query("SELECT COUNT(m.id) FROM forum_message m WHERE m.gxsId = :gxsId...
method setAllGroupMessagesReadState (line 58) | @Modifying
FILE: app/src/main/java/io/xeres/app/database/repository/GxsGroupItemRepository.java
type GxsGroupItemRepository (line 31) | @Transactional(readOnly = true)
method findByGxsId (line 34) | Optional<GxsGroupItem> findByGxsId(GxsId gxsId);
method findByGxsIdAndSubscribedIsTrue (line 36) | Optional<GxsGroupItem> findByGxsIdAndSubscribedIsTrue(GxsId gxsId);
method findByOrderByLastStatistics (line 38) | List<GxsGroupItem> findByOrderByLastStatistics(Limit limit);
FILE: app/src/main/java/io/xeres/app/database/repository/GxsIdentityRepository.java
type GxsIdentityRepository (line 34) | @Transactional(readOnly = true)
method findByGxsId (line 37) | Optional<IdentityGroupItem> findByGxsId(GxsId gxsId);
method findAllByGxsIdIn (line 39) | List<IdentityGroupItem> findAllByGxsIdIn(Set<GxsId> gxsIds);
method findAllByName (line 41) | List<IdentityGroupItem> findAllByName(String name);
method findAllByType (line 43) | List<IdentityGroupItem> findAllByType(Type type);
method findAllBySubscribedIsTrue (line 45) | List<IdentityGroupItem> findAllBySubscribedIsTrue();
method findAllByNextValidationNotNullAndNextValidationBeforeOrderByNextValidationDesc (line 47) | List<IdentityGroupItem> findAllByNextValidationNotNullAndNextValidatio...
method findAllByProfileId (line 49) | List<IdentityGroupItem> findAllByProfileId(long profileId);
FILE: app/src/main/java/io/xeres/app/database/repository/GxsMessageItemRepository.java
type GxsMessageItemRepository (line 33) | @Transactional(readOnly = true)
method findByGxsIdAndMsgId (line 36) | Optional<GxsMessageItem> findByGxsIdAndMsgId(GxsId gxsId, MsgId msgId);
method countByGxsId (line 38) | int countByGxsId(GxsId gxsId);
method fixIntervalDuplicates (line 47) | @Modifying
method hideOldDuplicates (line 59) | @Modifying
FILE: app/src/main/java/io/xeres/app/database/repository/GxsServiceSettingRepository.java
type GxsServiceSettingRepository (line 26) | @Transactional(readOnly = true)
FILE: app/src/main/java/io/xeres/app/database/repository/GxsVoteMessageRepository.java
type GxsVoteMessageRepository (line 31) | @Transactional(readOnly = true)
method findAllByGxsIdAndMsgIdIn (line 34) | List<VoteMessageItem> findAllByGxsIdAndMsgIdIn(GxsId gxsId, Set<MsgId>...
FILE: app/src/main/java/io/xeres/app/database/repository/LocationRepository.java
type LocationRepository (line 34) | @Transactional(readOnly = true)
method findByLocationIdentifier (line 37) | Optional<Location> findByLocationIdentifier(LocationIdentifier locatio...
method findAllByConnectedFalse (line 39) | Slice<Location> findAllByConnectedFalse(Pageable pageable);
method findAllByConnectedFalseAndDhtTrue (line 41) | Slice<Location> findAllByConnectedFalseAndDhtTrue(Pageable pageable);
method findAllByConnectedTrue (line 43) | List<Location> findAllByConnectedTrue();
method putAllConnectedToFalse (line 45) | @Modifying
FILE: app/src/main/java/io/xeres/app/database/repository/ProfileRepository.java
type ProfileRepository (line 33) | @Transactional(readOnly = true)
method findByName (line 36) | Optional<Profile> findByName(String name);
method findAllByNameContaining (line 38) | List<Profile> findAllByNameContaining(String name);
method findByProfileFingerprint (line 40) | Optional<Profile> findByProfileFingerprint(ProfileFingerprint profileF...
method findByPgpIdentifier (line 42) | Optional<Profile> findByPgpIdentifier(long pgpIdentifier);
method findProfileByLocationIdentifier (line 44) | @Query("SELECT p FROM Profile p, IN(p.locations) l WHERE l.locationIde...
method findDiscoverableProfileByPgpIdentifier (line 47) | @Query("SELECT p FROM Profile p, IN(p.locations) l WHERE p.pgpIdentifi...
method findAllDiscoverableProfilesByPgpIdentifiers (line 50) | @Query("SELECT p FROM Profile p, IN(p.locations) l WHERE p.pgpIdentifi...
method getAllDiscoverableProfiles (line 53) | @Query("SELECT p FROM Profile p, IN(p.locations) l WHERE p.accepted = ...
method findAllCompleteByPgpIdentifiers (line 56) | @Query("SELECT p FROM Profile p WHERE p.pgpIdentifier IN (:ids) AND p....
FILE: app/src/main/java/io/xeres/app/database/repository/SettingsRepository.java
type SettingsRepository (line 29) | @Transactional(readOnly = true)
method backupDatabase (line 32) | @Modifying
FILE: app/src/main/java/io/xeres/app/database/repository/ShareRepository.java
type ShareRepository (line 30) | @Transactional(readOnly = true)
method findByName (line 33) | Optional<Share> findByName(String name);
method findShareByFileIdIn (line 35) | Optional<Share> findShareByFileIdIn(Set<Long> fileId);
method findShareByFile (line 37) | Optional<Share> findShareByFile(File file);
FILE: app/src/main/java/io/xeres/app/job/DhtFinderJob.java
class DhtFinderJob (line 45) | @Component
method DhtFinderJob (line 60) | public DhtFinderJob(LocationService locationService, PeerService peerS...
method checkDht (line 72) | @Scheduled(initialDelay = 120, fixedDelay = 15, timeUnit = TimeUnit.SE...
method findInDht (line 81) | private void findInDht()
method dhtNodeFoundEvent (line 90) | @EventListener
method getPageIndex (line 101) | private int getPageIndex()
FILE: app/src/main/java/io/xeres/app/job/FileIndexingJob.java
class FileIndexingJob (line 29) | @Component
method FileIndexingJob (line 35) | public FileIndexingJob(PeerService peerService, FileService fileService)
method checkFilesToIndex (line 41) | @Scheduled(initialDelay = 60, fixedDelay = 30, timeUnit = TimeUnit.SEC...
FILE: app/src/main/java/io/xeres/app/job/IdleDetectionJob.java
class IdleDetectionJob (line 37) | @Component
method IdleDetectionJob (line 46) | public IdleDetectionJob(StatusRsService statusRsService, PeerService p...
method checkIdle (line 53) | @Scheduled(initialDelay = 5 * 60, fixedDelay = 5, timeUnit = TimeUnit....
FILE: app/src/main/java/io/xeres/app/job/JobUtils.java
class JobUtils (line 25) | final class JobUtils
method JobUtils (line 27) | private JobUtils()
method canRun (line 32) | @SuppressWarnings("RedundantIfStatement")
FILE: app/src/main/java/io/xeres/app/job/PeerConnectionJob.java
class PeerConnectionJob (line 45) | @Component
method PeerConnectionJob (line 58) | public PeerConnectionJob(LocationService locationService, PeerTcpClien...
method checkConnections (line 67) | @Scheduled(initialDelay = 5, fixedDelay = 60, timeUnit = TimeUnit.SECO...
method canRun (line 73) | private boolean canRun()
method connectToPeers (line 79) | private void connectToPeers()
method connectImmediately (line 96) | public void connectImmediately(Location location, int connectionIndex)
method connect (line 126) | private void connect(Connection connection)
FILE: app/src/main/java/io/xeres/app/net/bdisc/BroadcastDiscoveryService.java
class BroadcastDiscoveryService (line 52) | @Service
type State (line 66) | private enum State
method BroadcastDiscoveryService (line 90) | public BroadcastDiscoveryService(DatabaseSessionManager databaseSessio...
method start (line 97) | public void start(String localIpAddress, int localPort)
method stop (line 106) | public void stop()
method isRunning (line 115) | public boolean isRunning()
method waitForTermination (line 120) | public void waitForTermination()
method getBroadcastAddress (line 125) | private static String getBroadcastAddress(String ipAddress)
method setupOwnInfo (line 158) | private void setupOwnInfo()
method updateOwnInfo (line 179) | @SuppressWarnings("EmptyMethod")
method run (line 188) | @Override
method handleSelection (line 244) | private void handleSelection(Selector selector)
method getSelectorTimeout (line 285) | private long getSelectorTimeout()
method setState (line 294) | private void setState(State newState)
method read (line 299) | private void read(SelectionKey key) throws IOException
method sendBroadcast (line 361) | private void sendBroadcast(DatagramChannel channel) throws IOException
method isValidPeer (line 371) | private boolean isValidPeer(UdpDiscoveryPeer peer)
FILE: app/src/main/java/io/xeres/app/net/bdisc/ProtocolVersion.java
type ProtocolVersion (line 22) | enum ProtocolVersion
FILE: app/src/main/java/io/xeres/app/net/bdisc/UdpDiscoveryPeer.java
class UdpDiscoveryPeer (line 27) | public class UdpDiscoveryPeer
type Status (line 29) | public enum Status
method getStatus (line 48) | public Status getStatus()
method setStatus (line 53) | public void setStatus(Status status)
method getAppId (line 58) | public int getAppId()
method setAppId (line 63) | public void setAppId(int appId)
method getPeerId (line 68) | public int getPeerId()
method setPeerId (line 73) | public void setPeerId(int peerId)
method getPacketIndex (line 78) | public long getPacketIndex()
method setPacketIndex (line 83) | public void setPacketIndex(long packetIndex)
method getIpAddress (line 88) | public String getIpAddress()
method setIpAddress (line 93) | public void setIpAddress(String ipAddress)
method getFingerprint (line 98) | public ProfileFingerprint getFingerprint()
method setFingerprint (line 103) | public void setFingerprint(ProfileFingerprint fingerprint)
method getLocationIdentifier (line 108) | public LocationIdentifier getLocationIdentifier()
method setLocationIdentifier (line 113) | public void setLocationIdentifier(LocationIdentifier locationIdentifier)
method getLocalPort (line 118) | public int getLocalPort()
method setLocalPort (line 123) | public void setLocalPort(int localPort)
method getProfileName (line 128) | public String getProfileName()
method setProfileName (line 133) | public void setProfileName(String profileName)
method getLastSeen (line 138) | public Instant getLastSeen()
method setLastSeen (line 143) | public void setLastSeen(Instant lastSeen)
method toString (line 148) | @Override
FILE: app/src/main/java/io/xeres/app/net/bdisc/UdpDiscoveryProtocol.java
class UdpDiscoveryProtocol (line 35) | public final class UdpDiscoveryProtocol
method UdpDiscoveryProtocol (line 42) | private UdpDiscoveryProtocol()
method parsePacket (line 47) | public static UdpDiscoveryPeer parsePacket(ByteBuffer buffer, InetSock...
method createPacket (line 139) | public static ByteBuffer createPacket(int maxSize, Status status, int ...
FILE: app/src/main/java/io/xeres/app/net/dht/DHTSpringLog.java
class DHTSpringLog (line 27) | public class DHTSpringLog implements DHTLogger
method log (line 33) | @Override
method log (line 46) | @Override
FILE: app/src/main/java/io/xeres/app/net/dht/DhtService.java
class DhtService (line 62) | @Service
method DhtService (line 88) | public DhtService(DataDirConfiguration dataDirConfiguration, Applicati...
method start (line 95) | public void start(LocationIdentifier locationIdentifier, int localPort)
method stop (line 134) | public void stop()
method search (line 152) | public void search(LocationIdentifier locationIdentifier)
method statusChanged (line 176) | @Override
method isPersistingID (line 204) | @Override
method getStoragePath (line 210) | @Override
method getListeningPort (line 236) | @Override
method noRouterBootstrap (line 242) | @Override
method allowMultiHoming (line 248) | @Override
method filterBindAddress (line 254) | @Override
method statsUpdated (line 260) | @Override
method received (line 284) | @Override
method isReady (line 298) | public boolean isReady()
method addBootstrappingNodes (line 303) | private void addBootstrappingNodes()
method traceDhtStats (line 334) | private static void traceDhtStats(DHTStats dhtStats)
FILE: app/src/main/java/io/xeres/app/net/dht/NodeId.java
class NodeId (line 27) | final class NodeId
method NodeId (line 31) | private NodeId()
method create (line 36) | static byte[] create(LocationIdentifier locationIdentifier)
FILE: app/src/main/java/io/xeres/app/net/external/ExternalIpResolver.java
class ExternalIpResolver (line 37) | @Service
method find (line 58) | public String find()
method findExternalIpAddressUsingDns (line 63) | private String findExternalIpAddressUsingDns()
FILE: app/src/main/java/io/xeres/app/net/peer/ConnectionType.java
type ConnectionType (line 22) | public enum ConnectionType
method ConnectionType (line 31) | ConnectionType(String description)
method getDescription (line 36) | public String getDescription()
FILE: app/src/main/java/io/xeres/app/net/peer/DefaultItemFuture.java
class DefaultItemFuture (line 29) | class DefaultItemFuture implements ItemFuture
method DefaultItemFuture (line 35) | public DefaultItemFuture(Future<Void> future, int size)
method DefaultItemFuture (line 41) | public DefaultItemFuture(Future<Void> future)
method getSize (line 47) | @Override
method isSuccess (line 53) | @Override
method isCancellable (line 59) | @Override
method cause (line 65) | @Override
method addListener (line 71) | @Override
method addListeners (line 77) | @SafeVarargs
method removeListener (line 84) | @Override
method removeListeners (line 90) | @SafeVarargs
method sync (line 97) | @Override
method syncUninterruptibly (line 103) | @Override
method await (line 109) | @Override
method awaitUninterruptibly (line 115) | @Override
method await (line 121) | @Override
method await (line 127) | @Override
method awaitUninterruptibly (line 133) | @Override
method awaitUninterruptibly (line 139) | @Override
method getNow (line 145) | @Override
method cancel (line 151) | @Override
method isCancelled (line 157) | @Override
method isDone (line 163) | @Override
method get (line 169) | @Override
method get (line 175) | @Override
FILE: app/src/main/java/io/xeres/app/net/peer/ItemFuture.java
type ItemFuture (line 24) | public interface ItemFuture extends Future<Void>
method getSize (line 31) | int getSize();
FILE: app/src/main/java/io/xeres/app/net/peer/PeerAttribute.java
class PeerAttribute (line 24) | public final class PeerAttribute
method PeerAttribute (line 29) | private PeerAttribute()
FILE: app/src/main/java/io/xeres/app/net/peer/PeerConnection.java
class PeerConnection (line 33) | public class PeerConnection
method PeerConnection (line 55) | public PeerConnection(Location location, ChannelHandlerContext ctx)
method getCtx (line 61) | public ChannelHandlerContext getCtx()
method getLocation (line 66) | public Location getLocation()
method updateLocation (line 71) | public void updateLocation(Location location)
method addService (line 79) | public void addService(RsService service)
method isServiceSupported (line 84) | public boolean isServiceSupported(RsService rsService)
method isServiceSupported (line 89) | public boolean isServiceSupported(int serviceId)
method canSendServices (line 95) | public boolean canSendServices()
method putPeerData (line 106) | public void putPeerData(int key, Object data)
method getPeerData (line 117) | public Optional<Object> getPeerData(int key)
method removePeerData (line 127) | public void removePeerData(int key)
method putServiceData (line 139) | public void putServiceData(RsService service, int key, Object data)
method getServiceData (line 151) | public Optional<Object> getServiceData(RsService service, int key)
method removeServiceData (line 167) | public void removeServiceData(RsService service, int key)
method scheduleAtFixedRate (line 176) | public void scheduleAtFixedRate(NoSuppressedRunnable command, long ini...
method scheduleWithFixedDelay (line 182) | public void scheduleWithFixedDelay(NoSuppressedRunnable command, long ...
method schedule (line 195) | public void schedule(NoSuppressedRunnable command, long delay, TimeUni...
method shutdown (line 201) | public void shutdown()
method cleanup (line 206) | public void cleanup()
method incrementSentCounter (line 211) | public void incrementSentCounter(long value)
method incrementReceivedCounter (line 216) | public void incrementReceivedCounter(long value)
method getSentCounter (line 221) | public long getSentCounter()
method getReceivedCounter (line 226) | public long getReceivedCounter()
method getMaximumBandwidth (line 231) | public long getMaximumBandwidth()
method toString (line 236) | @Override
FILE: app/src/main/java/io/xeres/app/net/peer/PeerConnectionManager.java
class PeerConnectionManager (line 50) | @Component
method PeerConnectionManager (line 61) | PeerConnectionManager(StatusNotificationService statusNotificationServ...
method addPeer (line 75) | public PeerConnection addPeer(Location location, ChannelHandlerContext...
method removePeer (line 94) | public void removePeer(Location location)
method getPeerByLocation (line 111) | public PeerConnection getPeerByLocation(long id)
method getRandomPeer (line 121) | public synchronized PeerConnection getRandomPeer()
method shutdown (line 129) | public void shutdown()
method writeItem (line 143) | public ItemFuture writeItem(Location location, Item item, RsService rs...
method writeItem (line 161) | public ItemFuture writeItem(PeerConnection peerConnection, Item item, ...
method doForAllPeers (line 177) | public void doForAllPeers(Consumer<PeerConnection> action, RsService r...
method doForAllPeersExceptSender (line 195) | public void doForAllPeersExceptSender(Consumer<PeerConnection> action,...
method isServiceSupported (line 203) | public boolean isServiceSupported(Location location, int serviceId)
method writeSliceProbe (line 218) | public static void writeSliceProbe(ChannelHandlerContext ctx)
method getNumberOfPeers (line 230) | public int getNumberOfPeers()
method setOutgoingAndWriteItem (line 235) | private static ItemFuture setOutgoingAndWriteItem(PeerConnection peerC...
method writeItem (line 241) | private static ItemFuture writeItem(PeerConnection peerConnection, Ite...
method updateCurrentUsersCount (line 251) | private void updateCurrentUsersCount()
FILE: app/src/main/java/io/xeres/app/net/peer/bootstrap/PeerClient.java
class PeerClient (line 46) | abstract class PeerClient
method getPeerInitializer (line 64) | public abstract PeerInitializer getPeerInitializer();
method getAddressResolverGroup (line 66) | public abstract AddressResolverGroup<? extends SocketAddress> getAddre...
method PeerClient (line 68) | protected PeerClient(SettingsService settingsService, NetworkPropertie...
method start (line 81) | public void start()
method setAddressResolver (line 93) | private void setAddressResolver()
method stop (line 102) | public void stop()
method connect (line 129) | public void connect(PeerAddress peerAddress)
FILE: app/src/main/java/io/xeres/app/net/peer/bootstrap/PeerI2pClient.java
class PeerI2pClient (line 38) | @Component
method PeerI2pClient (line 41) | public PeerI2pClient(SettingsService settingsService, NetworkPropertie...
method getPeerInitializer (line 46) | @Override
method getAddressResolverGroup (line 52) | @Override
FILE: app/src/main/java/io/xeres/app/net/peer/bootstrap/PeerInitializer.java
class PeerInitializer (line 52) | public class PeerInitializer extends ChannelInitializer<SocketChannel>
method PeerInitializer (line 73) | public PeerInitializer(PeerConnectionManager peerConnectionManager, Da...
method initChannel (line 95) | @Override
FILE: app/src/main/java/io/xeres/app/net/peer/bootstrap/PeerServer.java
class PeerServer (line 49) | abstract class PeerServer
method PeerServer (line 68) | protected PeerServer(SettingsService settingsService, NetworkPropertie...
method start (line 81) | public void start(String host, int localPort)
method stop (line 107) | public void stop()
FILE: app/src/main/java/io/xeres/app/net/peer/bootstrap/PeerTcpClient.java
class PeerTcpClient (line 38) | @Component
method PeerTcpClient (line 41) | public PeerTcpClient(SettingsService settingsService, NetworkPropertie...
method getPeerInitializer (line 46) | @Override
method getAddressResolverGroup (line 52) | @Override
FILE: app/src/main/java/io/xeres/app/net/peer/bootstrap/PeerTcpServer.java
class PeerTcpServer (line 33) | @Component
method PeerTcpServer (line 36) | public PeerTcpServer(SettingsService settingsService, NetworkPropertie...
FILE: app/src/main/java/io/xeres/app/net/peer/bootstrap/PeerTorClient.java
class PeerTorClient (line 39) | @Component
method PeerTorClient (line 42) | public PeerTorClient(SettingsService settingsService, NetworkPropertie...
method getPeerInitializer (line 47) | @Override
method getAddressResolverGroup (line 53) | @Override
FILE: app/src/main/java/io/xeres/app/net/peer/packet/MultiPacket.java
class MultiPacket (line 30) | public class MultiPacket extends Packet
method isNewPacket (line 54) | protected static boolean isNewPacket(ByteBuf in) throws ProtocolException
method MultiPacket (line 68) | protected MultiPacket(ByteBuf in)
method setStart (line 73) | public void setStart()
method isStart (line 78) | public boolean isStart()
method setEnd (line 83) | public void setEnd()
method isEnd (line 88) | public boolean isEnd()
method isMiddle (line 93) | public boolean isMiddle()
method isSlice (line 98) | public boolean isSlice()
method setId (line 103) | public void setId(int id)
method getId (line 108) | public int getId()
method getSize (line 113) | @Override
method getItemBuffer (line 119) | @Override
method getFlags (line 125) | private int getFlags()
method addFlags (line 130) | private void addFlags(int newFlags)
method removeFlags (line 137) | private void removeFlags(int newFlags)
method isComplete (line 144) | @Override
FILE: app/src/main/java/io/xeres/app/net/peer/packet/Packet.java
class Packet (line 28) | public abstract class Packet implements Comparable<Packet>
method fromItem (line 58) | public static Packet fromItem(RawItem rawItem)
method fromBuffer (line 71) | public static Packet fromBuffer(ByteBuf in) throws ProtocolException
method Packet (line 76) | protected Packet()
method isMulti (line 80) | public boolean isMulti()
method isComplete (line 85) | public abstract boolean isComplete();
method getSize (line 87) | public abstract int getSize();
method getItemBuffer (line 89) | public abstract ByteBuf getItemBuffer();
method setBuffer (line 91) | void setBuffer(ByteBuf buf) // XXX: for tests... check if it works wel...
method getBuffer (line 96) | public ByteBuf getBuffer()
method getPriority (line 101) | public int getPriority()
method setPriority (line 106) | public void setPriority(int priority)
method isRealtimePriority (line 111) | public boolean isRealtimePriority()
method setSequence (line 116) | public void setSequence(int sequence) // XXX: possibly in new packets ...
method dispose (line 121) | public void dispose()
method equals (line 126) | @Override
method hashCode (line 141) | @Override
method compareTo (line 147) | @Override
FILE: app/src/main/java/io/xeres/app/net/peer/packet/SimplePacket.java
class SimplePacket (line 31) | public class SimplePacket extends Packet
method SimplePacket (line 35) | protected SimplePacket(ByteBuf in)
method SimplePacket (line 40) | public SimplePacket(ChannelHandlerContext ctx, List<MultiPacket> packets)
method getSize (line 50) | @Override
method getItemBuffer (line 56) | @Override
method isComplete (line 62) | @Override
FILE: app/src/main/java/io/xeres/app/net/peer/pipeline/IdleEventHandler.java
class IdleEventHandler (line 38) | @ChannelHandler.Sharable
method IdleEventHandler (line 45) | public IdleEventHandler(Duration timeout)
method eventReceived (line 51) | @Override
FILE: app/src/main/java/io/xeres/app/net/peer/pipeline/ItemDecoder.java
class ItemDecoder (line 36) | public class ItemDecoder extends MessageToMessageDecoder<ByteBuf>
method decode (line 42) | @Override
method decodeNewPacket (line 58) | private void decodeNewPacket(ChannelHandlerContext ctx, MultiPacket pa...
FILE: app/src/main/java/io/xeres/app/net/peer/pipeline/ItemEncoder.java
class ItemEncoder (line 30) | @ChannelHandler.Sharable
method encode (line 33) | @Override
FILE: app/src/main/java/io/xeres/app/net/peer/pipeline/MultiPacketEncoder.java
class MultiPacketEncoder (line 25) | public class MultiPacketEncoder extends ChannelOutboundHandlerAdapter
method MultiPacketEncoder (line 27) | public MultiPacketEncoder()
FILE: app/src/main/java/io/xeres/app/net/peer/pipeline/PacketDecoder.java
class PacketDecoder (line 39) | public class PacketDecoder extends ByteToMessageDecoder
method decode (line 41) | @Override
FILE: app/src/main/java/io/xeres/app/net/peer/pipeline/PeerHandler.java
class PeerHandler (line 56) | public class PeerHandler extends ChannelDuplexHandler
method PeerHandler (line 69) | public PeerHandler(ProfileService profileService, LocationService loca...
method channelRead (line 82) | @Override
method exceptionCaught (line 144) | @Override
method channelActive (line 168) | @Override
method userEventTriggered (line 175) | @Override
method channelInactive (line 214) | @Override
method sendSliceProbe (line 236) | private static void sendSliceProbe(ChannelHandlerContext ctx)
FILE: app/src/main/java/io/xeres/app/net/peer/pipeline/SimplePacketEncoder.java
class SimplePacketEncoder (line 28) | @ChannelHandler.Sharable
method encode (line 31) | @Override
FILE: app/src/main/java/io/xeres/app/net/peer/ssl/SSL.java
class SSL (line 59) | public final class SSL
method SSL (line 65) | private SSL()
method createSslContext (line 81) | public static SslContext createSslContext(byte[] privateKeyData, X509C...
method checkPeerCertificate (line 113) | public static Location checkPeerCertificate(ProfileService profileServ...
method createLocationIfAcceptedProfile (line 161) | private static Location createLocationIfAcceptedProfile(LocationIdenti...
method verify (line 188) | private static void verify(PGPPublicKey pgpPublicKey, X509Certificate ...
FILE: app/src/main/java/io/xeres/app/net/protocol/DomainNameSocketAddress.java
class DomainNameSocketAddress (line 25) | public final class DomainNameSocketAddress extends SocketAddress
method DomainNameSocketAddress (line 32) | private DomainNameSocketAddress(String name)
method of (line 44) | public static DomainNameSocketAddress of(String name)
method getName (line 49) | public String getName()
FILE: app/src/main/java/io/xeres/app/net/protocol/PeerAddress.java
class PeerAddress (line 52) | public final class PeerAddress
type Type (line 54) | public enum Type
method Type (line 65) | Type(String scheme)
method scheme (line 70) | public String scheme()
method fromUrl (line 87) | public static PeerAddress fromUrl(String url)
method fromAddress (line 107) | public static PeerAddress fromAddress(String address)
method fromHidden (line 122) | public static PeerAddress fromHidden(String address)
method tryFromHidden (line 131) | private static Optional<PeerAddress> tryFromHidden(String address)
method tryFromIpAndPort (line 141) | private static Optional<PeerAddress> tryFromIpAndPort(String address)
method from (line 158) | public static PeerAddress from(String ip, int port)
method fromIpAndPort (line 184) | public static PeerAddress fromIpAndPort(String ipAndPort)
method from (line 197) | public static PeerAddress from(HostPort hostPort)
method fromByteArray (line 208) | public static PeerAddress fromByteArray(byte[] data)
method fromHostname (line 230) | public static PeerAddress fromHostname(String hostname)
method fromHostname (line 239) | public static PeerAddress fromHostname(String hostname, int port)
method fromHostnameAndPort (line 248) | public static PeerAddress fromHostnameAndPort(String hostnameAndPort)
method fromSocketAddress (line 265) | public static PeerAddress fromSocketAddress(SocketAddress socketAddress)
method fromOnion (line 276) | public static PeerAddress fromOnion(String onion)
method tryFromOnion (line 281) | private static Optional<PeerAddress> tryFromOnion(String onion)
method fromI2p (line 291) | public static PeerAddress fromI2p(String i2p)
method tryFromI2p (line 296) | private static Optional<PeerAddress> tryFromI2p(String i2p)
method fromInvalid (line 311) | public static PeerAddress fromInvalid()
method PeerAddress (line 316) | private PeerAddress(Type type)
method PeerAddress (line 321) | private PeerAddress(SocketAddress socketAddress, Type type)
method getSocketAddress (line 332) | public SocketAddress getSocketAddress()
method getAddress (line 342) | public Optional<String> getAddress()
method getAddressAsBytes (line 360) | public Optional<byte[]> getAddressAsBytes()
method getType (line 400) | public Type getType()
method getUrl (line 405) | public String getUrl()
method isInvalid (line 415) | public boolean isInvalid()
method isValid (line 425) | public boolean isValid()
method isHidden (line 435) | public boolean isHidden()
method isExternal (line 445) | public boolean isExternal()
method isLAN (line 451) | public boolean isLAN()
method isHostname (line 456) | public boolean isHostname()
method isInvalidIpAddress (line 461) | private static boolean isInvalidIpAddress(String address)
method isInvalidHostname (line 489) | private static boolean isInvalidHostname(String hostname)
method toString (line 494) | @Override
FILE: app/src/main/java/io/xeres/app/net/upnp/ControlPoint.java
class ControlPoint (line 42) | final class ControlPoint
method ControlPoint (line 46) | private ControlPoint()
method updateDevice (line 51) | static boolean updateDevice(DeviceSpecs upnpDevice, URI location)
method getDeviceInfo (line 91) | private static void getDeviceInfo(DeviceSpecs upnpDevice, XPathNodes d...
method hasServices (line 114) | private static boolean hasServices(DeviceSpecs upnpDevice, XPathNodes ...
method addPortMapping (line 140) | static boolean addPortMapping(URI controlUrl, String serviceType, Stri...
method removePortMapping (line 156) | static boolean removePortMapping(URI controlUrl, String serviceType, i...
method getExternalIpAddress (line 167) | static String getExternalIpAddress(URI controlUrl, String serviceType)
method getTextNodes (line 179) | static Map<String, String> getTextNodes(String xml)
FILE: app/src/main/java/io/xeres/app/net/upnp/Device.java
class Device (line 38) | final class Device implements DeviceSpecs
method from (line 61) | static Device from(SocketAddress socketAddress, ByteBuffer byteBuffer)
method fromInvalid (line 105) | private static Device fromInvalid()
method Device (line 110) | private Device(SocketAddress socketAddress, Map<HttpuHeader, String> h...
method Device (line 116) | private Device()
method isValid (line 121) | public boolean isValid()
method isInvalid (line 126) | public boolean isInvalid()
method getInetSocketAddress (line 131) | public InetSocketAddress getInetSocketAddress()
method getHeaderValue (line 136) | public Optional<String> getHeaderValue(HttpuHeader header)
method hasLocation (line 145) | public boolean hasLocation()
method getLocationUrl (line 150) | public URI getLocationUrl()
method hasServer (line 171) | public boolean hasServer()
method getServer (line 176) | public String getServer()
method hasUsn (line 181) | public boolean hasUsn()
method getUsn (line 186) | public String getUsn()
method hasModelName (line 191) | @Override
method getModelName (line 197) | @Override
method setModelName (line 203) | @Override
method hasManufacturer (line 209) | @Override
method getManufacturer (line 215) | @Override
method setManufacturer (line 221) | @Override
method getManufacturerUrl (line 227) | @Override
method setManufacturerUrl (line 233) | @Override
method hasSerialNumber (line 239) | @Override
method getSerialNumber (line 245) | @Override
method setSerialNumber (line 251) | @Override
method hasControlUrl (line 257) | @Override
method getControlUrl (line 263) | @Override
method setControlUrl (line 269) | @Override
method hasPresentationUrl (line 275) | @Override
method getPresentationUrl (line 281) | @Override
method setPresentationUrl (line 287) | @Override
method getServiceType (line 293) | @Override
method setServiceType (line 299) | @Override
method addControlPoint (line 305) | public void addControlPoint()
method hasControlPoint (line 314) | public boolean hasControlPoint()
method addPortMapping (line 319) | public boolean addPortMapping(String internalIp, int internalPort, int...
method deletePortMapping (line 329) | public void deletePortMapping(int externalPort, Protocol protocol)
method removeAllPortMapping (line 337) | public void removeAllPortMapping()
method getExternalIpAddress (line 342) | public String getExternalIpAddress()
method parseUrl (line 347) | private static URI parseUrl(String url)
method parseUrl (line 352) | private static URI parseUrl(URI baseUrl, String url)
method addProtocolIfMissing (line 375) | private static String addProtocolIfMissing(String url)
method toString (line 384) | @Override
FILE: app/src/main/java/io/xeres/app/net/upnp/DeviceSpecs.java
type DeviceSpecs (line 24) | public interface DeviceSpecs
method hasModelName (line 26) | boolean hasModelName();
method getModelName (line 28) | String getModelName();
method setModelName (line 30) | void setModelName(String modelName);
method hasManufacturer (line 32) | boolean hasManufacturer();
method getManufacturer (line 34) | String getManufacturer();
method setManufacturer (line 36) | void setManufacturer(String manufacturer);
method getManufacturerUrl (line 38) | URI getManufacturerUrl();
method setManufacturerUrl (line 40) | void setManufacturerUrl(String manufacturerUrl);
method hasSerialNumber (line 42) | boolean hasSerialNumber();
method getSerialNumber (line 44) | String getSerialNumber();
method setSerialNumber (line 46) | void setSerialNumber(String serialNumber);
method hasControlUrl (line 48) | boolean hasControlUrl();
method getControlUrl (line 50) | URI getControlUrl();
method setControlUrl (line 52) | void setControlUrl(String controlUrl);
method hasPresentationUrl (line 54) | boolean hasPresentationUrl();
method getPresentationUrl (line 56) | URI getPresentationUrl();
method setPresentationUrl (line 58) | void setPresentationUrl(String presentationUrl);
method getServiceType (line 60) | String getServiceType();
method setServiceType (line 62) | void setServiceType(String serviceType);
FILE: app/src/main/java/io/xeres/app/net/upnp/HttpuHeader.java
type HttpuHeader (line 22) | enum HttpuHeader
FILE: app/src/main/java/io/xeres/app/net/upnp/PortMapping.java
method equals (line 24) | @Override
FILE: app/src/main/java/io/xeres/app/net/upnp/Protocol.java
type Protocol (line 22) | enum Protocol
FILE: app/src/main/java/io/xeres/app/net/upnp/Soap.java
class Soap (line 35) | final class Soap
method Soap (line 39) | private Soap()
method createSoap (line 44) | private static String createSoap(String serviceType, String actionName...
method sendRequest (line 65) | static ResponseEntity<String> sendRequest(URI controlUrl, String servi...
FILE: app/src/main/java/io/xeres/app/net/upnp/UPNPService.java
class UPNPService (line 45) | @Service
type State (line 79) | private enum State
method UPNPService (line 109) | public UPNPService(LocationService locationService, ApplicationEventPu...
method start (line 118) | public void start(String localIpAddress, int localPort, int controlPort)
method stop (line 132) | public void stop()
method isRunning (line 143) | public boolean isRunning()
method waitForTermination (line 148) | public void waitForTermination()
method getMSearch (line 153) | private static String getMSearch(String device)
method getUpnpDeviceSearch (line 158) | private void getUpnpDeviceSearch(SelectionKey selectionKey)
method run (line 172) | @Override
method upnpLoop (line 198) | private void upnpLoop() throws BindException
method handleSelection (line 263) | private void handleSelection(Selector selector, SelectionKey registerS...
method getSelectorTimeout (line 302) | private int getSelectorTimeout()
method setState (line 313) | private void setState(State newState, SelectionKey key)
method read (line 326) | private void read(SelectionKey key) throws IOException
method write (line 367) | private void write(SelectionKey key) throws IOException
method refreshPorts (line 377) | private boolean refreshPorts()
method cleanupDevice (line 399) | private void cleanupDevice()
method attemptFindExternalAddressUsingDnsIfNeeded (line 407) | private void attemptFindExternalAddressUsingDnsIfNeeded()
method findExternalIpAddressUsingUpnp (line 421) | private boolean findExternalIpAddressUsingUpnp()
method findExternalIpAddressUsingDns (line 426) | private boolean findExternalIpAddressUsingDns()
method updateExternalIpAddress (line 436) | private boolean updateExternalIpAddress(String externalIpAddress)
FILE: app/src/main/java/io/xeres/app/net/util/NetworkMode.java
type NetworkMode (line 22) | public enum NetworkMode
method isDiscoverable (line 29) | public static boolean isDiscoverable(NetworkMode networkMode)
method hasDht (line 38) | public static boolean hasDht(NetworkMode networkMode)
method getNetworkMode (line 47) | public static NetworkMode getNetworkMode(int vsDisc, int vsDht)
FILE: app/src/main/java/io/xeres/app/properties/DatabaseProperties.java
class DatabaseProperties (line 25) | @Configuration
method getCacheSize (line 32) | public Integer getCacheSize()
method setCacheSize (line 37) | public void setCacheSize(Integer cacheSize)
method getMaxCompactTime (line 42) | public Integer getMaxCompactTime()
method setMaxCompactTime (line 47) | public void setMaxCompactTime(Integer maxCompactTime)
FILE: app/src/main/java/io/xeres/app/properties/NetworkProperties.java
class NetworkProperties (line 28) | @Configuration
method checkConsistency (line 59) | @PostConstruct
method getFeatures (line 68) | public String getFeatures()
method isPacketSlicing (line 74) | @ManagedAttribute(description = "If the packet slicing is enabled for ...
method setPacketSlicing (line 80) | public void setPacketSlicing(boolean packetSlicing)
method isPacketGrouping (line 85) | @ManagedAttribute(description = "If the packet grouping is enabled for...
method setPacketGrouping (line 91) | public void setPacketGrouping(boolean packetGrouping)
method getTunnelEncryption (line 96) | @ManagedAttribute(description = "The encryption used for tunnels")
method setTunnelEncryption (line 102) | public void setTunnelEncryption(String tunnelEncryption)
method getFileTransferStrategy (line 107) | @ManagedAttribute(description = "The file transfer strategy")
method setFileTransferStrategy (line 113) | public void setFileTransferStrategy(String fileTransferStrategy)
FILE: app/src/main/java/io/xeres/app/service/BoardMessageService.java
class BoardMessageService (line 39) | @Service
method BoardMessageService (line 45) | public BoardMessageService(@Lazy BoardRsService boardRsService, Identi...
method getAuthorsMapFromMessages (line 51) | public Map<GxsId, IdentityGroupItem> getAuthorsMapFromMessages(Page<Bo...
method getMessagesMapFromSummaries (line 61) | public Map<MsgId, BoardMessageItem> getMessagesMapFromSummaries(long g...
method getMessagesMapFromMessages (line 77) | public Map<MsgId, BoardMessageItem> getMessagesMapFromMessages(List<Bo...
FILE: app/src/main/java/io/xeres/app/service/CapabilityService.java
class CapabilityService (line 33) | @Service
method CapabilityService (line 38) | public CapabilityService(AutoStart autoStart)
method getCapabilities (line 48) | public Set<String> getCapabilities()
FILE: app/src/main/java/io/xeres/app/service/ChannelMessageService.java
class ChannelMessageService (line 38) | @Service
method ChannelMessageService (line 44) | public ChannelMessageService(ChannelRsService channelRsService, Identi...
method getAuthorsMapFromMessages (line 50) | public Map<GxsId, IdentityGroupItem> getAuthorsMapFromMessages(Page<Ch...
method getMessagesMapFromSummaries (line 60) | public Map<MsgId, ChannelMessageItem> getMessagesMapFromSummaries(long...
method getMessagesMapFromMessages (line 76) | public Map<MsgId, ChannelMessageItem> getMessagesMapFromMessages(List<...
FILE: app/src/main/java/io/xeres/app/service/ContactService.java
class ContactService (line 34) | @Service
method ContactService (line 40) | public ContactService(@Lazy ProfileService profileService, IdentitySer...
method getContacts (line 46) | @Transactional(readOnly = true)
method getContactsForProfileId (line 65) | public List<Contact> getContactsForProfileId(long profileId)
method toContacts (line 71) | public List<Contact> toContacts(List<IdentityGroupItem> identities)
method toContact (line 83) | public Contact toContact(Profile profile)
method getAvailability (line 88) | private Availability getAvailability(Profile profile)
method isAccepted (line 97) | private boolean isAccepted(Profile profile)
FILE: app/src/main/java/io/xeres/app/service/ForumMessageService.java
class ForumMessageService (line 43) | @Service
method ForumMessageService (line 49) | public ForumMessageService(@Lazy ForumRsService forumRsService, Identi...
method getAuthorsMapFromSummaries (line 55) | public Map<GxsId, IdentityGroupItem> getAuthorsMapFromSummaries(Page<F...
method getAuthorsMapFromMessages (line 65) | public Map<GxsId, IdentityGroupItem> getAuthorsMapFromMessages(List<Fo...
method getMessagesMapFromSummaries (line 75) | public Map<MsgId, ForumMessageItem> getMessagesMapFromSummaries(long g...
method getMessagesMapFromMessages (line 91) | public Map<MsgId, ForumMessageItem> getMessagesMapFromMessages(long gr...
method getMessagesMapFromMessages (line 109) | public Map<MsgId, ForumMessageItem> getMessagesMapFromMessages(List<Fo...
FILE: app/src/main/java/io/xeres/app/service/GeoIpService.java
class GeoIpService (line 32) | @Service
method GeoIpService (line 38) | public GeoIpService(DatabaseReader databaseReader)
method getCountry (line 43) | public Country getCountry(String ipAddress)
FILE: app/src/main/java/io/xeres/app/service/IdentityService.java
class IdentityService (line 38) | @Service
method IdentityService (line 43) | public IdentityService(GxsIdentityRepository gxsIdentityRepository)
method findById (line 48) | public Optional<IdentityGroupItem> findById(long id)
method hasOwnIdentity (line 53) | public boolean hasOwnIdentity()
method getOwnIdentity (line 58) | public IdentityGroupItem getOwnIdentity()
method findAllByName (line 63) | public List<IdentityGroupItem> findAllByName(String name)
method findByGxsId (line 68) | public Optional<IdentityGroupItem> findByGxsId(GxsId gxsId)
method findAllByType (line 73) | public List<IdentityGroupItem> findAllByType(Type type)
method getAll (line 78) | public List<IdentityGroupItem> getAll()
method findAll (line 83) | public List<IdentityGroupItem> findAll(Set<GxsId> gxsIds)
method findAllSubscribed (line 88) | public List<IdentityGroupItem> findAllSubscribed()
method findAllByProfileId (line 93) | public List<IdentityGroupItem> findAllByProfileId(long id)
method save (line 98) | @Transactional
method findIdentitiesToValidate (line 104) | public List<IdentityGroupItem> findIdentitiesToValidate(int limit)
method delete (line 109) | public void delete(IdentityGroupItem identityGroupItem)
method signData (line 114) | @Transactional(propagation = Propagation.NEVER)
method removeAllLinksToProfile (line 120) | @Transactional
FILE: app/src/main/java/io/xeres/app/service/InfoService.java
class InfoService (line 39) | @Service
method InfoService (line 49) | public InfoService(BuildProperties buildProperties, Environment enviro...
method showStartupInfo (line 57) | public void showStartupInfo()
method showCapabilities (line 65) | public void showCapabilities()
method showFeatures (line 78) | public void showFeatures()
method showDebug (line 87) | public void showDebug()
method getUptime (line 109) | public Duration getUptime()
FILE: app/src/main/java/io/xeres/app/service/LocationService.java
class LocationService (line 63) | @Service
method LocationService (line 79) | public LocationService(SettingsService settingsService, ProfileService...
method generateLocationKeys (line 87) | KeyPair generateLocationKeys()
method generateLocationCertificate (line 103) | byte[] generateLocationCertificate(byte[] locationPublicKeyData) throw...
method generateOwnLocation (line 122) | @Transactional
method createOwnLocation (line 153) | @Transactional
method findLocationByLocationIdentifier (line 171) | public Optional<Location> findLocationByLocationIdentifier(LocationIde...
method findOwnLocation (line 176) | public Optional<Location> findOwnLocation()
method findLocationById (line 181) | public Optional<Location> findLocationById(long id)
method isServiceSupported (line 186) | public boolean isServiceSupported(Location location, int serviceId)
method hasOwnLocation (line 191) | public boolean hasOwnLocation()
method markAllConnectionsAsDisconnected (line 196) | public void markAllConnectionsAsDisconnected()
method countLocations (line 201) | public long countLocations()
method markAsAvailable (line 206) | @Transactional
method setConnected (line 214) | @Transactional
method updateConnection (line 225) | private static void updateConnection(Location location, SocketAddress ...
method setDisconnected (line 235) | @Transactional
method setAvailability (line 242) | @Transactional
method update (line 249) | @Transactional
method getConnectionsToConnectTo (line 261) | @Transactional
method getUnconnectedLocationsWithDht (line 281) | public Slice<Location> getUnconnectedLocationsWithDht(Pageable pageable)
method getConnectedLocations (line 286) | public List<Location> getConnectedLocations()
method getAllLocations (line 291) | public List<Location> getAllLocations()
method updateConnection (line 296) | @Transactional
method updateOwnConnection (line 314) | private static void updateOwnConnection(Location location, PeerAddress...
method updateOtherConnection (line 333) | private static void updateOtherConnection(Location location, PeerAddre...
method getHostname (line 338) | public String getHostname() throws UnknownHostException
method getUsername (line 343) | public String getUsername()
method updateAddressIfSameType (line 353) | private static boolean updateAddressIfSameType(PeerAddress from, Conne...
method getPageIndex (line 364) | private int getPageIndex()
method getConnectionIndex (line 378) | private int getConnectionIndex()
FILE: app/src/main/java/io/xeres/app/service/MessageService.java
class MessageService (line 34) | @Service
method MessageService (line 39) | public MessageService(SimpMessageSendingOperations messagingTemplate)
method sendToConsumers (line 44) | public void sendToConsumers(String path, MessageType type, Object payl...
method sendToConsumers (line 50) | public void sendToConsumers(String path, MessageType type, long destin...
method sendToConsumers (line 56) | public void sendToConsumers(String path, MessageType type, Identifier ...
method sendToConsumers (line 62) | private void sendToConsumers(String path, Map<String, Object> headers,...
method buildMessageHeaders (line 68) | private static Map<String, Object> buildMessageHeaders(MessageType mes...
method buildMessageHeaders (line 79) | private static Map<String, Object> buildMessageHeaders(MessageType mes...
FILE: app/src/main/java/io/xeres/app/service/NetworkService.java
class NetworkService (line 52) | @Service
method NetworkService (line 73) | public NetworkService(ProfileService profileService, LocationService l...
method checkReadiness (line 87) | public boolean checkReadiness()
method configure (line 97) | private void configure()
method configureLocalPort (line 103) | private int configureLocalPort()
method getLocalIpAddress (line 121) | public String getLocalIpAddress()
method getPort (line 126) | public int getPort()
method start (line 131) | public void start()
method startHelperServices (line 167) | private void startHelperServices(boolean isLan, boolean restart)
method stop (line 194) | public void stop()
method compareSettingsAndApplyActions (line 209) | public void compareSettingsAndApplyActions(Settings oldSettings, Setti...
method checkIp (line 218) | @Scheduled(initialDelay = 2, fixedDelay = 1, timeUnit = TimeUnit.MINUTES)
method onIpChangedEvent (line 240) | @EventListener
method onUpnpEvent (line 263) | @EventListener
method startDhtIfNeeded (line 287) | private void startDhtIfNeeded(boolean restart)
method startBroadcastDiscoveryIfNeeded (line 299) | private void startBroadcastDiscoveryIfNeeded(boolean restart)
method applyBroadcastDiscovery (line 311) | private void applyBroadcastDiscovery(Settings oldSettings, Settings ne...
method applyDht (line 326) | private void applyDht(Settings oldSettings, Settings newSettings)
method applyUpnp (line 341) | private void applyUpnp(Settings oldSettings, Settings newSettings)
method getRemotePortForUpnp (line 361) | private int getRemotePortForUpnp(Settings settings)
method applyTor (line 366) | private void applyTor(Settings oldSettings, Settings newSettings)
method applyI2p (line 374) | private void applyI2p(Settings oldSettings, Settings newSettings)
FILE: app/src/main/java/io/xeres/app/service/PeerService.java
class PeerService (line 36) | @Service
method PeerService (line 49) | public PeerService(PeerTcpClient peerTcpClient, PeerTorClient peerTorC...
method start (line 58) | public void start(int localPort)
method stop (line 72) | public void stop()
method startTor (line 81) | public void startTor()
method stopTor (line 89) | public void stopTor()
method restartTor (line 94) | public void restartTor()
method startI2p (line 100) | public void startI2p()
method stopI2p (line 108) | public void stopI2p()
method restartI2p (line 113) | public void restartI2p()
method isRunning (line 119) | public boolean isRunning()
FILE: app/src/main/java/io/xeres/app/service/ProfileService.java
class ProfileService (line 55) | @Service
method ProfileService (line 72) | public ProfileService(ProfileRepository profileRepository, SettingsSer...
method generateProfileKeys (line 82) | @Transactional
method createOwnProfile (line 119) | @Transactional
method getOwnProfile (line 127) | public Profile getOwnProfile()
method hasOwnProfile (line 132) | public boolean hasOwnProfile()
method findProfileById (line 137) | public Optional<Profile> findProfileById(long id)
method findProfilesByName (line 142) | public List<Profile> findProfilesByName(String name)
method findProfileByPgpFingerprint (line 147) | public Optional<Profile> findProfileByPgpFingerprint(ProfileFingerprin...
method findProfileByPgpIdentifier (line 152) | public Optional<Profile> findProfileByPgpIdentifier(long pgpIdentifier)
method findAllCompleteProfilesByPgpIdentifiers (line 157) | public List<Profile> findAllCompleteProfilesByPgpIdentifiers(Set<Long>...
method findDiscoverableProfileByPgpIdentifier (line 162) | public Optional<Profile> findDiscoverableProfileByPgpIdentifier(long p...
method findAllDiscoverableProfilesByPgpIdentifiers (line 167) | public List<Profile> findAllDiscoverableProfilesByPgpIdentifiers(Set<L...
method findProfileByLocationIdentifier (line 172) | public Optional<Profile> findProfileByLocationIdentifier(LocationIdent...
method findProfileKeyAttributes (line 177) | public ProfileKeyAttributes findProfileKeyAttributes(long id)
method createOrUpdateProfile (line 202) | @Transactional
method getProfileFromRSId (line 218) | public Profile getProfileFromRSId(RSId rsId)
method createNewProfile (line 226) | private static Profile createNewProfile(RSId rsId)
method deleteProfile (line 236) | @Transactional
method onPeerDisconnectedEvent (line 270) | @EventListener
method getAllProfiles (line 291) | public List<Profile> getAllProfiles()
method getAllDiscoverableProfiles (line 296) | public List<Profile> getAllDiscoverableProfiles()
method getAllProfilesIn (line 301) | public List<Profile> getAllProfilesIn(Set<Long> profileIds)
method fixAllProfiles (line 306) | @Transactional
FILE: app/src/main/java/io/xeres/app/service/QrCodeService.java
class QrCodeService (line 16) | @Service
method generateQrCode (line 21) | public BufferedImage generateQrCode(String message)
FILE: app/src/main/java/io/xeres/app/service/ResourceCreationState.java
type ResourceCreationState (line 22) | public enum ResourceCreationState
FILE: app/src/main/java/io/xeres/app/service/SettingsService.java
class SettingsService (line 54) | @Service
method SettingsService (line 77) | public SettingsService(SettingsRepository settingsRepository, Applicat...
method init (line 85) | @PostConstruct
method setPasswordInClients (line 93) | private void setPasswordInClients()
method getPasswordForClients (line 102) | private String getPasswordForClients()
method backup (line 130) | public void backup(String directory)
method deleteOldestBackupSiblings (line 141) | private void deleteOldestBackupSiblings(Path file)
method deleteFile (line 156) | private void deleteFile(Path path)
method getSettings (line 173) | public SettingsDTO getSettings()
method applyPatchToSettings (line 178) | @Transactional
method applySettings (line 187) | @Transactional
method updateSettings (line 201) | private void updateSettings(Settings settings)
method saveSecretProfileKey (line 209) | @Transactional
method getSecretProfileKey (line 216) | public byte[] getSecretProfileKey()
method saveLocationKeys (line 221) | @Transactional
method getLocationPublicKeyData (line 229) | public byte[] getLocationPublicKeyData()
method getLocationPrivateKeyData (line 234) | public byte[] getLocationPrivateKeyData()
method saveLocationCertificate (line 239) | @Transactional
method getLocationCertificate (line 246) | public byte[] getLocationCertificate()
method hasOwnLocation (line 251) | public boolean hasOwnLocation()
method isOwnProfilePresent (line 256) | public boolean isOwnProfilePresent()
method hasTorSocksConfigured (line 261) | public boolean hasTorSocksConfigured()
method getTorSocksHostPort (line 266) | public HostPort getTorSocksHostPort()
method hasI2pSocksConfigured (line 271) | public boolean hasI2pSocksConfigured()
method getI2pSocksHostPort (line 276) | public HostPort getI2pSocksHostPort()
method isUpnpEnabled (line 281) | public boolean isUpnpEnabled()
method isBroadcastDiscoveryEnabled (line 286) | public boolean isBroadcastDiscoveryEnabled()
method isDhtEnabled (line 291) | public boolean isDhtEnabled()
method getLocalPort (line 296) | public int getLocalPort()
method setLocalPort (line 301) | @Transactional
method isAutoStartEnabled (line 308) | public boolean isAutoStartEnabled()
method hasIncomingDirectory (line 313) | public boolean hasIncomingDirectory()
method getIncomingDirectory (line 318) | public String getIncomingDirectory()
method setIncomingDirectory (line 323) | @Transactional
method hasRemotePassword (line 330) | public boolean hasRemotePassword()
method getRemotePassword (line 335) | public String getRemotePassword()
method setRemotePassword (line 340) | @Transactional
method getVersion (line 347) | public int getVersion()
method setVersion (line 352) | @Transactional
method isUpnpRemoteEnabled (line 359) | public boolean isUpnpRemoteEnabled()
method isRemoteEnabled (line 364) | public boolean isRemoteEnabled()
method hasRemotePortConfigured (line 369) | public boolean hasRemotePortConfigured()
method getRemotePort (line 374) | public int getRemotePort()
FILE: app/src/main/java/io/xeres/app/service/UiBridgeService.java
class UiBridgeService (line 34) | @Service
type SplashStatus (line 37) | public enum SplashStatus
method UiBridgeService (line 48) | public UiBridgeService(SplashService splashService, TrayService traySe...
method setSplashStatus (line 56) | public void setSplashStatus(SplashStatus status)
method closeSplashScreen (line 65) | public void closeSplashScreen()
method showTrayNotification (line 70) | public void showTrayNotification(TrayNotificationType type, String mes...
method setTrayStatus (line 75) | public void setTrayStatus(String message)
method setClientsAuthentication (line 80) | public void setClientsAuthentication(String username, String password)
FILE: app/src/main/java/io/xeres/app/service/UnHtmlService.java
class UnHtmlService (line 41) | @Service
method UnHtmlService (line 48) | public UnHtmlService()
method cleanupMessage (line 55) | public String cleanupMessage(String text)
method convertToMarkdown (line 81) | private String convertToMarkdown(org.jsoup.nodes.Document jsoupDocument)
method convertNodes (line 98) | private static void convertNodes(List<Node> jsoupNodes, org.commonmark...
method createCommonMarkNode (line 129) | private static org.commonmark.node.Node createCommonMarkNode(Element e...
method setFencedCodeBlockLiteralIfFound (line 207) | private static void setFencedCodeBlockLiteralIfFound(FencedCodeBlock c...
method createHeading (line 225) | private static Heading createHeading(int level)
FILE: app/src/main/java/io/xeres/app/service/UpgradeService.java
class UpgradeService (line 39) | @Service
method UpgradeService (line 53) | public UpgradeService(DataDirConfiguration dataDirConfiguration, Setti...
method upgrade (line 66) | public void upgrade()
FILE: app/src/main/java/io/xeres/app/service/audio/AudioService.java
class AudioService (line 30) | @Service
method getAudioSampleRate (line 50) | public int getAudioSampleRate()
method getAudioSampleSize (line 55) | public int getAudioSampleSize()
method getAudioSampleChannels (line 60) | public int getAudioSampleChannels()
method getSpeexEncoderMode (line 65) | @SuppressWarnings("DataFlowIssue")
method startPlayingAndRecording (line 77) | public void startPlayingAndRecording(int frameSize, Consumer<byte[]> a...
method stopRecordingAndPlaying (line 83) | public void stopRecordingAndPlaying()
method startRecording (line 89) | private void startRecording(int frameSize, Consumer<byte[]> audioConsu...
method stopRecording (line 115) | private void stopRecording()
method startPlaying (line 127) | private void startPlaying(Supplier<byte[]> audioSupplier)
method stopPlaying (line 151) | private void stopPlaying()
method createAudioFormatIfNeeded (line 163) | private void createAudioFormatIfNeeded()
method captureAudio (line 171) | private void captureAudio()
method playAudio (line 189) | private void playAudio()
FILE: app/src/main/java/io/xeres/app/service/backup/BackupService.java
class BackupService (line 69) | @Service
method BackupService (line 84) | public BackupService(ProfileService profileService, LocationService lo...
method backup (line 93) | public byte[] backup() throws JAXBException
method restore (line 122) | @Transactional
method importProfileFromRs (line 160) | @Transactional
method importFriendsFromRs (line 226) | @Transactional
method verifyUpdate (line 277) | public boolean verifyUpdate(Path updateFile, byte[] signature)
method getInputStream (line 291) | private static InputStream getInputStream(MultipartFile file) throws I...
method readRsLine (line 333) | private static String readRsLine(BufferedReader reader) throws IOExcep...
method cleanupProfileName (line 350) | private String cleanupProfileName(String profileName)
method createOwnProfile (line 355) | private void createOwnProfile(String name, byte[] privateKey, byte[] p...
method createOwnLocation (line 362) | private void createOwnLocation(String name, byte[] privateKey, byte[] ...
method createOwnIdentity (line 368) | private void createOwnIdentity(String name, byte[] privateKey, byte[] ...
method createProfiles (line 374) | private void createProfiles(List<io.xeres.app.database.model.profile.P...
FILE: app/src/main/java/io/xeres/app/service/backup/Export.java
class Export (line 29) | @XmlRootElement
method Export (line 35) | public Export()
method getProfiles (line 40) | @XmlElementWrapper
method setProfiles (line 47) | public void setProfiles(List<Profile> profiles)
method getLocal (line 52) | public Local getLocal()
method setLocal (line 57) | public void setLocal(Local local)
FILE: app/src/main/java/io/xeres/app/service/backup/Group.java
class Group (line 26) | class Group
method Group (line 30) | public Group()
method getPgpIDs (line 35) | @XmlElement(name = "pgpID")
method setPgpIDs (line 41) | public void setPgpIDs(List<PgpId> pgpIDs)
FILE: app/src/main/java/io/xeres/app/service/backup/Identity.java
class Identity (line 24) | class Identity
method Identity (line 30) | @SuppressWarnings("unused")
method Identity (line 36) | public Identity(String name, byte[] privateKey, byte[] publicKey)
method getName (line 43) | @XmlAttribute
method setName (line 49) | public void setName(String name)
method getPrivateKey (line 54) | @XmlAttribute
method setPrivateKey (line 60) | public void setPrivateKey(byte[] privateKey)
method getPublicKey (line 65) | @XmlAttribute
method setPublicKey (line 71) | public void setPublicKey(byte[] publicKey)
FILE: app/src/main/java/io/xeres/app/service/backup/Local.java
class Local (line 22) | class Local
method Local (line 28) | public Local()
method getProfile (line 33) | public Profile getProfile()
method setProfile (line 38) | public void setProfile(Profile profile)
method getLocation (line 43) | public Location getLocation()
method setLocation (line 48) | public void setLocation(Location location)
method getIdentity (line 53) | public Identity getIdentity()
method setIdentity (line 58) | public void setIdentity(Identity identity)
FILE: app/src/main/java/io/xeres/app/service/backup/Location.java
class Location (line 27) | @XmlType(name = "localLocation")
method Location (line 36) | @SuppressWarnings("unused")
method Location (line 42) | public Location(LocationIdentifier locationIdentifier, byte[] privateK...
method getLocationIdentifier (line 51) | @XmlAttribute(name = "locationId")
method setLocationIdentifier (line 58) | public void setLocationIdentifier(LocationIdentifier locationIdentifier)
method getPrivateKey (line 63) | @XmlAttribute
method setPrivateKey (line 69) | public void setPrivateKey(byte[] privateKey)
method getPublicKey (line 74) | @XmlAttribute
method setPublicKey (line 80) | public void setPublicKey(byte[] publicKey)
method getX509Certificate (line 85) | @XmlAttribute
method setX509Certificate (line 91) | public void setX509Certificate(byte[] x509Certificate)
method getLocalPort (line 96) | @XmlAttribute
method setLocalPort (line 102) | public void setLocalPort(int localPort)
FILE: app/src/main/java/io/xeres/app/service/backup/LocationIdentifierXmlAdapter.java
class LocationIdentifierXmlAdapter (line 25) | public class LocationIdentifierXmlAdapter extends XmlAdapter<String, Loc...
method unmarshal (line 27) | @Override
method marshal (line 33) | @Override
FILE: app/src/main/java/io/xeres/app/service/backup/PgpId.java
class PgpId (line 26) | class PgpId
method PgpId (line 30) | public PgpId()
method getSslIDs (line 35) | @XmlElement(name = "sslID")
method setSslIDs (line 41) | public void setSslIDs(List<SslId> sslIDs)
FILE: app/src/main/java/io/xeres/app/service/backup/Profile.java
class Profile (line 25) | @XmlType(name = "localProfile")
method Profile (line 30) | @SuppressWarnings("unused")
method Profile (line 36) | public Profile(byte[] pgpPrivateKey)
method getPgpPrivateKey (line 41) | @XmlAttribute
method setPgpPrivateKey (line 47) | public void setPgpPrivateKey(byte[] pgpPrivateKey)
FILE: app/src/main/java/io/xeres/app/service/backup/RSIdXmlAdapter.java
class RSIdXmlAdapter (line 26) | public class RSIdXmlAdapter extends XmlAdapter<String, RSId>
method unmarshal (line 28) | @Override
method marshal (line 34) | @Override
FILE: app/src/main/java/io/xeres/app/service/backup/Root.java
class Root (line 28) | @XmlRootElement
method Root (line 34) | public Root()
method getPgpIDs (line 39) | @XmlElementWrapper
method setPgpIDs (line 46) | public void setPgpIDs(List<PgpId> pgpIDs)
method getGroups (line 51) | @XmlElementWrapper
method setGroups (line 58) | public void setGroups(List<Group> groups)
FILE: app/src/main/java/io/xeres/app/service/backup/SslId.java
class SslId (line 24) | class SslId
method SslId (line 28) | public SslId()
method getCertificate (line 33) | @XmlAttribute(name = "certificate")
method setCertificate (line 39) | public void setCertificate(String certificate)
FILE: app/src/main/java/io/xeres/app/service/file/FileService.java
class FileService (line 59) | @Service
method FileService (line 104) | public FileService(FileNotificationService fileNotificationService, Sh...
method addShare (line 120) | @Transactional
method encryptAllHashes (line 134) | @Transactional
method checkForSharesToScan (line 151) | @Transactional
method synchronize (line 173) | @Transactional
method setLastUpdated (line 204) | private void setLastUpdated(Share share)
method getShares (line 222) | public List<Share> getShares()
method getFilesMapFromShares (line 233) | public Map<Long, String> getFilesMapFromShares(List<Share> shares)
method toPath (line 239) | private static String toPath(List<File> files)
method findFileByHash (line 246) | public Optional<File> findFileByHash(Sha1Sum hash)
method findFileByEncryptedHash (line 256) | public Optional<File> findFileByEncryptedHash(Sha1Sum encryptedHash)
method findFilePathByHash (line 269) | public Optional<Path> findFilePathByHash(Sha1Sum hash)
method deleteFile (line 285) | public void deleteFile(File file)
method searchFiles (line 305) | public List<File> searchFiles(String name)
method searchFiles (line 310) | public List<File> searchFiles(List<Expression> expressions)
method findShareForFile (line 326) | public Optional<Share> findShareForFile(File file)
method addDownload (line 337) | public long addDownload(String name, Sha1Sum hash, long size, Location...
method suspendDownload (line 354) | @Transactional
method markDownloadAsCompleted (line 360) | @Transactional
method findById (line 366) | public Optional<FileDownload> findById(long id)
method removeDownload (line 371) | @Transactional
method findByPath (line 377) | public Optional<Sha1Sum> findByPath(Path path)
method encryptHash (line 390) | public static Sha1Sum encryptHash(Sha1Sum hash)
method saveFullPath (line 397) | private void saveFullPath(File file)
method getFullPath (line 410) | private List<File> getFullPath(File file)
method getFullPathAsString (line 429) | private String getFullPathAsString(File file)
method scanShare (line 434) | void scanShare(Share share)
method getFilePath (line 539) | public Path getFilePath(File file)
method isIndexableFile (line 548) | private boolean isIndexableFile(Path file, BasicFileAttributes attrs)
method isIndexableDirectory (line 558) | private boolean isIndexableDirectory(Path directory, BasicFileAttribut...
method isIgnoredFile (line 568) | private static boolean isIgnoredFile(String fileName)
method isIgnoredDirectory (line 590) | private static boolean isIgnoredDirectory(String dirName)
method calculateTemporaryFileHash (line 595) | public Sha1Sum calculateTemporaryFileHash(Path path)
method calculateFileHash (line 611) | Sha1Sum calculateFileHash(Path path, byte[] ioBuffer)
method calculateLargeFileHash (line 639) | private Sha1Sum calculateLargeFileHash(Path path) throws IOException
method calculateSmallFileHash (line 666) | private Sha1Sum calculateSmallFileHash(Path path, byte[] ioBuffer) thr...
method updateBloomFilter (line 686) | private void updateBloomFilter()
FILE: app/src/main/java/io/xeres/app/service/file/HashBloomFilter.java
class HashBloomFilter (line 43) | public class HashBloomFilter
method HashBloomFilter (line 49) | public HashBloomFilter(String baseDir, int expectedInsertions, double ...
method add (line 91) | public void add(Sha1Sum value)
method addAll (line 101) | public void addAll(Collection<Sha1Sum> values)
method mightContain (line 112) | public boolean mightContain(Sha1Sum value)
method mightContainAll (line 123) | public boolean mightContainAll(Collection<Sha1Sum> values)
method clear (line 131) | public void clear()
FILE: app/src/main/java/io/xeres/app/service/file/TrackingFileVisitor.java
class TrackingFileVisitor (line 33) | public class TrackingFileVisitor implements FileVisitor<Path>
method TrackingFileVisitor (line 40) | public TrackingFileVisitor(FileRepository fileRepository, File rootDir...
method preVisitDirectory (line 46) | @Override
method visitFile (line 61) | @Override
method visitFileFailed (line 67) | @Override
method postVisitDirectory (line 73) | @Override
method getCurrentDirectory (line 80) | public File getCurrentDirectory()
method foundChanges (line 85) | public boolean foundChanges()
method setChanged (line 90) | void setChanged()
FILE: app/src/main/java/io/xeres/app/service/identicon/IdenticonService.java
class IdenticonService (line 38) | @Service
method IdenticonService (line 45) | public IdenticonService(CacheDirConfiguration cacheDirConfiguration)
method getIdenticon (line 50) | public byte[] getIdenticon(byte[] hash)
method getIdenticonFromCache (line 74) | private byte[] getIdenticonFromCache(byte[] hash)
method putIdenticonToCache (line 96) | private void putIdenticonToCache(byte[] hash, byte[] data)
method getFilePath (line 114) | private Path getFilePath(byte[] hash)
method generateIdenticon (line 134) | private BufferedImage generateIdenticon(byte[] hash, int imageWidth, i...
FILE: app/src/main/java/io/xeres/app/service/notification/NotificationService.java
class NotificationService (line 36) | public abstract class NotificationService
method NotificationService (line 43) | protected NotificationService()
method initialNotification (line 54) | protected Notification initialNotification()
method addClient (line 59) | public SseEmitter addClient()
method sendNotification (line 76) | public void sendNotification(Notification notification)
method shutdown (line 85) | public void shutdown()
method sendInitialNotificationIfNeeded (line 91) | private void sendInitialNotificationIfNeeded(SseEmitter emitter)
method sendNotification (line 100) | private void sendNotification(Notification notification, SseEmitter sp...
method addEmitter (line 126) | private void addEmitter(SseEmitter emitter)
method removeEmitter (line 131) | private void removeEmitter(SseEmitter emitter)
method sendSseNotification (line 136) | private void sendSseNotification(Notification notification)
method sendSseNotification (line 154) | private void sendSseNotification(SseEmitter emitter, Notification noti...
method createEventBuilder (line 166) | private static SseEmitter.SseEventBuilder createEventBuilder(Notificat...
FILE: app/src/main/java/io/xeres/app/service/notification/availability/AvailabilityNotificationService.java
class AvailabilityNotificationService (line 28) | @Service
method changeAvailability (line 31) | public void changeAvailability(Location location, Availability availab...
FILE: app/src/main/java/io/xeres/app/service/notification/board/BoardNotificationService.java
class BoardNotificationService (line 39) | @Service
method BoardNotificationService (line 45) | public BoardNotificationService(UnHtmlService unHtmlService, BoardMess...
method addOrUpdateGroups (line 51) | public void addOrUpdateGroups(List<BoardGroupItem> groups)
method addOrUpdateMessages (line 56) | public void addOrUpdateMessages(List<BoardMessageItem> messages)
method setMessageReadState (line 64) | public void setMessageReadState(long groupId, long messageId, boolean ...
method setGroupMessagesReadState (line 69) | public void setGroupMessagesReadState(long groupId, boolean read)
FILE: app/src/main/java/io/xeres/app/service/notification/channel/ChannelNotificationService.java
class ChannelNotificationService (line 49) | @Service
method ChannelNotificationService (line 56) | public ChannelNotificationService(@Lazy ChannelRsService channelRsServ...
method addOrUpdateGroups (line 63) | public void addOrUpdateGroups(List<ChannelGroupItem> groups)
method addOrUpdateMessages (line 68) | public void addOrUpdateMessages(List<ChannelMessageItem> messages)
method setMessageReadState (line 76) | public void setMessageReadState(long groupId, long messageId, boolean ...
method setGroupMessagesReadState (line 81) | public void setGroupMessagesReadState(long groupId, boolean read)
method getAuthorsMapFromMessages (line 86) | private Map<GxsId, IdentityGroupItem> getAuthorsMapFromMessages(List<C...
method getMessagesMapFromMessages (line 96) | private Map<MsgId, ChannelMessageItem> getMessagesMapFromMessages(List...
FILE: app/src/main/java/io/xeres/app/service/notification/contact/ContactNotificationService.java
class ContactNotificationService (line 33) | @Service
method ContactNotificationService (line 38) | public ContactNotificationService(ContactService contactService)
method addOrUpdateIdentities (line 43) | public void addOrUpdateIdentities(List<IdentityGroupItem> identities)
method removeIdentities (line 48) | public void removeIdentities(List<IdentityGroupItem> identities)
method addOrUpdateProfile (line 53) | public void addOrUpdateProfile(Profile profile)
method removeProfile (line 58) | public void removeProfile(Profile profile)
method addOrUpdateContacts (line 63) | private void addOrUpdateContacts(List<Contact> contacts)
method removeContacts (line 68) | private void removeContacts(List<Contact> contacts)
FILE: app/src/main/java/io/xeres/app/service/notification/file/FileNotificationService.java
class FileNotificationService (line 33) | @Service
method initialNotification (line 40) | @Override
method createNotification (line 46) | private Notification createNotification()
method startScanning (line 51) | public void startScanning(Share share)
method startScanningFile (line 58) | public void startScanningFile(Path scannedFile)
method stopScanningFile (line 65) | public void stopScanningFile()
method stopScanning (line 72) | public void stopScanning()
FILE: app/src/main/java/io/xeres/app/service/notification/file/FileSearchNotificationService.java
class FileSearchNotificationService (line 28) | @Service
method foundFile (line 31) | public void foundFile(int requestId, String name, long size, Sha1Sum h...
FILE: app/src/main/java/io/xeres/app/service/notification/file/FileTrendNotificationService.java
class FileTrendNotificationService (line 26) | @Service
method receivedSearch (line 29) | public void receivedSearch(String senderName, String keywords)
FILE: app/src/main/java/io/xeres/app/service/notification/forum/ForumNotificationService.java
class ForumNotificationService (line 38) | @Service
method ForumNotificationService (line 44) | public ForumNotificationService(ForumMessageService forumMessageServic...
method addOrUpdateGroups (line 51) | public void addOrUpdateGroups(List<ForumGroupItem> groups)
method addOrUpdateMessages (line 56) | public void addOrUpdateMessages(List<ForumMessageItem> messages)
method setMessageReadState (line 64) | public void setMessageReadState(long groupId, long messageId, boolean ...
method setGroupMessagesReadState (line 69) | public void setGroupMessagesReadState(long groupId, boolean read)
FILE: app/src/main/java/io/xeres/app/service/notification/status/StatusNotificationService.java
class StatusNotificationService (line 34) | @Service
method StatusNotificationService (line 48) | public StatusNotificationService(UiBridgeService uiBridgeService, Reso...
method setCurrentUsersCount (line 55) | public void setCurrentUsersCount(int value)
method setTotalUsers (line 62) | public void setTotalUsers(int value)
method setNatStatus (line 68) | public void setNatStatus(NatStatus value)
method setDhtInfo (line 74) | public void setDhtInfo(DhtInfo value)
method initialNotification (line 80) | @Override
method createNotification (line 86) | private Notification createNotification()
FILE: app/src/main/java/io/xeres/app/service/script/Console.java
class Console (line 25) | @SuppressWarnings("unused") // All methods here can be used by JS
method log (line 32) | public void log(String message)
method info (line 37) | public void info(String message)
method debug (line 42) | public void debug(String message)
method error (line 47) | public void error(String message)
method warn (line 52) | public void warn(String message)
FILE: app/src/main/java/io/xeres/app/service/script/ScriptEvent.java
method toString (line 24) | @Override
FILE: app/src/main/java/io/xeres/app/service/script/ScriptService.java
class ScriptService (line 59) | @Service
method ScriptService (line 77) | public ScriptService(Environment environment, DataDirConfiguration dat...
method init (line 87) | @PostConstruct
method reload (line 94) | public void reload()
method startContext (line 100) | private void startContext(boolean throwIfErrors)
method startEventProcessor (line 170) | private void startEventProcessor()
method sendEvent (line 193) | public void sendEvent(String type, Object data)
method processEvent (line 202) | private void processEvent(ScriptEvent event)
method convertToJsValue (line 221) | private Value convertToJsValue(Object data)
method shutdown (line 240) | @PreDestroy
method closeContext (line 246) | private void closeContext()
class XeresAPI (line 260) | @SuppressWarnings("unused") // All methods here can be used by JS
method registerEventHandler (line 267) | public void registerEventHandler(String eventType, Value handler)
method sendChatRoomMessage (line 276) | public void sendChatRoomMessage(long roomId, String message)
method sendPrivateMessage (line 286) | public void sendPrivateMessage(String destination, String message)
method sendDistantMessage (line 299) | public void sendDistantMessage(String destination, String message)
method getAvailability (line 308) | public String getAvailability()
FILE: app/src/main/java/io/xeres/app/service/shell/History.java
class History (line 24) | class History
method History (line 30) | public History(int maxSize)
method addCommand (line 36) | public void addCommand(String command)
method getPrevious (line 58) | public String getPrevious()
method getNext (line 74) | public String getNext()
FILE: app/src/main/java/io/xeres/app/service/shell/ShellService.java
class ShellService (line 54) | @Service
method ShellService (line 65) | public ShellService(ScriptService scriptService, ForumRsService forumR...
method sendCommand (line 74) | @Override
method getArgument (line 139) | private String getArgument(DefaultApplicationArguments args, int index)
method getPreviousCommand (line 144) | @Override
method getNextCommand (line 150) | @Override
method getProperties (line 156) | private ShellResult getProperties()
method processProperty (line 173) | private static void processProperty(StringBuilder sb, String key, Stri...
method showLineSeparator (line 186) | private static String showLineSeparator(String in)
method getMemorySpecs (line 193) | private static ShellResult getMemorySpecs()
method getUptime (line 202) | private ShellResult getUptime()
method getCpuCount (line 216) | private static ShellResult getCpuCount()
method getWorkingDirectory (line 222) | private static ShellResult getWorkingDirectory()
method getOperatingSystem (line 227) | private static ShellResult getOperatingSystem()
method runGc (line 232) | private static ShellResult runGc()
method setLogLevel (line 238) | private static ShellResult setLogLevel(String packageName, String level)
method showLogs (line 258) | private static ShellResult showLogs()
method openDirectory (line 264) | private static ShellResult openDirectory(String name)
method reload (line 284) | private ShellResult reload()
method fixForumDuplicates (line 300) | private ShellResult fixForumDuplicates()
method resetLastPeerMessageUpdate (line 306) | private ShellResult resetLastPeerMessageUpdate(String locationString, ...
method translateCommandline (line 337) | static String[] translateCommandline(String toProcess)
method cleanup (line 419) | @PreDestroy
FILE: app/src/main/java/io/xeres/app/util/DevUtils.java
class DevUtils (line 26) | public final class DevUtils
method DevUtils (line 28) | private DevUtils()
method getDirFromDevelopmentSetup (line 33) | public static String getDirFromDevelopmentSetup(String directory)
FILE: app/src/main/java/io/xeres/app/util/GxsUtils.java
class GxsUtils (line 29) | public final class GxsUtils
method GxsUtils (line 35) | private GxsUtils()
method getScaledGroupImage (line 48) | public static byte[] getScaledGroupImage(MultipartFile imageFile, int ...
FILE: app/src/main/java/io/xeres/app/util/XmlUtils.java
class XmlUtils (line 26) | public final class XmlUtils
method XmlUtils (line 28) | private XmlUtils()
method getSecureDocumentBuilderFactory (line 33) | public static DocumentBuilderFactory getSecureDocumentBuilderFactory()
method getSecureXMLInputFactory (line 41) | public static XMLInputFactory getSecureXMLInputFactory()
FILE: app/src/main/java/io/xeres/app/util/expression/CompoundExpression.java
class CompoundExpression (line 32) | public class CompoundExpression implements Expression
type Operator (line 34) | public enum Operator
method CompoundExpression (line 45) | public CompoundExpression(Operator operator, Expression left, Expressi...
method evaluate (line 52) | @Override
method toPredicate (line 68) | @Override
method linearize (line 84) | @Override
method toString (line 93) | @Override
FILE: app/src/main/java/io/xeres/app/util/expression/DateExpression.java
class DateExpression (line 34) | public class DateExpression extends RelationalExpression
method DateExpression (line 36) | public DateExpression(Operator operator, int lowerValue, int higherValue)
method getType (line 41) | @Override
method getDatabaseColumnName (line 47) | @Override
method toPredicate (line 53) | @Override
method getValue (line 68) | @Override
FILE: app/src/main/java/io/xeres/app/util/expression/Expression.java
type Expression (line 29) | public interface Expression
method evaluate (line 31) | boolean evaluate(File file);
method linearize (line 33) | void linearize(List<Byte> tokens, List<Integer> ints, List<String> str...
method toPredicate (line 35) | Predicate toPredicate(CriteriaBuilder cb, Root<File> root);
FILE: app/src/main/java/io/xeres/app/util/expression/ExpressionMapper.java
class ExpressionMapper (line 31) | public final class ExpressionMapper
method ExpressionMapper (line 35) | private ExpressionMapper()
class Context (line 40) | private static class Context
method Context (line 49) | public Context(List<Byte> tokens, List<Integer> ints, List<String> s...
method hasNextToken (line 56) | public boolean hasNextToken()
method nextToken (line 61) | public ExpressionType nextToken()
method nextIntegerValue (line 66) | public int nextIntegerValue()
method skipIntegerValue (line 71) | public void skipIntegerValue()
method nextStringValue (line 76) | public String nextStringValue()
method toExpressions (line 82) | public static List<Expression> toExpressions(TurtleRegExpSearchRequest...
method toItem (line 106) | public static TurtleRegExpSearchRequestItem toItem(List<Expression> ex...
method toExpression (line 119) | private static Expression toExpression(Context context)
method toDateExpression (line 136) | private static DateExpression toDateExpression(Context context)
method toPopularityExpression (line 144) | private static PopularityExpression toPopularityExpression(Context con...
method toSizeExpression (line 152) | private static SizeExpression toSizeExpression(Context context)
method toSizeMbExpression (line 160) | private static SizeMbExpression toSizeMbExpression(Context context)
method toNameExpression (line 168) | private static NameExpression toNameExpression(Context context)
method toPathExpression (line 182) | private static PathExpression toPathExpression(Context context)
method toExtensionExpression (line 196) | private static ExtensionExpression toExtensionExpression(Context context)
method toHashExpression (line 210) | private static HashExpression toHashExpression(Context context)
method toCompoundExpression (line 224) | private static CompoundExpression toCompoundExpression(Context context)
FILE: app/src/main/java/io/xeres/app/util/expression/ExpressionType.java
type ExpressionType (line 24) | enum ExpressionType
method ExpressionType (line 39) | ExpressionType(Class<? extends Expression> javaClass)
method getTokenValueByClass (line 44) | static byte getTokenValueByClass(Class<? extends Expression> javaClass)
FILE: app/src/main/java/io/xeres/app/util/expression/ExtensionExpression.java
class ExtensionExpression (line 35) | public class ExtensionExpression extends StringExpression
method ExtensionExpression (line 37) | public ExtensionExpression(@SuppressWarnings("unused") Operator operat...
method getType (line 42) | @Override
method getDatabaseColumnName (line 48) | @Override
method toPredicate (line 54) | @Override
method contains (line 60) | private Predicate contains(CriteriaBuilder cb, Root<File> root)
method getValue (line 68) | @Override
FILE: app/src/main/java/io/xeres/app/util/expression/HashExpression.java
class HashExpression (line 27) | public class HashExpression extends StringExpression
method HashExpression (line 29) | public HashExpression(Operator operator, String template)
method isEnabled (line 34) | @Override
method getType (line 40) | @Override
method getDatabaseColumnName (line 46) | @Override
method getValue (line 52) | @Override
FILE: app/src/main/java/io/xeres/app/util/expression/NameExpression.java
class NameExpression (line 27) | public class NameExpression extends StringExpression
method NameExpression (line 29) | public NameExpression(Operator operator, String template, boolean case...
method getType (line 34) | @Override
method getDatabaseColumnName (line 40) | @Override
method getValue (line 46) | @Override
FILE: app/src/main/java/io/xeres/app/util/expression/PathExpression.java
class PathExpression (line 28) | public class PathExpression extends StringExpression
method PathExpression (line 30) | public PathExpression(Operator operator, String template, boolean case...
method isEnabled (line 35) | @Override
method getType (line 41) | @Override
method getDatabaseColumnName (line 47) | @Override
method getValue (line 53) | @Override
FILE: app/src/main/java/io/xeres/app/util/expression/PopularityExpression.java
class PopularityExpression (line 30) | public class PopularityExpression extends RelationalExpression
method PopularityExpression (line 32) | public PopularityExpression(Operator operator, Integer lowerValue, Int...
method isEnabled (line 37) | @Override
method getType (line 43) | @Override
method getDatabaseColumnName (line 49) | @Override
method getValue (line 55) | @Override
FILE: app/src/main/java/io/xeres/app/util/expression/RelationalExpression.java
class RelationalExpression (line 29) | abstract class RelationalExpression implements Expression
type Operator (line 31) | public enum Operator
method isEnabled (line 41) | boolean isEnabled()
method getValue (line 46) | abstract int getValue(File file);
method getType (line 48) | abstract String getType();
method getDatabaseColumnName (line 55) | abstract String getDatabaseColumnName();
method RelationalExpression (line 61) | protected RelationalExpression(Operator operator, int lowerValue, int ...
method evaluate (line 68) | @Override
method toPredicate (line 85) | @Override
method linearize (line 105) | @Override
method toString (line 114) | @Override
FILE: app/src/main/java/io/xeres/app/util/expression/SizeExpression.java
class SizeExpression (line 28) | public class SizeExpression extends RelationalExpression
method SizeExpression (line 30) | public SizeExpression(Operator operator, int lowerValue, int higherValue)
method getType (line 35) | @Override
method getDatabaseColumnName (line 41) | @Override
method getValue (line 47) | @Override
FILE: app/src/main/java/io/xeres/app/util/expression/SizeMbExpression.java
class SizeMbExpression (line 33) | public class SizeMbExpression extends RelationalExpression
method SizeMbExpression (line 35) | public SizeMbExpression(Operator operator, int lowerValue, int higherV...
method getType (line 40) | @Override
method getDatabaseColumnName (line 46) | @Override
method toPredicate (line 52) | @Override
method getPessimisticValue (line 95) | private static long getPessimisticValue(int value)
method getOptimisticValue (line 100) | private static long getOptimisticValue(int value)
method getValue (line 105) | @Override
FILE: app/src/main/java/io/xeres/app/util/expression/StringExpression.java
class StringExpression (line 32) | public abstract class StringExpression implements Expression
type Operator (line 34) | public enum Operator
method isEnabled (line 41) | boolean isEnabled()
method getValue (line 46) | abstract String getValue(File file);
method getType (line 48) | abstract String getType();
method getDatabaseColumnName (line 55) | abstract String getDatabaseColumnName();
method StringExpression (line 61) | protected StringExpression(Operator operator, String template, boolean...
method evaluate (line 69) | @Override
method toPredicate (line 86) | @Override
method equals (line 101) | private Predicate equals(CriteriaBuilder cb, Root<File> root)
method contains (line 113) | private Predicate contains(CriteriaBuilder cb, Root<File> root, boolea...
method like (line 121) | protected Predicate like(CriteriaBuilder cb, jakarta.persistence.crite...
method linearize (line 133) | @Override
method toString (line 143) | @Override
FILE: app/src/main/java/io/xeres/app/xrs/common/CommentMessageItem.java
class CommentMessageItem (line 32) | @Entity(name = "comment_message")
method getSubType (line 39) | @Override
method CommentMessageItem (line 45) | public CommentMessageItem()
method CommentMessageItem (line 50) | public CommentMessageItem(GxsId gxsId, String name)
method getComment (line 57) | public String getComment()
method setComment (line 62) | public void setComment(String comment)
method writeDataObject (line 67) | @Override
method readDataObject (line 73) | @Override
method clone (line 79) | @Override
method toString (line 85) | @Override
FILE: app/src/main/java/io/xeres/app/xrs/common/FileData.java
method toString (line 28) | @Override
FILE: app/src/main/java/io/xeres/app/xrs/common/FileItem.java
method toString (line 40) | @Override
FILE: app/src/main/java/io/xeres/app/xrs/common/FileSet.java
method toString (line 30) | @Override
FILE: app/src/main/java/io/xeres/app/xrs/common/SecurityKey.java
class SecurityKey (line 36) | @Embeddable
method SecurityKey (line 53) | public SecurityKey()
method SecurityKey (line 57) | public SecurityKey(@NotNull GxsId keyGxsId, Set<Flags> flags, @NotNull...
method SecurityKey (line 66) | public SecurityKey(@NotNull GxsId keyGxsId, Set<Flags> flags, int vali...
method getKeyGxsId (line 75) | public @NotNull GxsId getKeyGxsId()
method setKeyGxsId (line 80) | public void setKeyGxsId(@NotNull GxsId keyId)
method getFlags (line 85) | public Set<Flags> getFlags()
method setFlags (line 90) | public void setFlags(Set<Flags> flags)
method getValidFrom (line 95) | public @NotNull Instant getValidFrom()
method setValidFrom (line 100) | public void setValidFrom(@NotNull Instant validFrom)
method getValidFromInTs (line 105) | public int getValidFromInTs()
method setValidFrom (line 110) | public void setValidFrom(int validFrom)
method getValidTo (line 115) | public Instant getValidTo()
method setValidTo (line 120) | public void setValidTo(Instant validTo)
method getValidToInTs (line 125) | public int getValidToInTs()
method setValidTo (line 134) | public void setValidTo(int validTo)
method getData (line 146) | public byte[] getData()
method setData (line 151) | public void setData(byte[] data)
method equals (line 156) | @Override
method hashCode (line 171) | @Override
method toString (line 177) | @Override
method compareTo (line 187) | @Override
type Flags (line 194) | public enum Flags
method ofTypes (line 205) | public static Set<Flags> ofTypes()
method ofDistributions (line 210) | public static Set<Flags> ofDistributions()
FILE: app/src/main/java/io/xeres/app/xrs/common/Signature.java
class Signature (line 32) | @Embeddable
method Signature (line 44) | public Signature()
method Signature (line 48) | public Signature(Type type, @NotNull GxsId gxsId, byte[] data)
method Signature (line 55) | public Signature(@NotNull GxsId gxsId, byte[] data)
method getType (line 61) | public Type getType()
method setType (line 66) | public void setType(Type type)
method getGxsId (line 71) | public @NotNull GxsId getGxsId()
method setGxsId (line 76) | public void setGxsId(@NotNull GxsId gxsId)
method getData (line 81) | public byte[] getData()
method setData (line 86) | public void setData(byte[] data)
method equals (line 91) | @Override
method hashCode (line 106) | @Override
method compareTo (line 112) | @Override
method toString (line 118) | @Override
type Type (line 126) | public enum Type
method Type (line 132) | Type(int value)
method getValue (line 139) | public int getValue()
method findByValue (line 144) | public static Signature.Type findByValue(int value)
FILE: app/src/main/java/io/xeres/app/xrs/common/VoteMessageItem.java
class VoteMessageItem (line 31) | @Entity(name = "vote_message")
type Type (line 34) | public enum Type
method VoteMessageItem (line 54) | public VoteMessageItem()
method VoteMessageItem (line 59) | public VoteMessageItem(GxsId gxsId, String name)
method getSubType (line 66) | @Override
method getType (line 72) | public Type getType()
method setType (line 77) | public void setType(Type type)
method writeDataObject (line 82) | @Override
method readDataObject (line 88) | @Override
method clone (line 94) | @Override
method toString (line 100) | @Override
FILE: app/src/main/java/io/xeres/app/xrs/item/Item.java
class Item (line 44) | public abstract class Item implements Cloneable
method getServiceType (line 53) | public abstract int getServiceType();
method getSubType (line 55) | public abstract int getSubType();
method Item (line 57) | protected Item()
method setIncoming (line 62) | public void setIncoming(ByteBuf buf)
method setOutgoing (line 67) | public void setOutgoing(ByteBufAllocator allocator, RsService service)
method setSerialization (line 82) | public void setSerialization(ByteBufAllocator allocator, RsService ser...
method serializeItem (line 88) | public RawItem serializeItem(Set<SerializationFlags> flags)
method getPriority (line 125) | public int getPriority() // returns an int so that it's easier to exte...
method dispose (line 130) | public void dispose()
method getItemSize (line 146) | public int getItemSize()
method setItemSize (line 151) | protected void setItemSize(int size)
method clone (line 164) | @Override
FILE: app/src/main/java/io/xeres/app/xrs/item/ItemHeader.java
class ItemHeader (line 25) | public class ItemHeader
method ItemHeader (line 33) | public ItemHeader(ByteBuf buf, int serviceType, int subType)
method writeHeader (line 40) | public int writeHeader()
method writeSize (line 50) | public int writeSize(int dataSize)
method readHeader (line 57) | public static void readHeader(ByteBuf buf, int serviceType, int subType)
method getSubType (line 74) | public static int getSubType(ByteBuf buf)
FILE: app/src/main/java/io/xeres/app/xrs/item/ItemPriority.java
type ItemPriority (line 22) | public enum ItemPriority
method ItemPriority (line 58) | ItemPriority(int priority)
method getPriority (line 63) | public int getPriority()
FILE: app/src/main/java/io/xeres/app/xrs/item/ItemUtils.java
class ItemUtils (line 31) | public final class ItemUtils
method ItemUtils (line 33) | private ItemUtils()
method getItemSerializedSize (line 48) | public static int getItemSerializedSize(Item item, RsService service)
method serializeItemForSignature (line 64) | public static byte[] serializeItemForSignature(Item item, RsService se...
method serializeItem (line 81) | public static byte[] serializeItem(Item item, RsService service)
method deserializeItem (line 98) | public static Item deserializeItem(byte[] data, RsServiceRegistry regi...
FILE: app/src/main/java/io/xeres/app/xrs/item/RawItem.java
class RawItem (line 35) | public class RawItem
method RawItem (line 42) | public RawItem()
method RawItem (line 46) | public RawItem(Packet packet)
method RawItem (line 52) | public RawItem(ByteBuf buf, int priority)
method deserialize (line 58) | public void deserialize(Item item)
method getPacketVersion (line 93) | public int getPacketVersion()
method getPacketService (line 98) | public int getPacketService()
method getPacketSubType (line 103) | public int getPacketSubType()
method getItemSize (line 108) | private int getItemSize()
method getSize (line 113) | public int getSize()
method getBuffer (line 118) | public ByteBuf getBuffer()
method getPriority (line 123) | public int getPriority()
method dispose (line 128) | public void dispose()
method toString (line 133) | @Override
FILE: app/src/main/java/io/xeres/app/xrs/serialization/AnnotationSerializer.java
class AnnotationSerializer (line 35) | final class AnnotationSerializer
method AnnotationSerializer (line 39) | private AnnotationSerializer()
method serialize (line 44) | static int serialize(ByteBuf buf, Object object)
method deserializeForClass (line 56) | static Object deserializeForClass(ByteBuf buf, Class<?> javaClass)
method deserialize (line 74) | static boolean deserialize(ByteBuf buf, Object object)
method getAllFields (line 93) | private static List<Field> getAllFields(Class<?> javaClass, boolean re...
method isClassOrderReversed (line 117) | private static boolean isClassOrderReversed(Object object)
FILE: app/src/main/java/io/xeres/app/xrs/serialization/ArraySerializer.java
class ArraySerializer (line 24) | final class ArraySerializer
method ArraySerializer (line 26) | private ArraySerializer()
method serialize (line 31) | static int serialize(ByteBuf buf, Class<?> javaClass, Object object)
method deserialize (line 43) | static Object deserialize(ByteBuf buf, Class<?> javaClass)
FILE: app/src/main/java/io/xeres/app/xrs/serialization/BigIntegerSerializer.java
class BigIntegerSerializer (line 29) | final class BigIntegerSerializer
method BigIntegerSerializer (line 33) | private BigIntegerSerializer()
method serialize (line 38) | static int serialize(ByteBuf buf, BigInteger value)
method deserialize (line 48) | static BigInteger deserialize(ByteBuf buf)
FILE: app/src/main/java/io/xeres/app/xrs/serialization/BooleanSerializer.java
class BooleanSerializer (line 26) | final class BooleanSerializer
method BooleanSerializer (line 30) | private BooleanSerializer()
method serialize (line 35) | @SuppressWarnings("SameReturnValue")
method deserialize (line 44) | static boolean deserialize(ByteBuf buf)
FILE: app/src/main/java/io/xeres/app/xrs/serialization/ByteArraySerializer.java
class ByteArraySerializer (line 26) | final class ByteArraySerializer
method ByteArraySerializer (line 30) | private ByteArraySerializer()
method serialize (line 35) | static int serialize(ByteBuf buf, byte[] a)
method deserialize (line 50) | static byte[] deserialize(ByteBuf buf)
method serialize (line 59) | static int serialize(ByteBuf buf, byte[] array, int size)
method deserialize (line 67) | static byte[] deserialize(ByteBuf buf, int size)
FILE: app/src/main/java/io/xeres/app/xrs/serialization/ByteSerializer.java
class ByteSerializer (line 26) | final class ByteSerializer
method ByteSerializer (line 30) | private ByteSerializer()
method serialize (line 35) | @SuppressWarnings("SameReturnValue")
method deserialize (line 44) | static byte deserialize(ByteBuf buf)
FILE: app/src/main/java/io/xeres/app/xrs/serialization/DoubleSerializer.java
class DoubleSerializer (line 26) | final class DoubleSerializer
method DoubleSerializer (line 30) | private DoubleSeria
Condensed preview — 1421 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,042K chars).
[
{
"path": ".agents/skills/archunit-rules/SKILL.md",
"chars": 2402,
"preview": "---\nname: archunit-rules\ndescription: ArchUnit architecture rules enforced in Xeres including common module rules (loggi"
},
{
"path": ".agents/skills/crypto/SKILL.md",
"chars": 2059,
"preview": "---\nname: crypto\ndescription: Cryptography patterns for Xeres including PGP operations, key generation, and hash functio"
},
{
"path": ".agents/skills/dto-mappers/SKILL.md",
"chars": 2300,
"preview": "---\nname: dto-mappers\ndescription: DTO and mapper patterns for Xeres using Java records, canonical constructors with val"
},
{
"path": ".agents/skills/flyway-migrations/SKILL.md",
"chars": 1834,
"preview": "---\nname: flyway-migrations\ndescription: Flyway SQL migration patterns for Xeres including naming conventions, H2 databa"
},
{
"path": ".agents/skills/gradle-build/SKILL.md",
"chars": 1759,
"preview": "---\nname: gradle-build\ndescription: Gradle build configuration for Xeres including build commands, version management, m"
},
{
"path": ".agents/skills/java-conventions/SKILL.md",
"chars": 2896,
"preview": "---\nname: java-conventions\ndescription: Code style, naming conventions, license headers, and patterns for Xeres Java pro"
},
{
"path": ".agents/skills/javafx-patterns/SKILL.md",
"chars": 2205,
"preview": "---\nname: javafx-patterns\ndescription: JavaFX patterns for Xeres including controller structure with FXML views, WindowC"
},
{
"path": ".agents/skills/junit-testing/SKILL.md",
"chars": 2412,
"preview": "---\nname: junit-testing\ndescription: JUnit 6 testing patterns for Xeres including Mockito with constructor injection, te"
},
{
"path": ".agents/skills/spring-boot-patterns/SKILL.md",
"chars": 2335,
"preview": "---\nname: spring-boot-patterns\ndescription: Spring Boot patterns for Xeres including constructor injection, @Transaction"
},
{
"path": ".agents/skills/ui-testing/SKILL.md",
"chars": 2069,
"preview": "---\nname: ui-testing\ndescription: TestFX patterns for JavaFX controller testing in Xeres including FXML loading with con"
},
{
"path": ".aiignore",
"chars": 222,
"preview": "/data*/\n/.idea/\n/.vscode/\n/.gradle/\n/.venv/\n./jpb/\n/*/build/\n/build/\n/*/out/\n/*/bin/\n.xeres.lock\n/.jpb/persistence-units"
},
{
"path": ".editorconfig",
"chars": 31503,
"preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_size = 4\nindent_style = tab\ninsert_final_newline = false\nmax_li"
},
{
"path": ".github/ISSUE_TEMPLATE/bug_report.yaml",
"chars": 1456,
"preview": "name: Bug report\ndescription: Something doesn't work properly and you want it fixed.\nlabels: [ bug ]\nbody:\n- type: markd"
},
{
"path": ".github/ISSUE_TEMPLATE/feature_request.yaml",
"chars": 354,
"preview": "name: Feature request\ndescription: You have some cool idea or suggestion for improvement.\nlabels: [ feature ]\nbody:\n- ty"
},
{
"path": ".github/dependabot.yml",
"chars": 335,
"preview": "version: 2\nupdates:\n- package-ecosystem: \"gradle\"\n directory: \"/\"\n schedule:\n interval: \"daily\"\n ignore:\n - dep"
},
{
"path": ".github/pull_request_template.md",
"chars": 45,
"preview": "Describe the change here\n\nFixes #issue_number"
},
{
"path": ".github/workflows/analysis.yml",
"chars": 1838,
"preview": "name: \"Analysis\"\n\non:\n push:\n branches:\n - master\n pull_request:\n branches:\n - master\n types:\n -"
},
{
"path": ".github/workflows/build-docker.yml",
"chars": 3023,
"preview": "# Docker image builder\n\nname: build-docker.yml\n\non:\n workflow_dispatch:\n\nenv:\n JAVA_VERSION: '25.0.3'\n JAVA_DISTRIBUT"
},
{
"path": ".github/workflows/build-installer.yml",
"chars": 8165,
"preview": "# This is the installer builder.\n#\n# It's triggered automatically when a version tag is pushed.\n#\n# For manual builds, a"
},
{
"path": ".github/workflows/dependencies.yaml",
"chars": 620,
"preview": "name: \"Gradle dependencies\"\n\non:\n push:\n branches:\n - master\n\njobs:\n build:\n name: Dependencies\n runs-on"
},
{
"path": ".github/workflows/qodana_code_quality.yml",
"chars": 1277,
"preview": "#-------------------------------------------------------------------------------#\n# Discover additional configura"
},
{
"path": ".gitignore",
"chars": 245,
"preview": "/data*/\n/.idea/\n/.vscode/\n/.gradle/\n/.venv/\n./jpb/\n/*/build/\n/build/\n/*/out/\n/*/bin/\n.xeres.lock\n/.jpb/persistence-units"
},
{
"path": ".run/All Tests.run.xml",
"chars": 1048,
"preview": "<component name=\"ProjectRunConfigurationManager\">\n <configuration default=\"false\" name=\"All Tests\" type=\"GradleRunCon"
},
{
"path": "AGENTS.md",
"chars": 2119,
"preview": "# Xeres Development Guidelines\n\n## Project Overview\n\nXeres is a Friend-to-Friend, decentralized, and secure communicatio"
},
{
"path": "CODE_OF_CONDUCT.md",
"chars": 12,
"preview": "No trolling."
},
{
"path": "CONTRIBUTING.md",
"chars": 1372,
"preview": "# How to contribute\n\nContributions are welcome! Please read the following in order to make it easier.\n\n## Reporting a bu"
},
{
"path": "LICENSE",
"chars": 35146,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "README.md",
"chars": 2934,
"preview": "[](https://xeres.io)\n\n[ 2025-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/XeresApplication.java",
"chars": 1882,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/DefaultHandler.java",
"chars": 6734,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/board/BoardController.java",
"chars": 12339,
"preview": "/*\n * Copyright (c) 2025-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/channel/ChannelController.java",
"chars": 12863,
"preview": "/*\n * Copyright (c) 2025-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/chat/ChatController.java",
"chars": 12756,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/chat/ChatMessageController.java",
"chars": 6726,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/chat/doc-files/websocket.puml",
"chars": 420,
"preview": "@startuml\n'https://plantuml.com/component-diagram\n\n\npackage \"UI Client\" {\n component producer #Cyan [\n Producer\n "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/chat/package-info.java",
"chars": 829,
"preview": "/*\n * Copyright (c) 2024 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/config/ConfigController.java",
"chars": 13033,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/config/package-info.java",
"chars": 972,
"preview": "/*\n * Copyright (c) 2024 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/connection/ConnectionController.java",
"chars": 3269,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/contact/ContactController.java",
"chars": 1756,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/file/FileController.java",
"chars": 3316,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/forum/ForumController.java",
"chars": 8902,
"preview": "/*\n * Copyright (c) 2023-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/geoip/GeoIpController.java",
"chars": 2499,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/identity/IdentityController.java",
"chars": 8133,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/location/LocationController.java",
"chars": 4658,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/notification/NotificationController.java",
"chars": 5602,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/profile/ProfileController.java",
"chars": 11268,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/settings/SettingsController.java",
"chars": 2438,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/share/ShareController.java",
"chars": 3802,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/statistics/StatisticsController.java",
"chars": 2782,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/statistics/StatisticsMapper.java",
"chars": 1613,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/controller/voip/VoipMessageController.java",
"chars": 2202,
"preview": "/*\n * Copyright (c) 2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/api/converter/BufferedImageConverter.java",
"chars": 518,
"preview": "package io.xeres.app.api.converter;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.http"
},
{
"path": "app/src/main/java/io/xeres/app/api/exception/InternalServerErrorException.java",
"chars": 1019,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/exception/UnprocessableEntityException.java",
"chars": 1020,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/api/package-info.java",
"chars": 774,
"preview": "/*\n * Copyright (c) 2024 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/application/SingleInstanceRun.java",
"chars": 3137,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/Startup.java",
"chars": 7848,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/autostart/AutoStart.java",
"chars": 1347,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/autostart/AutoStarter.java",
"chars": 1372,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/autostart/autostarter/AutoStarterGeneric.java",
"chars": 1230,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/autostart/autostarter/AutoStarterWindows.java",
"chars": 3073,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/environment/Cloud.java",
"chars": 1739,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/environment/CommandArgument.java",
"chars": 8766,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/environment/DefaultProperties.java",
"chars": 1949,
"preview": "/*\n * Copyright (c) 2025-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/environment/HostVariable.java",
"chars": 4275,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/environment/LocalPortFinder.java",
"chars": 2464,
"preview": "/*\n * Copyright (c) 2023-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/events/DhtNodeFoundEvent.java",
"chars": 1131,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/events/IpChangedEvent.java",
"chars": 943,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/events/LocationReadyEvent.java",
"chars": 1014,
"preview": "/*\n * Copyright (c) 2019-2024 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/events/NetworkReadyEvent.java",
"chars": 904,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/events/PeerConnectedEvent.java",
"chars": 893,
"preview": "/*\n * Copyright (c) 2024 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/application/events/PeerDisconnectedEvent.java",
"chars": 1070,
"preview": "/*\n * Copyright (c) 2024-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/events/SettingsChangedEvent.java",
"chars": 1055,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/events/UpnpEvent.java",
"chars": 1133,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/application/events/package-info.java",
"chars": 994,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/configuration/AsynchronousEventsConfiguration.java",
"chars": 3015,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/configuration/AutoStartConfiguration.java",
"chars": 1694,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/configuration/CacheDirConfiguration.java",
"chars": 2741,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/configuration/CustomCsrfChannelInterceptor.java",
"chars": 1050,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/configuration/DataDirConfiguration.java",
"chars": 3418,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/configuration/DataSourceConfiguration.java",
"chars": 4491,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/configuration/EnumMappingConfiguration.java",
"chars": 1341,
"preview": "/*\n * Copyright (c) 2024 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/configuration/GeoIpConfiguration.java",
"chars": 1582,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/configuration/IdleTimeConfiguration.java",
"chars": 2097,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/configuration/SchedulerConfiguration.java",
"chars": 1134,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/configuration/SelfCertificateConfiguration.java",
"chars": 6248,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/configuration/WebConfiguration.java",
"chars": 1302,
"preview": "/*\n * Copyright (c) 2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/configuration/WebSecurityConfiguration.java",
"chars": 3394,
"preview": "/*\n * Copyright (c) 2024-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/configuration/WebServerConfiguration.java",
"chars": 2737,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/configuration/WebSocketConfiguration.java",
"chars": 1983,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/configuration/WebSocketLoggingConfiguration.java",
"chars": 1396,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/configuration/WebSocketMessageBrokerConfiguration.java",
"chars": 3350,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/configuration/WebSocketSecurityConfiguration.java",
"chars": 1967,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/crypto/aead/AEAD.java",
"chars": 9477,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/crypto/aes/AES.java",
"chars": 4757,
"preview": "/*\n * Copyright (c) 2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/crypto/dh/DiffieHellman.java",
"chars": 3229,
"preview": "/*\n * Copyright (c) 2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/crypto/ec/Ed25519.java",
"chars": 1391,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/crypto/hash/AbstractMessageDigest.java",
"chars": 1758,
"preview": "/*\n * Copyright (c) 2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/crypto/hash/chat/ChatChallenge.java",
"chars": 1473,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/crypto/hash/sha1/Sha1MessageDigest.java",
"chars": 1042,
"preview": "/*\n * Copyright (c) 2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/crypto/hash/sha256/Sha256MessageDigest.java",
"chars": 949,
"preview": "/*\n * Copyright (c) 2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/crypto/hmac/AbstractHMac.java",
"chars": 1873,
"preview": "/*\n * Copyright (c) 2024 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/crypto/hmac/sha1/Sha1HMac.java",
"chars": 970,
"preview": "/*\n * Copyright (c) 2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/crypto/hmac/sha256/Sha256HMac.java",
"chars": 978,
"preview": "/*\n * Copyright (c) 2024 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/crypto/pgp/PGP.java",
"chars": 13147,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/crypto/pgp/PGPSigner.java",
"chars": 2159,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/crypto/pgp/package-info.java",
"chars": 1172,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/crypto/rsa/RSA.java",
"chars": 8848,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/crypto/rscrypto/RsCrypto.java",
"chars": 5635,
"preview": "/*\n * Copyright (c) 2024 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/crypto/rscrypto/doc-files/format.puml",
"chars": 290,
"preview": "@startuml\nmap \"Packet\" as packet {\n\tHeader => 4 bytes\n\tInitialization vector => 12 bytes\n\tEncrypted data size => 4 bytes"
},
{
"path": "app/src/main/java/io/xeres/app/crypto/rsid/RSCertificate.java",
"chars": 10741,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/crypto/rsid/RSId.java",
"chars": 6150,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/crypto/rsid/RSIdArmor.java",
"chars": 2833,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/crypto/rsid/RSIdBuilder.java",
"chars": 3869,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/crypto/rsid/RSIdCrc.java",
"chars": 1179,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/crypto/rsid/RSSerialVersion.java",
"chars": 1840,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/crypto/rsid/ShortInvite.java",
"chars": 10007,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/crypto/x509/X509.java",
"chars": 4872,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/DatabaseSession.java",
"chars": 1476,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/DatabaseSessionManager.java",
"chars": 1942,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/converter/AvailabilityConverter.java",
"chars": 1046,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/converter/EnumConverter.java",
"chars": 1839,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/converter/EnumSetConverter.java",
"chars": 1891,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/converter/FileTypeConverter.java",
"chars": 1022,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/converter/GxsCircleTypeConverter.java",
"chars": 1058,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/converter/GxsPrivacyFlagsConverter.java",
"chars": 1071,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/converter/GxsSignatureFlagsConverter.java",
"chars": 1081,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/converter/IdentityTypeConverter.java",
"chars": 1014,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/converter/NetModeConverter.java",
"chars": 1021,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/converter/PeerAddressTypeConverter.java",
"chars": 1061,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/converter/SecurityKeyFlagsConverter.java",
"chars": 1066,
"preview": "/*\n * Copyright (c) 2023-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/converter/SignatureTypeConverter.java",
"chars": 1049,
"preview": "/*\n * Copyright (c) 2023-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/converter/TrustConverter.java",
"chars": 1006,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/converter/VoteTypeConverter.java",
"chars": 1063,
"preview": "/*\n * Copyright (c) 2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/database/model/board/BoardMapper.java",
"chars": 3107,
"preview": "/*\n * Copyright (c) 2025-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/channel/ChannelMapper.java",
"chars": 5253,
"preview": "/*\n * Copyright (c) 2025-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/chat/ChatBacklog.java",
"chars": 2032,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/chat/ChatMapper.java",
"chars": 3311,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/chat/ChatRoom.java",
"chars": 3628,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/chat/ChatRoomBacklog.java",
"chars": 2435,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/chat/DistantChatBacklog.java",
"chars": 2185,
"preview": "/*\n * Copyright (c) 2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/database/model/connection/Connection.java",
"chars": 3921,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/connection/ConnectionMapper.java",
"chars": 1594,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/file/File.java",
"chars": 4883,
"preview": "/*\n * Copyright (c) 2024-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/file/FileDownload.java",
"chars": 2833,
"preview": "/*\n * Copyright (c) 2024 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/database/model/forum/ForumMapper.java",
"chars": 4049,
"preview": "/*\n * Copyright (c) 2023-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/forum/ForumMessageItemSummary.java",
"chars": 1233,
"preview": "/*\n * Copyright (c) 2023-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/gxs/GxsCircleType.java",
"chars": 1638,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/gxs/GxsClientUpdate.java",
"chars": 2820,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/gxs/GxsConstants.java",
"chars": 949,
"preview": "/*\n * Copyright (c) 2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/database/model/gxs/GxsGroupItem.java",
"chars": 18866,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/gxs/GxsMessageItem.java",
"chars": 9019,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/gxs/GxsMetaAndData.java",
"chars": 1151,
"preview": "/*\n * Copyright (c) 2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/database/model/gxs/GxsPrivacyFlags.java",
"chars": 1061,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/gxs/GxsServiceSetting.java",
"chars": 1486,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/gxs/GxsSignatureFlags.java",
"chars": 1099,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/identity/IdentityMapper.java",
"chars": 1675,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/location/Location.java",
"chars": 10518,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/location/LocationMapper.java",
"chars": 2287,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/profile/Profile.java",
"chars": 7123,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/profile/ProfileMapper.java",
"chars": 3302,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/settings/Settings.java",
"chars": 5084,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/settings/SettingsMapper.java",
"chars": 2359,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/share/Share.java",
"chars": 2880,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/model/share/ShareMapper.java",
"chars": 2155,
"preview": "/*\n * Copyright (c) 2024-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/ChatBacklogRepository.java",
"chars": 1468,
"preview": "/*\n * Copyright (c) 2024-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/ChatRoomBacklogRepository.java",
"chars": 1472,
"preview": "/*\n * Copyright (c) 2024-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/ChatRoomRepository.java",
"chars": 1714,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/DistantChatBacklogRepository.java",
"chars": 1559,
"preview": "/*\n * Copyright (c) 2025-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/FileDownloadRepository.java",
"chars": 1419,
"preview": "/*\n * Copyright (c) 2024 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/FileRepository.java",
"chars": 1502,
"preview": "/*\n * Copyright (c) 2024 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/GxsBoardGroupRepository.java",
"chars": 1354,
"preview": "/*\n * Copyright (c) 2025-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/GxsBoardMessageRepository.java",
"chars": 2321,
"preview": "/*\n * Copyright (c) 2025-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/GxsChannelGroupRepository.java",
"chars": 1368,
"preview": "/*\n * Copyright (c) 2025-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/GxsChannelMessageRepository.java",
"chars": 2345,
"preview": "/*\n * Copyright (c) 2025-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/GxsClientUpdateRepository.java",
"chars": 1259,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/GxsCommentMessageRepository.java",
"chars": 1280,
"preview": "/*\n * Copyright (c) 2025-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/GxsForumGroupRepository.java",
"chars": 1354,
"preview": "/*\n * Copyright (c) 2023-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/GxsForumMessageRepository.java",
"chars": 2476,
"preview": "/*\n * Copyright (c) 2023-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/GxsGroupItemRepository.java",
"chars": 1388,
"preview": "/*\n * Copyright (c) 2023-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/GxsIdentityRepository.java",
"chars": 1780,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/GxsMessageItemRepository.java",
"chars": 2819,
"preview": "/*\n * Copyright (c) 2023-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/GxsServiceSettingRepository.java",
"chars": 1093,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/GxsVoteMessageRepository.java",
"chars": 1268,
"preview": "/*\n * Copyright (c) 2025-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/LocationRepository.java",
"chars": 1773,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/ProfileRepository.java",
"chars": 2699,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/SettingsRepository.java",
"chars": 1369,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/database/repository/ShareRepository.java",
"chars": 1292,
"preview": "/*\n * Copyright (c) 2024 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/job/DhtFinderJob.java",
"chars": 3607,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/job/FileIndexingJob.java",
"chars": 1457,
"preview": "/*\n * Copyright (c) 2024 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free softw"
},
{
"path": "app/src/main/java/io/xeres/app/job/IdleDetectionJob.java",
"chars": 2149,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/job/JobUtils.java",
"chars": 1310,
"preview": "/*\n * Copyright (c) 2019-2025 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/job/PeerConnectionJob.java",
"chars": 4509,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/net/bdisc/BroadcastDiscoveryService.java",
"chars": 10821,
"preview": "/*\n * Copyright (c) 2019-2026 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/net/bdisc/ProtocolVersion.java",
"chars": 826,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
},
{
"path": "app/src/main/java/io/xeres/app/net/bdisc/UdpDiscoveryPeer.java",
"chars": 3137,
"preview": "/*\n * Copyright (c) 2019-2023 by David Gerber - https://zapek.com\n *\n * This file is part of Xeres.\n *\n * Xeres is free "
}
]
// ... and 1221 more files (download for full content)
About this extraction
This page contains the full source code of the zapek/Xeres GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1421 files (5.3 MB), approximately 1.5M tokens, and a symbol index with 8860 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.