Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

POP3 missing support for starttls #48723

Closed
lmctv mannequin opened this issue Nov 30, 2008 · 26 comments
Closed

POP3 missing support for starttls #48723

lmctv mannequin opened this issue Nov 30, 2008 · 26 comments
Labels
stdlib Python modules in the Lib dir topic-email type-feature A feature request or enhancement

Comments

@lmctv
Copy link
Mannequin

lmctv mannequin commented Nov 30, 2008

BPO 4473
Nosy @warsaw, @jcea, @pitrou, @giampaolo, @lmctv, @bitdancer
Files
  • poplib_01_socket_shutdown_v3.diff
  • poplib_02_server_capabilities_v4.diff
  • poplib_03_starttls_v5.diff
  • Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.

    Show more details

    GitHub fields:

    assignee = None
    closed_at = <Date 2012-11-23.19:19:19.250>
    created_at = <Date 2008-11-30.16:39:02.356>
    labels = ['type-feature', 'library', 'expert-email']
    title = 'POP3 missing support for starttls'
    updated_at = <Date 2012-11-24.17:15:19.773>
    user = 'https://github.com/lmctv'

    bugs.python.org fields:

    activity = <Date 2012-11-24.17:15:19.773>
    actor = 'python-dev'
    assignee = 'none'
    closed = True
    closed_date = <Date 2012-11-23.19:19:19.250>
    closer = 'pitrou'
    components = ['Library (Lib)', 'email']
    creation = <Date 2008-11-30.16:39:02.356>
    creator = 'lcatucci'
    dependencies = []
    files = ['26250', '28025', '28085']
    hgrepos = []
    issue_num = 4473
    keywords = ['patch']
    message_count = 26.0
    messages = ['76643', '76645', '76713', '76717', '76719', '76734', '76735', '76744', '76745', '81327', '81330', '91094', '100776', '163514', '163817', '164586', '164601', '164627', '175796', '175877', '176125', '176164', '176214', '176216', '176217', '176296']
    nosy_count = 8.0
    nosy_names = ['barry', 'jcea', 'janssen', 'pitrou', 'giampaolo.rodola', 'lcatucci', 'r.david.murray', 'python-dev']
    pr_nums = []
    priority = 'normal'
    resolution = 'fixed'
    stage = 'resolved'
    status = 'closed'
    superseder = None
    type = 'enhancement'
    url = 'https://bugs.python.org/issue4473'
    versions = ['Python 3.4']

    @lmctv
    Copy link
    Mannequin Author

    lmctv mannequin commented Nov 30, 2008

    In the enclosed patch, there are four changes

    1. add support for the optional CAPA pop command, since it is needed
      for starttls support discovery
    2. add support for the STLS pop command
    3. replace home-grown file-like methods and replace them with ssl
      socket's makefile() in POP3_SSL
    4. Properly shutdown sockets at close() time to avoid server-side pile-up

    @lmctv
    Copy link
    Mannequin Author

    lmctv mannequin commented Nov 30, 2008

    The needed changes to documentation if the patch gets accepted

    @vstinner
    Copy link
    Member

    vstinner commented Dec 1, 2008

    You might split your patch into smaller patches, example:

    • patch 1: implement CAPA method
    • patch 2: POP3_SSL refatoring
    • patch 3: stls() method

    Comments:

    • Do you really need to keep a reference to the "raw" socket
      (self._sock) for a SSL connection?
    • I don't understand what is sock.shutdown(SHUT_RDWR). When is it
      needed? Does it change the behaviour?
    • Could you write a method to parse the capabilities because I hate
      long lambda function. You may write doctest for the new method :-)

    @lmctv
    Copy link
    Mannequin Author

    lmctv mannequin commented Dec 1, 2008

    I understand the need to keep things simple, but this time the split
    seemed a bit overkill. If needed, I'll redo the patch into a small
    series. Thinking of it... I was unsure if it really made sense to split
    out smtp/pop/imap patches instead of sending them all at once... :-)

    As for the shutdown before close, it's needed to let the server know
    we are leaving, instead of waiting until socket timeout. This is the
    reason I need to keep the reference to the wrapped socket.

    You don't usually configure maildrop servers to limit the number/rate of
    connects as you do on smtp servers; still, you could get into problems
    with stateful forewalls or the like.

    @vstinner
    Copy link
    Member

    vstinner commented Dec 2, 2008

    As for the shutdown before close, it's needed to let the server know
    we are leaving, instead of waiting until socket timeout.

    Extracts of an UNIX FAQ [1]:
    "Generally the difference between close() and shutdown() is: close()
    closes the socket id for the process but the connection is still
    opened if another process shares this socket id."

    "i have noticed on some (mostly non-unix) operating systems though a
    close by all processes (threads) is not enough to correctly flush
    data, (or threads) is not. A shutdown must be done, but on many
    systems it is superfulous."

    So shutdown() is useless on most OS, but it looks like it's better to
    use it ;-)

    This is the reason I need to keep the reference to the wrapped
    socket.

    You don't need to do that. The wrapper already calls shutdown() of the
    parent socket (see Lib/ssl.py).

    [1] http://www.developerweb.net/forum/archive/index.php/t-2940.html

    @lmctv
    Copy link
    Mannequin Author

    lmctv mannequin commented Dec 2, 2008

    I'm reasonably sure Victor is right about the original socket being
    unneeded. How does the series look now?

    @vstinner
    Copy link
    Member

    vstinner commented Dec 2, 2008

    "lst[1:] if len(lst)>1 else []" is useless, lst[1:] alone does the
    same :-) So it can be simplify to:
    def _parsecap(line):
    lst = line.split()
    return lst[0], lst[1:]

    You might add a real example in the capa() docstring.

    About poplib_02_sock_shutdown.diff: I'm not sure that poplib is the
    right place to fix the issue... if there is really an issue. Why not
    calling shutdown directly in socket.close()? :-)

    You removed self._sock, nice.

    @lmctv
    Copy link
    Mannequin Author

    lmctv mannequin commented Dec 2, 2008

    Changed CAPA as requested: now there is a proper docstring, and the
    useless if ... else ... is gone.

    @lmctv
    Copy link
    Mannequin Author

    lmctv mannequin commented Dec 2, 2008

    As for the shutdown/close comment, I think there could be cases
    where you are going to close but don't want to shutdown: e.g. you might
    close a dup-ed socket, but the other owner would want to continue
    working with his copy of the socket.

    @lmctv lmctv mannequin added the stdlib Python modules in the Lib dir label Feb 7, 2009
    @lmctv
    Copy link
    Mannequin Author

    lmctv mannequin commented Feb 7, 2009

    There is a problem I forgot to state with test_anonlogin:
    since I try and test both SSL and starttls, the DoS checker at cmu kicks
    in and refuse the login attempt in PopSSLTest. Since I'd rather avoid
    cheating, I'm leaning to try logging in as SomeUser, and expecting a
    failure in both cases. Comments?

    @lmctv
    Copy link
    Mannequin Author

    lmctv mannequin commented Feb 7, 2009

    I'm enclosing the expected-failure version of test_popnet. It's much
    simpler to talk and comment about something you can see!

    @jcea
    Copy link
    Member

    jcea commented Jul 30, 2009

    How is going? Any hope for 2.7/3.2?

    @jcea
    Copy link
    Member

    jcea commented Mar 10, 2010

    Ping...

    Any hope for 2.7/3.2?

    @pitrou pitrou added the type-feature A feature request or enhancement label Mar 12, 2010
    @jcea
    Copy link
    Member

    jcea commented Jun 23, 2012

    3.3 beta will be published next Sunday. Any hope?

    Lorenzo, is your patch applicable to 3.3?

    @lmctv
    Copy link
    Mannequin Author

    lmctv mannequin commented Jun 24, 2012

    I've refreshed the patches to apply on 3.3, and adapted the to the
    unit-test framework by giampaolo.rodola.

    @lmctv
    Copy link
    Mannequin Author

    lmctv mannequin commented Jul 3, 2012

    I've refreshed once more the patches, adding the implementation of the stls command in test_poplib.py.

    IMHO, the changes as they stand now are low risk, and could as well go into 3.3.

    With many thanks to Giampaolo for implementing the asynchat/asyncore pop3 server!

    @jcea
    Copy link
    Member

    jcea commented Jul 3, 2012

    Lorenzo, 3.3 is in beta mode now. No new features accepted :-(.

    Please, fulfill a PSF contributor agreement http://www.python.org/psf/contrib/

    @lmctv
    Copy link
    Mannequin Author

    lmctv mannequin commented Jul 3, 2012

    Jesús,
    as requested, I've scanned and sent the signed contributor agreement.

    In the meanwhile, I updated once more patches 01 and 03:

    01: stealed the socket shutdown check from Antoine Pitrou's r66134
    03: adapt DummyPOP3_SSLHandler to use the handle_read() and
    the _do_tls_handshake() methods inherited from DummyPOP3Handler

    As for the "no-new-features"... I know, I know... (that's the reason why I wrote that big "in my HUMBLE opionion" ;-)

    @pitrou
    Copy link
    Member

    pitrou commented Nov 17, 2012

    Hello,

    Here are some comments about the patches:

    1. poplib_01_socket_shutdown_v3.diff: looks fine to me

    2. poplib_02_server_capabilities_v3.diff:

    • please try to follow PEP-8 (i.e. capa = {} not capa={})
    • I think the capa() result should be a dict mapping str keys to str values (not bytes), since that part of the POP3 protocol seems to have a well-defined character set (ASCII)
    1. poplib_03_starttls_v3.diff:
    • same comment about PEP-8
    • why did you change the signature of the _create_socket() method? it looks gratuitous
    • the new method should be called starttls() as in other modules, not stls()
    • starttls() should only take a context argument; no need to support separate keyfile and certfile arguments
    • what is the point of catching errors like this:

    + except error_proto as _err:
    + resp = _err

    @lmctv
    Copy link
    Mannequin Author

    lmctv mannequin commented Nov 18, 2012

    Updated 02 and 03 patches (mostly) in line with Antoine's review comments:

    1. poplib_02_server_capabilities_v3.diff:
    • please try to follow PEP-8 (i.e. capa = {} not capa={})
    • I think the capa() result should be a dict mapping str keys to str > values (not bytes), since that part of the POP3 protocol seems to
      have a well-defined character set (ASCII)

    Completely right. Done.

    1. poplib_03_starttls_v3.diff:
    • same comment about PEP-8

    where?

    • why did you change the signature of the _create_socket()
      method? it looks gratuitous

    undone

    • the new method should be called starttls() as in other modules, not > stls()

    Here I'm following: at :ref:`pop3-objects` in Doc/library/poplib.rst,

    All POP3 commands are represented by methods of the same name, in
    lower-case; most return the response text sent by the server.

    IMHO, having a single method with a name different than the underlying
    POP command would just be confusing. For this reason, I'd rather avoid
    adding an alias like in

        starttls = stls

    or the reverse...

    • starttls() should only take a context argument; no need to support > separate keyfile and certfile arguments

    Right, non need to mimick pre-SSLContext method signatures!

    • what is the point of catching errors like this:
      [...]

    undone

    @pitrou
    Copy link
    Member

    pitrou commented Nov 22, 2012

    where?

    In caps=self.capa() (you need a space around the assignment operator).

    Here I'm following: at :ref:`pop3-objects` in Doc/library/poplib.rst,

    Ah, ok. Then I agree it makes sense to call it stls(). No need for an alias, IMO.

    @lmctv
    Copy link
    Mannequin Author

    lmctv mannequin commented Nov 23, 2012

    OK, I'm uploading poplib_03_starttls_v5.diff; I only changed the
    "caps=self.capa()" into "caps = self.capa()" in the "@@ -352,21 +360,42 @@ class POP3:" hunk.

    Thank you for pointing at the line; I tried to run PEP-8.py on poplib.py, but failed to find the line, since I was overwhelmed by the reported pre-existing PEP-8 inconsistencies...

    I'm tempted to open a PEP-8 issue on poplib after we finish with stls...

    Thank you very much for reviewing!

    @pitrou
    Copy link
    Member

    pitrou commented Nov 23, 2012

    Thank you Lorenzo. Your patch lacks a couple of details, such as "versionadded" and "versionchanged" tags, but I can handle this myself.

    @python-dev
    Copy link
    Mannequin

    python-dev mannequin commented Nov 23, 2012

    New changeset 79e33578dc05 by Antoine Pitrou in branch 'default':
    Issue bpo-4473: Ensure the socket is shutdown cleanly in POP3.close().
    http://hg.python.org/cpython/rev/79e33578dc05

    New changeset d30fd9834cec by Antoine Pitrou in branch 'default':
    Issue bpo-4473: Add a POP3.capa() method to query the capabilities advertised by the POP3 server.
    http://hg.python.org/cpython/rev/d30fd9834cec

    New changeset 2329f9198d7f by Antoine Pitrou in branch 'default':
    Issue bpo-4473: Add a POP3.stls() to switch a clear-text POP3 session into an encrypted POP3 session, on supported servers.
    http://hg.python.org/cpython/rev/2329f9198d7f

    @pitrou
    Copy link
    Member

    pitrou commented Nov 23, 2012

    Patches committed. Thank you very much!

    @pitrou pitrou closed this as completed Nov 23, 2012
    @python-dev
    Copy link
    Mannequin

    python-dev mannequin commented Nov 24, 2012

    New changeset 75a146a657d9 by Antoine Pitrou in branch 'default':
    Fix missing import (followup to bpo-4473).
    http://hg.python.org/cpython/rev/75a146a657d9

    @ezio-melotti ezio-melotti transferred this issue from another repository Apr 10, 2022
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    stdlib Python modules in the Lib dir topic-email type-feature A feature request or enhancement
    Projects
    None yet
    Development

    No branches or pull requests

    4 participants