~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/smtp_connection.py

  • Committer: Vincent Ladeuil
  • Date: 2007-10-09 20:32:29 UTC
  • mto: (2903.1.1 trunk)
  • mto: This revision was merged to the branch mainline in revision 2904.
  • Revision ID: v.ladeuil+lp@free.fr-20071009203229-5k200m1g7mf4jf9l
Fix 149019 by using a proper line number when reporting errors.

* bzrlib/util/configobj/configobj.py:
(ConfigObj._handle_error): Trivial fix. Since cur_index is
0-based, line number was off by one.

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
17
"""A convenience class around smtplib."""
18
18
 
21
21
import smtplib
22
22
import socket
23
23
 
24
 
from bzrlib import (
25
 
    config,
26
 
    osutils,
27
 
    )
 
24
from bzrlib import ui
28
25
from bzrlib.errors import (
29
26
    NoDestinationAddress,
30
27
    SMTPError,
64
61
            return
65
62
 
66
63
        self._create_connection()
67
 
        # FIXME: _authenticate() should only be called when the server has
68
 
        # refused unauthenticated access, so it can safely try to authenticate 
69
 
        # with the default username. JRV20090407
70
64
        self._authenticate()
71
65
 
72
66
    def _create_connection(self):
85
79
            else:
86
80
                raise
87
81
 
88
 
        # Say EHLO (falling back to HELO) to query the server's features.
89
 
        code, resp = self._connection.ehlo()
90
 
        if not (200 <= code <= 299):
91
 
            code, resp = self._connection.helo()
92
 
            if not (200 <= code <= 299):
93
 
                raise SMTPError("server refused HELO: %d %s" % (code, resp))
94
 
 
95
 
        # Use TLS if the server advertised it:
96
 
        if self._connection.has_extn("starttls"):
97
 
            code, resp = self._connection.starttls()
98
 
            if not (200 <= code <= 299):
99
 
                raise SMTPError("server refused STARTTLS: %d %s" % (code, resp))
100
 
            # Say EHLO again, to check for newly revealed features
101
 
            code, resp = self._connection.ehlo()
102
 
            if not (200 <= code <= 299):
103
 
                raise SMTPError("server refused EHLO: %d %s" % (code, resp))
 
82
        # If this fails, it just returns an error, but it shouldn't raise an
 
83
        # exception unless something goes really wrong (in which case we want
 
84
        # to fail anyway).
 
85
        self._connection.starttls()
104
86
 
105
87
    def _authenticate(self):
106
88
        """If necessary authenticate yourself to the server."""
107
 
        auth = config.AuthenticationConfig()
108
89
        if self._smtp_username is None:
109
 
            # FIXME: Since _authenticate gets called even when no authentication
110
 
            # is necessary, it's not possible to use the default username 
111
 
            # here yet.
112
 
            self._smtp_username = auth.get_user('smtp', self._smtp_server)
113
 
            if self._smtp_username is None:
114
 
                return
 
90
            return
115
91
 
116
92
        if self._smtp_password is None:
117
 
            self._smtp_password = auth.get_password(
118
 
                'smtp', self._smtp_server, self._smtp_username)
119
 
 
120
 
        # smtplib requires that the username and password be byte
121
 
        # strings.  The CRAM-MD5 spec doesn't give any guidance on
122
 
        # encodings, but the SASL PLAIN spec says UTF-8, so that's
123
 
        # what we'll use.
124
 
        username = osutils.safe_utf8(self._smtp_username)
125
 
        password = osutils.safe_utf8(self._smtp_password)
126
 
 
127
 
        self._connection.login(username, password)
 
93
            self._smtp_password = ui.ui_factory.get_password(
 
94
                'Please enter the SMTP password: %(user)s@%(host)s',
 
95
                user=self._smtp_username,
 
96
                host=self._smtp_server)
 
97
 
 
98
        self._connection.login(self._smtp_username, self._smtp_password)
128
99
 
129
100
    @staticmethod
130
101
    def get_message_addresses(message):