mirror of
https://github.com/ProtonMail/proton-bridge.git
synced 2025-12-15 14:56:42 +00:00
chore: (BRIDGE-253) removing unused telemetry (activation and troubleshooting)
This commit is contained in:
@ -1,219 +0,0 @@
|
||||
// Copyright (c) 2024 Proton AG
|
||||
//
|
||||
// This file is part of Proton Mail Bridge.
|
||||
//
|
||||
// Proton Mail Bridge is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// Proton Mail Bridge is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with Proton Mail Bridge. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package user
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
|
||||
"github.com/ProtonMail/gluon/reporter"
|
||||
"github.com/ProtonMail/proton-bridge/v3/internal/configstatus"
|
||||
"github.com/ProtonMail/proton-bridge/v3/internal/kb"
|
||||
)
|
||||
|
||||
func (user *User) SendConfigStatusSuccess(ctx context.Context) {
|
||||
if user.configStatus.IsFromFailure() {
|
||||
user.SendConfigStatusRecovery(ctx)
|
||||
return
|
||||
}
|
||||
if !user.IsTelemetryEnabled(ctx) {
|
||||
return
|
||||
}
|
||||
if !user.configStatus.IsPending() {
|
||||
return
|
||||
}
|
||||
|
||||
var builder configstatus.ConfigSuccessBuilder
|
||||
success := builder.New(user.configStatus)
|
||||
data, err := json.Marshal(success)
|
||||
if err != nil {
|
||||
if err := user.reporter.ReportMessageWithContext("Cannot parse config_success data.", reporter.Context{
|
||||
"error": err,
|
||||
}); err != nil {
|
||||
user.log.WithError(err).Error("Failed to report config_success data parsing error.")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if err := user.SendTelemetry(ctx, data); err == nil {
|
||||
user.log.Info("Configuration Status Success event sent.")
|
||||
if err := user.configStatus.ApplySuccess(); err != nil {
|
||||
user.log.WithError(err).Error("Failed to ApplySuccess on config_status.")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (user *User) SendConfigStatusAbort(ctx context.Context, withTelemetry bool) {
|
||||
if err := user.configStatus.Remove(); err != nil {
|
||||
user.log.WithError(err).Error("Failed to remove config_status file.")
|
||||
}
|
||||
|
||||
if !user.configStatus.IsPending() {
|
||||
return
|
||||
}
|
||||
if !withTelemetry || !user.IsTelemetryEnabled(ctx) {
|
||||
return
|
||||
}
|
||||
var builder configstatus.ConfigAbortBuilder
|
||||
abort := builder.New(user.configStatus)
|
||||
data, err := json.Marshal(abort)
|
||||
if err != nil {
|
||||
if err := user.reporter.ReportMessageWithContext("Cannot parse config_abort data.", reporter.Context{
|
||||
"error": err,
|
||||
}); err != nil {
|
||||
user.log.WithError(err).Error("Failed to report config_abort data parsing error.")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if err := user.SendTelemetry(ctx, data); err == nil {
|
||||
user.log.Info("Configuration Status Abort event sent.")
|
||||
}
|
||||
}
|
||||
|
||||
func (user *User) SendConfigStatusRecovery(ctx context.Context) {
|
||||
if !user.configStatus.IsFromFailure() {
|
||||
user.SendConfigStatusSuccess(ctx)
|
||||
return
|
||||
}
|
||||
if !user.IsTelemetryEnabled(ctx) {
|
||||
return
|
||||
}
|
||||
if !user.configStatus.IsPending() {
|
||||
return
|
||||
}
|
||||
|
||||
var builder configstatus.ConfigRecoveryBuilder
|
||||
success := builder.New(user.configStatus)
|
||||
data, err := json.Marshal(success)
|
||||
if err != nil {
|
||||
if err := user.reporter.ReportMessageWithContext("Cannot parse config_recovery data.", reporter.Context{
|
||||
"error": err,
|
||||
}); err != nil {
|
||||
user.log.WithError(err).Error("Failed to report config_recovery data parsing error.")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if err := user.SendTelemetry(ctx, data); err == nil {
|
||||
user.log.Info("Configuration Status Recovery event sent.")
|
||||
if err := user.configStatus.ApplySuccess(); err != nil {
|
||||
user.log.WithError(err).Error("Failed to ApplySuccess on config_status.")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (user *User) SendConfigStatusProgress(ctx context.Context) {
|
||||
if !user.IsTelemetryEnabled(ctx) {
|
||||
return
|
||||
}
|
||||
if !user.configStatus.IsPending() {
|
||||
return
|
||||
}
|
||||
var builder configstatus.ConfigProgressBuilder
|
||||
progress := builder.New(user.configStatus)
|
||||
if progress.Values.NbDay == 0 {
|
||||
return
|
||||
}
|
||||
if progress.Values.NbDaySinceLast == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
data, err := json.Marshal(progress)
|
||||
if err != nil {
|
||||
if err := user.reporter.ReportMessageWithContext("Cannot parse config_progress data.", reporter.Context{
|
||||
"error": err,
|
||||
}); err != nil {
|
||||
user.log.WithError(err).Error("Failed to report config_progress data parsing error.")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if err := user.SendTelemetry(ctx, data); err == nil {
|
||||
user.log.Info("Configuration Status Progress event sent.")
|
||||
if err := user.configStatus.ApplyProgress(); err != nil {
|
||||
user.log.WithError(err).Error("Failed to ApplyProgress on config_status.")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (user *User) ReportConfigStatusFailure(errDetails string) {
|
||||
if user.configStatus.IsPending() {
|
||||
return
|
||||
}
|
||||
|
||||
if err := user.configStatus.ApplyFailure(errDetails); err != nil {
|
||||
user.log.WithError(err).Error("Failed to ApplyFailure on config_status.")
|
||||
} else {
|
||||
user.log.Info("Configuration Status is back to Pending due to Failure.")
|
||||
}
|
||||
}
|
||||
|
||||
func (user *User) ReportBugClicked() {
|
||||
if !user.configStatus.IsPending() {
|
||||
return
|
||||
}
|
||||
|
||||
if err := user.configStatus.ReportClicked(); err != nil {
|
||||
user.log.WithError(err).Error("Failed to log ReportClicked in config_status.")
|
||||
}
|
||||
}
|
||||
|
||||
func (user *User) ReportBugSent() {
|
||||
if !user.configStatus.IsPending() {
|
||||
return
|
||||
}
|
||||
|
||||
if err := user.configStatus.ReportSent(); err != nil {
|
||||
user.log.WithError(err).Error("Failed to log ReportSent in config_status.")
|
||||
}
|
||||
}
|
||||
|
||||
func (user *User) AutoconfigUsed(client string) {
|
||||
if !user.configStatus.IsPending() {
|
||||
return
|
||||
}
|
||||
|
||||
if err := user.configStatus.AutoconfigUsed(client); err != nil {
|
||||
user.log.WithError(err).Error("Failed to log Autoconf in config_status.")
|
||||
}
|
||||
}
|
||||
|
||||
func (user *User) ExternalLinkClicked(url string) {
|
||||
if !user.configStatus.IsPending() {
|
||||
return
|
||||
}
|
||||
|
||||
const externalLinkWasClicked = "External link was clicked."
|
||||
index, err := kb.GetArticleIndex(url)
|
||||
if err != nil {
|
||||
if errors.Is(err, kb.ErrArticleNotFound) {
|
||||
user.log.WithField("report", false).WithField("url", url).Debug(externalLinkWasClicked)
|
||||
} else {
|
||||
user.log.WithError(err).Error("Failed to retrieve list of KB articles.")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
if err := user.configStatus.RecordLinkClicked(index); err != nil {
|
||||
user.log.WithError(err).Error("Failed to log LinkClicked in config_status.")
|
||||
} else {
|
||||
user.log.WithField("report", true).WithField("url", url).Debug(externalLinkWasClicked)
|
||||
}
|
||||
}
|
||||
@ -21,13 +21,11 @@ import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"path/filepath"
|
||||
"time"
|
||||
|
||||
"github.com/ProtonMail/gluon/async"
|
||||
"github.com/ProtonMail/gluon/reporter"
|
||||
"github.com/ProtonMail/go-proton-api"
|
||||
"github.com/ProtonMail/proton-bridge/v3/internal/configstatus"
|
||||
"github.com/ProtonMail/proton-bridge/v3/internal/events"
|
||||
"github.com/ProtonMail/proton-bridge/v3/internal/safe"
|
||||
"github.com/ProtonMail/proton-bridge/v3/internal/services/imapservice"
|
||||
@ -78,10 +76,7 @@ type User struct {
|
||||
maxSyncMemory uint64
|
||||
|
||||
panicHandler async.PanicHandler
|
||||
configStatus *configstatus.ConfigurationStatus
|
||||
telemetryManager telemetry.Availability
|
||||
// goStatusProgress triggers a check/sending if progress is needed.
|
||||
goStatusProgress func()
|
||||
|
||||
eventService *userevents.Service
|
||||
identityService *useridentity.Service
|
||||
@ -104,7 +99,6 @@ func New(
|
||||
crashHandler async.PanicHandler,
|
||||
showAllMail bool,
|
||||
maxSyncMemory uint64,
|
||||
statsDir string,
|
||||
telemetryManager telemetry.Availability,
|
||||
imapServerManager imapservice.IMAPServerManager,
|
||||
smtpServerManager smtp.ServerManager,
|
||||
@ -125,7 +119,6 @@ func New(
|
||||
crashHandler,
|
||||
showAllMail,
|
||||
maxSyncMemory,
|
||||
statsDir,
|
||||
telemetryManager,
|
||||
imapServerManager,
|
||||
smtpServerManager,
|
||||
@ -159,7 +152,6 @@ func newImpl(
|
||||
crashHandler async.PanicHandler,
|
||||
showAllMail bool,
|
||||
maxSyncMemory uint64,
|
||||
statsDir string,
|
||||
telemetryManager telemetry.Availability,
|
||||
imapServerManager imapservice.IMAPServerManager,
|
||||
smtpServerManager smtp.ServerManager,
|
||||
@ -198,12 +190,6 @@ func newImpl(
|
||||
"numLabels": len(apiLabels),
|
||||
}).Info("Creating user object")
|
||||
|
||||
configStatusFile := filepath.Join(statsDir, apiUser.ID+".json")
|
||||
configStatus, err := configstatus.LoadConfigurationStatus(configStatusFile)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to init configuration status file: %w", err)
|
||||
}
|
||||
|
||||
sendRecorder := sendrecorder.NewSendRecorder(sendrecorder.SendEntryExpiry)
|
||||
|
||||
// Create the user object.
|
||||
@ -225,7 +211,6 @@ func newImpl(
|
||||
|
||||
panicHandler: crashHandler,
|
||||
|
||||
configStatus: configStatus,
|
||||
telemetryManager: telemetryManager,
|
||||
|
||||
serviceGroup: orderedtasks.NewOrderedCancelGroup(crashHandler),
|
||||
@ -248,7 +233,7 @@ func newImpl(
|
||||
|
||||
addressMode := usertypes.VaultToAddressMode(encVault.AddressMode())
|
||||
|
||||
user.identityService = useridentity.NewService(user.eventService, user, identityState, encVault, user)
|
||||
user.identityService = useridentity.NewService(user.eventService, user, identityState, encVault)
|
||||
|
||||
user.telemetryService = telemetryservice.NewService(apiUser.ID, client, user.eventService)
|
||||
|
||||
@ -260,7 +245,6 @@ func newImpl(
|
||||
reporter,
|
||||
encVault,
|
||||
encVault,
|
||||
user,
|
||||
user.eventService,
|
||||
addressMode,
|
||||
identityState.Clone(),
|
||||
@ -279,7 +263,6 @@ func newImpl(
|
||||
encVault,
|
||||
crashHandler,
|
||||
sendRecorder,
|
||||
user,
|
||||
reporter,
|
||||
addressMode,
|
||||
eventSubscription,
|
||||
@ -291,12 +274,6 @@ func newImpl(
|
||||
|
||||
user.notificationService = notifications.NewService(user.id, user.eventService, user, notificationStore, getFlagValueFn, observabilityService)
|
||||
|
||||
// Check for status_progress when triggered.
|
||||
user.goStatusProgress = user.tasks.PeriodicOrTrigger(configstatus.ProgressCheckInterval, 0, func(ctx context.Context) {
|
||||
user.SendConfigStatusProgress(ctx)
|
||||
})
|
||||
defer user.goStatusProgress()
|
||||
|
||||
// When we receive an auth object, we update it in the vault.
|
||||
// This will be used to authorize the user on the next run.
|
||||
user.client.AddAuthHandler(func(auth proton.Auth) {
|
||||
@ -698,19 +675,6 @@ func (user *User) SendTelemetry(ctx context.Context, data []byte) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (user *User) ReportSMTPAuthFailed(username string) {
|
||||
emails := user.Emails()
|
||||
for _, mail := range emails {
|
||||
if mail == username {
|
||||
user.ReportConfigStatusFailure("SMTP invalid username or password")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (user *User) ReportSMTPAuthSuccess(ctx context.Context) {
|
||||
user.SendConfigStatusSuccess(ctx)
|
||||
}
|
||||
|
||||
func (user *User) GetSMTPService() *smtp.Service {
|
||||
return user.smtpService
|
||||
}
|
||||
|
||||
@ -160,7 +160,6 @@ func withUser(tb testing.TB, ctx context.Context, _ *server.Server, m *proton.Ma
|
||||
nil,
|
||||
true,
|
||||
vault.DefaultMaxSyncMemory,
|
||||
tb.TempDir(),
|
||||
manager,
|
||||
nullIMAPServerManager,
|
||||
nullSMTPServerManager,
|
||||
|
||||
Reference in New Issue
Block a user