GODT-1671: Implement Quit & Restart mechanism

This commit is contained in:
Romain LE JEUNE
2022-07-28 16:39:56 +02:00
committed by Jakub
parent f44d1c4b9d
commit 22a8aab151
26 changed files with 1255 additions and 701 deletions

View File

@ -42,6 +42,10 @@ const (
appName = "Proton Mail Launcher" appName = "Proton Mail Launcher"
configName = "bridge" configName = "bridge"
exeName = "proton-bridge" exeName = "proton-bridge"
guiName = "proton-bridge-gui"
FlagCLI = "--cli"
FlagLauncher = "--launcher"
) )
func main() { //nolint:funlen func main() { //nolint:funlen
@ -86,9 +90,15 @@ func main() { //nolint:funlen
versioner := versioner.New(updatesPath) versioner := versioner.New(updatesPath)
exe, err := getPathToUpdatedExecutable(exeName, versioner, kr, reporter) exeToLaunch := guiName
args := os.Args[1:]
if isCliMode(&args) {
exeToLaunch = exeName
}
exe, err := getPathToUpdatedExecutable(exeToLaunch, versioner, kr, reporter)
if err != nil { if err != nil {
if exe, err = getFallbackExecutable(exeName, versioner); err != nil { if exe, err = getFallbackExecutable(exeToLaunch, versioner); err != nil {
logrus.WithError(err).Fatal("Failed to find any launchable executable") logrus.WithError(err).Fatal("Failed to find any launchable executable")
} }
} }
@ -98,7 +108,7 @@ func main() { //nolint:funlen
logrus.WithError(err).Fatal("Failed to determine path to launcher") logrus.WithError(err).Fatal("Failed to determine path to launcher")
} }
cmd := execabs.Command(exe, appendLauncherPath(launcher, os.Args[1:])...) //nolint:gosec cmd := execabs.Command(exe, appendLauncherPath(launcher, args)...) //nolint:gosec
cmd.Stdin = os.Stdin cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout
@ -122,7 +132,7 @@ func appendLauncherPath(path string, args []string) []string {
hasFlag := false hasFlag := false
for k, v := range res { for k, v := range res {
if v != "--launcher" { if v != FlagLauncher {
continue continue
} }
@ -136,12 +146,22 @@ func appendLauncherPath(path string, args []string) []string {
} }
if !hasFlag { if !hasFlag {
res = append(res, "--launcher", path) res = append(res, FlagLauncher, path)
} }
return res return res
} }
func isCliMode(args *[]string) bool {
for _, v := range *args {
if v == FlagCLI {
return true
}
}
return false
}
func getPathToUpdatedExecutable( func getPathToUpdatedExecutable(
name string, name string,
versioner *versioner.Versioner, versioner *versioner.Versioner,

View File

@ -93,10 +93,11 @@ type Base struct {
TLS *tls.TLS TLS *tls.TLS
Autostart *autostart.App Autostart *autostart.App
Name string // the app's name Name string // the app's name
usage string // the app's usage description usage string // the app's usage description
command string // the command used to launch the app (either the exe path or the launcher path) command string // the command used to launch the app (either the exe path or the launcher path)
restart bool // whether the app is currently set to restart restart bool // whether the app is currently set to restart
launcher string // launcher to be used if not set in args
teardown []func() error // actions to perform when app is exiting teardown []func() error // actions to perform when app is exiting
} }
@ -322,6 +323,11 @@ func (b *Base) SetToRestart() {
b.restart = true b.restart = true
} }
func (b *Base) ForceLauncher(launcher string) {
b.launcher = launcher
b.setupLauncher(launcher)
}
// AddTeardownAction adds an action to perform during app teardown. // AddTeardownAction adds an action to perform during app teardown.
func (b *Base) AddTeardownAction(fn func() error) { func (b *Base) AddTeardownAction(fn func() error) {
b.teardown = append(b.teardown, fn) b.teardown = append(b.teardown, fn)
@ -335,10 +341,7 @@ func (b *Base) wrapMainLoop(appMainLoop func(*Base, *cli.Context) error) cli.Act
// If launcher was used to start the app, use that for restart // If launcher was used to start the app, use that for restart
// and autostart. // and autostart.
if launcher := c.String(FlagLauncher); launcher != "" { if launcher := c.String(FlagLauncher); launcher != "" {
b.command = launcher b.setupLauncher(launcher)
// Bridge supports no-window option which we should use
// for autostart.
b.Autostart.Exec = []string{launcher, "--" + FlagNoWindow}
} }
if c.Bool(flagCPUProfile) { if c.Bool(flagCPUProfile) {
@ -402,3 +405,10 @@ func (b *Base) doTeardown() error {
return nil return nil
} }
func (b *Base) setupLauncher(launcher string) {
b.command = launcher
// Bridge supports no-window option which we should use
// for autostart.
b.Autostart.Exec = []string{launcher, "--" + FlagNoWindow}
}

View File

@ -38,6 +38,10 @@ func (b *Base) restartApp(crash bool) error {
args = os.Args[1:] args = os.Args[1:]
} }
if b.launcher != "" {
args = forceLauncherFlag(args, b.launcher)
}
logrus. logrus.
WithField("command", b.command). WithField("command", b.command).
WithField("args", args). WithField("args", args).
@ -78,3 +82,29 @@ func incrementRestartFlag(args []string) []string {
return res return res
} }
// forceLauncherFlag replace or add the launcher args with the one set in the app.
func forceLauncherFlag(args []string, launcher string) []string {
res := append([]string{}, args...)
hasFlag := false
for k, v := range res {
if v != "--launcher" {
continue
}
if k+1 >= len(res) {
continue
}
hasFlag = true
res[k+1] = launcher
}
if !hasFlag {
res = append(res, "--launcher", launcher)
}
return res
}

View File

@ -9,8 +9,6 @@ rcc.qrc
rcc_cgo_*.go rcc_cgo_*.go
*.qmlc *.qmlc
# QtCreator env
CMakeLists.txt.user
# Generated file # Generated file
bridge-gui/Version.h bridge-gui/Version.h
bridge-gui/Config.h

View File

@ -34,7 +34,7 @@ QString const exeSuffix = ".exe";
QString const exeSuffix; QString const exeSuffix;
#endif #endif
QString const exeName = "bridge" + exeSuffix; ///< The bridge executable file name. QString const exeName = "proton-bridge" + exeSuffix; ///< The bridge executable file name.*
} }
@ -55,9 +55,10 @@ QString BridgeMonitor::locateBridgeExe()
/// \param[in] exePath The path of the Bridge executable. /// \param[in] exePath The path of the Bridge executable.
/// \param[in] parent The parent object of the worker. /// \param[in] parent The parent object of the worker.
//**************************************************************************************************************************************************** //****************************************************************************************************************************************************
BridgeMonitor::BridgeMonitor(QString const &exePath, QObject *parent) BridgeMonitor::BridgeMonitor(QString const &exePath, QStringList const &args, QObject *parent)
: Worker(parent) : Worker(parent)
, exePath_(exePath) , exePath_(exePath)
, args_(args)
{ {
QFileInfo fileInfo(exePath); QFileInfo fileInfo(exePath);
if (!fileInfo.exists()) if (!fileInfo.exists())
@ -77,16 +78,23 @@ void BridgeMonitor::run()
emit started(); emit started();
QProcess p; QProcess p;
p.start(exePath_, QStringList()); p.start(exePath_, args_);
p.waitForStarted(); p.waitForStarted();
status_.running = true;
status_.pid = p.processId();
while (!p.waitForFinished(100)) while (!p.waitForFinished(100))
{ {
// we discard output from bridge, it's logged to file on bridge side. // we discard output from bridge, it's logged to file on bridge side.
p.readAllStandardError(); p.readAllStandardError();
p.readAllStandardOutput(); p.readAllStandardOutput();
} }
emit processExited(p.exitCode());
status_.running = false;
status_.returnCode = p.exitCode();
emit processExited(status_.returnCode );
emit finished(); emit finished();
} }
catch (Exception const &e) catch (Exception const &e)
@ -94,3 +102,11 @@ void BridgeMonitor::run()
emit error(e.qwhat()); emit error(e.qwhat());
} }
} }
//****************************************************************************************************************************************************
/// \return status of the monitored process
//****************************************************************************************************************************************************
const BridgeMonitor::MonitorStatus& BridgeMonitor::getStatus()
{
return status_;
}

View File

@ -33,8 +33,14 @@ class BridgeMonitor: public bridgepp::Worker
public: // static member functions public: // static member functions
static QString locateBridgeExe(); ///< Try to find the bridge executable path. static QString locateBridgeExe(); ///< Try to find the bridge executable path.
struct MonitorStatus {
bool running = false;
int returnCode = 0;
qint64 pid = 0;
};
public: // member functions. public: // member functions.
BridgeMonitor(QString const& exePath, QObject *parent); ///< Default constructor. BridgeMonitor(QString const& exePath, QStringList const &args, QObject *parent); ///< Default constructor.
BridgeMonitor(BridgeMonitor const&) = delete; ///< Disabled copy-constructor. BridgeMonitor(BridgeMonitor const&) = delete; ///< Disabled copy-constructor.
BridgeMonitor(BridgeMonitor&&) = delete; ///< Disabled assignment copy-constructor. BridgeMonitor(BridgeMonitor&&) = delete; ///< Disabled assignment copy-constructor.
~BridgeMonitor() override = default; ///< Destructor. ~BridgeMonitor() override = default; ///< Destructor.
@ -42,11 +48,14 @@ public: // member functions.
BridgeMonitor& operator=(BridgeMonitor&&) = delete; ///< Disabled move assignment operator. BridgeMonitor& operator=(BridgeMonitor&&) = delete; ///< Disabled move assignment operator.
void run() override; ///< Run the worker. void run() override; ///< Run the worker.
const MonitorStatus& getStatus();
signals: signals:
void processExited(int code); ///< Slot for the exiting of the process void processExited(int code); ///< Slot for the exiting of the process.
private: // data members private: // data members
QString const exePath_; ///< The path to the bridge executable. QString const exePath_; ///< The path to the bridge executable.
QStringList args_; ///< arguments to be passed to the brigde.
MonitorStatus status_; ///< Status of the monitoring.
}; };

View File

@ -34,6 +34,7 @@ else()
message(STATUS "Bridge version is ${BRIDGE_APP_VERSION}") message(STATUS "Bridge version is ${BRIDGE_APP_VERSION}")
endif() endif()
configure_file(Version.h.in ${CMAKE_SOURCE_DIR}/Version.h)
if (APPLE) # On macOS, we have some Objective-C++ code in DockIcon to deal with the dock icon. if (APPLE) # On macOS, we have some Objective-C++ code in DockIcon to deal with the dock icon.
enable_language(OBJC OBJCXX) enable_language(OBJC OBJCXX)
endif() endif()
@ -90,7 +91,7 @@ add_executable(bridge-gui
QMLBackend.cpp QMLBackend.h QMLBackend.cpp QMLBackend.h
UserList.cpp UserList.h UserList.cpp UserList.h
${DOCK_ICON_SRC_FILE} DockIcon/DockIcon.h ${DOCK_ICON_SRC_FILE} DockIcon/DockIcon.h
) UserDirectories.h)
target_precompile_headers(bridge-gui PRIVATE Pch.h) target_precompile_headers(bridge-gui PRIVATE Pch.h)
target_include_directories(bridge-gui PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_include_directories(bridge-gui PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})

View File

@ -0,0 +1,24 @@
// Copyright (c) 2022 Proton AG
//
// This file is part of Proton Mail Bridge.
//
// Proton Mail Bridge 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.
//
// Proton Mail Bridge 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 Proton Mail Bridge. If not, see <https://www.gnu.org/licenses/>.
#ifndef BRIDGE_GUI_CONFIG_H
#define BRIDGE_GUI_CONFIG_H
#cmakedefine ATTACH_MODE @ATTACH_MODE@
#endif // BRIDGE_GUI_CONFIG_H

View File

@ -83,7 +83,7 @@ void QMLBackend::connectGrpcEvents()
// app events // app events
connect(client, &GRPCClient::internetStatus, this, [&](bool isOn) { if (isOn) emit internetOn(); else emit internetOff(); }); connect(client, &GRPCClient::internetStatus, this, [&](bool isOn) { if (isOn) emit internetOn(); else emit internetOff(); });
connect(client, &GRPCClient::toggleAutostartFinished, this, &QMLBackend::toggleAutostartFinished); connect(client, &GRPCClient::toggleAutostartFinished, this, &QMLBackend::toggleAutostartFinished);
connect(client, &GRPCClient::resetFinished, this, &QMLBackend::resetFinished); connect(client, &GRPCClient::resetFinished, this, &QMLBackend::onResetFinished);
connect(client, &GRPCClient::reportBugFinished, this, &QMLBackend::reportBugFinished); connect(client, &GRPCClient::reportBugFinished, this, &QMLBackend::reportBugFinished);
connect(client, &GRPCClient::reportBugSuccess, this, &QMLBackend::bugReportSendSuccess); connect(client, &GRPCClient::reportBugSuccess, this, &QMLBackend::bugReportSendSuccess);
connect(client, &GRPCClient::reportBugError, this, &QMLBackend::bugReportSendError); connect(client, &GRPCClient::reportBugError, this, &QMLBackend::bugReportSendError);
@ -220,7 +220,12 @@ void QMLBackend::quit()
void QMLBackend::restart() void QMLBackend::restart()
{ {
app().grpc().restart(); app().grpc().restart();
app().log().error("RESTART is not implemented"); /// \todo GODT-1671 implement restart. app().grpc().quit();
}
void QMLBackend::forceLauncher(QString launcher)
{
app().grpc().forceLauncher(launcher);
} }
@ -333,3 +338,12 @@ void QMLBackend::triggerReset()
{ {
app().grpc().triggerReset(); app().grpc().triggerReset();
} }
//****************************************************************************************************************************************************
//
//****************************************************************************************************************************************************
void QMLBackend::onResetFinished()
{
emit resetFinished();
this->restart();
}

View File

@ -150,11 +150,13 @@ public slots: // slot for signals received from QML -> To be forwarded to Bridge
void guiReady(); // _ func() `slot:"guiReady"` void guiReady(); // _ func() `slot:"guiReady"`
void quit(); // _ func() `slot:"quit"` void quit(); // _ func() `slot:"quit"`
void restart(); // _ func() `slot:"restart"` void restart(); // _ func() `slot:"restart"`
void forceLauncher(QString launcher); // _ func() `slot:"forceLauncher"`
void checkUpdates(); // _ func() `slot:"checkUpdates"` void checkUpdates(); // _ func() `slot:"checkUpdates"`
void installUpdate(); // _ func() `slot:"installUpdate"` void installUpdate(); // _ func() `slot:"installUpdate"`
void triggerReset(); // _ func() `slot:"triggerReset"` void triggerReset(); // _ func() `slot:"triggerReset"`
void reportBug(QString const &description, QString const& address, QString const &emailClient, bool includeLogs) { void reportBug(QString const &description, QString const& address, QString const &emailClient, bool includeLogs) {
app().grpc().reportBug(description, address, emailClient, includeLogs); } // _ func(description, address, emailClient string, includeLogs bool) `slot:"reportBug"` app().grpc().reportBug(description, address, emailClient, includeLogs); } // _ func(description, address, emailClient string, includeLogs bool) `slot:"reportBug"`
void onResetFinished();
signals: // Signals received from the Go backend, to be forwarded to QML signals: // Signals received from the Go backend, to be forwarded to QML
void toggleAutostartFinished(); // _ func() `signal:"toggleAutostartFinished"` void toggleAutostartFinished(); // _ func() `signal:"toggleAutostartFinished"`

View File

@ -0,0 +1,79 @@
//
// Created by romain on 01/08/22.
//
#ifndef PROTON_BRIDGE_GUI_USERDIRECTORIES_H
#define PROTON_BRIDGE_GUI_USERDIRECTORIES_H
#include <bridgepp/Exception/Exception.h>
using namespace bridgepp;
namespace UserDirectories {
QString const configFolder = "protonmail/bridge";
//****************************************************************************************************************************************************
/// \return user configuration directory used by bridge (based on Golang OS/File's UserConfigDir).
//****************************************************************************************************************************************************
static const QString UserConfigDir()
{
QString dir;
#ifdef Q_OS_WIN
dir = qgetenv ("AppData");
if (dir.isEmpty())
throw Exception("%AppData% is not defined.");
#elif defined(Q_OS_IOS) || defined(Q_OS_DARWIN)
dir = qgetenv ("HOME");
if (dir.isEmpty())
throw Exception("$HOME is not defined.");
dir += "/Library/Application Support";
#else
dir = qgetenv ("XDG_CONFIG_HOME");
if (dir.isEmpty())
dir = qgetenv ("HOME");
if (dir.isEmpty())
throw Exception("neither $XDG_CONFIG_HOME nor $HOME are defined");
dir += "/.config";
#endif
QString folder = dir + "/" + configFolder;
QDir().mkpath(folder);
return folder;
}
//****************************************************************************************************************************************************
/// \return user configuration directory used by bridge (based on Golang OS/File's UserCacheDir).
//****************************************************************************************************************************************************
static const QString UserCacheDir()
{
QString dir;
#ifdef Q_OS_WIN
dir = qgetenv ("LocalAppData");
if (dir.isEmpty())
throw Exception("%LocalAppData% is not defined.");
#elif defined(Q_OS_IOS) || defined(Q_OS_DARWIN)
dir = qgetenv ("HOME");
if (dir.isEmpty())
throw Exception("$HOME is not defined.");
dir += "/Library/Caches";
#else
dir = qgetenv ("XDG_CACHE_HOME");
if (dir.isEmpty())
dir = qgetenv ("HOME");
if (dir.isEmpty())
throw Exception("neither XDG_CACHE_HOME nor $HOME are defined");
dir += "/.cache";
#endif
QString folder = dir + "/" + configFolder;
QDir().mkpath(folder);
return folder;
}
};
#endif //PROTON_BRIDGE_GUI_USERDIRECTORIES_H

View File

@ -19,6 +19,7 @@
#include "QMLBackend.h" #include "QMLBackend.h"
#include "BridgeMonitor.h" #include "BridgeMonitor.h"
#include "Version.h" #include "Version.h"
#include "UserDirectories.h"
#include <bridgepp/Log/Log.h> #include <bridgepp/Log/Log.h>
#include <bridgepp/Exception/Exception.h> #include <bridgepp/Exception/Exception.h>
@ -26,6 +27,13 @@
using namespace bridgepp; using namespace bridgepp;
namespace
{
QString const launcherFlag = "--launcher"; ///< launcher flag parameter used for bridge.
QString const bridgeLock = "bridge-gui.lock"; ///< file name used for the lock file.
}
//**************************************************************************************************************************************************** //****************************************************************************************************************************************************
/// // initialize the Qt application. /// // initialize the Qt application.
//**************************************************************************************************************************************************** //****************************************************************************************************************************************************
@ -84,56 +92,94 @@ QQmlComponent *createRootQmlComponent(QQmlApplicationEngine &engine)
//**************************************************************************************************************************************************** //****************************************************************************************************************************************************
/// \param[in] exePath The path of the Bridge executable. If empty, the function will try to locate the bridge application. /// \param[in] lock The lock file to be checked.
/// \return True if the lock can be taken, false otherwize.
//**************************************************************************************************************************************************** //****************************************************************************************************************************************************
void launchBridge(QString const &exePath) bool checkSingleInstance(QLockFile &lock)
{
lock.setStaleLockTime(0);
if (!lock.tryLock())
{
qint64 pid;
QString hostname, appName, details;
if (lock.getLockInfo(&pid, &hostname, &appName))
details = QString("(PID : %1 - Host : %2 - App : %3)").arg(pid).arg(hostname, appName);
app().log().error(QString("Instance already exists %1 %2").arg(lock.fileName(), details));
return false;
}
else
{
app().log().info(QString("lock file created %1").arg(lock.fileName()));
}
return true;
}
//****************************************************************************************************************************************************
/// \param [in] argc number of arguments passed to the application.
/// \param [in] argv list of arguments passed to the application.
/// \param [out] args list of arguments passed to the application as a QStringList.
/// \param [out] launcher launcher used in argument, forced to self application if not specify.
/// \param[out] outAttach The value for the 'attach' command-line parameter.
//****************************************************************************************************************************************************
void parseArguments(int argc, char *argv[], QStringList& args, QString& launcher, bool &outAttach) {
bool flagFound = false;
launcher = QString::fromLocal8Bit(argv[0]);
// for unknown reasons, on Windows QCoreApplication::arguments() frequently returns an empty list, which is incorrect, so we rebuild the argument
// list from the original argc and argv values.
for (int i = 1; i < argc; i++) {
QString const &arg = QString::fromLocal8Bit(argv[i]);
// we can't use QCommandLineParser here since it will fails on unknown options.
// Arguments may contain some bridge flags.
if (arg == launcherFlag)
{
args.append(arg);
launcher = QString::fromLocal8Bit(argv[++i]);
args.append(launcher);
flagFound = true;
}
#ifdef QT_DEBUG
else if (arg == "--attach" || arg == "-a")
{
// we don't keep the attach mode within the args since we don't need it for Bridge.
outAttach = true;
}
#endif
else
{
args.append(arg);
}
}
if (!flagFound)
{
// add bridge-gui as launcher
args.append(launcherFlag);
args.append(launcher);
}
}
//****************************************************************************************************************************************************
/// \param [in] args list of arguments to pass to bridge.
//****************************************************************************************************************************************************
void launchBridge(QStringList const &args)
{ {
UPOverseer& overseer = app().bridgeOverseer(); UPOverseer& overseer = app().bridgeOverseer();
overseer.reset(); overseer.reset();
QString bridgeExePath = exePath; const QString bridgeExePath = BridgeMonitor::locateBridgeExe();
if (exePath.isEmpty())
bridgeExePath = BridgeMonitor::locateBridgeExe();
if (bridgeExePath.isEmpty()) if (bridgeExePath.isEmpty())
throw Exception("Could not locate the bridge executable path"); throw Exception("Could not locate the bridge executable path");
else else
app().log().debug(QString("Bridge executable path: %1").arg(QDir::toNativeSeparators(bridgeExePath))); app().log().debug(QString("Bridge executable path: %1").arg(QDir::toNativeSeparators(bridgeExePath)));
overseer = std::make_unique<Overseer>(new BridgeMonitor(bridgeExePath, nullptr), nullptr); overseer = std::make_unique<Overseer>(new BridgeMonitor(bridgeExePath, args, nullptr), nullptr);
overseer->startWorker(true); overseer->startWorker(true);
} }
//****************************************************************************************************************************************************
/// \param[in] argc The number of command-line arguments.
/// \param[in] argv The list of command line arguments.
/// \param[out] outAttach The value for the 'attach' command-line parameter.
/// \param[out] outExePath The value for the 'bridge-exe-path' command-line parameter.
//****************************************************************************************************************************************************
void parseArguments(int argc, char **argv, bool &outAttach, QString &outExePath)
{
// for unknown reasons, on Windows QCoreApplication::arguments() frequently returns an empty list, which is incorrect, so we rebuild the argument
// list from the original argc and argv values.
QStringList args;
for (int i = 0; i < argc; i++)
args.append(QString::fromLocal8Bit(argv[i]));
// We do not want to 'advertise' the following switches, so we do not offer a '-h/--help' option.
// we have not yet connected to Bridge, we do not know the application version number, so we do not offer a -v/--version switch.
QCommandLineParser parser;
parser.setApplicationDescription("Proton Mail Bridge");
QCommandLineOption attachOption(QStringList() << "attach" << "a", "attach to an existing bridge process");
parser.addOption(attachOption);
QCommandLineOption exePathOption(QStringList() << "bridge-exe-path" << "b", "bridge executable path", "path", QString());
parser.addOption(exePathOption);
parser.process(args);
outAttach = parser.isSet(attachOption);
outExePath = parser.value(exePathOption);
}
//**************************************************************************************************************************************************** //****************************************************************************************************************************************************
// //
//**************************************************************************************************************************************************** //****************************************************************************************************************************************************
@ -166,14 +212,19 @@ int main(int argc, char *argv[])
QGuiApplication guiApp(argc, argv); QGuiApplication guiApp(argc, argv);
initQtApplication(); initQtApplication();
bool attach = false;
QString exePath;
parseArguments(argc, argv, attach, exePath);
Log &log = initLog(); Log &log = initLog();
QLockFile lock(UserDirectories::UserCacheDir() + "/" + bridgeLock);
if (!checkSingleInstance(lock))
return EXIT_FAILURE;
QStringList args;
QString launcher;
bool attach = false;
parseArguments(argc, argv, args, launcher, attach);
if (!attach) if (!attach)
launchBridge(exePath); launchBridge(args);
app().backend().init(); app().backend().init();
@ -185,15 +236,34 @@ int main(int argc, char *argv[])
BridgeMonitor *bridgeMonitor = app().bridgeMonitor(); BridgeMonitor *bridgeMonitor = app().bridgeMonitor();
bool bridgeExited = false; bool bridgeExited = false;
bool startError = false;
QMetaObject::Connection connection; QMetaObject::Connection connection;
if (bridgeMonitor) if (bridgeMonitor)
connection = QObject::connect(bridgeMonitor, &BridgeMonitor::processExited, [&](int returnCode) { {
// GODT-1671 We need to find a 'safe' way to check if Bridge crashed and restart instead of just quitting. Is returnCode enough? const BridgeMonitor::MonitorStatus& status = bridgeMonitor->getStatus();
bridgeExited = true;// clazy:exclude=lambda-in-connect if (!status.running && !attach)
qGuiApp->exit(returnCode); {
}); // BridgeMonitor already stopped meaning we are attached to an orphan Bridge.
// Restart the full process to be sure there is no more bridge orphans
app().log().error("Found orphan bridge, need to restart.");
app().backend().forceLauncher(launcher);
app().backend().restart();
bridgeExited = true;
startError = true;
}
else
{
app().log().debug(QString("Monitoring Bridge PID : %1").arg(status.pid));
connection = QObject::connect(bridgeMonitor, &BridgeMonitor::processExited, [&](int returnCode) {
bridgeExited = true;// clazy:exclude=lambda-in-connect
qGuiApp->exit(returnCode);
});
}
}
int const result = QGuiApplication::exec(); int result = 0;
if (!startError)
result = QGuiApplication::exec();
QObject::disconnect(connection); QObject::disconnect(connection);
app().grpc().stopEventStream(); app().grpc().stopEventStream();
@ -204,7 +274,8 @@ int main(int argc, char *argv[])
if (!bridgeExited) if (!bridgeExited)
closeBridgeApp(); closeBridgeApp();
// release the lock file
lock.unlock();
return result; return result;
} }
catch (Exception const &e) catch (Exception const &e)

View File

@ -193,7 +193,7 @@ QtObject {
onTriggered: { onTriggered: {
Qt.openUrlExternally(Backend.landingPageLink) Qt.openUrlExternally(Backend.landingPageLink)
root.updateManualError.active = false root.updateManualError.active = false
root.backend.quit() Backend.quit()
} }
}, },
Action { Action {

View File

@ -387,6 +387,18 @@ grpc::Status GRPCClient::triggerReset()
} }
//****************************************************************************************************************************************************
/// \return The status for the gRPC call.
//****************************************************************************************************************************************************
grpc::Status GRPCClient::forceLauncher(QString const &launcher)
{
grpc::ClientContext ctx;
StringValue s;
s.set_value(launcher.toStdString());
return this->logGRPCCallStatus(stub_->ForceLauncher(&ctx, s, &empty), __FUNCTION__);
}
//**************************************************************************************************************************************************** //****************************************************************************************************************************************************
/// \param[in] port The port to check. /// \param[in] port The port to check.
/// \param[out] outFree The result of the check. /// \param[out] outFree The result of the check.
@ -1366,4 +1378,4 @@ void GRPCClient::processUserEvent(UserEvent const &event)
} }
} // namespace bridgepp } // namespace bridgepp

View File

@ -70,6 +70,7 @@ public: // member functions.
grpc::Status quit(); ///< Perform the "Quit" gRPC call. grpc::Status quit(); ///< Perform the "Quit" gRPC call.
grpc::Status restart(); ///< Performs the Restart gRPC call. grpc::Status restart(); ///< Performs the Restart gRPC call.
grpc::Status triggerReset(); ///< Performs the triggerReset gRPC call. grpc::Status triggerReset(); ///< Performs the triggerReset gRPC call.
grpc::Status forceLauncher(QString const &launcher); ///< Performs the 'ForceLauncher' call.
grpc::Status isPortFree(qint32 port, bool &outFree); ///< Performs the 'IsPortFree' call. grpc::Status isPortFree(qint32 port, bool &outFree); ///< Performs the 'IsPortFree' call.
grpc::Status showOnStartup(bool &outValue); ///< Performs the 'ShowOnStartup' call. grpc::Status showOnStartup(bool &outValue); ///< Performs the 'ShowOnStartup' call.
grpc::Status showSplashScreen(bool &outValue); ///< Performs the 'ShowSplashScreen' call. grpc::Status showSplashScreen(bool &outValue); ///< Performs the 'ShowSplashScreen' call.

View File

@ -45,6 +45,7 @@ static const char* Bridge_method_names[] = {
"/grpc.Bridge/ColorSchemeName", "/grpc.Bridge/ColorSchemeName",
"/grpc.Bridge/CurrentEmailClient", "/grpc.Bridge/CurrentEmailClient",
"/grpc.Bridge/ReportBug", "/grpc.Bridge/ReportBug",
"/grpc.Bridge/ForceLauncher",
"/grpc.Bridge/Login", "/grpc.Bridge/Login",
"/grpc.Bridge/Login2FA", "/grpc.Bridge/Login2FA",
"/grpc.Bridge/Login2Passwords", "/grpc.Bridge/Login2Passwords",
@ -108,37 +109,38 @@ Bridge::Stub::Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, co
, rpcmethod_ColorSchemeName_(Bridge_method_names[20], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_ColorSchemeName_(Bridge_method_names[20], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_CurrentEmailClient_(Bridge_method_names[21], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_CurrentEmailClient_(Bridge_method_names[21], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_ReportBug_(Bridge_method_names[22], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_ReportBug_(Bridge_method_names[22], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_Login_(Bridge_method_names[23], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_ForceLauncher_(Bridge_method_names[23], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_Login2FA_(Bridge_method_names[24], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_Login_(Bridge_method_names[24], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_Login2Passwords_(Bridge_method_names[25], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_Login2FA_(Bridge_method_names[25], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_LoginAbort_(Bridge_method_names[26], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_Login2Passwords_(Bridge_method_names[26], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_CheckUpdate_(Bridge_method_names[27], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_LoginAbort_(Bridge_method_names[27], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_InstallUpdate_(Bridge_method_names[28], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_CheckUpdate_(Bridge_method_names[28], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_SetIsAutomaticUpdateOn_(Bridge_method_names[29], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_InstallUpdate_(Bridge_method_names[29], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_IsAutomaticUpdateOn_(Bridge_method_names[30], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_SetIsAutomaticUpdateOn_(Bridge_method_names[30], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_IsCacheOnDiskEnabled_(Bridge_method_names[31], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_IsAutomaticUpdateOn_(Bridge_method_names[31], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_DiskCachePath_(Bridge_method_names[32], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_IsCacheOnDiskEnabled_(Bridge_method_names[32], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_ChangeLocalCache_(Bridge_method_names[33], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_DiskCachePath_(Bridge_method_names[33], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_SetIsDoHEnabled_(Bridge_method_names[34], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_ChangeLocalCache_(Bridge_method_names[34], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_IsDoHEnabled_(Bridge_method_names[35], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_SetIsDoHEnabled_(Bridge_method_names[35], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_SetUseSslForSmtp_(Bridge_method_names[36], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_IsDoHEnabled_(Bridge_method_names[36], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_UseSslForSmtp_(Bridge_method_names[37], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_SetUseSslForSmtp_(Bridge_method_names[37], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_Hostname_(Bridge_method_names[38], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_UseSslForSmtp_(Bridge_method_names[38], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_ImapPort_(Bridge_method_names[39], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_Hostname_(Bridge_method_names[39], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_SmtpPort_(Bridge_method_names[40], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_ImapPort_(Bridge_method_names[40], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_ChangePorts_(Bridge_method_names[41], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_SmtpPort_(Bridge_method_names[41], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_IsPortFree_(Bridge_method_names[42], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_ChangePorts_(Bridge_method_names[42], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_AvailableKeychains_(Bridge_method_names[43], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_IsPortFree_(Bridge_method_names[43], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_SetCurrentKeychain_(Bridge_method_names[44], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_AvailableKeychains_(Bridge_method_names[44], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_CurrentKeychain_(Bridge_method_names[45], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_SetCurrentKeychain_(Bridge_method_names[45], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_GetUserList_(Bridge_method_names[46], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_CurrentKeychain_(Bridge_method_names[46], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_GetUser_(Bridge_method_names[47], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_GetUserList_(Bridge_method_names[47], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_SetUserSplitMode_(Bridge_method_names[48], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_GetUser_(Bridge_method_names[48], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_LogoutUser_(Bridge_method_names[49], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_SetUserSplitMode_(Bridge_method_names[49], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_RemoveUser_(Bridge_method_names[50], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_LogoutUser_(Bridge_method_names[50], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_ConfigureUserAppleMail_(Bridge_method_names[51], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_RemoveUser_(Bridge_method_names[51], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_StartEventStream_(Bridge_method_names[52], options.suffix_for_stats(),::grpc::internal::RpcMethod::SERVER_STREAMING, channel) , rpcmethod_ConfigureUserAppleMail_(Bridge_method_names[52], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
, rpcmethod_StopEventStream_(Bridge_method_names[53], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel) , rpcmethod_StartEventStream_(Bridge_method_names[53], options.suffix_for_stats(),::grpc::internal::RpcMethod::SERVER_STREAMING, channel)
, rpcmethod_StopEventStream_(Bridge_method_names[54], options.suffix_for_stats(),::grpc::internal::RpcMethod::NORMAL_RPC, channel)
{} {}
::grpc::Status Bridge::Stub::AddLogEntry(::grpc::ClientContext* context, const ::grpc::AddLogEntryRequest& request, ::google::protobuf::Empty* response) { ::grpc::Status Bridge::Stub::AddLogEntry(::grpc::ClientContext* context, const ::grpc::AddLogEntryRequest& request, ::google::protobuf::Empty* response) {
@ -670,6 +672,29 @@ void Bridge::Stub::async::ReportBug(::grpc::ClientContext* context, const ::grpc
return result; return result;
} }
::grpc::Status Bridge::Stub::ForceLauncher(::grpc::ClientContext* context, const ::google::protobuf::StringValue& request, ::google::protobuf::Empty* response) {
return ::grpc::internal::BlockingUnaryCall< ::google::protobuf::StringValue, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_ForceLauncher_, context, request, response);
}
void Bridge::Stub::async::ForceLauncher(::grpc::ClientContext* context, const ::google::protobuf::StringValue* request, ::google::protobuf::Empty* response, std::function<void(::grpc::Status)> f) {
::grpc::internal::CallbackUnaryCall< ::google::protobuf::StringValue, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_ForceLauncher_, context, request, response, std::move(f));
}
void Bridge::Stub::async::ForceLauncher(::grpc::ClientContext* context, const ::google::protobuf::StringValue* request, ::google::protobuf::Empty* response, ::grpc::ClientUnaryReactor* reactor) {
::grpc::internal::ClientCallbackUnaryFactory::Create< ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(stub_->channel_.get(), stub_->rpcmethod_ForceLauncher_, context, request, response, reactor);
}
::grpc::ClientAsyncResponseReader< ::google::protobuf::Empty>* Bridge::Stub::PrepareAsyncForceLauncherRaw(::grpc::ClientContext* context, const ::google::protobuf::StringValue& request, ::grpc::CompletionQueue* cq) {
return ::grpc::internal::ClientAsyncResponseReaderHelper::Create< ::google::protobuf::Empty, ::google::protobuf::StringValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), cq, rpcmethod_ForceLauncher_, context, request);
}
::grpc::ClientAsyncResponseReader< ::google::protobuf::Empty>* Bridge::Stub::AsyncForceLauncherRaw(::grpc::ClientContext* context, const ::google::protobuf::StringValue& request, ::grpc::CompletionQueue* cq) {
auto* result =
this->PrepareAsyncForceLauncherRaw(context, request, cq);
result->StartCall();
return result;
}
::grpc::Status Bridge::Stub::Login(::grpc::ClientContext* context, const ::grpc::LoginRequest& request, ::google::protobuf::Empty* response) { ::grpc::Status Bridge::Stub::Login(::grpc::ClientContext* context, const ::grpc::LoginRequest& request, ::google::protobuf::Empty* response) {
return ::grpc::internal::BlockingUnaryCall< ::grpc::LoginRequest, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_Login_, context, request, response); return ::grpc::internal::BlockingUnaryCall< ::grpc::LoginRequest, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(channel_.get(), rpcmethod_Login_, context, request, response);
} }
@ -1610,12 +1635,12 @@ Bridge::Service::Service() {
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[23], Bridge_method_names[23],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::grpc::LoginRequest, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::StringValue, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
::grpc::ServerContext* ctx, ::grpc::ServerContext* ctx,
const ::grpc::LoginRequest* req, const ::google::protobuf::StringValue* req,
::google::protobuf::Empty* resp) { ::google::protobuf::Empty* resp) {
return service->Login(ctx, req, resp); return service->ForceLauncher(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[24], Bridge_method_names[24],
@ -1625,7 +1650,7 @@ Bridge::Service::Service() {
::grpc::ServerContext* ctx, ::grpc::ServerContext* ctx,
const ::grpc::LoginRequest* req, const ::grpc::LoginRequest* req,
::google::protobuf::Empty* resp) { ::google::protobuf::Empty* resp) {
return service->Login2FA(ctx, req, resp); return service->Login(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[25], Bridge_method_names[25],
@ -1635,11 +1660,21 @@ Bridge::Service::Service() {
::grpc::ServerContext* ctx, ::grpc::ServerContext* ctx,
const ::grpc::LoginRequest* req, const ::grpc::LoginRequest* req,
::google::protobuf::Empty* resp) { ::google::protobuf::Empty* resp) {
return service->Login2Passwords(ctx, req, resp); return service->Login2FA(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[26], Bridge_method_names[26],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::grpc::LoginRequest, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service,
::grpc::ServerContext* ctx,
const ::grpc::LoginRequest* req,
::google::protobuf::Empty* resp) {
return service->Login2Passwords(ctx, req, resp);
}, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[27],
::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::grpc::LoginAbortRequest, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::grpc::LoginAbortRequest, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
::grpc::ServerContext* ctx, ::grpc::ServerContext* ctx,
@ -1648,7 +1683,7 @@ Bridge::Service::Service() {
return service->LoginAbort(ctx, req, resp); return service->LoginAbort(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[27], Bridge_method_names[28],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1658,7 +1693,7 @@ Bridge::Service::Service() {
return service->CheckUpdate(ctx, req, resp); return service->CheckUpdate(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[28], Bridge_method_names[29],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1668,7 +1703,7 @@ Bridge::Service::Service() {
return service->InstallUpdate(ctx, req, resp); return service->InstallUpdate(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[29], Bridge_method_names[30],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::BoolValue, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::BoolValue, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1678,7 +1713,7 @@ Bridge::Service::Service() {
return service->SetIsAutomaticUpdateOn(ctx, req, resp); return service->SetIsAutomaticUpdateOn(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[30], Bridge_method_names[31],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::BoolValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::BoolValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1688,7 +1723,7 @@ Bridge::Service::Service() {
return service->IsAutomaticUpdateOn(ctx, req, resp); return service->IsAutomaticUpdateOn(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[31], Bridge_method_names[32],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::BoolValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::BoolValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1698,7 +1733,7 @@ Bridge::Service::Service() {
return service->IsCacheOnDiskEnabled(ctx, req, resp); return service->IsCacheOnDiskEnabled(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[32], Bridge_method_names[33],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::StringValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::StringValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1708,7 +1743,7 @@ Bridge::Service::Service() {
return service->DiskCachePath(ctx, req, resp); return service->DiskCachePath(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[33], Bridge_method_names[34],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::grpc::ChangeLocalCacheRequest, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::grpc::ChangeLocalCacheRequest, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1718,7 +1753,7 @@ Bridge::Service::Service() {
return service->ChangeLocalCache(ctx, req, resp); return service->ChangeLocalCache(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[34], Bridge_method_names[35],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::BoolValue, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::BoolValue, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1728,7 +1763,7 @@ Bridge::Service::Service() {
return service->SetIsDoHEnabled(ctx, req, resp); return service->SetIsDoHEnabled(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[35], Bridge_method_names[36],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::BoolValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::BoolValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1738,7 +1773,7 @@ Bridge::Service::Service() {
return service->IsDoHEnabled(ctx, req, resp); return service->IsDoHEnabled(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[36], Bridge_method_names[37],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::BoolValue, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::BoolValue, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1748,7 +1783,7 @@ Bridge::Service::Service() {
return service->SetUseSslForSmtp(ctx, req, resp); return service->SetUseSslForSmtp(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[37], Bridge_method_names[38],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::BoolValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::BoolValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1758,7 +1793,7 @@ Bridge::Service::Service() {
return service->UseSslForSmtp(ctx, req, resp); return service->UseSslForSmtp(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[38], Bridge_method_names[39],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::StringValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::StringValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1768,7 +1803,7 @@ Bridge::Service::Service() {
return service->Hostname(ctx, req, resp); return service->Hostname(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[39], Bridge_method_names[40],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::Int32Value, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::Int32Value, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1778,7 +1813,7 @@ Bridge::Service::Service() {
return service->ImapPort(ctx, req, resp); return service->ImapPort(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[40], Bridge_method_names[41],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::Int32Value, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::Int32Value, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1788,7 +1823,7 @@ Bridge::Service::Service() {
return service->SmtpPort(ctx, req, resp); return service->SmtpPort(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[41], Bridge_method_names[42],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::grpc::ChangePortsRequest, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::grpc::ChangePortsRequest, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1798,7 +1833,7 @@ Bridge::Service::Service() {
return service->ChangePorts(ctx, req, resp); return service->ChangePorts(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[42], Bridge_method_names[43],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Int32Value, ::google::protobuf::BoolValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Int32Value, ::google::protobuf::BoolValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1808,7 +1843,7 @@ Bridge::Service::Service() {
return service->IsPortFree(ctx, req, resp); return service->IsPortFree(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[43], Bridge_method_names[44],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::grpc::AvailableKeychainsResponse, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::grpc::AvailableKeychainsResponse, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1818,7 +1853,7 @@ Bridge::Service::Service() {
return service->AvailableKeychains(ctx, req, resp); return service->AvailableKeychains(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[44], Bridge_method_names[45],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::StringValue, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::StringValue, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1828,7 +1863,7 @@ Bridge::Service::Service() {
return service->SetCurrentKeychain(ctx, req, resp); return service->SetCurrentKeychain(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[45], Bridge_method_names[46],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::StringValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::StringValue, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1838,7 +1873,7 @@ Bridge::Service::Service() {
return service->CurrentKeychain(ctx, req, resp); return service->CurrentKeychain(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[46], Bridge_method_names[47],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::grpc::UserListResponse, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::grpc::UserListResponse, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1848,7 +1883,7 @@ Bridge::Service::Service() {
return service->GetUserList(ctx, req, resp); return service->GetUserList(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[47], Bridge_method_names[48],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::StringValue, ::grpc::User, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::StringValue, ::grpc::User, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1858,7 +1893,7 @@ Bridge::Service::Service() {
return service->GetUser(ctx, req, resp); return service->GetUser(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[48], Bridge_method_names[49],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::grpc::UserSplitModeRequest, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::grpc::UserSplitModeRequest, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1868,7 +1903,7 @@ Bridge::Service::Service() {
return service->SetUserSplitMode(ctx, req, resp); return service->SetUserSplitMode(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[49], Bridge_method_names[50],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::StringValue, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::StringValue, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1878,7 +1913,7 @@ Bridge::Service::Service() {
return service->LogoutUser(ctx, req, resp); return service->LogoutUser(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[50], Bridge_method_names[51],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::StringValue, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::StringValue, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1888,7 +1923,7 @@ Bridge::Service::Service() {
return service->RemoveUser(ctx, req, resp); return service->RemoveUser(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[51], Bridge_method_names[52],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::grpc::ConfigureAppleMailRequest, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::grpc::ConfigureAppleMailRequest, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1898,7 +1933,7 @@ Bridge::Service::Service() {
return service->ConfigureUserAppleMail(ctx, req, resp); return service->ConfigureUserAppleMail(ctx, req, resp);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[52], Bridge_method_names[53],
::grpc::internal::RpcMethod::SERVER_STREAMING, ::grpc::internal::RpcMethod::SERVER_STREAMING,
new ::grpc::internal::ServerStreamingHandler< Bridge::Service, ::grpc::EventStreamRequest, ::grpc::StreamEvent>( new ::grpc::internal::ServerStreamingHandler< Bridge::Service, ::grpc::EventStreamRequest, ::grpc::StreamEvent>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -1908,7 +1943,7 @@ Bridge::Service::Service() {
return service->StartEventStream(ctx, req, writer); return service->StartEventStream(ctx, req, writer);
}, this))); }, this)));
AddMethod(new ::grpc::internal::RpcServiceMethod( AddMethod(new ::grpc::internal::RpcServiceMethod(
Bridge_method_names[53], Bridge_method_names[54],
::grpc::internal::RpcMethod::NORMAL_RPC, ::grpc::internal::RpcMethod::NORMAL_RPC,
new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>( new ::grpc::internal::RpcMethodHandler< Bridge::Service, ::google::protobuf::Empty, ::google::protobuf::Empty, ::grpc::protobuf::MessageLite, ::grpc::protobuf::MessageLite>(
[](Bridge::Service* service, [](Bridge::Service* service,
@ -2083,6 +2118,13 @@ Bridge::Service::~Service() {
return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
} }
::grpc::Status Bridge::Service::ForceLauncher(::grpc::ServerContext* context, const ::google::protobuf::StringValue* request, ::google::protobuf::Empty* response) {
(void) context;
(void) request;
(void) response;
return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
}
::grpc::Status Bridge::Service::Login(::grpc::ServerContext* context, const ::grpc::LoginRequest* request, ::google::protobuf::Empty* response) { ::grpc::Status Bridge::Service::Login(::grpc::ServerContext* context, const ::grpc::LoginRequest* request, ::google::protobuf::Empty* response) {
(void) context; (void) context;
(void) request; (void) request;

File diff suppressed because it is too large Load Diff

View File

@ -1466,7 +1466,7 @@ const char descriptor_table_protodef_bridge_2eproto[] PROTOBUF_SECTION_VARIABLE(
"CACHE_UNAVAILABLE_ERROR\020\000\022\031\n\025CACHE_CANT_" "CACHE_UNAVAILABLE_ERROR\020\000\022\031\n\025CACHE_CANT_"
"MOVE_ERROR\020\001\022\r\n\tDISK_FULL\020\002*A\n\025MailSetti" "MOVE_ERROR\020\001\022\r\n\tDISK_FULL\020\002*A\n\025MailSetti"
"ngsErrorType\022\023\n\017IMAP_PORT_ISSUE\020\000\022\023\n\017SMT" "ngsErrorType\022\023\n\017IMAP_PORT_ISSUE\020\000\022\023\n\017SMT"
"P_PORT_ISSUE\020\0012\371\034\n\006Bridge\022\?\n\013AddLogEntry" "P_PORT_ISSUE\020\0012\300\035\n\006Bridge\022\?\n\013AddLogEntry"
"\022\030.grpc.AddLogEntryRequest\032\026.google.prot" "\022\030.grpc.AddLogEntryRequest\032\026.google.prot"
"obuf.Empty\022:\n\010GuiReady\022\026.google.protobuf" "obuf.Empty\022:\n\010GuiReady\022\026.google.protobuf"
".Empty\032\026.google.protobuf.Empty\0226\n\004Quit\022\026" ".Empty\032\026.google.protobuf.Empty\0226\n\004Quit\022\026"
@ -1506,61 +1506,63 @@ const char descriptor_table_protodef_bridge_2eproto[] PROTOBUF_SECTION_VARIABLE(
"lClient\022\026.google.protobuf.Empty\032\034.google" "lClient\022\026.google.protobuf.Empty\032\034.google"
".protobuf.StringValue\022;\n\tReportBug\022\026.grp" ".protobuf.StringValue\022;\n\tReportBug\022\026.grp"
"c.ReportBugRequest\032\026.google.protobuf.Emp" "c.ReportBugRequest\032\026.google.protobuf.Emp"
"ty\0223\n\005Login\022\022.grpc.LoginRequest\032\026.google" "ty\022E\n\rForceLauncher\022\034.google.protobuf.St"
".protobuf.Empty\0226\n\010Login2FA\022\022.grpc.Login" "ringValue\032\026.google.protobuf.Empty\0223\n\005Log"
"Request\032\026.google.protobuf.Empty\022=\n\017Login" "in\022\022.grpc.LoginRequest\032\026.google.protobuf"
"2Passwords\022\022.grpc.LoginRequest\032\026.google." ".Empty\0226\n\010Login2FA\022\022.grpc.LoginRequest\032\026"
"protobuf.Empty\022=\n\nLoginAbort\022\027.grpc.Logi" ".google.protobuf.Empty\022=\n\017Login2Password"
"nAbortRequest\032\026.google.protobuf.Empty\022=\n" "s\022\022.grpc.LoginRequest\032\026.google.protobuf."
"\013CheckUpdate\022\026.google.protobuf.Empty\032\026.g" "Empty\022=\n\nLoginAbort\022\027.grpc.LoginAbortReq"
"oogle.protobuf.Empty\022\?\n\rInstallUpdate\022\026." "uest\032\026.google.protobuf.Empty\022=\n\013CheckUpd"
"google.protobuf.Empty\032\026.google.protobuf." "ate\022\026.google.protobuf.Empty\032\026.google.pro"
"Empty\022L\n\026SetIsAutomaticUpdateOn\022\032.google" "tobuf.Empty\022\?\n\rInstallUpdate\022\026.google.pr"
".protobuf.BoolValue\032\026.google.protobuf.Em" "otobuf.Empty\032\026.google.protobuf.Empty\022L\n\026"
"pty\022I\n\023IsAutomaticUpdateOn\022\026.google.prot" "SetIsAutomaticUpdateOn\022\032.google.protobuf"
"obuf.Empty\032\032.google.protobuf.BoolValue\022J" ".BoolValue\032\026.google.protobuf.Empty\022I\n\023Is"
"\n\024IsCacheOnDiskEnabled\022\026.google.protobuf" "AutomaticUpdateOn\022\026.google.protobuf.Empt"
".Empty\032\032.google.protobuf.BoolValue\022E\n\rDi" "y\032\032.google.protobuf.BoolValue\022J\n\024IsCache"
"skCachePath\022\026.google.protobuf.Empty\032\034.go" "OnDiskEnabled\022\026.google.protobuf.Empty\032\032."
"ogle.protobuf.StringValue\022I\n\020ChangeLocal" "google.protobuf.BoolValue\022E\n\rDiskCachePa"
"Cache\022\035.grpc.ChangeLocalCacheRequest\032\026.g" "th\022\026.google.protobuf.Empty\032\034.google.prot"
"oogle.protobuf.Empty\022E\n\017SetIsDoHEnabled\022" "obuf.StringValue\022I\n\020ChangeLocalCache\022\035.g"
"\032.google.protobuf.BoolValue\032\026.google.pro" "rpc.ChangeLocalCacheRequest\032\026.google.pro"
"tobuf.Empty\022B\n\014IsDoHEnabled\022\026.google.pro" "tobuf.Empty\022E\n\017SetIsDoHEnabled\022\032.google."
"tobuf.Empty\032\032.google.protobuf.BoolValue\022" "protobuf.BoolValue\032\026.google.protobuf.Emp"
"F\n\020SetUseSslForSmtp\022\032.google.protobuf.Bo" "ty\022B\n\014IsDoHEnabled\022\026.google.protobuf.Emp"
"olValue\032\026.google.protobuf.Empty\022C\n\rUseSs" "ty\032\032.google.protobuf.BoolValue\022F\n\020SetUse"
"lForSmtp\022\026.google.protobuf.Empty\032\032.googl" "SslForSmtp\022\032.google.protobuf.BoolValue\032\026"
"e.protobuf.BoolValue\022@\n\010Hostname\022\026.googl" ".google.protobuf.Empty\022C\n\rUseSslForSmtp\022"
"e.protobuf.Empty\032\034.google.protobuf.Strin" "\026.google.protobuf.Empty\032\032.google.protobu"
"gValue\022\?\n\010ImapPort\022\026.google.protobuf.Emp" "f.BoolValue\022@\n\010Hostname\022\026.google.protobu"
"ty\032\033.google.protobuf.Int32Value\022\?\n\010SmtpP" "f.Empty\032\034.google.protobuf.StringValue\022\?\n"
"ort\022\026.google.protobuf.Empty\032\033.google.pro" "\010ImapPort\022\026.google.protobuf.Empty\032\033.goog"
"tobuf.Int32Value\022\?\n\013ChangePorts\022\030.grpc.C" "le.protobuf.Int32Value\022\?\n\010SmtpPort\022\026.goo"
"hangePortsRequest\032\026.google.protobuf.Empt" "gle.protobuf.Empty\032\033.google.protobuf.Int"
"y\022E\n\nIsPortFree\022\033.google.protobuf.Int32V" "32Value\022\?\n\013ChangePorts\022\030.grpc.ChangePort"
"alue\032\032.google.protobuf.BoolValue\022N\n\022Avai" "sRequest\032\026.google.protobuf.Empty\022E\n\nIsPo"
"lableKeychains\022\026.google.protobuf.Empty\032 " "rtFree\022\033.google.protobuf.Int32Value\032\032.go"
".grpc.AvailableKeychainsResponse\022J\n\022SetC" "ogle.protobuf.BoolValue\022N\n\022AvailableKeyc"
"urrentKeychain\022\034.google.protobuf.StringV" "hains\022\026.google.protobuf.Empty\032 .grpc.Ava"
"alue\032\026.google.protobuf.Empty\022G\n\017CurrentK" "ilableKeychainsResponse\022J\n\022SetCurrentKey"
"eychain\022\026.google.protobuf.Empty\032\034.google" "chain\022\034.google.protobuf.StringValue\032\026.go"
".protobuf.StringValue\022=\n\013GetUserList\022\026.g" "ogle.protobuf.Empty\022G\n\017CurrentKeychain\022\026"
"oogle.protobuf.Empty\032\026.grpc.UserListResp" ".google.protobuf.Empty\032\034.google.protobuf"
"onse\0223\n\007GetUser\022\034.google.protobuf.String" ".StringValue\022=\n\013GetUserList\022\026.google.pro"
"Value\032\n.grpc.User\022F\n\020SetUserSplitMode\022\032." "tobuf.Empty\032\026.grpc.UserListResponse\0223\n\007G"
"grpc.UserSplitModeRequest\032\026.google.proto" "etUser\022\034.google.protobuf.StringValue\032\n.g"
"buf.Empty\022B\n\nLogoutUser\022\034.google.protobu" "rpc.User\022F\n\020SetUserSplitMode\022\032.grpc.User"
"f.StringValue\032\026.google.protobuf.Empty\022B\n" "SplitModeRequest\032\026.google.protobuf.Empty"
"\nRemoveUser\022\034.google.protobuf.StringValu" "\022B\n\nLogoutUser\022\034.google.protobuf.StringV"
"e\032\026.google.protobuf.Empty\022Q\n\026ConfigureUs" "alue\032\026.google.protobuf.Empty\022B\n\nRemoveUs"
"erAppleMail\022\037.grpc.ConfigureAppleMailReq" "er\022\034.google.protobuf.StringValue\032\026.googl"
"uest\032\026.google.protobuf.Empty\022A\n\020StartEve" "e.protobuf.Empty\022Q\n\026ConfigureUserAppleMa"
"ntStream\022\030.grpc.EventStreamRequest\032\021.grp" "il\022\037.grpc.ConfigureAppleMailRequest\032\026.go"
"c.StreamEvent0\001\022A\n\017StopEventStream\022\026.goo" "ogle.protobuf.Empty\022A\n\020StartEventStream\022"
"gle.protobuf.Empty\032\026.google.protobuf.Emp" "\030.grpc.EventStreamRequest\032\021.grpc.StreamE"
"tyB6Z4github.com/ProtonMail/proton-bridg" "vent0\001\022A\n\017StopEventStream\022\026.google.proto"
"e/v2/internal/grpcb\006proto3" "buf.Empty\032\026.google.protobuf.EmptyB6Z4git"
"hub.com/ProtonMail/proton-bridge/v2/inte"
"rnal/grpcb\006proto3"
; ;
static const ::_pbi::DescriptorTable* const descriptor_table_bridge_2eproto_deps[2] = { static const ::_pbi::DescriptorTable* const descriptor_table_bridge_2eproto_deps[2] = {
&::descriptor_table_google_2fprotobuf_2fempty_2eproto, &::descriptor_table_google_2fprotobuf_2fempty_2eproto,
@ -1568,7 +1570,7 @@ static const ::_pbi::DescriptorTable* const descriptor_table_bridge_2eproto_deps
}; };
static ::_pbi::once_flag descriptor_table_bridge_2eproto_once; static ::_pbi::once_flag descriptor_table_bridge_2eproto_once;
const ::_pbi::DescriptorTable descriptor_table_bridge_2eproto = { const ::_pbi::DescriptorTable descriptor_table_bridge_2eproto = {
false, false, 9226, descriptor_table_protodef_bridge_2eproto, false, false, 9297, descriptor_table_protodef_bridge_2eproto,
"bridge.proto", "bridge.proto",
&descriptor_table_bridge_2eproto_once, descriptor_table_bridge_2eproto_deps, 2, 57, &descriptor_table_bridge_2eproto_once, descriptor_table_bridge_2eproto_deps, 2, 57,
schemas, file_default_instances, TableStruct_bridge_2eproto::offsets, schemas, file_default_instances, TableStruct_bridge_2eproto::offsets,

View File

@ -59,7 +59,7 @@ void Overseer::startWorker(bool autorelease) const
worker_->moveToThread(thread_); worker_->moveToThread(thread_);
connect(thread_, &QThread::started, worker_, &Worker::run); connect(thread_, &QThread::started, worker_, &Worker::run);
connect(worker_, &Worker::finished, [&]() { thread_->quit(); }); // for unkwown reason, connect to the QThread::quit slot does not work... connect(worker_, &Worker::finished, [&]() {thread_->quit(); }); // Safety, normally the thread already properly quits.
connect(worker_, &Worker::error, [&]() { thread_->quit(); }); connect(worker_, &Worker::error, [&]() { thread_->quit(); });
if (autorelease) if (autorelease)

View File

@ -18,7 +18,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT. // Code generated by protoc-gen-go. DO NOT EDIT.
// versions: // versions:
// protoc-gen-go v1.28.0 // protoc-gen-go v1.28.0
// protoc v3.21.2 // protoc v3.21.3
// source: bridge.proto // source: bridge.proto
package grpc package grpc
@ -4122,7 +4122,7 @@ var file_bridge_proto_rawDesc = []byte{
0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4d, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4d,
0x41, 0x50, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x45, 0x10, 0x00, 0x12, 0x41, 0x50, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x45, 0x10, 0x00, 0x12,
0x13, 0x0a, 0x0f, 0x53, 0x4d, 0x54, 0x50, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x49, 0x53, 0x53, 0x13, 0x0a, 0x0f, 0x53, 0x4d, 0x54, 0x50, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x49, 0x53, 0x53,
0x55, 0x45, 0x10, 0x01, 0x32, 0xf9, 0x1c, 0x0a, 0x06, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0x55, 0x45, 0x10, 0x01, 0x32, 0xc0, 0x1d, 0x0a, 0x06, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12,
0x3f, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x18, 0x3f, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x18,
0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72,
0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
@ -4221,143 +4221,148 @@ var file_bridge_proto_rawDesc = []byte{
0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x67, 0x12, 0x16, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x67, 0x12, 0x16, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,
0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x33, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x45, 0x0a, 0x0d, 0x46, 0x6f, 0x72, 0x63,
0x6e, 0x12, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x65, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69,
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x36, 0x0a, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x32, 0x46, 0x41, 0x12, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12,
0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x33, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x0f, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x32, 0x50,
0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,
0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
0x6d, 0x70, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x41, 0x62, 0x6f, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x36, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x32, 0x46, 0x41,
0x72, 0x74, 0x12, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x41, 0x12, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71,
0x62, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x0f,
0x70, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x32, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x12,
0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x0a, 0x4c,
0x74, 0x79, 0x12, 0x3f, 0x0a, 0x0d, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x55, 0x70, 0x64, 0x6f, 0x67, 0x69, 0x6e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63,
0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x0b, 0x43, 0x68,
0x70, 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x49, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x65, 0x63, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6d, 0x61, 0x74, 0x69, 0x63, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x6e, 0x12, 0x1a, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
0x79, 0x12, 0x49, 0x0a, 0x13, 0x49, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3f, 0x0a, 0x0d, 0x49, 0x6e, 0x73,
0x74, 0x61, 0x6c, 0x6c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70,
0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x16, 0x53, 0x65,
0x74, 0x49, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x55, 0x70, 0x64, 0x61,
0x74, 0x65, 0x4f, 0x6e, 0x12, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65,
0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x49, 0x0a, 0x13, 0x49, 0x73, 0x41, 0x75,
0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x6e, 0x12,
0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61,
0x6c, 0x75, 0x65, 0x12, 0x4a, 0x0a, 0x14, 0x49, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x4f, 0x6e,
0x44, 0x69, 0x73, 0x6b, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x16, 0x2e, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12,
0x45, 0x0a, 0x0d, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x61, 0x74, 0x68,
0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e,
0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x49, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x72, 0x70,
0x63, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x61, 0x63,
0x68, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
0x79, 0x12, 0x45, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x49, 0x73, 0x44, 0x6f, 0x48, 0x45, 0x6e, 0x61,
0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65,
0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x0c, 0x49, 0x73, 0x44, 0x6f,
0x48, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x4a, 0x0a, 0x14, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x46, 0x0a, 0x10,
0x49, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x4f, 0x6e, 0x44, 0x69, 0x73, 0x6b, 0x45, 0x6e, 0x61, 0x53, 0x65, 0x74, 0x55, 0x73, 0x65, 0x53, 0x73, 0x6c, 0x46, 0x6f, 0x72, 0x53, 0x6d, 0x74, 0x70,
0x62, 0x6c, 0x65, 0x64, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x12, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x67, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x16, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45,
0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x45, 0x0a, 0x0d, 0x44, 0x69, 0x73, 0x6b, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x43, 0x0a, 0x0d, 0x55, 0x73, 0x65, 0x53, 0x73, 0x6c, 0x46, 0x6f,
0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x72, 0x53, 0x6d, 0x74, 0x70, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e,
0x79, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12,
0x49, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x61,
0x63, 0x68, 0x65, 0x12, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67,
0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x43, 0x61, 0x63, 0x68, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x45, 0x0a, 0x0f, 0x53, 0x65,
0x74, 0x49, 0x73, 0x44, 0x6f, 0x48, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1a, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x40, 0x0a, 0x08, 0x48, 0x6f, 0x73,
0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x49,
0x6d, 0x61, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a,
0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3f, 0x0a, 0x08,
0x53, 0x6d, 0x74, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3f, 0x0a,
0x0b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x67,
0x72, 0x70, 0x63, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x52,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x45,
0x0a, 0x0a, 0x49, 0x73, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x72, 0x65, 0x65, 0x12, 0x1b, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49,
0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c,
0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x4e, 0x0a, 0x12, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62,
0x6c, 0x65, 0x4b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c,
0x61, 0x62, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73,
0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72,
0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x1c, 0x2e, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74,
0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
0x79, 0x12, 0x42, 0x0a, 0x0c, 0x49, 0x73, 0x44, 0x6f, 0x48, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x79, 0x12, 0x47, 0x0a, 0x0f, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x63,
0x64, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x67,
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53,
0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x46, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x55, 0x73, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x47, 0x65,
0x73, 0x6c, 0x46, 0x6f, 0x72, 0x53, 0x6d, 0x74, 0x70, 0x12, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73,
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x43, 0x0a, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x47, 0x65, 0x74,
0x0d, 0x55, 0x73, 0x65, 0x53, 0x73, 0x6c, 0x46, 0x6f, 0x72, 0x53, 0x6d, 0x74, 0x70, 0x12, 0x16, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c,
0x75, 0x65, 0x1a, 0x0a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x12, 0x46,
0x0a, 0x10, 0x53, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x4d, 0x6f,
0x64, 0x65, 0x12, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x70,
0x6c, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
0x75, 0x65, 0x12, 0x40, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56,
0x61, 0x6c, 0x75, 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x49, 0x6d, 0x61, 0x70, 0x50, 0x6f, 0x72, 0x74,
0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32,
0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x53, 0x6d, 0x74, 0x70, 0x50, 0x6f, 0x72,
0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33,
0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3f, 0x0a, 0x0b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65,
0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x68, 0x61,
0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x45, 0x0a, 0x0a, 0x49, 0x73, 0x50, 0x6f, 0x72,
0x74, 0x46, 0x72, 0x65, 0x65, 0x12, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c,
0x75, 0x65, 0x1a, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x4e,
0x0a, 0x12, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x63, 0x68,
0x61, 0x69, 0x6e, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x20, 0x2e, 0x67,
0x72, 0x70, 0x63, 0x2e, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x65, 0x79,
0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a,
0x0a, 0x12, 0x53, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x63,
0x68, 0x61, 0x69, 0x6e, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c,
0x75, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x75, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x47, 0x0a, 0x0f, 0x43, 0x75, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x0a, 0x52, 0x65,
0x72, 0x72, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x16, 0x2e, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e,
0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x51,
0x6c, 0x75, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41,
0x73, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x70, 0x70, 0x6c, 0x65, 0x4d, 0x61, 0x69, 0x6c, 0x12, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x72, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x4d, 0x61,
0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x79, 0x12, 0x41, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53,
0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x0a, 0x2e, 0x67, 0x72, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x76, 0x65,
0x70, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x55, 0x73, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a,
0x65, 0x72, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x2e, 0x67, 0x72, 0x11, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65,
0x70, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x41, 0x0a, 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x76, 0x65, 0x6e,
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a,
0x42, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d,
0x70, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x55, 0x73, 0x65,
0x72, 0x12, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a,
0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x51, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75,
0x67, 0x75, 0x72, 0x65, 0x55, 0x73, 0x65, 0x72, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x4d, 0x61, 0x69, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x4d, 0x61, 0x69, 0x6c,
0x6c, 0x12, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x2d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x2f, 0x76,
0x72, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x4d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x32, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x62,
0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x41, 0x0a, 0x10, 0x53, 0x74,
0x61, 0x72, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x18,
0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61,
0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e,
0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x41, 0x0a,
0x0f, 0x53, 0x74, 0x6f, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d,
0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79,
0x42, 0x36, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x50,
0x72, 0x6f, 0x74, 0x6f, 0x6e, 0x4d, 0x61, 0x69, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x6e,
0x2d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x2f, 0x76, 0x32, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72,
0x6e, 0x61, 0x6c, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
} }
var ( var (
@ -4517,93 +4522,95 @@ var file_bridge_proto_depIdxs = []int32{
62, // 71: grpc.Bridge.ColorSchemeName:input_type -> google.protobuf.Empty 62, // 71: grpc.Bridge.ColorSchemeName:input_type -> google.protobuf.Empty
62, // 72: grpc.Bridge.CurrentEmailClient:input_type -> google.protobuf.Empty 62, // 72: grpc.Bridge.CurrentEmailClient:input_type -> google.protobuf.Empty
6, // 73: grpc.Bridge.ReportBug:input_type -> grpc.ReportBugRequest 6, // 73: grpc.Bridge.ReportBug:input_type -> grpc.ReportBugRequest
7, // 74: grpc.Bridge.Login:input_type -> grpc.LoginRequest 64, // 74: grpc.Bridge.ForceLauncher:input_type -> google.protobuf.StringValue
7, // 75: grpc.Bridge.Login2FA:input_type -> grpc.LoginRequest 7, // 75: grpc.Bridge.Login:input_type -> grpc.LoginRequest
7, // 76: grpc.Bridge.Login2Passwords:input_type -> grpc.LoginRequest 7, // 76: grpc.Bridge.Login2FA:input_type -> grpc.LoginRequest
8, // 77: grpc.Bridge.LoginAbort:input_type -> grpc.LoginAbortRequest 7, // 77: grpc.Bridge.Login2Passwords:input_type -> grpc.LoginRequest
62, // 78: grpc.Bridge.CheckUpdate:input_type -> google.protobuf.Empty 8, // 78: grpc.Bridge.LoginAbort:input_type -> grpc.LoginAbortRequest
62, // 79: grpc.Bridge.InstallUpdate:input_type -> google.protobuf.Empty 62, // 79: grpc.Bridge.CheckUpdate:input_type -> google.protobuf.Empty
63, // 80: grpc.Bridge.SetIsAutomaticUpdateOn:input_type -> google.protobuf.BoolValue 62, // 80: grpc.Bridge.InstallUpdate:input_type -> google.protobuf.Empty
62, // 81: grpc.Bridge.IsAutomaticUpdateOn:input_type -> google.protobuf.Empty 63, // 81: grpc.Bridge.SetIsAutomaticUpdateOn:input_type -> google.protobuf.BoolValue
62, // 82: grpc.Bridge.IsCacheOnDiskEnabled:input_type -> google.protobuf.Empty 62, // 82: grpc.Bridge.IsAutomaticUpdateOn:input_type -> google.protobuf.Empty
62, // 83: grpc.Bridge.DiskCachePath:input_type -> google.protobuf.Empty 62, // 83: grpc.Bridge.IsCacheOnDiskEnabled:input_type -> google.protobuf.Empty
9, // 84: grpc.Bridge.ChangeLocalCache:input_type -> grpc.ChangeLocalCacheRequest 62, // 84: grpc.Bridge.DiskCachePath:input_type -> google.protobuf.Empty
63, // 85: grpc.Bridge.SetIsDoHEnabled:input_type -> google.protobuf.BoolValue 9, // 85: grpc.Bridge.ChangeLocalCache:input_type -> grpc.ChangeLocalCacheRequest
62, // 86: grpc.Bridge.IsDoHEnabled:input_type -> google.protobuf.Empty 63, // 86: grpc.Bridge.SetIsDoHEnabled:input_type -> google.protobuf.BoolValue
63, // 87: grpc.Bridge.SetUseSslForSmtp:input_type -> google.protobuf.BoolValue 62, // 87: grpc.Bridge.IsDoHEnabled:input_type -> google.protobuf.Empty
62, // 88: grpc.Bridge.UseSslForSmtp:input_type -> google.protobuf.Empty 63, // 88: grpc.Bridge.SetUseSslForSmtp:input_type -> google.protobuf.BoolValue
62, // 89: grpc.Bridge.Hostname:input_type -> google.protobuf.Empty 62, // 89: grpc.Bridge.UseSslForSmtp:input_type -> google.protobuf.Empty
62, // 90: grpc.Bridge.ImapPort:input_type -> google.protobuf.Empty 62, // 90: grpc.Bridge.Hostname:input_type -> google.protobuf.Empty
62, // 91: grpc.Bridge.SmtpPort:input_type -> google.protobuf.Empty 62, // 91: grpc.Bridge.ImapPort:input_type -> google.protobuf.Empty
10, // 92: grpc.Bridge.ChangePorts:input_type -> grpc.ChangePortsRequest 62, // 92: grpc.Bridge.SmtpPort:input_type -> google.protobuf.Empty
65, // 93: grpc.Bridge.IsPortFree:input_type -> google.protobuf.Int32Value 10, // 93: grpc.Bridge.ChangePorts:input_type -> grpc.ChangePortsRequest
62, // 94: grpc.Bridge.AvailableKeychains:input_type -> google.protobuf.Empty 65, // 94: grpc.Bridge.IsPortFree:input_type -> google.protobuf.Int32Value
64, // 95: grpc.Bridge.SetCurrentKeychain:input_type -> google.protobuf.StringValue 62, // 95: grpc.Bridge.AvailableKeychains:input_type -> google.protobuf.Empty
62, // 96: grpc.Bridge.CurrentKeychain:input_type -> google.protobuf.Empty 64, // 96: grpc.Bridge.SetCurrentKeychain:input_type -> google.protobuf.StringValue
62, // 97: grpc.Bridge.GetUserList:input_type -> google.protobuf.Empty 62, // 97: grpc.Bridge.CurrentKeychain:input_type -> google.protobuf.Empty
64, // 98: grpc.Bridge.GetUser:input_type -> google.protobuf.StringValue 62, // 98: grpc.Bridge.GetUserList:input_type -> google.protobuf.Empty
13, // 99: grpc.Bridge.SetUserSplitMode:input_type -> grpc.UserSplitModeRequest 64, // 99: grpc.Bridge.GetUser:input_type -> google.protobuf.StringValue
64, // 100: grpc.Bridge.LogoutUser:input_type -> google.protobuf.StringValue 13, // 100: grpc.Bridge.SetUserSplitMode:input_type -> grpc.UserSplitModeRequest
64, // 101: grpc.Bridge.RemoveUser:input_type -> google.protobuf.StringValue 64, // 101: grpc.Bridge.LogoutUser:input_type -> google.protobuf.StringValue
15, // 102: grpc.Bridge.ConfigureUserAppleMail:input_type -> grpc.ConfigureAppleMailRequest 64, // 102: grpc.Bridge.RemoveUser:input_type -> google.protobuf.StringValue
16, // 103: grpc.Bridge.StartEventStream:input_type -> grpc.EventStreamRequest 15, // 103: grpc.Bridge.ConfigureUserAppleMail:input_type -> grpc.ConfigureAppleMailRequest
62, // 104: grpc.Bridge.StopEventStream:input_type -> google.protobuf.Empty 16, // 104: grpc.Bridge.StartEventStream:input_type -> grpc.EventStreamRequest
62, // 105: grpc.Bridge.AddLogEntry:output_type -> google.protobuf.Empty 62, // 105: grpc.Bridge.StopEventStream:input_type -> google.protobuf.Empty
62, // 106: grpc.Bridge.GuiReady:output_type -> google.protobuf.Empty 62, // 106: grpc.Bridge.AddLogEntry:output_type -> google.protobuf.Empty
62, // 107: grpc.Bridge.Quit:output_type -> google.protobuf.Empty 62, // 107: grpc.Bridge.GuiReady:output_type -> google.protobuf.Empty
62, // 108: grpc.Bridge.Restart:output_type -> google.protobuf.Empty 62, // 108: grpc.Bridge.Quit:output_type -> google.protobuf.Empty
63, // 109: grpc.Bridge.ShowOnStartup:output_type -> google.protobuf.BoolValue 62, // 109: grpc.Bridge.Restart:output_type -> google.protobuf.Empty
63, // 110: grpc.Bridge.ShowSplashScreen:output_type -> google.protobuf.BoolValue 63, // 110: grpc.Bridge.ShowOnStartup:output_type -> google.protobuf.BoolValue
63, // 111: grpc.Bridge.IsFirstGuiStart:output_type -> google.protobuf.BoolValue 63, // 111: grpc.Bridge.ShowSplashScreen:output_type -> google.protobuf.BoolValue
62, // 112: grpc.Bridge.SetIsAutostartOn:output_type -> google.protobuf.Empty 63, // 112: grpc.Bridge.IsFirstGuiStart:output_type -> google.protobuf.BoolValue
63, // 113: grpc.Bridge.IsAutostartOn:output_type -> google.protobuf.BoolValue 62, // 113: grpc.Bridge.SetIsAutostartOn:output_type -> google.protobuf.Empty
62, // 114: grpc.Bridge.SetIsBetaEnabled:output_type -> google.protobuf.Empty 63, // 114: grpc.Bridge.IsAutostartOn:output_type -> google.protobuf.BoolValue
63, // 115: grpc.Bridge.IsBetaEnabled:output_type -> google.protobuf.BoolValue 62, // 115: grpc.Bridge.SetIsBetaEnabled:output_type -> google.protobuf.Empty
64, // 116: grpc.Bridge.GoOs:output_type -> google.protobuf.StringValue 63, // 116: grpc.Bridge.IsBetaEnabled:output_type -> google.protobuf.BoolValue
62, // 117: grpc.Bridge.TriggerReset:output_type -> google.protobuf.Empty 64, // 117: grpc.Bridge.GoOs:output_type -> google.protobuf.StringValue
64, // 118: grpc.Bridge.Version:output_type -> google.protobuf.StringValue 62, // 118: grpc.Bridge.TriggerReset:output_type -> google.protobuf.Empty
64, // 119: grpc.Bridge.LogsPath:output_type -> google.protobuf.StringValue 64, // 119: grpc.Bridge.Version:output_type -> google.protobuf.StringValue
64, // 120: grpc.Bridge.LicensePath:output_type -> google.protobuf.StringValue 64, // 120: grpc.Bridge.LogsPath:output_type -> google.protobuf.StringValue
64, // 121: grpc.Bridge.ReleaseNotesPageLink:output_type -> google.protobuf.StringValue 64, // 121: grpc.Bridge.LicensePath:output_type -> google.protobuf.StringValue
64, // 122: grpc.Bridge.DependencyLicensesLink:output_type -> google.protobuf.StringValue 64, // 122: grpc.Bridge.ReleaseNotesPageLink:output_type -> google.protobuf.StringValue
64, // 123: grpc.Bridge.LandingPageLink:output_type -> google.protobuf.StringValue 64, // 123: grpc.Bridge.DependencyLicensesLink:output_type -> google.protobuf.StringValue
62, // 124: grpc.Bridge.SetColorSchemeName:output_type -> google.protobuf.Empty 64, // 124: grpc.Bridge.LandingPageLink:output_type -> google.protobuf.StringValue
64, // 125: grpc.Bridge.ColorSchemeName:output_type -> google.protobuf.StringValue 62, // 125: grpc.Bridge.SetColorSchemeName:output_type -> google.protobuf.Empty
64, // 126: grpc.Bridge.CurrentEmailClient:output_type -> google.protobuf.StringValue 64, // 126: grpc.Bridge.ColorSchemeName:output_type -> google.protobuf.StringValue
62, // 127: grpc.Bridge.ReportBug:output_type -> google.protobuf.Empty 64, // 127: grpc.Bridge.CurrentEmailClient:output_type -> google.protobuf.StringValue
62, // 128: grpc.Bridge.Login:output_type -> google.protobuf.Empty 62, // 128: grpc.Bridge.ReportBug:output_type -> google.protobuf.Empty
62, // 129: grpc.Bridge.Login2FA:output_type -> google.protobuf.Empty 62, // 129: grpc.Bridge.ForceLauncher:output_type -> google.protobuf.Empty
62, // 130: grpc.Bridge.Login2Passwords:output_type -> google.protobuf.Empty 62, // 130: grpc.Bridge.Login:output_type -> google.protobuf.Empty
62, // 131: grpc.Bridge.LoginAbort:output_type -> google.protobuf.Empty 62, // 131: grpc.Bridge.Login2FA:output_type -> google.protobuf.Empty
62, // 132: grpc.Bridge.CheckUpdate:output_type -> google.protobuf.Empty 62, // 132: grpc.Bridge.Login2Passwords:output_type -> google.protobuf.Empty
62, // 133: grpc.Bridge.InstallUpdate:output_type -> google.protobuf.Empty 62, // 133: grpc.Bridge.LoginAbort:output_type -> google.protobuf.Empty
62, // 134: grpc.Bridge.SetIsAutomaticUpdateOn:output_type -> google.protobuf.Empty 62, // 134: grpc.Bridge.CheckUpdate:output_type -> google.protobuf.Empty
63, // 135: grpc.Bridge.IsAutomaticUpdateOn:output_type -> google.protobuf.BoolValue 62, // 135: grpc.Bridge.InstallUpdate:output_type -> google.protobuf.Empty
63, // 136: grpc.Bridge.IsCacheOnDiskEnabled:output_type -> google.protobuf.BoolValue 62, // 136: grpc.Bridge.SetIsAutomaticUpdateOn:output_type -> google.protobuf.Empty
64, // 137: grpc.Bridge.DiskCachePath:output_type -> google.protobuf.StringValue 63, // 137: grpc.Bridge.IsAutomaticUpdateOn:output_type -> google.protobuf.BoolValue
62, // 138: grpc.Bridge.ChangeLocalCache:output_type -> google.protobuf.Empty 63, // 138: grpc.Bridge.IsCacheOnDiskEnabled:output_type -> google.protobuf.BoolValue
62, // 139: grpc.Bridge.SetIsDoHEnabled:output_type -> google.protobuf.Empty 64, // 139: grpc.Bridge.DiskCachePath:output_type -> google.protobuf.StringValue
63, // 140: grpc.Bridge.IsDoHEnabled:output_type -> google.protobuf.BoolValue 62, // 140: grpc.Bridge.ChangeLocalCache:output_type -> google.protobuf.Empty
62, // 141: grpc.Bridge.SetUseSslForSmtp:output_type -> google.protobuf.Empty 62, // 141: grpc.Bridge.SetIsDoHEnabled:output_type -> google.protobuf.Empty
63, // 142: grpc.Bridge.UseSslForSmtp:output_type -> google.protobuf.BoolValue 63, // 142: grpc.Bridge.IsDoHEnabled:output_type -> google.protobuf.BoolValue
64, // 143: grpc.Bridge.Hostname:output_type -> google.protobuf.StringValue 62, // 143: grpc.Bridge.SetUseSslForSmtp:output_type -> google.protobuf.Empty
65, // 144: grpc.Bridge.ImapPort:output_type -> google.protobuf.Int32Value 63, // 144: grpc.Bridge.UseSslForSmtp:output_type -> google.protobuf.BoolValue
65, // 145: grpc.Bridge.SmtpPort:output_type -> google.protobuf.Int32Value 64, // 145: grpc.Bridge.Hostname:output_type -> google.protobuf.StringValue
62, // 146: grpc.Bridge.ChangePorts:output_type -> google.protobuf.Empty 65, // 146: grpc.Bridge.ImapPort:output_type -> google.protobuf.Int32Value
63, // 147: grpc.Bridge.IsPortFree:output_type -> google.protobuf.BoolValue 65, // 147: grpc.Bridge.SmtpPort:output_type -> google.protobuf.Int32Value
11, // 148: grpc.Bridge.AvailableKeychains:output_type -> grpc.AvailableKeychainsResponse 62, // 148: grpc.Bridge.ChangePorts:output_type -> google.protobuf.Empty
62, // 149: grpc.Bridge.SetCurrentKeychain:output_type -> google.protobuf.Empty 63, // 149: grpc.Bridge.IsPortFree:output_type -> google.protobuf.BoolValue
64, // 150: grpc.Bridge.CurrentKeychain:output_type -> google.protobuf.StringValue 11, // 150: grpc.Bridge.AvailableKeychains:output_type -> grpc.AvailableKeychainsResponse
14, // 151: grpc.Bridge.GetUserList:output_type -> grpc.UserListResponse 62, // 151: grpc.Bridge.SetCurrentKeychain:output_type -> google.protobuf.Empty
12, // 152: grpc.Bridge.GetUser:output_type -> grpc.User 64, // 152: grpc.Bridge.CurrentKeychain:output_type -> google.protobuf.StringValue
62, // 153: grpc.Bridge.SetUserSplitMode:output_type -> google.protobuf.Empty 14, // 153: grpc.Bridge.GetUserList:output_type -> grpc.UserListResponse
62, // 154: grpc.Bridge.LogoutUser:output_type -> google.protobuf.Empty 12, // 154: grpc.Bridge.GetUser:output_type -> grpc.User
62, // 155: grpc.Bridge.RemoveUser:output_type -> google.protobuf.Empty 62, // 155: grpc.Bridge.SetUserSplitMode:output_type -> google.protobuf.Empty
62, // 156: grpc.Bridge.ConfigureUserAppleMail:output_type -> google.protobuf.Empty 62, // 156: grpc.Bridge.LogoutUser:output_type -> google.protobuf.Empty
17, // 157: grpc.Bridge.StartEventStream:output_type -> grpc.StreamEvent 62, // 157: grpc.Bridge.RemoveUser:output_type -> google.protobuf.Empty
62, // 158: grpc.Bridge.StopEventStream:output_type -> google.protobuf.Empty 62, // 158: grpc.Bridge.ConfigureUserAppleMail:output_type -> google.protobuf.Empty
105, // [105:159] is the sub-list for method output_type 17, // 159: grpc.Bridge.StartEventStream:output_type -> grpc.StreamEvent
51, // [51:105] is the sub-list for method input_type 62, // 160: grpc.Bridge.StopEventStream:output_type -> google.protobuf.Empty
106, // [106:161] is the sub-list for method output_type
51, // [51:106] is the sub-list for method input_type
51, // [51:51] is the sub-list for extension type_name 51, // [51:51] is the sub-list for extension type_name
51, // [51:51] is the sub-list for extension extendee 51, // [51:51] is the sub-list for extension extendee
0, // [0:51] is the sub-list for field type_name 0, // [0:51] is the sub-list for field type_name

View File

@ -53,6 +53,7 @@ service Bridge {
rpc ColorSchemeName(google.protobuf.Empty) returns (google.protobuf.StringValue); // TODO Color scheme should probably entirely be managed by the client. rpc ColorSchemeName(google.protobuf.Empty) returns (google.protobuf.StringValue); // TODO Color scheme should probably entirely be managed by the client.
rpc CurrentEmailClient(google.protobuf.Empty) returns (google.protobuf.StringValue); rpc CurrentEmailClient(google.protobuf.Empty) returns (google.protobuf.StringValue);
rpc ReportBug(ReportBugRequest) returns (google.protobuf.Empty); rpc ReportBug(ReportBugRequest) returns (google.protobuf.Empty);
rpc ForceLauncher(google.protobuf.StringValue) returns (google.protobuf.Empty);
// login // login
rpc Login(LoginRequest) returns (google.protobuf.Empty); rpc Login(LoginRequest) returns (google.protobuf.Empty);

View File

@ -1,7 +1,7 @@
// Code generated by protoc-gen-go-grpc. DO NOT EDIT. // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions: // versions:
// - protoc-gen-go-grpc v1.2.0 // - protoc-gen-go-grpc v1.2.0
// - protoc v3.21.2 // - protoc v3.21.3
// source: bridge.proto // source: bridge.proto
package grpc package grpc
@ -48,6 +48,7 @@ type BridgeClient interface {
ColorSchemeName(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.StringValue, error) ColorSchemeName(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.StringValue, error)
CurrentEmailClient(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.StringValue, error) CurrentEmailClient(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.StringValue, error)
ReportBug(ctx context.Context, in *ReportBugRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) ReportBug(ctx context.Context, in *ReportBugRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
ForceLauncher(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*emptypb.Empty, error)
// login // login
Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
Login2FA(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) Login2FA(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*emptypb.Empty, error)
@ -303,6 +304,15 @@ func (c *bridgeClient) ReportBug(ctx context.Context, in *ReportBugRequest, opts
return out, nil return out, nil
} }
func (c *bridgeClient) ForceLauncher(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/grpc.Bridge/ForceLauncher", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *bridgeClient) Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { func (c *bridgeClient) Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) {
out := new(emptypb.Empty) out := new(emptypb.Empty)
err := c.cc.Invoke(ctx, "/grpc.Bridge/Login", in, out, opts...) err := c.cc.Invoke(ctx, "/grpc.Bridge/Login", in, out, opts...)
@ -633,6 +643,7 @@ type BridgeServer interface {
ColorSchemeName(context.Context, *emptypb.Empty) (*wrapperspb.StringValue, error) ColorSchemeName(context.Context, *emptypb.Empty) (*wrapperspb.StringValue, error)
CurrentEmailClient(context.Context, *emptypb.Empty) (*wrapperspb.StringValue, error) CurrentEmailClient(context.Context, *emptypb.Empty) (*wrapperspb.StringValue, error)
ReportBug(context.Context, *ReportBugRequest) (*emptypb.Empty, error) ReportBug(context.Context, *ReportBugRequest) (*emptypb.Empty, error)
ForceLauncher(context.Context, *wrapperspb.StringValue) (*emptypb.Empty, error)
// login // login
Login(context.Context, *LoginRequest) (*emptypb.Empty, error) Login(context.Context, *LoginRequest) (*emptypb.Empty, error)
Login2FA(context.Context, *LoginRequest) (*emptypb.Empty, error) Login2FA(context.Context, *LoginRequest) (*emptypb.Empty, error)
@ -747,6 +758,9 @@ func (UnimplementedBridgeServer) CurrentEmailClient(context.Context, *emptypb.Em
func (UnimplementedBridgeServer) ReportBug(context.Context, *ReportBugRequest) (*emptypb.Empty, error) { func (UnimplementedBridgeServer) ReportBug(context.Context, *ReportBugRequest) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method ReportBug not implemented") return nil, status.Errorf(codes.Unimplemented, "method ReportBug not implemented")
} }
func (UnimplementedBridgeServer) ForceLauncher(context.Context, *wrapperspb.StringValue) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method ForceLauncher not implemented")
}
func (UnimplementedBridgeServer) Login(context.Context, *LoginRequest) (*emptypb.Empty, error) { func (UnimplementedBridgeServer) Login(context.Context, *LoginRequest) (*emptypb.Empty, error) {
return nil, status.Errorf(codes.Unimplemented, "method Login not implemented") return nil, status.Errorf(codes.Unimplemented, "method Login not implemented")
} }
@ -1267,6 +1281,24 @@ func _Bridge_ReportBug_Handler(srv interface{}, ctx context.Context, dec func(in
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _Bridge_ForceLauncher_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(wrapperspb.StringValue)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(BridgeServer).ForceLauncher(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/grpc.Bridge/ForceLauncher",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(BridgeServer).ForceLauncher(ctx, req.(*wrapperspb.StringValue))
}
return interceptor(ctx, in, info, handler)
}
func _Bridge_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { func _Bridge_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(LoginRequest) in := new(LoginRequest)
if err := dec(in); err != nil { if err := dec(in); err != nil {
@ -1927,6 +1959,10 @@ var Bridge_ServiceDesc = grpc.ServiceDesc{
MethodName: "ReportBug", MethodName: "ReportBug",
Handler: _Bridge_ReportBug_Handler, Handler: _Bridge_ReportBug_Handler,
}, },
{
MethodName: "ForceLauncher",
Handler: _Bridge_ForceLauncher_Handler,
},
{ {
MethodName: "Login", MethodName: "Login",
Handler: _Bridge_Login_Handler, Handler: _Bridge_Login_Handler,

View File

@ -335,7 +335,7 @@ func (s *Service) waitForUserChangeDone(done <-chan string, userID string) {
} }
func (s *Service) restart() { func (s *Service) restart() {
s.log.Error("Restart is not implemented") // TO-DO GODT-1671 implement restart. s.restarter.SetToRestart()
} }
func (s *Service) triggerReset() { func (s *Service) triggerReset() {

View File

@ -92,11 +92,14 @@ func (s *Service) Quit(ctx context.Context, empty *emptypb.Empty) (*emptypb.Empt
// Restart implement the Restart gRPC service call. // Restart implement the Restart gRPC service call.
func (s *Service) Restart(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { func (s *Service) Restart(context.Context, *emptypb.Empty) (*emptypb.Empty, error) {
s.log.Info("Restart") // TO-DO-GODT-1671 handle restart. s.log.Info("Restart")
go func() {
defer s.panicHandler.HandlePanic()
s.restart() s.restart()
}()
return nil, ErrNotImplemented return &emptypb.Empty{}, nil
} }
func (s *Service) ShowOnStartup(context.Context, *emptypb.Empty) (*wrapperspb.BoolValue, error) { func (s *Service) ShowOnStartup(context.Context, *emptypb.Empty) (*wrapperspb.BoolValue, error) {
@ -192,7 +195,7 @@ func (s *Service) TriggerReset(context.Context, *emptypb.Empty) (*emptypb.Empty,
defer s.panicHandler.HandlePanic() defer s.panicHandler.HandlePanic()
s.triggerReset() s.triggerReset()
}() }()
return nil, ErrNotImplemented return &emptypb.Empty{}, nil
} }
func (s *Service) Version(context.Context, *emptypb.Empty) (*wrapperspb.StringValue, error) { func (s *Service) Version(context.Context, *emptypb.Empty) (*wrapperspb.StringValue, error) {
@ -291,6 +294,15 @@ func (s *Service) ReportBug(_ context.Context, report *ReportBugRequest) (*empty
return &emptypb.Empty{}, nil return &emptypb.Empty{}, nil
} }
func (s *Service) ForceLauncher(_ context.Context, launcher *wrapperspb.StringValue) (*emptypb.Empty, error) {
s.log.WithField("launcher", launcher.Value).Info("ForceLauncher")
go func() {
defer s.panicHandler.HandlePanic()
s.restarter.ForceLauncher(launcher.Value)
}()
return &emptypb.Empty{}, nil
}
func (s *Service) Login(_ context.Context, login *LoginRequest) (*emptypb.Empty, error) { func (s *Service) Login(_ context.Context, login *LoginRequest) (*emptypb.Empty, error) {
s.log.WithField("username", login.Username).Info("Login") s.log.WithField("username", login.Username).Info("Login")
go func() { go func() {

View File

@ -32,6 +32,7 @@ type PanicHandler interface {
// Restarter allows the app to set itself to restart next time it is closed. // Restarter allows the app to set itself to restart next time it is closed.
type Restarter interface { type Restarter interface {
SetToRestart() SetToRestart()
ForceLauncher(string)
} }
type NoEncConfirmator interface { type NoEncConfirmator interface {

View File

@ -38,14 +38,16 @@ import (
type Locations struct { type Locations struct {
userConfig, userCache string userConfig, userCache string
configName string configName string
configGuiName string
} }
// New returns a new locations object. // New returns a new locations object.
func New(provider Provider, configName string) *Locations { func New(provider Provider, configName string) *Locations {
return &Locations{ return &Locations{
userConfig: provider.UserConfig(), userConfig: provider.UserConfig(),
userCache: provider.UserCache(), userCache: provider.UserCache(),
configName: configName, configName: configName,
configGuiName: configName + "-gui",
} }
} }
@ -54,6 +56,11 @@ func (l *Locations) GetLockFile() string {
return filepath.Join(l.userCache, l.configName+".lock") return filepath.Join(l.userCache, l.configName+".lock")
} }
// GetGuiLockFile returns the path to the lock file (e.g. ~/.cache/<company>/<app>/<app>.lock).
func (l *Locations) GetGuiLockFile() string {
return filepath.Join(l.userCache, l.configGuiName+".lock")
}
// GetLicenseFilePath returns path to liense file. // GetLicenseFilePath returns path to liense file.
func (l *Locations) GetLicenseFilePath() string { func (l *Locations) GetLicenseFilePath() string {
path := l.getLicenseFilePath() path := l.getLicenseFilePath()
@ -210,6 +217,7 @@ func (l *Locations) Clear() error {
l.userCache, l.userCache,
).Except( ).Except(
l.GetLockFile(), l.GetLockFile(),
l.GetGuiLockFile(),
l.getUpdatesPath(), l.getUpdatesPath(),
).Do() ).Do()
} }
@ -226,6 +234,7 @@ func (l *Locations) ClearUpdates() error {
func (l *Locations) Clean() error { func (l *Locations) Clean() error {
return files.Remove(l.userCache).Except( return files.Remove(l.userCache).Except(
l.GetLockFile(), l.GetLockFile(),
l.GetGuiLockFile(),
l.getLogsPath(), l.getLogsPath(),
l.getCachePath(), l.getCachePath(),
l.getUpdatesPath(), l.getUpdatesPath(),