mirror of
https://github.com/ProtonMail/proton-bridge.git
synced 2025-12-23 18:36:46 +00:00
We build too many walls and not enough bridges
This commit is contained in:
109
internal/store/address.go
Normal file
109
internal/store/address.go
Normal file
@ -0,0 +1,109 @@
|
||||
// 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"
|
||||
)
|
||||
|
||||
// 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)
|
||||
|
||||
for _, label := range foldersAndLabels {
|
||||
prefix := getLabelPrefix(label)
|
||||
|
||||
var mailbox *Mailbox
|
||||
if mailbox, err = newMailbox(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
|
||||
}
|
||||
|
||||
storeAddress.mailboxes[label.ID] = mailbox
|
||||
}
|
||||
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user