forked from Silverfish/proton-bridge
114 lines
3.0 KiB
Go
114 lines
3.0 KiB
Go
// Copyright (c) 2020 Proton Technologies AG
|
|
//
|
|
// This file is part of ProtonMail Bridge.
|
|
//
|
|
// ProtonMail 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.
|
|
//
|
|
// ProtonMail 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 ProtonMail Bridge. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
package store
|
|
|
|
import (
|
|
"github.com/ProtonMail/proton-bridge/pkg/pmapi"
|
|
"github.com/sirupsen/logrus"
|
|
bolt "go.etcd.io/bbolt"
|
|
)
|
|
|
|
// Address holds mailboxes for IMAP user (login address). In combined mode
|
|
// there is only one address, in split mode there is one object per address.
|
|
type Address struct {
|
|
store *Store
|
|
address string
|
|
addressID string
|
|
mailboxes map[string]*Mailbox
|
|
|
|
log *logrus.Entry
|
|
}
|
|
|
|
func newAddress(
|
|
store *Store,
|
|
address, addressID string,
|
|
labels []*pmapi.Label,
|
|
) (addr *Address, err error) {
|
|
l := log.WithField("addressID", addressID)
|
|
|
|
storeAddress := &Address{
|
|
store: store,
|
|
address: address,
|
|
addressID: addressID,
|
|
log: l,
|
|
}
|
|
|
|
if err = storeAddress.init(labels); err != nil {
|
|
l.WithField("address", address).
|
|
WithError(err).
|
|
Error("Could not initialise store address")
|
|
|
|
return
|
|
}
|
|
|
|
return storeAddress, nil
|
|
}
|
|
|
|
func (storeAddress *Address) init(foldersAndLabels []*pmapi.Label) (err error) {
|
|
storeAddress.log.WithField("address", storeAddress.address).Debug("Initialising store address")
|
|
|
|
storeAddress.mailboxes = make(map[string]*Mailbox)
|
|
|
|
err = storeAddress.store.db.Update(func(tx *bolt.Tx) error {
|
|
for _, label := range foldersAndLabels {
|
|
prefix := getLabelPrefix(label)
|
|
|
|
var mailbox *Mailbox
|
|
if mailbox, err = txNewMailbox(tx, storeAddress, label.ID, prefix, label.Name, label.Color); err != nil {
|
|
storeAddress.log.
|
|
WithError(err).
|
|
WithField("labelID", label.ID).
|
|
Error("Could not init mailbox for folder or label")
|
|
return err
|
|
}
|
|
|
|
storeAddress.mailboxes[label.ID] = mailbox
|
|
}
|
|
return nil
|
|
})
|
|
|
|
return
|
|
}
|
|
|
|
// getLabelPrefix returns the correct prefix for a pmapi label according to whether it is exclusive or not.
|
|
func getLabelPrefix(l *pmapi.Label) string {
|
|
switch {
|
|
case pmapi.IsSystemLabel(l.ID):
|
|
return ""
|
|
case l.Exclusive == 1:
|
|
return UserFoldersPrefix
|
|
default:
|
|
return UserLabelsPrefix
|
|
}
|
|
}
|
|
|
|
// AddressString returns the address.
|
|
func (storeAddress *Address) AddressString() string {
|
|
return storeAddress.address
|
|
}
|
|
|
|
// AddressID returns the address ID.
|
|
func (storeAddress *Address) AddressID() string {
|
|
return storeAddress.addressID
|
|
}
|
|
|
|
// APIAddress returns the `pmapi.Address` struct.
|
|
func (storeAddress *Address) APIAddress() *pmapi.Address {
|
|
return storeAddress.store.api.Addresses().ByEmail(storeAddress.address)
|
|
}
|