forked from Silverfish/proton-bridge
Other: C++ Code reformat.
This commit is contained in:
@ -19,19 +19,16 @@
|
||||
#include "EventFactory.h"
|
||||
|
||||
|
||||
namespace bridgepp
|
||||
{
|
||||
namespace bridgepp {
|
||||
|
||||
|
||||
namespace
|
||||
{
|
||||
namespace {
|
||||
|
||||
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return a new SPStreamEvent
|
||||
//****************************************************************************************************************************************************
|
||||
bridgepp::SPStreamEvent newStreamEvent()
|
||||
{
|
||||
bridgepp::SPStreamEvent newStreamEvent() {
|
||||
return std::make_shared<grpc::StreamEvent>();
|
||||
}
|
||||
|
||||
@ -40,8 +37,7 @@ bridgepp::SPStreamEvent newStreamEvent()
|
||||
/// \param[in] appEvent The app event.
|
||||
/// \return The stream event.
|
||||
//****************************************************************************************************************************************************
|
||||
bridgepp::SPStreamEvent wrapAppEvent(grpc::AppEvent *appEvent)
|
||||
{
|
||||
bridgepp::SPStreamEvent wrapAppEvent(grpc::AppEvent *appEvent) {
|
||||
auto event = newStreamEvent();
|
||||
event->set_allocated_app(appEvent);
|
||||
return event;
|
||||
@ -52,8 +48,7 @@ bridgepp::SPStreamEvent wrapAppEvent(grpc::AppEvent *appEvent)
|
||||
/// \param[in] loginEvent The login event.
|
||||
/// \return The stream event.
|
||||
//****************************************************************************************************************************************************
|
||||
bridgepp::SPStreamEvent wrapLoginEvent(grpc::LoginEvent *loginEvent)
|
||||
{
|
||||
bridgepp::SPStreamEvent wrapLoginEvent(grpc::LoginEvent *loginEvent) {
|
||||
auto event = newStreamEvent();
|
||||
event->set_allocated_login(loginEvent);
|
||||
return event;
|
||||
@ -64,8 +59,7 @@ bridgepp::SPStreamEvent wrapLoginEvent(grpc::LoginEvent *loginEvent)
|
||||
/// \param[in] updateEvent The app event.
|
||||
/// \return The stream event.
|
||||
//****************************************************************************************************************************************************
|
||||
bridgepp::SPStreamEvent wrapUpdateEvent(grpc::UpdateEvent *updateEvent)
|
||||
{
|
||||
bridgepp::SPStreamEvent wrapUpdateEvent(grpc::UpdateEvent *updateEvent) {
|
||||
auto event = newStreamEvent();
|
||||
event->set_allocated_update(updateEvent);
|
||||
return event;
|
||||
@ -76,8 +70,7 @@ bridgepp::SPStreamEvent wrapUpdateEvent(grpc::UpdateEvent *updateEvent)
|
||||
/// \param[in] cacheEvent The cache event.
|
||||
/// \return The stream event.
|
||||
//****************************************************************************************************************************************************
|
||||
bridgepp::SPStreamEvent wrapCacheEvent(grpc::DiskCacheEvent *cacheEvent)
|
||||
{
|
||||
bridgepp::SPStreamEvent wrapCacheEvent(grpc::DiskCacheEvent *cacheEvent) {
|
||||
auto event = newStreamEvent();
|
||||
event->set_allocated_cache(cacheEvent);
|
||||
return event;
|
||||
@ -88,8 +81,7 @@ bridgepp::SPStreamEvent wrapCacheEvent(grpc::DiskCacheEvent *cacheEvent)
|
||||
/// \param[in] mailSettingsEvent The mail settings event.
|
||||
/// \return The stream event.
|
||||
//****************************************************************************************************************************************************
|
||||
bridgepp::SPStreamEvent wrapMailServerSettingsEvent(grpc::MailServerSettingsEvent *mailServerSettingsEvent)
|
||||
{
|
||||
bridgepp::SPStreamEvent wrapMailServerSettingsEvent(grpc::MailServerSettingsEvent *mailServerSettingsEvent) {
|
||||
auto event = newStreamEvent();
|
||||
event->set_allocated_mailserversettings(mailServerSettingsEvent);
|
||||
return event;
|
||||
@ -100,8 +92,7 @@ bridgepp::SPStreamEvent wrapMailServerSettingsEvent(grpc::MailServerSettingsEven
|
||||
/// \param[in] keychainEvent The keychain event.
|
||||
/// \return The stream event.
|
||||
//****************************************************************************************************************************************************
|
||||
bridgepp::SPStreamEvent wrapKeychainEvent(grpc::KeychainEvent *keychainEvent)
|
||||
{
|
||||
bridgepp::SPStreamEvent wrapKeychainEvent(grpc::KeychainEvent *keychainEvent) {
|
||||
auto event = newStreamEvent();
|
||||
event->set_allocated_keychain(keychainEvent);
|
||||
return event;
|
||||
@ -112,8 +103,7 @@ bridgepp::SPStreamEvent wrapKeychainEvent(grpc::KeychainEvent *keychainEvent)
|
||||
/// \param[in] mailEvent The mail event.
|
||||
/// \return The stream event.
|
||||
//****************************************************************************************************************************************************
|
||||
bridgepp::SPStreamEvent wrapMailEvent(grpc::MailEvent *mailEvent)
|
||||
{
|
||||
bridgepp::SPStreamEvent wrapMailEvent(grpc::MailEvent *mailEvent) {
|
||||
auto event = newStreamEvent();
|
||||
event->set_allocated_mail(mailEvent);
|
||||
return event;
|
||||
@ -124,8 +114,7 @@ bridgepp::SPStreamEvent wrapMailEvent(grpc::MailEvent *mailEvent)
|
||||
/// \param[in] userEvent The user event.
|
||||
/// \return The stream event.
|
||||
//****************************************************************************************************************************************************
|
||||
bridgepp::SPStreamEvent wrapUserEvent(grpc::UserEvent *userEvent)
|
||||
{
|
||||
bridgepp::SPStreamEvent wrapUserEvent(grpc::UserEvent *userEvent) {
|
||||
auto event = newStreamEvent();
|
||||
event->set_allocated_user(userEvent);
|
||||
return event;
|
||||
@ -136,8 +125,7 @@ bridgepp::SPStreamEvent wrapUserEvent(grpc::UserEvent *userEvent)
|
||||
/// \param[in] genericErrorEvent The generic error event.
|
||||
/// \return The stream event.
|
||||
//****************************************************************************************************************************************************
|
||||
bridgepp::SPStreamEvent wrapGenericErrorEvent(grpc::GenericErrorEvent *genericErrorEvent)
|
||||
{
|
||||
bridgepp::SPStreamEvent wrapGenericErrorEvent(grpc::GenericErrorEvent *genericErrorEvent) {
|
||||
auto event = newStreamEvent();
|
||||
event->set_allocated_genericerror(genericErrorEvent);
|
||||
return event;
|
||||
@ -150,8 +138,7 @@ bridgepp::SPStreamEvent wrapGenericErrorEvent(grpc::GenericErrorEvent *genericEr
|
||||
/// \param[in] connected The internet status.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newInternetStatusEvent(bool connected)
|
||||
{
|
||||
SPStreamEvent newInternetStatusEvent(bool connected) {
|
||||
auto *internetStatusEvent = new grpc::InternetStatusEvent();
|
||||
internetStatusEvent->set_connected(connected);
|
||||
auto appEvent = new grpc::AppEvent;
|
||||
@ -163,8 +150,7 @@ SPStreamEvent newInternetStatusEvent(bool connected)
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newToggleAutostartFinishedEvent()
|
||||
{
|
||||
SPStreamEvent newToggleAutostartFinishedEvent() {
|
||||
auto *event = new grpc::ToggleAutostartFinishedEvent;
|
||||
auto appEvent = new grpc::AppEvent;
|
||||
appEvent->set_allocated_toggleautostartfinished(event);
|
||||
@ -175,8 +161,7 @@ SPStreamEvent newToggleAutostartFinishedEvent()
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newResetFinishedEvent()
|
||||
{
|
||||
SPStreamEvent newResetFinishedEvent() {
|
||||
auto event = new grpc::ResetFinishedEvent;
|
||||
auto appEvent = new grpc::AppEvent;
|
||||
appEvent->set_allocated_resetfinished(event);
|
||||
@ -187,8 +172,7 @@ SPStreamEvent newResetFinishedEvent()
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newReportBugFinishedEvent()
|
||||
{
|
||||
SPStreamEvent newReportBugFinishedEvent() {
|
||||
auto event = new grpc::ReportBugFinishedEvent;
|
||||
auto appEvent = new grpc::AppEvent;
|
||||
appEvent->set_allocated_reportbugfinished(event);
|
||||
@ -199,8 +183,7 @@ SPStreamEvent newReportBugFinishedEvent()
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newReportBugSuccessEvent()
|
||||
{
|
||||
SPStreamEvent newReportBugSuccessEvent() {
|
||||
auto event = new grpc::ReportBugSuccessEvent;
|
||||
auto appEvent = new grpc::AppEvent;
|
||||
appEvent->set_allocated_reportbugsuccess(event);
|
||||
@ -211,8 +194,7 @@ SPStreamEvent newReportBugSuccessEvent()
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newReportBugErrorEvent()
|
||||
{
|
||||
SPStreamEvent newReportBugErrorEvent() {
|
||||
auto event = new grpc::ReportBugErrorEvent;
|
||||
auto appEvent = new grpc::AppEvent;
|
||||
appEvent->set_allocated_reportbugerror(event);
|
||||
@ -223,8 +205,7 @@ SPStreamEvent newReportBugErrorEvent()
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newShowMainWindowEvent()
|
||||
{
|
||||
SPStreamEvent newShowMainWindowEvent() {
|
||||
auto event = new grpc::ShowMainWindowEvent;
|
||||
auto appEvent = new grpc::AppEvent;
|
||||
appEvent->set_allocated_showmainwindow(event);
|
||||
@ -237,8 +218,7 @@ SPStreamEvent newShowMainWindowEvent()
|
||||
/// \param[in] message The message.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newLoginError(grpc::LoginErrorType error, QString const &message)
|
||||
{
|
||||
SPStreamEvent newLoginError(grpc::LoginErrorType error, QString const &message) {
|
||||
auto event = new ::grpc::LoginErrorEvent;
|
||||
event->set_type(error);
|
||||
event->set_message(message.toStdString());
|
||||
@ -252,8 +232,7 @@ SPStreamEvent newLoginError(grpc::LoginErrorType error, QString const &message)
|
||||
/// \param[in] username The username.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newLoginTfaRequestedEvent(QString const &username)
|
||||
{
|
||||
SPStreamEvent newLoginTfaRequestedEvent(QString const &username) {
|
||||
auto event = new ::grpc::LoginTfaRequestedEvent;
|
||||
event->set_username(username.toStdString());
|
||||
auto loginEvent = new grpc::LoginEvent;
|
||||
@ -266,8 +245,7 @@ SPStreamEvent newLoginTfaRequestedEvent(QString const &username)
|
||||
/// \param[in] username The username.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newLoginTwoPasswordsRequestedEvent()
|
||||
{
|
||||
SPStreamEvent newLoginTwoPasswordsRequestedEvent() {
|
||||
auto event = new ::grpc::LoginTwoPasswordsRequestedEvent;
|
||||
auto loginEvent = new grpc::LoginEvent;
|
||||
loginEvent->set_allocated_twopasswordrequested(event);
|
||||
@ -280,8 +258,7 @@ SPStreamEvent newLoginTwoPasswordsRequestedEvent()
|
||||
/// \param[in] wasSignedOut Was the user signed-out.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newLoginFinishedEvent(QString const &userID, bool wasSignedOut)
|
||||
{
|
||||
SPStreamEvent newLoginFinishedEvent(QString const &userID, bool wasSignedOut) {
|
||||
auto event = new ::grpc::LoginFinishedEvent;
|
||||
event->set_userid(userID.toStdString());
|
||||
event->set_wassignedout(wasSignedOut);
|
||||
@ -295,8 +272,7 @@ SPStreamEvent newLoginFinishedEvent(QString const &userID, bool wasSignedOut)
|
||||
/// \param[in] userID The userID.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newLoginAlreadyLoggedInEvent(QString const &userID)
|
||||
{
|
||||
SPStreamEvent newLoginAlreadyLoggedInEvent(QString const &userID) {
|
||||
auto event = new ::grpc::LoginFinishedEvent;
|
||||
event->set_userid(userID.toStdString());
|
||||
auto loginEvent = new grpc::LoginEvent;
|
||||
@ -309,8 +285,7 @@ SPStreamEvent newLoginAlreadyLoggedInEvent(QString const &userID)
|
||||
/// \param[in] errorType The error type.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newUpdateErrorEvent(grpc::UpdateErrorType errorType)
|
||||
{
|
||||
SPStreamEvent newUpdateErrorEvent(grpc::UpdateErrorType errorType) {
|
||||
auto event = new grpc::UpdateErrorEvent;
|
||||
event->set_type(errorType);
|
||||
auto updateEvent = new grpc::UpdateEvent;
|
||||
@ -323,8 +298,7 @@ SPStreamEvent newUpdateErrorEvent(grpc::UpdateErrorType errorType)
|
||||
/// \param[in] version The version.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newUpdateManualReadyEvent(QString const &version)
|
||||
{
|
||||
SPStreamEvent newUpdateManualReadyEvent(QString const &version) {
|
||||
auto event = new grpc::UpdateManualReadyEvent;
|
||||
event->set_version(version.toStdString());
|
||||
auto updateEvent = new grpc::UpdateEvent;
|
||||
@ -336,8 +310,7 @@ SPStreamEvent newUpdateManualReadyEvent(QString const &version)
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return the event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newUpdateManualRestartNeededEvent()
|
||||
{
|
||||
SPStreamEvent newUpdateManualRestartNeededEvent() {
|
||||
auto event = new grpc::UpdateManualRestartNeededEvent;
|
||||
auto updateEvent = new grpc::UpdateEvent;
|
||||
updateEvent->set_allocated_manualrestartneeded(event);
|
||||
@ -349,8 +322,7 @@ SPStreamEvent newUpdateManualRestartNeededEvent()
|
||||
/// \param[in] version The version.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newUpdateForceEvent(QString const &version)
|
||||
{
|
||||
SPStreamEvent newUpdateForceEvent(QString const &version) {
|
||||
auto event = new grpc::UpdateForceEvent;
|
||||
event->set_version(version.toStdString());
|
||||
auto updateEvent = new grpc::UpdateEvent;
|
||||
@ -362,8 +334,7 @@ SPStreamEvent newUpdateForceEvent(QString const &version)
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return the event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newUpdateSilentRestartNeeded()
|
||||
{
|
||||
SPStreamEvent newUpdateSilentRestartNeeded() {
|
||||
auto event = new grpc::UpdateSilentRestartNeeded;
|
||||
auto updateEvent = new grpc::UpdateEvent;
|
||||
updateEvent->set_allocated_silentrestartneeded(event);
|
||||
@ -374,8 +345,7 @@ SPStreamEvent newUpdateSilentRestartNeeded()
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newUpdateIsLatestVersion()
|
||||
{
|
||||
SPStreamEvent newUpdateIsLatestVersion() {
|
||||
auto event = new grpc::UpdateIsLatestVersion;
|
||||
auto updateEvent = new grpc::UpdateEvent;
|
||||
updateEvent->set_allocated_islatestversion(event);
|
||||
@ -386,8 +356,7 @@ SPStreamEvent newUpdateIsLatestVersion()
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newUpdateCheckFinished()
|
||||
{
|
||||
SPStreamEvent newUpdateCheckFinished() {
|
||||
auto event = new grpc::UpdateCheckFinished;
|
||||
auto updateEvent = new grpc::UpdateEvent;
|
||||
updateEvent->set_allocated_checkfinished(event);
|
||||
@ -399,8 +368,7 @@ SPStreamEvent newUpdateCheckFinished()
|
||||
/// \param[in] errorType The error type.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newDiskCacheErrorEvent(grpc::DiskCacheErrorType errorType)
|
||||
{
|
||||
SPStreamEvent newDiskCacheErrorEvent(grpc::DiskCacheErrorType errorType) {
|
||||
auto event = new grpc::DiskCacheErrorEvent;
|
||||
event->set_type(errorType);
|
||||
auto cacheEvent = new grpc::DiskCacheEvent;
|
||||
@ -413,8 +381,7 @@ SPStreamEvent newDiskCacheErrorEvent(grpc::DiskCacheErrorType errorType)
|
||||
/// \param[in] path The path of the cache.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newDiskCachePathChangedEvent(QString const &path)
|
||||
{
|
||||
SPStreamEvent newDiskCachePathChangedEvent(QString const &path) {
|
||||
auto event = new grpc::DiskCachePathChangedEvent;
|
||||
event->set_path(path.toStdString());
|
||||
auto cacheEvent = new grpc::DiskCacheEvent;
|
||||
@ -426,20 +393,19 @@ SPStreamEvent newDiskCachePathChangedEvent(QString const &path)
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newDiskCachePathChangeFinishedEvent()
|
||||
{
|
||||
SPStreamEvent newDiskCachePathChangeFinishedEvent() {
|
||||
auto event = new grpc::DiskCachePathChangeFinishedEvent;
|
||||
auto cacheEvent = new grpc::DiskCacheEvent;
|
||||
cacheEvent->set_allocated_pathchangefinished(event);
|
||||
return wrapCacheEvent(cacheEvent);
|
||||
}
|
||||
|
||||
|
||||
//****************************************************************************************************************************************************
|
||||
/// \param[in] errorType The error type.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newMailServerSettingsErrorEvent(grpc::MailServerSettingsErrorType errorType)
|
||||
{
|
||||
SPStreamEvent newMailServerSettingsErrorEvent(grpc::MailServerSettingsErrorType errorType) {
|
||||
auto event = new grpc::MailServerSettingsErrorEvent;
|
||||
event->set_type(errorType);
|
||||
auto mailServerSettingsEvent = new grpc::MailServerSettingsEvent;
|
||||
@ -452,8 +418,7 @@ SPStreamEvent newMailServerSettingsErrorEvent(grpc::MailServerSettingsErrorType
|
||||
/// \param[in] settings The settings.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newMailServerSettingsChanged(grpc::ImapSmtpSettings const &settings)
|
||||
{
|
||||
SPStreamEvent newMailServerSettingsChanged(grpc::ImapSmtpSettings const &settings) {
|
||||
auto event = new grpc::MailServerSettingsChangedEvent;
|
||||
event->set_allocated_settings(new grpc::ImapSmtpSettings(settings));
|
||||
auto mailServerSettingsEvent = new grpc::MailServerSettingsEvent;
|
||||
@ -465,8 +430,7 @@ SPStreamEvent newMailServerSettingsChanged(grpc::ImapSmtpSettings const &setting
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newChangeMailServerSettingsFinished()
|
||||
{
|
||||
SPStreamEvent newChangeMailServerSettingsFinished() {
|
||||
auto event = new grpc::ChangeMailServerSettingsFinishedEvent;
|
||||
auto mailServerSettingsEvent = new grpc::MailServerSettingsEvent;
|
||||
mailServerSettingsEvent->set_allocated_changemailserversettingsfinished(event);
|
||||
@ -477,8 +441,7 @@ SPStreamEvent newChangeMailServerSettingsFinished()
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newChangeKeychainFinishedEvent()
|
||||
{
|
||||
SPStreamEvent newChangeKeychainFinishedEvent() {
|
||||
auto event = new grpc::ChangeKeychainFinishedEvent;
|
||||
auto keychainEvent = new grpc::KeychainEvent;
|
||||
keychainEvent->set_allocated_changekeychainfinished(event);
|
||||
@ -489,8 +452,7 @@ SPStreamEvent newChangeKeychainFinishedEvent()
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newHasNoKeychainEvent()
|
||||
{
|
||||
SPStreamEvent newHasNoKeychainEvent() {
|
||||
auto event = new grpc::HasNoKeychainEvent;
|
||||
auto keychainEvent = new grpc::KeychainEvent;
|
||||
keychainEvent->set_allocated_hasnokeychain(event);
|
||||
@ -501,8 +463,7 @@ SPStreamEvent newHasNoKeychainEvent()
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newRebuildKeychainEvent()
|
||||
{
|
||||
SPStreamEvent newRebuildKeychainEvent() {
|
||||
auto event = new grpc::RebuildKeychainEvent;
|
||||
auto keychainEvent = new grpc::KeychainEvent;
|
||||
keychainEvent->set_allocated_rebuildkeychain(event);
|
||||
@ -514,8 +475,7 @@ SPStreamEvent newRebuildKeychainEvent()
|
||||
/// \param[in] email The email.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newNoActiveKeyForRecipientEvent(QString const &email)
|
||||
{
|
||||
SPStreamEvent newNoActiveKeyForRecipientEvent(QString const &email) {
|
||||
auto event = new grpc::NoActiveKeyForRecipientEvent;
|
||||
event->set_email(email.toStdString());
|
||||
auto mailEvent = new grpc::MailEvent;
|
||||
@ -528,8 +488,7 @@ SPStreamEvent newNoActiveKeyForRecipientEvent(QString const &email)
|
||||
/// \param[in] address The address.
|
||||
/// /// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newAddressChangedEvent(QString const &address)
|
||||
{
|
||||
SPStreamEvent newAddressChangedEvent(QString const &address) {
|
||||
auto event = new grpc::AddressChangedEvent;
|
||||
event->set_address(address.toStdString());
|
||||
auto mailEvent = new grpc::MailEvent;
|
||||
@ -542,8 +501,7 @@ SPStreamEvent newAddressChangedEvent(QString const &address)
|
||||
/// \param[in] address The address.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newAddressChangedLogoutEvent(QString const &address)
|
||||
{
|
||||
SPStreamEvent newAddressChangedLogoutEvent(QString const &address) {
|
||||
auto event = new grpc::AddressChangedLogoutEvent;
|
||||
event->set_address(address.toStdString());
|
||||
auto mailEvent = new grpc::MailEvent;
|
||||
@ -555,8 +513,7 @@ SPStreamEvent newAddressChangedLogoutEvent(QString const &address)
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newApiCertIssueEvent()
|
||||
{
|
||||
SPStreamEvent newApiCertIssueEvent() {
|
||||
auto event = new grpc::ApiCertIssueEvent;
|
||||
auto mailEvent = new grpc::MailEvent;
|
||||
mailEvent->set_allocated_apicertissue(event);
|
||||
@ -568,8 +525,7 @@ SPStreamEvent newApiCertIssueEvent()
|
||||
/// \param[in] userID The userID.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newToggleSplitModeFinishedEvent(QString const &userID)
|
||||
{
|
||||
SPStreamEvent newToggleSplitModeFinishedEvent(QString const &userID) {
|
||||
auto event = new grpc::ToggleSplitModeFinishedEvent;
|
||||
event->set_userid(userID.toStdString());
|
||||
auto userEvent = new grpc::UserEvent;
|
||||
@ -582,8 +538,7 @@ SPStreamEvent newToggleSplitModeFinishedEvent(QString const &userID)
|
||||
/// \param[in] username The username.
|
||||
/// /// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newUserDisconnectedEvent(QString const &username)
|
||||
{
|
||||
SPStreamEvent newUserDisconnectedEvent(QString const &username) {
|
||||
auto event = new grpc::UserDisconnectedEvent;
|
||||
event->set_username(username.toStdString());
|
||||
auto userEvent = new grpc::UserEvent;
|
||||
@ -596,8 +551,7 @@ SPStreamEvent newUserDisconnectedEvent(QString const &username)
|
||||
/// \param[in] userID The userID.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newUserChangedEvent(QString const &userID)
|
||||
{
|
||||
SPStreamEvent newUserChangedEvent(QString const &userID) {
|
||||
auto event = new grpc::UserChangedEvent;
|
||||
event->set_userid(userID.toStdString());
|
||||
auto userEvent = new grpc::UserEvent;
|
||||
@ -610,8 +564,7 @@ SPStreamEvent newUserChangedEvent(QString const &userID)
|
||||
/// \param[in] errorCode The error errorCode.
|
||||
/// \return The event.
|
||||
//****************************************************************************************************************************************************
|
||||
SPStreamEvent newGenericErrorEvent(grpc::ErrorCode errorCode)
|
||||
{
|
||||
SPStreamEvent newGenericErrorEvent(grpc::ErrorCode errorCode) {
|
||||
auto event = new grpc::GenericErrorEvent;
|
||||
event->set_code(errorCode);
|
||||
return wrapGenericErrorEvent(event);
|
||||
|
||||
@ -24,8 +24,7 @@
|
||||
#include "GRPCUtils.h"
|
||||
|
||||
|
||||
namespace bridgepp
|
||||
{
|
||||
namespace bridgepp {
|
||||
|
||||
|
||||
// App events
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -28,8 +28,7 @@
|
||||
#include "grpc++/grpc++.h"
|
||||
|
||||
|
||||
namespace bridgepp
|
||||
{
|
||||
namespace bridgepp {
|
||||
|
||||
|
||||
typedef grpc::Status (grpc::Bridge::Stub::*SimpleMethod)(grpc::ClientContext *, const google::protobuf::Empty &, google::protobuf::Empty *);
|
||||
@ -46,8 +45,7 @@ typedef std::unique_ptr<grpc::ClientContext> UPClientContext;
|
||||
//****************************************************************************************************************************************************
|
||||
/// \brief gRPC client class. This class encapsulate the gRPC service, abstracting all data type conversions.
|
||||
//****************************************************************************************************************************************************
|
||||
class GRPCClient : public QObject
|
||||
{
|
||||
class GRPCClient : public QObject {
|
||||
Q_OBJECT
|
||||
public: // static member functions
|
||||
static void removeServiceConfigFile(); ///< Delete the service config file.
|
||||
@ -209,7 +207,7 @@ public:
|
||||
grpc::Status stopEventStreamReader(); ///< Stop the event stream.
|
||||
|
||||
private:
|
||||
void log(Log::Level level, QString const & message); ///< Log an event.
|
||||
void log(Log::Level level, QString const &message); ///< Log an event.
|
||||
void logTrace(QString const &message); ///< Log a trace event.
|
||||
void logDebug(QString const &message); ///< Log a debug event.
|
||||
void logError(QString const &message); ///< Log an error event.
|
||||
|
||||
@ -23,8 +23,7 @@
|
||||
using namespace bridgepp;
|
||||
|
||||
|
||||
namespace
|
||||
{
|
||||
namespace {
|
||||
|
||||
Exception const invalidFileException("The service configuration file is invalid"); // Exception for invalid config.
|
||||
Exception const couldNotSaveException("The service configuration file could not be saved"); ///< Exception for write errors.
|
||||
@ -42,11 +41,11 @@ QString const keyFileSocketPath = "fileSocketPath"; ///< The JSON key for the fi
|
||||
/// \param[in] object The JSON object containing the value.
|
||||
/// \param[in] key The key under which the value is stored.
|
||||
//****************************************************************************************************************************************************
|
||||
QString jsonStringValue(QJsonObject const &object, QString const &key)
|
||||
{
|
||||
QString jsonStringValue(QJsonObject const &object, QString const &key) {
|
||||
QJsonValue const v = object[key];
|
||||
if (!v.isString())
|
||||
if (!v.isString()) {
|
||||
throw invalidFileException;
|
||||
}
|
||||
return v.toString();
|
||||
}
|
||||
|
||||
@ -59,11 +58,11 @@ QString jsonStringValue(QJsonObject const &object, QString const &key)
|
||||
/// \param[in] object The JSON object containing the value.
|
||||
/// \param[in] key The key under which the value is stored.
|
||||
//****************************************************************************************************************************************************
|
||||
qint32 jsonIntValue(QJsonObject const &object, QString const &key)
|
||||
{
|
||||
qint32 jsonIntValue(QJsonObject const &object, QString const &key) {
|
||||
QJsonValue const v = object[key];
|
||||
if (!v.isDouble())
|
||||
if (!v.isDouble()) {
|
||||
throw invalidFileException;
|
||||
}
|
||||
return v.toInt();
|
||||
}
|
||||
|
||||
@ -76,13 +75,12 @@ qint32 jsonIntValue(QJsonObject const &object, QString const &key)
|
||||
/// \param[out] outError if not null and an error occurs, this variable contains a description of the error.
|
||||
/// \return true iff the operation was successful.
|
||||
//****************************************************************************************************************************************************
|
||||
bool GRPCConfig::load(QString const &path, QString *outError)
|
||||
{
|
||||
try
|
||||
{
|
||||
bool GRPCConfig::load(QString const &path, QString *outError) {
|
||||
try {
|
||||
QFile file(path);
|
||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
||||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||||
throw Exception("Could not open gRPC service config file.");
|
||||
}
|
||||
|
||||
QJsonDocument const doc = QJsonDocument::fromJson(file.readAll());
|
||||
QJsonObject const object = doc.object();
|
||||
@ -93,10 +91,10 @@ bool GRPCConfig::load(QString const &path, QString *outError)
|
||||
|
||||
return true;
|
||||
}
|
||||
catch (Exception const &e)
|
||||
{
|
||||
if (outError)
|
||||
catch (Exception const &e) {
|
||||
if (outError) {
|
||||
*outError = e.qwhat();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@ -107,10 +105,8 @@ bool GRPCConfig::load(QString const &path, QString *outError)
|
||||
/// \param[out] outError if not null and an error occurs, this variable contains a description of the error.
|
||||
/// \return true iff the operation was successful.
|
||||
//****************************************************************************************************************************************************
|
||||
bool GRPCConfig::save(QString const &path, QString *outError)
|
||||
{
|
||||
try
|
||||
{
|
||||
bool GRPCConfig::save(QString const &path, QString *outError) {
|
||||
try {
|
||||
QJsonObject object;
|
||||
object.insert(keyPort, port);
|
||||
object.insert(keyCert, cert);
|
||||
@ -118,19 +114,21 @@ bool GRPCConfig::save(QString const &path, QString *outError)
|
||||
object.insert(keyFileSocketPath, fileSocketPath);
|
||||
|
||||
QFile file(path);
|
||||
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
|
||||
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
|
||||
throw couldNotSaveException;
|
||||
}
|
||||
|
||||
QByteArray const array = QJsonDocument(object).toJson();
|
||||
if (array.size() != file.write(array))
|
||||
if (array.size() != file.write(array)) {
|
||||
throw couldNotSaveException;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
catch (Exception const &e)
|
||||
{
|
||||
if (outError)
|
||||
catch (Exception const &e) {
|
||||
if (outError) {
|
||||
*outError = e.qwhat();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -23,8 +23,7 @@
|
||||
//****************************************************************************************************************************************************
|
||||
/// Service configuration class.
|
||||
//****************************************************************************************************************************************************
|
||||
struct GRPCConfig
|
||||
{
|
||||
struct GRPCConfig {
|
||||
public: // data members
|
||||
qint32 port; ///< The port.
|
||||
QString cert; ///< The server TLS certificate.
|
||||
@ -36,5 +35,4 @@ public: // data members
|
||||
};
|
||||
|
||||
|
||||
|
||||
#endif //BRIDGE_PP_GRPC_CONFIG_H
|
||||
|
||||
@ -22,12 +22,10 @@
|
||||
using namespace grpc;
|
||||
|
||||
|
||||
namespace bridgepp
|
||||
{
|
||||
namespace bridgepp {
|
||||
|
||||
|
||||
namespace
|
||||
{
|
||||
namespace {
|
||||
|
||||
|
||||
ErrorInfo const unknownError { UNKNOWN_ERROR, QObject::tr("Unknown error"), QObject::tr("An unknown error occurred.") }; // Unknown error
|
||||
@ -36,7 +34,7 @@ ErrorInfo const unknownError { UNKNOWN_ERROR, QObject::tr("Unknown error"), QObj
|
||||
QList<ErrorInfo> const errorList {
|
||||
unknownError,
|
||||
{ TLS_CERT_EXPORT_ERROR, QObject::tr("Export error"), QObject::tr("The TLS certificate could not be exported.") },
|
||||
{ TLS_KEY_EXPORT_ERROR, QObject::tr("Export error"), QObject::tr("The TLS private key could not be exported.") },
|
||||
{ TLS_KEY_EXPORT_ERROR, QObject::tr("Export error"), QObject::tr("The TLS private key could not be exported.") },
|
||||
};
|
||||
|
||||
|
||||
@ -46,9 +44,8 @@ QList<ErrorInfo> const errorList {
|
||||
//****************************************************************************************************************************************************
|
||||
/// \param[in] error
|
||||
//****************************************************************************************************************************************************
|
||||
ErrorInfo errorInfo(grpc::ErrorCode code)
|
||||
{
|
||||
QList<ErrorInfo>::const_iterator it = std::find_if(errorList.begin(), errorList.end(), [code](ErrorInfo info) -> bool { return code == info.code;});
|
||||
ErrorInfo errorInfo(grpc::ErrorCode code) {
|
||||
QList<ErrorInfo>::const_iterator it = std::find_if(errorList.begin(), errorList.end(), [code](ErrorInfo info) -> bool { return code == info.code; });
|
||||
return errorList.end() == it ? unknownError : *it;
|
||||
}
|
||||
|
||||
|
||||
@ -22,22 +22,19 @@
|
||||
#include "../BridgeUtils.h"
|
||||
|
||||
|
||||
namespace bridgepp
|
||||
{
|
||||
namespace bridgepp {
|
||||
|
||||
|
||||
std::string const grpcMetadataServerTokenKey = "server-token";
|
||||
|
||||
|
||||
namespace
|
||||
{
|
||||
namespace {
|
||||
|
||||
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return the gRPC server config file name
|
||||
//****************************************************************************************************************************************************
|
||||
QString grpcServerConfigFilename()
|
||||
{
|
||||
QString grpcServerConfigFilename() {
|
||||
return "grpcServerConfig.json";
|
||||
}
|
||||
|
||||
@ -45,8 +42,7 @@ QString grpcServerConfigFilename()
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return the gRPC client config file name
|
||||
//****************************************************************************************************************************************************
|
||||
QString grpcClientConfigBaseFilename()
|
||||
{
|
||||
QString grpcClientConfigBaseFilename() {
|
||||
return "grpcClientConfig_%1.json";
|
||||
}
|
||||
|
||||
@ -54,8 +50,7 @@ QString grpcClientConfigBaseFilename()
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The server certificate file name
|
||||
//****************************************************************************************************************************************************
|
||||
QString serverCertificateFilename()
|
||||
{
|
||||
QString serverCertificateFilename() {
|
||||
return "cert.pem";
|
||||
}
|
||||
|
||||
@ -63,8 +58,7 @@ QString serverCertificateFilename()
|
||||
//****************************************************************************************************************************************************
|
||||
//
|
||||
//****************************************************************************************************************************************************
|
||||
QString serverKeyFilename()
|
||||
{
|
||||
QString serverKeyFilename() {
|
||||
return "key.pem";
|
||||
}
|
||||
|
||||
@ -83,8 +77,7 @@ bool useFileSocketForGRPC() {
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The absolute path of the service config path.
|
||||
//****************************************************************************************************************************************************
|
||||
QString grpcServerConfigPath()
|
||||
{
|
||||
QString grpcServerConfigPath() {
|
||||
return QDir(userConfigDir()).absoluteFilePath(grpcServerConfigFilename());
|
||||
}
|
||||
|
||||
@ -92,8 +85,7 @@ QString grpcServerConfigPath()
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The absolute path of the service config path.
|
||||
//****************************************************************************************************************************************************
|
||||
QString grpcClientConfigBasePath()
|
||||
{
|
||||
QString grpcClientConfigBasePath() {
|
||||
return QDir(userConfigDir()).absoluteFilePath(grpcClientConfigBaseFilename());
|
||||
}
|
||||
|
||||
@ -101,8 +93,7 @@ QString grpcClientConfigBasePath()
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The absolute path of the server certificate.
|
||||
//****************************************************************************************************************************************************
|
||||
QString serverCertificatePath()
|
||||
{
|
||||
QString serverCertificatePath() {
|
||||
return QDir(userConfigDir()).absoluteFilePath(serverCertificateFilename());
|
||||
}
|
||||
|
||||
@ -110,8 +101,7 @@ QString serverCertificatePath()
|
||||
//****************************************************************************************************************************************************
|
||||
/// \return The absolute path of the server key.
|
||||
//****************************************************************************************************************************************************
|
||||
QString serverKeyPath()
|
||||
{
|
||||
QString serverKeyPath() {
|
||||
|
||||
return QDir(userConfigDir()).absoluteFilePath(serverKeyFilename());
|
||||
}
|
||||
@ -122,19 +112,18 @@ QString serverKeyPath()
|
||||
/// \return The path of the created file.
|
||||
/// \return A null string if the file could not be saved..
|
||||
//****************************************************************************************************************************************************
|
||||
QString createClientConfigFile(QString const &token)
|
||||
{
|
||||
QString createClientConfigFile(QString const &token) {
|
||||
QString const basePath = grpcClientConfigBasePath();
|
||||
QString path, error;
|
||||
for (qint32 i = 0; i < 1000; ++i) // we try a decent amount of times
|
||||
{
|
||||
path = basePath.arg(i);
|
||||
if (!QFileInfo(path).exists())
|
||||
{
|
||||
if (!QFileInfo(path).exists()) {
|
||||
GRPCConfig config;
|
||||
config.token = token;
|
||||
if (!config.save(path))
|
||||
if (!config.save(path)) {
|
||||
return QString();
|
||||
}
|
||||
return path;
|
||||
}
|
||||
}
|
||||
@ -147,10 +136,8 @@ QString createClientConfigFile(QString const &token)
|
||||
/// \param[in] level The Log::Level.
|
||||
/// \return The grpc::LogLevel.
|
||||
//****************************************************************************************************************************************************
|
||||
grpc::LogLevel logLevelToGRPC(Log::Level level)
|
||||
{
|
||||
switch (level)
|
||||
{
|
||||
grpc::LogLevel logLevelToGRPC(Log::Level level) {
|
||||
switch (level) {
|
||||
case Log::Level::Panic:
|
||||
return grpc::LogLevel::LOG_PANIC;
|
||||
case Log::Level::Fatal:
|
||||
@ -175,10 +162,8 @@ grpc::LogLevel logLevelToGRPC(Log::Level level)
|
||||
/// \param[in] level The level::LogLevel.
|
||||
/// \return The Log::Level.
|
||||
//****************************************************************************************************************************************************
|
||||
Log::Level logLevelFromGRPC(grpc::LogLevel level)
|
||||
{
|
||||
switch (level)
|
||||
{
|
||||
Log::Level logLevelFromGRPC(grpc::LogLevel level) {
|
||||
switch (level) {
|
||||
case grpc::LOG_PANIC:
|
||||
return Log::Level::Panic;
|
||||
case grpc::LOG_FATAL:
|
||||
@ -203,10 +188,8 @@ Log::Level logLevelFromGRPC(grpc::LogLevel level)
|
||||
/// \param[in] state The user state.
|
||||
/// \return The gRPC user state.
|
||||
//****************************************************************************************************************************************************
|
||||
grpc::UserState userStateToGRPC(UserState state)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
grpc::UserState userStateToGRPC(UserState state) {
|
||||
switch (state) {
|
||||
case UserState::SignedOut:
|
||||
return grpc::UserState::SIGNED_OUT;
|
||||
case UserState::Locked:
|
||||
@ -223,16 +206,14 @@ grpc::UserState userStateToGRPC(UserState state)
|
||||
/// \param[in] state The gRPC user state
|
||||
/// \return the user state
|
||||
//****************************************************************************************************************************************************
|
||||
UserState userStateFromGRPC(grpc::UserState state)
|
||||
{
|
||||
switch (state)
|
||||
{
|
||||
UserState userStateFromGRPC(grpc::UserState state) {
|
||||
switch (state) {
|
||||
case grpc::UserState::SIGNED_OUT:
|
||||
return UserState::SignedOut;
|
||||
case grpc::UserState::LOCKED:
|
||||
return UserState::Locked;
|
||||
case grpc::UserState::CONNECTED:
|
||||
return UserState ::Connected;
|
||||
return UserState::Connected;
|
||||
default:
|
||||
throw Exception(QString("unknown gRPC user state %1.").arg(qint32(state)));
|
||||
}
|
||||
@ -243,16 +224,16 @@ UserState userStateFromGRPC(grpc::UserState state)
|
||||
/// \param[in] grpcUser The gRPC user.
|
||||
/// \return user The user.
|
||||
//****************************************************************************************************************************************************
|
||||
SPUser userFromGRPC(grpc::User const &grpcUser)
|
||||
{
|
||||
SPUser userFromGRPC(grpc::User const &grpcUser) {
|
||||
SPUser user = User::newUser(nullptr);
|
||||
|
||||
user->setID(QString::fromStdString(grpcUser.id()));
|
||||
user->setUsername(QString::fromStdString(grpcUser.username()));
|
||||
user->setPassword(QString::fromStdString(grpcUser.password()));
|
||||
QStringList addresses;
|
||||
for (int j = 0; j < grpcUser.addresses_size(); ++j)
|
||||
for (int j = 0; j < grpcUser.addresses_size(); ++j) {
|
||||
addresses.append(QString::fromStdString(grpcUser.addresses(j)));
|
||||
}
|
||||
user->setAddresses(addresses);
|
||||
user->setAvatarText(QString::fromStdString(grpcUser.avatartext()));
|
||||
user->setState(userStateFromGRPC(grpcUser.state()));
|
||||
@ -268,14 +249,14 @@ SPUser userFromGRPC(grpc::User const &grpcUser)
|
||||
/// \param[in] user the user.
|
||||
/// \param[out] outGRPCUser The GRPC user.
|
||||
//****************************************************************************************************************************************************
|
||||
void userToGRPC(User const &user, grpc::User &outGRPCUser)
|
||||
{
|
||||
void userToGRPC(User const &user, grpc::User &outGRPCUser) {
|
||||
outGRPCUser.set_id(user.id().toStdString());
|
||||
outGRPCUser.set_username(user.username().toStdString());
|
||||
outGRPCUser.set_password(user.password().toStdString());
|
||||
outGRPCUser.clear_addresses();
|
||||
for (QString const& address: user.addresses())
|
||||
for (QString const &address: user.addresses()) {
|
||||
outGRPCUser.add_addresses(address.toStdString());
|
||||
}
|
||||
outGRPCUser.set_avatartext(user.avatarText().toStdString());
|
||||
outGRPCUser.set_state(userStateToGRPC(user.state()));
|
||||
outGRPCUser.set_splitmode(user.splitMode());
|
||||
@ -288,14 +269,14 @@ void userToGRPC(User const &user, grpc::User &outGRPCUser)
|
||||
/// \return The path to a file that can be used for a gRPC file socket.
|
||||
/// \return A null string if no path could be found.
|
||||
//****************************************************************************************************************************************************
|
||||
QString getAvailableFileSocketPath()
|
||||
{
|
||||
QString getAvailableFileSocketPath() {
|
||||
QDir const tempDir(QStandardPaths::writableLocation(QStandardPaths::TempLocation));
|
||||
for (qint32 i = 0; i < 10000; i++) {
|
||||
QString const path = tempDir.absoluteFilePath(QString("bridge_%1.sock").arg(qint32(i), 4, 10, QChar('0')));
|
||||
QFile f(path);
|
||||
if ((!f.exists()) || f.remove())
|
||||
if ((!f.exists()) || f.remove()) {
|
||||
return path;
|
||||
}
|
||||
}
|
||||
|
||||
return QString();
|
||||
|
||||
@ -25,8 +25,7 @@
|
||||
#include "bridge.grpc.pb.h"
|
||||
|
||||
|
||||
namespace bridgepp
|
||||
{
|
||||
namespace bridgepp {
|
||||
|
||||
|
||||
extern std::string const grpcMetadataServerTokenKey; ///< The key for the server token stored in the gRPC calls context metadata.
|
||||
|
||||
Reference in New Issue
Block a user