18ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen"""
28ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenThe MIT License
38ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
48ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenCopyright (c) 2007-2010 Leah Culver, Joe Stump, Mark Paschal, Vic Fryzel
58ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
68ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenPermission is hereby granted, free of charge, to any person obtaining a copy
78ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenof this software and associated documentation files (the "Software"), to deal
88ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenin the Software without restriction, including without limitation the rights
98ae428e0fb7feea16d79853f29447469a93bedffKristian Monsento use, copy, modify, merge, publish, distribute, sublicense, and/or sell
108ae428e0fb7feea16d79853f29447469a93bedffKristian Monsencopies of the Software, and to permit persons to whom the Software is
118ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenfurnished to do so, subject to the following conditions:
128ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
138ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenThe above copyright notice and this permission notice shall be included in
148ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenall copies or substantial portions of the Software.
158ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
168ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
178ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
188ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
198ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
208ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
218ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
228ae428e0fb7feea16d79853f29447469a93bedffKristian MonsenTHE SOFTWARE.
238ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen"""
248ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
258ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenimport oauth2
268ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenimport imaplib
278ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
288ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
298ae428e0fb7feea16d79853f29447469a93bedffKristian Monsenclass IMAP4_SSL(imaplib.IMAP4_SSL):
308ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    """IMAP wrapper for imaplib.IMAP4_SSL that implements XOAUTH."""
318ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
328ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen    def authenticate(self, url, consumer, token):
338ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen        if consumer is not None and not isinstance(consumer, oauth2.Consumer):
348ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen            raise ValueError("Invalid consumer.")
358ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
368ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen        if token is not None and not isinstance(token, oauth2.Token):
378ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen            raise ValueError("Invalid token.")
388ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen
398ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen        imaplib.IMAP4_SSL.authenticate(self, 'XOAUTH',
408ae428e0fb7feea16d79853f29447469a93bedffKristian Monsen            lambda x: oauth2.build_xoauth_string(url, consumer, token))
41