From edf903fd216359b35edfa380d41791b53166805c Mon Sep 17 00:00:00 2001 From: Atanas Janeshliev Date: Tue, 16 Sep 2025 13:07:45 +0200 Subject: [PATCH] feat(BRIDGE-424): FIDO2 GUI support. --- COPYING_NOTES.md | 11 +- ci/setup.yml | 2 +- go.mod | 38 +- go.sum | 104 +- internal/fido/fido.go | 267 + internal/fido/fido_windows.go | 94 + internal/fido/types.go | 23 + internal/fido/utils.go | 111 + internal/focus/client.go | 3 +- internal/focus/proto/focus.pb.go | 76 +- internal/focus/proto/focus_grpc.pb.go | 45 +- .../bridge-gui/bridge-gui/QMLBackend.cpp | 20 +- .../bridge-gui/bridge-gui/QMLBackend.h | 10 + .../bridge-gui/bridge-gui/Resources.qrc | 2 + .../frontend/bridge-gui/bridge-gui/build.ps1 | 1 + .../bridge-gui/qml/NotificationDialog.qml | 56 +- .../bridge-gui/qml/NotificationPopups.qml | 12 + .../qml/Notifications/Notification.qml | 13 + .../qml/Notifications/Notifications.qml | 166 +- .../bridge-gui/qml/Proton/Spinner.qml | 52 + .../bridge-gui/bridge-gui/qml/Proton/qmldir | 1 + .../bridge-gui/qml/SetupWizard/Login.qml | 143 +- .../bridge-gui/qml/icons/fingerprint.svg | 4 + .../bridgepp/bridgepp/GRPC/EventFactory.cpp | 26 + .../bridgepp/bridgepp/GRPC/EventFactory.h | 4 +- .../bridgepp/bridgepp/GRPC/GRPCClient.cpp | 51 + .../bridgepp/bridgepp/GRPC/GRPCClient.h | 12 +- internal/frontend/cli/accounts.go | 53 +- internal/frontend/cli/u2f.go | 171 - internal/frontend/cli/u2f_windows.go | 126 - internal/frontend/cli/utils.go | 21 +- internal/frontend/grpc/bridge.pb.go | 4712 +++++++---------- internal/frontend/grpc/bridge.proto | 26 + internal/frontend/grpc/bridge_grpc.pb.go | 342 +- internal/frontend/grpc/event_factory.go | 20 + internal/frontend/grpc/fido.go | 111 + internal/frontend/grpc/fido/manager.go | 55 + internal/frontend/grpc/fido_windows.go | 53 + internal/frontend/grpc/service.go | 5 + internal/frontend/grpc/service_methods.go | 31 +- internal/unleash/service.go | 1 + tests/ctx_bridge_test.go | 3 +- 42 files changed, 3567 insertions(+), 3510 deletions(-) create mode 100644 internal/fido/fido.go create mode 100644 internal/fido/fido_windows.go create mode 100644 internal/fido/types.go create mode 100644 internal/fido/utils.go create mode 100644 internal/frontend/bridge-gui/bridge-gui/qml/Proton/Spinner.qml create mode 100644 internal/frontend/bridge-gui/bridge-gui/qml/icons/fingerprint.svg delete mode 100644 internal/frontend/cli/u2f.go delete mode 100644 internal/frontend/cli/u2f_windows.go create mode 100644 internal/frontend/grpc/fido.go create mode 100644 internal/frontend/grpc/fido/manager.go create mode 100644 internal/frontend/grpc/fido_windows.go diff --git a/COPYING_NOTES.md b/COPYING_NOTES.md index 456cd8d2..7054c162 100644 --- a/COPYING_NOTES.md +++ b/COPYING_NOTES.md @@ -42,7 +42,10 @@ Proton Mail Bridge includes the following 3rd party software: * [go-smtp](https://github.com/emersion/go-smtp) available under [license](https://github.com/emersion/go-smtp/blob/master/LICENSE) * [go-vcard](https://github.com/emersion/go-vcard) available under [license](https://github.com/emersion/go-vcard/blob/master/LICENSE) * [color](https://github.com/fatih/color) available under [license](https://github.com/fatih/color/blob/master/LICENSE) +* [cbor](https://github.com/fxamacker/cbor/v2) available under [license](https://github.com/fxamacker/cbor/v2/blob/master/LICENSE) * [sentry-go](https://github.com/getsentry/sentry-go) available under [license](https://github.com/getsentry/sentry-go/blob/master/LICENSE) +* [ctaphid](https://github.com/go-ctap/ctaphid) available under [license](https://github.com/go-ctap/ctaphid/blob/master/LICENSE) +* [winhello](https://github.com/go-ctap/winhello) available under [license](https://github.com/go-ctap/winhello/blob/master/LICENSE) * [resty](https://github.com/go-resty/resty/v2) available under [license](https://github.com/go-resty/resty/v2/blob/master/LICENSE) * [dbus](https://github.com/godbus/dbus) available under [license](https://github.com/godbus/dbus/blob/master/LICENSE) * [mock](https://github.com/golang/mock) available under [license](https://github.com/golang/mock/blob/master/LICENSE) @@ -52,6 +55,7 @@ Proton Mail Bridge includes the following 3rd party software: * [html2text](https://github.com/jaytaylor/html2text) available under [license](https://github.com/jaytaylor/html2text/blob/master/LICENSE) * [go-locale](https://github.com/jeandeaual/go-locale) available under [license](https://github.com/jeandeaual/go-locale/blob/master/LICENSE) * [go-keychain](https://github.com/keybase/go-keychain) available under [license](https://github.com/keybase/go-keychain/blob/master/LICENSE) +* [go-libfido2](https://github.com/keys-pub/go-libfido2) available under [license](https://github.com/keys-pub/go-libfido2/blob/master/LICENSE) * [dns](https://github.com/miekg/dns) available under [license](https://github.com/miekg/dns/blob/master/LICENSE) * [memory](https://github.com/pbnjay/memory) available under [license](https://github.com/pbnjay/memory/blob/master/LICENSE) * [errors](https://github.com/pkg/errors) available under [license](https://github.com/pkg/errors/blob/master/LICENSE) @@ -70,7 +74,6 @@ Proton Mail Bridge includes the following 3rd party software: * [grpc](https://google.golang.org/grpc) available under [license](https://github.com/grpc/grpc-go/blob/master/LICENSE) * [protobuf](https://google.golang.org/protobuf) available under [license](https://github.com/protocolbuffers/protobuf/blob/main/LICENSE) * [plist](https://howett.net/plist) available under [license](https://github.com/DHowett/go-plist/blob/main/LICENSE) -* [compute](https://cloud.google.com/go/compute) available under [license](https://pkg.go.dev/cloud.google.com/go/compute?tab=licenses) * [metadata](https://cloud.google.com/go/compute/metadata) available under [license](https://pkg.go.dev/cloud.google.com/go/compute/metadata?tab=licenses) * [bcrypt](https://github.com/ProtonMail/bcrypt) available under [license](https://github.com/ProtonMail/bcrypt/blob/master/LICENSE) * [go-crypto](https://github.com/ProtonMail/go-crypto) available under [license](https://github.com/ProtonMail/go-crypto/blob/master/LICENSE) @@ -111,6 +114,7 @@ Proton Mail Bridge includes the following 3rd party software: * [multierror](https://github.com/joeshaw/multierror) available under [license](https://github.com/joeshaw/multierror/blob/master/LICENSE) * [go](https://github.com/json-iterator/go) available under [license](https://github.com/json-iterator/go/blob/master/LICENSE) * [cpuid](https://github.com/klauspost/cpuid/v2) available under [license](https://github.com/klauspost/cpuid/v2/blob/master/LICENSE) +* [cose](https://github.com/ldclabs/cose) available under [license](https://github.com/ldclabs/cose/blob/master/LICENSE) * [go-urn](https://github.com/leodido/go-urn) available under [license](https://github.com/leodido/go-urn/blob/master/LICENSE) * [go-colorable](https://github.com/mattn/go-colorable) available under [license](https://github.com/mattn/go-colorable/blob/master/LICENSE) * [go-isatty](https://github.com/mattn/go-isatty) available under [license](https://github.com/mattn/go-isatty/blob/master/LICENSE) @@ -131,6 +135,7 @@ Proton Mail Bridge includes the following 3rd party software: * [golang-asm](https://github.com/twitchyliquid64/golang-asm) available under [license](https://github.com/twitchyliquid64/golang-asm/blob/master/LICENSE) * [codec](https://github.com/ugorji/go/codec) available under [license](https://github.com/ugorji/go/codec/blob/master/LICENSE) * [tagparser](https://github.com/vmihailenco/tagparser/v2) available under [license](https://github.com/vmihailenco/tagparser/v2/blob/master/LICENSE) +* [float16](https://github.com/x448/float16) available under [license](https://github.com/x448/float16/blob/master/LICENSE) * [smetrics](https://github.com/xrash/smetrics) available under [license](https://github.com/xrash/smetrics/blob/master/LICENSE) * [go-ordered-json](https://gitlab.com/c0b/go-ordered-json) available under [license](https://gitlab.com/c0b/go-ordered-json/blob/master/LICENSE) * [go.opencensus.io](https://pkg.go.dev/go.opencensus.io?tab=licenses) available under [license](https://pkg.go.dev/go.opencensus.io?tab=licenses) @@ -142,9 +147,11 @@ Proton Mail Bridge includes the following 3rd party software: * [appengine](https://google.golang.org/appengine) available under [license](https://pkg.go.dev/google.golang.org/appengine?tab=licenses) * [genproto](https://google.golang.org/genproto) available under [license](https://pkg.go.dev/google.golang.org/genproto?tab=licenses) * [yaml](https://gopkg.in/yaml.v3) available under [license](https://github.com/go-yaml/yaml/blob/v3.0.1/LICENSE) available under [license](https://github.com/go-yaml/yaml/blob/v3.0.1/LICENSE) -* [go-autostart](https://github.com/ElectroNafta/go-autostart) available under [license](https://github.com/ElectroNafta/go-autostart/blob/master/LICENSE) +* [go-autostart](https://github.com/ProtonMail/go-autostart) available under [license](https://github.com/ProtonMail/go-autostart/blob/master/LICENSE) * [go-message](https://github.com/ProtonMail/go-message) available under [license](https://github.com/ProtonMail/go-message/blob/master/LICENSE) * [go-smtp](https://github.com/ProtonMail/go-smtp) available under [license](https://github.com/ProtonMail/go-smtp/blob/master/LICENSE) +* [winhello](https://github.com/ProtonMail/winhello) available under [license](https://github.com/ProtonMail/winhello/blob/master/LICENSE) * [resty](https://github.com/LBeernaertProton/resty/v2) available under [license](https://github.com/LBeernaertProton/resty/v2/blob/master/LICENSE) * [go-keychain](https://github.com/cuthix/go-keychain) available under [license](https://github.com/cuthix/go-keychain/blob/master/LICENSE) +* [go-libfido2](https://github.com/ProtonMail/go-libfido2) available under [license](https://github.com/ProtonMail/go-libfido2/blob/master/LICENSE) diff --git a/ci/setup.yml b/ci/setup.yml index 207a5a51..3fee9618 100644 --- a/ci/setup.yml +++ b/ci/setup.yml @@ -1,5 +1,5 @@ --- include: - project: "go/bridge-internal" - ref: "chore/libfido2-build" + ref: "master" file: "ci/runners-setup.yml" diff --git a/go.mod b/go.mod index bcccc6d0..42f7499b 100644 --- a/go.mod +++ b/go.mod @@ -7,7 +7,7 @@ require ( github.com/Masterminds/semver/v3 v3.2.0 github.com/ProtonMail/gluon v0.17.1-0.20250627102828-b014b7cc8132 github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a - github.com/ProtonMail/go-proton-api v0.4.1-0.20250910105600-4de5d9039a5f + github.com/ProtonMail/go-proton-api v0.4.1-0.20250925134057-a44ee01d3b3b github.com/ProtonMail/gopenpgp/v2 v2.9.0-proton github.com/PuerkitoBio/goquery v1.8.1 github.com/abiosoft/ishell v2.0.0+incompatible @@ -26,12 +26,12 @@ require ( github.com/fatih/color v1.13.0 github.com/fxamacker/cbor/v2 v2.9.0 github.com/getsentry/sentry-go v0.15.0 - github.com/go-ctap/ctaphid v0.7.0 + github.com/go-ctap/ctaphid v0.8.1 github.com/go-ctap/winhello v0.1.0 github.com/go-resty/resty/v2 v2.7.0 github.com/godbus/dbus v4.1.0+incompatible github.com/golang/mock v1.6.0 - github.com/google/go-cmp v0.6.0 + github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/hashicorp/go-multierror v1.1.1 github.com/jaytaylor/html2text v0.0.0-20211105163654-bc68cce691ba @@ -43,24 +43,23 @@ require ( github.com/pkg/errors v0.9.1 github.com/pkg/profile v1.7.0 github.com/sirupsen/logrus v1.9.2 - github.com/stretchr/testify v1.10.0 + github.com/stretchr/testify v1.11.1 github.com/urfave/cli/v2 v2.24.4 github.com/vmihailenco/msgpack/v5 v5.3.5 go.uber.org/goleak v1.2.1 golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 - golang.org/x/net v0.40.0 - golang.org/x/oauth2 v0.7.0 - golang.org/x/sys v0.33.0 - golang.org/x/text v0.26.0 + golang.org/x/net v0.42.0 + golang.org/x/oauth2 v0.30.0 + golang.org/x/sys v0.35.0 + golang.org/x/text v0.28.0 google.golang.org/api v0.114.0 - google.golang.org/grpc v1.56.3 - google.golang.org/protobuf v1.33.0 + google.golang.org/grpc v1.75.1 + google.golang.org/protobuf v1.36.6 howett.net/plist v1.0.0 ) require ( - cloud.google.com/go/compute v1.19.1 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect + cloud.google.com/go/compute/metadata v0.7.0 // indirect github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf // indirect github.com/ProtonMail/go-crypto v1.3.0-proton // indirect github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f // indirect @@ -89,7 +88,7 @@ require ( github.com/goccy/go-json v0.10.2 // indirect github.com/gofrs/uuid v4.3.0+incompatible // indirect github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e // indirect - github.com/golang/protobuf v1.5.3 // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/google/pprof v0.0.0-20211214055906-6f57359322fd // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.7.1 // indirect @@ -126,20 +125,21 @@ require ( gitlab.com/c0b/go-ordered-json v0.0.0-20201030195603-febf46534d5a // indirect go.opencensus.io v0.24.0 // indirect golang.org/x/arch v0.3.0 // indirect - golang.org/x/crypto v0.39.0 // indirect - golang.org/x/mod v0.25.0 // indirect - golang.org/x/sync v0.15.0 // indirect - golang.org/x/tools v0.33.0 // indirect + golang.org/x/crypto v0.41.0 // indirect + golang.org/x/mod v0.26.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/tools v0.35.0 // indirect google.golang.org/appengine v1.6.7 // indirect google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) replace ( - github.com/ProtonMail/go-autostart => github.com/ElectroNafta/go-autostart v0.0.0-20250402094843-326608c16033 + github.com/ProtonMail/go-autostart => github.com/ProtonMail/go-autostart v0.0.0-20250402094843-326608c16033 github.com/emersion/go-message => github.com/ProtonMail/go-message v0.13.1-0.20240919135104-3bc88e6a9423 github.com/emersion/go-smtp => github.com/ProtonMail/go-smtp v0.0.0-20231109081432-2b3d50599865 + github.com/go-ctap/winhello => github.com/ProtonMail/winhello v0.0.0-20250918145518-a739b7dc2e56 github.com/go-resty/resty/v2 => github.com/LBeernaertProton/resty/v2 v2.0.0-20231129100320-dddf8030d93a github.com/keybase/go-keychain => github.com/cuthix/go-keychain v0.0.0-20240103134243-0b6a41580b77 - github.com/keys-pub/go-libfido2 => github.com/ElectroNafta/go-libfido2 v0.0.0-20250915152115-4584ec5a59ac + github.com/keys-pub/go-libfido2 => github.com/ProtonMail/go-libfido2 v0.0.0-20250916110427-df894d6d07a1 ) diff --git a/go.sum b/go.sum index acd43ac2..d0030eef 100644 --- a/go.sum +++ b/go.sum @@ -7,10 +7,8 @@ cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTj cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= +cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/longrunning v0.4.1 h1:v+yFJOfKC3yZdY6ZUI933pIYdhyhV8S3NpWrXWmg7jM= @@ -23,10 +21,6 @@ github.com/0xAX/notificator v0.0.0-20220220101646-ee9b8921e557 h1:l6surSnJ3RP4qA github.com/0xAX/notificator v0.0.0-20220220101646-ee9b8921e557/go.mod h1:sTrmvD/TxuypdOERsDOS7SndZg0rzzcCi1b6wQMXUYM= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ElectroNafta/go-autostart v0.0.0-20250402094843-326608c16033 h1:d2RB9rQmSusb0K+qSgB+DAY+8i+AXZ/o+oDHj2vAUaA= -github.com/ElectroNafta/go-autostart v0.0.0-20250402094843-326608c16033/go.mod h1:o0nKiWcK0e2G/90uL6akWRkzOV4mFcZmvpBPpigJvdw= -github.com/ElectroNafta/go-libfido2 v0.0.0-20250915152115-4584ec5a59ac h1:FYEkCIEW4MGkv7oehbGsfxJYsufq7wnBI8XAHrwVDZg= -github.com/ElectroNafta/go-libfido2 v0.0.0-20250915152115-4584ec5a59ac/go.mod h1:92J9LtSBl0UyUWljElJpTbMMNhC6VeY8dshsu40qjjo= github.com/Kodeworks/golang-image-ico v0.0.0-20141118225523-73f0f4cfade9/go.mod h1:7uhhqiBaR4CpN0k9rMjOtjpcfGd6DG2m04zQxKnWQ0I= github.com/LBeernaertProton/resty/v2 v2.0.0-20231129100320-dddf8030d93a h1:eQO/GF/+H8/9udc9QAgieFr+jr1tjXlJo35RAhsUbWY= github.com/LBeernaertProton/resty/v2 v2.0.0-20231129100320-dddf8030d93a/go.mod h1:iiP/OpA0CkcL3IGt1O0+/SIItFUbkkyw5BGXiVdTu+A= @@ -40,21 +34,27 @@ github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf h1:yc9daCCYUefEs github.com/ProtonMail/bcrypt v0.0.0-20211005172633-e235017c1baf/go.mod h1:o0ESU9p83twszAU8LBeJKFAAMX14tISa0yk4Oo5TOqo= github.com/ProtonMail/gluon v0.17.1-0.20250627102828-b014b7cc8132 h1:2HA7IRoYUA1Lm7yFl1JGskGotNnqIqKJJB/ZxYhoJ6w= github.com/ProtonMail/gluon v0.17.1-0.20250627102828-b014b7cc8132/go.mod h1:OMwmLjgk6yJHX/P5KPck9WOcBVWIJLvuGZjj/8Ts/cw= +github.com/ProtonMail/go-autostart v0.0.0-20250402094843-326608c16033 h1:4r/ALoiixOOyjc1WhpwlkrcSFtRnc1GHWhk7ERELwbs= +github.com/ProtonMail/go-autostart v0.0.0-20250402094843-326608c16033/go.mod h1:oTGdE7/DlWIr23G0IKW3OXK9wZ5Hw1GGiaJFccTvZi4= github.com/ProtonMail/go-crypto v0.0.0-20230321155629-9a39f2531310/go.mod h1:8TI4H3IbrackdNgv+92dI+rhpCaLqM0IfpgCgenFvRE= github.com/ProtonMail/go-crypto v1.3.0-proton h1:tAQKQRZX/73VmzK6yHSCaRUOvS/3OYSQzhXQsrR7yUM= github.com/ProtonMail/go-crypto v1.3.0-proton/go.mod h1:9whxjD8Rbs29b4XWbB8irEcE8KHMqaR2e7GWU1R+/PE= +github.com/ProtonMail/go-libfido2 v0.0.0-20250916110427-df894d6d07a1 h1:MpPKmpti7MswJG5il3A+P24+iGxMj8V7/3JSMSRM1+c= +github.com/ProtonMail/go-libfido2 v0.0.0-20250916110427-df894d6d07a1/go.mod h1:92J9LtSBl0UyUWljElJpTbMMNhC6VeY8dshsu40qjjo= github.com/ProtonMail/go-message v0.13.1-0.20240919135104-3bc88e6a9423 h1:p8nBDxvRnvDOyrcePKkPpErWGhDoTqpX8a1c54CcSu0= github.com/ProtonMail/go-message v0.13.1-0.20240919135104-3bc88e6a9423/go.mod h1:NBAn21zgCJ/52WLDyed18YvYFm5tEoeDauubFqLokM4= github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f h1:tCbYj7/299ekTTXpdwKYF8eBlsYsDVoggDAuAjoK66k= github.com/ProtonMail/go-mime v0.0.0-20230322103455-7d82a3887f2f/go.mod h1:gcr0kNtGBqin9zDW9GOHcVntrwnjrK+qdJ06mWYBybw= -github.com/ProtonMail/go-proton-api v0.4.1-0.20250910105600-4de5d9039a5f h1:BEX62gQfydYK8vUGaxQ6aWqqtVq0g6eHuv6JBwpDaJ8= -github.com/ProtonMail/go-proton-api v0.4.1-0.20250910105600-4de5d9039a5f/go.mod h1:9t9+oQfH+6ssa7O2nLv34Uyjv8UmqTPGbVNcFToewck= +github.com/ProtonMail/go-proton-api v0.4.1-0.20250925134057-a44ee01d3b3b h1:TOYM14eu1k/zgXOOQH86MP68+mc9ASpX0gasYI51TNs= +github.com/ProtonMail/go-proton-api v0.4.1-0.20250925134057-a44ee01d3b3b/go.mod h1:9t9+oQfH+6ssa7O2nLv34Uyjv8UmqTPGbVNcFToewck= github.com/ProtonMail/go-smtp v0.0.0-20231109081432-2b3d50599865 h1:EP1gnxLL5Z7xBSymE9nSTM27nRYINuvssAtDmG0suD8= github.com/ProtonMail/go-smtp v0.0.0-20231109081432-2b3d50599865/go.mod h1:qm27SGYgoIPRot6ubfQ/GpiPy/g3PaZAVRxiO/sDUgQ= github.com/ProtonMail/go-srp v0.0.7 h1:Sos3Qk+th4tQR64vsxGIxYpN3rdnG9Wf9K4ZloC1JrI= github.com/ProtonMail/go-srp v0.0.7/go.mod h1:giCp+7qRnMIcCvI6V6U3S1lDDXDQYx2ewJ6F/9wdlJk= github.com/ProtonMail/gopenpgp/v2 v2.9.0-proton h1:K3YRIBJo3YVObikaV9y1KWYGxFWRML+pFaiyh8ON2xA= github.com/ProtonMail/gopenpgp/v2 v2.9.0-proton/go.mod h1:NJ4RywdeD2sXCJyRRwb0ZYCx+QwGi14HUmlyNPegiwI= +github.com/ProtonMail/winhello v0.0.0-20250918145518-a739b7dc2e56 h1:OFDKuwogje2Nor+2X81P0wWGcSZPXu2HKNUE71o3qZI= +github.com/ProtonMail/winhello v0.0.0-20250918145518-a739b7dc2e56/go.mod h1:kJnpbFRhpEatnRc05/CTeq4cWR2LUE7P6+KsPP/zRnE= github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= github.com/abiosoft/ishell v2.0.0+incompatible h1:zpwIuEHc37EzrsIYah3cpevrIc8Oma7oZPxr03tlmmw= @@ -176,10 +176,8 @@ github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -github.com/go-ctap/ctaphid v0.7.0 h1:NLDPio3g9JaWQdE7nSO2HGFk2kUa/jm5EKt2pXwxP9E= -github.com/go-ctap/ctaphid v0.7.0/go.mod h1:0Lw4YghP45DtCQD8JHEvZ8bJvpcIm9R3fIKjDgcYQyw= -github.com/go-ctap/winhello v0.1.0 h1:ZWHwCbqMAHJH2opfGuW1tkAzDjs2wo++W2238Po5dH0= -github.com/go-ctap/winhello v0.1.0/go.mod h1:hcUpGmVxxS+zOn9foMfP98l0S0lpmHpMQpCqkWNF9kE= +github.com/go-ctap/ctaphid v0.8.1 h1:HIDoSfqInkUIRBVPv61fVB2CNZ5nYxoaIgqmt8vzcs4= +github.com/go-ctap/ctaphid v0.8.1/go.mod h1:jRVrVfCs30jdZkSH2PoBopv9ry+tK99mpYumE4GIbb8= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk= @@ -188,6 +186,10 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200625191551-73d3c3675aa3/go.mod h1:tQ2 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= +github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= +github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= @@ -202,8 +204,8 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG github.com/godbus/dbus v4.1.0+incompatible h1:WqqLRTsQic3apZUK9qC5sGNfXthmPXzUZ7nQPrNITa4= github.com/godbus/dbus v4.1.0+incompatible/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/goforj/godump v1.5.0 h1:QALI7uJkpiwAW3Anko+vOFQzLlWvB7YviYCJpE1sFIE= -github.com/goforj/godump v1.5.0/go.mod h1:lCaXaxNTozTNAMJTPY91/ntMqw3JF8FOL93jCNKpNW0= +github.com/goforj/godump v1.6.0 h1:3Dn8gaw5Xxxefr1ezTGTWrTKSr3ihK+eJ2xzRUoFfHQ= +github.com/goforj/godump v1.6.0/go.mod h1:/Vy+p50JtOkwsFN5dA1HQ7LS5gtPk3f61DaP4UR2o4s= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.3.0+incompatible h1:CaSVZxm5B+7o45rtab4jC2G37WGYX1zQfuU2i6DSvnc= github.com/gofrs/uuid v4.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= @@ -231,9 +233,8 @@ github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:W github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -242,9 +243,8 @@ github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -466,8 +466,8 @@ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= @@ -495,6 +495,18 @@ go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ= +go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I= +go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE= +go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E= +go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI= +go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg= +go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc= +go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= +go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= +go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= @@ -513,8 +525,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= -golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM= -golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -540,8 +552,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= -golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= +golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -570,13 +582,13 @@ golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= -golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= -golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -586,8 +598,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8= -golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -626,8 +638,8 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -647,8 +659,8 @@ golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M= -golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= @@ -678,12 +690,14 @@ golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= -golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= +golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= +golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -716,8 +730,8 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.56.3 h1:8I4C0Yq1EjstUzUJzpcRVbuYA2mODtEmpWiQoN/b2nc= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= +google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI= +google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -727,10 +741,8 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= +google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/internal/fido/fido.go b/internal/fido/fido.go new file mode 100644 index 00000000..b63577bb --- /dev/null +++ b/internal/fido/fido.go @@ -0,0 +1,267 @@ +// Copyright (c) 2025 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 . + +//go:build darwin || linux + +package fido + +import ( + "context" + "crypto/sha256" + "errors" + "fmt" + "time" + + "github.com/ProtonMail/go-proton-api" + "github.com/fxamacker/cbor/v2" + "github.com/keys-pub/go-libfido2" +) + +var ErrAssertionCancelled = errors.New("FIDO assertion cancelled") + +const ( + clientPinOption = "clientPin" + touchNotificationDelay = 500 * time.Millisecond +) + +func getFidoDevice() (fido2Device *libfido2.Device, err error) { + locs, err := libfido2.DeviceLocations() + if err != nil { + return nil, fmt.Errorf("could not find security key device location: %w", err) + } + + if len(locs) == 0 { + return nil, errors.New("no device found") + } + + if len(locs) > 1 { + return nil, errors.New("multiple security keys detected, please disconnect all but one device and try again") + } + + fido2Device, err = libfido2.NewDevice(locs[0].Path) + if err != nil { + return nil, fmt.Errorf("cannot open security key: %w", err) + } + + return fido2Device, nil +} + +func deviceHasOption(dev *libfido2.Device, name string) (bool, error) { + info, err := dev.Info() + if err != nil { + return false, fmt.Errorf("cannot get device info: %w", err) + } + + for _, opt := range info.Options { + if opt.Name == name && opt.Value == libfido2.True { + return true, err + } + } + + return false, err +} + +func IsPinSupported() (bool, error) { + dev, err := getFidoDevice() + if err != nil { + return false, err + } + + return deviceHasOption(dev, clientPinOption) +} + +func constructCredentialIDs(allowCredentials []interface{}) ([][]byte, error) { + var credentialIDs [][]byte //nolint:prealloc + for _, cred := range allowCredentials { + credMap, ok := cred.(map[string]interface{}) + if !ok { + continue + } + idArray, ok := credMap["id"].([]interface{}) + if !ok { + continue + } + credID := sliceAnyToByteArray(idArray) + credentialIDs = append(credentialIDs, credID) + } + + if len(credentialIDs) == 0 { + return nil, errors.New("no valid credential IDs found") + } + + return credentialIDs, nil +} + +func prepareFidoAuth(auth proton.Auth) (*libfido2.Device, authData, [][]byte, [32]byte, error) { + dev, err := getFidoDevice() + if err != nil { + return nil, authData{}, nil, [32]byte{}, fmt.Errorf("could not obtain security key device: %w", err) + } + + data, err := extractFidoAuthData(auth) + if err != nil { + return nil, authData{}, nil, [32]byte{}, fmt.Errorf("could not extract security key authentication data: %w", err) + } + + credentialIDs, err := constructCredentialIDs(data.AllowCredentials) + if err != nil { + return nil, authData{}, nil, [32]byte{}, err + } + + clientDataHash := sha256.Sum256(data.ClientDataJSONBytes) + + return dev, data, credentialIDs, clientDataHash, nil +} + +func processFidoAssertion(assertion *libfido2.Assertion) ([]byte, error) { + var authData []byte + if err := cbor.Unmarshal(assertion.AuthDataCBOR, &authData); err != nil { + return nil, fmt.Errorf("failed to decode CBOR authenticator data: %w", err) + } + return authData, nil +} + +func performAssertion(dev *libfido2.Device, rpID string, clientDataHash []byte, credentialIDs [][]byte, pin string) (*libfido2.Assertion, error) { + assertion, err := dev.Assertion( + rpID, + clientDataHash, + credentialIDs, + pin, + &libfido2.AssertionOpts{UP: libfido2.True}, + ) + if err != nil { + return nil, fmt.Errorf("FIDO2 assertion failed: %w", err) + } + return assertion, nil +} + +// performAssertationWithTimeout - initializes the assertion and sends data to the touchEventCh (with some delay) in parallel. +func performAssertionWithTimeout(ctx context.Context, dev *libfido2.Device, rpID string, clientDataHash []byte, credentialIDs [][]byte, pin string, touchEventCh chan struct{}) (*libfido2.Assertion, error) { + type assertionResult struct { + assertion *libfido2.Assertion + err error + } + + resultCh := make(chan assertionResult, 1) + go func() { + assertion, err := performAssertion(dev, rpID, clientDataHash, credentialIDs, pin) + resultCh <- assertionResult{assertion: assertion, err: err} + }() + + nearTimeout := time.NewTimer(touchNotificationDelay) + defer nearTimeout.Stop() + + select { + case result := <-resultCh: + if result.err != nil { + return nil, result.err + } + return result.assertion, nil + + case <-nearTimeout.C: + // Notify that touch is required. + select { + case touchEventCh <- struct{}{}: + default: + } + + // Wait for either completion or cancellation. + select { + case result := <-resultCh: + if result.err != nil { + return nil, result.err + } + return result.assertion, nil + + case <-ctx.Done(): + if err := dev.Cancel(); err != nil { + return nil, fmt.Errorf("%w: %v", ErrAssertionCancelled, err) + } + return nil, ErrAssertionCancelled + } + } +} + +func AuthWithHardwareKeyGUI(ctx context.Context, client *proton.Client, auth proton.Auth, touchEventCh chan struct{}, touchConfirmCh chan struct{}, pin string) error { + dev, fidoAuthData, credentialIDs, clientDataHash, err := prepareFidoAuth(auth) + if err != nil { + return err + } + + assertion, err := performAssertionWithTimeout(ctx, dev, fidoAuthData.RpID, clientDataHash[:], credentialIDs, pin, touchEventCh) + if err != nil { + return err + } + + // Notify that spinner should be displayed, as assertion has finished. + touchConfirmCh <- struct{}{} + + // Decode CBOR to get raw authenticator data. + authData, err := processFidoAssertion(assertion) + if err != nil { + return err + } + + return authWithFido(client, + auth, + assertion.CredentialID, + fidoAuthData.ClientDataJSONBytes, + authData, + assertion.Sig) +} + +func AuthWithHardwareKeyCLI(cliProvider CLIProvider, client *proton.Client, auth proton.Auth) error { + cliProvider.PromptAndWaitReturn("Please insert your security key") + + dev, fidoAuthData, credentialIDs, clientDataHash, err := prepareFidoAuth(auth) + if err != nil { + return err + } + + pinSupported, err := IsPinSupported() + if err != nil { + return fmt.Errorf("could not determine security key PIN support: %w", err) + } + + var pin string + if pinSupported { + pin = cliProvider.ReadSecurityKeyPin() + if pin == "" { + return errors.New("a PIN is required for this security key") + } + } + + fmt.Println("Please touch the button or sensor on your security key.") + assertion, err := performAssertion(dev, fidoAuthData.RpID, clientDataHash[:], credentialIDs, pin) + if err != nil { + return err + } + + authData, err := processFidoAssertion(assertion) + if err != nil { + return err + } + + fmt.Println("Submitting FIDO2 authentication request.") + return authWithFido( + client, + auth, + assertion.CredentialID, + fidoAuthData.ClientDataJSONBytes, + authData, + assertion.Sig) +} diff --git a/internal/fido/fido_windows.go b/internal/fido/fido_windows.go new file mode 100644 index 00000000..e48f73ef --- /dev/null +++ b/internal/fido/fido_windows.go @@ -0,0 +1,94 @@ +// Copyright (c) 2025 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 . + +//go:build windows + +package fido + +import ( + "fmt" + "time" + + "github.com/ProtonMail/go-proton-api" + "github.com/go-ctap/ctaphid/pkg/webauthntypes" + "github.com/go-ctap/winhello" + "github.com/go-ctap/winhello/window" +) + +func AuthWithHardwareKeyCLI(_ CLIProvider, client *proton.Client, auth proton.Auth) error { + return AuthWithHardwareKeyGUI(client, auth, true) +} + +func AuthWithHardwareKeyGUI(client *proton.Client, auth proton.Auth, onCLI bool) error { + fidoAuthData, err := extractFidoAuthData(auth) + if err != nil { + return fmt.Errorf("could not extract security key authentication data: %w", err) + } + + var credentialDescriptors []webauthntypes.PublicKeyCredentialDescriptor + for _, cred := range fidoAuthData.AllowCredentials { + credMap, ok := cred.(map[string]interface{}) + if !ok { + continue + } + idArray, ok := credMap["id"].([]interface{}) + if !ok { + continue + } + credID := sliceAnyToByteArray(idArray) + credentialDescriptors = append(credentialDescriptors, webauthntypes.PublicKeyCredentialDescriptor{ + ID: credID, + Type: webauthntypes.PublicKeyCredentialTypePublicKey, + }) + } + + if len(credentialDescriptors) == 0 { + return fmt.Errorf("no valid credential descriptors found") + } + + windowHandler, err := window.GetForegroundWindow() + if err != nil { + return fmt.Errorf("failed to obtain window handle: %w", err) + } + + if onCLI { + fmt.Println("Please use Windows Hello to authenticate.") + } + assertion, err := winhello.GetAssertion(windowHandler, + fidoAuthData.RpID, + fidoAuthData.ClientDataJSONBytes, + credentialDescriptors, + nil, + &winhello.AuthenticatorGetAssertionOptions{ + Timeout: time.Second * 60, + AuthenticatorAttachment: winhello.WinHelloAuthenticatorAttachmentCrossPlatform, + UserVerificationRequirement: winhello.WinHelloUserVerificationRequirementPreferred, + CredentialHints: []webauthntypes.PublicKeyCredentialHint{ + webauthntypes.PublicKeyCredentialHintSecurityKey, + }, + }, + ) + if err != nil { + return fmt.Errorf("windows Hello assertion failed: %w", err) + } + + if onCLI { + fmt.Println("Submitting FIDO2 authentication request.") + } + + return authWithFido(client, auth, assertion.Credential.ID, fidoAuthData.ClientDataJSONBytes, assertion.AuthDataRaw, assertion.Signature) +} diff --git a/internal/fido/types.go b/internal/fido/types.go new file mode 100644 index 00000000..75234600 --- /dev/null +++ b/internal/fido/types.go @@ -0,0 +1,23 @@ +// Copyright (c) 2025 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 . + +package fido + +type CLIProvider interface { + PromptAndWaitReturn(string) + ReadSecurityKeyPin() string +} diff --git a/internal/fido/utils.go b/internal/fido/utils.go new file mode 100644 index 00000000..a49735b9 --- /dev/null +++ b/internal/fido/utils.go @@ -0,0 +1,111 @@ +// Copyright (c) 2025 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 . + +package fido + +import ( + "context" + "encoding/base64" + "encoding/json" + "fmt" + + "github.com/ProtonMail/go-proton-api" +) + +type authData struct { + AllowCredentials []interface{} + ClientDataJSONBytes []byte + RpID string +} + +func extractFidoAuthData(auth proton.Auth) (authData, error) { + authOptions, ok := auth.TwoFA.FIDO2.AuthenticationOptions.(map[string]interface{}) + if !ok { + return authData{}, fmt.Errorf("invalid authentication options format") + } + + publicKey, ok := authOptions["publicKey"].(map[string]interface{}) + if !ok { + return authData{}, fmt.Errorf("no publicKey found in authentication options") + } + + rpID, ok := publicKey["rpId"].(string) + if !ok { + return authData{}, fmt.Errorf("could not find rpId in authentication options") + } + + challengeArray, ok := publicKey["challenge"].([]interface{}) + if !ok { + return authData{}, fmt.Errorf("no challenge found in authentication options") + } + challenge := sliceAnyToByteArray(challengeArray) + + allowCredentials, ok := publicKey["allowCredentials"].([]interface{}) + if !ok || len(allowCredentials) == 0 { + return authData{}, fmt.Errorf("no allowed credentials found in authentication options") + } + + clientDataJSON := map[string]interface{}{ + "type": "webauthn.get", + "challenge": base64.URLEncoding.WithPadding(base64.NoPadding).EncodeToString(challenge), + "origin": "https://" + rpID, + } + + clientDataJSONBytes, err := json.Marshal(clientDataJSON) + if err != nil { + return authData{}, fmt.Errorf("failed to marshal client data JSON: %w", err) + } + + return authData{ + AllowCredentials: allowCredentials, + ClientDataJSONBytes: clientDataJSONBytes, + RpID: rpID, + }, nil +} + +func sliceAnyToByteArray(s []any) []byte { + result := make([]byte, len(s)) + for i, val := range s { + if intVal, ok := val.(float64); ok { + result[i] = byte(intVal) + } else { + panic("boom") + } + } + return result +} + +func authWithFido(client *proton.Client, auth proton.Auth, credentialIDs []byte, clientDataJSON []byte, authDataRaw []byte, signature []byte) error { + credentialIDInts := make([]int, len(credentialIDs)) + for i, b := range credentialIDs { + credentialIDInts[i] = int(b) + } + + fido2Req := proton.FIDO2Req{ + AuthenticationOptions: auth.TwoFA.FIDO2.AuthenticationOptions, + ClientData: base64.StdEncoding.EncodeToString(clientDataJSON), + AuthenticatorData: base64.StdEncoding.EncodeToString(authDataRaw), + Signature: base64.StdEncoding.EncodeToString(signature), + CredentialID: credentialIDInts, + } + + if err := client.Auth2FA(context.Background(), proton.Auth2FAReq{FIDO2: fido2Req}); err != nil { + return fmt.Errorf("FIDO2 authentication failed: %w", err) + } + + return nil +} diff --git a/internal/focus/client.go b/internal/focus/client.go index 83b4e89c..a141ea58 100644 --- a/internal/focus/client.go +++ b/internal/focus/client.go @@ -87,8 +87,7 @@ func withClientConn(ctx context.Context, settingsPath string, fn func(context.Co if err != nil { return err } - cc, err := grpc.DialContext( - ctx, + cc, err := grpc.NewClient( net.JoinHostPort(Host, fmt.Sprint(config.Port)), grpc.WithTransportCredentials(insecure.NewCredentials()), ) diff --git a/internal/focus/proto/focus.pb.go b/internal/focus/proto/focus.pb.go index cafde844..901dfb14 100644 --- a/internal/focus/proto/focus.pb.go +++ b/internal/focus/proto/focus.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v3.21.12 +// protoc-gen-go v1.36.6 +// protoc v5.29.5 // source: focus.proto package proto @@ -30,6 +30,7 @@ import ( wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -40,20 +41,17 @@ const ( ) type VersionResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` unknownFields protoimpl.UnknownFields - - Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` + sizeCache protoimpl.SizeCache } func (x *VersionResponse) Reset() { *x = VersionResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_focus_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_focus_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *VersionResponse) String() string { @@ -64,7 +62,7 @@ func (*VersionResponse) ProtoMessage() {} func (x *VersionResponse) ProtoReflect() protoreflect.Message { mi := &file_focus_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -88,44 +86,29 @@ func (x *VersionResponse) GetVersion() string { var File_focus_proto protoreflect.FileDescriptor -var file_focus_proto_rawDesc = []byte{ - 0x0a, 0x0b, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x66, - 0x6f, 0x63, 0x75, 0x73, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0x2b, 0x0a, 0x0f, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x32, 0x81, - 0x01, 0x0a, 0x05, 0x46, 0x6f, 0x63, 0x75, 0x73, 0x12, 0x3d, 0x0a, 0x05, 0x52, 0x61, 0x69, 0x73, - 0x65, 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, 0x39, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 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, 0x16, 0x2e, 0x66, 0x6f, 0x63, - 0x75, 0x73, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x42, 0x3d, 0x5a, 0x3b, 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, 0x33, 0x2f, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2f, 0x66, 0x6f, 0x63, 0x75, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_focus_proto_rawDesc = "" + + "\n" + + "\vfocus.proto\x12\x05focus\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1egoogle/protobuf/wrappers.proto\"+\n" + + "\x0fVersionResponse\x12\x18\n" + + "\aversion\x18\x01 \x01(\tR\aversion2\x81\x01\n" + + "\x05Focus\x12=\n" + + "\x05Raise\x12\x1c.google.protobuf.StringValue\x1a\x16.google.protobuf.Empty\x129\n" + + "\aVersion\x12\x16.google.protobuf.Empty\x1a\x16.focus.VersionResponseB=Z;github.com/ProtonMail/proton-bridge/v3/internal/focus/protob\x06proto3" var ( file_focus_proto_rawDescOnce sync.Once - file_focus_proto_rawDescData = file_focus_proto_rawDesc + file_focus_proto_rawDescData []byte ) func file_focus_proto_rawDescGZIP() []byte { file_focus_proto_rawDescOnce.Do(func() { - file_focus_proto_rawDescData = protoimpl.X.CompressGZIP(file_focus_proto_rawDescData) + file_focus_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_focus_proto_rawDesc), len(file_focus_proto_rawDesc))) }) return file_focus_proto_rawDescData } var file_focus_proto_msgTypes = make([]protoimpl.MessageInfo, 1) -var file_focus_proto_goTypes = []interface{}{ +var file_focus_proto_goTypes = []any{ (*VersionResponse)(nil), // 0: focus.VersionResponse (*wrapperspb.StringValue)(nil), // 1: google.protobuf.StringValue (*emptypb.Empty)(nil), // 2: google.protobuf.Empty @@ -147,25 +130,11 @@ func file_focus_proto_init() { if File_focus_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_focus_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VersionResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_focus_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_focus_proto_rawDesc), len(file_focus_proto_rawDesc)), NumEnums: 0, NumMessages: 1, NumExtensions: 0, @@ -176,7 +145,6 @@ func file_focus_proto_init() { MessageInfos: file_focus_proto_msgTypes, }.Build() File_focus_proto = out.File - file_focus_proto_rawDesc = nil file_focus_proto_goTypes = nil file_focus_proto_depIdxs = nil } diff --git a/internal/focus/proto/focus_grpc.pb.go b/internal/focus/proto/focus_grpc.pb.go index 3bb593c7..813f5686 100644 --- a/internal/focus/proto/focus_grpc.pb.go +++ b/internal/focus/proto/focus_grpc.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v3.21.12 +// - protoc-gen-go-grpc v1.5.1 +// - protoc v5.29.5 // source: focus.proto package proto @@ -34,8 +34,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( Focus_Raise_FullMethodName = "/focus.Focus/Raise" @@ -45,6 +45,12 @@ const ( // FocusClient is the client API for Focus service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// ********************************************************************************************************************** +// +// Service Declaration +// +// **********************************************************************************************************************≠–– type FocusClient interface { Raise(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*emptypb.Empty, error) Version(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*VersionResponse, error) @@ -59,8 +65,9 @@ func NewFocusClient(cc grpc.ClientConnInterface) FocusClient { } func (c *focusClient) Raise(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Focus_Raise_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Focus_Raise_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -68,8 +75,9 @@ func (c *focusClient) Raise(ctx context.Context, in *wrapperspb.StringValue, opt } func (c *focusClient) Version(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*VersionResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(VersionResponse) - err := c.cc.Invoke(ctx, Focus_Version_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Focus_Version_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -78,16 +86,25 @@ func (c *focusClient) Version(ctx context.Context, in *emptypb.Empty, opts ...gr // FocusServer is the server API for Focus service. // All implementations must embed UnimplementedFocusServer -// for forward compatibility +// for forward compatibility. +// +// ********************************************************************************************************************** +// +// Service Declaration +// +// **********************************************************************************************************************≠–– type FocusServer interface { Raise(context.Context, *wrapperspb.StringValue) (*emptypb.Empty, error) Version(context.Context, *emptypb.Empty) (*VersionResponse, error) mustEmbedUnimplementedFocusServer() } -// UnimplementedFocusServer must be embedded to have forward compatible implementations. -type UnimplementedFocusServer struct { -} +// UnimplementedFocusServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedFocusServer struct{} func (UnimplementedFocusServer) Raise(context.Context, *wrapperspb.StringValue) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Raise not implemented") @@ -96,6 +113,7 @@ func (UnimplementedFocusServer) Version(context.Context, *emptypb.Empty) (*Versi return nil, status.Errorf(codes.Unimplemented, "method Version not implemented") } func (UnimplementedFocusServer) mustEmbedUnimplementedFocusServer() {} +func (UnimplementedFocusServer) testEmbeddedByValue() {} // UnsafeFocusServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to FocusServer will @@ -105,6 +123,13 @@ type UnsafeFocusServer interface { } func RegisterFocusServer(s grpc.ServiceRegistrar, srv FocusServer) { + // If the following call pancis, it indicates UnimplementedFocusServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&Focus_ServiceDesc, srv) } diff --git a/internal/frontend/bridge-gui/bridge-gui/QMLBackend.cpp b/internal/frontend/bridge-gui/bridge-gui/QMLBackend.cpp index 9beeb51a..c1104832 100644 --- a/internal/frontend/bridge-gui/bridge-gui/QMLBackend.cpp +++ b/internal/frontend/bridge-gui/bridge-gui/QMLBackend.cpp @@ -863,6 +863,12 @@ void QMLBackend::login2FA(QString const &username, QString const &code) const { ) } +void QMLBackend::loginFido(const QString &username, QString const &pin) const { + HANDLE_EXCEPTION( + app().grpc().loginFido(username, pin); + ) +} + //**************************************************************************************************************************************************** /// \param[in] username The username. @@ -884,6 +890,11 @@ void QMLBackend::loginAbort(QString const &username) const { ) } +void QMLBackend::abortFidoAssertion(QString const &username) const { + HANDLE_EXCEPTION( + app().grpc().abortFidoAssertion(username); + ) +} //**************************************************************************************************************************************************** /// \param[in] active Should DoH be active. @@ -1206,7 +1217,6 @@ void QMLBackend::onLoginAlreadyLoggedIn(QString const &userID) { ) } - //**************************************************************************************************************************************************** /// \param[in] userID The userID. //**************************************************************************************************************************************************** @@ -1347,11 +1357,19 @@ void QMLBackend::connectGrpcEvents() { connect(client, &GRPCClient::login2FARequested, this, &QMLBackend::login2FARequested); connect(client, &GRPCClient::login2FAError, this, &QMLBackend::login2FAError); connect(client, &GRPCClient::login2FAErrorAbort, this, &QMLBackend::login2FAErrorAbort); + connect(client, &GRPCClient::loginFidoRequested, this, &QMLBackend::loginFidoRequested); + connect(client, &GRPCClient::login2FAOrFidoRequested, this, &QMLBackend::login2FAOrFidoRequested); connect(client, &GRPCClient::login2PasswordRequested, this, &QMLBackend::login2PasswordRequested); connect(client, &GRPCClient::login2PasswordError, this, &QMLBackend::login2PasswordError); connect(client, &GRPCClient::login2PasswordErrorAbort, this, &QMLBackend::login2PasswordErrorAbort); connect(client, &GRPCClient::loginFinished, this, &QMLBackend::onLoginFinished); connect(client, &GRPCClient::loginAlreadyLoggedIn, this, &QMLBackend::onLoginAlreadyLoggedIn); + connect(client, &GRPCClient::loginFidoTouchRequested, this, &QMLBackend::loginFidoTouchRequested); + connect(client, &GRPCClient::loginFidoTouchCompleted, this, &QMLBackend::loginFidoTouchCompleted); + connect(client, &GRPCClient::loginFidoPinRequired, this, &QMLBackend::loginFidoPinRequired); + connect(client, &GRPCClient::loginFidoPinInvalid, this, &QMLBackend::loginFidoPinInvalid); + connect(client, &GRPCClient::loginFidoPinBlocked, this, &QMLBackend::loginFidoPinBlocked); + connect(client, &GRPCClient::loginFidoError, this, &QMLBackend::loginFidoError); connect(client, &GRPCClient::loginHvRequested, this, &QMLBackend::loginHvRequested); connect(client, &GRPCClient::loginHvError, this, &QMLBackend::loginHvError); diff --git a/internal/frontend/bridge-gui/bridge-gui/QMLBackend.h b/internal/frontend/bridge-gui/bridge-gui/QMLBackend.h index 8eea7a82..f0edd7c2 100644 --- a/internal/frontend/bridge-gui/bridge-gui/QMLBackend.h +++ b/internal/frontend/bridge-gui/bridge-gui/QMLBackend.h @@ -193,8 +193,10 @@ public slots: // slot for signals received from QML -> To be forwarded to Bridge void login(QString const &username, QString const &password) const; ///< Slot for the login button (initial login). void loginHv(QString const &username, QString const &password) const; ///< Slot for the login button (after HV challenge completed). void login2FA(QString const &username, QString const &code) const; ///< Slot for the login button (2FA login). + void loginFido(QString const &username, QString const &pin) const; ///< Slot for the authenticate button (FIDO2/Security Key login). void login2Password(QString const &username, QString const &password) const; ///< Slot for the login button (mailbox password login). void loginAbort(QString const &username) const; ///< Slot for the login abort procedure. + void abortFidoAssertion(QString const &username) const; ///< Slot for aborting the FIDO login procedure. void toggleDoH(bool active); ///, Slot for the DoH toggle. void toggleAutomaticUpdate(bool makeItActive); ///< Slot for the automatic update toggle void updateCurrentMailClient(); ///< Slot for the change of the current mail client. @@ -242,11 +244,19 @@ signals: // Signals received from the Go backend, to be forwarded to QML void login2FARequested(QString const &username); ///< Signal for the 'login2FARequested' gRPC stream event. void login2FAError(QString const &errorMsg); ///< Signal for the 'login2FAError' gRPC stream event. void login2FAErrorAbort(QString const &errorMsg); ///< Signal for the 'login2FAErrorAbort' gRPC stream event. + void loginFidoRequested(QString const &username); ///< Signal for the 'loginFidoRequested' gRPC stream event. + void login2FAOrFidoRequested(QString const &username); ///qml/icons/systray-mono-warn.png qml/icons/systray.svg qml/icons/ic-notification-bell.svg + qml/icons/fingerprint.svg ../../../../dist/bridge.svg ../../../../dist/bridgeMacOS.svg qml/KeychainSettings.qml @@ -112,6 +113,7 @@ qml/Proton/TextArea.qml qml/Proton/TextField.qml qml/Proton/Toggle.qml + qml/Proton/Spinner.qml qml/Resources/bug_report_flow.json qml/Resources/Help/Template.html qml/Resources/Help/WhyBridge.html diff --git a/internal/frontend/bridge-gui/bridge-gui/build.ps1 b/internal/frontend/bridge-gui/bridge-gui/build.ps1 index d88a73c2..749adcdd 100644 --- a/internal/frontend/bridge-gui/bridge-gui/build.ps1 +++ b/internal/frontend/bridge-gui/bridge-gui/build.ps1 @@ -22,6 +22,7 @@ Write-host "Bridge-gui directory is $scriptDir" Write-host "Bridge repos root dir $bridgeRepoRootDir" Push-Location $scriptDir + $ErrorActionPreference = "Stop" $cmakeExe=$(Get-Command cmake).source diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/NotificationDialog.qml b/internal/frontend/bridge-gui/bridge-gui/qml/NotificationDialog.qml index 918f4143..d57ef8af 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/NotificationDialog.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/NotificationDialog.qml @@ -24,6 +24,9 @@ Dialog { property var notification property bool isUserNotification: false + // Placeholder for text input label text. + property string textFieldText: "" + modal: true shouldShow: notification && notification.active && !notification.dismissed @@ -53,6 +56,7 @@ Dialog { sourceSize.width: 64 visible: source != "" } + Label { Layout.alignment: Qt.AlignHCenter Layout.bottomMargin: 8 @@ -83,6 +87,43 @@ Dialog { implicitWidth: additionalChildrenContainer.childrenRect.width visible: children.length > 0 } + + Image { + Layout.alignment: Qt.AlignHCenter + Layout.bottomMargin: 16 + Layout.preferredHeight: 64 + Layout.preferredWidth: 64 + source: root.notification.additionalImageSrc + sourceSize.height: 64 + sourceSize.width: 64 + visible: root.notification.additionalImageSrc != "" + } + + TextField { + id: textField + Layout.fillWidth: true + Layout.preferredWidth: 240 + Layout.bottomMargin: 16 + colorScheme: root.colorScheme + text: root.textFieldText + visible: root.notification && root.notification.useTextField + + onTextChanged: root.notification.textFieldChanged(text) + + Connections { + target: root.notification + function onClearTextFieldRequested() { + root.notification.textFieldChanged("") + textField.clear(); + } + + function onFocusTextField() { + textField.focus = true; + } + } + } + + LinkLabel { Layout.alignment: Qt.AlignHCenter Layout.bottomMargin: 32 @@ -94,6 +135,18 @@ Dialog { } + Spinner { + Layout.alignment: Qt.AlignHCenter + colorScheme: root.colorScheme + Layout.bottomMargin: 16 + Layout.preferredHeight: 64 + Layout.preferredWidth: 64 + size: 64 + running: true + visible: root.notification && root.notification.busyIndicator + } + + ColumnLayout { spacing: 8 @@ -105,8 +158,7 @@ Dialog { action: modelData colorScheme: root.colorScheme loading: modelData.loading - secondary: index > 0 - } + secondary: modelData.forceSecondary !== undefined ? modelData.forceSecondary : index > 0 } } } } diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/NotificationPopups.qml b/internal/frontend/bridge-gui/bridge-gui/qml/NotificationPopups.qml index 5fc59fe6..761b7066 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/NotificationPopups.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/NotificationPopups.qml @@ -109,6 +109,18 @@ Item { colorScheme: root.colorScheme notification: root.notifications.repairBridge } + NotificationDialog { + colorScheme: root.colorScheme + notification: root.notifications.touchFidoKey + } + NotificationDialog { + colorScheme: root.colorScheme + notification: root.notifications.fidoPinRequested + } + NotificationDialog { + colorScheme: root.colorScheme + notification: root.notifications.fidoPinBlocked + } UserNotificationDialog { colorScheme: root.colorScheme notification: root.notifications.userNotification diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/Notification.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/Notification.qml index cf54cd8b..c3dfedcd 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/Notification.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/Notification.qml @@ -40,6 +40,19 @@ QtObject { property string subtitle property string username + // Whether to display a spinner. + property bool busyIndicator: false + + // Whether to display a text input field. + property bool useTextField: false + + // Source for an additional image, won't be displayed if empty. + property string additionalImageSrc: "" + + // Text input field operations via signals. + signal clearTextFieldRequested() + signal textFieldChanged(string value) + signal focusTextField() onActiveChanged: { dismissed = false; diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/Notifications.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/Notifications.qml index 7cf30e21..dee87f2d 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/Notifications.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Notifications/Notifications.qml @@ -62,7 +62,7 @@ QtObject { target: Backend } } - property var all: [root.noInternet, root.imapPortStartupError, root.smtpPortStartupError, root.imapPortChangeError, root.smtpPortChangeError, root.imapConnectionModeChangeError, root.smtpConnectionModeChangeError, root.updateManualReady, root.updateManualRestartNeeded, root.updateManualError, root.updateForce, root.updateForceError, root.updateSilentRestartNeeded, root.updateSilentError, root.updateIsLatestVersion, root.loginConnectionError, root.onlyPaidUsers, root.alreadyLoggedIn, root.enableBeta, root.bugReportSendSuccess, root.bugReportSendError, root.bugReportSendFallback, root.cacheCantMove, root.cacheLocationChangeSuccess, root.enableSplitMode, root.resetBridge, root.changeAllMailVisibility, root.deleteAccount, root.noKeychain, root.rebuildKeychain, root.addressChanged, root.apiCertIssue, root.userBadEvent, root.imapLoginWhileSignedOut, root.genericError, root.genericQuestion, root.hvErrorEvent, root.repairBridge, root.userNotification] + property var all: [root.noInternet, root.imapPortStartupError, root.smtpPortStartupError, root.imapPortChangeError, root.smtpPortChangeError, root.imapConnectionModeChangeError, root.smtpConnectionModeChangeError, root.updateManualReady, root.updateManualRestartNeeded, root.updateManualError, root.updateForce, root.updateForceError, root.updateSilentRestartNeeded, root.updateSilentError, root.updateIsLatestVersion, root.loginConnectionError, root.onlyPaidUsers, root.alreadyLoggedIn, root.enableBeta, root.bugReportSendSuccess, root.bugReportSendError, root.bugReportSendFallback, root.cacheCantMove, root.cacheLocationChangeSuccess, root.enableSplitMode, root.resetBridge, root.changeAllMailVisibility, root.deleteAccount, root.noKeychain, root.rebuildKeychain, root.addressChanged, root.apiCertIssue, root.userBadEvent, root.imapLoginWhileSignedOut, root.genericError, root.genericQuestion, root.hvErrorEvent, root.repairBridge, root.userNotification, root.touchFidoKey, root.fidoPinRequested, root.fidoPinBlocked, root.fidoErrorEvent] property Notification alreadyLoggedIn: Notification { brief: qsTr("Already signed in") description: qsTr("This account is already signed in.") @@ -1229,6 +1229,170 @@ QtObject { } } + + property Notification touchFidoKey: Notification { + title: qsTr("Touch your security key") + description: qsTr("To complete authentication, touch the button or sensor on your security key.") + group: Notifications.Group.Dialogs + icon: "./icons/ic-exclamation-circle-filled.svg" + type: Notification.NotificationType.Info + additionalImageSrc: "./icons/fingerprint.svg" + + function reset() { + root.touchFidoKey.active = false; + root.touchFidoKey.busyIndicator = false; + root.touchFidoKey.additionalImageSrc = "./icons/fingerprint.svg"; + } + + action: [ + Action { + id: touchFidoKey_cancel + text: qsTr("Cancel") + property bool forceSecondary: true + + onTriggered: { + Backend.abortFidoAssertion(root.touchFidoKey.username); + root.touchFidoKey.reset(); + } + } + ] + + Connections { + function onLoginFidoTouchRequested(username) { + root.touchFidoKey.username = username; + root.touchFidoKey.active = true; + touchFidoKey_cancel.enabled = true; + } + function onLoginFidoTouchCompleted(_) { + root.touchFidoKey.additionalImageSrc = ""; + root.touchFidoKey.busyIndicator = true; + touchFidoKey_cancel.enabled = false; + } + function onLoginFidoPinInvalid(_) { + root.touchFidoKey.reset(); + } + function onLoginFinished(_) { + root.touchFidoKey.reset(); + } + function onLoginFidoError(errorMsg) { + root.touchFidoKey.reset(); + } + target: Backend + } + } + + property Notification fidoPinRequested: Notification { + property string fidoPinInput: "" + + title: qsTr("Enter security key PIN") + description: qsTr("To continue, enter the PIN for your security key.") + group: Notifications.Group.Dialogs + icon: "./icons/ic-exclamation-circle-filled.svg" + type: Notification.NotificationType.Info + useTextField: true + + onTextFieldChanged: function(value) { + root.fidoPinRequested.fidoPinInput = value; + } + + function reset() { + root.fidoPinRequested.active = false; + root.fidoPinRequested.clearTextFieldRequested(); + root.fidoPinRequested.type = Notification.NotificationType.Info; + } + function clearAndFocusTextField() { + root.fidoPinRequested.clearTextFieldRequested(); + root.fidoPinRequested.focusTextField() + } + + action: [ + Action { + text: qsTr("Continue") + onTriggered: { + Backend.loginFido("", Qt.btoa(root.fidoPinRequested.fidoPinInput)); + root.fidoPinRequested.reset(); + } + }, + Action { + text: qsTr("Cancel") + onTriggered: { + root.fidoPinRequested.reset(); + } + } + ] + + Connections { + function onLoginFidoPinRequired(_) { + root.fidoPinRequested.clearAndFocusTextField(); + root.fidoPinRequested.active = true; + } + function onLoginFidoPinInvalid(_) { + root.fidoPinRequested.clearAndFocusTextField(); + root.fidoPinRequested.active = true; + root.fidoPinRequested.description = qsTr("The PIN you entered is incorrect. Try again."); + root.fidoPinRequested.type = Notification.NotificationType.Warning; + } + function onLoginFidoTouchRequested(_) { + root.fidoPinRequested.reset(); + } + function onLoginFinished(_) { + root.fidoPinRequested.reset(); + } + function onLoginFidoError(errorMsg) { + root.fidoPinRequested.reset(); + } + target: Backend + } + } + + property Notification fidoPinBlocked: Notification { + title: qsTr("Security key PIN blocked") + description: qsTr("Your security key PIN is blocked due to too many failed attempts. Try removing and re-inserting your key, or check your security key's documentation for unlock instructions.") + group: Notifications.Group.Dialogs + icon: "./icons/ic-exclamation-circle-filled.svg" + type: Notification.NotificationType.Danger + + action: [ + Action { + text: qsTr("OK") + onTriggered: { + root.fidoPinBlocked.active = false; + root.touchFidoKey.reset(); + root.fidoPinRequested.reset(); + } + } + ] + + Connections { + function onLoginFidoPinBlocked(_) { + root.fidoPinBlocked.active = true; + } + target: Backend + } + } + + property Notification fidoErrorEvent: Notification { + group: Notifications.Group.Configuration + icon: "./icons/ic-exclamation-circle-filled.svg" + type: Notification.NotificationType.Danger + + action: Action { + text: qsTr("OK") + onTriggered: { + root.fidoErrorEvent.active = false; + } + } + + Connections { + function onLoginFidoError(errorMsg) { + root.fidoErrorEvent.active = true; + root.fidoErrorEvent.description = errorMsg; + } + target: Backend + } + + } + signal askChangeAllMailVisibility(var isVisibleNow) signal askDeleteAccount(var user) signal askEnableBeta diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Spinner.qml b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Spinner.qml new file mode 100644 index 00000000..0051afa2 --- /dev/null +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/Spinner.qml @@ -0,0 +1,52 @@ +// Copyright (c) 2025 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 . + +import QtQuick +import QtQuick.Controls.impl + +Item { + id: root + + property ColorScheme colorScheme: ProtonStyle.currentStyle + property color color: colorScheme.interaction_norm + property int size: 16 + property bool running: true + property int duration: 1000 + property string source: "/qml/icons/Loader_48.svg" + + implicitWidth: size + implicitHeight: size + + ColorImage { + id: spinnerImage + anchors.centerIn: parent + width: root.size + height: root.size + source: root.source + color: root.color + sourceSize.width: root.size + sourceSize.height: root.size + visible: root.running + + RotationAnimation { + target: spinnerImage + property: "rotation" + from: 0 + to: 360 + duration: root.duration + loops: Animation.Infinite + running: root.running + direction: RotationAnimation.Clockwise + } + } +} \ No newline at end of file diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/qmldir b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/qmldir index a00cb1b6..2a68ee00 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/Proton/qmldir +++ b/internal/frontend/bridge-gui/bridge-gui/qml/Proton/qmldir @@ -40,3 +40,4 @@ TextField 4.0 TextField.qml Toggle 4.0 Toggle.qml WebFrame 4.0 WebFrame.qml ContextMenu 4.0 ContextMenu.qml +Spinner 1.0 Spinner.qml \ No newline at end of file diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/Login.qml b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/Login.qml index 2b5f0cb7..70d39959 100644 --- a/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/Login.qml +++ b/internal/frontend/bridge-gui/bridge-gui/qml/SetupWizard/Login.qml @@ -21,6 +21,8 @@ FocusScope { enum RootStack { Login, TOTP, + FIDO, + TOTPOrFIDO, MailboxPassword, HV } @@ -51,6 +53,7 @@ FocusScope { passwordTextField.hidePassword(); secondPasswordTextField.hidePassword(); hvLinkClicked = false; + fidoLayout.reset(); } function resetViaHv() { usernameTextField.enabled = false; @@ -93,6 +96,29 @@ FocusScope { twoFactorUsernameLabel.text = username; stackLayout.currentIndex = Login.RootStack.TOTP; twoFactorPasswordTextField.focus = true; + switchToTotpButton.visible = false; + switchToFidoButton.visible = false; + } + function onLoginFidoRequested(username) { + fidoUsernameLabel.text = username; + stackLayout.currentIndex = Login.RootStack.FIDO; + switchToTotpButton.visible = false; + switchToFidoButton.visible = false; + } + function onLogin2FAOrFidoRequested(username) { + fidoUsernameLabel.text = username; + twoFactorUsernameLabel.text = username; + stackLayout.currentIndex = Login.RootStack.FIDO; + switchToTotpButton.visible = true; + switchToFidoButton.visible = true; + } + function onLoginFidoPinBlocked(_) { + console.assert(stackLayout.currentIndex === Login.RootStack.FIDO, "Unexpected onLoginFidoPinBlocked"); + root.reset(); + } + function onLoginFidoError(_) { + console.assert(stackLayout.currentIndex === Login.RootStack.FIDO || stackLayout.currentIndex === Login.RootStack.Login, "Unexpected loginFidoError"); + root.reset(); } function onLogin2PasswordError(_) { console.assert(stackLayout.currentIndex === Login.RootStack.MailboxPassword, "Unexpected login2PasswordError"); @@ -352,7 +378,7 @@ FocusScope { Layout.fillWidth: true colorScheme: wizard.colorScheme horizontalAlignment: Text.AlignHCenter - text: qsTr("You have enabled two-factor authentication. Please enter the 6-digit code provided by your authenticator application.") + text: qsTr("You have enabled two-factor authentication. Enter the 6-digit code provided by your authenticator application.") type: Label.LabelType.Body wrapMode: Text.WordWrap } @@ -406,6 +432,117 @@ FocusScope { root.abort(); } } + Label { + id: switchToFidoButton + Layout.fillWidth: true + Layout.alignment: Qt.AlignHCenter + colorScheme: wizard.colorScheme + horizontalAlignment: Text.AlignHCenter + text: "" + qsTr("Use security key instead") + "" + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + enabled: !twoFAButton.loading + onClicked: { + stackLayout.currentIndex = Login.RootStack.FIDO; + fidoLayout.reset(); + totpLayout.reset(); + } + } + } + } + } + Item { + ColumnLayout { + id: fidoLayout + anchors.left: parent.left + anchors.right: parent.right + anchors.verticalCenter: parent.verticalCenter + spacing: ProtonStyle.wizard_spacing_medium + + function reset() { + fidoButton.loading = false; + } + + ColumnLayout { + Layout.fillWidth: true + spacing: ProtonStyle.wizard_spacing_small + + Label { + Layout.alignment: Qt.AlignHCenter + Layout.fillWidth: true + colorScheme: wizard.colorScheme + horizontalAlignment: Text.AlignHCenter + text: qsTr("Security key authentication") + type: Label.LabelType.Title + } + Label { + id: fidoUsernameLabel + Layout.alignment: Qt.AlignHCenter + Layout.fillWidth: true + color: wizard.colorScheme.text_weak + colorScheme: wizard.colorScheme + horizontalAlignment: Text.AlignHCenter + text: "" + type: Label.LabelType.Body + } + } + Label { + id: fidoDescriptionLabel + Layout.alignment: Qt.AlignHCenter + Layout.fillWidth: true + colorScheme: wizard.colorScheme + horizontalAlignment: Text.AlignHCenter + text: qsTr("Security key authentication is enabled. Please connect your security key.") + type: Label.LabelType.Body + wrapMode: Text.WordWrap + } + Button { + id: fidoButton + Layout.fillWidth: true + colorScheme: wizard.colorScheme + enabled: !loading + text: loading ? qsTr("Authenticating") : qsTr("Authenticate") + + onClicked: { + if (Backend.goos === "windows") { + fidoButton.loading = true; + } + Backend.loginFido(usernameTextField.text, ""); + } + } + Button { + Layout.fillWidth: true + colorScheme: wizard.colorScheme + enabled: !fidoButton.loading + secondary: true + secondaryIsOpaque: true + text: qsTr("Cancel") + + onClicked: { + root.abort(); + } + } + Label { + id: switchToTotpButton + Layout.fillWidth: true + Layout.alignment: Qt.AlignHCenter + colorScheme: wizard.colorScheme + horizontalAlignment: Text.AlignHCenter + text: "" + qsTr("Use authenticator app instead") + "" + + MouseArea { + anchors.fill: parent + cursorShape: Qt.PointingHandCursor + enabled: !fidoButton.loading + onClicked: { + stackLayout.currentIndex = Login.RootStack.TOTP; + fidoLayout.reset(); + totpLayout.reset(); + } + } + } } } Item { @@ -499,7 +636,9 @@ FocusScope { text: qsTr("Cancel") onClicked: { - root.abort(); + stackLayout.currentIndex = Login.RootStack.TOTP; + twoFactorPasswordTextField.focus = true; + } } } diff --git a/internal/frontend/bridge-gui/bridge-gui/qml/icons/fingerprint.svg b/internal/frontend/bridge-gui/bridge-gui/qml/icons/fingerprint.svg new file mode 100644 index 00000000..fe9c3f6c --- /dev/null +++ b/internal/frontend/bridge-gui/bridge-gui/qml/icons/fingerprint.svg @@ -0,0 +1,4 @@ + + + + diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.cpp index 0e05cf5b..51a410a2 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.cpp @@ -302,6 +302,32 @@ SPStreamEvent newLoginTfaRequestedEvent(QString const &username) { } +//**************************************************************************************************************************************************** +/// \param[in] username The username. +/// \return The event. +//**************************************************************************************************************************************************** +SPStreamEvent newLoginFidoRequestedEvent(QString const &username) { + auto event = new ::grpc::LoginFidoRequestedEvent; + event->set_username(username.toStdString()); + auto loginEvent = new grpc::LoginEvent; + loginEvent->set_allocated_fidorequested(event); + return wrapLoginEvent(loginEvent); +} + + +//**************************************************************************************************************************************************** +/// \param[in] username The username. +/// \return The event. +//**************************************************************************************************************************************************** +SPStreamEvent newLoginTfaOrFidoRequestedEvent(QString const &username) { + auto event = new ::grpc::LoginTfaOrFidoRequestedEvent; + event->set_username(username.toStdString()); + auto loginEvent = new grpc::LoginEvent; + loginEvent->set_allocated_tfaorfidorequested(event); + return wrapLoginEvent(loginEvent); + } + + //**************************************************************************************************************************************************** /// \return The event. //**************************************************************************************************************************************************** diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.h index 90648467..e888fb41 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/EventFactory.h @@ -48,7 +48,9 @@ SPStreamEvent newLoginTfaRequestedEvent(QString const &username); ///< Create a SPStreamEvent newLoginTwoPasswordsRequestedEvent(QString const &username); ///< Create a new LoginTwoPasswordsRequestedEvent event. SPStreamEvent newLoginFinishedEvent(QString const &userID, bool wasSignedOut); ///< Create a new LoginFinishedEvent event. SPStreamEvent newLoginAlreadyLoggedInEvent(QString const &userID); ///< Create a new LoginAlreadyLoggedInEvent event. -SPStreamEvent newLoginHvRequestedEvent(); ///< Create a new LoginHvRequestedEvent +SPStreamEvent newLoginHvRequestedEvent(); ///< Create a new LoginHvRequestedEvent. +SPStreamEvent newLoginFidoRequestedEvent(QString const &username); ///< Create a new LoginFidoRequestedEvent. +SPStreamEvent newLoginTfaOrFidoRequestedEvent(QString const &username); ///< Create a new LoginTfaOrFidoRequestedEvent. // Update related events SPStreamEvent newUpdateErrorEvent(grpc::UpdateErrorType errorType); ///< Create a new UpdateErrorEvent event. diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCClient.cpp b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCClient.cpp index e8d60d3e..19484bf9 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCClient.cpp +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCClient.cpp @@ -632,6 +632,28 @@ grpc::Status GRPCClient::login2FA(QString const &username, QString const &code) return this->logGRPCCallStatus(stub_->Login2FA(this->clientContext().get(), request, &empty), __FUNCTION__); } +//**************************************************************************************************************************************************** +/// \param[in] username The username. +/// \param[in] code The Security key PIN. +/// \return the status for the gRPC call. +//**************************************************************************************************************************************************** +grpc::Status GRPCClient::loginFido(const QString &username, const QString &pin) { + LoginRequest request; + request.set_username(username.toStdString()); + request.set_password(pin.toStdString()); + return this->logGRPCCallStatus(stub_->LoginFido(this->clientContext().get(), request, &empty), __FUNCTION__ ); +} + +//**************************************************************************************************************************************************** +/// \param[in] username The username. +/// \return the status for the gRPC call. +//**************************************************************************************************************************************************** +grpc::Status GRPCClient::abortFidoAssertion(const QString &username) { + LoginAbortRequest request; + request.set_username(username.toStdString()); + return this->logGRPCCallStatus(stub_->FidoAssertionAbort(this->clientContext().get(), request, &empty), __FUNCTION__); +} + //**************************************************************************************************************************************************** /// \param[in] username The username. @@ -1256,6 +1278,15 @@ void GRPCClient::processLoginEvent(LoginEvent const &event) { case HV_ERROR: emit loginHvError(QString::fromStdString(error.message())); break; + case FIDO_PIN_INVALID: + emit loginFidoPinInvalid(QString::fromStdString(error.message())); + break; + case FIDO_PIN_BLOCKED: + emit loginFidoPinBlocked(QString::fromStdString(error.message())); + break; + case FIDO_ERROR: + emit loginFidoError(QString::fromStdString(error.message())); + break; default: this->logError("Unknown login error event received."); break; @@ -1266,6 +1297,14 @@ void GRPCClient::processLoginEvent(LoginEvent const &event) { this->logTrace("Login event received: TfaRequested."); emit login2FARequested(QString::fromStdString(event.tfarequested().username())); break; + case LoginEvent::kFidoRequested: + this->logTrace("Login event received: FidoRequested."); + emit loginFidoRequested(QString::fromStdString(event.fidorequested().username())); + break; + case LoginEvent::kTfaOrFidoRequested: + this->logTrace("Login event received: TfaOrFidoRequested."); + emit login2FAOrFidoRequested(QString::fromStdString(event.tfaorfidorequested().username())); + break; case LoginEvent::kTwoPasswordRequested: this->logTrace("Login event received: TwoPasswordRequested."); emit login2PasswordRequested(QString::fromStdString(event.twopasswordrequested().username())); @@ -1284,6 +1323,18 @@ void GRPCClient::processLoginEvent(LoginEvent const &event) { this->logTrace("Login event Received: HvRequested"); emit loginHvRequested(QString::fromStdString(event.hvrequested().hvurl())); break; + case LoginEvent::kLoginFidoTouchRequested: + this->logTrace("Login event received: FidoTouchRequested"); + emit loginFidoTouchRequested(QString::fromStdString(event.loginfidotouchrequested().username())); + break; + case LoginEvent::kLoginFidoTouchCompleted: + this->logTrace("Login event received: FidoTouchCompleted"); + emit loginFidoTouchCompleted(QString::fromStdString(event.loginfidotouchcompleted().username())); + break; + case LoginEvent::kLoginFidoPinRequired: + this->logTrace("Login event received: FidoPinRequired"); + emit loginFidoPinRequired(QString::fromStdString(event.loginfidopinrequired().username())); + break; default: this->logError("Unknown Login event received."); break; diff --git a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCClient.h b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCClient.h index 3a7e3d0f..eed9426f 100644 --- a/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCClient.h +++ b/internal/frontend/bridge-gui/bridgepp/bridgepp/GRPC/GRPCClient.h @@ -175,9 +175,11 @@ signals: public: // login related calls grpc::Status login(QString const &username, QString const &password); ///< Performs the 'login' call. grpc::Status login2FA(QString const &username, QString const &code); ///< Performs the 'login2FA' call. + grpc::Status loginFido(QString const &username, QString const &pin); ///< Performs the 'loginFido' call. grpc::Status login2Passwords(QString const &username, QString const &password); ///< Performs the 'login2Passwords' call. grpc::Status loginAbort(QString const &username); ///< Performs the 'loginAbort' call. - grpc::Status loginHv(QString const &username, QString const &password); ///< Performs the 'login' call with additional useHv flag + grpc::Status loginHv(QString const &username, QString const &password); ///< Performs the 'login' call with additional useHv flag. + grpc::Status abortFidoAssertion(const QString &username); ///< Performs the 'abortFidoAssertion' call. signals: void loginUsernamePasswordError(QString const &errMsg); @@ -186,6 +188,8 @@ signals: void login2FARequested(QString const &username); void login2FAError(QString const &errMsg); void login2FAErrorAbort(QString const &errMsg); + void loginFidoRequested(QString const &username); + void login2FAOrFidoRequested(QString const &username); void login2PasswordRequested(QString const &username); void login2PasswordError(QString const &errMsg); void login2PasswordErrorAbort(QString const &errMsg); @@ -193,6 +197,12 @@ signals: void loginAlreadyLoggedIn(QString const &userID); void loginHvRequested(QString const &hvUrl); void loginHvError(QString const &errMsg); + void loginFidoTouchRequested(QString const &username); + void loginFidoTouchCompleted(QString const &username); + void loginFidoPinRequired(QString const &username); + void loginFidoPinInvalid(QString const &errMsg); + void loginFidoPinBlocked(QString const &errMsg); + void loginFidoError(QString const &errMsg); public: // Update related calls grpc::Status checkUpdate(); diff --git a/internal/frontend/cli/accounts.go b/internal/frontend/cli/accounts.go index 83e38833..8e634d9d 100644 --- a/internal/frontend/cli/accounts.go +++ b/internal/frontend/cli/accounts.go @@ -19,6 +19,7 @@ package cli import ( "context" + "errors" "fmt" "strings" @@ -26,7 +27,9 @@ import ( "github.com/ProtonMail/proton-bridge/v3/internal/bridge" "github.com/ProtonMail/proton-bridge/v3/internal/certs" "github.com/ProtonMail/proton-bridge/v3/internal/constants" + "github.com/ProtonMail/proton-bridge/v3/internal/fido" "github.com/ProtonMail/proton-bridge/v3/internal/hv" + "github.com/ProtonMail/proton-bridge/v3/internal/unleash" "github.com/ProtonMail/proton-bridge/v3/internal/vault" "github.com/abiosoft/ishell" ) @@ -174,22 +177,39 @@ func (f *frontendCLI) loginAccount(c *ishell.Context) { return } - if auth.TwoFA.Enabled&proton.HasTOTP != 0 { - if len(auth.TwoFA.FIDO2.RegisteredKeys) > 0 && f.yesNoQuestion("Do you want to use a security key for Two-factor authentication") { - if err := f.authWithHardwareKey(client, auth); err != nil { - f.printAndLogError("Cannot login: ", err) - return - } - } else { - code := f.readStringInAttempts("Two factor code", c.ReadLine, isNotEmpty) - if code == "" { - f.printAndLogError("Cannot login: need two factor code") - } + u2fLoginEnabled := f.bridge.GetFeatureFlagValue(unleash.InboxBridgeU2FLoginEnabled) - if err := client.Auth2FA(context.Background(), proton.Auth2FAReq{TwoFactorCode: code}); err != nil { + switch auth.TwoFA.Enabled { + case proton.HasTOTP: + if err := f.loginTOTP(c, client); err != nil { + f.printAndLogError("Cannot login: ", err) + return + } + + case proton.HasFIDO2: + if !u2fLoginEnabled { + // This case may only occur for internal users. + f.printAndLogError("Cannot login: Security key authentication required but not enabled in server configuration.") + return + } + + if len(auth.TwoFA.FIDO2.RegisteredKeys) == 0 { + f.printAndLogError("Cannot login: Security key login is required, but no registered keys were provided.") + } + if err := fido.AuthWithHardwareKeyCLI(f, client, auth); err != nil { + f.printAndLogError("Cannot login: ", err) + return + } + + case proton.HasFIDO2AndTOTP: + if u2fLoginEnabled && len(auth.TwoFA.FIDO2.RegisteredKeys) > 0 && f.yesNoQuestion("Do you want to use a security key for Two-factor authentication") { + if err := fido.AuthWithHardwareKeyCLI(f, client, auth); err != nil { f.printAndLogError("Cannot login: ", err) return } + } else if err := f.loginTOTP(c, client); err != nil { + f.printAndLogError("Cannot login: ", err) + return } } @@ -230,6 +250,15 @@ func (f *frontendCLI) loginAccount(c *ishell.Context) { f.Printf("Account %s was added successfully.\n", bold(user.Username)) } +func (f *frontendCLI) loginTOTP(c *ishell.Context, client *proton.Client) error { + code := f.readStringInAttempts("Two factor code", c.ReadLine, isNotEmpty) + if code == "" { + return errors.New("need two factor code") + } + + return client.Auth2FA(context.Background(), proton.Auth2FAReq{TwoFactorCode: code}) +} + func (f *frontendCLI) loginAccountHv(c *ishell.Context, loginName string, password string, keyPass []byte, hvDetails *proton.APIHVDetails) { f.promptHvURL(hvDetails) client, auth, err := f.bridge.LoginAuth(context.Background(), loginName, []byte(password), hvDetails) diff --git a/internal/frontend/cli/u2f.go b/internal/frontend/cli/u2f.go deleted file mode 100644 index bcbeaf4c..00000000 --- a/internal/frontend/cli/u2f.go +++ /dev/null @@ -1,171 +0,0 @@ -//go:build linux || darwin - -package cli - -import ( - "context" - "crypto/sha256" - "encoding/base64" - "encoding/json" - "errors" - "fmt" - - "github.com/ProtonMail/go-proton-api" - "github.com/fxamacker/cbor/v2" - "github.com/keys-pub/go-libfido2" -) - -func (f *frontendCLI) authWithHardwareKey(client *proton.Client, auth proton.Auth) error { - var fido2Device *libfido2.DeviceLocation - - retryCount := 0 - for { - locs, err := libfido2.DeviceLocations() - if err != nil { - f.printAndLogError("Cannot retrieve security key list: ", err) - } - if len(locs) == 0 { - fmt.Print("Please insert your security key and press enter to continue.") - f.ReadLine() - } else { - fido2Device = locs[0] - break - } - - retryCount++ - if retryCount >= 3 { - break - } - } - - if fido2Device == nil { - return errors.New("no device found") - } - - dev, err := libfido2.NewDevice(fido2Device.Path) - if err != nil { - return fmt.Errorf("cannot open security key: %w", err) - } - - // Check if the key has a PIN set first - var pin string - info, err := dev.Info() - if err != nil { - return fmt.Errorf("cannot get device info: %w", err) - } - - // Check if clientPin option is available and set - pinSupported := false - for _, option := range info.Options { - if option.Name == "clientPin" && option.Value == libfido2.True { - pinSupported = true - break - } - } - - if pinSupported { - pin = f.readStringInAttempts("Security key PIN", f.ReadPassword, isNotEmpty) - if pin == "" { - return errors.New("PIN is required for this security key") - } - } - - fmt.Println("Please touch your security key...") - - authOptions, ok := auth.TwoFA.FIDO2.AuthenticationOptions.(map[string]interface{}) - if !ok { - return errors.New("invalid authentication options format") - } - - publicKey, ok := authOptions["publicKey"].(map[string]interface{}) - if !ok { - return errors.New("no publicKey found in authentication options") - } - - allowCredentials, ok := publicKey["allowCredentials"].([]interface{}) - if !ok || len(allowCredentials) == 0 { - return errors.New("no allowed credentials found in authentication options") - } - - var credentialIDs [][]byte //nolint:prealloc - for _, cred := range allowCredentials { - credMap, ok := cred.(map[string]interface{}) - if !ok { - continue - } - idArray, ok := credMap["id"].([]interface{}) - if !ok { - continue - } - credID := sliceAnyToByteArray(idArray) - credentialIDs = append(credentialIDs, credID) - } - - if len(credentialIDs) == 0 { - return errors.New("no valid credential IDs found") - } - - challengeArray, ok := publicKey["challenge"].([]interface{}) - if !ok { - return errors.New("no challenge found in authentication options") - } - challenge := sliceAnyToByteArray(challengeArray) - - rpID, ok := publicKey["rpId"].(string) - if !ok { - return errors.New("could not find rpId in authentication options") - } - - clientDataJSON := map[string]interface{}{ - "type": "webauthn.get", - "challenge": base64.URLEncoding.EncodeToString(challenge), - "origin": "https://" + rpID, - } - - clientDataJSONBytes, err := json.Marshal(clientDataJSON) - if err != nil { - return fmt.Errorf("cannot marshal client data: %w", err) - } - - clientDataHash := sha256.Sum256(clientDataJSONBytes) - - assertion, err := dev.Assertion( - rpID, - clientDataHash[:], - credentialIDs, - pin, - &libfido2.AssertionOpts{UP: libfido2.True}, - ) - if err != nil { - return fmt.Errorf("FIDO2 assertion failed: %w", err) - } - - // Decode CBOR to get raw authenticator data - var authData []byte - err = cbor.Unmarshal(assertion.AuthDataCBOR, &authData) - if err != nil { - return fmt.Errorf("failed to decode CBOR authenticator data: %w", err) - } - - // Convert CredentialID bytes to array of integers - credentialIDInts := make([]int, len(assertion.CredentialID)) - for i, b := range assertion.CredentialID { - credentialIDInts[i] = int(b) - } - - fido2Req := proton.FIDO2Req{ - AuthenticationOptions: auth.TwoFA.FIDO2.AuthenticationOptions, - ClientData: base64.StdEncoding.EncodeToString(clientDataJSONBytes), - AuthenticatorData: base64.StdEncoding.EncodeToString(authData), - Signature: base64.StdEncoding.EncodeToString(assertion.Sig), - CredentialID: credentialIDInts, - } - - fmt.Println("Submitting FIDO2 authentication request.") - if err := client.Auth2FA(context.Background(), proton.Auth2FAReq{FIDO2: fido2Req}); err != nil { - return fmt.Errorf("FIDO2 authentication failed: %w", err) - } - - fmt.Println("FIDO2 authentication succeeded") - return nil -} diff --git a/internal/frontend/cli/u2f_windows.go b/internal/frontend/cli/u2f_windows.go deleted file mode 100644 index a0307468..00000000 --- a/internal/frontend/cli/u2f_windows.go +++ /dev/null @@ -1,126 +0,0 @@ -//go:build windows - -package cli - -import ( - "context" - "encoding/base64" - "encoding/json" - "fmt" - "log/slog" - - "github.com/ProtonMail/go-proton-api" - "github.com/go-ctap/ctaphid/pkg/webauthntypes" - "github.com/go-ctap/winhello" - "github.com/go-ctap/winhello/hiddenwindow" -) - -func (f *frontendCLI) authWithHardwareKey(client *proton.Client, auth proton.Auth) error { - // Windows Hello requires a window handle to work, as indicated by the docs of the lib. - wnd, err := hiddenwindow.New(slog.New(slog.DiscardHandler), "Proton Bridge Auth") - if err != nil { - return fmt.Errorf("failed to create window for Windows Hello: %w", err) - } - defer wnd.Close() - - authOptions, ok := auth.TwoFA.FIDO2.AuthenticationOptions.(map[string]interface{}) - if !ok { - return fmt.Errorf("invalid authentication options format") - } - - publicKey, ok := authOptions["publicKey"].(map[string]interface{}) - if !ok { - return fmt.Errorf("no publicKey found in authentication options") - } - - rpId, ok := publicKey["rpId"].(string) - if !ok { - return fmt.Errorf("could not find rpId in authentication options") - } - - challengeArray, ok := publicKey["challenge"].([]interface{}) - if !ok { - return fmt.Errorf("no challenge found in authentication options") - } - challenge := sliceAnyToByteArray(challengeArray) - - allowCredentials, ok := publicKey["allowCredentials"].([]interface{}) - if !ok || len(allowCredentials) == 0 { - return fmt.Errorf("no allowed credentials found in authentication options") - } - - var credentialDescriptors []webauthntypes.PublicKeyCredentialDescriptor - for _, cred := range allowCredentials { - credMap, ok := cred.(map[string]interface{}) - if !ok { - continue - } - idArray, ok := credMap["id"].([]interface{}) - if !ok { - continue - } - credID := sliceAnyToByteArray(idArray) - - credentialDescriptors = append(credentialDescriptors, webauthntypes.PublicKeyCredentialDescriptor{ - ID: credID, - Type: webauthntypes.PublicKeyCredentialTypePublicKey, - }) - } - - if len(credentialDescriptors) == 0 { - return fmt.Errorf("no valid credential descriptors found") - } - - clientDataJSON := map[string]interface{}{ - "type": "webauthn.get", - "challenge": base64.URLEncoding.WithPadding(base64.NoPadding).EncodeToString(challenge), - "origin": "https://" + rpId, - } - - clientDataJSONBytes, err := json.Marshal(clientDataJSON) - if err != nil { - return fmt.Errorf("failed to marshal client data JSON: %w", err) - } - - fmt.Println("Please use Windows Hello to authenticate.") - - assertion, err := winhello.GetAssertion( - wnd.WindowHandle(), - rpId, - clientDataJSONBytes, - credentialDescriptors, - nil, - &winhello.AuthenticatorGetAssertionOptions{ - AuthenticatorAttachment: winhello.WinHelloAuthenticatorAttachmentCrossPlatform, - UserVerificationRequirement: winhello.WinHelloUserVerificationRequirementDiscouraged, - CredentialHints: []webauthntypes.PublicKeyCredentialHint{ - webauthntypes.PublicKeyCredentialHintSecurityKey, - }, - }, - ) - if err != nil { - return fmt.Errorf("windows Hello assertion failed: %w", err) - } - - authData := assertion.AuthDataRaw - credentialIDInts := make([]int, len(assertion.Credential.ID)) - for i, b := range assertion.Credential.ID { - credentialIDInts[i] = int(b) - } - - fido2Req := proton.FIDO2Req{ - AuthenticationOptions: auth.TwoFA.FIDO2.AuthenticationOptions, - ClientData: base64.StdEncoding.EncodeToString(clientDataJSONBytes), - AuthenticatorData: base64.StdEncoding.EncodeToString(authData), - Signature: base64.StdEncoding.EncodeToString(assertion.Signature), - CredentialID: credentialIDInts, - } - - fmt.Println("Submitting FIDO2 authentication request.") - if err := client.Auth2FA(context.Background(), proton.Auth2FAReq{FIDO2: fido2Req}); err != nil { - return fmt.Errorf("FIDO2 authentication failed: %w", err) - } else { - fmt.Println("FIDO2 authentication succeeded") - } - return nil -} diff --git a/internal/frontend/cli/utils.go b/internal/frontend/cli/utils.go index 608e635b..49cf7fc9 100644 --- a/internal/frontend/cli/utils.go +++ b/internal/frontend/cli/utils.go @@ -45,6 +45,11 @@ func (f *frontendCLI) yesNoQuestion(question string) bool { return len(answer) > 0 // Empty is false. } +func (f *frontendCLI) PromptAndWaitReturn(prompt string) { + f.Print(prompt, ". Press Enter/Return to continue: ") + f.ReadLine() +} + func (f *frontendCLI) readStringInAttempts(title string, readFunc func() string, isOK func(string) bool) (value string) { f.Printf("%s: ", title) value = readFunc() @@ -60,6 +65,10 @@ func (f *frontendCLI) readStringInAttempts(title string, readFunc func() string, return } +func (f *frontendCLI) ReadSecurityKeyPin() string { + return f.readStringInAttempts("Security key PIN", f.ReadPassword, isNotEmpty) +} + func (f *frontendCLI) printAndLogError(args ...interface{}) { log.Error(args...) f.Println(args...) @@ -110,15 +119,3 @@ Recommendation: a different network to access Proton Mail. `) } - -func sliceAnyToByteArray(s []any) []byte { - result := make([]byte, len(s)) - for i, val := range s { - if intVal, ok := val.(float64); ok { - result[i] = byte(intVal) - } else { - panic("boom") - } - } - return result -} diff --git a/internal/frontend/grpc/bridge.pb.go b/internal/frontend/grpc/bridge.pb.go index c1cb6498..197da181 100644 --- a/internal/frontend/grpc/bridge.pb.go +++ b/internal/frontend/grpc/bridge.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 -// protoc v3.21.12 +// protoc-gen-go v1.36.6 +// protoc v5.29.5 // source: bridge.proto package grpc @@ -30,6 +30,7 @@ import ( wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -167,19 +168,25 @@ const ( LoginErrorType_TWO_PASSWORDS_ERROR LoginErrorType = 5 LoginErrorType_TWO_PASSWORDS_ABORT LoginErrorType = 6 LoginErrorType_HV_ERROR LoginErrorType = 7 + LoginErrorType_FIDO_PIN_INVALID LoginErrorType = 8 + LoginErrorType_FIDO_PIN_BLOCKED LoginErrorType = 9 + LoginErrorType_FIDO_ERROR LoginErrorType = 10 ) // Enum value maps for LoginErrorType. var ( LoginErrorType_name = map[int32]string{ - 0: "USERNAME_PASSWORD_ERROR", - 1: "FREE_USER", - 2: "CONNECTION_ERROR", - 3: "TFA_ERROR", - 4: "TFA_ABORT", - 5: "TWO_PASSWORDS_ERROR", - 6: "TWO_PASSWORDS_ABORT", - 7: "HV_ERROR", + 0: "USERNAME_PASSWORD_ERROR", + 1: "FREE_USER", + 2: "CONNECTION_ERROR", + 3: "TFA_ERROR", + 4: "TFA_ABORT", + 5: "TWO_PASSWORDS_ERROR", + 6: "TWO_PASSWORDS_ABORT", + 7: "HV_ERROR", + 8: "FIDO_PIN_INVALID", + 9: "FIDO_PIN_BLOCKED", + 10: "FIDO_ERROR", } LoginErrorType_value = map[string]int32{ "USERNAME_PASSWORD_ERROR": 0, @@ -190,6 +197,9 @@ var ( "TWO_PASSWORDS_ERROR": 5, "TWO_PASSWORDS_ABORT": 6, "HV_ERROR": 7, + "FIDO_PIN_INVALID": 8, + "FIDO_PIN_BLOCKED": 9, + "FIDO_ERROR": 10, } ) @@ -423,22 +433,19 @@ func (ErrorCode) EnumDescriptor() ([]byte, []int) { } type AddLogEntryRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Level LogLevel `protobuf:"varint,1,opt,name=level,proto3,enum=grpc.LogLevel" json:"level,omitempty"` + Package string `protobuf:"bytes,2,opt,name=package,proto3" json:"package,omitempty"` // package is Go lingo but it identifies the component responsible for the log entry + Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` unknownFields protoimpl.UnknownFields - - Level LogLevel `protobuf:"varint,1,opt,name=level,proto3,enum=grpc.LogLevel" json:"level,omitempty"` - Package string `protobuf:"bytes,2,opt,name=package,proto3" json:"package,omitempty"` // package is Go lingo but it identifies the component responsible for the log entry - Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AddLogEntryRequest) Reset() { *x = AddLogEntryRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddLogEntryRequest) String() string { @@ -449,7 +456,7 @@ func (*AddLogEntryRequest) ProtoMessage() {} func (x *AddLogEntryRequest) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -491,20 +498,17 @@ func (x *AddLogEntryRequest) GetMessage() string { // // ********************************************************** type GuiReadyResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ShowSplashScreen bool `protobuf:"varint,1,opt,name=showSplashScreen,proto3" json:"showSplashScreen,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ShowSplashScreen bool `protobuf:"varint,1,opt,name=showSplashScreen,proto3" json:"showSplashScreen,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GuiReadyResponse) Reset() { *x = GuiReadyResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GuiReadyResponse) String() string { @@ -515,7 +519,7 @@ func (*GuiReadyResponse) ProtoMessage() {} func (x *GuiReadyResponse) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -543,26 +547,23 @@ func (x *GuiReadyResponse) GetShowSplashScreen() bool { // // ********************************************************** type ReportBugRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + OsType string `protobuf:"bytes,1,opt,name=osType,proto3" json:"osType,omitempty"` + OsVersion string `protobuf:"bytes,2,opt,name=osVersion,proto3" json:"osVersion,omitempty"` + Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + Address string `protobuf:"bytes,5,opt,name=address,proto3" json:"address,omitempty"` + EmailClient string `protobuf:"bytes,6,opt,name=emailClient,proto3" json:"emailClient,omitempty"` + IncludeLogs bool `protobuf:"varint,7,opt,name=includeLogs,proto3" json:"includeLogs,omitempty"` unknownFields protoimpl.UnknownFields - - OsType string `protobuf:"bytes,1,opt,name=osType,proto3" json:"osType,omitempty"` - OsVersion string `protobuf:"bytes,2,opt,name=osVersion,proto3" json:"osVersion,omitempty"` - Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` - Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` - Address string `protobuf:"bytes,5,opt,name=address,proto3" json:"address,omitempty"` - EmailClient string `protobuf:"bytes,6,opt,name=emailClient,proto3" json:"emailClient,omitempty"` - IncludeLogs bool `protobuf:"varint,7,opt,name=includeLogs,proto3" json:"includeLogs,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ReportBugRequest) Reset() { *x = ReportBugRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ReportBugRequest) String() string { @@ -573,7 +574,7 @@ func (*ReportBugRequest) ProtoMessage() {} func (x *ReportBugRequest) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -638,22 +639,19 @@ func (x *ReportBugRequest) GetIncludeLogs() bool { } type LoginRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + Password []byte `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + UseHvDetails *bool `protobuf:"varint,3,opt,name=useHvDetails,proto3,oneof" json:"useHvDetails,omitempty"` unknownFields protoimpl.UnknownFields - - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` - Password []byte `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` - UseHvDetails *bool `protobuf:"varint,3,opt,name=useHvDetails,proto3,oneof" json:"useHvDetails,omitempty"` + sizeCache protoimpl.SizeCache } func (x *LoginRequest) Reset() { *x = LoginRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LoginRequest) String() string { @@ -664,7 +662,7 @@ func (*LoginRequest) ProtoMessage() {} func (x *LoginRequest) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -701,20 +699,17 @@ func (x *LoginRequest) GetUseHvDetails() bool { } type LoginAbortRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` unknownFields protoimpl.UnknownFields - - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + sizeCache protoimpl.SizeCache } func (x *LoginAbortRequest) Reset() { *x = LoginAbortRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LoginAbortRequest) String() string { @@ -725,7 +720,7 @@ func (*LoginAbortRequest) ProtoMessage() {} func (x *LoginAbortRequest) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -751,23 +746,20 @@ func (x *LoginAbortRequest) GetUsername() string { // IMAP/SMTP Mail Server settings // ********************************************************** type ImapSmtpSettings struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ImapPort int32 `protobuf:"varint,1,opt,name=imapPort,proto3" json:"imapPort,omitempty"` + SmtpPort int32 `protobuf:"varint,2,opt,name=smtpPort,proto3" json:"smtpPort,omitempty"` + UseSSLForImap bool `protobuf:"varint,3,opt,name=useSSLForImap,proto3" json:"useSSLForImap,omitempty"` + UseSSLForSmtp bool `protobuf:"varint,4,opt,name=useSSLForSmtp,proto3" json:"useSSLForSmtp,omitempty"` unknownFields protoimpl.UnknownFields - - ImapPort int32 `protobuf:"varint,1,opt,name=imapPort,proto3" json:"imapPort,omitempty"` - SmtpPort int32 `protobuf:"varint,2,opt,name=smtpPort,proto3" json:"smtpPort,omitempty"` - UseSSLForImap bool `protobuf:"varint,3,opt,name=useSSLForImap,proto3" json:"useSSLForImap,omitempty"` - UseSSLForSmtp bool `protobuf:"varint,4,opt,name=useSSLForSmtp,proto3" json:"useSSLForSmtp,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ImapSmtpSettings) Reset() { *x = ImapSmtpSettings{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ImapSmtpSettings) String() string { @@ -778,7 +770,7 @@ func (*ImapSmtpSettings) ProtoMessage() {} func (x *ImapSmtpSettings) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -825,20 +817,17 @@ func (x *ImapSmtpSettings) GetUseSSLForSmtp() bool { // Keychain related message // ********************************************************** type AvailableKeychainsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Keychains []string `protobuf:"bytes,1,rep,name=keychains,proto3" json:"keychains,omitempty"` unknownFields protoimpl.UnknownFields - - Keychains []string `protobuf:"bytes,1,rep,name=keychains,proto3" json:"keychains,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AvailableKeychainsResponse) Reset() { *x = AvailableKeychainsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AvailableKeychainsResponse) String() string { @@ -849,7 +838,7 @@ func (*AvailableKeychainsResponse) ProtoMessage() {} func (x *AvailableKeychainsResponse) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -872,28 +861,25 @@ func (x *AvailableKeychainsResponse) GetKeychains() []string { } type User struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` + AvatarText string `protobuf:"bytes,3,opt,name=avatarText,proto3" json:"avatarText,omitempty"` + State UserState `protobuf:"varint,4,opt,name=state,proto3,enum=grpc.UserState" json:"state,omitempty"` + SplitMode bool `protobuf:"varint,5,opt,name=splitMode,proto3" json:"splitMode,omitempty"` + UsedBytes int64 `protobuf:"varint,6,opt,name=usedBytes,proto3" json:"usedBytes,omitempty"` + TotalBytes int64 `protobuf:"varint,7,opt,name=totalBytes,proto3" json:"totalBytes,omitempty"` + Password []byte `protobuf:"bytes,8,opt,name=password,proto3" json:"password,omitempty"` + Addresses []string `protobuf:"bytes,9,rep,name=addresses,proto3" json:"addresses,omitempty"` unknownFields protoimpl.UnknownFields - - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` - AvatarText string `protobuf:"bytes,3,opt,name=avatarText,proto3" json:"avatarText,omitempty"` - State UserState `protobuf:"varint,4,opt,name=state,proto3,enum=grpc.UserState" json:"state,omitempty"` - SplitMode bool `protobuf:"varint,5,opt,name=splitMode,proto3" json:"splitMode,omitempty"` - UsedBytes int64 `protobuf:"varint,6,opt,name=usedBytes,proto3" json:"usedBytes,omitempty"` - TotalBytes int64 `protobuf:"varint,7,opt,name=totalBytes,proto3" json:"totalBytes,omitempty"` - Password []byte `protobuf:"bytes,8,opt,name=password,proto3" json:"password,omitempty"` - Addresses []string `protobuf:"bytes,9,rep,name=addresses,proto3" json:"addresses,omitempty"` + sizeCache protoimpl.SizeCache } func (x *User) Reset() { *x = User{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *User) String() string { @@ -904,7 +890,7 @@ func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -983,21 +969,18 @@ func (x *User) GetAddresses() []string { } type UserSplitModeRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` + Active bool `protobuf:"varint,2,opt,name=active,proto3" json:"active,omitempty"` unknownFields protoimpl.UnknownFields - - UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` - Active bool `protobuf:"varint,2,opt,name=active,proto3" json:"active,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UserSplitModeRequest) Reset() { *x = UserSplitModeRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserSplitModeRequest) String() string { @@ -1008,7 +991,7 @@ func (*UserSplitModeRequest) ProtoMessage() {} func (x *UserSplitModeRequest) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1038,21 +1021,18 @@ func (x *UserSplitModeRequest) GetActive() bool { } type UserBadEventFeedbackRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` + DoResync bool `protobuf:"varint,2,opt,name=doResync,proto3" json:"doResync,omitempty"` unknownFields protoimpl.UnknownFields - - UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` - DoResync bool `protobuf:"varint,2,opt,name=doResync,proto3" json:"doResync,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UserBadEventFeedbackRequest) Reset() { *x = UserBadEventFeedbackRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserBadEventFeedbackRequest) String() string { @@ -1063,7 +1043,7 @@ func (*UserBadEventFeedbackRequest) ProtoMessage() {} func (x *UserBadEventFeedbackRequest) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1093,20 +1073,17 @@ func (x *UserBadEventFeedbackRequest) GetDoResync() bool { } type UserListResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` unknownFields protoimpl.UnknownFields - - Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UserListResponse) Reset() { *x = UserListResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserListResponse) String() string { @@ -1117,7 +1094,7 @@ func (*UserListResponse) ProtoMessage() {} func (x *UserListResponse) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1140,21 +1117,18 @@ func (x *UserListResponse) GetUsers() []*User { } type ConfigureAppleMailRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` + Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` unknownFields protoimpl.UnknownFields - - UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` - Address string `protobuf:"bytes,2,opt,name=address,proto3" json:"address,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ConfigureAppleMailRequest) Reset() { *x = ConfigureAppleMailRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ConfigureAppleMailRequest) String() string { @@ -1165,7 +1139,7 @@ func (*ConfigureAppleMailRequest) ProtoMessage() {} func (x *ConfigureAppleMailRequest) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1195,20 +1169,17 @@ func (x *ConfigureAppleMailRequest) GetAddress() string { } type EventStreamRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ClientPlatform string `protobuf:"bytes,1,opt,name=ClientPlatform,proto3" json:"ClientPlatform,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ClientPlatform string `protobuf:"bytes,1,opt,name=ClientPlatform,proto3" json:"ClientPlatform,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *EventStreamRequest) Reset() { *x = EventStreamRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *EventStreamRequest) String() string { @@ -1219,7 +1190,7 @@ func (*EventStreamRequest) ProtoMessage() {} func (x *EventStreamRequest) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1242,11 +1213,8 @@ func (x *EventStreamRequest) GetClientPlatform() string { } type StreamEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Event: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Event: // // *StreamEvent_App // *StreamEvent_Login @@ -1257,16 +1225,16 @@ type StreamEvent struct { // *StreamEvent_Mail // *StreamEvent_User // *StreamEvent_GenericError - Event isStreamEvent_Event `protobuf_oneof:"event"` + Event isStreamEvent_Event `protobuf_oneof:"event"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *StreamEvent) Reset() { *x = StreamEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *StreamEvent) String() string { @@ -1277,7 +1245,7 @@ func (*StreamEvent) ProtoMessage() {} func (x *StreamEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1292,72 +1260,90 @@ func (*StreamEvent) Descriptor() ([]byte, []int) { return file_bridge_proto_rawDescGZIP(), []int{13} } -func (m *StreamEvent) GetEvent() isStreamEvent_Event { - if m != nil { - return m.Event +func (x *StreamEvent) GetEvent() isStreamEvent_Event { + if x != nil { + return x.Event } return nil } func (x *StreamEvent) GetApp() *AppEvent { - if x, ok := x.GetEvent().(*StreamEvent_App); ok { - return x.App + if x != nil { + if x, ok := x.Event.(*StreamEvent_App); ok { + return x.App + } } return nil } func (x *StreamEvent) GetLogin() *LoginEvent { - if x, ok := x.GetEvent().(*StreamEvent_Login); ok { - return x.Login + if x != nil { + if x, ok := x.Event.(*StreamEvent_Login); ok { + return x.Login + } } return nil } func (x *StreamEvent) GetUpdate() *UpdateEvent { - if x, ok := x.GetEvent().(*StreamEvent_Update); ok { - return x.Update + if x != nil { + if x, ok := x.Event.(*StreamEvent_Update); ok { + return x.Update + } } return nil } func (x *StreamEvent) GetCache() *DiskCacheEvent { - if x, ok := x.GetEvent().(*StreamEvent_Cache); ok { - return x.Cache + if x != nil { + if x, ok := x.Event.(*StreamEvent_Cache); ok { + return x.Cache + } } return nil } func (x *StreamEvent) GetMailServerSettings() *MailServerSettingsEvent { - if x, ok := x.GetEvent().(*StreamEvent_MailServerSettings); ok { - return x.MailServerSettings + if x != nil { + if x, ok := x.Event.(*StreamEvent_MailServerSettings); ok { + return x.MailServerSettings + } } return nil } func (x *StreamEvent) GetKeychain() *KeychainEvent { - if x, ok := x.GetEvent().(*StreamEvent_Keychain); ok { - return x.Keychain + if x != nil { + if x, ok := x.Event.(*StreamEvent_Keychain); ok { + return x.Keychain + } } return nil } func (x *StreamEvent) GetMail() *MailEvent { - if x, ok := x.GetEvent().(*StreamEvent_Mail); ok { - return x.Mail + if x != nil { + if x, ok := x.Event.(*StreamEvent_Mail); ok { + return x.Mail + } } return nil } func (x *StreamEvent) GetUser() *UserEvent { - if x, ok := x.GetEvent().(*StreamEvent_User); ok { - return x.User + if x != nil { + if x, ok := x.Event.(*StreamEvent_User); ok { + return x.User + } } return nil } func (x *StreamEvent) GetGenericError() *GenericErrorEvent { - if x, ok := x.GetEvent().(*StreamEvent_GenericError); ok { - return x.GenericError + if x != nil { + if x, ok := x.Event.(*StreamEvent_GenericError); ok { + return x.GenericError + } } return nil } @@ -1424,11 +1410,8 @@ func (*StreamEvent_GenericError) isStreamEvent_Event() {} // App related events // ********************************************************** type AppEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Event: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Event: // // *AppEvent_InternetStatus // *AppEvent_ToggleAutostartFinished @@ -1445,16 +1428,16 @@ type AppEvent struct { // *AppEvent_RepairStarted // *AppEvent_AllUsersLoaded // *AppEvent_UserNotification - Event isAppEvent_Event `protobuf_oneof:"event"` + Event isAppEvent_Event `protobuf_oneof:"event"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AppEvent) Reset() { *x = AppEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AppEvent) String() string { @@ -1465,7 +1448,7 @@ func (*AppEvent) ProtoMessage() {} func (x *AppEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1480,114 +1463,144 @@ func (*AppEvent) Descriptor() ([]byte, []int) { return file_bridge_proto_rawDescGZIP(), []int{14} } -func (m *AppEvent) GetEvent() isAppEvent_Event { - if m != nil { - return m.Event +func (x *AppEvent) GetEvent() isAppEvent_Event { + if x != nil { + return x.Event } return nil } func (x *AppEvent) GetInternetStatus() *InternetStatusEvent { - if x, ok := x.GetEvent().(*AppEvent_InternetStatus); ok { - return x.InternetStatus + if x != nil { + if x, ok := x.Event.(*AppEvent_InternetStatus); ok { + return x.InternetStatus + } } return nil } func (x *AppEvent) GetToggleAutostartFinished() *ToggleAutostartFinishedEvent { - if x, ok := x.GetEvent().(*AppEvent_ToggleAutostartFinished); ok { - return x.ToggleAutostartFinished + if x != nil { + if x, ok := x.Event.(*AppEvent_ToggleAutostartFinished); ok { + return x.ToggleAutostartFinished + } } return nil } func (x *AppEvent) GetResetFinished() *ResetFinishedEvent { - if x, ok := x.GetEvent().(*AppEvent_ResetFinished); ok { - return x.ResetFinished + if x != nil { + if x, ok := x.Event.(*AppEvent_ResetFinished); ok { + return x.ResetFinished + } } return nil } func (x *AppEvent) GetReportBugFinished() *ReportBugFinishedEvent { - if x, ok := x.GetEvent().(*AppEvent_ReportBugFinished); ok { - return x.ReportBugFinished + if x != nil { + if x, ok := x.Event.(*AppEvent_ReportBugFinished); ok { + return x.ReportBugFinished + } } return nil } func (x *AppEvent) GetReportBugSuccess() *ReportBugSuccessEvent { - if x, ok := x.GetEvent().(*AppEvent_ReportBugSuccess); ok { - return x.ReportBugSuccess + if x != nil { + if x, ok := x.Event.(*AppEvent_ReportBugSuccess); ok { + return x.ReportBugSuccess + } } return nil } func (x *AppEvent) GetReportBugError() *ReportBugErrorEvent { - if x, ok := x.GetEvent().(*AppEvent_ReportBugError); ok { - return x.ReportBugError + if x != nil { + if x, ok := x.Event.(*AppEvent_ReportBugError); ok { + return x.ReportBugError + } } return nil } func (x *AppEvent) GetShowMainWindow() *ShowMainWindowEvent { - if x, ok := x.GetEvent().(*AppEvent_ShowMainWindow); ok { - return x.ShowMainWindow + if x != nil { + if x, ok := x.Event.(*AppEvent_ShowMainWindow); ok { + return x.ShowMainWindow + } } return nil } func (x *AppEvent) GetReportBugFallback() *ReportBugFallbackEvent { - if x, ok := x.GetEvent().(*AppEvent_ReportBugFallback); ok { - return x.ReportBugFallback + if x != nil { + if x, ok := x.Event.(*AppEvent_ReportBugFallback); ok { + return x.ReportBugFallback + } } return nil } func (x *AppEvent) GetCertificateInstallSuccess() *CertificateInstallSuccessEvent { - if x, ok := x.GetEvent().(*AppEvent_CertificateInstallSuccess); ok { - return x.CertificateInstallSuccess + if x != nil { + if x, ok := x.Event.(*AppEvent_CertificateInstallSuccess); ok { + return x.CertificateInstallSuccess + } } return nil } func (x *AppEvent) GetCertificateInstallCanceled() *CertificateInstallCanceledEvent { - if x, ok := x.GetEvent().(*AppEvent_CertificateInstallCanceled); ok { - return x.CertificateInstallCanceled + if x != nil { + if x, ok := x.Event.(*AppEvent_CertificateInstallCanceled); ok { + return x.CertificateInstallCanceled + } } return nil } func (x *AppEvent) GetCertificateInstallFailed() *CertificateInstallFailedEvent { - if x, ok := x.GetEvent().(*AppEvent_CertificateInstallFailed); ok { - return x.CertificateInstallFailed + if x != nil { + if x, ok := x.Event.(*AppEvent_CertificateInstallFailed); ok { + return x.CertificateInstallFailed + } } return nil } func (x *AppEvent) GetKnowledgeBaseSuggestions() *KnowledgeBaseSuggestionsEvent { - if x, ok := x.GetEvent().(*AppEvent_KnowledgeBaseSuggestions); ok { - return x.KnowledgeBaseSuggestions + if x != nil { + if x, ok := x.Event.(*AppEvent_KnowledgeBaseSuggestions); ok { + return x.KnowledgeBaseSuggestions + } } return nil } func (x *AppEvent) GetRepairStarted() *RepairStartedEvent { - if x, ok := x.GetEvent().(*AppEvent_RepairStarted); ok { - return x.RepairStarted + if x != nil { + if x, ok := x.Event.(*AppEvent_RepairStarted); ok { + return x.RepairStarted + } } return nil } func (x *AppEvent) GetAllUsersLoaded() *AllUsersLoadedEvent { - if x, ok := x.GetEvent().(*AppEvent_AllUsersLoaded); ok { - return x.AllUsersLoaded + if x != nil { + if x, ok := x.Event.(*AppEvent_AllUsersLoaded); ok { + return x.AllUsersLoaded + } } return nil } func (x *AppEvent) GetUserNotification() *UserNotificationEvent { - if x, ok := x.GetEvent().(*AppEvent_UserNotification); ok { - return x.UserNotification + if x != nil { + if x, ok := x.Event.(*AppEvent_UserNotification); ok { + return x.UserNotification + } } return nil } @@ -1687,20 +1700,17 @@ func (*AppEvent_AllUsersLoaded) isAppEvent_Event() {} func (*AppEvent_UserNotification) isAppEvent_Event() {} type InternetStatusEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Connected bool `protobuf:"varint,1,opt,name=connected,proto3" json:"connected,omitempty"` unknownFields protoimpl.UnknownFields - - Connected bool `protobuf:"varint,1,opt,name=connected,proto3" json:"connected,omitempty"` + sizeCache protoimpl.SizeCache } func (x *InternetStatusEvent) Reset() { *x = InternetStatusEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *InternetStatusEvent) String() string { @@ -1711,7 +1721,7 @@ func (*InternetStatusEvent) ProtoMessage() {} func (x *InternetStatusEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1734,18 +1744,16 @@ func (x *InternetStatusEvent) GetConnected() bool { } type ToggleAutostartFinishedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ToggleAutostartFinishedEvent) Reset() { *x = ToggleAutostartFinishedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ToggleAutostartFinishedEvent) String() string { @@ -1756,7 +1764,7 @@ func (*ToggleAutostartFinishedEvent) ProtoMessage() {} func (x *ToggleAutostartFinishedEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1772,18 +1780,16 @@ func (*ToggleAutostartFinishedEvent) Descriptor() ([]byte, []int) { } type ResetFinishedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ResetFinishedEvent) Reset() { *x = ResetFinishedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ResetFinishedEvent) String() string { @@ -1794,7 +1800,7 @@ func (*ResetFinishedEvent) ProtoMessage() {} func (x *ResetFinishedEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1810,18 +1816,16 @@ func (*ResetFinishedEvent) Descriptor() ([]byte, []int) { } type ReportBugFinishedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ReportBugFinishedEvent) Reset() { *x = ReportBugFinishedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ReportBugFinishedEvent) String() string { @@ -1832,7 +1836,7 @@ func (*ReportBugFinishedEvent) ProtoMessage() {} func (x *ReportBugFinishedEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1848,18 +1852,16 @@ func (*ReportBugFinishedEvent) Descriptor() ([]byte, []int) { } type ReportBugSuccessEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ReportBugSuccessEvent) Reset() { *x = ReportBugSuccessEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ReportBugSuccessEvent) String() string { @@ -1870,7 +1872,7 @@ func (*ReportBugSuccessEvent) ProtoMessage() {} func (x *ReportBugSuccessEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1886,18 +1888,16 @@ func (*ReportBugSuccessEvent) Descriptor() ([]byte, []int) { } type ReportBugErrorEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ReportBugErrorEvent) Reset() { *x = ReportBugErrorEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ReportBugErrorEvent) String() string { @@ -1908,7 +1908,7 @@ func (*ReportBugErrorEvent) ProtoMessage() {} func (x *ReportBugErrorEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1924,18 +1924,16 @@ func (*ReportBugErrorEvent) Descriptor() ([]byte, []int) { } type ShowMainWindowEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ShowMainWindowEvent) Reset() { *x = ShowMainWindowEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ShowMainWindowEvent) String() string { @@ -1946,7 +1944,7 @@ func (*ShowMainWindowEvent) ProtoMessage() {} func (x *ShowMainWindowEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1962,18 +1960,16 @@ func (*ShowMainWindowEvent) Descriptor() ([]byte, []int) { } type ReportBugFallbackEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ReportBugFallbackEvent) Reset() { *x = ReportBugFallbackEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ReportBugFallbackEvent) String() string { @@ -1984,7 +1980,7 @@ func (*ReportBugFallbackEvent) ProtoMessage() {} func (x *ReportBugFallbackEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2000,18 +1996,16 @@ func (*ReportBugFallbackEvent) Descriptor() ([]byte, []int) { } type CertificateInstallSuccessEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CertificateInstallSuccessEvent) Reset() { *x = CertificateInstallSuccessEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CertificateInstallSuccessEvent) String() string { @@ -2022,7 +2016,7 @@ func (*CertificateInstallSuccessEvent) ProtoMessage() {} func (x *CertificateInstallSuccessEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2038,18 +2032,16 @@ func (*CertificateInstallSuccessEvent) Descriptor() ([]byte, []int) { } type CertificateInstallCanceledEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CertificateInstallCanceledEvent) Reset() { *x = CertificateInstallCanceledEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CertificateInstallCanceledEvent) String() string { @@ -2060,7 +2052,7 @@ func (*CertificateInstallCanceledEvent) ProtoMessage() {} func (x *CertificateInstallCanceledEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[24] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2076,18 +2068,16 @@ func (*CertificateInstallCanceledEvent) Descriptor() ([]byte, []int) { } type CertificateInstallFailedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CertificateInstallFailedEvent) Reset() { *x = CertificateInstallFailedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CertificateInstallFailedEvent) String() string { @@ -2098,7 +2088,7 @@ func (*CertificateInstallFailedEvent) ProtoMessage() {} func (x *CertificateInstallFailedEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[25] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2114,18 +2104,16 @@ func (*CertificateInstallFailedEvent) Descriptor() ([]byte, []int) { } type RepairStartedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *RepairStartedEvent) Reset() { *x = RepairStartedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RepairStartedEvent) String() string { @@ -2136,7 +2124,7 @@ func (*RepairStartedEvent) ProtoMessage() {} func (x *RepairStartedEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[26] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2152,18 +2140,16 @@ func (*RepairStartedEvent) Descriptor() ([]byte, []int) { } type AllUsersLoadedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AllUsersLoadedEvent) Reset() { *x = AllUsersLoadedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AllUsersLoadedEvent) String() string { @@ -2174,7 +2160,7 @@ func (*AllUsersLoadedEvent) ProtoMessage() {} func (x *AllUsersLoadedEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[27] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2190,21 +2176,18 @@ func (*AllUsersLoadedEvent) Descriptor() ([]byte, []int) { } type KnowledgeBaseSuggestion struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` + Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` unknownFields protoimpl.UnknownFields - - Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"` - Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` + sizeCache protoimpl.SizeCache } func (x *KnowledgeBaseSuggestion) Reset() { *x = KnowledgeBaseSuggestion{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *KnowledgeBaseSuggestion) String() string { @@ -2215,7 +2198,7 @@ func (*KnowledgeBaseSuggestion) ProtoMessage() {} func (x *KnowledgeBaseSuggestion) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[28] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2245,20 +2228,17 @@ func (x *KnowledgeBaseSuggestion) GetTitle() string { } type KnowledgeBaseSuggestionsEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Suggestions []*KnowledgeBaseSuggestion `protobuf:"bytes,1,rep,name=suggestions,proto3" json:"suggestions,omitempty"` unknownFields protoimpl.UnknownFields - - Suggestions []*KnowledgeBaseSuggestion `protobuf:"bytes,1,rep,name=suggestions,proto3" json:"suggestions,omitempty"` + sizeCache protoimpl.SizeCache } func (x *KnowledgeBaseSuggestionsEvent) Reset() { *x = KnowledgeBaseSuggestionsEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *KnowledgeBaseSuggestionsEvent) String() string { @@ -2269,7 +2249,7 @@ func (*KnowledgeBaseSuggestionsEvent) ProtoMessage() {} func (x *KnowledgeBaseSuggestionsEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[29] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2295,11 +2275,8 @@ func (x *KnowledgeBaseSuggestionsEvent) GetSuggestions() []*KnowledgeBaseSuggest // Login related events // ********************************************************** type LoginEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Event: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Event: // // *LoginEvent_Error // *LoginEvent_TfaRequested @@ -2307,16 +2284,21 @@ type LoginEvent struct { // *LoginEvent_Finished // *LoginEvent_AlreadyLoggedIn // *LoginEvent_HvRequested - Event isLoginEvent_Event `protobuf_oneof:"event"` + // *LoginEvent_FidoRequested + // *LoginEvent_TfaOrFidoRequested + // *LoginEvent_LoginFidoTouchRequested + // *LoginEvent_LoginFidoTouchCompleted + // *LoginEvent_LoginFidoPinRequired + Event isLoginEvent_Event `protobuf_oneof:"event"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LoginEvent) Reset() { *x = LoginEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LoginEvent) String() string { @@ -2327,7 +2309,7 @@ func (*LoginEvent) ProtoMessage() {} func (x *LoginEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[30] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2342,51 +2324,108 @@ func (*LoginEvent) Descriptor() ([]byte, []int) { return file_bridge_proto_rawDescGZIP(), []int{30} } -func (m *LoginEvent) GetEvent() isLoginEvent_Event { - if m != nil { - return m.Event +func (x *LoginEvent) GetEvent() isLoginEvent_Event { + if x != nil { + return x.Event } return nil } func (x *LoginEvent) GetError() *LoginErrorEvent { - if x, ok := x.GetEvent().(*LoginEvent_Error); ok { - return x.Error + if x != nil { + if x, ok := x.Event.(*LoginEvent_Error); ok { + return x.Error + } } return nil } func (x *LoginEvent) GetTfaRequested() *LoginTfaRequestedEvent { - if x, ok := x.GetEvent().(*LoginEvent_TfaRequested); ok { - return x.TfaRequested + if x != nil { + if x, ok := x.Event.(*LoginEvent_TfaRequested); ok { + return x.TfaRequested + } } return nil } func (x *LoginEvent) GetTwoPasswordRequested() *LoginTwoPasswordsRequestedEvent { - if x, ok := x.GetEvent().(*LoginEvent_TwoPasswordRequested); ok { - return x.TwoPasswordRequested + if x != nil { + if x, ok := x.Event.(*LoginEvent_TwoPasswordRequested); ok { + return x.TwoPasswordRequested + } } return nil } func (x *LoginEvent) GetFinished() *LoginFinishedEvent { - if x, ok := x.GetEvent().(*LoginEvent_Finished); ok { - return x.Finished + if x != nil { + if x, ok := x.Event.(*LoginEvent_Finished); ok { + return x.Finished + } } return nil } func (x *LoginEvent) GetAlreadyLoggedIn() *LoginFinishedEvent { - if x, ok := x.GetEvent().(*LoginEvent_AlreadyLoggedIn); ok { - return x.AlreadyLoggedIn + if x != nil { + if x, ok := x.Event.(*LoginEvent_AlreadyLoggedIn); ok { + return x.AlreadyLoggedIn + } } return nil } func (x *LoginEvent) GetHvRequested() *LoginHvRequestedEvent { - if x, ok := x.GetEvent().(*LoginEvent_HvRequested); ok { - return x.HvRequested + if x != nil { + if x, ok := x.Event.(*LoginEvent_HvRequested); ok { + return x.HvRequested + } + } + return nil +} + +func (x *LoginEvent) GetFidoRequested() *LoginFidoRequestedEvent { + if x != nil { + if x, ok := x.Event.(*LoginEvent_FidoRequested); ok { + return x.FidoRequested + } + } + return nil +} + +func (x *LoginEvent) GetTfaOrFidoRequested() *LoginTfaOrFidoRequestedEvent { + if x != nil { + if x, ok := x.Event.(*LoginEvent_TfaOrFidoRequested); ok { + return x.TfaOrFidoRequested + } + } + return nil +} + +func (x *LoginEvent) GetLoginFidoTouchRequested() *LoginFidoTouchEvent { + if x != nil { + if x, ok := x.Event.(*LoginEvent_LoginFidoTouchRequested); ok { + return x.LoginFidoTouchRequested + } + } + return nil +} + +func (x *LoginEvent) GetLoginFidoTouchCompleted() *LoginFidoTouchEvent { + if x != nil { + if x, ok := x.Event.(*LoginEvent_LoginFidoTouchCompleted); ok { + return x.LoginFidoTouchCompleted + } + } + return nil +} + +func (x *LoginEvent) GetLoginFidoPinRequired() *LoginFidoPinRequired { + if x != nil { + if x, ok := x.Event.(*LoginEvent_LoginFidoPinRequired); ok { + return x.LoginFidoPinRequired + } } return nil } @@ -2419,6 +2458,26 @@ type LoginEvent_HvRequested struct { HvRequested *LoginHvRequestedEvent `protobuf:"bytes,6,opt,name=hvRequested,proto3,oneof"` } +type LoginEvent_FidoRequested struct { + FidoRequested *LoginFidoRequestedEvent `protobuf:"bytes,7,opt,name=fidoRequested,proto3,oneof"` +} + +type LoginEvent_TfaOrFidoRequested struct { + TfaOrFidoRequested *LoginTfaOrFidoRequestedEvent `protobuf:"bytes,8,opt,name=tfaOrFidoRequested,proto3,oneof"` +} + +type LoginEvent_LoginFidoTouchRequested struct { + LoginFidoTouchRequested *LoginFidoTouchEvent `protobuf:"bytes,9,opt,name=loginFidoTouchRequested,proto3,oneof"` +} + +type LoginEvent_LoginFidoTouchCompleted struct { + LoginFidoTouchCompleted *LoginFidoTouchEvent `protobuf:"bytes,10,opt,name=loginFidoTouchCompleted,proto3,oneof"` +} + +type LoginEvent_LoginFidoPinRequired struct { + LoginFidoPinRequired *LoginFidoPinRequired `protobuf:"bytes,11,opt,name=loginFidoPinRequired,proto3,oneof"` +} + func (*LoginEvent_Error) isLoginEvent_Event() {} func (*LoginEvent_TfaRequested) isLoginEvent_Event() {} @@ -2431,22 +2490,29 @@ func (*LoginEvent_AlreadyLoggedIn) isLoginEvent_Event() {} func (*LoginEvent_HvRequested) isLoginEvent_Event() {} -type LoginErrorEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func (*LoginEvent_FidoRequested) isLoginEvent_Event() {} - Type LoginErrorType `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.LoginErrorType" json:"type,omitempty"` - Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` +func (*LoginEvent_TfaOrFidoRequested) isLoginEvent_Event() {} + +func (*LoginEvent_LoginFidoTouchRequested) isLoginEvent_Event() {} + +func (*LoginEvent_LoginFidoTouchCompleted) isLoginEvent_Event() {} + +func (*LoginEvent_LoginFidoPinRequired) isLoginEvent_Event() {} + +type LoginErrorEvent struct { + state protoimpl.MessageState `protogen:"open.v1"` + Type LoginErrorType `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.LoginErrorType" json:"type,omitempty"` + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LoginErrorEvent) Reset() { *x = LoginErrorEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LoginErrorEvent) String() string { @@ -2457,7 +2523,7 @@ func (*LoginErrorEvent) ProtoMessage() {} func (x *LoginErrorEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[31] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2487,20 +2553,17 @@ func (x *LoginErrorEvent) GetMessage() string { } type LoginTfaRequestedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` unknownFields protoimpl.UnknownFields - - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + sizeCache protoimpl.SizeCache } func (x *LoginTfaRequestedEvent) Reset() { *x = LoginTfaRequestedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LoginTfaRequestedEvent) String() string { @@ -2511,7 +2574,7 @@ func (*LoginTfaRequestedEvent) ProtoMessage() {} func (x *LoginTfaRequestedEvent) ProtoReflect() protoreflect.Message { mi := &file_bridge_proto_msgTypes[32] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2533,21 +2596,194 @@ func (x *LoginTfaRequestedEvent) GetUsername() string { return "" } -type LoginTwoPasswordsRequestedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type LoginFidoRequestedEvent struct { + state protoimpl.MessageState `protogen:"open.v1"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` +func (x *LoginFidoRequestedEvent) Reset() { + *x = LoginFidoRequestedEvent{} + mi := &file_bridge_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LoginFidoRequestedEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LoginFidoRequestedEvent) ProtoMessage() {} + +func (x *LoginFidoRequestedEvent) ProtoReflect() protoreflect.Message { + mi := &file_bridge_proto_msgTypes[33] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LoginFidoRequestedEvent.ProtoReflect.Descriptor instead. +func (*LoginFidoRequestedEvent) Descriptor() ([]byte, []int) { + return file_bridge_proto_rawDescGZIP(), []int{33} +} + +func (x *LoginFidoRequestedEvent) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +type LoginTfaOrFidoRequestedEvent struct { + state protoimpl.MessageState `protogen:"open.v1"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *LoginTfaOrFidoRequestedEvent) Reset() { + *x = LoginTfaOrFidoRequestedEvent{} + mi := &file_bridge_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LoginTfaOrFidoRequestedEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LoginTfaOrFidoRequestedEvent) ProtoMessage() {} + +func (x *LoginTfaOrFidoRequestedEvent) ProtoReflect() protoreflect.Message { + mi := &file_bridge_proto_msgTypes[34] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LoginTfaOrFidoRequestedEvent.ProtoReflect.Descriptor instead. +func (*LoginTfaOrFidoRequestedEvent) Descriptor() ([]byte, []int) { + return file_bridge_proto_rawDescGZIP(), []int{34} +} + +func (x *LoginTfaOrFidoRequestedEvent) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +type LoginFidoTouchEvent struct { + state protoimpl.MessageState `protogen:"open.v1"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *LoginFidoTouchEvent) Reset() { + *x = LoginFidoTouchEvent{} + mi := &file_bridge_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LoginFidoTouchEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LoginFidoTouchEvent) ProtoMessage() {} + +func (x *LoginFidoTouchEvent) ProtoReflect() protoreflect.Message { + mi := &file_bridge_proto_msgTypes[35] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LoginFidoTouchEvent.ProtoReflect.Descriptor instead. +func (*LoginFidoTouchEvent) Descriptor() ([]byte, []int) { + return file_bridge_proto_rawDescGZIP(), []int{35} +} + +func (x *LoginFidoTouchEvent) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +type LoginFidoPinRequired struct { + state protoimpl.MessageState `protogen:"open.v1"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *LoginFidoPinRequired) Reset() { + *x = LoginFidoPinRequired{} + mi := &file_bridge_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *LoginFidoPinRequired) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*LoginFidoPinRequired) ProtoMessage() {} + +func (x *LoginFidoPinRequired) ProtoReflect() protoreflect.Message { + mi := &file_bridge_proto_msgTypes[36] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use LoginFidoPinRequired.ProtoReflect.Descriptor instead. +func (*LoginFidoPinRequired) Descriptor() ([]byte, []int) { + return file_bridge_proto_rawDescGZIP(), []int{36} +} + +func (x *LoginFidoPinRequired) GetUsername() string { + if x != nil { + return x.Username + } + return "" +} + +type LoginTwoPasswordsRequestedEvent struct { + state protoimpl.MessageState `protogen:"open.v1"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LoginTwoPasswordsRequestedEvent) Reset() { *x = LoginTwoPasswordsRequestedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LoginTwoPasswordsRequestedEvent) String() string { @@ -2557,8 +2793,8 @@ func (x *LoginTwoPasswordsRequestedEvent) String() string { func (*LoginTwoPasswordsRequestedEvent) ProtoMessage() {} func (x *LoginTwoPasswordsRequestedEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[33] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[37] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2570,7 +2806,7 @@ func (x *LoginTwoPasswordsRequestedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use LoginTwoPasswordsRequestedEvent.ProtoReflect.Descriptor instead. func (*LoginTwoPasswordsRequestedEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{33} + return file_bridge_proto_rawDescGZIP(), []int{37} } func (x *LoginTwoPasswordsRequestedEvent) GetUsername() string { @@ -2581,21 +2817,18 @@ func (x *LoginTwoPasswordsRequestedEvent) GetUsername() string { } type LoginFinishedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` + WasSignedOut bool `protobuf:"varint,2,opt,name=wasSignedOut,proto3" json:"wasSignedOut,omitempty"` unknownFields protoimpl.UnknownFields - - UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` - WasSignedOut bool `protobuf:"varint,2,opt,name=wasSignedOut,proto3" json:"wasSignedOut,omitempty"` + sizeCache protoimpl.SizeCache } func (x *LoginFinishedEvent) Reset() { *x = LoginFinishedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LoginFinishedEvent) String() string { @@ -2605,8 +2838,8 @@ func (x *LoginFinishedEvent) String() string { func (*LoginFinishedEvent) ProtoMessage() {} func (x *LoginFinishedEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[34] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[38] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2618,7 +2851,7 @@ func (x *LoginFinishedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use LoginFinishedEvent.ProtoReflect.Descriptor instead. func (*LoginFinishedEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{34} + return file_bridge_proto_rawDescGZIP(), []int{38} } func (x *LoginFinishedEvent) GetUserID() string { @@ -2636,20 +2869,17 @@ func (x *LoginFinishedEvent) GetWasSignedOut() bool { } type LoginHvRequestedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + HvUrl string `protobuf:"bytes,1,opt,name=hvUrl,proto3" json:"hvUrl,omitempty"` unknownFields protoimpl.UnknownFields - - HvUrl string `protobuf:"bytes,1,opt,name=hvUrl,proto3" json:"hvUrl,omitempty"` + sizeCache protoimpl.SizeCache } func (x *LoginHvRequestedEvent) Reset() { *x = LoginHvRequestedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LoginHvRequestedEvent) String() string { @@ -2659,8 +2889,8 @@ func (x *LoginHvRequestedEvent) String() string { func (*LoginHvRequestedEvent) ProtoMessage() {} func (x *LoginHvRequestedEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[35] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[39] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2672,7 +2902,7 @@ func (x *LoginHvRequestedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use LoginHvRequestedEvent.ProtoReflect.Descriptor instead. func (*LoginHvRequestedEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{35} + return file_bridge_proto_rawDescGZIP(), []int{39} } func (x *LoginHvRequestedEvent) GetHvUrl() string { @@ -2686,11 +2916,8 @@ func (x *LoginHvRequestedEvent) GetHvUrl() string { // Update related events // ********************************************************** type UpdateEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Event: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Event: // // *UpdateEvent_Error // *UpdateEvent_ManualReady @@ -2700,16 +2927,16 @@ type UpdateEvent struct { // *UpdateEvent_IsLatestVersion // *UpdateEvent_CheckFinished // *UpdateEvent_VersionChanged - Event isUpdateEvent_Event `protobuf_oneof:"event"` + Event isUpdateEvent_Event `protobuf_oneof:"event"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateEvent) Reset() { *x = UpdateEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateEvent) String() string { @@ -2719,8 +2946,8 @@ func (x *UpdateEvent) String() string { func (*UpdateEvent) ProtoMessage() {} func (x *UpdateEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[36] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[40] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2732,68 +2959,84 @@ func (x *UpdateEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateEvent.ProtoReflect.Descriptor instead. func (*UpdateEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{36} + return file_bridge_proto_rawDescGZIP(), []int{40} } -func (m *UpdateEvent) GetEvent() isUpdateEvent_Event { - if m != nil { - return m.Event +func (x *UpdateEvent) GetEvent() isUpdateEvent_Event { + if x != nil { + return x.Event } return nil } func (x *UpdateEvent) GetError() *UpdateErrorEvent { - if x, ok := x.GetEvent().(*UpdateEvent_Error); ok { - return x.Error + if x != nil { + if x, ok := x.Event.(*UpdateEvent_Error); ok { + return x.Error + } } return nil } func (x *UpdateEvent) GetManualReady() *UpdateManualReadyEvent { - if x, ok := x.GetEvent().(*UpdateEvent_ManualReady); ok { - return x.ManualReady + if x != nil { + if x, ok := x.Event.(*UpdateEvent_ManualReady); ok { + return x.ManualReady + } } return nil } func (x *UpdateEvent) GetManualRestartNeeded() *UpdateManualRestartNeededEvent { - if x, ok := x.GetEvent().(*UpdateEvent_ManualRestartNeeded); ok { - return x.ManualRestartNeeded + if x != nil { + if x, ok := x.Event.(*UpdateEvent_ManualRestartNeeded); ok { + return x.ManualRestartNeeded + } } return nil } func (x *UpdateEvent) GetForce() *UpdateForceEvent { - if x, ok := x.GetEvent().(*UpdateEvent_Force); ok { - return x.Force + if x != nil { + if x, ok := x.Event.(*UpdateEvent_Force); ok { + return x.Force + } } return nil } func (x *UpdateEvent) GetSilentRestartNeeded() *UpdateSilentRestartNeeded { - if x, ok := x.GetEvent().(*UpdateEvent_SilentRestartNeeded); ok { - return x.SilentRestartNeeded + if x != nil { + if x, ok := x.Event.(*UpdateEvent_SilentRestartNeeded); ok { + return x.SilentRestartNeeded + } } return nil } func (x *UpdateEvent) GetIsLatestVersion() *UpdateIsLatestVersion { - if x, ok := x.GetEvent().(*UpdateEvent_IsLatestVersion); ok { - return x.IsLatestVersion + if x != nil { + if x, ok := x.Event.(*UpdateEvent_IsLatestVersion); ok { + return x.IsLatestVersion + } } return nil } func (x *UpdateEvent) GetCheckFinished() *UpdateCheckFinished { - if x, ok := x.GetEvent().(*UpdateEvent_CheckFinished); ok { - return x.CheckFinished + if x != nil { + if x, ok := x.Event.(*UpdateEvent_CheckFinished); ok { + return x.CheckFinished + } } return nil } func (x *UpdateEvent) GetVersionChanged() *UpdateVersionChanged { - if x, ok := x.GetEvent().(*UpdateEvent_VersionChanged); ok { - return x.VersionChanged + if x != nil { + if x, ok := x.Event.(*UpdateEvent_VersionChanged); ok { + return x.VersionChanged + } } return nil } @@ -2851,20 +3094,17 @@ func (*UpdateEvent_CheckFinished) isUpdateEvent_Event() {} func (*UpdateEvent_VersionChanged) isUpdateEvent_Event() {} type UpdateErrorEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Type UpdateErrorType `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.UpdateErrorType" json:"type,omitempty"` unknownFields protoimpl.UnknownFields - - Type UpdateErrorType `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.UpdateErrorType" json:"type,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UpdateErrorEvent) Reset() { *x = UpdateErrorEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[37] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateErrorEvent) String() string { @@ -2874,8 +3114,8 @@ func (x *UpdateErrorEvent) String() string { func (*UpdateErrorEvent) ProtoMessage() {} func (x *UpdateErrorEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[37] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[41] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2887,7 +3127,7 @@ func (x *UpdateErrorEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateErrorEvent.ProtoReflect.Descriptor instead. func (*UpdateErrorEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{37} + return file_bridge_proto_rawDescGZIP(), []int{41} } func (x *UpdateErrorEvent) GetType() UpdateErrorType { @@ -2898,20 +3138,17 @@ func (x *UpdateErrorEvent) GetType() UpdateErrorType { } type UpdateManualReadyEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` unknownFields protoimpl.UnknownFields - - Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UpdateManualReadyEvent) Reset() { *x = UpdateManualReadyEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[38] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateManualReadyEvent) String() string { @@ -2921,8 +3158,8 @@ func (x *UpdateManualReadyEvent) String() string { func (*UpdateManualReadyEvent) ProtoMessage() {} func (x *UpdateManualReadyEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[38] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[42] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2934,7 +3171,7 @@ func (x *UpdateManualReadyEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateManualReadyEvent.ProtoReflect.Descriptor instead. func (*UpdateManualReadyEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{38} + return file_bridge_proto_rawDescGZIP(), []int{42} } func (x *UpdateManualReadyEvent) GetVersion() string { @@ -2945,18 +3182,16 @@ func (x *UpdateManualReadyEvent) GetVersion() string { } type UpdateManualRestartNeededEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateManualRestartNeededEvent) Reset() { *x = UpdateManualRestartNeededEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[39] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateManualRestartNeededEvent) String() string { @@ -2966,8 +3201,8 @@ func (x *UpdateManualRestartNeededEvent) String() string { func (*UpdateManualRestartNeededEvent) ProtoMessage() {} func (x *UpdateManualRestartNeededEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[39] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[43] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2979,24 +3214,21 @@ func (x *UpdateManualRestartNeededEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateManualRestartNeededEvent.ProtoReflect.Descriptor instead. func (*UpdateManualRestartNeededEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{39} + return file_bridge_proto_rawDescGZIP(), []int{43} } type UpdateForceEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` unknownFields protoimpl.UnknownFields - - Version string `protobuf:"bytes,1,opt,name=version,proto3" json:"version,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UpdateForceEvent) Reset() { *x = UpdateForceEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[40] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateForceEvent) String() string { @@ -3006,8 +3238,8 @@ func (x *UpdateForceEvent) String() string { func (*UpdateForceEvent) ProtoMessage() {} func (x *UpdateForceEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[40] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[44] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3019,7 +3251,7 @@ func (x *UpdateForceEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateForceEvent.ProtoReflect.Descriptor instead. func (*UpdateForceEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{40} + return file_bridge_proto_rawDescGZIP(), []int{44} } func (x *UpdateForceEvent) GetVersion() string { @@ -3030,18 +3262,16 @@ func (x *UpdateForceEvent) GetVersion() string { } type UpdateSilentRestartNeeded struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateSilentRestartNeeded) Reset() { *x = UpdateSilentRestartNeeded{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[41] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateSilentRestartNeeded) String() string { @@ -3051,8 +3281,8 @@ func (x *UpdateSilentRestartNeeded) String() string { func (*UpdateSilentRestartNeeded) ProtoMessage() {} func (x *UpdateSilentRestartNeeded) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[41] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[45] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3064,22 +3294,20 @@ func (x *UpdateSilentRestartNeeded) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateSilentRestartNeeded.ProtoReflect.Descriptor instead. func (*UpdateSilentRestartNeeded) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{41} + return file_bridge_proto_rawDescGZIP(), []int{45} } type UpdateIsLatestVersion struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateIsLatestVersion) Reset() { *x = UpdateIsLatestVersion{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[42] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateIsLatestVersion) String() string { @@ -3089,8 +3317,8 @@ func (x *UpdateIsLatestVersion) String() string { func (*UpdateIsLatestVersion) ProtoMessage() {} func (x *UpdateIsLatestVersion) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[42] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[46] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3102,22 +3330,20 @@ func (x *UpdateIsLatestVersion) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateIsLatestVersion.ProtoReflect.Descriptor instead. func (*UpdateIsLatestVersion) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{42} + return file_bridge_proto_rawDescGZIP(), []int{46} } type UpdateCheckFinished struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateCheckFinished) Reset() { *x = UpdateCheckFinished{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[43] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateCheckFinished) String() string { @@ -3127,8 +3353,8 @@ func (x *UpdateCheckFinished) String() string { func (*UpdateCheckFinished) ProtoMessage() {} func (x *UpdateCheckFinished) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[43] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[47] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3140,22 +3366,20 @@ func (x *UpdateCheckFinished) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateCheckFinished.ProtoReflect.Descriptor instead. func (*UpdateCheckFinished) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{43} + return file_bridge_proto_rawDescGZIP(), []int{47} } type UpdateVersionChanged struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateVersionChanged) Reset() { *x = UpdateVersionChanged{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[44] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateVersionChanged) String() string { @@ -3165,8 +3389,8 @@ func (x *UpdateVersionChanged) String() string { func (*UpdateVersionChanged) ProtoMessage() {} func (x *UpdateVersionChanged) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[44] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[48] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3178,32 +3402,29 @@ func (x *UpdateVersionChanged) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateVersionChanged.ProtoReflect.Descriptor instead. func (*UpdateVersionChanged) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{44} + return file_bridge_proto_rawDescGZIP(), []int{48} } // ********************************************************** // Cache on disk related events // ********************************************************** type DiskCacheEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Event: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Event: // // *DiskCacheEvent_Error // *DiskCacheEvent_PathChanged // *DiskCacheEvent_PathChangeFinished - Event isDiskCacheEvent_Event `protobuf_oneof:"event"` + Event isDiskCacheEvent_Event `protobuf_oneof:"event"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DiskCacheEvent) Reset() { *x = DiskCacheEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[45] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DiskCacheEvent) String() string { @@ -3213,8 +3434,8 @@ func (x *DiskCacheEvent) String() string { func (*DiskCacheEvent) ProtoMessage() {} func (x *DiskCacheEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[45] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[49] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3226,33 +3447,39 @@ func (x *DiskCacheEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use DiskCacheEvent.ProtoReflect.Descriptor instead. func (*DiskCacheEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{45} + return file_bridge_proto_rawDescGZIP(), []int{49} } -func (m *DiskCacheEvent) GetEvent() isDiskCacheEvent_Event { - if m != nil { - return m.Event +func (x *DiskCacheEvent) GetEvent() isDiskCacheEvent_Event { + if x != nil { + return x.Event } return nil } func (x *DiskCacheEvent) GetError() *DiskCacheErrorEvent { - if x, ok := x.GetEvent().(*DiskCacheEvent_Error); ok { - return x.Error + if x != nil { + if x, ok := x.Event.(*DiskCacheEvent_Error); ok { + return x.Error + } } return nil } func (x *DiskCacheEvent) GetPathChanged() *DiskCachePathChangedEvent { - if x, ok := x.GetEvent().(*DiskCacheEvent_PathChanged); ok { - return x.PathChanged + if x != nil { + if x, ok := x.Event.(*DiskCacheEvent_PathChanged); ok { + return x.PathChanged + } } return nil } func (x *DiskCacheEvent) GetPathChangeFinished() *DiskCachePathChangeFinishedEvent { - if x, ok := x.GetEvent().(*DiskCacheEvent_PathChangeFinished); ok { - return x.PathChangeFinished + if x != nil { + if x, ok := x.Event.(*DiskCacheEvent_PathChangeFinished); ok { + return x.PathChangeFinished + } } return nil } @@ -3280,20 +3507,17 @@ func (*DiskCacheEvent_PathChanged) isDiskCacheEvent_Event() {} func (*DiskCacheEvent_PathChangeFinished) isDiskCacheEvent_Event() {} type DiskCacheErrorEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Type DiskCacheErrorType `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.DiskCacheErrorType" json:"type,omitempty"` unknownFields protoimpl.UnknownFields - - Type DiskCacheErrorType `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.DiskCacheErrorType" json:"type,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DiskCacheErrorEvent) Reset() { *x = DiskCacheErrorEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[46] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DiskCacheErrorEvent) String() string { @@ -3303,8 +3527,8 @@ func (x *DiskCacheErrorEvent) String() string { func (*DiskCacheErrorEvent) ProtoMessage() {} func (x *DiskCacheErrorEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[46] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[50] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3316,7 +3540,7 @@ func (x *DiskCacheErrorEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use DiskCacheErrorEvent.ProtoReflect.Descriptor instead. func (*DiskCacheErrorEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{46} + return file_bridge_proto_rawDescGZIP(), []int{50} } func (x *DiskCacheErrorEvent) GetType() DiskCacheErrorType { @@ -3327,20 +3551,17 @@ func (x *DiskCacheErrorEvent) GetType() DiskCacheErrorType { } type DiskCachePathChangedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` unknownFields protoimpl.UnknownFields - - Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DiskCachePathChangedEvent) Reset() { *x = DiskCachePathChangedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[47] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DiskCachePathChangedEvent) String() string { @@ -3350,8 +3571,8 @@ func (x *DiskCachePathChangedEvent) String() string { func (*DiskCachePathChangedEvent) ProtoMessage() {} func (x *DiskCachePathChangedEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[47] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[51] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3363,7 +3584,7 @@ func (x *DiskCachePathChangedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use DiskCachePathChangedEvent.ProtoReflect.Descriptor instead. func (*DiskCachePathChangedEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{47} + return file_bridge_proto_rawDescGZIP(), []int{51} } func (x *DiskCachePathChangedEvent) GetPath() string { @@ -3374,18 +3595,16 @@ func (x *DiskCachePathChangedEvent) GetPath() string { } type DiskCachePathChangeFinishedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *DiskCachePathChangeFinishedEvent) Reset() { *x = DiskCachePathChangeFinishedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[48] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DiskCachePathChangeFinishedEvent) String() string { @@ -3395,8 +3614,8 @@ func (x *DiskCachePathChangeFinishedEvent) String() string { func (*DiskCachePathChangeFinishedEvent) ProtoMessage() {} func (x *DiskCachePathChangeFinishedEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[48] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[52] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3408,32 +3627,29 @@ func (x *DiskCachePathChangeFinishedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use DiskCachePathChangeFinishedEvent.ProtoReflect.Descriptor instead. func (*DiskCachePathChangeFinishedEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{48} + return file_bridge_proto_rawDescGZIP(), []int{52} } // ********************************************************** // Mail server settings related events // ********************************************************** type MailServerSettingsEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Event: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Event: // // *MailServerSettingsEvent_Error // *MailServerSettingsEvent_MailServerSettingsChanged // *MailServerSettingsEvent_ChangeMailServerSettingsFinished - Event isMailServerSettingsEvent_Event `protobuf_oneof:"event"` + Event isMailServerSettingsEvent_Event `protobuf_oneof:"event"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MailServerSettingsEvent) Reset() { *x = MailServerSettingsEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MailServerSettingsEvent) String() string { @@ -3443,8 +3659,8 @@ func (x *MailServerSettingsEvent) String() string { func (*MailServerSettingsEvent) ProtoMessage() {} func (x *MailServerSettingsEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[49] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[53] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3456,33 +3672,39 @@ func (x *MailServerSettingsEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use MailServerSettingsEvent.ProtoReflect.Descriptor instead. func (*MailServerSettingsEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{49} + return file_bridge_proto_rawDescGZIP(), []int{53} } -func (m *MailServerSettingsEvent) GetEvent() isMailServerSettingsEvent_Event { - if m != nil { - return m.Event +func (x *MailServerSettingsEvent) GetEvent() isMailServerSettingsEvent_Event { + if x != nil { + return x.Event } return nil } func (x *MailServerSettingsEvent) GetError() *MailServerSettingsErrorEvent { - if x, ok := x.GetEvent().(*MailServerSettingsEvent_Error); ok { - return x.Error + if x != nil { + if x, ok := x.Event.(*MailServerSettingsEvent_Error); ok { + return x.Error + } } return nil } func (x *MailServerSettingsEvent) GetMailServerSettingsChanged() *MailServerSettingsChangedEvent { - if x, ok := x.GetEvent().(*MailServerSettingsEvent_MailServerSettingsChanged); ok { - return x.MailServerSettingsChanged + if x != nil { + if x, ok := x.Event.(*MailServerSettingsEvent_MailServerSettingsChanged); ok { + return x.MailServerSettingsChanged + } } return nil } func (x *MailServerSettingsEvent) GetChangeMailServerSettingsFinished() *ChangeMailServerSettingsFinishedEvent { - if x, ok := x.GetEvent().(*MailServerSettingsEvent_ChangeMailServerSettingsFinished); ok { - return x.ChangeMailServerSettingsFinished + if x != nil { + if x, ok := x.Event.(*MailServerSettingsEvent_ChangeMailServerSettingsFinished); ok { + return x.ChangeMailServerSettingsFinished + } } return nil } @@ -3510,20 +3732,17 @@ func (*MailServerSettingsEvent_MailServerSettingsChanged) isMailServerSettingsEv func (*MailServerSettingsEvent_ChangeMailServerSettingsFinished) isMailServerSettingsEvent_Event() {} type MailServerSettingsErrorEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Type MailServerSettingsErrorType `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.MailServerSettingsErrorType" json:"type,omitempty"` unknownFields protoimpl.UnknownFields - - Type MailServerSettingsErrorType `protobuf:"varint,1,opt,name=type,proto3,enum=grpc.MailServerSettingsErrorType" json:"type,omitempty"` + sizeCache protoimpl.SizeCache } func (x *MailServerSettingsErrorEvent) Reset() { *x = MailServerSettingsErrorEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[50] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MailServerSettingsErrorEvent) String() string { @@ -3533,8 +3752,8 @@ func (x *MailServerSettingsErrorEvent) String() string { func (*MailServerSettingsErrorEvent) ProtoMessage() {} func (x *MailServerSettingsErrorEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[50] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[54] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3546,7 +3765,7 @@ func (x *MailServerSettingsErrorEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use MailServerSettingsErrorEvent.ProtoReflect.Descriptor instead. func (*MailServerSettingsErrorEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{50} + return file_bridge_proto_rawDescGZIP(), []int{54} } func (x *MailServerSettingsErrorEvent) GetType() MailServerSettingsErrorType { @@ -3557,20 +3776,17 @@ func (x *MailServerSettingsErrorEvent) GetType() MailServerSettingsErrorType { } type MailServerSettingsChangedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Settings *ImapSmtpSettings `protobuf:"bytes,1,opt,name=settings,proto3" json:"settings,omitempty"` unknownFields protoimpl.UnknownFields - - Settings *ImapSmtpSettings `protobuf:"bytes,1,opt,name=settings,proto3" json:"settings,omitempty"` + sizeCache protoimpl.SizeCache } func (x *MailServerSettingsChangedEvent) Reset() { *x = MailServerSettingsChangedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[51] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MailServerSettingsChangedEvent) String() string { @@ -3580,8 +3796,8 @@ func (x *MailServerSettingsChangedEvent) String() string { func (*MailServerSettingsChangedEvent) ProtoMessage() {} func (x *MailServerSettingsChangedEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[51] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[55] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3593,7 +3809,7 @@ func (x *MailServerSettingsChangedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use MailServerSettingsChangedEvent.ProtoReflect.Descriptor instead. func (*MailServerSettingsChangedEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{51} + return file_bridge_proto_rawDescGZIP(), []int{55} } func (x *MailServerSettingsChangedEvent) GetSettings() *ImapSmtpSettings { @@ -3604,18 +3820,16 @@ func (x *MailServerSettingsChangedEvent) GetSettings() *ImapSmtpSettings { } type ChangeMailServerSettingsFinishedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChangeMailServerSettingsFinishedEvent) Reset() { *x = ChangeMailServerSettingsFinishedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[52] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChangeMailServerSettingsFinishedEvent) String() string { @@ -3625,8 +3839,8 @@ func (x *ChangeMailServerSettingsFinishedEvent) String() string { func (*ChangeMailServerSettingsFinishedEvent) ProtoMessage() {} func (x *ChangeMailServerSettingsFinishedEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[52] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[56] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3638,32 +3852,29 @@ func (x *ChangeMailServerSettingsFinishedEvent) ProtoReflect() protoreflect.Mess // Deprecated: Use ChangeMailServerSettingsFinishedEvent.ProtoReflect.Descriptor instead. func (*ChangeMailServerSettingsFinishedEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{52} + return file_bridge_proto_rawDescGZIP(), []int{56} } // ********************************************************** // keychain related events // ********************************************************** type KeychainEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Event: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Event: // // *KeychainEvent_ChangeKeychainFinished // *KeychainEvent_HasNoKeychain // *KeychainEvent_RebuildKeychain - Event isKeychainEvent_Event `protobuf_oneof:"event"` + Event isKeychainEvent_Event `protobuf_oneof:"event"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *KeychainEvent) Reset() { *x = KeychainEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[53] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *KeychainEvent) String() string { @@ -3673,8 +3884,8 @@ func (x *KeychainEvent) String() string { func (*KeychainEvent) ProtoMessage() {} func (x *KeychainEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[53] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[57] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3686,33 +3897,39 @@ func (x *KeychainEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use KeychainEvent.ProtoReflect.Descriptor instead. func (*KeychainEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{53} + return file_bridge_proto_rawDescGZIP(), []int{57} } -func (m *KeychainEvent) GetEvent() isKeychainEvent_Event { - if m != nil { - return m.Event +func (x *KeychainEvent) GetEvent() isKeychainEvent_Event { + if x != nil { + return x.Event } return nil } func (x *KeychainEvent) GetChangeKeychainFinished() *ChangeKeychainFinishedEvent { - if x, ok := x.GetEvent().(*KeychainEvent_ChangeKeychainFinished); ok { - return x.ChangeKeychainFinished + if x != nil { + if x, ok := x.Event.(*KeychainEvent_ChangeKeychainFinished); ok { + return x.ChangeKeychainFinished + } } return nil } func (x *KeychainEvent) GetHasNoKeychain() *HasNoKeychainEvent { - if x, ok := x.GetEvent().(*KeychainEvent_HasNoKeychain); ok { - return x.HasNoKeychain + if x != nil { + if x, ok := x.Event.(*KeychainEvent_HasNoKeychain); ok { + return x.HasNoKeychain + } } return nil } func (x *KeychainEvent) GetRebuildKeychain() *RebuildKeychainEvent { - if x, ok := x.GetEvent().(*KeychainEvent_RebuildKeychain); ok { - return x.RebuildKeychain + if x != nil { + if x, ok := x.Event.(*KeychainEvent_RebuildKeychain); ok { + return x.RebuildKeychain + } } return nil } @@ -3740,18 +3957,16 @@ func (*KeychainEvent_HasNoKeychain) isKeychainEvent_Event() {} func (*KeychainEvent_RebuildKeychain) isKeychainEvent_Event() {} type ChangeKeychainFinishedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ChangeKeychainFinishedEvent) Reset() { *x = ChangeKeychainFinishedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ChangeKeychainFinishedEvent) String() string { @@ -3761,8 +3976,8 @@ func (x *ChangeKeychainFinishedEvent) String() string { func (*ChangeKeychainFinishedEvent) ProtoMessage() {} func (x *ChangeKeychainFinishedEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[54] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[58] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3774,22 +3989,20 @@ func (x *ChangeKeychainFinishedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangeKeychainFinishedEvent.ProtoReflect.Descriptor instead. func (*ChangeKeychainFinishedEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{54} + return file_bridge_proto_rawDescGZIP(), []int{58} } type HasNoKeychainEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *HasNoKeychainEvent) Reset() { *x = HasNoKeychainEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[55] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *HasNoKeychainEvent) String() string { @@ -3799,8 +4012,8 @@ func (x *HasNoKeychainEvent) String() string { func (*HasNoKeychainEvent) ProtoMessage() {} func (x *HasNoKeychainEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[55] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[59] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3812,22 +4025,20 @@ func (x *HasNoKeychainEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use HasNoKeychainEvent.ProtoReflect.Descriptor instead. func (*HasNoKeychainEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{55} + return file_bridge_proto_rawDescGZIP(), []int{59} } type RebuildKeychainEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *RebuildKeychainEvent) Reset() { *x = RebuildKeychainEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[56] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RebuildKeychainEvent) String() string { @@ -3837,8 +4048,8 @@ func (x *RebuildKeychainEvent) String() string { func (*RebuildKeychainEvent) ProtoMessage() {} func (x *RebuildKeychainEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[56] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[60] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3850,32 +4061,29 @@ func (x *RebuildKeychainEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use RebuildKeychainEvent.ProtoReflect.Descriptor instead. func (*RebuildKeychainEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{56} + return file_bridge_proto_rawDescGZIP(), []int{60} } // ********************************************************** // Mail related events // ********************************************************** type MailEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Event: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Event: // // *MailEvent_AddressChanged // *MailEvent_AddressChangedLogout // *MailEvent_ApiCertIssue - Event isMailEvent_Event `protobuf_oneof:"event"` + Event isMailEvent_Event `protobuf_oneof:"event"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *MailEvent) Reset() { *x = MailEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[57] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *MailEvent) String() string { @@ -3885,8 +4093,8 @@ func (x *MailEvent) String() string { func (*MailEvent) ProtoMessage() {} func (x *MailEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[57] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[61] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3898,33 +4106,39 @@ func (x *MailEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use MailEvent.ProtoReflect.Descriptor instead. func (*MailEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{57} + return file_bridge_proto_rawDescGZIP(), []int{61} } -func (m *MailEvent) GetEvent() isMailEvent_Event { - if m != nil { - return m.Event +func (x *MailEvent) GetEvent() isMailEvent_Event { + if x != nil { + return x.Event } return nil } func (x *MailEvent) GetAddressChanged() *AddressChangedEvent { - if x, ok := x.GetEvent().(*MailEvent_AddressChanged); ok { - return x.AddressChanged + if x != nil { + if x, ok := x.Event.(*MailEvent_AddressChanged); ok { + return x.AddressChanged + } } return nil } func (x *MailEvent) GetAddressChangedLogout() *AddressChangedLogoutEvent { - if x, ok := x.GetEvent().(*MailEvent_AddressChangedLogout); ok { - return x.AddressChangedLogout + if x != nil { + if x, ok := x.Event.(*MailEvent_AddressChangedLogout); ok { + return x.AddressChangedLogout + } } return nil } func (x *MailEvent) GetApiCertIssue() *ApiCertIssueEvent { - if x, ok := x.GetEvent().(*MailEvent_ApiCertIssue); ok { - return x.ApiCertIssue + if x != nil { + if x, ok := x.Event.(*MailEvent_ApiCertIssue); ok { + return x.ApiCertIssue + } } return nil } @@ -3952,20 +4166,17 @@ func (*MailEvent_AddressChangedLogout) isMailEvent_Event() {} func (*MailEvent_ApiCertIssue) isMailEvent_Event() {} type AddressChangedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` unknownFields protoimpl.UnknownFields - - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AddressChangedEvent) Reset() { *x = AddressChangedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[58] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddressChangedEvent) String() string { @@ -3975,8 +4186,8 @@ func (x *AddressChangedEvent) String() string { func (*AddressChangedEvent) ProtoMessage() {} func (x *AddressChangedEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[58] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[62] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3988,7 +4199,7 @@ func (x *AddressChangedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AddressChangedEvent.ProtoReflect.Descriptor instead. func (*AddressChangedEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{58} + return file_bridge_proto_rawDescGZIP(), []int{62} } func (x *AddressChangedEvent) GetAddress() string { @@ -3999,20 +4210,17 @@ func (x *AddressChangedEvent) GetAddress() string { } type AddressChangedLogoutEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` unknownFields protoimpl.UnknownFields - - Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + sizeCache protoimpl.SizeCache } func (x *AddressChangedLogoutEvent) Reset() { *x = AddressChangedLogoutEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[59] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *AddressChangedLogoutEvent) String() string { @@ -4022,8 +4230,8 @@ func (x *AddressChangedLogoutEvent) String() string { func (*AddressChangedLogoutEvent) ProtoMessage() {} func (x *AddressChangedLogoutEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[59] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[63] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4035,7 +4243,7 @@ func (x *AddressChangedLogoutEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use AddressChangedLogoutEvent.ProtoReflect.Descriptor instead. func (*AddressChangedLogoutEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{59} + return file_bridge_proto_rawDescGZIP(), []int{63} } func (x *AddressChangedLogoutEvent) GetAddress() string { @@ -4046,18 +4254,16 @@ func (x *AddressChangedLogoutEvent) GetAddress() string { } type ApiCertIssueEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ApiCertIssueEvent) Reset() { *x = ApiCertIssueEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[60] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ApiCertIssueEvent) String() string { @@ -4067,8 +4273,8 @@ func (x *ApiCertIssueEvent) String() string { func (*ApiCertIssueEvent) ProtoMessage() {} func (x *ApiCertIssueEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[60] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[64] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4080,15 +4286,12 @@ func (x *ApiCertIssueEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ApiCertIssueEvent.ProtoReflect.Descriptor instead. func (*ApiCertIssueEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{60} + return file_bridge_proto_rawDescGZIP(), []int{64} } type UserEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to Event: + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Event: // // *UserEvent_ToggleSplitModeFinished // *UserEvent_UserDisconnected @@ -4099,16 +4302,16 @@ type UserEvent struct { // *UserEvent_SyncStartedEvent // *UserEvent_SyncFinishedEvent // *UserEvent_SyncProgressEvent - Event isUserEvent_Event `protobuf_oneof:"event"` + Event isUserEvent_Event `protobuf_oneof:"event"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UserEvent) Reset() { *x = UserEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[61] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserEvent) String() string { @@ -4118,8 +4321,8 @@ func (x *UserEvent) String() string { func (*UserEvent) ProtoMessage() {} func (x *UserEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[61] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[65] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4131,75 +4334,93 @@ func (x *UserEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UserEvent.ProtoReflect.Descriptor instead. func (*UserEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{61} + return file_bridge_proto_rawDescGZIP(), []int{65} } -func (m *UserEvent) GetEvent() isUserEvent_Event { - if m != nil { - return m.Event +func (x *UserEvent) GetEvent() isUserEvent_Event { + if x != nil { + return x.Event } return nil } func (x *UserEvent) GetToggleSplitModeFinished() *ToggleSplitModeFinishedEvent { - if x, ok := x.GetEvent().(*UserEvent_ToggleSplitModeFinished); ok { - return x.ToggleSplitModeFinished + if x != nil { + if x, ok := x.Event.(*UserEvent_ToggleSplitModeFinished); ok { + return x.ToggleSplitModeFinished + } } return nil } func (x *UserEvent) GetUserDisconnected() *UserDisconnectedEvent { - if x, ok := x.GetEvent().(*UserEvent_UserDisconnected); ok { - return x.UserDisconnected + if x != nil { + if x, ok := x.Event.(*UserEvent_UserDisconnected); ok { + return x.UserDisconnected + } } return nil } func (x *UserEvent) GetUserChanged() *UserChangedEvent { - if x, ok := x.GetEvent().(*UserEvent_UserChanged); ok { - return x.UserChanged + if x != nil { + if x, ok := x.Event.(*UserEvent_UserChanged); ok { + return x.UserChanged + } } return nil } func (x *UserEvent) GetUserBadEvent() *UserBadEvent { - if x, ok := x.GetEvent().(*UserEvent_UserBadEvent); ok { - return x.UserBadEvent + if x != nil { + if x, ok := x.Event.(*UserEvent_UserBadEvent); ok { + return x.UserBadEvent + } } return nil } func (x *UserEvent) GetUsedBytesChangedEvent() *UsedBytesChangedEvent { - if x, ok := x.GetEvent().(*UserEvent_UsedBytesChangedEvent); ok { - return x.UsedBytesChangedEvent + if x != nil { + if x, ok := x.Event.(*UserEvent_UsedBytesChangedEvent); ok { + return x.UsedBytesChangedEvent + } } return nil } func (x *UserEvent) GetImapLoginFailedEvent() *ImapLoginFailedEvent { - if x, ok := x.GetEvent().(*UserEvent_ImapLoginFailedEvent); ok { - return x.ImapLoginFailedEvent + if x != nil { + if x, ok := x.Event.(*UserEvent_ImapLoginFailedEvent); ok { + return x.ImapLoginFailedEvent + } } return nil } func (x *UserEvent) GetSyncStartedEvent() *SyncStartedEvent { - if x, ok := x.GetEvent().(*UserEvent_SyncStartedEvent); ok { - return x.SyncStartedEvent + if x != nil { + if x, ok := x.Event.(*UserEvent_SyncStartedEvent); ok { + return x.SyncStartedEvent + } } return nil } func (x *UserEvent) GetSyncFinishedEvent() *SyncFinishedEvent { - if x, ok := x.GetEvent().(*UserEvent_SyncFinishedEvent); ok { - return x.SyncFinishedEvent + if x != nil { + if x, ok := x.Event.(*UserEvent_SyncFinishedEvent); ok { + return x.SyncFinishedEvent + } } return nil } func (x *UserEvent) GetSyncProgressEvent() *SyncProgressEvent { - if x, ok := x.GetEvent().(*UserEvent_SyncProgressEvent); ok { - return x.SyncProgressEvent + if x != nil { + if x, ok := x.Event.(*UserEvent_SyncProgressEvent); ok { + return x.SyncProgressEvent + } } return nil } @@ -4263,20 +4484,17 @@ func (*UserEvent_SyncFinishedEvent) isUserEvent_Event() {} func (*UserEvent_SyncProgressEvent) isUserEvent_Event() {} type ToggleSplitModeFinishedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` unknownFields protoimpl.UnknownFields - - UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ToggleSplitModeFinishedEvent) Reset() { *x = ToggleSplitModeFinishedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[62] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[66] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ToggleSplitModeFinishedEvent) String() string { @@ -4286,8 +4504,8 @@ func (x *ToggleSplitModeFinishedEvent) String() string { func (*ToggleSplitModeFinishedEvent) ProtoMessage() {} func (x *ToggleSplitModeFinishedEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[62] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[66] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4299,7 +4517,7 @@ func (x *ToggleSplitModeFinishedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ToggleSplitModeFinishedEvent.ProtoReflect.Descriptor instead. func (*ToggleSplitModeFinishedEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{62} + return file_bridge_proto_rawDescGZIP(), []int{66} } func (x *ToggleSplitModeFinishedEvent) GetUserID() string { @@ -4310,20 +4528,17 @@ func (x *ToggleSplitModeFinishedEvent) GetUserID() string { } type UserDisconnectedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` unknownFields protoimpl.UnknownFields - - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UserDisconnectedEvent) Reset() { *x = UserDisconnectedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[63] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[67] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserDisconnectedEvent) String() string { @@ -4333,8 +4548,8 @@ func (x *UserDisconnectedEvent) String() string { func (*UserDisconnectedEvent) ProtoMessage() {} func (x *UserDisconnectedEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[63] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[67] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4346,7 +4561,7 @@ func (x *UserDisconnectedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UserDisconnectedEvent.ProtoReflect.Descriptor instead. func (*UserDisconnectedEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{63} + return file_bridge_proto_rawDescGZIP(), []int{67} } func (x *UserDisconnectedEvent) GetUsername() string { @@ -4357,20 +4572,17 @@ func (x *UserDisconnectedEvent) GetUsername() string { } type UserChangedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` unknownFields protoimpl.UnknownFields - - UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UserChangedEvent) Reset() { *x = UserChangedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[64] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[68] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserChangedEvent) String() string { @@ -4380,8 +4592,8 @@ func (x *UserChangedEvent) String() string { func (*UserChangedEvent) ProtoMessage() {} func (x *UserChangedEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[64] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[68] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4393,7 +4605,7 @@ func (x *UserChangedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UserChangedEvent.ProtoReflect.Descriptor instead. func (*UserChangedEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{64} + return file_bridge_proto_rawDescGZIP(), []int{68} } func (x *UserChangedEvent) GetUserID() string { @@ -4404,21 +4616,18 @@ func (x *UserChangedEvent) GetUserID() string { } type UserBadEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` + ErrorMessage string `protobuf:"bytes,2,opt,name=errorMessage,proto3" json:"errorMessage,omitempty"` unknownFields protoimpl.UnknownFields - - UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` - ErrorMessage string `protobuf:"bytes,2,opt,name=errorMessage,proto3" json:"errorMessage,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UserBadEvent) Reset() { *x = UserBadEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[65] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[69] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserBadEvent) String() string { @@ -4428,8 +4637,8 @@ func (x *UserBadEvent) String() string { func (*UserBadEvent) ProtoMessage() {} func (x *UserBadEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[65] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[69] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4441,7 +4650,7 @@ func (x *UserBadEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UserBadEvent.ProtoReflect.Descriptor instead. func (*UserBadEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{65} + return file_bridge_proto_rawDescGZIP(), []int{69} } func (x *UserBadEvent) GetUserID() string { @@ -4459,21 +4668,18 @@ func (x *UserBadEvent) GetErrorMessage() string { } type UsedBytesChangedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` + UsedBytes int64 `protobuf:"varint,2,opt,name=usedBytes,proto3" json:"usedBytes,omitempty"` unknownFields protoimpl.UnknownFields - - UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` - UsedBytes int64 `protobuf:"varint,2,opt,name=usedBytes,proto3" json:"usedBytes,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UsedBytesChangedEvent) Reset() { *x = UsedBytesChangedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[66] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[70] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UsedBytesChangedEvent) String() string { @@ -4483,8 +4689,8 @@ func (x *UsedBytesChangedEvent) String() string { func (*UsedBytesChangedEvent) ProtoMessage() {} func (x *UsedBytesChangedEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[66] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[70] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4496,7 +4702,7 @@ func (x *UsedBytesChangedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UsedBytesChangedEvent.ProtoReflect.Descriptor instead. func (*UsedBytesChangedEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{66} + return file_bridge_proto_rawDescGZIP(), []int{70} } func (x *UsedBytesChangedEvent) GetUserID() string { @@ -4514,20 +4720,17 @@ func (x *UsedBytesChangedEvent) GetUsedBytes() int64 { } type ImapLoginFailedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` unknownFields protoimpl.UnknownFields - - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ImapLoginFailedEvent) Reset() { *x = ImapLoginFailedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[67] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[71] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ImapLoginFailedEvent) String() string { @@ -4537,8 +4740,8 @@ func (x *ImapLoginFailedEvent) String() string { func (*ImapLoginFailedEvent) ProtoMessage() {} func (x *ImapLoginFailedEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[67] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[71] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4550,7 +4753,7 @@ func (x *ImapLoginFailedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ImapLoginFailedEvent.ProtoReflect.Descriptor instead. func (*ImapLoginFailedEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{67} + return file_bridge_proto_rawDescGZIP(), []int{71} } func (x *ImapLoginFailedEvent) GetUsername() string { @@ -4561,20 +4764,17 @@ func (x *ImapLoginFailedEvent) GetUsername() string { } type SyncStartedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` unknownFields protoimpl.UnknownFields - - UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SyncStartedEvent) Reset() { *x = SyncStartedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[68] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[72] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SyncStartedEvent) String() string { @@ -4584,8 +4784,8 @@ func (x *SyncStartedEvent) String() string { func (*SyncStartedEvent) ProtoMessage() {} func (x *SyncStartedEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[68] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[72] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4597,7 +4797,7 @@ func (x *SyncStartedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use SyncStartedEvent.ProtoReflect.Descriptor instead. func (*SyncStartedEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{68} + return file_bridge_proto_rawDescGZIP(), []int{72} } func (x *SyncStartedEvent) GetUserID() string { @@ -4608,20 +4808,17 @@ func (x *SyncStartedEvent) GetUserID() string { } type SyncFinishedEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` unknownFields protoimpl.UnknownFields - - UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SyncFinishedEvent) Reset() { *x = SyncFinishedEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[69] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[73] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SyncFinishedEvent) String() string { @@ -4631,8 +4828,8 @@ func (x *SyncFinishedEvent) String() string { func (*SyncFinishedEvent) ProtoMessage() {} func (x *SyncFinishedEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[69] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[73] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4644,7 +4841,7 @@ func (x *SyncFinishedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use SyncFinishedEvent.ProtoReflect.Descriptor instead. func (*SyncFinishedEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{69} + return file_bridge_proto_rawDescGZIP(), []int{73} } func (x *SyncFinishedEvent) GetUserID() string { @@ -4655,23 +4852,20 @@ func (x *SyncFinishedEvent) GetUserID() string { } type SyncProgressEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` + Progress float64 `protobuf:"fixed64,2,opt,name=progress,proto3" json:"progress,omitempty"` + ElapsedMs int64 `protobuf:"varint,3,opt,name=elapsedMs,proto3" json:"elapsedMs,omitempty"` + RemainingMs int64 `protobuf:"varint,4,opt,name=remainingMs,proto3" json:"remainingMs,omitempty"` unknownFields protoimpl.UnknownFields - - UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty"` - Progress float64 `protobuf:"fixed64,2,opt,name=progress,proto3" json:"progress,omitempty"` - ElapsedMs int64 `protobuf:"varint,3,opt,name=elapsedMs,proto3" json:"elapsedMs,omitempty"` - RemainingMs int64 `protobuf:"varint,4,opt,name=remainingMs,proto3" json:"remainingMs,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SyncProgressEvent) Reset() { *x = SyncProgressEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[70] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[74] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SyncProgressEvent) String() string { @@ -4681,8 +4875,8 @@ func (x *SyncProgressEvent) String() string { func (*SyncProgressEvent) ProtoMessage() {} func (x *SyncProgressEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[70] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[74] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4694,7 +4888,7 @@ func (x *SyncProgressEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use SyncProgressEvent.ProtoReflect.Descriptor instead. func (*SyncProgressEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{70} + return file_bridge_proto_rawDescGZIP(), []int{74} } func (x *SyncProgressEvent) GetUserID() string { @@ -4726,23 +4920,20 @@ func (x *SyncProgressEvent) GetRemainingMs() int64 { } type UserNotificationEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` + Subtitle string `protobuf:"bytes,2,opt,name=subtitle,proto3" json:"subtitle,omitempty"` + Body string `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"` + UserID string `protobuf:"bytes,4,opt,name=userID,proto3" json:"userID,omitempty"` unknownFields protoimpl.UnknownFields - - Title string `protobuf:"bytes,1,opt,name=title,proto3" json:"title,omitempty"` - Subtitle string `protobuf:"bytes,2,opt,name=subtitle,proto3" json:"subtitle,omitempty"` - Body string `protobuf:"bytes,3,opt,name=body,proto3" json:"body,omitempty"` - UserID string `protobuf:"bytes,4,opt,name=userID,proto3" json:"userID,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UserNotificationEvent) Reset() { *x = UserNotificationEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[71] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[75] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserNotificationEvent) String() string { @@ -4752,8 +4943,8 @@ func (x *UserNotificationEvent) String() string { func (*UserNotificationEvent) ProtoMessage() {} func (x *UserNotificationEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[71] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[75] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4765,7 +4956,7 @@ func (x *UserNotificationEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use UserNotificationEvent.ProtoReflect.Descriptor instead. func (*UserNotificationEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{71} + return file_bridge_proto_rawDescGZIP(), []int{75} } func (x *UserNotificationEvent) GetTitle() string { @@ -4797,20 +4988,17 @@ func (x *UserNotificationEvent) GetUserID() string { } type GenericErrorEvent struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Code ErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=grpc.ErrorCode" json:"code,omitempty"` unknownFields protoimpl.UnknownFields - - Code ErrorCode `protobuf:"varint,1,opt,name=code,proto3,enum=grpc.ErrorCode" json:"code,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GenericErrorEvent) Reset() { *x = GenericErrorEvent{} - if protoimpl.UnsafeEnabled { - mi := &file_bridge_proto_msgTypes[72] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_bridge_proto_msgTypes[76] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GenericErrorEvent) String() string { @@ -4820,8 +5008,8 @@ func (x *GenericErrorEvent) String() string { func (*GenericErrorEvent) ProtoMessage() {} func (x *GenericErrorEvent) ProtoReflect() protoreflect.Message { - mi := &file_bridge_proto_msgTypes[72] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_bridge_proto_msgTypes[76] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4833,7 +5021,7 @@ func (x *GenericErrorEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use GenericErrorEvent.ProtoReflect.Descriptor instead. func (*GenericErrorEvent) Descriptor() ([]byte, []int) { - return file_bridge_proto_rawDescGZIP(), []int{72} + return file_bridge_proto_rawDescGZIP(), []int{76} } func (x *GenericErrorEvent) GetCode() ErrorCode { @@ -4845,875 +5033,378 @@ func (x *GenericErrorEvent) GetCode() ErrorCode { var File_bridge_proto protoreflect.FileDescriptor -var file_bridge_proto_rawDesc = []byte{ - 0x0a, 0x0c, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, - 0x67, 0x72, 0x70, 0x63, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0x6e, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x4c, 0x6f, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, - 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x18, 0x0a, - 0x07, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0x3e, 0x0a, 0x10, 0x47, 0x75, 0x69, 0x52, 0x65, 0x61, 0x64, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x68, 0x6f, 0x77, 0x53, 0x70, 0x6c, - 0x61, 0x73, 0x68, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x10, 0x73, 0x68, 0x6f, 0x77, 0x53, 0x70, 0x6c, 0x61, 0x73, 0x68, 0x53, 0x63, 0x72, 0x65, 0x65, - 0x6e, 0x22, 0xde, 0x01, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x73, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6f, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x6f, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, - 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x20, - 0x0a, 0x0b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x6f, 0x67, 0x73, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4c, 0x6f, - 0x67, 0x73, 0x22, 0x80, 0x01, 0x0a, 0x0c, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x27, 0x0a, 0x0c, 0x75, - 0x73, 0x65, 0x48, 0x76, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x08, 0x48, 0x00, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x48, 0x76, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x75, 0x73, 0x65, 0x48, 0x76, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x2f, 0x0a, 0x11, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x41, 0x62, - 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x96, 0x01, 0x0a, 0x10, 0x49, 0x6d, 0x61, 0x70, 0x53, - 0x6d, 0x74, 0x70, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x69, - 0x6d, 0x61, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x69, - 0x6d, 0x61, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x6d, 0x74, 0x70, 0x50, - 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x6d, 0x74, 0x70, 0x50, - 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, 0x53, 0x53, 0x4c, 0x46, 0x6f, 0x72, - 0x49, 0x6d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x53, - 0x53, 0x4c, 0x46, 0x6f, 0x72, 0x49, 0x6d, 0x61, 0x70, 0x12, 0x24, 0x0a, 0x0d, 0x75, 0x73, 0x65, - 0x53, 0x53, 0x4c, 0x46, 0x6f, 0x72, 0x53, 0x6d, 0x74, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0d, 0x75, 0x73, 0x65, 0x53, 0x53, 0x4c, 0x46, 0x6f, 0x72, 0x53, 0x6d, 0x74, 0x70, 0x22, - 0x3a, 0x0a, 0x1a, 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, 0x1c, 0x0a, - 0x09, 0x6b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x6b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x73, 0x22, 0x8f, 0x02, 0x0a, 0x04, - 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x54, 0x65, 0x78, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x54, 0x65, 0x78, 0x74, - 0x12, 0x25, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x0f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x70, 0x6c, 0x69, 0x74, - 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x70, 0x6c, 0x69, - 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x64, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x73, 0x65, 0x64, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x46, 0x0a, - 0x14, 0x55, 0x73, 0x65, 0x72, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, - 0x06, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x61, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x51, 0x0a, 0x1b, 0x55, 0x73, 0x65, 0x72, 0x42, 0x61, 0x64, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, - 0x64, 0x6f, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x64, 0x6f, 0x52, 0x65, 0x73, 0x79, 0x6e, 0x63, 0x22, 0x34, 0x0a, 0x10, 0x55, 0x73, 0x65, 0x72, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x05, - 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x67, 0x72, - 0x70, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x4d, - 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, - 0x4d, 0x61, 0x69, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, - 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, - 0x72, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x3c, 0x0a, - 0x12, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x6c, 0x61, - 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x22, 0xd0, 0x03, 0x0a, 0x0b, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x03, 0x61, - 0x70, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, - 0x41, 0x70, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x03, 0x61, 0x70, 0x70, 0x12, - 0x28, 0x0a, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x05, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x2b, 0x0a, 0x06, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x06, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x05, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, - 0x6b, 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x05, 0x63, - 0x61, 0x63, 0x68, 0x65, 0x12, 0x4f, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x12, 0x6d, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x31, 0x0a, 0x08, 0x6b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4b, - 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, - 0x6b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x25, 0x0a, 0x04, 0x6d, 0x61, 0x69, 0x6c, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x61, - 0x69, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x04, 0x6d, 0x61, 0x69, 0x6c, 0x12, - 0x25, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x3d, 0x0a, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, - 0x63, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, - 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xd2, - 0x09, 0x0a, 0x08, 0x41, 0x70, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x0e, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x5e, 0x0a, 0x17, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x41, - 0x75, 0x74, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x41, - 0x75, 0x74, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, - 0x12, 0x40, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x74, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x52, - 0x65, 0x73, 0x65, 0x74, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x65, 0x74, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, - 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x67, 0x46, - 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x67, 0x46, 0x69, - 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x72, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x67, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, - 0x12, 0x49, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x67, 0x53, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, - 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x67, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x42, 0x75, 0x67, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x43, 0x0a, 0x0e, 0x72, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x67, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x42, 0x75, 0x67, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x67, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x43, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x77, 0x4d, 0x61, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, - 0x53, 0x68, 0x6f, 0x77, 0x4d, 0x61, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x73, 0x68, 0x6f, 0x77, 0x4d, 0x61, 0x69, 0x6e, 0x57, - 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x12, 0x4c, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, - 0x75, 0x67, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, - 0x67, 0x46, 0x61, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x11, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x67, 0x46, 0x61, 0x6c, 0x6c, 0x62, - 0x61, 0x63, 0x6b, 0x12, 0x64, 0x0a, 0x19, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, - 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, - 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x19, - 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, - 0x6c, 0x6c, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x67, 0x0a, 0x1a, 0x63, 0x65, 0x72, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x43, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x67, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1a, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, - 0x65, 0x64, 0x12, 0x61, 0x0a, 0x18, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x65, 0x72, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x46, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, 0x63, 0x65, 0x72, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x46, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x61, 0x0a, 0x18, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, - 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4b, - 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x53, 0x75, 0x67, 0x67, - 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x18, - 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x53, 0x75, 0x67, - 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, 0x0a, 0x0d, 0x72, 0x65, 0x70, 0x61, - 0x69, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x70, 0x61, 0x69, 0x72, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x72, 0x65, 0x70, - 0x61, 0x69, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x0e, 0x61, 0x6c, - 0x6c, 0x55, 0x73, 0x65, 0x72, 0x73, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, - 0x72, 0x73, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x0e, 0x61, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, 0x73, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x12, - 0x49, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x75, 0x73, 0x65, 0x72, 0x4e, 0x6f, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x22, 0x33, 0x0a, 0x13, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x22, 0x1e, 0x0a, 0x1c, 0x54, 0x6f, 0x67, 0x67, - 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x46, 0x69, 0x6e, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x14, 0x0a, 0x12, 0x52, 0x65, 0x73, 0x65, - 0x74, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x18, - 0x0a, 0x16, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x67, 0x46, 0x69, 0x6e, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x52, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x42, 0x75, 0x67, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x67, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x68, 0x6f, 0x77, - 0x4d, 0x61, 0x69, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, - 0x18, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x67, 0x46, 0x61, 0x6c, 0x6c, - 0x62, 0x61, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x20, 0x0a, 0x1e, 0x43, 0x65, 0x72, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x53, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x21, 0x0a, 0x1f, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, - 0x6c, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x1f, - 0x0a, 0x1d, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, - 0x74, 0x61, 0x6c, 0x6c, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, - 0x14, 0x0a, 0x12, 0x52, 0x65, 0x70, 0x61, 0x69, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x15, 0x0a, 0x13, 0x41, 0x6c, 0x6c, 0x55, 0x73, 0x65, 0x72, - 0x73, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x41, 0x0a, 0x17, - 0x4b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x53, 0x75, 0x67, - 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, - 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x22, - 0x60, 0x0a, 0x1d, 0x4b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, - 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x3f, 0x0a, 0x0b, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4b, 0x6e, 0x6f, - 0x77, 0x6c, 0x65, 0x64, 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0xa4, 0x03, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x2d, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, - 0x42, 0x0a, 0x0c, 0x74, 0x66, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, - 0x69, 0x6e, 0x54, 0x66, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x74, 0x66, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x65, 0x64, 0x12, 0x5b, 0x0a, 0x14, 0x74, 0x77, 0x6f, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x54, 0x77, - 0x6f, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x74, 0x77, 0x6f, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, - 0x12, 0x36, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x46, - 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, - 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x0f, 0x61, 0x6c, 0x72, 0x65, - 0x61, 0x64, 0x79, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x64, 0x49, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x46, 0x69, - 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x61, - 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x4c, 0x6f, 0x67, 0x67, 0x65, 0x64, 0x49, 0x6e, 0x12, 0x3f, - 0x0a, 0x0b, 0x68, 0x76, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, - 0x48, 0x76, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x0b, 0x68, 0x76, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x42, - 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x4c, 0x6f, 0x67, 0x69, - 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, - 0x34, 0x0a, 0x16, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x54, 0x66, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3d, 0x0a, 0x1f, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x54, 0x77, - 0x6f, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x50, 0x0a, 0x12, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x46, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x44, 0x12, 0x22, 0x0a, 0x0c, 0x77, 0x61, 0x73, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x4f, - 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x77, 0x61, 0x73, 0x53, 0x69, 0x67, - 0x6e, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x22, 0x2d, 0x0a, 0x15, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x48, - 0x76, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x68, 0x76, 0x55, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x68, 0x76, 0x55, 0x72, 0x6c, 0x22, 0xb9, 0x04, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x40, 0x0a, 0x0b, 0x6d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x52, - 0x65, 0x61, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x72, 0x70, - 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x52, 0x65, - 0x61, 0x64, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x61, 0x6e, 0x75, - 0x61, 0x6c, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x58, 0x0a, 0x13, 0x6d, 0x61, 0x6e, 0x75, 0x61, - 0x6c, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4e, - 0x65, 0x65, 0x64, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x61, - 0x6e, 0x75, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4e, 0x65, 0x65, 0x64, 0x65, - 0x64, 0x12, 0x2e, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x6f, - 0x72, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x12, 0x53, 0x0a, 0x13, 0x73, 0x69, 0x6c, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x4e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x69, 0x6c, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x48, - 0x00, 0x52, 0x13, 0x73, 0x69, 0x6c, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x4e, 0x65, 0x65, 0x64, 0x65, 0x64, 0x12, 0x47, 0x0a, 0x0f, 0x69, 0x73, 0x4c, 0x61, 0x74, 0x65, - 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x73, 0x4c, - 0x61, 0x74, 0x65, 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0f, - 0x69, 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x41, 0x0a, 0x0d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, - 0x64, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, - 0x65, 0x64, 0x12, 0x44, 0x0a, 0x0e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, - 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x48, 0x00, 0x52, 0x0e, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x22, 0x3d, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x22, 0x32, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, 0x6e, 0x75, 0x61, 0x6c, - 0x52, 0x65, 0x61, 0x64, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x0a, 0x1e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x61, - 0x6e, 0x75, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4e, 0x65, 0x65, 0x64, 0x65, - 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x46, 0x6f, 0x72, 0x63, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x1b, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x69, - 0x6c, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4e, 0x65, 0x65, 0x64, 0x65, - 0x64, 0x22, 0x17, 0x0a, 0x15, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x49, 0x73, 0x4c, 0x61, 0x74, - 0x65, 0x73, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x15, 0x0a, 0x13, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, - 0x64, 0x22, 0x16, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x22, 0xeb, 0x01, 0x0a, 0x0e, 0x44, 0x69, - 0x73, 0x6b, 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x72, - 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, - 0x43, 0x0a, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b, - 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x61, 0x74, 0x68, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x74, 0x68, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x64, 0x12, 0x58, 0x0a, 0x12, 0x70, 0x61, 0x74, 0x68, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x50, 0x61, 0x74, 0x68, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x12, 0x70, 0x61, 0x74, 0x68, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x42, 0x07, - 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x43, 0x0a, 0x13, 0x44, 0x69, 0x73, 0x6b, 0x43, - 0x61, 0x63, 0x68, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2c, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x67, - 0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x2f, 0x0a, 0x19, - 0x44, 0x69, 0x73, 0x6b, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x61, 0x74, 0x68, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0x22, 0x0a, - 0x20, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x61, 0x63, 0x68, 0x65, 0x50, 0x61, 0x74, 0x68, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x22, 0xbf, 0x02, 0x0a, 0x17, 0x4d, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3a, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, - 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x64, 0x0a, 0x19, 0x6d, 0x61, 0x69, - 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, - 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x19, 0x6d, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, - 0x79, 0x0a, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x69, 0x6e, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, - 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x4d, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x22, 0x55, 0x0a, 0x1c, 0x4d, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x21, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x54, 0x0a, 0x1e, 0x4d, 0x61, - 0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x08, - 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6d, 0x61, 0x70, 0x53, 0x6d, 0x74, 0x70, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x22, 0x27, 0x0a, 0x25, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x61, 0x69, 0x6c, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x69, 0x6e, 0x69, - 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xff, 0x01, 0x0a, 0x0d, 0x4b, 0x65, - 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5b, 0x0a, 0x16, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x67, 0x72, - 0x70, 0x63, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x16, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x40, 0x0a, 0x0d, 0x68, 0x61, 0x73, 0x4e, - 0x6f, 0x4b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x61, 0x73, 0x4e, 0x6f, 0x4b, 0x65, 0x79, 0x63, - 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x68, 0x61, 0x73, - 0x4e, 0x6f, 0x4b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x46, 0x0a, 0x0f, 0x72, 0x65, - 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x62, 0x75, 0x69, - 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x0f, 0x72, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x1d, 0x0a, 0x1b, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x14, 0x0a, 0x12, 0x48, 0x61, - 0x73, 0x4e, 0x6f, 0x4b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x65, 0x79, 0x63, 0x68, - 0x61, 0x69, 0x6e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xef, 0x01, 0x0a, 0x09, 0x4d, 0x61, 0x69, - 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x43, 0x0a, 0x0e, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x55, 0x0a, 0x14, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4c, 0x6f, 0x67, - 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4c, - 0x6f, 0x67, 0x6f, 0x75, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4c, 0x6f, 0x67, 0x6f, - 0x75, 0x74, 0x12, 0x3d, 0x0a, 0x0c, 0x61, 0x70, 0x69, 0x43, 0x65, 0x72, 0x74, 0x49, 0x73, 0x73, - 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, - 0x41, 0x70, 0x69, 0x43, 0x65, 0x72, 0x74, 0x49, 0x73, 0x73, 0x75, 0x65, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x70, 0x69, 0x43, 0x65, 0x72, 0x74, 0x49, 0x73, 0x73, 0x75, - 0x65, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x2f, 0x0a, 0x13, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x35, 0x0a, 0x19, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x4c, 0x6f, 0x67, - 0x6f, 0x75, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x22, 0x13, 0x0a, 0x11, 0x41, 0x70, 0x69, 0x43, 0x65, 0x72, 0x74, 0x49, 0x73, 0x73, - 0x75, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xb4, 0x05, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x5e, 0x0a, 0x17, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x53, - 0x70, 0x6c, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x6f, - 0x67, 0x67, 0x6c, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x46, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x74, 0x6f, - 0x67, 0x67, 0x6c, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x46, 0x69, 0x6e, - 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x49, 0x0a, 0x10, 0x75, 0x73, 0x65, 0x72, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x44, 0x69, 0x73, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, - 0x75, 0x73, 0x65, 0x72, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x12, 0x3a, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x0b, 0x75, 0x73, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x0c, - 0x75, 0x73, 0x65, 0x72, 0x42, 0x61, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x42, 0x61, - 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x72, 0x42, 0x61, - 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x53, 0x0a, 0x15, 0x75, 0x73, 0x65, 0x64, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x73, 0x65, - 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x15, 0x75, 0x73, 0x65, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x50, 0x0a, 0x14, 0x69, - 0x6d, 0x61, 0x70, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x49, 0x6d, 0x61, 0x70, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x69, 0x6d, 0x61, 0x70, 0x4c, 0x6f, 0x67, - 0x69, 0x6e, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x44, 0x0a, - 0x10, 0x73, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x53, - 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, - 0x00, 0x52, 0x10, 0x73, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x11, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x69, 0x6e, 0x69, 0x73, - 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, - 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x11, 0x73, 0x79, 0x6e, 0x63, 0x46, - 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x11, - 0x73, 0x79, 0x6e, 0x63, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x53, - 0x79, 0x6e, 0x63, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x11, 0x73, 0x79, 0x6e, 0x63, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x36, - 0x0a, 0x1c, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x4d, 0x6f, 0x64, - 0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x33, 0x0a, 0x15, 0x55, 0x73, 0x65, 0x72, 0x44, 0x69, - 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2a, 0x0a, 0x10, 0x55, - 0x73, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, 0x4a, 0x0a, 0x0c, 0x55, 0x73, 0x65, 0x72, 0x42, - 0x61, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, - 0x22, 0x0a, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x22, 0x4d, 0x0a, 0x15, 0x55, 0x73, 0x65, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, - 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x75, 0x73, 0x65, 0x64, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x75, 0x73, 0x65, 0x64, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x22, 0x32, 0x0a, 0x14, 0x49, 0x6d, 0x61, 0x70, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x46, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2a, 0x0a, 0x10, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, - 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x44, 0x22, 0x2b, 0x0a, 0x11, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, - 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x22, - 0x87, 0x01, 0x0a, 0x11, 0x53, 0x79, 0x6e, 0x63, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, 0x12, 0x1a, 0x0a, - 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6c, 0x61, - 0x70, 0x73, 0x65, 0x64, 0x4d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x6c, - 0x61, 0x70, 0x73, 0x65, 0x64, 0x4d, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x72, 0x65, 0x6d, 0x61, 0x69, - 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, 0x65, - 0x6d, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x73, 0x22, 0x75, 0x0a, 0x15, 0x55, 0x73, 0x65, - 0x72, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x75, 0x62, 0x74, - 0x69, 0x74, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, - 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x44, - 0x22, 0x38, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x2a, 0x71, 0x0a, 0x08, 0x4c, 0x6f, - 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x0d, 0x0a, 0x09, 0x4c, 0x4f, 0x47, 0x5f, 0x50, 0x41, - 0x4e, 0x49, 0x43, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4c, 0x4f, 0x47, 0x5f, 0x46, 0x41, 0x54, - 0x41, 0x4c, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x52, 0x52, 0x4f, - 0x52, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x4c, 0x4f, 0x47, 0x5f, 0x57, 0x41, 0x52, 0x4e, 0x10, - 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x4c, 0x4f, 0x47, 0x5f, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x04, 0x12, - 0x0d, 0x0a, 0x09, 0x4c, 0x4f, 0x47, 0x5f, 0x44, 0x45, 0x42, 0x55, 0x47, 0x10, 0x05, 0x12, 0x0d, - 0x0a, 0x09, 0x4c, 0x4f, 0x47, 0x5f, 0x54, 0x52, 0x41, 0x43, 0x45, 0x10, 0x06, 0x2a, 0x36, 0x0a, - 0x09, 0x55, 0x73, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x49, - 0x47, 0x4e, 0x45, 0x44, 0x5f, 0x4f, 0x55, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x4f, - 0x43, 0x4b, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, - 0x54, 0x45, 0x44, 0x10, 0x02, 0x2a, 0xb0, 0x01, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x55, 0x53, 0x45, 0x52, - 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, 0x52, 0x44, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x46, 0x52, 0x45, 0x45, 0x5f, 0x55, 0x53, - 0x45, 0x52, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x46, - 0x41, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x46, 0x41, - 0x5f, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x57, 0x4f, 0x5f, - 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, 0x52, 0x44, 0x53, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, - 0x05, 0x12, 0x17, 0x0a, 0x13, 0x54, 0x57, 0x4f, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x57, 0x4f, 0x52, - 0x44, 0x53, 0x5f, 0x41, 0x42, 0x4f, 0x52, 0x54, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x48, 0x56, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x07, 0x2a, 0x5b, 0x0a, 0x0f, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x55, - 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x4d, 0x41, 0x4e, 0x55, 0x41, 0x4c, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x46, - 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, - 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x49, 0x4c, 0x45, 0x4e, 0x54, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x10, 0x02, 0x2a, 0x34, 0x0a, 0x12, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x43, - 0x41, 0x4e, 0x54, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x5f, 0x44, 0x49, 0x53, 0x4b, 0x5f, 0x43, 0x41, - 0x43, 0x48, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x00, 0x2a, 0xdd, 0x01, 0x0a, 0x1b, - 0x4d, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x49, - 0x4d, 0x41, 0x50, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x55, 0x50, - 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x4d, 0x54, 0x50, - 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x55, 0x50, 0x5f, 0x45, 0x52, - 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x49, 0x4d, 0x41, 0x50, 0x5f, 0x50, 0x4f, - 0x52, 0x54, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, - 0x02, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x4d, 0x54, 0x50, 0x5f, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x43, - 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x03, 0x12, 0x25, 0x0a, - 0x21, 0x49, 0x4d, 0x41, 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x52, 0x52, - 0x4f, 0x52, 0x10, 0x04, 0x12, 0x25, 0x0a, 0x21, 0x53, 0x4d, 0x54, 0x50, 0x5f, 0x43, 0x4f, 0x4e, - 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x43, 0x48, 0x41, - 0x4e, 0x47, 0x45, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x05, 0x2a, 0x53, 0x0a, 0x09, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x54, - 0x4c, 0x53, 0x5f, 0x43, 0x45, 0x52, 0x54, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x54, 0x4c, 0x53, 0x5f, 0x4b, 0x45, - 0x59, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x02, - 0x32, 0xbd, 0x21, 0x0a, 0x06, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x12, 0x49, 0x0a, 0x0b, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 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, 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, 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, 0x79, 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, 0x3a, 0x0a, 0x08, 0x47, 0x75, 0x69, 0x52, 0x65, - 0x61, 0x64, 0x79, 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, 0x72, - 0x70, 0x63, 0x2e, 0x47, 0x75, 0x69, 0x52, 0x65, 0x61, 0x64, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x04, 0x51, 0x75, 0x69, 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, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x07, 0x52, - 0x65, 0x73, 0x74, 0x61, 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, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x43, 0x0a, 0x0d, 0x53, 0x68, 0x6f, 0x77, 0x4f, 0x6e, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 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, 0x46, 0x0a, 0x10, 0x53, - 0x65, 0x74, 0x49, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x74, 0x61, 0x72, 0x74, 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, 0x43, 0x0a, 0x0d, 0x49, 0x73, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x74, 0x61, - 0x72, 0x74, 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, 0x46, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x49, - 0x73, 0x42, 0x65, 0x74, 0x61, 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, 0x43, 0x0a, 0x0d, 0x49, 0x73, 0x42, 0x65, 0x74, 0x61, 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, 0x49, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x49, 0x73, 0x41, 0x6c, - 0x6c, 0x4d, 0x61, 0x69, 0x6c, 0x56, 0x69, 0x73, 0x69, 0x62, 0x6c, 0x65, 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, 0x46, 0x0a, 0x10, 0x49, 0x73, 0x41, 0x6c, 0x6c, 0x4d, 0x61, 0x69, 0x6c, 0x56, 0x69, 0x73, - 0x69, 0x62, 0x6c, 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, 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, 0x4c, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x49, - 0x73, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x44, 0x69, 0x73, 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, 0x49, 0x0a, 0x13, 0x49, 0x73, 0x54, 0x65, 0x6c, 0x65, - 0x6d, 0x65, 0x74, 0x72, 0x79, 0x44, 0x69, 0x73, 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, 0x3c, 0x0a, 0x04, 0x47, 0x6f, 0x4f, 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, 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, - 0x3e, 0x0a, 0x0c, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x73, 0x65, 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, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, - 0x3f, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 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, 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, 0x40, 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x73, 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, 0x43, 0x0a, 0x0b, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 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, 0x4c, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x65, 0x61, - 0x73, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x50, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 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, 0x4e, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, - 0x6e, 0x63, 0x79, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x73, 0x4c, 0x69, 0x6e, 0x6b, 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, 0x47, 0x0a, 0x0f, 0x4c, 0x61, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x50, 0x61, 0x67, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 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, 0x4a, - 0x0a, 0x12, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 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, 0x47, 0x0a, 0x0f, 0x43, 0x6f, - 0x6c, 0x6f, 0x72, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x4e, 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, 0x4a, 0x0a, 0x12, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x6d, - 0x61, 0x69, 0x6c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 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, 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, - 0x3b, 0x0a, 0x09, 0x52, 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, 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, 0x0d, - 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4c, 0x61, 0x75, 0x6e, 0x63, 0x68, 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, 0x49, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6e, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 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, 0x57, - 0x0a, 0x1f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, - 0x67, 0x65, 0x42, 0x61, 0x73, 0x65, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 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, 0x33, 0x0a, 0x05, 0x4c, 0x6f, 0x67, 0x69, 0x6e, - 0x12, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 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, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x36, 0x0a, 0x08, - 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x32, 0x46, 0x41, 0x12, 0x12, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, - 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, - 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, 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, 0x72, - 0x74, 0x12, 0x17, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x41, 0x62, - 0x6f, 0x72, 0x74, 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, 0x3d, 0x0a, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, 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, 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, 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, 0x48, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x50, 0x61, 0x74, 0x68, 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, 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, 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, 0x44, 0x0a, 0x12, 0x4d, 0x61, 0x69, 0x6c, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 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, 0x16, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6d, 0x61, - 0x70, 0x53, 0x6d, 0x74, 0x70, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x47, 0x0a, - 0x15, 0x53, 0x65, 0x74, 0x4d, 0x61, 0x69, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6d, - 0x61, 0x70, 0x53, 0x6d, 0x74, 0x70, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 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, 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, 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, 0x79, 0x12, 0x47, 0x0a, 0x0f, 0x43, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4b, 0x65, 0x79, 0x63, 0x68, 0x61, 0x69, 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, 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, 0x3d, 0x0a, 0x0b, 0x47, 0x65, 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, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x72, - 0x70, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x47, 0x65, 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, 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, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x12, 0x55, 0x0a, 0x18, 0x53, 0x65, 0x6e, 0x64, 0x42, 0x61, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x21, 0x2e, 0x67, - 0x72, 0x70, 0x63, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x42, 0x61, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x46, 0x65, 0x65, 0x64, 0x62, 0x61, 0x63, 0x6b, 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, 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, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, - 0x51, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x55, 0x73, 0x65, 0x72, - 0x41, 0x70, 0x70, 0x6c, 0x65, 0x4d, 0x61, 0x69, 0x6c, 0x12, 0x1f, 0x2e, 0x67, 0x72, 0x70, 0x63, - 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x4d, - 0x61, 0x69, 0x6c, 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, 0x4f, 0x0a, 0x19, 0x49, 0x73, 0x54, 0x4c, 0x53, 0x43, 0x65, 0x72, 0x74, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 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, 0x47, 0x0a, 0x15, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x54, 0x4c, - 0x53, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 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, 0x4d, 0x0a, 0x15, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x4c, 0x53, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x65, 0x73, 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, 0x3f, 0x0a, 0x0e, 0x52, - 0x75, 0x6e, 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, 0x12, - 0x3f, 0x0a, 0x0d, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x52, 0x65, 0x70, 0x61, 0x69, 0x72, - 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, 0x33, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x2f, 0x67, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_bridge_proto_rawDesc = "" + + "\n" + + "\fbridge.proto\x12\x04grpc\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1egoogle/protobuf/wrappers.proto\"n\n" + + "\x12AddLogEntryRequest\x12$\n" + + "\x05level\x18\x01 \x01(\x0e2\x0e.grpc.LogLevelR\x05level\x12\x18\n" + + "\apackage\x18\x02 \x01(\tR\apackage\x12\x18\n" + + "\amessage\x18\x03 \x01(\tR\amessage\">\n" + + "\x10GuiReadyResponse\x12*\n" + + "\x10showSplashScreen\x18\x01 \x01(\bR\x10showSplashScreen\"\xde\x01\n" + + "\x10ReportBugRequest\x12\x16\n" + + "\x06osType\x18\x01 \x01(\tR\x06osType\x12\x1c\n" + + "\tosVersion\x18\x02 \x01(\tR\tosVersion\x12\x14\n" + + "\x05title\x18\x03 \x01(\tR\x05title\x12 \n" + + "\vdescription\x18\x04 \x01(\tR\vdescription\x12\x18\n" + + "\aaddress\x18\x05 \x01(\tR\aaddress\x12 \n" + + "\vemailClient\x18\x06 \x01(\tR\vemailClient\x12 \n" + + "\vincludeLogs\x18\a \x01(\bR\vincludeLogs\"\x80\x01\n" + + "\fLoginRequest\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\x12\x1a\n" + + "\bpassword\x18\x02 \x01(\fR\bpassword\x12'\n" + + "\fuseHvDetails\x18\x03 \x01(\bH\x00R\fuseHvDetails\x88\x01\x01B\x0f\n" + + "\r_useHvDetails\"/\n" + + "\x11LoginAbortRequest\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\"\x96\x01\n" + + "\x10ImapSmtpSettings\x12\x1a\n" + + "\bimapPort\x18\x01 \x01(\x05R\bimapPort\x12\x1a\n" + + "\bsmtpPort\x18\x02 \x01(\x05R\bsmtpPort\x12$\n" + + "\ruseSSLForImap\x18\x03 \x01(\bR\ruseSSLForImap\x12$\n" + + "\ruseSSLForSmtp\x18\x04 \x01(\bR\ruseSSLForSmtp\":\n" + + "\x1aAvailableKeychainsResponse\x12\x1c\n" + + "\tkeychains\x18\x01 \x03(\tR\tkeychains\"\x8f\x02\n" + + "\x04User\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1a\n" + + "\busername\x18\x02 \x01(\tR\busername\x12\x1e\n" + + "\n" + + "avatarText\x18\x03 \x01(\tR\n" + + "avatarText\x12%\n" + + "\x05state\x18\x04 \x01(\x0e2\x0f.grpc.UserStateR\x05state\x12\x1c\n" + + "\tsplitMode\x18\x05 \x01(\bR\tsplitMode\x12\x1c\n" + + "\tusedBytes\x18\x06 \x01(\x03R\tusedBytes\x12\x1e\n" + + "\n" + + "totalBytes\x18\a \x01(\x03R\n" + + "totalBytes\x12\x1a\n" + + "\bpassword\x18\b \x01(\fR\bpassword\x12\x1c\n" + + "\taddresses\x18\t \x03(\tR\taddresses\"F\n" + + "\x14UserSplitModeRequest\x12\x16\n" + + "\x06userID\x18\x01 \x01(\tR\x06userID\x12\x16\n" + + "\x06active\x18\x02 \x01(\bR\x06active\"Q\n" + + "\x1bUserBadEventFeedbackRequest\x12\x16\n" + + "\x06userID\x18\x01 \x01(\tR\x06userID\x12\x1a\n" + + "\bdoResync\x18\x02 \x01(\bR\bdoResync\"4\n" + + "\x10UserListResponse\x12 \n" + + "\x05users\x18\x01 \x03(\v2\n" + + ".grpc.UserR\x05users\"M\n" + + "\x19ConfigureAppleMailRequest\x12\x16\n" + + "\x06userID\x18\x01 \x01(\tR\x06userID\x12\x18\n" + + "\aaddress\x18\x02 \x01(\tR\aaddress\"<\n" + + "\x12EventStreamRequest\x12&\n" + + "\x0eClientPlatform\x18\x01 \x01(\tR\x0eClientPlatform\"\xd0\x03\n" + + "\vStreamEvent\x12\"\n" + + "\x03app\x18\x01 \x01(\v2\x0e.grpc.AppEventH\x00R\x03app\x12(\n" + + "\x05login\x18\x02 \x01(\v2\x10.grpc.LoginEventH\x00R\x05login\x12+\n" + + "\x06update\x18\x03 \x01(\v2\x11.grpc.UpdateEventH\x00R\x06update\x12,\n" + + "\x05cache\x18\x04 \x01(\v2\x14.grpc.DiskCacheEventH\x00R\x05cache\x12O\n" + + "\x12mailServerSettings\x18\x05 \x01(\v2\x1d.grpc.MailServerSettingsEventH\x00R\x12mailServerSettings\x121\n" + + "\bkeychain\x18\x06 \x01(\v2\x13.grpc.KeychainEventH\x00R\bkeychain\x12%\n" + + "\x04mail\x18\a \x01(\v2\x0f.grpc.MailEventH\x00R\x04mail\x12%\n" + + "\x04user\x18\b \x01(\v2\x0f.grpc.UserEventH\x00R\x04user\x12=\n" + + "\fgenericError\x18\t \x01(\v2\x17.grpc.GenericErrorEventH\x00R\fgenericErrorB\a\n" + + "\x05event\"\xd2\t\n" + + "\bAppEvent\x12C\n" + + "\x0einternetStatus\x18\x01 \x01(\v2\x19.grpc.InternetStatusEventH\x00R\x0einternetStatus\x12^\n" + + "\x17toggleAutostartFinished\x18\x02 \x01(\v2\".grpc.ToggleAutostartFinishedEventH\x00R\x17toggleAutostartFinished\x12@\n" + + "\rresetFinished\x18\x03 \x01(\v2\x18.grpc.ResetFinishedEventH\x00R\rresetFinished\x12L\n" + + "\x11reportBugFinished\x18\x04 \x01(\v2\x1c.grpc.ReportBugFinishedEventH\x00R\x11reportBugFinished\x12I\n" + + "\x10reportBugSuccess\x18\x05 \x01(\v2\x1b.grpc.ReportBugSuccessEventH\x00R\x10reportBugSuccess\x12C\n" + + "\x0ereportBugError\x18\x06 \x01(\v2\x19.grpc.ReportBugErrorEventH\x00R\x0ereportBugError\x12C\n" + + "\x0eshowMainWindow\x18\a \x01(\v2\x19.grpc.ShowMainWindowEventH\x00R\x0eshowMainWindow\x12L\n" + + "\x11reportBugFallback\x18\b \x01(\v2\x1c.grpc.ReportBugFallbackEventH\x00R\x11reportBugFallback\x12d\n" + + "\x19certificateInstallSuccess\x18\t \x01(\v2$.grpc.CertificateInstallSuccessEventH\x00R\x19certificateInstallSuccess\x12g\n" + + "\x1acertificateInstallCanceled\x18\n" + + " \x01(\v2%.grpc.CertificateInstallCanceledEventH\x00R\x1acertificateInstallCanceled\x12a\n" + + "\x18certificateInstallFailed\x18\v \x01(\v2#.grpc.CertificateInstallFailedEventH\x00R\x18certificateInstallFailed\x12a\n" + + "\x18knowledgeBaseSuggestions\x18\f \x01(\v2#.grpc.KnowledgeBaseSuggestionsEventH\x00R\x18knowledgeBaseSuggestions\x12@\n" + + "\rrepairStarted\x18\r \x01(\v2\x18.grpc.RepairStartedEventH\x00R\rrepairStarted\x12C\n" + + "\x0eallUsersLoaded\x18\x0e \x01(\v2\x19.grpc.AllUsersLoadedEventH\x00R\x0eallUsersLoaded\x12I\n" + + "\x10userNotification\x18\x0f \x01(\v2\x1b.grpc.UserNotificationEventH\x00R\x10userNotificationB\a\n" + + "\x05event\"3\n" + + "\x13InternetStatusEvent\x12\x1c\n" + + "\tconnected\x18\x01 \x01(\bR\tconnected\"\x1e\n" + + "\x1cToggleAutostartFinishedEvent\"\x14\n" + + "\x12ResetFinishedEvent\"\x18\n" + + "\x16ReportBugFinishedEvent\"\x17\n" + + "\x15ReportBugSuccessEvent\"\x15\n" + + "\x13ReportBugErrorEvent\"\x15\n" + + "\x13ShowMainWindowEvent\"\x18\n" + + "\x16ReportBugFallbackEvent\" \n" + + "\x1eCertificateInstallSuccessEvent\"!\n" + + "\x1fCertificateInstallCanceledEvent\"\x1f\n" + + "\x1dCertificateInstallFailedEvent\"\x14\n" + + "\x12RepairStartedEvent\"\x15\n" + + "\x13AllUsersLoadedEvent\"A\n" + + "\x17KnowledgeBaseSuggestion\x12\x10\n" + + "\x03url\x18\x01 \x01(\tR\x03url\x12\x14\n" + + "\x05title\x18\x02 \x01(\tR\x05title\"`\n" + + "\x1dKnowledgeBaseSuggestionsEvent\x12?\n" + + "\vsuggestions\x18\x01 \x03(\v2\x1d.grpc.KnowledgeBaseSuggestionR\vsuggestions\"\xc1\x06\n" + + "\n" + + "LoginEvent\x12-\n" + + "\x05error\x18\x01 \x01(\v2\x15.grpc.LoginErrorEventH\x00R\x05error\x12B\n" + + "\ftfaRequested\x18\x02 \x01(\v2\x1c.grpc.LoginTfaRequestedEventH\x00R\ftfaRequested\x12[\n" + + "\x14twoPasswordRequested\x18\x03 \x01(\v2%.grpc.LoginTwoPasswordsRequestedEventH\x00R\x14twoPasswordRequested\x126\n" + + "\bfinished\x18\x04 \x01(\v2\x18.grpc.LoginFinishedEventH\x00R\bfinished\x12D\n" + + "\x0falreadyLoggedIn\x18\x05 \x01(\v2\x18.grpc.LoginFinishedEventH\x00R\x0falreadyLoggedIn\x12?\n" + + "\vhvRequested\x18\x06 \x01(\v2\x1b.grpc.LoginHvRequestedEventH\x00R\vhvRequested\x12E\n" + + "\rfidoRequested\x18\a \x01(\v2\x1d.grpc.LoginFidoRequestedEventH\x00R\rfidoRequested\x12T\n" + + "\x12tfaOrFidoRequested\x18\b \x01(\v2\".grpc.LoginTfaOrFidoRequestedEventH\x00R\x12tfaOrFidoRequested\x12U\n" + + "\x17loginFidoTouchRequested\x18\t \x01(\v2\x19.grpc.LoginFidoTouchEventH\x00R\x17loginFidoTouchRequested\x12U\n" + + "\x17loginFidoTouchCompleted\x18\n" + + " \x01(\v2\x19.grpc.LoginFidoTouchEventH\x00R\x17loginFidoTouchCompleted\x12P\n" + + "\x14loginFidoPinRequired\x18\v \x01(\v2\x1a.grpc.LoginFidoPinRequiredH\x00R\x14loginFidoPinRequiredB\a\n" + + "\x05event\"U\n" + + "\x0fLoginErrorEvent\x12(\n" + + "\x04type\x18\x01 \x01(\x0e2\x14.grpc.LoginErrorTypeR\x04type\x12\x18\n" + + "\amessage\x18\x02 \x01(\tR\amessage\"4\n" + + "\x16LoginTfaRequestedEvent\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\"5\n" + + "\x17LoginFidoRequestedEvent\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\":\n" + + "\x1cLoginTfaOrFidoRequestedEvent\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\"1\n" + + "\x13LoginFidoTouchEvent\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\"2\n" + + "\x14LoginFidoPinRequired\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\"=\n" + + "\x1fLoginTwoPasswordsRequestedEvent\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\"P\n" + + "\x12LoginFinishedEvent\x12\x16\n" + + "\x06userID\x18\x01 \x01(\tR\x06userID\x12\"\n" + + "\fwasSignedOut\x18\x02 \x01(\bR\fwasSignedOut\"-\n" + + "\x15LoginHvRequestedEvent\x12\x14\n" + + "\x05hvUrl\x18\x01 \x01(\tR\x05hvUrl\"\xb9\x04\n" + + "\vUpdateEvent\x12.\n" + + "\x05error\x18\x01 \x01(\v2\x16.grpc.UpdateErrorEventH\x00R\x05error\x12@\n" + + "\vmanualReady\x18\x02 \x01(\v2\x1c.grpc.UpdateManualReadyEventH\x00R\vmanualReady\x12X\n" + + "\x13manualRestartNeeded\x18\x03 \x01(\v2$.grpc.UpdateManualRestartNeededEventH\x00R\x13manualRestartNeeded\x12.\n" + + "\x05force\x18\x04 \x01(\v2\x16.grpc.UpdateForceEventH\x00R\x05force\x12S\n" + + "\x13silentRestartNeeded\x18\x05 \x01(\v2\x1f.grpc.UpdateSilentRestartNeededH\x00R\x13silentRestartNeeded\x12G\n" + + "\x0fisLatestVersion\x18\x06 \x01(\v2\x1b.grpc.UpdateIsLatestVersionH\x00R\x0fisLatestVersion\x12A\n" + + "\rcheckFinished\x18\a \x01(\v2\x19.grpc.UpdateCheckFinishedH\x00R\rcheckFinished\x12D\n" + + "\x0eversionChanged\x18\b \x01(\v2\x1a.grpc.UpdateVersionChangedH\x00R\x0eversionChangedB\a\n" + + "\x05event\"=\n" + + "\x10UpdateErrorEvent\x12)\n" + + "\x04type\x18\x01 \x01(\x0e2\x15.grpc.UpdateErrorTypeR\x04type\"2\n" + + "\x16UpdateManualReadyEvent\x12\x18\n" + + "\aversion\x18\x01 \x01(\tR\aversion\" \n" + + "\x1eUpdateManualRestartNeededEvent\",\n" + + "\x10UpdateForceEvent\x12\x18\n" + + "\aversion\x18\x01 \x01(\tR\aversion\"\x1b\n" + + "\x19UpdateSilentRestartNeeded\"\x17\n" + + "\x15UpdateIsLatestVersion\"\x15\n" + + "\x13UpdateCheckFinished\"\x16\n" + + "\x14UpdateVersionChanged\"\xeb\x01\n" + + "\x0eDiskCacheEvent\x121\n" + + "\x05error\x18\x01 \x01(\v2\x19.grpc.DiskCacheErrorEventH\x00R\x05error\x12C\n" + + "\vpathChanged\x18\x02 \x01(\v2\x1f.grpc.DiskCachePathChangedEventH\x00R\vpathChanged\x12X\n" + + "\x12pathChangeFinished\x18\x03 \x01(\v2&.grpc.DiskCachePathChangeFinishedEventH\x00R\x12pathChangeFinishedB\a\n" + + "\x05event\"C\n" + + "\x13DiskCacheErrorEvent\x12,\n" + + "\x04type\x18\x01 \x01(\x0e2\x18.grpc.DiskCacheErrorTypeR\x04type\"/\n" + + "\x19DiskCachePathChangedEvent\x12\x12\n" + + "\x04path\x18\x01 \x01(\tR\x04path\"\"\n" + + " DiskCachePathChangeFinishedEvent\"\xbf\x02\n" + + "\x17MailServerSettingsEvent\x12:\n" + + "\x05error\x18\x01 \x01(\v2\".grpc.MailServerSettingsErrorEventH\x00R\x05error\x12d\n" + + "\x19mailServerSettingsChanged\x18\x02 \x01(\v2$.grpc.MailServerSettingsChangedEventH\x00R\x19mailServerSettingsChanged\x12y\n" + + " changeMailServerSettingsFinished\x18\x03 \x01(\v2+.grpc.ChangeMailServerSettingsFinishedEventH\x00R changeMailServerSettingsFinishedB\a\n" + + "\x05event\"U\n" + + "\x1cMailServerSettingsErrorEvent\x125\n" + + "\x04type\x18\x01 \x01(\x0e2!.grpc.MailServerSettingsErrorTypeR\x04type\"T\n" + + "\x1eMailServerSettingsChangedEvent\x122\n" + + "\bsettings\x18\x01 \x01(\v2\x16.grpc.ImapSmtpSettingsR\bsettings\"'\n" + + "%ChangeMailServerSettingsFinishedEvent\"\xff\x01\n" + + "\rKeychainEvent\x12[\n" + + "\x16changeKeychainFinished\x18\x01 \x01(\v2!.grpc.ChangeKeychainFinishedEventH\x00R\x16changeKeychainFinished\x12@\n" + + "\rhasNoKeychain\x18\x02 \x01(\v2\x18.grpc.HasNoKeychainEventH\x00R\rhasNoKeychain\x12F\n" + + "\x0frebuildKeychain\x18\x03 \x01(\v2\x1a.grpc.RebuildKeychainEventH\x00R\x0frebuildKeychainB\a\n" + + "\x05event\"\x1d\n" + + "\x1bChangeKeychainFinishedEvent\"\x14\n" + + "\x12HasNoKeychainEvent\"\x16\n" + + "\x14RebuildKeychainEvent\"\xef\x01\n" + + "\tMailEvent\x12C\n" + + "\x0eaddressChanged\x18\x01 \x01(\v2\x19.grpc.AddressChangedEventH\x00R\x0eaddressChanged\x12U\n" + + "\x14addressChangedLogout\x18\x02 \x01(\v2\x1f.grpc.AddressChangedLogoutEventH\x00R\x14addressChangedLogout\x12=\n" + + "\fapiCertIssue\x18\x03 \x01(\v2\x17.grpc.ApiCertIssueEventH\x00R\fapiCertIssueB\a\n" + + "\x05event\"/\n" + + "\x13AddressChangedEvent\x12\x18\n" + + "\aaddress\x18\x01 \x01(\tR\aaddress\"5\n" + + "\x19AddressChangedLogoutEvent\x12\x18\n" + + "\aaddress\x18\x01 \x01(\tR\aaddress\"\x13\n" + + "\x11ApiCertIssueEvent\"\xb4\x05\n" + + "\tUserEvent\x12^\n" + + "\x17toggleSplitModeFinished\x18\x01 \x01(\v2\".grpc.ToggleSplitModeFinishedEventH\x00R\x17toggleSplitModeFinished\x12I\n" + + "\x10userDisconnected\x18\x02 \x01(\v2\x1b.grpc.UserDisconnectedEventH\x00R\x10userDisconnected\x12:\n" + + "\vuserChanged\x18\x03 \x01(\v2\x16.grpc.UserChangedEventH\x00R\vuserChanged\x128\n" + + "\fuserBadEvent\x18\x04 \x01(\v2\x12.grpc.UserBadEventH\x00R\fuserBadEvent\x12S\n" + + "\x15usedBytesChangedEvent\x18\x05 \x01(\v2\x1b.grpc.UsedBytesChangedEventH\x00R\x15usedBytesChangedEvent\x12P\n" + + "\x14imapLoginFailedEvent\x18\x06 \x01(\v2\x1a.grpc.ImapLoginFailedEventH\x00R\x14imapLoginFailedEvent\x12D\n" + + "\x10syncStartedEvent\x18\a \x01(\v2\x16.grpc.SyncStartedEventH\x00R\x10syncStartedEvent\x12G\n" + + "\x11syncFinishedEvent\x18\b \x01(\v2\x17.grpc.SyncFinishedEventH\x00R\x11syncFinishedEvent\x12G\n" + + "\x11syncProgressEvent\x18\t \x01(\v2\x17.grpc.SyncProgressEventH\x00R\x11syncProgressEventB\a\n" + + "\x05event\"6\n" + + "\x1cToggleSplitModeFinishedEvent\x12\x16\n" + + "\x06userID\x18\x01 \x01(\tR\x06userID\"3\n" + + "\x15UserDisconnectedEvent\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\"*\n" + + "\x10UserChangedEvent\x12\x16\n" + + "\x06userID\x18\x01 \x01(\tR\x06userID\"J\n" + + "\fUserBadEvent\x12\x16\n" + + "\x06userID\x18\x01 \x01(\tR\x06userID\x12\"\n" + + "\ferrorMessage\x18\x02 \x01(\tR\ferrorMessage\"M\n" + + "\x15UsedBytesChangedEvent\x12\x16\n" + + "\x06userID\x18\x01 \x01(\tR\x06userID\x12\x1c\n" + + "\tusedBytes\x18\x02 \x01(\x03R\tusedBytes\"2\n" + + "\x14ImapLoginFailedEvent\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\"*\n" + + "\x10SyncStartedEvent\x12\x16\n" + + "\x06userID\x18\x01 \x01(\tR\x06userID\"+\n" + + "\x11SyncFinishedEvent\x12\x16\n" + + "\x06userID\x18\x01 \x01(\tR\x06userID\"\x87\x01\n" + + "\x11SyncProgressEvent\x12\x16\n" + + "\x06userID\x18\x01 \x01(\tR\x06userID\x12\x1a\n" + + "\bprogress\x18\x02 \x01(\x01R\bprogress\x12\x1c\n" + + "\telapsedMs\x18\x03 \x01(\x03R\telapsedMs\x12 \n" + + "\vremainingMs\x18\x04 \x01(\x03R\vremainingMs\"u\n" + + "\x15UserNotificationEvent\x12\x14\n" + + "\x05title\x18\x01 \x01(\tR\x05title\x12\x1a\n" + + "\bsubtitle\x18\x02 \x01(\tR\bsubtitle\x12\x12\n" + + "\x04body\x18\x03 \x01(\tR\x04body\x12\x16\n" + + "\x06userID\x18\x04 \x01(\tR\x06userID\"8\n" + + "\x11GenericErrorEvent\x12#\n" + + "\x04code\x18\x01 \x01(\x0e2\x0f.grpc.ErrorCodeR\x04code*q\n" + + "\bLogLevel\x12\r\n" + + "\tLOG_PANIC\x10\x00\x12\r\n" + + "\tLOG_FATAL\x10\x01\x12\r\n" + + "\tLOG_ERROR\x10\x02\x12\f\n" + + "\bLOG_WARN\x10\x03\x12\f\n" + + "\bLOG_INFO\x10\x04\x12\r\n" + + "\tLOG_DEBUG\x10\x05\x12\r\n" + + "\tLOG_TRACE\x10\x06*6\n" + + "\tUserState\x12\x0e\n" + + "\n" + + "SIGNED_OUT\x10\x00\x12\n" + + "\n" + + "\x06LOCKED\x10\x01\x12\r\n" + + "\tCONNECTED\x10\x02*\xec\x01\n" + + "\x0eLoginErrorType\x12\x1b\n" + + "\x17USERNAME_PASSWORD_ERROR\x10\x00\x12\r\n" + + "\tFREE_USER\x10\x01\x12\x14\n" + + "\x10CONNECTION_ERROR\x10\x02\x12\r\n" + + "\tTFA_ERROR\x10\x03\x12\r\n" + + "\tTFA_ABORT\x10\x04\x12\x17\n" + + "\x13TWO_PASSWORDS_ERROR\x10\x05\x12\x17\n" + + "\x13TWO_PASSWORDS_ABORT\x10\x06\x12\f\n" + + "\bHV_ERROR\x10\a\x12\x14\n" + + "\x10FIDO_PIN_INVALID\x10\b\x12\x14\n" + + "\x10FIDO_PIN_BLOCKED\x10\t\x12\x0e\n" + + "\n" + + "FIDO_ERROR\x10\n" + + "*[\n" + + "\x0fUpdateErrorType\x12\x17\n" + + "\x13UPDATE_MANUAL_ERROR\x10\x00\x12\x16\n" + + "\x12UPDATE_FORCE_ERROR\x10\x01\x12\x17\n" + + "\x13UPDATE_SILENT_ERROR\x10\x02*4\n" + + "\x12DiskCacheErrorType\x12\x1e\n" + + "\x1aCANT_MOVE_DISK_CACHE_ERROR\x10\x00*\xdd\x01\n" + + "\x1bMailServerSettingsErrorType\x12\x1b\n" + + "\x17IMAP_PORT_STARTUP_ERROR\x10\x00\x12\x1b\n" + + "\x17SMTP_PORT_STARTUP_ERROR\x10\x01\x12\x1a\n" + + "\x16IMAP_PORT_CHANGE_ERROR\x10\x02\x12\x1a\n" + + "\x16SMTP_PORT_CHANGE_ERROR\x10\x03\x12%\n" + + "!IMAP_CONNECTION_MODE_CHANGE_ERROR\x10\x04\x12%\n" + + "!SMTP_CONNECTION_MODE_CHANGE_ERROR\x10\x05*S\n" + + "\tErrorCode\x12\x11\n" + + "\rUNKNOWN_ERROR\x10\x00\x12\x19\n" + + "\x15TLS_CERT_EXPORT_ERROR\x10\x01\x12\x18\n" + + "\x14TLS_KEY_EXPORT_ERROR\x10\x022\xbd\"\n" + + "\x06Bridge\x12I\n" + + "\vCheckTokens\x12\x1c.google.protobuf.StringValue\x1a\x1c.google.protobuf.StringValue\x12?\n" + + "\vAddLogEntry\x12\x18.grpc.AddLogEntryRequest\x1a\x16.google.protobuf.Empty\x12:\n" + + "\bGuiReady\x12\x16.google.protobuf.Empty\x1a\x16.grpc.GuiReadyResponse\x126\n" + + "\x04Quit\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\x129\n" + + "\aRestart\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\x12C\n" + + "\rShowOnStartup\x12\x16.google.protobuf.Empty\x1a\x1a.google.protobuf.BoolValue\x12F\n" + + "\x10SetIsAutostartOn\x12\x1a.google.protobuf.BoolValue\x1a\x16.google.protobuf.Empty\x12C\n" + + "\rIsAutostartOn\x12\x16.google.protobuf.Empty\x1a\x1a.google.protobuf.BoolValue\x12F\n" + + "\x10SetIsBetaEnabled\x12\x1a.google.protobuf.BoolValue\x1a\x16.google.protobuf.Empty\x12C\n" + + "\rIsBetaEnabled\x12\x16.google.protobuf.Empty\x1a\x1a.google.protobuf.BoolValue\x12I\n" + + "\x13SetIsAllMailVisible\x12\x1a.google.protobuf.BoolValue\x1a\x16.google.protobuf.Empty\x12F\n" + + "\x10IsAllMailVisible\x12\x16.google.protobuf.Empty\x1a\x1a.google.protobuf.BoolValue\x12L\n" + + "\x16SetIsTelemetryDisabled\x12\x1a.google.protobuf.BoolValue\x1a\x16.google.protobuf.Empty\x12I\n" + + "\x13IsTelemetryDisabled\x12\x16.google.protobuf.Empty\x1a\x1a.google.protobuf.BoolValue\x12<\n" + + "\x04GoOs\x12\x16.google.protobuf.Empty\x1a\x1c.google.protobuf.StringValue\x12>\n" + + "\fTriggerReset\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\x12?\n" + + "\aVersion\x12\x16.google.protobuf.Empty\x1a\x1c.google.protobuf.StringValue\x12@\n" + + "\bLogsPath\x12\x16.google.protobuf.Empty\x1a\x1c.google.protobuf.StringValue\x12C\n" + + "\vLicensePath\x12\x16.google.protobuf.Empty\x1a\x1c.google.protobuf.StringValue\x12L\n" + + "\x14ReleaseNotesPageLink\x12\x16.google.protobuf.Empty\x1a\x1c.google.protobuf.StringValue\x12N\n" + + "\x16DependencyLicensesLink\x12\x16.google.protobuf.Empty\x1a\x1c.google.protobuf.StringValue\x12G\n" + + "\x0fLandingPageLink\x12\x16.google.protobuf.Empty\x1a\x1c.google.protobuf.StringValue\x12J\n" + + "\x12SetColorSchemeName\x12\x1c.google.protobuf.StringValue\x1a\x16.google.protobuf.Empty\x12G\n" + + "\x0fColorSchemeName\x12\x16.google.protobuf.Empty\x1a\x1c.google.protobuf.StringValue\x12J\n" + + "\x12CurrentEmailClient\x12\x16.google.protobuf.Empty\x1a\x1c.google.protobuf.StringValue\x12;\n" + + "\tReportBug\x12\x16.grpc.ReportBugRequest\x1a\x16.google.protobuf.Empty\x12E\n" + + "\rForceLauncher\x12\x1c.google.protobuf.StringValue\x1a\x16.google.protobuf.Empty\x12I\n" + + "\x11SetMainExecutable\x12\x1c.google.protobuf.StringValue\x1a\x16.google.protobuf.Empty\x12W\n" + + "\x1fRequestKnowledgeBaseSuggestions\x12\x1c.google.protobuf.StringValue\x1a\x16.google.protobuf.Empty\x123\n" + + "\x05Login\x12\x12.grpc.LoginRequest\x1a\x16.google.protobuf.Empty\x126\n" + + "\bLogin2FA\x12\x12.grpc.LoginRequest\x1a\x16.google.protobuf.Empty\x127\n" + + "\tLoginFido\x12\x12.grpc.LoginRequest\x1a\x16.google.protobuf.Empty\x12=\n" + + "\x0fLogin2Passwords\x12\x12.grpc.LoginRequest\x1a\x16.google.protobuf.Empty\x12=\n" + + "\n" + + "LoginAbort\x12\x17.grpc.LoginAbortRequest\x1a\x16.google.protobuf.Empty\x12E\n" + + "\x12FidoAssertionAbort\x12\x17.grpc.LoginAbortRequest\x1a\x16.google.protobuf.Empty\x12=\n" + + "\vCheckUpdate\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\x12?\n" + + "\rInstallUpdate\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\x12L\n" + + "\x16SetIsAutomaticUpdateOn\x12\x1a.google.protobuf.BoolValue\x1a\x16.google.protobuf.Empty\x12I\n" + + "\x13IsAutomaticUpdateOn\x12\x16.google.protobuf.Empty\x1a\x1a.google.protobuf.BoolValue\x12E\n" + + "\rDiskCachePath\x12\x16.google.protobuf.Empty\x1a\x1c.google.protobuf.StringValue\x12H\n" + + "\x10SetDiskCachePath\x12\x1c.google.protobuf.StringValue\x1a\x16.google.protobuf.Empty\x12E\n" + + "\x0fSetIsDoHEnabled\x12\x1a.google.protobuf.BoolValue\x1a\x16.google.protobuf.Empty\x12B\n" + + "\fIsDoHEnabled\x12\x16.google.protobuf.Empty\x1a\x1a.google.protobuf.BoolValue\x12D\n" + + "\x12MailServerSettings\x12\x16.google.protobuf.Empty\x1a\x16.grpc.ImapSmtpSettings\x12G\n" + + "\x15SetMailServerSettings\x12\x16.grpc.ImapSmtpSettings\x1a\x16.google.protobuf.Empty\x12@\n" + + "\bHostname\x12\x16.google.protobuf.Empty\x1a\x1c.google.protobuf.StringValue\x12E\n" + + "\n" + + "IsPortFree\x12\x1b.google.protobuf.Int32Value\x1a\x1a.google.protobuf.BoolValue\x12N\n" + + "\x12AvailableKeychains\x12\x16.google.protobuf.Empty\x1a .grpc.AvailableKeychainsResponse\x12J\n" + + "\x12SetCurrentKeychain\x12\x1c.google.protobuf.StringValue\x1a\x16.google.protobuf.Empty\x12G\n" + + "\x0fCurrentKeychain\x12\x16.google.protobuf.Empty\x1a\x1c.google.protobuf.StringValue\x12=\n" + + "\vGetUserList\x12\x16.google.protobuf.Empty\x1a\x16.grpc.UserListResponse\x123\n" + + "\aGetUser\x12\x1c.google.protobuf.StringValue\x1a\n" + + ".grpc.User\x12F\n" + + "\x10SetUserSplitMode\x12\x1a.grpc.UserSplitModeRequest\x1a\x16.google.protobuf.Empty\x12U\n" + + "\x18SendBadEventUserFeedback\x12!.grpc.UserBadEventFeedbackRequest\x1a\x16.google.protobuf.Empty\x12B\n" + + "\n" + + "LogoutUser\x12\x1c.google.protobuf.StringValue\x1a\x16.google.protobuf.Empty\x12B\n" + + "\n" + + "RemoveUser\x12\x1c.google.protobuf.StringValue\x1a\x16.google.protobuf.Empty\x12Q\n" + + "\x16ConfigureUserAppleMail\x12\x1f.grpc.ConfigureAppleMailRequest\x1a\x16.google.protobuf.Empty\x12O\n" + + "\x19IsTLSCertificateInstalled\x12\x16.google.protobuf.Empty\x1a\x1a.google.protobuf.BoolValue\x12G\n" + + "\x15InstallTLSCertificate\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\x12M\n" + + "\x15ExportTLSCertificates\x12\x1c.google.protobuf.StringValue\x1a\x16.google.protobuf.Empty\x12?\n" + + "\x0eRunEventStream\x12\x18.grpc.EventStreamRequest\x1a\x11.grpc.StreamEvent0\x01\x12A\n" + + "\x0fStopEventStream\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\x12?\n" + + "\rTriggerRepair\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.EmptyB6Z4github.com/ProtonMail/proton-bridge/v3/internal/grpcb\x06proto3" var ( file_bridge_proto_rawDescOnce sync.Once - file_bridge_proto_rawDescData = file_bridge_proto_rawDesc + file_bridge_proto_rawDescData []byte ) func file_bridge_proto_rawDescGZIP() []byte { file_bridge_proto_rawDescOnce.Do(func() { - file_bridge_proto_rawDescData = protoimpl.X.CompressGZIP(file_bridge_proto_rawDescData) + file_bridge_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_bridge_proto_rawDesc), len(file_bridge_proto_rawDesc))) }) return file_bridge_proto_rawDescData } var file_bridge_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_bridge_proto_msgTypes = make([]protoimpl.MessageInfo, 73) -var file_bridge_proto_goTypes = []interface{}{ +var file_bridge_proto_msgTypes = make([]protoimpl.MessageInfo, 77) +var file_bridge_proto_goTypes = []any{ (LogLevel)(0), // 0: grpc.LogLevel (UserState)(0), // 1: grpc.UserState (LoginErrorType)(0), // 2: grpc.LoginErrorType @@ -5754,50 +5445,54 @@ var file_bridge_proto_goTypes = []interface{}{ (*LoginEvent)(nil), // 37: grpc.LoginEvent (*LoginErrorEvent)(nil), // 38: grpc.LoginErrorEvent (*LoginTfaRequestedEvent)(nil), // 39: grpc.LoginTfaRequestedEvent - (*LoginTwoPasswordsRequestedEvent)(nil), // 40: grpc.LoginTwoPasswordsRequestedEvent - (*LoginFinishedEvent)(nil), // 41: grpc.LoginFinishedEvent - (*LoginHvRequestedEvent)(nil), // 42: grpc.LoginHvRequestedEvent - (*UpdateEvent)(nil), // 43: grpc.UpdateEvent - (*UpdateErrorEvent)(nil), // 44: grpc.UpdateErrorEvent - (*UpdateManualReadyEvent)(nil), // 45: grpc.UpdateManualReadyEvent - (*UpdateManualRestartNeededEvent)(nil), // 46: grpc.UpdateManualRestartNeededEvent - (*UpdateForceEvent)(nil), // 47: grpc.UpdateForceEvent - (*UpdateSilentRestartNeeded)(nil), // 48: grpc.UpdateSilentRestartNeeded - (*UpdateIsLatestVersion)(nil), // 49: grpc.UpdateIsLatestVersion - (*UpdateCheckFinished)(nil), // 50: grpc.UpdateCheckFinished - (*UpdateVersionChanged)(nil), // 51: grpc.UpdateVersionChanged - (*DiskCacheEvent)(nil), // 52: grpc.DiskCacheEvent - (*DiskCacheErrorEvent)(nil), // 53: grpc.DiskCacheErrorEvent - (*DiskCachePathChangedEvent)(nil), // 54: grpc.DiskCachePathChangedEvent - (*DiskCachePathChangeFinishedEvent)(nil), // 55: grpc.DiskCachePathChangeFinishedEvent - (*MailServerSettingsEvent)(nil), // 56: grpc.MailServerSettingsEvent - (*MailServerSettingsErrorEvent)(nil), // 57: grpc.MailServerSettingsErrorEvent - (*MailServerSettingsChangedEvent)(nil), // 58: grpc.MailServerSettingsChangedEvent - (*ChangeMailServerSettingsFinishedEvent)(nil), // 59: grpc.ChangeMailServerSettingsFinishedEvent - (*KeychainEvent)(nil), // 60: grpc.KeychainEvent - (*ChangeKeychainFinishedEvent)(nil), // 61: grpc.ChangeKeychainFinishedEvent - (*HasNoKeychainEvent)(nil), // 62: grpc.HasNoKeychainEvent - (*RebuildKeychainEvent)(nil), // 63: grpc.RebuildKeychainEvent - (*MailEvent)(nil), // 64: grpc.MailEvent - (*AddressChangedEvent)(nil), // 65: grpc.AddressChangedEvent - (*AddressChangedLogoutEvent)(nil), // 66: grpc.AddressChangedLogoutEvent - (*ApiCertIssueEvent)(nil), // 67: grpc.ApiCertIssueEvent - (*UserEvent)(nil), // 68: grpc.UserEvent - (*ToggleSplitModeFinishedEvent)(nil), // 69: grpc.ToggleSplitModeFinishedEvent - (*UserDisconnectedEvent)(nil), // 70: grpc.UserDisconnectedEvent - (*UserChangedEvent)(nil), // 71: grpc.UserChangedEvent - (*UserBadEvent)(nil), // 72: grpc.UserBadEvent - (*UsedBytesChangedEvent)(nil), // 73: grpc.UsedBytesChangedEvent - (*ImapLoginFailedEvent)(nil), // 74: grpc.ImapLoginFailedEvent - (*SyncStartedEvent)(nil), // 75: grpc.SyncStartedEvent - (*SyncFinishedEvent)(nil), // 76: grpc.SyncFinishedEvent - (*SyncProgressEvent)(nil), // 77: grpc.SyncProgressEvent - (*UserNotificationEvent)(nil), // 78: grpc.UserNotificationEvent - (*GenericErrorEvent)(nil), // 79: grpc.GenericErrorEvent - (*wrapperspb.StringValue)(nil), // 80: google.protobuf.StringValue - (*emptypb.Empty)(nil), // 81: google.protobuf.Empty - (*wrapperspb.BoolValue)(nil), // 82: google.protobuf.BoolValue - (*wrapperspb.Int32Value)(nil), // 83: google.protobuf.Int32Value + (*LoginFidoRequestedEvent)(nil), // 40: grpc.LoginFidoRequestedEvent + (*LoginTfaOrFidoRequestedEvent)(nil), // 41: grpc.LoginTfaOrFidoRequestedEvent + (*LoginFidoTouchEvent)(nil), // 42: grpc.LoginFidoTouchEvent + (*LoginFidoPinRequired)(nil), // 43: grpc.LoginFidoPinRequired + (*LoginTwoPasswordsRequestedEvent)(nil), // 44: grpc.LoginTwoPasswordsRequestedEvent + (*LoginFinishedEvent)(nil), // 45: grpc.LoginFinishedEvent + (*LoginHvRequestedEvent)(nil), // 46: grpc.LoginHvRequestedEvent + (*UpdateEvent)(nil), // 47: grpc.UpdateEvent + (*UpdateErrorEvent)(nil), // 48: grpc.UpdateErrorEvent + (*UpdateManualReadyEvent)(nil), // 49: grpc.UpdateManualReadyEvent + (*UpdateManualRestartNeededEvent)(nil), // 50: grpc.UpdateManualRestartNeededEvent + (*UpdateForceEvent)(nil), // 51: grpc.UpdateForceEvent + (*UpdateSilentRestartNeeded)(nil), // 52: grpc.UpdateSilentRestartNeeded + (*UpdateIsLatestVersion)(nil), // 53: grpc.UpdateIsLatestVersion + (*UpdateCheckFinished)(nil), // 54: grpc.UpdateCheckFinished + (*UpdateVersionChanged)(nil), // 55: grpc.UpdateVersionChanged + (*DiskCacheEvent)(nil), // 56: grpc.DiskCacheEvent + (*DiskCacheErrorEvent)(nil), // 57: grpc.DiskCacheErrorEvent + (*DiskCachePathChangedEvent)(nil), // 58: grpc.DiskCachePathChangedEvent + (*DiskCachePathChangeFinishedEvent)(nil), // 59: grpc.DiskCachePathChangeFinishedEvent + (*MailServerSettingsEvent)(nil), // 60: grpc.MailServerSettingsEvent + (*MailServerSettingsErrorEvent)(nil), // 61: grpc.MailServerSettingsErrorEvent + (*MailServerSettingsChangedEvent)(nil), // 62: grpc.MailServerSettingsChangedEvent + (*ChangeMailServerSettingsFinishedEvent)(nil), // 63: grpc.ChangeMailServerSettingsFinishedEvent + (*KeychainEvent)(nil), // 64: grpc.KeychainEvent + (*ChangeKeychainFinishedEvent)(nil), // 65: grpc.ChangeKeychainFinishedEvent + (*HasNoKeychainEvent)(nil), // 66: grpc.HasNoKeychainEvent + (*RebuildKeychainEvent)(nil), // 67: grpc.RebuildKeychainEvent + (*MailEvent)(nil), // 68: grpc.MailEvent + (*AddressChangedEvent)(nil), // 69: grpc.AddressChangedEvent + (*AddressChangedLogoutEvent)(nil), // 70: grpc.AddressChangedLogoutEvent + (*ApiCertIssueEvent)(nil), // 71: grpc.ApiCertIssueEvent + (*UserEvent)(nil), // 72: grpc.UserEvent + (*ToggleSplitModeFinishedEvent)(nil), // 73: grpc.ToggleSplitModeFinishedEvent + (*UserDisconnectedEvent)(nil), // 74: grpc.UserDisconnectedEvent + (*UserChangedEvent)(nil), // 75: grpc.UserChangedEvent + (*UserBadEvent)(nil), // 76: grpc.UserBadEvent + (*UsedBytesChangedEvent)(nil), // 77: grpc.UsedBytesChangedEvent + (*ImapLoginFailedEvent)(nil), // 78: grpc.ImapLoginFailedEvent + (*SyncStartedEvent)(nil), // 79: grpc.SyncStartedEvent + (*SyncFinishedEvent)(nil), // 80: grpc.SyncFinishedEvent + (*SyncProgressEvent)(nil), // 81: grpc.SyncProgressEvent + (*UserNotificationEvent)(nil), // 82: grpc.UserNotificationEvent + (*GenericErrorEvent)(nil), // 83: grpc.GenericErrorEvent + (*wrapperspb.StringValue)(nil), // 84: google.protobuf.StringValue + (*emptypb.Empty)(nil), // 85: google.protobuf.Empty + (*wrapperspb.BoolValue)(nil), // 86: google.protobuf.BoolValue + (*wrapperspb.Int32Value)(nil), // 87: google.protobuf.Int32Value } var file_bridge_proto_depIdxs = []int32{ 0, // 0: grpc.AddLogEntryRequest.level:type_name -> grpc.LogLevel @@ -5805,13 +5500,13 @@ var file_bridge_proto_depIdxs = []int32{ 14, // 2: grpc.UserListResponse.users:type_name -> grpc.User 21, // 3: grpc.StreamEvent.app:type_name -> grpc.AppEvent 37, // 4: grpc.StreamEvent.login:type_name -> grpc.LoginEvent - 43, // 5: grpc.StreamEvent.update:type_name -> grpc.UpdateEvent - 52, // 6: grpc.StreamEvent.cache:type_name -> grpc.DiskCacheEvent - 56, // 7: grpc.StreamEvent.mailServerSettings:type_name -> grpc.MailServerSettingsEvent - 60, // 8: grpc.StreamEvent.keychain:type_name -> grpc.KeychainEvent - 64, // 9: grpc.StreamEvent.mail:type_name -> grpc.MailEvent - 68, // 10: grpc.StreamEvent.user:type_name -> grpc.UserEvent - 79, // 11: grpc.StreamEvent.genericError:type_name -> grpc.GenericErrorEvent + 47, // 5: grpc.StreamEvent.update:type_name -> grpc.UpdateEvent + 56, // 6: grpc.StreamEvent.cache:type_name -> grpc.DiskCacheEvent + 60, // 7: grpc.StreamEvent.mailServerSettings:type_name -> grpc.MailServerSettingsEvent + 64, // 8: grpc.StreamEvent.keychain:type_name -> grpc.KeychainEvent + 68, // 9: grpc.StreamEvent.mail:type_name -> grpc.MailEvent + 72, // 10: grpc.StreamEvent.user:type_name -> grpc.UserEvent + 83, // 11: grpc.StreamEvent.genericError:type_name -> grpc.GenericErrorEvent 22, // 12: grpc.AppEvent.internetStatus:type_name -> grpc.InternetStatusEvent 23, // 13: grpc.AppEvent.toggleAutostartFinished:type_name -> grpc.ToggleAutostartFinishedEvent 24, // 14: grpc.AppEvent.resetFinished:type_name -> grpc.ResetFinishedEvent @@ -5826,176 +5521,185 @@ var file_bridge_proto_depIdxs = []int32{ 36, // 23: grpc.AppEvent.knowledgeBaseSuggestions:type_name -> grpc.KnowledgeBaseSuggestionsEvent 33, // 24: grpc.AppEvent.repairStarted:type_name -> grpc.RepairStartedEvent 34, // 25: grpc.AppEvent.allUsersLoaded:type_name -> grpc.AllUsersLoadedEvent - 78, // 26: grpc.AppEvent.userNotification:type_name -> grpc.UserNotificationEvent + 82, // 26: grpc.AppEvent.userNotification:type_name -> grpc.UserNotificationEvent 35, // 27: grpc.KnowledgeBaseSuggestionsEvent.suggestions:type_name -> grpc.KnowledgeBaseSuggestion 38, // 28: grpc.LoginEvent.error:type_name -> grpc.LoginErrorEvent 39, // 29: grpc.LoginEvent.tfaRequested:type_name -> grpc.LoginTfaRequestedEvent - 40, // 30: grpc.LoginEvent.twoPasswordRequested:type_name -> grpc.LoginTwoPasswordsRequestedEvent - 41, // 31: grpc.LoginEvent.finished:type_name -> grpc.LoginFinishedEvent - 41, // 32: grpc.LoginEvent.alreadyLoggedIn:type_name -> grpc.LoginFinishedEvent - 42, // 33: grpc.LoginEvent.hvRequested:type_name -> grpc.LoginHvRequestedEvent - 2, // 34: grpc.LoginErrorEvent.type:type_name -> grpc.LoginErrorType - 44, // 35: grpc.UpdateEvent.error:type_name -> grpc.UpdateErrorEvent - 45, // 36: grpc.UpdateEvent.manualReady:type_name -> grpc.UpdateManualReadyEvent - 46, // 37: grpc.UpdateEvent.manualRestartNeeded:type_name -> grpc.UpdateManualRestartNeededEvent - 47, // 38: grpc.UpdateEvent.force:type_name -> grpc.UpdateForceEvent - 48, // 39: grpc.UpdateEvent.silentRestartNeeded:type_name -> grpc.UpdateSilentRestartNeeded - 49, // 40: grpc.UpdateEvent.isLatestVersion:type_name -> grpc.UpdateIsLatestVersion - 50, // 41: grpc.UpdateEvent.checkFinished:type_name -> grpc.UpdateCheckFinished - 51, // 42: grpc.UpdateEvent.versionChanged:type_name -> grpc.UpdateVersionChanged - 3, // 43: grpc.UpdateErrorEvent.type:type_name -> grpc.UpdateErrorType - 53, // 44: grpc.DiskCacheEvent.error:type_name -> grpc.DiskCacheErrorEvent - 54, // 45: grpc.DiskCacheEvent.pathChanged:type_name -> grpc.DiskCachePathChangedEvent - 55, // 46: grpc.DiskCacheEvent.pathChangeFinished:type_name -> grpc.DiskCachePathChangeFinishedEvent - 4, // 47: grpc.DiskCacheErrorEvent.type:type_name -> grpc.DiskCacheErrorType - 57, // 48: grpc.MailServerSettingsEvent.error:type_name -> grpc.MailServerSettingsErrorEvent - 58, // 49: grpc.MailServerSettingsEvent.mailServerSettingsChanged:type_name -> grpc.MailServerSettingsChangedEvent - 59, // 50: grpc.MailServerSettingsEvent.changeMailServerSettingsFinished:type_name -> grpc.ChangeMailServerSettingsFinishedEvent - 5, // 51: grpc.MailServerSettingsErrorEvent.type:type_name -> grpc.MailServerSettingsErrorType - 12, // 52: grpc.MailServerSettingsChangedEvent.settings:type_name -> grpc.ImapSmtpSettings - 61, // 53: grpc.KeychainEvent.changeKeychainFinished:type_name -> grpc.ChangeKeychainFinishedEvent - 62, // 54: grpc.KeychainEvent.hasNoKeychain:type_name -> grpc.HasNoKeychainEvent - 63, // 55: grpc.KeychainEvent.rebuildKeychain:type_name -> grpc.RebuildKeychainEvent - 65, // 56: grpc.MailEvent.addressChanged:type_name -> grpc.AddressChangedEvent - 66, // 57: grpc.MailEvent.addressChangedLogout:type_name -> grpc.AddressChangedLogoutEvent - 67, // 58: grpc.MailEvent.apiCertIssue:type_name -> grpc.ApiCertIssueEvent - 69, // 59: grpc.UserEvent.toggleSplitModeFinished:type_name -> grpc.ToggleSplitModeFinishedEvent - 70, // 60: grpc.UserEvent.userDisconnected:type_name -> grpc.UserDisconnectedEvent - 71, // 61: grpc.UserEvent.userChanged:type_name -> grpc.UserChangedEvent - 72, // 62: grpc.UserEvent.userBadEvent:type_name -> grpc.UserBadEvent - 73, // 63: grpc.UserEvent.usedBytesChangedEvent:type_name -> grpc.UsedBytesChangedEvent - 74, // 64: grpc.UserEvent.imapLoginFailedEvent:type_name -> grpc.ImapLoginFailedEvent - 75, // 65: grpc.UserEvent.syncStartedEvent:type_name -> grpc.SyncStartedEvent - 76, // 66: grpc.UserEvent.syncFinishedEvent:type_name -> grpc.SyncFinishedEvent - 77, // 67: grpc.UserEvent.syncProgressEvent:type_name -> grpc.SyncProgressEvent - 6, // 68: grpc.GenericErrorEvent.code:type_name -> grpc.ErrorCode - 80, // 69: grpc.Bridge.CheckTokens:input_type -> google.protobuf.StringValue - 7, // 70: grpc.Bridge.AddLogEntry:input_type -> grpc.AddLogEntryRequest - 81, // 71: grpc.Bridge.GuiReady:input_type -> google.protobuf.Empty - 81, // 72: grpc.Bridge.Quit:input_type -> google.protobuf.Empty - 81, // 73: grpc.Bridge.Restart:input_type -> google.protobuf.Empty - 81, // 74: grpc.Bridge.ShowOnStartup:input_type -> google.protobuf.Empty - 82, // 75: grpc.Bridge.SetIsAutostartOn:input_type -> google.protobuf.BoolValue - 81, // 76: grpc.Bridge.IsAutostartOn:input_type -> google.protobuf.Empty - 82, // 77: grpc.Bridge.SetIsBetaEnabled:input_type -> google.protobuf.BoolValue - 81, // 78: grpc.Bridge.IsBetaEnabled:input_type -> google.protobuf.Empty - 82, // 79: grpc.Bridge.SetIsAllMailVisible:input_type -> google.protobuf.BoolValue - 81, // 80: grpc.Bridge.IsAllMailVisible:input_type -> google.protobuf.Empty - 82, // 81: grpc.Bridge.SetIsTelemetryDisabled:input_type -> google.protobuf.BoolValue - 81, // 82: grpc.Bridge.IsTelemetryDisabled:input_type -> google.protobuf.Empty - 81, // 83: grpc.Bridge.GoOs:input_type -> google.protobuf.Empty - 81, // 84: grpc.Bridge.TriggerReset:input_type -> google.protobuf.Empty - 81, // 85: grpc.Bridge.Version:input_type -> google.protobuf.Empty - 81, // 86: grpc.Bridge.LogsPath:input_type -> google.protobuf.Empty - 81, // 87: grpc.Bridge.LicensePath:input_type -> google.protobuf.Empty - 81, // 88: grpc.Bridge.ReleaseNotesPageLink:input_type -> google.protobuf.Empty - 81, // 89: grpc.Bridge.DependencyLicensesLink:input_type -> google.protobuf.Empty - 81, // 90: grpc.Bridge.LandingPageLink:input_type -> google.protobuf.Empty - 80, // 91: grpc.Bridge.SetColorSchemeName:input_type -> google.protobuf.StringValue - 81, // 92: grpc.Bridge.ColorSchemeName:input_type -> google.protobuf.Empty - 81, // 93: grpc.Bridge.CurrentEmailClient:input_type -> google.protobuf.Empty - 9, // 94: grpc.Bridge.ReportBug:input_type -> grpc.ReportBugRequest - 80, // 95: grpc.Bridge.ForceLauncher:input_type -> google.protobuf.StringValue - 80, // 96: grpc.Bridge.SetMainExecutable:input_type -> google.protobuf.StringValue - 80, // 97: grpc.Bridge.RequestKnowledgeBaseSuggestions:input_type -> google.protobuf.StringValue - 10, // 98: grpc.Bridge.Login:input_type -> grpc.LoginRequest - 10, // 99: grpc.Bridge.Login2FA:input_type -> grpc.LoginRequest - 10, // 100: grpc.Bridge.Login2Passwords:input_type -> grpc.LoginRequest - 11, // 101: grpc.Bridge.LoginAbort:input_type -> grpc.LoginAbortRequest - 81, // 102: grpc.Bridge.CheckUpdate:input_type -> google.protobuf.Empty - 81, // 103: grpc.Bridge.InstallUpdate:input_type -> google.protobuf.Empty - 82, // 104: grpc.Bridge.SetIsAutomaticUpdateOn:input_type -> google.protobuf.BoolValue - 81, // 105: grpc.Bridge.IsAutomaticUpdateOn:input_type -> google.protobuf.Empty - 81, // 106: grpc.Bridge.DiskCachePath:input_type -> google.protobuf.Empty - 80, // 107: grpc.Bridge.SetDiskCachePath:input_type -> google.protobuf.StringValue - 82, // 108: grpc.Bridge.SetIsDoHEnabled:input_type -> google.protobuf.BoolValue - 81, // 109: grpc.Bridge.IsDoHEnabled:input_type -> google.protobuf.Empty - 81, // 110: grpc.Bridge.MailServerSettings:input_type -> google.protobuf.Empty - 12, // 111: grpc.Bridge.SetMailServerSettings:input_type -> grpc.ImapSmtpSettings - 81, // 112: grpc.Bridge.Hostname:input_type -> google.protobuf.Empty - 83, // 113: grpc.Bridge.IsPortFree:input_type -> google.protobuf.Int32Value - 81, // 114: grpc.Bridge.AvailableKeychains:input_type -> google.protobuf.Empty - 80, // 115: grpc.Bridge.SetCurrentKeychain:input_type -> google.protobuf.StringValue - 81, // 116: grpc.Bridge.CurrentKeychain:input_type -> google.protobuf.Empty - 81, // 117: grpc.Bridge.GetUserList:input_type -> google.protobuf.Empty - 80, // 118: grpc.Bridge.GetUser:input_type -> google.protobuf.StringValue - 15, // 119: grpc.Bridge.SetUserSplitMode:input_type -> grpc.UserSplitModeRequest - 16, // 120: grpc.Bridge.SendBadEventUserFeedback:input_type -> grpc.UserBadEventFeedbackRequest - 80, // 121: grpc.Bridge.LogoutUser:input_type -> google.protobuf.StringValue - 80, // 122: grpc.Bridge.RemoveUser:input_type -> google.protobuf.StringValue - 18, // 123: grpc.Bridge.ConfigureUserAppleMail:input_type -> grpc.ConfigureAppleMailRequest - 81, // 124: grpc.Bridge.IsTLSCertificateInstalled:input_type -> google.protobuf.Empty - 81, // 125: grpc.Bridge.InstallTLSCertificate:input_type -> google.protobuf.Empty - 80, // 126: grpc.Bridge.ExportTLSCertificates:input_type -> google.protobuf.StringValue - 19, // 127: grpc.Bridge.RunEventStream:input_type -> grpc.EventStreamRequest - 81, // 128: grpc.Bridge.StopEventStream:input_type -> google.protobuf.Empty - 81, // 129: grpc.Bridge.TriggerRepair:input_type -> google.protobuf.Empty - 80, // 130: grpc.Bridge.CheckTokens:output_type -> google.protobuf.StringValue - 81, // 131: grpc.Bridge.AddLogEntry:output_type -> google.protobuf.Empty - 8, // 132: grpc.Bridge.GuiReady:output_type -> grpc.GuiReadyResponse - 81, // 133: grpc.Bridge.Quit:output_type -> google.protobuf.Empty - 81, // 134: grpc.Bridge.Restart:output_type -> google.protobuf.Empty - 82, // 135: grpc.Bridge.ShowOnStartup:output_type -> google.protobuf.BoolValue - 81, // 136: grpc.Bridge.SetIsAutostartOn:output_type -> google.protobuf.Empty - 82, // 137: grpc.Bridge.IsAutostartOn:output_type -> google.protobuf.BoolValue - 81, // 138: grpc.Bridge.SetIsBetaEnabled:output_type -> google.protobuf.Empty - 82, // 139: grpc.Bridge.IsBetaEnabled:output_type -> google.protobuf.BoolValue - 81, // 140: grpc.Bridge.SetIsAllMailVisible:output_type -> google.protobuf.Empty - 82, // 141: grpc.Bridge.IsAllMailVisible:output_type -> google.protobuf.BoolValue - 81, // 142: grpc.Bridge.SetIsTelemetryDisabled:output_type -> google.protobuf.Empty - 82, // 143: grpc.Bridge.IsTelemetryDisabled:output_type -> google.protobuf.BoolValue - 80, // 144: grpc.Bridge.GoOs:output_type -> google.protobuf.StringValue - 81, // 145: grpc.Bridge.TriggerReset:output_type -> google.protobuf.Empty - 80, // 146: grpc.Bridge.Version:output_type -> google.protobuf.StringValue - 80, // 147: grpc.Bridge.LogsPath:output_type -> google.protobuf.StringValue - 80, // 148: grpc.Bridge.LicensePath:output_type -> google.protobuf.StringValue - 80, // 149: grpc.Bridge.ReleaseNotesPageLink:output_type -> google.protobuf.StringValue - 80, // 150: grpc.Bridge.DependencyLicensesLink:output_type -> google.protobuf.StringValue - 80, // 151: grpc.Bridge.LandingPageLink:output_type -> google.protobuf.StringValue - 81, // 152: grpc.Bridge.SetColorSchemeName:output_type -> google.protobuf.Empty - 80, // 153: grpc.Bridge.ColorSchemeName:output_type -> google.protobuf.StringValue - 80, // 154: grpc.Bridge.CurrentEmailClient:output_type -> google.protobuf.StringValue - 81, // 155: grpc.Bridge.ReportBug:output_type -> google.protobuf.Empty - 81, // 156: grpc.Bridge.ForceLauncher:output_type -> google.protobuf.Empty - 81, // 157: grpc.Bridge.SetMainExecutable:output_type -> google.protobuf.Empty - 81, // 158: grpc.Bridge.RequestKnowledgeBaseSuggestions:output_type -> google.protobuf.Empty - 81, // 159: grpc.Bridge.Login:output_type -> google.protobuf.Empty - 81, // 160: grpc.Bridge.Login2FA:output_type -> google.protobuf.Empty - 81, // 161: grpc.Bridge.Login2Passwords:output_type -> google.protobuf.Empty - 81, // 162: grpc.Bridge.LoginAbort:output_type -> google.protobuf.Empty - 81, // 163: grpc.Bridge.CheckUpdate:output_type -> google.protobuf.Empty - 81, // 164: grpc.Bridge.InstallUpdate:output_type -> google.protobuf.Empty - 81, // 165: grpc.Bridge.SetIsAutomaticUpdateOn:output_type -> google.protobuf.Empty - 82, // 166: grpc.Bridge.IsAutomaticUpdateOn:output_type -> google.protobuf.BoolValue - 80, // 167: grpc.Bridge.DiskCachePath:output_type -> google.protobuf.StringValue - 81, // 168: grpc.Bridge.SetDiskCachePath:output_type -> google.protobuf.Empty - 81, // 169: grpc.Bridge.SetIsDoHEnabled:output_type -> google.protobuf.Empty - 82, // 170: grpc.Bridge.IsDoHEnabled:output_type -> google.protobuf.BoolValue - 12, // 171: grpc.Bridge.MailServerSettings:output_type -> grpc.ImapSmtpSettings - 81, // 172: grpc.Bridge.SetMailServerSettings:output_type -> google.protobuf.Empty - 80, // 173: grpc.Bridge.Hostname:output_type -> google.protobuf.StringValue - 82, // 174: grpc.Bridge.IsPortFree:output_type -> google.protobuf.BoolValue - 13, // 175: grpc.Bridge.AvailableKeychains:output_type -> grpc.AvailableKeychainsResponse - 81, // 176: grpc.Bridge.SetCurrentKeychain:output_type -> google.protobuf.Empty - 80, // 177: grpc.Bridge.CurrentKeychain:output_type -> google.protobuf.StringValue - 17, // 178: grpc.Bridge.GetUserList:output_type -> grpc.UserListResponse - 14, // 179: grpc.Bridge.GetUser:output_type -> grpc.User - 81, // 180: grpc.Bridge.SetUserSplitMode:output_type -> google.protobuf.Empty - 81, // 181: grpc.Bridge.SendBadEventUserFeedback:output_type -> google.protobuf.Empty - 81, // 182: grpc.Bridge.LogoutUser:output_type -> google.protobuf.Empty - 81, // 183: grpc.Bridge.RemoveUser:output_type -> google.protobuf.Empty - 81, // 184: grpc.Bridge.ConfigureUserAppleMail:output_type -> google.protobuf.Empty - 82, // 185: grpc.Bridge.IsTLSCertificateInstalled:output_type -> google.protobuf.BoolValue - 81, // 186: grpc.Bridge.InstallTLSCertificate:output_type -> google.protobuf.Empty - 81, // 187: grpc.Bridge.ExportTLSCertificates:output_type -> google.protobuf.Empty - 20, // 188: grpc.Bridge.RunEventStream:output_type -> grpc.StreamEvent - 81, // 189: grpc.Bridge.StopEventStream:output_type -> google.protobuf.Empty - 81, // 190: grpc.Bridge.TriggerRepair:output_type -> google.protobuf.Empty - 130, // [130:191] is the sub-list for method output_type - 69, // [69:130] is the sub-list for method input_type - 69, // [69:69] is the sub-list for extension type_name - 69, // [69:69] is the sub-list for extension extendee - 0, // [0:69] is the sub-list for field type_name + 44, // 30: grpc.LoginEvent.twoPasswordRequested:type_name -> grpc.LoginTwoPasswordsRequestedEvent + 45, // 31: grpc.LoginEvent.finished:type_name -> grpc.LoginFinishedEvent + 45, // 32: grpc.LoginEvent.alreadyLoggedIn:type_name -> grpc.LoginFinishedEvent + 46, // 33: grpc.LoginEvent.hvRequested:type_name -> grpc.LoginHvRequestedEvent + 40, // 34: grpc.LoginEvent.fidoRequested:type_name -> grpc.LoginFidoRequestedEvent + 41, // 35: grpc.LoginEvent.tfaOrFidoRequested:type_name -> grpc.LoginTfaOrFidoRequestedEvent + 42, // 36: grpc.LoginEvent.loginFidoTouchRequested:type_name -> grpc.LoginFidoTouchEvent + 42, // 37: grpc.LoginEvent.loginFidoTouchCompleted:type_name -> grpc.LoginFidoTouchEvent + 43, // 38: grpc.LoginEvent.loginFidoPinRequired:type_name -> grpc.LoginFidoPinRequired + 2, // 39: grpc.LoginErrorEvent.type:type_name -> grpc.LoginErrorType + 48, // 40: grpc.UpdateEvent.error:type_name -> grpc.UpdateErrorEvent + 49, // 41: grpc.UpdateEvent.manualReady:type_name -> grpc.UpdateManualReadyEvent + 50, // 42: grpc.UpdateEvent.manualRestartNeeded:type_name -> grpc.UpdateManualRestartNeededEvent + 51, // 43: grpc.UpdateEvent.force:type_name -> grpc.UpdateForceEvent + 52, // 44: grpc.UpdateEvent.silentRestartNeeded:type_name -> grpc.UpdateSilentRestartNeeded + 53, // 45: grpc.UpdateEvent.isLatestVersion:type_name -> grpc.UpdateIsLatestVersion + 54, // 46: grpc.UpdateEvent.checkFinished:type_name -> grpc.UpdateCheckFinished + 55, // 47: grpc.UpdateEvent.versionChanged:type_name -> grpc.UpdateVersionChanged + 3, // 48: grpc.UpdateErrorEvent.type:type_name -> grpc.UpdateErrorType + 57, // 49: grpc.DiskCacheEvent.error:type_name -> grpc.DiskCacheErrorEvent + 58, // 50: grpc.DiskCacheEvent.pathChanged:type_name -> grpc.DiskCachePathChangedEvent + 59, // 51: grpc.DiskCacheEvent.pathChangeFinished:type_name -> grpc.DiskCachePathChangeFinishedEvent + 4, // 52: grpc.DiskCacheErrorEvent.type:type_name -> grpc.DiskCacheErrorType + 61, // 53: grpc.MailServerSettingsEvent.error:type_name -> grpc.MailServerSettingsErrorEvent + 62, // 54: grpc.MailServerSettingsEvent.mailServerSettingsChanged:type_name -> grpc.MailServerSettingsChangedEvent + 63, // 55: grpc.MailServerSettingsEvent.changeMailServerSettingsFinished:type_name -> grpc.ChangeMailServerSettingsFinishedEvent + 5, // 56: grpc.MailServerSettingsErrorEvent.type:type_name -> grpc.MailServerSettingsErrorType + 12, // 57: grpc.MailServerSettingsChangedEvent.settings:type_name -> grpc.ImapSmtpSettings + 65, // 58: grpc.KeychainEvent.changeKeychainFinished:type_name -> grpc.ChangeKeychainFinishedEvent + 66, // 59: grpc.KeychainEvent.hasNoKeychain:type_name -> grpc.HasNoKeychainEvent + 67, // 60: grpc.KeychainEvent.rebuildKeychain:type_name -> grpc.RebuildKeychainEvent + 69, // 61: grpc.MailEvent.addressChanged:type_name -> grpc.AddressChangedEvent + 70, // 62: grpc.MailEvent.addressChangedLogout:type_name -> grpc.AddressChangedLogoutEvent + 71, // 63: grpc.MailEvent.apiCertIssue:type_name -> grpc.ApiCertIssueEvent + 73, // 64: grpc.UserEvent.toggleSplitModeFinished:type_name -> grpc.ToggleSplitModeFinishedEvent + 74, // 65: grpc.UserEvent.userDisconnected:type_name -> grpc.UserDisconnectedEvent + 75, // 66: grpc.UserEvent.userChanged:type_name -> grpc.UserChangedEvent + 76, // 67: grpc.UserEvent.userBadEvent:type_name -> grpc.UserBadEvent + 77, // 68: grpc.UserEvent.usedBytesChangedEvent:type_name -> grpc.UsedBytesChangedEvent + 78, // 69: grpc.UserEvent.imapLoginFailedEvent:type_name -> grpc.ImapLoginFailedEvent + 79, // 70: grpc.UserEvent.syncStartedEvent:type_name -> grpc.SyncStartedEvent + 80, // 71: grpc.UserEvent.syncFinishedEvent:type_name -> grpc.SyncFinishedEvent + 81, // 72: grpc.UserEvent.syncProgressEvent:type_name -> grpc.SyncProgressEvent + 6, // 73: grpc.GenericErrorEvent.code:type_name -> grpc.ErrorCode + 84, // 74: grpc.Bridge.CheckTokens:input_type -> google.protobuf.StringValue + 7, // 75: grpc.Bridge.AddLogEntry:input_type -> grpc.AddLogEntryRequest + 85, // 76: grpc.Bridge.GuiReady:input_type -> google.protobuf.Empty + 85, // 77: grpc.Bridge.Quit:input_type -> google.protobuf.Empty + 85, // 78: grpc.Bridge.Restart:input_type -> google.protobuf.Empty + 85, // 79: grpc.Bridge.ShowOnStartup:input_type -> google.protobuf.Empty + 86, // 80: grpc.Bridge.SetIsAutostartOn:input_type -> google.protobuf.BoolValue + 85, // 81: grpc.Bridge.IsAutostartOn:input_type -> google.protobuf.Empty + 86, // 82: grpc.Bridge.SetIsBetaEnabled:input_type -> google.protobuf.BoolValue + 85, // 83: grpc.Bridge.IsBetaEnabled:input_type -> google.protobuf.Empty + 86, // 84: grpc.Bridge.SetIsAllMailVisible:input_type -> google.protobuf.BoolValue + 85, // 85: grpc.Bridge.IsAllMailVisible:input_type -> google.protobuf.Empty + 86, // 86: grpc.Bridge.SetIsTelemetryDisabled:input_type -> google.protobuf.BoolValue + 85, // 87: grpc.Bridge.IsTelemetryDisabled:input_type -> google.protobuf.Empty + 85, // 88: grpc.Bridge.GoOs:input_type -> google.protobuf.Empty + 85, // 89: grpc.Bridge.TriggerReset:input_type -> google.protobuf.Empty + 85, // 90: grpc.Bridge.Version:input_type -> google.protobuf.Empty + 85, // 91: grpc.Bridge.LogsPath:input_type -> google.protobuf.Empty + 85, // 92: grpc.Bridge.LicensePath:input_type -> google.protobuf.Empty + 85, // 93: grpc.Bridge.ReleaseNotesPageLink:input_type -> google.protobuf.Empty + 85, // 94: grpc.Bridge.DependencyLicensesLink:input_type -> google.protobuf.Empty + 85, // 95: grpc.Bridge.LandingPageLink:input_type -> google.protobuf.Empty + 84, // 96: grpc.Bridge.SetColorSchemeName:input_type -> google.protobuf.StringValue + 85, // 97: grpc.Bridge.ColorSchemeName:input_type -> google.protobuf.Empty + 85, // 98: grpc.Bridge.CurrentEmailClient:input_type -> google.protobuf.Empty + 9, // 99: grpc.Bridge.ReportBug:input_type -> grpc.ReportBugRequest + 84, // 100: grpc.Bridge.ForceLauncher:input_type -> google.protobuf.StringValue + 84, // 101: grpc.Bridge.SetMainExecutable:input_type -> google.protobuf.StringValue + 84, // 102: grpc.Bridge.RequestKnowledgeBaseSuggestions:input_type -> google.protobuf.StringValue + 10, // 103: grpc.Bridge.Login:input_type -> grpc.LoginRequest + 10, // 104: grpc.Bridge.Login2FA:input_type -> grpc.LoginRequest + 10, // 105: grpc.Bridge.LoginFido:input_type -> grpc.LoginRequest + 10, // 106: grpc.Bridge.Login2Passwords:input_type -> grpc.LoginRequest + 11, // 107: grpc.Bridge.LoginAbort:input_type -> grpc.LoginAbortRequest + 11, // 108: grpc.Bridge.FidoAssertionAbort:input_type -> grpc.LoginAbortRequest + 85, // 109: grpc.Bridge.CheckUpdate:input_type -> google.protobuf.Empty + 85, // 110: grpc.Bridge.InstallUpdate:input_type -> google.protobuf.Empty + 86, // 111: grpc.Bridge.SetIsAutomaticUpdateOn:input_type -> google.protobuf.BoolValue + 85, // 112: grpc.Bridge.IsAutomaticUpdateOn:input_type -> google.protobuf.Empty + 85, // 113: grpc.Bridge.DiskCachePath:input_type -> google.protobuf.Empty + 84, // 114: grpc.Bridge.SetDiskCachePath:input_type -> google.protobuf.StringValue + 86, // 115: grpc.Bridge.SetIsDoHEnabled:input_type -> google.protobuf.BoolValue + 85, // 116: grpc.Bridge.IsDoHEnabled:input_type -> google.protobuf.Empty + 85, // 117: grpc.Bridge.MailServerSettings:input_type -> google.protobuf.Empty + 12, // 118: grpc.Bridge.SetMailServerSettings:input_type -> grpc.ImapSmtpSettings + 85, // 119: grpc.Bridge.Hostname:input_type -> google.protobuf.Empty + 87, // 120: grpc.Bridge.IsPortFree:input_type -> google.protobuf.Int32Value + 85, // 121: grpc.Bridge.AvailableKeychains:input_type -> google.protobuf.Empty + 84, // 122: grpc.Bridge.SetCurrentKeychain:input_type -> google.protobuf.StringValue + 85, // 123: grpc.Bridge.CurrentKeychain:input_type -> google.protobuf.Empty + 85, // 124: grpc.Bridge.GetUserList:input_type -> google.protobuf.Empty + 84, // 125: grpc.Bridge.GetUser:input_type -> google.protobuf.StringValue + 15, // 126: grpc.Bridge.SetUserSplitMode:input_type -> grpc.UserSplitModeRequest + 16, // 127: grpc.Bridge.SendBadEventUserFeedback:input_type -> grpc.UserBadEventFeedbackRequest + 84, // 128: grpc.Bridge.LogoutUser:input_type -> google.protobuf.StringValue + 84, // 129: grpc.Bridge.RemoveUser:input_type -> google.protobuf.StringValue + 18, // 130: grpc.Bridge.ConfigureUserAppleMail:input_type -> grpc.ConfigureAppleMailRequest + 85, // 131: grpc.Bridge.IsTLSCertificateInstalled:input_type -> google.protobuf.Empty + 85, // 132: grpc.Bridge.InstallTLSCertificate:input_type -> google.protobuf.Empty + 84, // 133: grpc.Bridge.ExportTLSCertificates:input_type -> google.protobuf.StringValue + 19, // 134: grpc.Bridge.RunEventStream:input_type -> grpc.EventStreamRequest + 85, // 135: grpc.Bridge.StopEventStream:input_type -> google.protobuf.Empty + 85, // 136: grpc.Bridge.TriggerRepair:input_type -> google.protobuf.Empty + 84, // 137: grpc.Bridge.CheckTokens:output_type -> google.protobuf.StringValue + 85, // 138: grpc.Bridge.AddLogEntry:output_type -> google.protobuf.Empty + 8, // 139: grpc.Bridge.GuiReady:output_type -> grpc.GuiReadyResponse + 85, // 140: grpc.Bridge.Quit:output_type -> google.protobuf.Empty + 85, // 141: grpc.Bridge.Restart:output_type -> google.protobuf.Empty + 86, // 142: grpc.Bridge.ShowOnStartup:output_type -> google.protobuf.BoolValue + 85, // 143: grpc.Bridge.SetIsAutostartOn:output_type -> google.protobuf.Empty + 86, // 144: grpc.Bridge.IsAutostartOn:output_type -> google.protobuf.BoolValue + 85, // 145: grpc.Bridge.SetIsBetaEnabled:output_type -> google.protobuf.Empty + 86, // 146: grpc.Bridge.IsBetaEnabled:output_type -> google.protobuf.BoolValue + 85, // 147: grpc.Bridge.SetIsAllMailVisible:output_type -> google.protobuf.Empty + 86, // 148: grpc.Bridge.IsAllMailVisible:output_type -> google.protobuf.BoolValue + 85, // 149: grpc.Bridge.SetIsTelemetryDisabled:output_type -> google.protobuf.Empty + 86, // 150: grpc.Bridge.IsTelemetryDisabled:output_type -> google.protobuf.BoolValue + 84, // 151: grpc.Bridge.GoOs:output_type -> google.protobuf.StringValue + 85, // 152: grpc.Bridge.TriggerReset:output_type -> google.protobuf.Empty + 84, // 153: grpc.Bridge.Version:output_type -> google.protobuf.StringValue + 84, // 154: grpc.Bridge.LogsPath:output_type -> google.protobuf.StringValue + 84, // 155: grpc.Bridge.LicensePath:output_type -> google.protobuf.StringValue + 84, // 156: grpc.Bridge.ReleaseNotesPageLink:output_type -> google.protobuf.StringValue + 84, // 157: grpc.Bridge.DependencyLicensesLink:output_type -> google.protobuf.StringValue + 84, // 158: grpc.Bridge.LandingPageLink:output_type -> google.protobuf.StringValue + 85, // 159: grpc.Bridge.SetColorSchemeName:output_type -> google.protobuf.Empty + 84, // 160: grpc.Bridge.ColorSchemeName:output_type -> google.protobuf.StringValue + 84, // 161: grpc.Bridge.CurrentEmailClient:output_type -> google.protobuf.StringValue + 85, // 162: grpc.Bridge.ReportBug:output_type -> google.protobuf.Empty + 85, // 163: grpc.Bridge.ForceLauncher:output_type -> google.protobuf.Empty + 85, // 164: grpc.Bridge.SetMainExecutable:output_type -> google.protobuf.Empty + 85, // 165: grpc.Bridge.RequestKnowledgeBaseSuggestions:output_type -> google.protobuf.Empty + 85, // 166: grpc.Bridge.Login:output_type -> google.protobuf.Empty + 85, // 167: grpc.Bridge.Login2FA:output_type -> google.protobuf.Empty + 85, // 168: grpc.Bridge.LoginFido:output_type -> google.protobuf.Empty + 85, // 169: grpc.Bridge.Login2Passwords:output_type -> google.protobuf.Empty + 85, // 170: grpc.Bridge.LoginAbort:output_type -> google.protobuf.Empty + 85, // 171: grpc.Bridge.FidoAssertionAbort:output_type -> google.protobuf.Empty + 85, // 172: grpc.Bridge.CheckUpdate:output_type -> google.protobuf.Empty + 85, // 173: grpc.Bridge.InstallUpdate:output_type -> google.protobuf.Empty + 85, // 174: grpc.Bridge.SetIsAutomaticUpdateOn:output_type -> google.protobuf.Empty + 86, // 175: grpc.Bridge.IsAutomaticUpdateOn:output_type -> google.protobuf.BoolValue + 84, // 176: grpc.Bridge.DiskCachePath:output_type -> google.protobuf.StringValue + 85, // 177: grpc.Bridge.SetDiskCachePath:output_type -> google.protobuf.Empty + 85, // 178: grpc.Bridge.SetIsDoHEnabled:output_type -> google.protobuf.Empty + 86, // 179: grpc.Bridge.IsDoHEnabled:output_type -> google.protobuf.BoolValue + 12, // 180: grpc.Bridge.MailServerSettings:output_type -> grpc.ImapSmtpSettings + 85, // 181: grpc.Bridge.SetMailServerSettings:output_type -> google.protobuf.Empty + 84, // 182: grpc.Bridge.Hostname:output_type -> google.protobuf.StringValue + 86, // 183: grpc.Bridge.IsPortFree:output_type -> google.protobuf.BoolValue + 13, // 184: grpc.Bridge.AvailableKeychains:output_type -> grpc.AvailableKeychainsResponse + 85, // 185: grpc.Bridge.SetCurrentKeychain:output_type -> google.protobuf.Empty + 84, // 186: grpc.Bridge.CurrentKeychain:output_type -> google.protobuf.StringValue + 17, // 187: grpc.Bridge.GetUserList:output_type -> grpc.UserListResponse + 14, // 188: grpc.Bridge.GetUser:output_type -> grpc.User + 85, // 189: grpc.Bridge.SetUserSplitMode:output_type -> google.protobuf.Empty + 85, // 190: grpc.Bridge.SendBadEventUserFeedback:output_type -> google.protobuf.Empty + 85, // 191: grpc.Bridge.LogoutUser:output_type -> google.protobuf.Empty + 85, // 192: grpc.Bridge.RemoveUser:output_type -> google.protobuf.Empty + 85, // 193: grpc.Bridge.ConfigureUserAppleMail:output_type -> google.protobuf.Empty + 86, // 194: grpc.Bridge.IsTLSCertificateInstalled:output_type -> google.protobuf.BoolValue + 85, // 195: grpc.Bridge.InstallTLSCertificate:output_type -> google.protobuf.Empty + 85, // 196: grpc.Bridge.ExportTLSCertificates:output_type -> google.protobuf.Empty + 20, // 197: grpc.Bridge.RunEventStream:output_type -> grpc.StreamEvent + 85, // 198: grpc.Bridge.StopEventStream:output_type -> google.protobuf.Empty + 85, // 199: grpc.Bridge.TriggerRepair:output_type -> google.protobuf.Empty + 137, // [137:200] is the sub-list for method output_type + 74, // [74:137] is the sub-list for method input_type + 74, // [74:74] is the sub-list for extension type_name + 74, // [74:74] is the sub-list for extension extendee + 0, // [0:74] is the sub-list for field type_name } func init() { file_bridge_proto_init() } @@ -6003,886 +5707,8 @@ func file_bridge_proto_init() { if File_bridge_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_bridge_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddLogEntryRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GuiReadyResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReportBugRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginAbortRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImapSmtpSettings); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AvailableKeychainsResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*User); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserSplitModeRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserBadEventFeedbackRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserListResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConfigureAppleMailRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*EventStreamRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AppEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InternetStatusEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ToggleAutostartFinishedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetFinishedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReportBugFinishedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReportBugSuccessEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReportBugErrorEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShowMainWindowEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReportBugFallbackEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CertificateInstallSuccessEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CertificateInstallCanceledEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CertificateInstallFailedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RepairStartedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AllUsersLoadedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KnowledgeBaseSuggestion); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KnowledgeBaseSuggestionsEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginErrorEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginTfaRequestedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginTwoPasswordsRequestedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginFinishedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginHvRequestedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateErrorEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateManualReadyEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateManualRestartNeededEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateForceEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateSilentRestartNeeded); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateIsLatestVersion); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateCheckFinished); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateVersionChanged); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DiskCacheEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DiskCacheErrorEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DiskCachePathChangedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DiskCachePathChangeFinishedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MailServerSettingsEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MailServerSettingsErrorEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MailServerSettingsChangedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangeMailServerSettingsFinishedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KeychainEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ChangeKeychainFinishedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HasNoKeychainEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RebuildKeychainEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MailEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddressChangedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddressChangedLogoutEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ApiCertIssueEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ToggleSplitModeFinishedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserDisconnectedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserChangedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserBadEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UsedBytesChangedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImapLoginFailedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncStartedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncFinishedEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncProgressEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserNotificationEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_bridge_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenericErrorEvent); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_bridge_proto_msgTypes[3].OneofWrappers = []interface{}{} - file_bridge_proto_msgTypes[13].OneofWrappers = []interface{}{ + file_bridge_proto_msgTypes[3].OneofWrappers = []any{} + file_bridge_proto_msgTypes[13].OneofWrappers = []any{ (*StreamEvent_App)(nil), (*StreamEvent_Login)(nil), (*StreamEvent_Update)(nil), @@ -6893,7 +5719,7 @@ func file_bridge_proto_init() { (*StreamEvent_User)(nil), (*StreamEvent_GenericError)(nil), } - file_bridge_proto_msgTypes[14].OneofWrappers = []interface{}{ + file_bridge_proto_msgTypes[14].OneofWrappers = []any{ (*AppEvent_InternetStatus)(nil), (*AppEvent_ToggleAutostartFinished)(nil), (*AppEvent_ResetFinished)(nil), @@ -6910,15 +5736,20 @@ func file_bridge_proto_init() { (*AppEvent_AllUsersLoaded)(nil), (*AppEvent_UserNotification)(nil), } - file_bridge_proto_msgTypes[30].OneofWrappers = []interface{}{ + file_bridge_proto_msgTypes[30].OneofWrappers = []any{ (*LoginEvent_Error)(nil), (*LoginEvent_TfaRequested)(nil), (*LoginEvent_TwoPasswordRequested)(nil), (*LoginEvent_Finished)(nil), (*LoginEvent_AlreadyLoggedIn)(nil), (*LoginEvent_HvRequested)(nil), + (*LoginEvent_FidoRequested)(nil), + (*LoginEvent_TfaOrFidoRequested)(nil), + (*LoginEvent_LoginFidoTouchRequested)(nil), + (*LoginEvent_LoginFidoTouchCompleted)(nil), + (*LoginEvent_LoginFidoPinRequired)(nil), } - file_bridge_proto_msgTypes[36].OneofWrappers = []interface{}{ + file_bridge_proto_msgTypes[40].OneofWrappers = []any{ (*UpdateEvent_Error)(nil), (*UpdateEvent_ManualReady)(nil), (*UpdateEvent_ManualRestartNeeded)(nil), @@ -6928,27 +5759,27 @@ func file_bridge_proto_init() { (*UpdateEvent_CheckFinished)(nil), (*UpdateEvent_VersionChanged)(nil), } - file_bridge_proto_msgTypes[45].OneofWrappers = []interface{}{ + file_bridge_proto_msgTypes[49].OneofWrappers = []any{ (*DiskCacheEvent_Error)(nil), (*DiskCacheEvent_PathChanged)(nil), (*DiskCacheEvent_PathChangeFinished)(nil), } - file_bridge_proto_msgTypes[49].OneofWrappers = []interface{}{ + file_bridge_proto_msgTypes[53].OneofWrappers = []any{ (*MailServerSettingsEvent_Error)(nil), (*MailServerSettingsEvent_MailServerSettingsChanged)(nil), (*MailServerSettingsEvent_ChangeMailServerSettingsFinished)(nil), } - file_bridge_proto_msgTypes[53].OneofWrappers = []interface{}{ + file_bridge_proto_msgTypes[57].OneofWrappers = []any{ (*KeychainEvent_ChangeKeychainFinished)(nil), (*KeychainEvent_HasNoKeychain)(nil), (*KeychainEvent_RebuildKeychain)(nil), } - file_bridge_proto_msgTypes[57].OneofWrappers = []interface{}{ + file_bridge_proto_msgTypes[61].OneofWrappers = []any{ (*MailEvent_AddressChanged)(nil), (*MailEvent_AddressChangedLogout)(nil), (*MailEvent_ApiCertIssue)(nil), } - file_bridge_proto_msgTypes[61].OneofWrappers = []interface{}{ + file_bridge_proto_msgTypes[65].OneofWrappers = []any{ (*UserEvent_ToggleSplitModeFinished)(nil), (*UserEvent_UserDisconnected)(nil), (*UserEvent_UserChanged)(nil), @@ -6963,9 +5794,9 @@ func file_bridge_proto_init() { out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_bridge_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_bridge_proto_rawDesc), len(file_bridge_proto_rawDesc)), NumEnums: 7, - NumMessages: 73, + NumMessages: 77, NumExtensions: 0, NumServices: 1, }, @@ -6975,7 +5806,6 @@ func file_bridge_proto_init() { MessageInfos: file_bridge_proto_msgTypes, }.Build() File_bridge_proto = out.File - file_bridge_proto_rawDesc = nil file_bridge_proto_goTypes = nil file_bridge_proto_depIdxs = nil } diff --git a/internal/frontend/grpc/bridge.proto b/internal/frontend/grpc/bridge.proto index 2161487f..0561d998 100644 --- a/internal/frontend/grpc/bridge.proto +++ b/internal/frontend/grpc/bridge.proto @@ -63,8 +63,10 @@ service Bridge { // login rpc Login(LoginRequest) returns (google.protobuf.Empty); rpc Login2FA(LoginRequest) returns (google.protobuf.Empty); + rpc LoginFido(LoginRequest) returns (google.protobuf.Empty); rpc Login2Passwords(LoginRequest) returns (google.protobuf.Empty); rpc LoginAbort(LoginAbortRequest) returns (google.protobuf.Empty); + rpc FidoAssertionAbort(LoginAbortRequest) returns (google.protobuf.Empty); // update rpc CheckUpdate(google.protobuf.Empty) returns (google.protobuf.Empty); @@ -313,6 +315,11 @@ message LoginEvent { LoginFinishedEvent finished = 4; LoginFinishedEvent alreadyLoggedIn = 5; LoginHvRequestedEvent hvRequested = 6; + LoginFidoRequestedEvent fidoRequested = 7; + LoginTfaOrFidoRequestedEvent tfaOrFidoRequested = 8; + LoginFidoTouchEvent loginFidoTouchRequested = 9; + LoginFidoTouchEvent loginFidoTouchCompleted = 10; + LoginFidoPinRequired loginFidoPinRequired = 11; } } @@ -325,6 +332,9 @@ enum LoginErrorType { TWO_PASSWORDS_ERROR = 5; TWO_PASSWORDS_ABORT = 6; HV_ERROR = 7; + FIDO_PIN_INVALID = 8; + FIDO_PIN_BLOCKED = 9; + FIDO_ERROR = 10; } message LoginErrorEvent { @@ -336,6 +346,22 @@ message LoginTfaRequestedEvent { string username = 1; } +message LoginFidoRequestedEvent { + string username = 1; +} + +message LoginTfaOrFidoRequestedEvent { + string username = 1; +} + +message LoginFidoTouchEvent { + string username = 1; +} + +message LoginFidoPinRequired { + string username = 1; +} + message LoginTwoPasswordsRequestedEvent { string username = 1; } diff --git a/internal/frontend/grpc/bridge_grpc.pb.go b/internal/frontend/grpc/bridge_grpc.pb.go index 8573e9d5..1bfbd703 100644 --- a/internal/frontend/grpc/bridge_grpc.pb.go +++ b/internal/frontend/grpc/bridge_grpc.pb.go @@ -17,8 +17,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v3.21.12 +// - protoc-gen-go-grpc v1.5.1 +// - protoc v5.29.5 // source: bridge.proto package grpc @@ -34,8 +34,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.64.0 or later. +const _ = grpc.SupportPackageIsVersion9 const ( Bridge_CheckTokens_FullMethodName = "/grpc.Bridge/CheckTokens" @@ -69,8 +69,10 @@ const ( Bridge_RequestKnowledgeBaseSuggestions_FullMethodName = "/grpc.Bridge/RequestKnowledgeBaseSuggestions" Bridge_Login_FullMethodName = "/grpc.Bridge/Login" Bridge_Login2FA_FullMethodName = "/grpc.Bridge/Login2FA" + Bridge_LoginFido_FullMethodName = "/grpc.Bridge/LoginFido" Bridge_Login2Passwords_FullMethodName = "/grpc.Bridge/Login2Passwords" Bridge_LoginAbort_FullMethodName = "/grpc.Bridge/LoginAbort" + Bridge_FidoAssertionAbort_FullMethodName = "/grpc.Bridge/FidoAssertionAbort" Bridge_CheckUpdate_FullMethodName = "/grpc.Bridge/CheckUpdate" Bridge_InstallUpdate_FullMethodName = "/grpc.Bridge/InstallUpdate" Bridge_SetIsAutomaticUpdateOn_FullMethodName = "/grpc.Bridge/SetIsAutomaticUpdateOn" @@ -104,6 +106,12 @@ const ( // BridgeClient is the client API for Bridge service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// ********************************************************************************************************************** +// +// Service Declaration +// +// **********************************************************************************************************************≠–– type BridgeClient interface { // App related calls CheckTokens(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*wrapperspb.StringValue, error) @@ -138,8 +146,10 @@ type BridgeClient interface { // login Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) Login2FA(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + LoginFido(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) Login2Passwords(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) LoginAbort(ctx context.Context, in *LoginAbortRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + FidoAssertionAbort(ctx context.Context, in *LoginAbortRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) // update CheckUpdate(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) InstallUpdate(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) @@ -172,7 +182,7 @@ type BridgeClient interface { InstallTLSCertificate(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) ExportTLSCertificates(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*emptypb.Empty, error) // Server -> Client event stream - RunEventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Bridge_RunEventStreamClient, error) + RunEventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[StreamEvent], error) StopEventStream(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) // Repair TriggerRepair(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) @@ -187,8 +197,9 @@ func NewBridgeClient(cc grpc.ClientConnInterface) BridgeClient { } func (c *bridgeClient) CheckTokens(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*wrapperspb.StringValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.StringValue) - err := c.cc.Invoke(ctx, Bridge_CheckTokens_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_CheckTokens_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -196,8 +207,9 @@ func (c *bridgeClient) CheckTokens(ctx context.Context, in *wrapperspb.StringVal } func (c *bridgeClient) AddLogEntry(ctx context.Context, in *AddLogEntryRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_AddLogEntry_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_AddLogEntry_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -205,8 +217,9 @@ func (c *bridgeClient) AddLogEntry(ctx context.Context, in *AddLogEntryRequest, } func (c *bridgeClient) GuiReady(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GuiReadyResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GuiReadyResponse) - err := c.cc.Invoke(ctx, Bridge_GuiReady_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_GuiReady_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -214,8 +227,9 @@ func (c *bridgeClient) GuiReady(ctx context.Context, in *emptypb.Empty, opts ... } func (c *bridgeClient) Quit(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_Quit_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_Quit_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -223,8 +237,9 @@ func (c *bridgeClient) Quit(ctx context.Context, in *emptypb.Empty, opts ...grpc } func (c *bridgeClient) Restart(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_Restart_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_Restart_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -232,8 +247,9 @@ func (c *bridgeClient) Restart(ctx context.Context, in *emptypb.Empty, opts ...g } func (c *bridgeClient) ShowOnStartup(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.BoolValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.BoolValue) - err := c.cc.Invoke(ctx, Bridge_ShowOnStartup_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_ShowOnStartup_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -241,8 +257,9 @@ func (c *bridgeClient) ShowOnStartup(ctx context.Context, in *emptypb.Empty, opt } func (c *bridgeClient) SetIsAutostartOn(ctx context.Context, in *wrapperspb.BoolValue, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_SetIsAutostartOn_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_SetIsAutostartOn_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -250,8 +267,9 @@ func (c *bridgeClient) SetIsAutostartOn(ctx context.Context, in *wrapperspb.Bool } func (c *bridgeClient) IsAutostartOn(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.BoolValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.BoolValue) - err := c.cc.Invoke(ctx, Bridge_IsAutostartOn_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_IsAutostartOn_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -259,8 +277,9 @@ func (c *bridgeClient) IsAutostartOn(ctx context.Context, in *emptypb.Empty, opt } func (c *bridgeClient) SetIsBetaEnabled(ctx context.Context, in *wrapperspb.BoolValue, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_SetIsBetaEnabled_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_SetIsBetaEnabled_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -268,8 +287,9 @@ func (c *bridgeClient) SetIsBetaEnabled(ctx context.Context, in *wrapperspb.Bool } func (c *bridgeClient) IsBetaEnabled(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.BoolValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.BoolValue) - err := c.cc.Invoke(ctx, Bridge_IsBetaEnabled_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_IsBetaEnabled_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -277,8 +297,9 @@ func (c *bridgeClient) IsBetaEnabled(ctx context.Context, in *emptypb.Empty, opt } func (c *bridgeClient) SetIsAllMailVisible(ctx context.Context, in *wrapperspb.BoolValue, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_SetIsAllMailVisible_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_SetIsAllMailVisible_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -286,8 +307,9 @@ func (c *bridgeClient) SetIsAllMailVisible(ctx context.Context, in *wrapperspb.B } func (c *bridgeClient) IsAllMailVisible(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.BoolValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.BoolValue) - err := c.cc.Invoke(ctx, Bridge_IsAllMailVisible_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_IsAllMailVisible_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -295,8 +317,9 @@ func (c *bridgeClient) IsAllMailVisible(ctx context.Context, in *emptypb.Empty, } func (c *bridgeClient) SetIsTelemetryDisabled(ctx context.Context, in *wrapperspb.BoolValue, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_SetIsTelemetryDisabled_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_SetIsTelemetryDisabled_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -304,8 +327,9 @@ func (c *bridgeClient) SetIsTelemetryDisabled(ctx context.Context, in *wrappersp } func (c *bridgeClient) IsTelemetryDisabled(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.BoolValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.BoolValue) - err := c.cc.Invoke(ctx, Bridge_IsTelemetryDisabled_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_IsTelemetryDisabled_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -313,8 +337,9 @@ func (c *bridgeClient) IsTelemetryDisabled(ctx context.Context, in *emptypb.Empt } func (c *bridgeClient) GoOs(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.StringValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.StringValue) - err := c.cc.Invoke(ctx, Bridge_GoOs_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_GoOs_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -322,8 +347,9 @@ func (c *bridgeClient) GoOs(ctx context.Context, in *emptypb.Empty, opts ...grpc } func (c *bridgeClient) TriggerReset(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_TriggerReset_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_TriggerReset_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -331,8 +357,9 @@ func (c *bridgeClient) TriggerReset(ctx context.Context, in *emptypb.Empty, opts } func (c *bridgeClient) Version(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.StringValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.StringValue) - err := c.cc.Invoke(ctx, Bridge_Version_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_Version_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -340,8 +367,9 @@ func (c *bridgeClient) Version(ctx context.Context, in *emptypb.Empty, opts ...g } func (c *bridgeClient) LogsPath(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.StringValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.StringValue) - err := c.cc.Invoke(ctx, Bridge_LogsPath_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_LogsPath_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -349,8 +377,9 @@ func (c *bridgeClient) LogsPath(ctx context.Context, in *emptypb.Empty, opts ... } func (c *bridgeClient) LicensePath(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.StringValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.StringValue) - err := c.cc.Invoke(ctx, Bridge_LicensePath_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_LicensePath_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -358,8 +387,9 @@ func (c *bridgeClient) LicensePath(ctx context.Context, in *emptypb.Empty, opts } func (c *bridgeClient) ReleaseNotesPageLink(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.StringValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.StringValue) - err := c.cc.Invoke(ctx, Bridge_ReleaseNotesPageLink_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_ReleaseNotesPageLink_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -367,8 +397,9 @@ func (c *bridgeClient) ReleaseNotesPageLink(ctx context.Context, in *emptypb.Emp } func (c *bridgeClient) DependencyLicensesLink(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.StringValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.StringValue) - err := c.cc.Invoke(ctx, Bridge_DependencyLicensesLink_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_DependencyLicensesLink_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -376,8 +407,9 @@ func (c *bridgeClient) DependencyLicensesLink(ctx context.Context, in *emptypb.E } func (c *bridgeClient) LandingPageLink(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.StringValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.StringValue) - err := c.cc.Invoke(ctx, Bridge_LandingPageLink_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_LandingPageLink_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -385,8 +417,9 @@ func (c *bridgeClient) LandingPageLink(ctx context.Context, in *emptypb.Empty, o } func (c *bridgeClient) SetColorSchemeName(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_SetColorSchemeName_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_SetColorSchemeName_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -394,8 +427,9 @@ func (c *bridgeClient) SetColorSchemeName(ctx context.Context, in *wrapperspb.St } func (c *bridgeClient) ColorSchemeName(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.StringValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.StringValue) - err := c.cc.Invoke(ctx, Bridge_ColorSchemeName_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_ColorSchemeName_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -403,8 +437,9 @@ func (c *bridgeClient) ColorSchemeName(ctx context.Context, in *emptypb.Empty, o } func (c *bridgeClient) CurrentEmailClient(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.StringValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.StringValue) - err := c.cc.Invoke(ctx, Bridge_CurrentEmailClient_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_CurrentEmailClient_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -412,8 +447,9 @@ func (c *bridgeClient) CurrentEmailClient(ctx context.Context, in *emptypb.Empty } func (c *bridgeClient) ReportBug(ctx context.Context, in *ReportBugRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_ReportBug_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_ReportBug_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -421,8 +457,9 @@ func (c *bridgeClient) ReportBug(ctx context.Context, in *ReportBugRequest, opts } func (c *bridgeClient) ForceLauncher(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_ForceLauncher_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_ForceLauncher_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -430,8 +467,9 @@ func (c *bridgeClient) ForceLauncher(ctx context.Context, in *wrapperspb.StringV } func (c *bridgeClient) SetMainExecutable(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_SetMainExecutable_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_SetMainExecutable_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -439,8 +477,9 @@ func (c *bridgeClient) SetMainExecutable(ctx context.Context, in *wrapperspb.Str } func (c *bridgeClient) RequestKnowledgeBaseSuggestions(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_RequestKnowledgeBaseSuggestions_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_RequestKnowledgeBaseSuggestions_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -448,8 +487,9 @@ func (c *bridgeClient) RequestKnowledgeBaseSuggestions(ctx context.Context, in * } func (c *bridgeClient) Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_Login_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_Login_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -457,8 +497,19 @@ func (c *bridgeClient) Login(ctx context.Context, in *LoginRequest, opts ...grpc } func (c *bridgeClient) Login2FA(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_Login2FA_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_Login2FA_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bridgeClient) LoginFido(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, Bridge_LoginFido_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -466,8 +517,9 @@ func (c *bridgeClient) Login2FA(ctx context.Context, in *LoginRequest, opts ...g } func (c *bridgeClient) Login2Passwords(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_Login2Passwords_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_Login2Passwords_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -475,8 +527,19 @@ func (c *bridgeClient) Login2Passwords(ctx context.Context, in *LoginRequest, op } func (c *bridgeClient) LoginAbort(ctx context.Context, in *LoginAbortRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_LoginAbort_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_LoginAbort_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *bridgeClient) FidoAssertionAbort(ctx context.Context, in *LoginAbortRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, Bridge_FidoAssertionAbort_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -484,8 +547,9 @@ func (c *bridgeClient) LoginAbort(ctx context.Context, in *LoginAbortRequest, op } func (c *bridgeClient) CheckUpdate(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_CheckUpdate_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_CheckUpdate_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -493,8 +557,9 @@ func (c *bridgeClient) CheckUpdate(ctx context.Context, in *emptypb.Empty, opts } func (c *bridgeClient) InstallUpdate(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_InstallUpdate_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_InstallUpdate_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -502,8 +567,9 @@ func (c *bridgeClient) InstallUpdate(ctx context.Context, in *emptypb.Empty, opt } func (c *bridgeClient) SetIsAutomaticUpdateOn(ctx context.Context, in *wrapperspb.BoolValue, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_SetIsAutomaticUpdateOn_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_SetIsAutomaticUpdateOn_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -511,8 +577,9 @@ func (c *bridgeClient) SetIsAutomaticUpdateOn(ctx context.Context, in *wrappersp } func (c *bridgeClient) IsAutomaticUpdateOn(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.BoolValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.BoolValue) - err := c.cc.Invoke(ctx, Bridge_IsAutomaticUpdateOn_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_IsAutomaticUpdateOn_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -520,8 +587,9 @@ func (c *bridgeClient) IsAutomaticUpdateOn(ctx context.Context, in *emptypb.Empt } func (c *bridgeClient) DiskCachePath(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.StringValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.StringValue) - err := c.cc.Invoke(ctx, Bridge_DiskCachePath_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_DiskCachePath_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -529,8 +597,9 @@ func (c *bridgeClient) DiskCachePath(ctx context.Context, in *emptypb.Empty, opt } func (c *bridgeClient) SetDiskCachePath(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_SetDiskCachePath_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_SetDiskCachePath_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -538,8 +607,9 @@ func (c *bridgeClient) SetDiskCachePath(ctx context.Context, in *wrapperspb.Stri } func (c *bridgeClient) SetIsDoHEnabled(ctx context.Context, in *wrapperspb.BoolValue, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_SetIsDoHEnabled_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_SetIsDoHEnabled_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -547,8 +617,9 @@ func (c *bridgeClient) SetIsDoHEnabled(ctx context.Context, in *wrapperspb.BoolV } func (c *bridgeClient) IsDoHEnabled(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.BoolValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.BoolValue) - err := c.cc.Invoke(ctx, Bridge_IsDoHEnabled_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_IsDoHEnabled_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -556,8 +627,9 @@ func (c *bridgeClient) IsDoHEnabled(ctx context.Context, in *emptypb.Empty, opts } func (c *bridgeClient) MailServerSettings(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ImapSmtpSettings, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(ImapSmtpSettings) - err := c.cc.Invoke(ctx, Bridge_MailServerSettings_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_MailServerSettings_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -565,8 +637,9 @@ func (c *bridgeClient) MailServerSettings(ctx context.Context, in *emptypb.Empty } func (c *bridgeClient) SetMailServerSettings(ctx context.Context, in *ImapSmtpSettings, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_SetMailServerSettings_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_SetMailServerSettings_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -574,8 +647,9 @@ func (c *bridgeClient) SetMailServerSettings(ctx context.Context, in *ImapSmtpSe } func (c *bridgeClient) Hostname(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.StringValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.StringValue) - err := c.cc.Invoke(ctx, Bridge_Hostname_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_Hostname_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -583,8 +657,9 @@ func (c *bridgeClient) Hostname(ctx context.Context, in *emptypb.Empty, opts ... } func (c *bridgeClient) IsPortFree(ctx context.Context, in *wrapperspb.Int32Value, opts ...grpc.CallOption) (*wrapperspb.BoolValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.BoolValue) - err := c.cc.Invoke(ctx, Bridge_IsPortFree_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_IsPortFree_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -592,8 +667,9 @@ func (c *bridgeClient) IsPortFree(ctx context.Context, in *wrapperspb.Int32Value } func (c *bridgeClient) AvailableKeychains(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*AvailableKeychainsResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(AvailableKeychainsResponse) - err := c.cc.Invoke(ctx, Bridge_AvailableKeychains_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_AvailableKeychains_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -601,8 +677,9 @@ func (c *bridgeClient) AvailableKeychains(ctx context.Context, in *emptypb.Empty } func (c *bridgeClient) SetCurrentKeychain(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_SetCurrentKeychain_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_SetCurrentKeychain_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -610,8 +687,9 @@ func (c *bridgeClient) SetCurrentKeychain(ctx context.Context, in *wrapperspb.St } func (c *bridgeClient) CurrentKeychain(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.StringValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.StringValue) - err := c.cc.Invoke(ctx, Bridge_CurrentKeychain_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_CurrentKeychain_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -619,8 +697,9 @@ func (c *bridgeClient) CurrentKeychain(ctx context.Context, in *emptypb.Empty, o } func (c *bridgeClient) GetUserList(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*UserListResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(UserListResponse) - err := c.cc.Invoke(ctx, Bridge_GetUserList_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_GetUserList_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -628,8 +707,9 @@ func (c *bridgeClient) GetUserList(ctx context.Context, in *emptypb.Empty, opts } func (c *bridgeClient) GetUser(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*User, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(User) - err := c.cc.Invoke(ctx, Bridge_GetUser_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_GetUser_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -637,8 +717,9 @@ func (c *bridgeClient) GetUser(ctx context.Context, in *wrapperspb.StringValue, } func (c *bridgeClient) SetUserSplitMode(ctx context.Context, in *UserSplitModeRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_SetUserSplitMode_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_SetUserSplitMode_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -646,8 +727,9 @@ func (c *bridgeClient) SetUserSplitMode(ctx context.Context, in *UserSplitModeRe } func (c *bridgeClient) SendBadEventUserFeedback(ctx context.Context, in *UserBadEventFeedbackRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_SendBadEventUserFeedback_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_SendBadEventUserFeedback_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -655,8 +737,9 @@ func (c *bridgeClient) SendBadEventUserFeedback(ctx context.Context, in *UserBad } func (c *bridgeClient) LogoutUser(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_LogoutUser_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_LogoutUser_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -664,8 +747,9 @@ func (c *bridgeClient) LogoutUser(ctx context.Context, in *wrapperspb.StringValu } func (c *bridgeClient) RemoveUser(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_RemoveUser_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_RemoveUser_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -673,8 +757,9 @@ func (c *bridgeClient) RemoveUser(ctx context.Context, in *wrapperspb.StringValu } func (c *bridgeClient) ConfigureUserAppleMail(ctx context.Context, in *ConfigureAppleMailRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_ConfigureUserAppleMail_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_ConfigureUserAppleMail_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -682,8 +767,9 @@ func (c *bridgeClient) ConfigureUserAppleMail(ctx context.Context, in *Configure } func (c *bridgeClient) IsTLSCertificateInstalled(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*wrapperspb.BoolValue, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(wrapperspb.BoolValue) - err := c.cc.Invoke(ctx, Bridge_IsTLSCertificateInstalled_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_IsTLSCertificateInstalled_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -691,8 +777,9 @@ func (c *bridgeClient) IsTLSCertificateInstalled(ctx context.Context, in *emptyp } func (c *bridgeClient) InstallTLSCertificate(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_InstallTLSCertificate_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_InstallTLSCertificate_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -700,20 +787,22 @@ func (c *bridgeClient) InstallTLSCertificate(ctx context.Context, in *emptypb.Em } func (c *bridgeClient) ExportTLSCertificates(ctx context.Context, in *wrapperspb.StringValue, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_ExportTLSCertificates_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_ExportTLSCertificates_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *bridgeClient) RunEventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (Bridge_RunEventStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &Bridge_ServiceDesc.Streams[0], Bridge_RunEventStream_FullMethodName, opts...) +func (c *bridgeClient) RunEventStream(ctx context.Context, in *EventStreamRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[StreamEvent], error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &Bridge_ServiceDesc.Streams[0], Bridge_RunEventStream_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &bridgeRunEventStreamClient{stream} + x := &grpc.GenericClientStream[EventStreamRequest, StreamEvent]{ClientStream: stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -723,26 +812,13 @@ func (c *bridgeClient) RunEventStream(ctx context.Context, in *EventStreamReques return x, nil } -type Bridge_RunEventStreamClient interface { - Recv() (*StreamEvent, error) - grpc.ClientStream -} - -type bridgeRunEventStreamClient struct { - grpc.ClientStream -} - -func (x *bridgeRunEventStreamClient) Recv() (*StreamEvent, error) { - m := new(StreamEvent) - if err := x.ClientStream.RecvMsg(m); err != nil { - return nil, err - } - return m, nil -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type Bridge_RunEventStreamClient = grpc.ServerStreamingClient[StreamEvent] func (c *bridgeClient) StopEventStream(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_StopEventStream_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_StopEventStream_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -750,8 +826,9 @@ func (c *bridgeClient) StopEventStream(ctx context.Context, in *emptypb.Empty, o } func (c *bridgeClient) TriggerRepair(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) - err := c.cc.Invoke(ctx, Bridge_TriggerRepair_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, Bridge_TriggerRepair_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -760,7 +837,13 @@ func (c *bridgeClient) TriggerRepair(ctx context.Context, in *emptypb.Empty, opt // BridgeServer is the server API for Bridge service. // All implementations must embed UnimplementedBridgeServer -// for forward compatibility +// for forward compatibility. +// +// ********************************************************************************************************************** +// +// Service Declaration +// +// **********************************************************************************************************************≠–– type BridgeServer interface { // App related calls CheckTokens(context.Context, *wrapperspb.StringValue) (*wrapperspb.StringValue, error) @@ -795,8 +878,10 @@ type BridgeServer interface { // login Login(context.Context, *LoginRequest) (*emptypb.Empty, error) Login2FA(context.Context, *LoginRequest) (*emptypb.Empty, error) + LoginFido(context.Context, *LoginRequest) (*emptypb.Empty, error) Login2Passwords(context.Context, *LoginRequest) (*emptypb.Empty, error) LoginAbort(context.Context, *LoginAbortRequest) (*emptypb.Empty, error) + FidoAssertionAbort(context.Context, *LoginAbortRequest) (*emptypb.Empty, error) // update CheckUpdate(context.Context, *emptypb.Empty) (*emptypb.Empty, error) InstallUpdate(context.Context, *emptypb.Empty) (*emptypb.Empty, error) @@ -829,16 +914,19 @@ type BridgeServer interface { InstallTLSCertificate(context.Context, *emptypb.Empty) (*emptypb.Empty, error) ExportTLSCertificates(context.Context, *wrapperspb.StringValue) (*emptypb.Empty, error) // Server -> Client event stream - RunEventStream(*EventStreamRequest, Bridge_RunEventStreamServer) error + RunEventStream(*EventStreamRequest, grpc.ServerStreamingServer[StreamEvent]) error StopEventStream(context.Context, *emptypb.Empty) (*emptypb.Empty, error) // Repair TriggerRepair(context.Context, *emptypb.Empty) (*emptypb.Empty, error) mustEmbedUnimplementedBridgeServer() } -// UnimplementedBridgeServer must be embedded to have forward compatible implementations. -type UnimplementedBridgeServer struct { -} +// UnimplementedBridgeServer must be embedded to have +// forward compatible implementations. +// +// NOTE: this should be embedded by value instead of pointer to avoid a nil +// pointer dereference when methods are called. +type UnimplementedBridgeServer struct{} func (UnimplementedBridgeServer) CheckTokens(context.Context, *wrapperspb.StringValue) (*wrapperspb.StringValue, error) { return nil, status.Errorf(codes.Unimplemented, "method CheckTokens not implemented") @@ -933,12 +1021,18 @@ func (UnimplementedBridgeServer) Login(context.Context, *LoginRequest) (*emptypb func (UnimplementedBridgeServer) Login2FA(context.Context, *LoginRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Login2FA not implemented") } +func (UnimplementedBridgeServer) LoginFido(context.Context, *LoginRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method LoginFido not implemented") +} func (UnimplementedBridgeServer) Login2Passwords(context.Context, *LoginRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Login2Passwords not implemented") } func (UnimplementedBridgeServer) LoginAbort(context.Context, *LoginAbortRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method LoginAbort not implemented") } +func (UnimplementedBridgeServer) FidoAssertionAbort(context.Context, *LoginAbortRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method FidoAssertionAbort not implemented") +} func (UnimplementedBridgeServer) CheckUpdate(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method CheckUpdate not implemented") } @@ -1014,7 +1108,7 @@ func (UnimplementedBridgeServer) InstallTLSCertificate(context.Context, *emptypb func (UnimplementedBridgeServer) ExportTLSCertificates(context.Context, *wrapperspb.StringValue) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method ExportTLSCertificates not implemented") } -func (UnimplementedBridgeServer) RunEventStream(*EventStreamRequest, Bridge_RunEventStreamServer) error { +func (UnimplementedBridgeServer) RunEventStream(*EventStreamRequest, grpc.ServerStreamingServer[StreamEvent]) error { return status.Errorf(codes.Unimplemented, "method RunEventStream not implemented") } func (UnimplementedBridgeServer) StopEventStream(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { @@ -1024,6 +1118,7 @@ func (UnimplementedBridgeServer) TriggerRepair(context.Context, *emptypb.Empty) return nil, status.Errorf(codes.Unimplemented, "method TriggerRepair not implemented") } func (UnimplementedBridgeServer) mustEmbedUnimplementedBridgeServer() {} +func (UnimplementedBridgeServer) testEmbeddedByValue() {} // UnsafeBridgeServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to BridgeServer will @@ -1033,6 +1128,13 @@ type UnsafeBridgeServer interface { } func RegisterBridgeServer(s grpc.ServiceRegistrar, srv BridgeServer) { + // If the following call pancis, it indicates UnimplementedBridgeServer was + // embedded by pointer and is nil. This will cause panics if an + // unimplemented method is ever invoked, so we test this at initialization + // time to prevent it from happening at runtime later due to I/O. + if t, ok := srv.(interface{ testEmbeddedByValue() }); ok { + t.testEmbeddedByValue() + } s.RegisterService(&Bridge_ServiceDesc, srv) } @@ -1594,6 +1696,24 @@ func _Bridge_Login2FA_Handler(srv interface{}, ctx context.Context, dec func(int return interceptor(ctx, in, info, handler) } +func _Bridge_LoginFido_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LoginRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BridgeServer).LoginFido(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Bridge_LoginFido_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BridgeServer).LoginFido(ctx, req.(*LoginRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Bridge_Login2Passwords_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(LoginRequest) if err := dec(in); err != nil { @@ -1630,6 +1750,24 @@ func _Bridge_LoginAbort_Handler(srv interface{}, ctx context.Context, dec func(i return interceptor(ctx, in, info, handler) } +func _Bridge_FidoAssertionAbort_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(LoginAbortRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(BridgeServer).FidoAssertionAbort(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Bridge_FidoAssertionAbort_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(BridgeServer).FidoAssertionAbort(ctx, req.(*LoginAbortRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Bridge_CheckUpdate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(emptypb.Empty) if err := dec(in); err != nil { @@ -2085,21 +2223,11 @@ func _Bridge_RunEventStream_Handler(srv interface{}, stream grpc.ServerStream) e if err := stream.RecvMsg(m); err != nil { return err } - return srv.(BridgeServer).RunEventStream(m, &bridgeRunEventStreamServer{stream}) + return srv.(BridgeServer).RunEventStream(m, &grpc.GenericServerStream[EventStreamRequest, StreamEvent]{ServerStream: stream}) } -type Bridge_RunEventStreamServer interface { - Send(*StreamEvent) error - grpc.ServerStream -} - -type bridgeRunEventStreamServer struct { - grpc.ServerStream -} - -func (x *bridgeRunEventStreamServer) Send(m *StreamEvent) error { - return x.ServerStream.SendMsg(m) -} +// This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. +type Bridge_RunEventStreamServer = grpc.ServerStreamingServer[StreamEvent] func _Bridge_StopEventStream_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(emptypb.Empty) @@ -2268,6 +2396,10 @@ var Bridge_ServiceDesc = grpc.ServiceDesc{ MethodName: "Login2FA", Handler: _Bridge_Login2FA_Handler, }, + { + MethodName: "LoginFido", + Handler: _Bridge_LoginFido_Handler, + }, { MethodName: "Login2Passwords", Handler: _Bridge_Login2Passwords_Handler, @@ -2276,6 +2408,10 @@ var Bridge_ServiceDesc = grpc.ServiceDesc{ MethodName: "LoginAbort", Handler: _Bridge_LoginAbort_Handler, }, + { + MethodName: "FidoAssertionAbort", + Handler: _Bridge_FidoAssertionAbort_Handler, + }, { MethodName: "CheckUpdate", Handler: _Bridge_CheckUpdate_Handler, diff --git a/internal/frontend/grpc/event_factory.go b/internal/frontend/grpc/event_factory.go index 2d563836..f5ea2703 100644 --- a/internal/frontend/grpc/event_factory.go +++ b/internal/frontend/grpc/event_factory.go @@ -89,6 +89,26 @@ func NewLoginTfaRequestedEvent(username string) *StreamEvent { return loginEvent(&LoginEvent{Event: &LoginEvent_TfaRequested{TfaRequested: &LoginTfaRequestedEvent{Username: username}}}) } +func NewLoginFidoRequestedEvent(username string) *StreamEvent { + return loginEvent(&LoginEvent{Event: &LoginEvent_FidoRequested{FidoRequested: &LoginFidoRequestedEvent{Username: username}}}) +} + +func NewLoginTfaOrFidoRequestedEvent(username string) *StreamEvent { + return loginEvent(&LoginEvent{Event: &LoginEvent_TfaOrFidoRequested{TfaOrFidoRequested: &LoginTfaOrFidoRequestedEvent{Username: username}}}) +} + +func NewLoginFidoTouchRequested(username string) *StreamEvent { + return loginEvent(&LoginEvent{Event: &LoginEvent_LoginFidoTouchRequested{LoginFidoTouchRequested: &LoginFidoTouchEvent{Username: username}}}) +} + +func NewLoginFidoTouchCompleted(username string) *StreamEvent { + return loginEvent(&LoginEvent{Event: &LoginEvent_LoginFidoTouchCompleted{LoginFidoTouchCompleted: &LoginFidoTouchEvent{Username: username}}}) +} + +func NewLoginFidoPinRequired(username string) *StreamEvent { + return loginEvent(&LoginEvent{Event: &LoginEvent_LoginFidoPinRequired{LoginFidoPinRequired: &LoginFidoPinRequired{Username: username}}}) +} + func NewLoginTwoPasswordsRequestedEvent(username string) *StreamEvent { return loginEvent(&LoginEvent{Event: &LoginEvent_TwoPasswordRequested{TwoPasswordRequested: &LoginTwoPasswordsRequestedEvent{Username: username}}}) } diff --git a/internal/frontend/grpc/fido.go b/internal/frontend/grpc/fido.go new file mode 100644 index 00000000..4c505ecb --- /dev/null +++ b/internal/frontend/grpc/fido.go @@ -0,0 +1,111 @@ +// Copyright (c) 2025 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 . + +//go:build linux || darwin + +package grpc + +import ( + "context" + "errors" + "fmt" + + "github.com/ProtonMail/gluon/async" + "github.com/ProtonMail/proton-bridge/v3/internal/fido" + "github.com/keys-pub/go-libfido2" + "google.golang.org/protobuf/types/known/emptypb" +) + +func (s *Service) LoginFido(_ context.Context, login *LoginRequest) (*emptypb.Empty, error) { + s.log.WithField("username", login.Username).Debug("LoginFido") + + go func() { + defer async.HandlePanic(s.panicHandler) + + fidoCtx, cancelFido := context.WithCancel(context.Background()) + s.fidoManager.SetCancel(cancelFido) + defer s.fidoManager.Clear() + + if s.auth.UID == "" || s.authClient == nil { + s.log.Errorf("Login FIDO: authentication incomplete %s %p", s.auth.UID, s.authClient) + _ = s.SendEvent(NewLoginError(LoginErrorType_FIDO_ERROR, "Missing authentication, try again.")) + s.loginClean() + return + } + + pinSupported, err := fido.IsPinSupported() + if err != nil { + s.log.WithError(err).Warn("could not determine security key PIN requirements") + _ = s.SendEvent(NewLoginError(LoginErrorType_FIDO_ERROR, fmt.Sprintf("Could not obtain security key pin requirements: %s", err))) + s.loginClean() + return + } + + if pinSupported && len(login.Password) == 0 { + _ = s.SendEvent(NewLoginFidoPinRequired(login.Username)) + return + } + + pin, err := base64Decode(login.Password) + if err != nil { + s.log.WithError(err).Error("cannot decode security key device pin") + _ = s.SendEvent(NewLoginError(LoginErrorType_FIDO_PIN_INVALID, "Could not decode security key PIN")) + return + } + + touchCh := make(chan struct{}) + touchConfirmCh := make(chan struct{}) + + defer func() { + close(touchCh) + close(touchConfirmCh) + }() + + go func() { + if _, ok := <-touchCh; ok { + _ = s.SendEvent(NewLoginFidoTouchRequested(login.Username)) + if _, ok := <-touchConfirmCh; ok { + _ = s.SendEvent(NewLoginFidoTouchCompleted(login.Username)) + } + } + }() + + if err := fido.AuthWithHardwareKeyGUI(fidoCtx, s.authClient, s.auth, touchCh, touchConfirmCh, string(pin)); err != nil { + s.log.WithError(err).Warn("Login FIDO: failed") + switch { + case errors.Is(err, libfido2.ErrPinAuthBlocked): + _ = s.SendEvent(NewLoginError(LoginErrorType_FIDO_PIN_BLOCKED, "Security key PIN code is blocked")) + + case errors.Is(err, libfido2.ErrPinInvalid): + _ = s.SendEvent(NewLoginError(LoginErrorType_FIDO_PIN_INVALID, "Security key PIN code is incorrect")) + + case errors.Is(err, fido.ErrAssertionCancelled): // User cancellation, they can click re-auth again. + return + + default: + _ = s.SendEvent(NewLoginError(LoginErrorType_FIDO_ERROR, fmt.Sprintf("Security key authentication failed: %s", err))) + s.loginClean() + } + + return + } + + s.finishLogin() + }() + + return &emptypb.Empty{}, nil +} diff --git a/internal/frontend/grpc/fido/manager.go b/internal/frontend/grpc/fido/manager.go new file mode 100644 index 00000000..a27cbfd8 --- /dev/null +++ b/internal/frontend/grpc/fido/manager.go @@ -0,0 +1,55 @@ +// Copyright (c) 2025 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 . + +package fido + +import ( + "context" + "sync" +) + +type Manager struct { + mu sync.Mutex + cancel context.CancelFunc +} + +func (fm *Manager) withLock(fn func()) { + fm.mu.Lock() + defer fm.mu.Unlock() + fn() +} + +func (fm *Manager) SetCancel(cancel context.CancelFunc) { + fm.withLock(func() { + fm.cancel = cancel + }) +} + +func (fm *Manager) Cancel() { + fm.withLock(func() { + if fm.cancel != nil { + fm.cancel() + fm.cancel = nil + } + }) +} + +func (fm *Manager) Clear() { + fm.withLock(func() { + fm.cancel = nil + }) +} diff --git a/internal/frontend/grpc/fido_windows.go b/internal/frontend/grpc/fido_windows.go new file mode 100644 index 00000000..183b7f73 --- /dev/null +++ b/internal/frontend/grpc/fido_windows.go @@ -0,0 +1,53 @@ +// Copyright (c) 2025 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 . + +//go:build windows + +package grpc + +import ( + "context" + "fmt" + + "github.com/ProtonMail/gluon/async" + "github.com/ProtonMail/proton-bridge/v3/internal/fido" + "google.golang.org/protobuf/types/known/emptypb" +) + +func (s *Service) LoginFido(_ context.Context, login *LoginRequest) (*emptypb.Empty, error) { + s.log.WithField("username", login.Username).Debug("LoginFido") + go func() { + defer async.HandlePanic(s.panicHandler) + + if s.auth.UID == "" || s.authClient == nil { + s.log.Errorf("Login FIDO: authentication incomplete %s %p", s.auth.UID, s.authClient) + _ = s.SendEvent(NewLoginError(LoginErrorType_TFA_ABORT, "Missing authentication, try again.")) + s.loginClean() + return + } + + if err := fido.AuthWithHardwareKeyGUI(s.authClient, s.auth, false); err != nil { + _ = s.SendEvent(NewLoginError(LoginErrorType_FIDO_ERROR, fmt.Sprintf("Security key authentication failed: %s", err))) + s.loginClean() + return + } + + s.finishLogin() + }() + + return &emptypb.Empty{}, nil +} diff --git a/internal/frontend/grpc/service.go b/internal/frontend/grpc/service.go index 29aa8890..612cddb6 100644 --- a/internal/frontend/grpc/service.go +++ b/internal/frontend/grpc/service.go @@ -38,6 +38,7 @@ import ( "github.com/ProtonMail/proton-bridge/v3/internal/bridge" "github.com/ProtonMail/proton-bridge/v3/internal/certs" "github.com/ProtonMail/proton-bridge/v3/internal/events" + "github.com/ProtonMail/proton-bridge/v3/internal/frontend/grpc/fido" "github.com/ProtonMail/proton-bridge/v3/internal/hv" "github.com/ProtonMail/proton-bridge/v3/internal/platform" "github.com/ProtonMail/proton-bridge/v3/internal/safe" @@ -102,6 +103,8 @@ type Service struct { // nolint:structcheck hvDetails *proton.APIHVDetails useHvDetails bool + + fidoManager *fido.Manager } // NewService returns a new instance of the service. @@ -187,6 +190,8 @@ func NewService( parentPID: parentPID, parentPIDDoneCh: make(chan struct{}), showOnStartup: showOnStartup, + + fidoManager: &fido.Manager{}, } // Initializing.Done is only called sync.Once. Please keep the increment set to 1 diff --git a/internal/frontend/grpc/service_methods.go b/internal/frontend/grpc/service_methods.go index c1b721c9..e602f52f 100644 --- a/internal/frontend/grpc/service_methods.go +++ b/internal/frontend/grpc/service_methods.go @@ -35,6 +35,7 @@ import ( "github.com/ProtonMail/proton-bridge/v3/internal/platform" "github.com/ProtonMail/proton-bridge/v3/internal/safe" "github.com/ProtonMail/proton-bridge/v3/internal/service" + "github.com/ProtonMail/proton-bridge/v3/internal/unleash" "github.com/ProtonMail/proton-bridge/v3/internal/updater" "github.com/ProtonMail/proton-bridge/v3/pkg/ports" "github.com/sirupsen/logrus" @@ -500,10 +501,27 @@ func (s *Service) Login(_ context.Context, login *LoginRequest) (*emptypb.Empty, s.authClient = client s.auth = auth + u2fLoginEnabled := s.bridge.GetFeatureFlagValue(unleash.InboxBridgeU2FLoginEnabled) + switch { - case auth.TwoFA.Enabled&proton.HasTOTP != 0: + case auth.TwoFA.Enabled == proton.HasTOTP: _ = s.SendEvent(NewLoginTfaRequestedEvent(login.Username)) + case auth.TwoFA.Enabled == proton.HasFIDO2: + if !u2fLoginEnabled { + // Such a case may only occur to internal users. + _ = s.SendEvent(NewLoginError(LoginErrorType_FIDO_ERROR, "Security key authentication required but not enabled in server configuration.")) + return + } + _ = s.SendEvent(NewLoginFidoRequestedEvent(login.Username)) + + case auth.TwoFA.Enabled == proton.HasFIDO2AndTOTP: + if u2fLoginEnabled { + _ = s.SendEvent(NewLoginTfaOrFidoRequestedEvent(login.Username)) + } else { + _ = s.SendEvent(NewLoginTfaRequestedEvent(login.Username)) + } + case auth.PasswordMode == proton.TwoPasswordMode: _ = s.SendEvent(NewLoginTwoPasswordsRequestedEvent(login.Username)) @@ -582,6 +600,17 @@ func (s *Service) Login2Passwords(_ context.Context, login *LoginRequest) (*empt return &emptypb.Empty{}, nil } +func (s *Service) FidoAssertionAbort(_ context.Context, loginAbort *LoginAbortRequest) (*emptypb.Empty, error) { + s.log.WithField("username", loginAbort.Username).Debug("FidoAssertionAbort") + + go func() { + defer async.HandlePanic(s.panicHandler) + s.fidoManager.Cancel() + }() + + return &emptypb.Empty{}, nil +} + func (s *Service) LoginAbort(_ context.Context, loginAbort *LoginAbortRequest) (*emptypb.Empty, error) { s.log.WithField("username", loginAbort.Username).Debug("LoginAbort") diff --git a/internal/unleash/service.go b/internal/unleash/service.go index 3046d73a..e432507c 100644 --- a/internal/unleash/service.go +++ b/internal/unleash/service.go @@ -47,6 +47,7 @@ const ( InternalLabelConflictResolverDisabled = "InboxBridgeUnexpectedFoldersLabelsStartupFixupDisabled" InternalLabelConflictNonEmptyMailboxDeletion = "InboxBridgeUnknownNonEmptyMailboxDeletion" LinuxVaultPreferredKeychainNotAvailableRetryDisabled = "InboxBridgeLinuxVaultPreferredKeychainNotAvailableRetryDisabled" + InboxBridgeU2FLoginEnabled = "InboxBridgeU2FLogin" ) type FeatureFlagValueProvider interface { diff --git a/tests/ctx_bridge_test.go b/tests/ctx_bridge_test.go index b0752c41..a304319a 100644 --- a/tests/ctx_bridge_test.go +++ b/tests/ctx_bridge_test.go @@ -306,8 +306,7 @@ func (t *testCtx) initFrontendClient() error { target = fmt.Sprintf("%v:%d", constants.Host, cfg.Port) } - conn, err := grpc.DialContext( - context.Background(), + conn, err := grpc.NewClient( target, grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{RootCAs: cp, ServerName: "127.0.0.1"})), grpc.WithUnaryInterceptor(func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {