From ea0f3115a3336ded028e6150a155a77ea1d713be Mon Sep 17 00:00:00 2001 From: Michal Horejsek Date: Fri, 3 Apr 2020 13:59:14 +0200 Subject: [PATCH] usage of latest upstream go-imap --- go.mod | 14 +++--- go.sum | 67 +++++--------------------- internal/imap/backend.go | 3 +- internal/imap/mailbox.go | 22 +++------ internal/imap/mailbox_message.go | 20 ++++---- internal/imap/mailbox_messages.go | 28 +++++------ internal/imap/mailbox_root.go | 16 +++---- internal/imap/server.go | 75 ++++++++++++++++++------------ internal/imap/uidplus/extension.go | 6 +-- internal/store/change.go | 17 +++---- pkg/message/message.go | 28 +++++------ pkg/message/section.go | 4 +- test/imap_checks_test.go | 2 +- 13 files changed, 129 insertions(+), 173 deletions(-) diff --git a/go.mod b/go.mod index 20ee07fe..63a123c2 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/ProtonMail/go-appdir v1.1.0 github.com/ProtonMail/go-apple-mobileconfig v0.0.0-20160701194735-7ea9927a11f6 github.com/ProtonMail/go-autostart v0.0.0-20181114175602-c5272053443a - github.com/ProtonMail/go-imap-id v0.0.0-20171219160728-ed0baee567ee + github.com/ProtonMail/go-imap-id v0.0.0-20190926060100-f94a56b9ecde github.com/ProtonMail/go-vcard v0.0.0-20180326232728-33aaa0a0c8a5 github.com/ProtonMail/gopenpgp v1.0.1-0.20190912180537-d398098113ed github.com/abiosoft/ishell v2.0.0+incompatible @@ -29,9 +29,9 @@ require ( github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 // indirect github.com/cucumber/godog v0.8.1 github.com/danieljoos/wincred v1.0.2 // indirect - github.com/emersion/go-imap-appendlimit v0.0.0-20160923165328-beeb382f2a42 - github.com/emersion/go-imap-idle v0.0.0-20161227184850-e03ba1e0ed89 - github.com/emersion/go-imap-move v0.0.0-20161227183138-88aef42b0f1d + github.com/emersion/go-imap-appendlimit v0.0.0-20190308131241-25671c986a6a + github.com/emersion/go-imap-idle v0.0.0-20190519112320-2704abd7050e + github.com/emersion/go-imap-move v0.0.0-20190710073258-6e5a51a5b342 github.com/emersion/go-imap-specialuse v0.0.0-20161227184202-ba031ced6a62 github.com/emersion/go-imap-unselect v0.0.0-20161227183655-1e6dc73ac8fe github.com/emersion/go-sasl v0.0.0-20191210011802-430746ea8b9b @@ -58,8 +58,6 @@ require ( github.com/skratchdot/open-golang v0.0.0-20200116055534-eef842397966 github.com/stretchr/testify v1.5.1 github.com/therecipe/qt v0.0.0-20200126204426-5074eb6d8c41 - github.com/therecipe/qt/internal/binding/files/docs/5.12.0 v0.0.0-20200126204426-5074eb6d8c41 // indirect - github.com/therecipe/qt/internal/binding/files/docs/5.13.0 v0.0.0-20200126204426-5074eb6d8c41 // indirect github.com/twinj/uuid v1.0.0 // indirect github.com/urfave/cli v1.22.3 go.etcd.io/bbolt v1.3.3 @@ -71,8 +69,8 @@ require ( replace ( github.com/docker/docker-credential-helpers => github.com/ProtonMail/docker-credential-helpers v1.0.0 - github.com/emersion/go-imap => github.com/ProtonMail/go-imap v0.0.0-20190327080220-0e686f0e855f - github.com/emersion/go-imap-quota => github.com/ProtonMail/go-imap-quota v0.0.0-20171219161528-20f0ba8904de + github.com/emersion/go-imap => ../go-imap-upstream //github.com/ProtonMail/go-imap v0.0.0-20190327080220-0e686f0e855f + //github.com/emersion/go-imap-quota => github.com/ProtonMail/go-imap-quota v0.0.0-20171219161528-20f0ba8904de github.com/emersion/go-smtp => github.com/ProtonMail/go-smtp v0.0.0-20181206232543-8261df20d309 github.com/jameskeane/bcrypt => github.com/ProtonMail/bcrypt v0.0.0-20170924085257-7509ea014998 golang.org/x/crypto => github.com/ProtonMail/crypto v0.0.0-20190604143603-d3d8a14a4d4f diff --git a/go.sum b/go.sum index c9b7534c..caa40aa4 100644 --- a/go.sum +++ b/go.sum @@ -15,12 +15,8 @@ github.com/ProtonMail/go-apple-mobileconfig v0.0.0-20160701194735-7ea9927a11f6 h github.com/ProtonMail/go-apple-mobileconfig v0.0.0-20160701194735-7ea9927a11f6/go.mod h1:EtDfBMIDWmVe4viZCuBTEfe3OIIo0ghbpOaAZVO+hVg= github.com/ProtonMail/go-autostart v0.0.0-20181114175602-c5272053443a h1:fXK2KsfnkBV9Nh+9SKzHchYjuE9s0vI20JG1mbtEAcc= github.com/ProtonMail/go-autostart v0.0.0-20181114175602-c5272053443a/go.mod h1:oTGdE7/DlWIr23G0IKW3OXK9wZ5Hw1GGiaJFccTvZi4= -github.com/ProtonMail/go-imap v0.0.0-20190327080220-0e686f0e855f h1:QkLm4yfhBQuBxrC46Vhy2sonOWVrwIJo5bgKpA82+TY= -github.com/ProtonMail/go-imap v0.0.0-20190327080220-0e686f0e855f/go.mod h1:+m2uLXghuYktgE/vc5AkmCxx1qhu33ZKHFWg1cGZPD0= -github.com/ProtonMail/go-imap-id v0.0.0-20171219160728-ed0baee567ee h1:Q/nK7A9xzUimAZsQDa/yaw3xW9PkTTnJnkT5wAkXrmI= -github.com/ProtonMail/go-imap-id v0.0.0-20171219160728-ed0baee567ee/go.mod h1:795VPXcRUIQ9JyMNHP4el582VokQfippgjkQP3Gk0r0= -github.com/ProtonMail/go-imap-quota v0.0.0-20171219161528-20f0ba8904de h1:+LA9teDYUwGkBvg0kqZPZetmxIv1r7s9/npBP1yzKs0= -github.com/ProtonMail/go-imap-quota v0.0.0-20171219161528-20f0ba8904de/go.mod h1:85zbnYVWIY7//iScX9fnB/kKOGH9B86YPqtpr7f1i7A= +github.com/ProtonMail/go-imap-id v0.0.0-20190926060100-f94a56b9ecde h1:5koQozTDELymYOyFbQ/VSubexAEXzDR8qGM5mO8GRdw= +github.com/ProtonMail/go-imap-id v0.0.0-20190926060100-f94a56b9ecde/go.mod h1:795VPXcRUIQ9JyMNHP4el582VokQfippgjkQP3Gk0r0= github.com/ProtonMail/go-mime v0.0.0-20190521135552-09454e3dbe72 h1:hGCc4Oc2fD3I5mNnZ1VlREncVc9EXJF8dxW3sw16gWM= github.com/ProtonMail/go-mime v0.0.0-20190521135552-09454e3dbe72/go.mod h1:NYt+V3/4rEeDuaev/zw1zCq8uqVEuPHzDPo3OZrlGJ4= github.com/ProtonMail/go-smtp v0.0.0-20181206232543-8261df20d309 h1:2pzfKjhBjSnw3BgmfTYRFQr1rFGxhfhUY0KKkg+RYxE= @@ -37,7 +33,6 @@ github.com/allan-simon/go-singleinstance v0.0.0-20160830203053-79edcfdc2dfc h1:m github.com/allan-simon/go-singleinstance v0.0.0-20160830203053-79edcfdc2dfc/go.mod h1:qqsTQiwdyqxU05iDCsi0oN3P4nrVxAmn8xCtODDSf/U= github.com/andybalholm/cascadia v1.1.0 h1:BuuO6sSfQNFRu1LppgbD25Hr2vLYW25JvxHs5zzsLTo= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= -github.com/aslakhellesoy/gox v1.0.100/go.mod h1:AJl542QsKKG96COVsv0N74HHzVQgDIQPceVUh1aeU2M= github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a h1:MISbI8sU/PSK/ztvmWKFcI7UGb5/HQT7B+i3a2myKgI= github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a/go.mod h1:2GxOXOlEPAMFPfp014mK1SWq8G8BN8o7/dfYqJrVGn8= github.com/certifi/gocertifi v0.0.0-20200211180108-c7c1fbc02894 h1:JLaf/iINcLyjwbtTsCJjc6rtlASgHeIJPrB6QmwURnA= @@ -48,39 +43,25 @@ github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWs github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d h1:U+s90UTSYgptZMwQh2aRr3LuazLJIa+Pg3Kc1ylSYVY= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cucumber/gherkin-go/v11 v11.0.0 h1:cwVwN1Qn2VRSfHZNLEh5x00tPBmZcjATBWDpxsR5Xug= -github.com/cucumber/gherkin-go/v11 v11.0.0/go.mod h1:CX33k2XU2qog4e+TFjOValoq6mIUq0DmVccZs238R9w= github.com/cucumber/godog v0.8.1 h1:lVb+X41I4YDreE+ibZ50bdXmySxgRviYFgKY6Aw4XE8= github.com/cucumber/godog v0.8.1/go.mod h1:vSh3r/lM+psC1BPXvdkSEuNjmXfpVqrMGYAElF6hxnA= -github.com/cucumber/godog v0.9.0 h1:QOb8wyC7f+FVFXzY3RdgowwJUb4WeJfqbnQqaH4jp+A= -github.com/cucumber/godog v0.9.0/go.mod h1:roWCHkpeK6UTOyIRRl7IR+fgfBeZ4vZR7OSq2J/NbM4= -github.com/cucumber/messages-go/v10 v10.0.1/go.mod h1:kA5T38CBlBbYLU12TIrJ4fk4wSkVVOgyh7Enyy8WnSg= -github.com/cucumber/messages-go/v10 v10.0.3 h1:m/9SD/K/A15WP7i1aemIv7cwvUw+viS51Ui5HBw1cdE= -github.com/cucumber/messages-go/v10 v10.0.3/go.mod h1:9jMZ2Y8ZxjLY6TG2+x344nt5rXstVVDYSdS5ySfI1WY= github.com/danieljoos/wincred v1.0.2 h1:zf4bhty2iLuwgjgpraD2E9UbvO+fe54XXGJbOwe23fU= github.com/danieljoos/wincred v1.0.2/go.mod h1:SnuYRW9lp1oJrZX/dXJqr0cPK5gYXqx3EJbmjhLdK9U= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/emersion/go-imap-appendlimit v0.0.0-20160923165328-beeb382f2a42 h1:3TeZ5gy3We/LVL0sqmGhM8dFDTSM7Hyj7PMIdl6OTs4= -github.com/emersion/go-imap-appendlimit v0.0.0-20160923165328-beeb382f2a42/go.mod h1:ikgISoP7pRAolqsVP64yMteJa2FIpS6ju88eBT6K1yQ= -github.com/emersion/go-imap-idle v0.0.0-20161227184850-e03ba1e0ed89 h1:AzbVhcrxgJO5MfSvzG5q4IfrYVm0Jw4AHNPz47+DiR0= -github.com/emersion/go-imap-idle v0.0.0-20161227184850-e03ba1e0ed89/go.mod h1:o14zPKCmEH5WC1vU5SdPoZGgNvQx7zzKSnxPQlobo78= -github.com/emersion/go-imap-move v0.0.0-20161227173100-88aef42b0f1d h1:STRZFC+5HZITdsSFkhFfyYRb+tkiTwhxFz3sRW1lYjk= -github.com/emersion/go-imap-move v0.0.0-20161227173100-88aef42b0f1d/go.mod h1:QuMaZcKFDVI0yCrnAbPLfbwllz1wtOrZH8/vZ5yzp4w= -github.com/emersion/go-imap-move v0.0.0-20161227183138-88aef42b0f1d h1:E/ezdheD3QUe47cM0LpAPuJ6Pk1x0EFDmjoysaZhtaw= -github.com/emersion/go-imap-move v0.0.0-20161227183138-88aef42b0f1d/go.mod h1:QuMaZcKFDVI0yCrnAbPLfbwllz1wtOrZH8/vZ5yzp4w= -github.com/emersion/go-imap-move v0.0.0-20190710073258-6e5a51a5b342 h1:5p1t3e1PomYgLWwEwhwEU5kVBwcyAcVrOpexv8AeZx0= -github.com/emersion/go-imap-move v0.0.0-20190710073258-6e5a51a5b342/go.mod h1:QuMaZcKFDVI0yCrnAbPLfbwllz1wtOrZH8/vZ5yzp4w= +github.com/emersion/go-imap-appendlimit v0.0.0-20190308131241-25671c986a6a h1:bMdSPm6sssuOFpIaveu3XGAijMS3Tq2S3EqFZmZxidc= +github.com/emersion/go-imap-appendlimit v0.0.0-20190308131241-25671c986a6a/go.mod h1:ikgISoP7pRAolqsVP64yMteJa2FIpS6ju88eBT6K1yQ= +github.com/emersion/go-imap-idle v0.0.0-20190519112320-2704abd7050e h1:L7bswVJZcf2YHofgom49oFRwVqmBj/qZqDy9/SJpZMY= +github.com/emersion/go-imap-idle v0.0.0-20190519112320-2704abd7050e/go.mod h1:o14zPKCmEH5WC1vU5SdPoZGgNvQx7zzKSnxPQlobo78= +github.com/emersion/go-imap-quota v0.0.0-20171113212021-e883a2bc54d6 h1:CQ9z5Gk5HBUI8+kM5XNZXUoAv8RF1GnXmYrN4OkDvZU= +github.com/emersion/go-imap-quota v0.0.0-20171113212021-e883a2bc54d6/go.mod h1:iApyhIQBiU4XFyr+3kdJyyGqle82TbQyuP2o+OZHrV0= github.com/emersion/go-imap-specialuse v0.0.0-20161227184202-ba031ced6a62 h1:4ZAfwfc8aDlj26kkEap1UDSwwDnJp9Ie8Uj1MSXAkPk= github.com/emersion/go-imap-specialuse v0.0.0-20161227184202-ba031ced6a62/go.mod h1:/nybxhI8kXom8Tw6BrHMl42usALvka6meORflnnYwe4= github.com/emersion/go-imap-unselect v0.0.0-20161227183655-1e6dc73ac8fe h1:2R2XpJkmbyy7PcSjnCPOnNfu+GuRzgWR9U2+j/d1O+0= github.com/emersion/go-imap-unselect v0.0.0-20161227183655-1e6dc73ac8fe/go.mod h1:+gnnZx3Mg3MnCzZrv0eZdp5puxXQUgGT/6N6L7ShKfM= -github.com/emersion/go-imap-unselect v0.0.0-20161227193600-1e6dc73ac8fe h1:WeXweyFnbM2DQx0wxHkJKXYXwXpApopIeAjDTipW5Z4= -github.com/emersion/go-imap-unselect v0.0.0-20161227193600-1e6dc73ac8fe/go.mod h1:+gnnZx3Mg3MnCzZrv0eZdp5puxXQUgGT/6N6L7ShKfM= -github.com/emersion/go-imap-unselect v0.0.0-20171113212723-b985794e5f26 h1:FiSb8+XBQQSkcX3ubr+1tAtlRJBYaFmRZqOAweZ9Wy8= -github.com/emersion/go-imap-unselect v0.0.0-20171113212723-b985794e5f26/go.mod h1:+gnnZx3Mg3MnCzZrv0eZdp5puxXQUgGT/6N6L7ShKfM= +github.com/emersion/go-message v0.11.1 h1:0C/S4JIXDTSfXB1vpqdimAYyK4+79fgEAMQ0dSL+Kac= +github.com/emersion/go-message v0.11.1/go.mod h1:C4jnca5HOTo4bGN9YdqNQM9sITuT3Y0K6bSUw9RklvY= github.com/emersion/go-sasl v0.0.0-20191210011802-430746ea8b9b h1:uhWtEWBHgop1rqEk2klKaxPAkVDCXexai6hSuRQ7Nvs= github.com/emersion/go-sasl v0.0.0-20191210011802-430746ea8b9b/go.mod h1:G/dpzLu16WtQpBfQ/z3LYiYJn3ZhKSGWn83fyoyQe/k= github.com/emersion/go-textwrapper v0.0.0-20160606182133-d0e65e56babe h1:40SWqY0zE3qCi6ZrtTf5OUdNm5lDnGnjRSq9GgmeTrg= @@ -97,10 +78,6 @@ github.com/go-resty/resty/v2 v2.2.0 h1:vgZ1cdblp8Aw4jZj3ZsKh6yKAlMg3CHMrqFSFFd+j github.com/go-resty/resty/v2 v2.2.0/go.mod h1:nYW/8rxqQCmI3bPz9Fsmjbr2FBjGuR2Mzt6kDh3zZ7w= github.com/go-test/deep v1.0.2 h1:onZX1rnHT3Wv6cqNgYyFOOlgVKJrksuCMCRvJStbMYw= github.com/go-test/deep v1.0.2/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA= -github.com/gofrs/uuid v3.2.0+incompatible h1:y12jRkkFxsd7GpqdSZ+/KCs/fJbqpEXSGd4+jfEaewE= -github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= -github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogs/chardet v0.0.0-20150115103509-2404f7772561 h1:aBzukfDxQlCTVS0NBUjI5YA3iVeaZ9Tb5PxNrrIP1xs= github.com/gogs/chardet v0.0.0-20150115103509-2404f7772561/go.mod h1:Pcatq5tYkCW2Q6yrR2VRHlbHpZ/R4/7qyL1TCF7vl14= github.com/golang/mock v1.4.3 h1:GV+pQPG/EUUbkh47niozDcADz6go/dUwhVzdUQHIVRw= @@ -114,8 +91,6 @@ github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/U github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= -github.com/hashicorp/go-version v1.0.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/jaytaylor/html2text v0.0.0-20190408195923-01ec452cbe43 h1:jTkyeF7NZ5oIr0ESmcrpiDgAfoidCBF4F5kJhjtaRwE= github.com/jaytaylor/html2text v0.0.0-20190408195923-01ec452cbe43/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= github.com/jaytaylor/html2text v0.0.0-20200220170450-61d9dc4d7195 h1:j0UEFmS7wSjAwKEIkgKBn8PRDfjcuggzr93R9wk53nQ= github.com/jaytaylor/html2text v0.0.0-20200220170450-61d9dc4d7195/go.mod h1:CVKlgaMiht+LXvHG173ujK6JUhZXKb2u/BQtjPDIvyk= @@ -125,20 +100,15 @@ github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uia github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= github.com/keybase/go-keychain v0.0.0-20200218013740-86d4642e4ce2 h1:1XZArHAPddaXKbg51etNbCjkNUkKgSa0s8dSz2LYB2g= github.com/keybase/go-keychain v0.0.0-20200218013740-86d4642e4ce2/go.mod h1:JJNrCn9otv/2QP4D7SMJBgaleKpOf66PnW6F5WGNRIc= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381 h1:bqDmpDG49ZRnB5PcgP0RXtQvnMSgIF14M7CBd2shtXs= github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= +github.com/martinlindhe/base36 v1.0.0 h1:eYsumTah144C0A8P1T/AVSUk5ZoLnhfYFM3OGQxB52A= +github.com/martinlindhe/base36 v1.0.0/go.mod h1:+AtEs8xrBpCeYgSLoY/aJ6Wf37jtBuR0s35750M27+8= github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= @@ -146,10 +116,8 @@ github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/ github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/miekg/dns v1.1.29 h1:xHBEhR+t5RzcFJjBLJlax2daXOrTYtr9z4WdKEfWFzg= github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= github.com/myesui/uuid v1.0.0 h1:xCBmH4l5KuvLYc5L7AS7SZg9/jKdIFubM7OVoLqaQUI= github.com/myesui/uuid v1.0.0/go.mod h1:2CDfNgU0LR8mIdO8vdWd8i9gWWxLlcoIGGpSNgafq84= -github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nsf/jsondiff v0.0.0-20190712045011-8443391ee9b6 h1:qsqscDgSJy+HqgMTR+3NwjYJBbp1+honwDsszLoS+pA= github.com/nsf/jsondiff v0.0.0-20190712045011-8443391ee9b6/go.mod h1:uFMI8w+ref4v2r9jz+c9i1IfIttS/OkmLfrk1jne5hs= github.com/olekukonko/tablewriter v0.0.1 h1:b3iUnf1v+ppJiOfNX4yxxqfWKMQPZR5yoh8urCTFX88= @@ -178,7 +146,6 @@ github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/therecipe/qt v0.0.0-20200126204426-5074eb6d8c41 h1:yBVcrpbaQYJBdKT2pxTdlL4hBE/eM4UPcyj9YpyvSok= @@ -199,10 +166,8 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smtodRU+gha3+BeqJ69lRk= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0 h1:MsuvTghUPjX762sGLnGsxC3HM0B5r83wEtYcYR8/vRs= golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -213,9 +178,7 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe h1:6fAMxZRR6sl1Uq8U61gxU+kPTs2tR8uOySCbBP7BN/M= golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -224,23 +187,17 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190420181800-aa740d480789/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20191216052735-49a3e744a425 h1:VvQyQJN0tSuecqgcIxMWnnfG5kSmgy9KZR9sW3W5QeA= golang.org/x/tools v0.0.0-20191216052735-49a3e744a425/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/stretchr/testify.v1 v1.2.2 h1:yhQC6Uy5CqibAIlk1wlusa/MJ3iAN49/BsR/dCCKz3M= gopkg.in/stretchr/testify.v1 v1.2.2/go.mod h1:QI5V/q6UbPmuhtm10CaFZxED9NreB8PnFYN9JcR6TxU= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/internal/imap/backend.go b/internal/imap/backend.go index 06731928..5a8488bb 100644 --- a/internal/imap/backend.go +++ b/internal/imap/backend.go @@ -27,6 +27,7 @@ import ( "github.com/ProtonMail/proton-bridge/internal/bridge" "github.com/ProtonMail/proton-bridge/internal/events" "github.com/ProtonMail/proton-bridge/pkg/listener" + "github.com/emersion/go-imap" goIMAPBackend "github.com/emersion/go-imap/backend" ) @@ -150,7 +151,7 @@ func (ib *imapBackend) deleteUser(address string) { } // Login authenticates a user. -func (ib *imapBackend) Login(username, password string) (goIMAPBackend.User, error) { +func (ib *imapBackend) Login(_ *imap.ConnInfo, username, password string) (goIMAPBackend.User, error) { // Called from go-imap in goroutines - we need to handle panics for each function. defer ib.panicHandler.HandlePanic() diff --git a/internal/imap/mailbox.go b/internal/imap/mailbox.go index 46841754..bd7ca316 100644 --- a/internal/imap/mailbox.go +++ b/internal/imap/mailbox.go @@ -106,7 +106,7 @@ func (im *imapMailbox) getFlags() []string { // // It always returns the state of DB (which could be different to server status). // Additionally it checks that all stored numbers are same as in DB and polls events if needed. -func (im *imapMailbox) Status(items []string) (*imap.MailboxStatus, error) { +func (im *imapMailbox) Status(items []imap.StatusItem) (*imap.MailboxStatus, error) { // Called from go-imap in goroutines - we need to handle panics for each function. defer im.panicHandler.HandlePanic() @@ -139,29 +139,19 @@ func (im *imapMailbox) Status(items []string) (*imap.MailboxStatus, error) { return status, nil } -// Subscribe adds the mailbox to the server's set of "active" or "subscribed" mailboxes. -func (im *imapMailbox) Subscribe() error { +// SetSubscribed adds or removes the mailbox to the server's set of "active" +// or "subscribed" mailboxes. +func (im *imapMailbox) SetSubscribed(subscribed bool) error { // Called from go-imap in goroutines - we need to handle panics for each function. defer im.panicHandler.HandlePanic() label := im.storeMailbox.LabelID() - if !im.user.isSubscribed(label) { + if subscribed && !im.user.isSubscribed(label) { im.user.removeFromCache(SubscriptionException, label) } - - return nil -} - -// Unsubscribe removes the mailbox to the server's set of "active" or "subscribed" mailboxes. -func (im *imapMailbox) Unsubscribe() error { - // Called from go-imap in goroutines - we need to handle panics for each function. - defer im.panicHandler.HandlePanic() - - label := im.storeMailbox.LabelID() - if im.user.isSubscribed(label) { + if !subscribed && im.user.isSubscribed(label) { im.user.addToCache(SubscriptionException, label) } - return nil } diff --git a/internal/imap/mailbox_message.go b/internal/imap/mailbox_message.go index 84daafa9..0151183d 100644 --- a/internal/imap/mailbox_message.go +++ b/internal/imap/mailbox_message.go @@ -265,7 +265,7 @@ func (im *imapMailbox) importMessage(m *pmapi.Message, readers []io.Reader, kr * return im.storeMailbox.ImportMessage(m, b.Bytes(), labels) } -func (im *imapMailbox) getMessage(storeMessage storeMessageProvider, items []string) (msg *imap.Message, err error) { +func (im *imapMailbox) getMessage(storeMessage storeMessageProvider, items []imap.FetchItem) (msg *imap.Message, err error) { im.log.WithField("msgID", storeMessage.ID()).Trace("Getting message") seqNum, err := storeMessage.SequenceNumber() @@ -278,9 +278,9 @@ func (im *imapMailbox) getMessage(storeMessage storeMessageProvider, items []str msg = imap.NewMessage(seqNum, items) for _, item := range items { switch item { - case imap.EnvelopeMsgAttr: + case imap.FetchEnvelope: msg.Envelope = message.GetEnvelope(m) - case imap.BodyMsgAttr, imap.BodyStructureMsgAttr: + case imap.FetchBody, imap.FetchBodyStructure: var structure *message.BodyStructure if structure, _, err = im.getBodyStructure(storeMessage); err != nil { return @@ -288,11 +288,11 @@ func (im *imapMailbox) getMessage(storeMessage storeMessageProvider, items []str if msg.BodyStructure, err = structure.IMAPBodyStructure([]int{}); err != nil { return } - case imap.FlagsMsgAttr: + case imap.FetchFlags: msg.Flags = message.GetFlags(m) - case imap.InternalDateMsgAttr: + case imap.FetchInternalDate: msg.InternalDate = time.Unix(m.Time, 0) - case imap.SizeMsgAttr: + case imap.FetchRFC822Size: // Size attribute on the server counts encrypted data. The value is cleared // on our part and we need to compute "real" size of decrypted data. if m.Size <= 0 { @@ -301,7 +301,7 @@ func (im *imapMailbox) getMessage(storeMessage storeMessageProvider, items []str } } msg.Size = uint32(m.Size) - case imap.UidMsgAttr: + case imap.FetchUid: msg.Uid, err = storeMessage.UID() if err != nil { return nil, err @@ -310,7 +310,7 @@ func (im *imapMailbox) getMessage(storeMessage storeMessageProvider, items []str s := item var section *imap.BodySectionName - if section, err = imap.NewBodySectionName(s); err != nil { + if section, err = imap.ParseBodySectionName(s); err != nil { err = nil // Ignore error break } @@ -421,13 +421,13 @@ func (im *imapMailbox) getMessageBodySection(storeMessage storeMessageProvider, // The TEXT specifier refers to the content of the message (or section), omitting the [RFC-2822] header. // Non-empty section with no specifier (imap.EntireSpecifier) refers to section content without header. response, err = structure.GetSectionContent(bodyReader, section.Path) - case section.Specifier == imap.MimeSpecifier: + case section.Specifier == imap.MIMESpecifier: // The MIME part specifier refers to the [MIME-IMB] header for this part. fallthrough case section.Specifier == imap.HeaderSpecifier: header, err = structure.GetSectionHeader(section.Path) default: - err = errors.New("Unknown specifier " + section.Specifier) + err = errors.New("Unknown specifier " + string(section.Specifier)) } } diff --git a/internal/imap/mailbox_messages.go b/internal/imap/mailbox_messages.go index b0d20370..787645c7 100644 --- a/internal/imap/mailbox_messages.go +++ b/internal/imap/mailbox_messages.go @@ -152,17 +152,17 @@ func (im *imapMailbox) SearchMessages(isUID bool, criteria *imap.SearchCriteria) // Called from go-imap in goroutines - we need to handle panics for each function. defer im.panicHandler.HandlePanic() - if criteria.Not != nil || criteria.Or[0] != nil { + if criteria.Not != nil || criteria.Or != nil { return nil, errors.New("unsupported search query") } - if criteria.Body != "" || criteria.Text != "" { + if criteria.Body != nil || criteria.Text != nil { log.Warn("Body and Text criteria not applied.") } var apiIDs []string - if criteria.SeqSet != nil { - apiIDs, err = im.apiIDsFromSeqSet(false, criteria.SeqSet) + if criteria.SeqNum != nil { + apiIDs, err = im.apiIDsFromSeqSet(false, criteria.SeqNum) } else { apiIDs, err = im.storeMailbox.GetAPIIDsFromSequenceRange(1, 0) } @@ -193,7 +193,7 @@ func (im *imapMailbox) SearchMessages(isUID bool, criteria *imap.SearchCriteria) m := storeMessage.Message() // Filter addresses. - if criteria.From != "" && !addressMatch([]*mail.Address{m.Sender}, criteria.From) { + /*if criteria.From != "" && !addressMatch([]*mail.Address{m.Sender}, criteria.From) { continue } if criteria.To != "" && !addressMatch(m.ToList, criteria.To) { @@ -204,10 +204,10 @@ func (im *imapMailbox) SearchMessages(isUID bool, criteria *imap.SearchCriteria) } if criteria.Bcc != "" && !addressMatch(m.BCCList, criteria.Bcc) { continue - } + }*/ // Filter strings. - if criteria.Subject != "" && !strings.Contains(strings.ToLower(m.Subject), strings.ToLower(criteria.Subject)) { + /*if criteria.Subject != "" && !strings.Contains(strings.ToLower(m.Subject), strings.ToLower(criteria.Subject)) { continue } if criteria.Keyword != "" && !hasKeyword(m, criteria.Keyword) { @@ -262,7 +262,7 @@ func (im *imapMailbox) SearchMessages(isUID bool, criteria *imap.SearchCriteria) } if criteria.New && !(!m.Has(pmapi.FlagOpened) && m.Unread == 1) { continue - } + }*/ // Filter internal date. if !criteria.Before.IsZero() { @@ -275,13 +275,13 @@ func (im *imapMailbox) SearchMessages(isUID bool, criteria *imap.SearchCriteria) continue } } - if !criteria.On.IsZero() { + /*if !criteria.On.IsZero() { truncated := criteria.On.Truncate(24 * time.Hour) if m.Time < truncated.Unix() || m.Time > truncated.Add(24*time.Hour).Unix() { continue } - } - if !(criteria.SentBefore.IsZero() && criteria.SentSince.IsZero() && criteria.SentOn.IsZero()) { + }*/ + if !(criteria.SentBefore.IsZero() && criteria.SentSince.IsZero() /*&& criteria.SentOn.IsZero()*/) { if t, err := m.Header.Date(); err == nil && !t.IsZero() { // Filter header date. if !criteria.SentBefore.IsZero() { @@ -294,12 +294,12 @@ func (im *imapMailbox) SearchMessages(isUID bool, criteria *imap.SearchCriteria) continue } } - if !criteria.SentOn.IsZero() { + /*if !criteria.SentOn.IsZero() { truncated := criteria.SentOn.Truncate(24 * time.Hour) if t.Unix() < truncated.Unix() || t.Unix() > truncated.Add(24*time.Hour).Unix() { continue } - } + }*/ } } @@ -337,7 +337,7 @@ func (im *imapMailbox) SearchMessages(isUID bool, criteria *imap.SearchCriteria) // 3501 section 6.4.5 for a list of items that can be requested. // // Messages must be sent to msgResponse. When the function returns, msgResponse must be closed. -func (im *imapMailbox) ListMessages(isUID bool, seqSet *imap.SeqSet, items []string, msgResponse chan<- *imap.Message) (err error) { //nolint[funlen] +func (im *imapMailbox) ListMessages(isUID bool, seqSet *imap.SeqSet, items []imap.FetchItem, msgResponse chan<- *imap.Message) (err error) { //nolint[funlen] defer func() { close(msgResponse) if err != nil { diff --git a/internal/imap/mailbox_root.go b/internal/imap/mailbox_root.go index c86ddb96..35fb08b1 100644 --- a/internal/imap/mailbox_root.go +++ b/internal/imap/mailbox_root.go @@ -71,29 +71,25 @@ func (m *imapRootMailbox) Info() (info *imap.MailboxInfo, err error) { return } -func (m *imapRootMailbox) Status(items []string) (status *imap.MailboxStatus, err error) { - status = &imap.MailboxStatus{} +func (m *imapRootMailbox) Status(_ []imap.StatusItem) (*imap.MailboxStatus, error) { + status := &imap.MailboxStatus{} if m.isFolder { status.Name = store.UserFoldersMailboxName } else { status.Name = store.UserLabelsMailboxName } - return + return status, nil } -func (m *imapRootMailbox) Subscribe() error { - return errors.New("cannot subscribe to Labels or Folders mailboxes") -} - -func (m *imapRootMailbox) Unsubscribe() error { - return errors.New("cannot unsubscribe from Labels or Folders mailboxes") +func (m *imapRootMailbox) SetSubscribed(_ bool) error { + return errors.New("cannot subscribe or unsubsribe to Labels or Folders mailboxes") } func (m *imapRootMailbox) Check() error { return nil } -func (m *imapRootMailbox) ListMessages(uid bool, seqset *imap.SeqSet, items []string, ch chan<- *imap.Message) error { +func (m *imapRootMailbox) ListMessages(uid bool, seqset *imap.SeqSet, items []imap.FetchItem, ch chan<- *imap.Message) error { close(ch) return nil } diff --git a/internal/imap/server.go b/internal/imap/server.go index b2056d69..34a45fc0 100644 --- a/internal/imap/server.go +++ b/internal/imap/server.go @@ -21,6 +21,7 @@ import ( "crypto/tls" "fmt" "io" + "net" "strings" "time" @@ -44,6 +45,8 @@ import ( type imapServer struct { server *imapserver.Server eventListener listener.Listener + debugClient bool + debugServer bool } // NewIMAPServer constructs a new IMAP server configured with the given options. @@ -55,17 +58,6 @@ func NewIMAPServer(debugClient, debugServer bool, port int, tls *tls.Config, ima s.ErrorLog = newServerErrorLogger("server-imap") s.AutoLogout = 30 * time.Minute - if debugClient || debugServer { - var localDebug, remoteDebug imap.WriterWithFields - if debugClient { - remoteDebug = &logWithFields{log: log.WithField("pkg", "imap/client"), fields: logrus.Fields{}} - } - if debugServer { - localDebug = &logWithFields{log: log.WithField("pkg", "imap/server"), fields: logrus.Fields{}} - } - s.Debug = imap.NewDebugWithFields(localDebug, remoteDebug) - } - serverID := imapid.ID{ imapid.FieldName: "ProtonMail", imapid.FieldVendor: "Proton Technologies AG", @@ -96,7 +88,7 @@ func NewIMAPServer(debugClient, debugServer bool, port int, tls *tls.Config, ima }) return sasl.NewLoginServer(func(address, password string) error { - user, err := conn.Server().Backend.Login(address, password) + user, err := conn.Server().Backend.Login(nil, address, password) if err != nil { return err } @@ -122,6 +114,8 @@ func NewIMAPServer(debugClient, debugServer bool, port int, tls *tls.Config, ima return &imapServer{ server: s, eventListener: eventListener, + debugClient: debugClient, + debugServer: debugServer, } } @@ -130,7 +124,17 @@ func (s *imapServer) ListenAndServe() { go s.monitorDisconnectedUsers() log.Info("IMAP server listening at ", s.server.Addr) - err := s.server.ListenAndServe() + l, err := net.Listen("tcp", s.server.Addr) + if err != nil { + s.eventListener.Emit(events.ErrorEvent, "IMAP failed: "+err.Error()) + log.Error("IMAP failed: ", err) + return + } + + err = s.server.Serve(&debugListener{ + Listener: l, + server: s, + }) if err != nil { s.eventListener.Emit(events.ErrorEvent, "IMAP failed: "+err.Error()) log.Error("IMAP failed: ", err) @@ -163,20 +167,38 @@ func (s *imapServer) monitorDisconnectedUsers() { } } -// logWithFields is used for debuging with additional field. -type logWithFields struct { - log *logrus.Entry - fields logrus.Fields +// debugListener sets debug loggers on server containing fields with local +// and remote addresses right after new connection is accepted. +type debugListener struct { + net.Listener + + server *imapServer } -func (lf *logWithFields) Writer() io.Writer { - w := lf.log.WithFields(lf.fields).WriterLevel(logrus.DebugLevel) - lf.fields = logrus.Fields{} - return w -} +func (dl *debugListener) Accept() (net.Conn, error) { + conn, err := dl.Listener.Accept() -func (lf *logWithFields) SetField(key, value string) { - lf.fields[key] = value + if err == nil && (dl.server.debugServer || dl.server.debugClient) { + debugLog := log + if addr := conn.LocalAddr(); addr != nil { + debugLog = debugLog.WithField("loc", addr.String()) + } + if addr := conn.RemoteAddr(); addr != nil { + debugLog = debugLog.WithField("rem", addr.String()) + } + + var localDebug, remoteDebug io.Writer + if dl.server.debugServer { + localDebug = debugLog.WithField("pkg", "imap/server").WriterLevel(logrus.DebugLevel) + } + if dl.server.debugClient { + remoteDebug = debugLog.WithField("pkg", "imap/client").WriterLevel(logrus.DebugLevel) + } + + dl.server.server.Debug = imap.NewDebugWriter(localDebug, remoteDebug) + } + + return conn, err } // serverErrorLogger implements go-imap/logger interface. @@ -188,17 +210,12 @@ func newServerErrorLogger(tag string) *serverErrorLogger { return &serverErrorLogger{tag} } -func (s *serverErrorLogger) CheckErrorForReport(serverErr string) { -} - func (s *serverErrorLogger) Printf(format string, args ...interface{}) { err := fmt.Sprintf(format, args...) - s.CheckErrorForReport(err) log.WithField("pkg", s.tag).Error(err) } func (s *serverErrorLogger) Println(args ...interface{}) { err := fmt.Sprintln(args...) - s.CheckErrorForReport(err) log.WithField("pkg", s.tag).Error(err) } diff --git a/internal/imap/uidplus/extension.go b/internal/imap/uidplus/extension.go index 5eee2123..6432b0f1 100644 --- a/internal/imap/uidplus/extension.go +++ b/internal/imap/uidplus/extension.go @@ -141,7 +141,7 @@ func (ext *extension) Capabilities(c server.Conn) []string { } func (ext *extension) Command(name string) server.HandlerFactory { - if name == imap.Expunge { + if name == "EXPUNGE" { return func() server.Handler { return &UIDExpunge{} } @@ -165,7 +165,7 @@ func getStatusResponseCopy(uidValidity uint32, sourceSeq, targetSeq *OrderedSeq) } return &imap.StatusResp{ - Type: imap.StatusOk, + Type: imap.StatusRespOk, Info: info, } } @@ -187,7 +187,7 @@ func getStatusResponseAppend(uidValidity uint32, targetSeq *OrderedSeq) *imap.St } return &imap.StatusResp{ - Type: imap.StatusOk, + Type: imap.StatusRespOk, Info: info, } } diff --git a/internal/store/change.go b/internal/store/change.go index 319fea36..47d29778 100644 --- a/internal/store/change.go +++ b/internal/store/change.go @@ -39,9 +39,9 @@ func (store *Store) SetIMAPUpdateChannel(updates chan interface{}) { func (store *Store) imapNotice(address, notice string) { update := new(imapBackend.StatusUpdate) - update.Username = address + update.Update = imapBackend.NewUpdate(address, "") update.StatusResp = &imap.StatusResp{ - Type: imap.StatusOk, + Type: imap.StatusRespOk, Code: imap.CodeAlert, Info: notice, } @@ -57,9 +57,8 @@ func (store *Store) imapUpdateMessage(address, mailboxName string, uid, sequence "flags": message.GetFlags(msg), }).Trace("IDLE update") update := new(imapBackend.MessageUpdate) - update.Username = address - update.Mailbox = mailboxName - update.Message = imap.NewMessage(sequenceNumber, []string{imap.FlagsMsgAttr, imap.UidMsgAttr}) + update.Update = imapBackend.NewUpdate(address, mailboxName) + update.Message = imap.NewMessage(sequenceNumber, []imap.FetchItem{imap.FetchFlags, imap.FetchUid}) update.Message.Flags = message.GetFlags(msg) update.Message.Uid = uid store.imapSendUpdate(update) @@ -72,8 +71,7 @@ func (store *Store) imapDeleteMessage(address, mailboxName string, sequenceNumbe "seqNum": sequenceNumber, }).Trace("IDLE delete") update := new(imapBackend.ExpungeUpdate) - update.Username = address - update.Mailbox = mailboxName + update.Update = imapBackend.NewUpdate(address, mailboxName) update.SeqNum = sequenceNumber store.imapSendUpdate(update) } @@ -86,9 +84,8 @@ func (store *Store) imapMailboxStatus(address, mailboxName string, total, unread "unread": unread, }).Trace("IDLE status") update := new(imapBackend.MailboxUpdate) - update.Username = address - update.Mailbox = mailboxName - update.MailboxStatus = imap.NewMailboxStatus(mailboxName, []string{imap.MailboxMessages, imap.MailboxUnseen}) + update.Update = imapBackend.NewUpdate(address, mailboxName) + update.MailboxStatus = imap.NewMailboxStatus(mailboxName, []imap.StatusItem{imap.StatusMessages, imap.StatusUnseen}) update.MailboxStatus.Messages = uint32(total) update.MailboxStatus.Unseen = uint32(unread) store.imapSendUpdate(update) diff --git a/pkg/message/message.go b/pkg/message/message.go index 56d42c76..fedfaa59 100644 --- a/pkg/message/message.go +++ b/pkg/message/message.go @@ -45,8 +45,8 @@ func GetRelatedBoundary(m *pmapi.Message) string { func GetBodyStructure(m *pmapi.Message) (bs *imap.BodyStructure) { //nolint[funlen] bs = &imap.BodyStructure{ - MimeType: "multipart", - MimeSubType: "mixed", + MIMEType: "multipart", + MIMESubType: "mixed", Params: map[string]string{"boundary": GetBoundary(m)}, } var inlineParts []*imap.BodyStructure @@ -63,8 +63,8 @@ func GetBodyStructure(m *pmapi.Message) (bs *imap.BodyStructure) { //nolint[funl } part := &imap.BodyStructure{ - MimeType: typeParts[0], - MimeSubType: typeParts[1], + MIMEType: typeParts[0], + MIMESubType: typeParts[1], Params: map[string]string{"name": att.Name}, Encoding: "base64", } @@ -81,8 +81,8 @@ func GetBodyStructure(m *pmapi.Message) (bs *imap.BodyStructure) { //nolint[funl if len(inlineParts) > 0 { // Set to multipart-related for inline attachments. relatedPart := &imap.BodyStructure{ - MimeType: "multipart", - MimeSubType: "related", + MIMEType: "multipart", + MIMESubType: "related", Params: map[string]string{"boundary": GetRelatedBoundary(m)}, } @@ -93,8 +93,8 @@ func GetBodyStructure(m *pmapi.Message) (bs *imap.BodyStructure) { //nolint[funl } relatedPart.Parts = append(relatedPart.Parts, &imap.BodyStructure{ - MimeType: "text", - MimeSubType: subType, + MIMEType: "text", + MIMESubType: subType, Params: map[string]string{"charset": "utf-8"}, Encoding: "quoted-printable", Disposition: "inline", @@ -109,8 +109,8 @@ func GetBodyStructure(m *pmapi.Message) (bs *imap.BodyStructure) { //nolint[funl } bs.Parts = append(bs.Parts, &imap.BodyStructure{ - MimeType: "text", - MimeSubType: subType, + MIMEType: "text", + MIMESubType: subType, Params: map[string]string{"charset": "utf-8"}, Encoding: "quoted-printable", Disposition: "inline", @@ -150,12 +150,12 @@ func GetMIMEBodyStructure(m *pmapi.Message, parsedMsg *enmime.Envelope) (bs *ima typeParts := strings.SplitN(mediaType, "/", 2) bs = &imap.BodyStructure{ - MimeType: typeParts[0], + MIMEType: typeParts[0], Params: params, } if len(typeParts) > 1 { - bs.MimeSubType = typeParts[1] + bs.MIMESubType = typeParts[1] } bs.Parts = getChildrenParts(root) @@ -173,14 +173,14 @@ func getChildrenParts(root *enmime.Part) (parts []*imap.BodyStructure) { typeParts := strings.SplitN(mediaType, "/", 2) childrenParts := getChildrenParts(child) part := &imap.BodyStructure{ - MimeType: typeParts[0], + MIMEType: typeParts[0], Params: params, Encoding: child.Charset, Disposition: child.Disposition, Parts: childrenParts, } if len(typeParts) > 1 { - part.MimeSubType = typeParts[1] + part.MIMESubType = typeParts[1] } parts = append(parts, part) } diff --git a/pkg/message/section.go b/pkg/message/section.go index 3cfde487..fac92ea4 100644 --- a/pkg/message/section.go +++ b/pkg/message/section.go @@ -369,8 +369,8 @@ func (bs *BodyStructure) IMAPBodyStructure(currentPart []int) (imapBS *imap.Body mediaTypeSep = append(mediaTypeSep, "") imapBS = &imap.BodyStructure{ - MimeType: mediaTypeSep[0], - MimeSubType: mediaTypeSep[1], + MIMEType: mediaTypeSep[0], + MIMESubType: mediaTypeSep[1], Params: params, Size: uint32(info.bsize), Lines: uint32(info.lines), diff --git a/test/imap_checks_test.go b/test/imap_checks_test.go index 88459c60..9bd0c438 100644 --- a/test/imap_checks_test.go +++ b/test/imap_checks_test.go @@ -110,7 +110,7 @@ func imapClientDoesNotReceiveUpdateForMessageWithin(clientID, messageUIDs string } func iterateOverSeqSet(seqSet string, callback func(string)) { - seq, err := imap.NewSeqSet(seqSet) + seq, err := imap.ParseSeqSet(seqSet) if err != nil { panic(err) }