123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- // mautrix-whatsapp - A Matrix-WhatsApp puppeting bridge.
- // Copyright (C) 2021 Tulir Asokan
- //
- // This program is free software: you can redistribute it and/or modify
- // it under the terms of the GNU Affero General Public License as published by
- // the Free Software Foundation, either version 3 of the License, or
- // (at your option) any later version.
- //
- // This program is distributed in the hope that it will be useful,
- // but WITHOUT ANY WARRANTY; without even the implied warranty of
- // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- // GNU Affero General Public License for more details.
- //
- // You should have received a copy of the GNU Affero General Public License
- // along with this program. If not, see <https://www.gnu.org/licenses/>.
- package main
- import (
- "maunium.net/go/mautrix/id"
- )
- func (puppet *Puppet) SwitchCustomMXID(accessToken string, mxid id.UserID) error {
- puppet.CustomMXID = mxid
- puppet.AccessToken = accessToken
- puppet.EnablePresence = puppet.bridge.Config.Bridge.DefaultBridgePresence
- puppet.Update()
- err := puppet.StartCustomMXID(false)
- if err != nil {
- return err
- }
- // TODO leave rooms with default puppet
- return nil
- }
- func (puppet *Puppet) ClearCustomMXID() {
- save := puppet.CustomMXID != "" || puppet.AccessToken != ""
- puppet.bridge.puppetsLock.Lock()
- if puppet.CustomMXID != "" && puppet.bridge.puppetsByCustomMXID[puppet.CustomMXID] == puppet {
- delete(puppet.bridge.puppetsByCustomMXID, puppet.CustomMXID)
- }
- puppet.bridge.puppetsLock.Unlock()
- puppet.CustomMXID = ""
- puppet.AccessToken = ""
- puppet.customIntent = nil
- puppet.customUser = nil
- if save {
- puppet.Update()
- }
- }
- func (puppet *Puppet) StartCustomMXID(reloginOnFail bool) error {
- newIntent, newAccessToken, err := puppet.bridge.DoublePuppet.Setup(puppet.CustomMXID, puppet.AccessToken, reloginOnFail)
- if err != nil {
- puppet.ClearCustomMXID()
- return err
- }
- puppet.bridge.puppetsLock.Lock()
- puppet.bridge.puppetsByCustomMXID[puppet.CustomMXID] = puppet
- puppet.bridge.puppetsLock.Unlock()
- if puppet.AccessToken != newAccessToken {
- puppet.AccessToken = newAccessToken
- puppet.Update()
- }
- puppet.customIntent = newIntent
- puppet.customUser = puppet.bridge.GetUserByMXID(puppet.CustomMXID)
- return nil
- }
- func (user *User) tryAutomaticDoublePuppeting() {
- if !user.bridge.Config.CanAutoDoublePuppet(user.MXID) {
- return
- }
- user.zlog.Debug().Msg("Checking if double puppeting needs to be enabled")
- puppet := user.bridge.GetPuppetByJID(user.JID)
- if len(puppet.CustomMXID) > 0 {
- user.zlog.Debug().Msg("User already has double-puppeting enabled")
- // Custom puppet already enabled
- return
- }
- puppet.CustomMXID = user.MXID
- puppet.EnablePresence = puppet.bridge.Config.Bridge.DefaultBridgePresence
- err := puppet.StartCustomMXID(true)
- if err != nil {
- user.zlog.Warn().Err(err).Msg("Failed to login with shared secret")
- } else {
- // TODO leave rooms with default puppet
- user.zlog.Debug().Msg("Successfully automatically enabled custom puppet")
- }
- }
|