You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.8 KiB
71 lines
1.8 KiB
// Copyright (c) 2022 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 imap |
|
|
|
import ( |
|
"bytes" |
|
"strings" |
|
|
|
"github.com/ljanyst/peroxide/pkg/message" |
|
"github.com/emersion/go-imap" |
|
) |
|
|
|
func filterHeader(header []byte, section *imap.BodySectionName) []byte { |
|
// Empty section.Fields means BODY[HEADER] was requested so we should return the full header. |
|
if len(section.Fields) == 0 { |
|
return header |
|
} |
|
|
|
fieldMap := make(map[string]struct{}) |
|
|
|
for _, field := range section.Fields { |
|
fieldMap[strings.ToLower(field)] = struct{}{} |
|
} |
|
|
|
return filterHeaderLines(header, func(field string) bool { |
|
_, ok := fieldMap[strings.ToLower(field)] |
|
|
|
if section.NotFields { |
|
ok = !ok |
|
} |
|
|
|
return ok |
|
}) |
|
} |
|
|
|
func filterHeaderLines(header []byte, wantField func(string) bool) []byte { |
|
var res []byte |
|
|
|
for _, line := range message.HeaderLines(header) { |
|
if len(bytes.TrimSpace(line)) == 0 { |
|
res = append(res, line...) |
|
} else { |
|
split := bytes.SplitN(line, []byte(": "), 2) |
|
|
|
if len(split) != 2 { |
|
continue |
|
} |
|
|
|
if wantField(string(bytes.ToLower(split[0]))) { |
|
res = append(res, line...) |
|
} |
|
} |
|
} |
|
|
|
return res |
|
}
|
|
|