bpo-37390: Add audit event table to documentations (GH-14406)

Also updates some (unreleased) event names to be consistent with the others.
(cherry picked from commit 44f91c388a)

Co-authored-by: Steve Dower <steve.dower@python.org>
This commit is contained in:
Miss Islington (bot) 2019-06-27 11:07:16 -07:00 committed by GitHub
parent 60f24b23bf
commit 4fee28aa42
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
34 changed files with 266 additions and 113 deletions

View File

@ -45,7 +45,7 @@ bound into a function.
The first parameter (*argcount*) now represents the total number of positional arguments, The first parameter (*argcount*) now represents the total number of positional arguments,
including positional-only. including positional-only.
.. audit-event:: code.__new__ "code filename name argcount posonlyargcount kwonlyargcount nlocals stacksize flags" .. audit-event:: code.__new__ code,filename,name,argcount,posonlyargcount,kwonlyargcount,nlocals,stacksize,flags c.PyCode_New
.. c:function:: PyCodeObject* PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno) .. c:function:: PyCodeObject* PyCode_NewEmpty(const char *filename, const char *funcname, int firstlineno)

View File

@ -291,8 +291,6 @@ accessible to C code. They all work with the current interpreter thread's
.. c:function:: int PySys_Audit(const char *event, const char *format, ...) .. c:function:: int PySys_Audit(const char *event, const char *format, ...)
.. index:: single: audit events
Raises an auditing event with any active hooks. Returns zero for success Raises an auditing event with any active hooks. Returns zero for success
and non-zero with an exception set on failure. and non-zero with an exception set on failure.
@ -311,8 +309,6 @@ accessible to C code. They all work with the current interpreter thread's
.. c:function:: int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData) .. c:function:: int PySys_AddAuditHook(Py_AuditHookFunction hook, void *userData)
.. index:: single: audit events
Adds to the collection of active auditing hooks. Returns zero for success Adds to the collection of active auditing hooks. Returns zero for success
and non-zero on failure. If the runtime has been initialized, also sets an and non-zero on failure. If the runtime has been initialized, also sets an
error on failure. Hooks added through this API are called for all error on failure. Hooks added through this API are called for all

View File

@ -83,7 +83,7 @@ The module defines the following type:
to add initial items to the array. Otherwise, the iterable initializer is to add initial items to the array. Otherwise, the iterable initializer is
passed to the :meth:`extend` method. passed to the :meth:`extend` method.
.. audit-event:: array.__new__ "typecode initializer" .. audit-event:: array.__new__ typecode,initializer array.array
.. data:: typecodes .. data:: typecodes

View File

@ -0,0 +1,21 @@
.. _audit-events:
.. index:: single: audit events
Audit events table
==================
This table contains all events raised by :func:`sys.audit` or
:c:func:`PySys_Audit` calls throughout the CPython runtime and the
standard library.
See :func:`sys.addaudithook` and :c:func:`PySys_AddAuditHook` for
information on handling these events.
.. impl-detail::
This table is generated from the CPython documentation, and may not
represent events raised by other implementations. See your runtime
specific documentation for actual events raised.
.. audit-event-table::

View File

@ -1509,13 +1509,13 @@ object is available:
:c:type:`int`, which is of course not always the truth, so you have to assign :c:type:`int`, which is of course not always the truth, so you have to assign
the correct :attr:`restype` attribute to use these functions. the correct :attr:`restype` attribute to use these functions.
.. audit-event:: ctypes.dlopen name .. audit-event:: ctypes.dlopen name ctypes.LibraryLoader
Loading a library through any of these objects raises an Loading a library through any of these objects raises an
:ref:`auditing event <auditing>` ``ctypes.dlopen`` with string argument :ref:`auditing event <auditing>` ``ctypes.dlopen`` with string argument
``name``, the name used to load the library. ``name``, the name used to load the library.
.. audit-event:: ctypes.dlsym "library name" .. audit-event:: ctypes.dlsym library,name ctypes.LibraryLoader
Accessing a function on a loaded library raises an auditing event Accessing a function on a loaded library raises an auditing event
``ctypes.dlsym`` with arguments ``library`` (the library object) and ``name`` ``ctypes.dlsym`` with arguments ``library`` (the library object) and ``name``
@ -2043,7 +2043,7 @@ Data types
This method returns a ctypes type instance using the memory specified by This method returns a ctypes type instance using the memory specified by
*address* which must be an integer. *address* which must be an integer.
.. audit-event:: ctypes.cdata address .. audit-event:: ctypes.cdata address ctypes._CData.from_address
This method, and others that indirectly call this method, raises an This method, and others that indirectly call this method, raises an
:ref:`auditing event <auditing>` ``ctypes.cdata`` with argument :ref:`auditing event <auditing>` ``ctypes.cdata`` with argument

View File

@ -5,10 +5,13 @@ Debugging and Profiling
These libraries help you with Python development: the debugger enables you to These libraries help you with Python development: the debugger enables you to
step through code, analyze stack frames and set breakpoints etc., and the step through code, analyze stack frames and set breakpoints etc., and the
profilers run code and give you a detailed breakdown of execution times, profilers run code and give you a detailed breakdown of execution times,
allowing you to identify bottlenecks in your programs. allowing you to identify bottlenecks in your programs. Auditing events
provide visibility into runtime behaviors that would otherwise require
intrusive debugging or patching.
.. toctree:: .. toctree::
audit_events.rst
bdb.rst bdb.rst
faulthandler.rst faulthandler.rst
pdb.rst pdb.rst

View File

@ -119,7 +119,7 @@ Module API
*verbosity* controls the level of output to :data:`sys.stdout` from the *verbosity* controls the level of output to :data:`sys.stdout` from the
bootstrapping operation. bootstrapping operation.
.. audit-event:: ensurepip.bootstrap root .. audit-event:: ensurepip.bootstrap root ensurepip.bootstrap
.. note:: .. note::

View File

@ -190,7 +190,7 @@ followed by ``lines`` for the text version or ``binary`` for the binary version.
*source_address* is a 2-tuple ``(host, port)`` for the socket to bind to as *source_address* is a 2-tuple ``(host, port)`` for the socket to bind to as
its source address before connecting. its source address before connecting.
.. audit-event:: ftplib.FTP.connect "self host port" .. audit-event:: ftplib.connect self,host,port ftplib.FTP.connect
.. versionchanged:: 3.3 .. versionchanged:: 3.3
*source_address* parameter was added. *source_address* parameter was added.
@ -225,7 +225,7 @@ followed by ``lines`` for the text version or ``binary`` for the binary version.
Send a simple command string to the server and return the response string. Send a simple command string to the server and return the response string.
.. audit-event:: ftplib.FTP.sendcmd "self cmd" .. audit-event:: ftplib.sendcmd self,cmd ftplib.FTP.sendcmd
.. method:: FTP.voidcmd(cmd) .. method:: FTP.voidcmd(cmd)
@ -234,7 +234,7 @@ followed by ``lines`` for the text version or ``binary`` for the binary version.
nothing if a response code corresponding to success (codes in the range nothing if a response code corresponding to success (codes in the range
200--299) is received. Raise :exc:`error_reply` otherwise. 200--299) is received. Raise :exc:`error_reply` otherwise.
.. audit-event:: ftplib.FTP.sendcmd "self cmd" .. audit-event:: ftplib.sendcmd self,cmd ftplib.FTP.voidcmd
.. method:: FTP.retrbinary(cmd, callback, blocksize=8192, rest=None) .. method:: FTP.retrbinary(cmd, callback, blocksize=8192, rest=None)

View File

@ -128,7 +128,7 @@ are always available. They are listed here in alphabetical order.
:func:`breakpoint` will automatically call that, allowing you to drop into :func:`breakpoint` will automatically call that, allowing you to drop into
the debugger of choice. the debugger of choice.
.. audit-event:: builtins.breakpoint "sys.breakpointhook" .. audit-event:: builtins.breakpoint breakpointhook breakpoint
.. versionadded:: 3.7 .. versionadded:: 3.7
@ -277,7 +277,7 @@ are always available. They are listed here in alphabetical order.
If you want to parse Python code into its AST representation, see If you want to parse Python code into its AST representation, see
:func:`ast.parse`. :func:`ast.parse`.
.. audit-event:: compile "source filename" .. audit-event:: compile source,filename compile
Raises an :ref:`auditing event <auditing>` ``compile`` with arguments Raises an :ref:`auditing event <auditing>` ``compile`` with arguments
``source`` and ``filename``. This event may also be raised by implicit ``source`` and ``filename``. This event may also be raised by implicit
@ -490,7 +490,7 @@ are always available. They are listed here in alphabetical order.
See :func:`ast.literal_eval` for a function that can safely evaluate strings See :func:`ast.literal_eval` for a function that can safely evaluate strings
with expressions containing only literals. with expressions containing only literals.
.. audit-event:: exec code_object .. audit-event:: exec code_object eval
Raises an :ref:`auditing event <auditing>` ``exec`` with the code object Raises an :ref:`auditing event <auditing>` ``exec`` with the code object
as the argument. Code compilation events may also be raised. as the argument. Code compilation events may also be raised.
@ -525,7 +525,7 @@ are always available. They are listed here in alphabetical order.
builtins are available to the executed code by inserting your own builtins are available to the executed code by inserting your own
``__builtins__`` dictionary into *globals* before passing it to :func:`exec`. ``__builtins__`` dictionary into *globals* before passing it to :func:`exec`.
.. audit-event:: exec code_object .. audit-event:: exec code_object exec
Raises an :ref:`auditing event <auditing>` ``exec`` with the code object Raises an :ref:`auditing event <auditing>` ``exec`` with the code object
as the argument. Code compilation events may also be raised. as the argument. Code compilation events may also be raised.
@ -779,12 +779,12 @@ are always available. They are listed here in alphabetical order.
If the :mod:`readline` module was loaded, then :func:`input` will use it If the :mod:`readline` module was loaded, then :func:`input` will use it
to provide elaborate line editing and history features. to provide elaborate line editing and history features.
.. audit-event:: builtins.input prompt .. audit-event:: builtins.input prompt input
Raises an :ref:`auditing event <auditing>` ``builtins.input`` with Raises an :ref:`auditing event <auditing>` ``builtins.input`` with
argument ``prompt`` before reading input argument ``prompt`` before reading input
.. audit-event:: builtins.input/result result .. audit-event:: builtins.input/result result input
Raises an auditing event ``builtins.input/result`` with the result after Raises an auditing event ``builtins.input/result`` with the result after
successfully reading input. successfully reading input.
@ -1222,7 +1222,7 @@ are always available. They are listed here in alphabetical order.
(where :func:`open` is declared), :mod:`os`, :mod:`os.path`, :mod:`tempfile`, (where :func:`open` is declared), :mod:`os`, :mod:`os.path`, :mod:`tempfile`,
and :mod:`shutil`. and :mod:`shutil`.
.. audit-event:: open "file mode flags" .. audit-event:: open file,mode,flags open
The ``mode`` and ``flags`` arguments may have been modified or inferred from The ``mode`` and ``flags`` arguments may have been modified or inferred from
the original call. the original call.

View File

@ -52,7 +52,7 @@ For example, ``'[?]'`` matches the character ``'?'``.
more directories and subdirectories. If the pattern is followed by an more directories and subdirectories. If the pattern is followed by an
``os.sep``, only directories and subdirectories match. ``os.sep``, only directories and subdirectories match.
.. audit-event:: glob.glob "pathname recursive" .. audit-event:: glob.glob pathname,recursive glob.glob
.. note:: .. note::
Using the "``**``" pattern in large directory trees may consume Using the "``**``" pattern in large directory trees may consume
@ -67,7 +67,7 @@ For example, ``'[?]'`` matches the character ``'?'``.
Return an :term:`iterator` which yields the same values as :func:`glob` Return an :term:`iterator` which yields the same values as :func:`glob`
without actually storing them all simultaneously. without actually storing them all simultaneously.
.. audit-event:: glob.glob "pathname recursive" .. audit-event:: glob.glob pathname,recursive glob.iglob
.. function:: escape(pathname) .. function:: escape(pathname)

View File

@ -361,7 +361,7 @@ An :class:`IMAP4` instance has the following methods:
:meth:`IMAP4.send`, and :meth:`IMAP4.shutdown` methods. You may override :meth:`IMAP4.send`, and :meth:`IMAP4.shutdown` methods. You may override
this method. this method.
.. audit-event:: imaplib.IMAP4.open "self host port" .. audit-event:: imaplib.open self,host,port imaplib.IMAP4.open
.. method:: IMAP4.partial(message_num, message_part, start, length) .. method:: IMAP4.partial(message_num, message_part, start, length)
@ -432,7 +432,7 @@ An :class:`IMAP4` instance has the following methods:
Sends ``data`` to the remote server. You may override this method. Sends ``data`` to the remote server. You may override this method.
.. audit-event:: imaplib.IMAP4.send "self data" .. audit-event:: imaplib.send self,data imaplib.IMAP4.send
.. method:: IMAP4.setacl(mailbox, who, what) .. method:: IMAP4.setacl(mailbox, who, what)

View File

@ -120,7 +120,7 @@ High-level Module Interface
This is an alias for the builtin :func:`open` function. This is an alias for the builtin :func:`open` function.
.. audit-event:: open "path mode flags" .. audit-event:: open path,mode,flags io.open
This function raises an :ref:`auditing event <auditing>` ``open`` with This function raises an :ref:`auditing event <auditing>` ``open`` with
arguments ``path``, ``mode`` and ``flags``. The ``mode`` and ``flags`` arguments ``path``, ``mode`` and ``flags``. The ``mode`` and ``flags``

View File

@ -67,7 +67,7 @@ To map anonymous memory, -1 should be passed as the fileno along with the length
will be relative to the offset from the beginning of the file. *offset* will be relative to the offset from the beginning of the file. *offset*
defaults to 0. *offset* must be a multiple of the :const:`ALLOCATIONGRANULARITY`. defaults to 0. *offset* must be a multiple of the :const:`ALLOCATIONGRANULARITY`.
.. audit-event:: mmap.__new__ "fileno length access offset" .. audit-event:: mmap.__new__ fileno,length,access,offset mmap.mmap
.. class:: mmap(fileno, length, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, access=ACCESS_DEFAULT[, offset]) .. class:: mmap(fileno, length, flags=MAP_SHARED, prot=PROT_WRITE|PROT_READ, access=ACCESS_DEFAULT[, offset])
:noindex: :noindex:
@ -156,7 +156,7 @@ To map anonymous memory, -1 should be passed as the fileno along with the length
mm.close() mm.close()
.. audit-event:: mmap.__new__ "fileno length access offset" .. audit-event:: mmap.__new__ fileno,length,access,offset mmap.mmap
Memory-mapped file objects support the following methods: Memory-mapped file objects support the following methods:

View File

@ -79,10 +79,12 @@ The module itself defines the following classes:
('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers') ('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
>>> >>>
.. audit-event:: nntplib.NNTP "self host port" .. audit-event:: nntplib.connect self,host,port nntplib.NNTP
.. audit-event:: nntplib.putline self,line nntplib.NNTP
All commands will raise an :ref:`auditing event <auditing>` All commands will raise an :ref:`auditing event <auditing>`
``nntplib.NNTP.putline`` with arguments ``self`` and ``line``, ``nntplib.putline`` with arguments ``self`` and ``line``,
where ``line`` is the bytes about to be sent to the remote host. where ``line`` is the bytes about to be sent to the remote host.
.. versionchanged:: 3.2 .. versionchanged:: 3.2
@ -105,10 +107,12 @@ The module itself defines the following classes:
STARTTLS as described below. However, some servers only support the STARTTLS as described below. However, some servers only support the
former. former.
.. audit-event:: nntplib.NNTP "self host port" .. audit-event:: nntplib.connect self,host,port nntplib.NNTP_SSL
.. audit-event:: nntplib.putline self,line nntplib.NNTP_SSL
All commands will raise an :ref:`auditing event <auditing>` All commands will raise an :ref:`auditing event <auditing>`
``nntplib.NNTP.putline`` with arguments ``self`` and ``line``, ``nntplib.putline`` with arguments ``self`` and ``line``,
where ``line`` is the bytes about to be sent to the remote host. where ``line`` is the bytes about to be sent to the remote host.
.. versionadded:: 3.2 .. versionadded:: 3.2

View File

@ -851,7 +851,7 @@ as internal buffering of data.
most *length* bytes in size. As of Python 3.3, this is equivalent to most *length* bytes in size. As of Python 3.3, this is equivalent to
``os.truncate(fd, length)``. ``os.truncate(fd, length)``.
.. audit-event:: os.truncate "fd length" .. audit-event:: os.truncate fd,length os.ftruncate
.. availability:: Unix, Windows. .. availability:: Unix, Windows.
@ -938,7 +938,7 @@ as internal buffering of data.
This function can support :ref:`paths relative to directory descriptors This function can support :ref:`paths relative to directory descriptors
<dir_fd>` with the *dir_fd* parameter. <dir_fd>` with the *dir_fd* parameter.
.. audit-event:: open "path mode flags" .. audit-event:: open path,mode,flags os.open
.. versionchanged:: 3.4 .. versionchanged:: 3.4
The new file descriptor is now non-inheritable. The new file descriptor is now non-inheritable.
@ -1806,7 +1806,7 @@ features:
This function can also support :ref:`specifying a file descriptor This function can also support :ref:`specifying a file descriptor
<path_fd>`; the file descriptor must refer to a directory. <path_fd>`; the file descriptor must refer to a directory.
.. audit-event:: os.listdir path .. audit-event:: os.listdir path os.listdir
.. note:: .. note::
To encode ``str`` filenames to ``bytes``, use :func:`~os.fsencode`. To encode ``str`` filenames to ``bytes``, use :func:`~os.fsencode`.
@ -2185,7 +2185,7 @@ features:
This function can also support :ref:`specifying a file descriptor This function can also support :ref:`specifying a file descriptor
<path_fd>`; the file descriptor must refer to a directory. <path_fd>`; the file descriptor must refer to a directory.
.. audit-event:: os.scandir path .. audit-event:: os.scandir path os.scandir
The :func:`scandir` iterator supports the :term:`context manager` protocol The :func:`scandir` iterator supports the :term:`context manager` protocol
and has the following method: and has the following method:
@ -2793,7 +2793,7 @@ features:
This function can support :ref:`specifying a file descriptor <path_fd>`. This function can support :ref:`specifying a file descriptor <path_fd>`.
.. audit-event:: os.truncate "path length" .. audit-event:: os.truncate path,length os.truncate
.. availability:: Unix, Windows. .. availability:: Unix, Windows.
@ -3799,7 +3799,7 @@ written in Python, such as a mail server's external command delivery program.
to using this function. See the :ref:`subprocess-replacements` section in to using this function. See the :ref:`subprocess-replacements` section in
the :mod:`subprocess` documentation for some helpful recipes. the :mod:`subprocess` documentation for some helpful recipes.
.. audit-event:: os.system command .. audit-event:: os.system command os.system
.. availability:: Unix, Windows. .. availability:: Unix, Windows.

View File

@ -181,7 +181,7 @@ access further features, you have to do this yourself:
import pdb; pdb.Pdb(skip=['django.*']).set_trace() import pdb; pdb.Pdb(skip=['django.*']).set_trace()
.. audit-event:: pdb.Pdb .. audit-event:: pdb.Pdb "" pdb.Pdb
.. versionadded:: 3.1 .. versionadded:: 3.1
The *skip* argument. The *skip* argument.

View File

@ -437,7 +437,7 @@ The :mod:`pickle` module exports three classes, :class:`Pickler`,
how they can be loaded, potentially reducing security risks. Refer to how they can be loaded, potentially reducing security risks. Refer to
:ref:`pickle-restrict` for details. :ref:`pickle-restrict` for details.
.. audit-event:: pickle.find_class "module name" .. audit-event:: pickle.find_class module,name pickle.Unpickler.find_class
.. class:: PickleBuffer(buffer) .. class:: PickleBuffer(buffer)

View File

@ -39,10 +39,12 @@ The :mod:`poplib` module provides two classes:
connection attempt (if not specified, the global default timeout setting will connection attempt (if not specified, the global default timeout setting will
be used). be used).
.. audit-event:: poplib.POP3 "self host port" .. audit-event:: poplib.connect self,host,port poplib.POP3
.. audit-event:: poplib.putline self,line poplib.POP3
All commands will raise an :ref:`auditing event <auditing>` All commands will raise an :ref:`auditing event <auditing>`
``poplib.POP3.putline`` with arguments ``self`` and ``line``, ``poplib.putline`` with arguments ``self`` and ``line``,
where ``line`` is the bytes about to be sent to the remote host. where ``line`` is the bytes about to be sent to the remote host.
@ -60,10 +62,12 @@ The :mod:`poplib` module provides two classes:
point to PEM-formatted private key and certificate chain files, point to PEM-formatted private key and certificate chain files,
respectively, for the SSL connection. respectively, for the SSL connection.
.. audit-event:: poplib.POP3 "self host port" .. audit-event:: poplib.connect self,host,port poplib.POP3_SSL
.. audit-event:: poplib.putline self,line popplib.POP3_SSL
All commands will raise an :ref:`auditing event <auditing>` All commands will raise an :ref:`auditing event <auditing>`
``poplib.POP3.putline`` with arguments ``self`` and ``line``, ``poplib.putline`` with arguments ``self`` and ``line``,
where ``line`` is the bytes about to be sent to the remote host. where ``line`` is the bytes about to be sent to the remote host.
.. versionchanged:: 3.2 .. versionchanged:: 3.2

View File

@ -249,7 +249,7 @@ Directory and files operations
  as arguments. By default, :func:`~shutil.copy2` is used, but any function   as arguments. By default, :func:`~shutil.copy2` is used, but any function
  that supports the same signature (like :func:`~shutil.copy`) can be used.   that supports the same signature (like :func:`~shutil.copy`) can be used.
.. audit-event:: shutil.copytree "src dst" .. audit-event:: shutil.copytree src,dst shutil.copytree
.. versionchanged:: 3.3 .. versionchanged:: 3.3
Copy metadata when *symlinks* is false. Copy metadata when *symlinks* is false.
@ -298,7 +298,7 @@ Directory and files operations
*excinfo*, will be the exception information returned by *excinfo*, will be the exception information returned by
:func:`sys.exc_info`. Exceptions raised by *onerror* will not be caught. :func:`sys.exc_info`. Exceptions raised by *onerror* will not be caught.
.. audit-event:: shutil.rmtree path .. audit-event:: shutil.rmtree path shutil.rmtree
.. versionchanged:: 3.3 .. versionchanged:: 3.3
Added a symlink attack resistant version that is used automatically Added a symlink attack resistant version that is used automatically
@ -562,7 +562,7 @@ provided. They rely on the :mod:`zipfile` and :mod:`tarfile` modules.
The *verbose* argument is unused and deprecated. The *verbose* argument is unused and deprecated.
.. audit-event:: shutil.make_archive "base_name format root_dir base_dir" .. audit-event:: shutil.make_archive base_name,format,root_dir,base_dir shutil.make_archive
.. versionchanged:: 3.8 .. versionchanged:: 3.8
The modern pax (POSIX.1-2001) format is now used instead of The modern pax (POSIX.1-2001) format is now used instead of

View File

@ -55,6 +55,8 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions).
(250, b'Ok') (250, b'Ok')
>>> >>>
.. audit-event:: smtplib.send self,data smtplib.SMTP
All commands will raise an :ref:`auditing event <auditing>` All commands will raise an :ref:`auditing event <auditing>`
``smtplib.SMTP.send`` with arguments ``self`` and ``data``, ``smtplib.SMTP.send`` with arguments ``self`` and ``data``,
where ``data`` is the bytes about to be sent to the remote host. where ``data`` is the bytes about to be sent to the remote host.
@ -246,7 +248,7 @@ An :class:`SMTP` instance has the following methods:
2-tuple of the response code and message sent by the server in its 2-tuple of the response code and message sent by the server in its
connection response. connection response.
.. audit-event:: smtplib.SMTP.connect "self host port" .. audit-event:: smtplib.connect self,host,port smtplib.SMTP.connect
.. method:: SMTP.helo(name='') .. method:: SMTP.helo(name='')

View File

@ -526,7 +526,7 @@ The following functions all create :ref:`socket objects <socket-objects>`.
The newly created socket is :ref:`non-inheritable <fd_inheritance>`. The newly created socket is :ref:`non-inheritable <fd_inheritance>`.
.. audit-event:: socket.__new__ "self family type protocol" .. audit-event:: socket.__new__ self,family,type,protocol socket.socket
.. versionchanged:: 3.3 .. versionchanged:: 3.3
The AF_CAN family was added. The AF_CAN family was added.
@ -720,7 +720,7 @@ The :mod:`socket` module also offers various network-related services:
:const:`AF_INET6`), and is meant to be passed to the :meth:`socket.connect` :const:`AF_INET6`), and is meant to be passed to the :meth:`socket.connect`
method. method.
.. audit-event:: socket.getaddrinfo "host port family type protocol" .. audit-event:: socket.getaddrinfo host,port,family,type,protocol socket.getaddrinfo
The following example fetches address information for a hypothetical TCP The following example fetches address information for a hypothetical TCP
connection to ``example.org`` on port 80 (results may differ on your connection to ``example.org`` on port 80 (results may differ on your
@ -757,7 +757,7 @@ The :mod:`socket` module also offers various network-related services:
interface. :func:`gethostbyname` does not support IPv6 name resolution, and interface. :func:`gethostbyname` does not support IPv6 name resolution, and
:func:`getaddrinfo` should be used instead for IPv4/v6 dual stack support. :func:`getaddrinfo` should be used instead for IPv4/v6 dual stack support.
.. audit-event:: socket.gethostbyname hostname .. audit-event:: socket.gethostbyname hostname socket.gethostbyname
.. function:: gethostbyname_ex(hostname) .. function:: gethostbyname_ex(hostname)
@ -771,7 +771,7 @@ The :mod:`socket` module also offers various network-related services:
resolution, and :func:`getaddrinfo` should be used instead for IPv4/v6 dual resolution, and :func:`getaddrinfo` should be used instead for IPv4/v6 dual
stack support. stack support.
.. audit-event:: socket.gethostbyname hostname .. audit-event:: socket.gethostbyname hostname socket.gethostbyname_ex
.. function:: gethostname() .. function:: gethostname()
@ -779,7 +779,7 @@ The :mod:`socket` module also offers various network-related services:
Return a string containing the hostname of the machine where the Python Return a string containing the hostname of the machine where the Python
interpreter is currently executing. interpreter is currently executing.
.. audit-event:: socket.gethostname .. audit-event:: socket.gethostname "" socket.gethostname
Note: :func:`gethostname` doesn't always return the fully qualified domain Note: :func:`gethostname` doesn't always return the fully qualified domain
name; use :func:`getfqdn` for that. name; use :func:`getfqdn` for that.
@ -795,7 +795,7 @@ The :mod:`socket` module also offers various network-related services:
domain name, use the function :func:`getfqdn`. :func:`gethostbyaddr` supports domain name, use the function :func:`getfqdn`. :func:`gethostbyaddr` supports
both IPv4 and IPv6. both IPv4 and IPv6.
.. audit-event:: socket.gethostbyaddr ip_address .. audit-event:: socket.gethostbyaddr ip_address socket.gethostbyaddr
.. function:: getnameinfo(sockaddr, flags) .. function:: getnameinfo(sockaddr, flags)
@ -810,7 +810,7 @@ The :mod:`socket` module also offers various network-related services:
For more information about *flags* you can consult :manpage:`getnameinfo(3)`. For more information about *flags* you can consult :manpage:`getnameinfo(3)`.
.. audit-event:: socket.getnameinfo sockaddr .. audit-event:: socket.getnameinfo sockaddr socket.getnameinfo
.. function:: getprotobyname(protocolname) .. function:: getprotobyname(protocolname)
@ -827,7 +827,7 @@ The :mod:`socket` module also offers various network-related services:
service. The optional protocol name, if given, should be ``'tcp'`` or service. The optional protocol name, if given, should be ``'tcp'`` or
``'udp'``, otherwise any protocol will match. ``'udp'``, otherwise any protocol will match.
.. audit-event:: socket.getservbyname "servicename protocolname" .. audit-event:: socket.getservbyname servicename,protocolname socket.getservbyname
.. function:: getservbyport(port[, protocolname]) .. function:: getservbyport(port[, protocolname])
@ -836,7 +836,7 @@ The :mod:`socket` module also offers various network-related services:
service. The optional protocol name, if given, should be ``'tcp'`` or service. The optional protocol name, if given, should be ``'tcp'`` or
``'udp'``, otherwise any protocol will match. ``'udp'``, otherwise any protocol will match.
.. audit-event:: socket.getservbyport "port protocolname" .. audit-event:: socket.getservbyport port,protocolname socket.getservbyport
.. function:: ntohl(x) .. function:: ntohl(x)
@ -1021,7 +1021,7 @@ The :mod:`socket` module also offers various network-related services:
Set the machine's hostname to *name*. This will raise an Set the machine's hostname to *name*. This will raise an
:exc:`OSError` if you don't have enough rights. :exc:`OSError` if you don't have enough rights.
.. audit-event:: socket.sethostname name .. audit-event:: socket.sethostname name socket.sethostname
.. availability:: Unix. .. availability:: Unix.
@ -1107,7 +1107,7 @@ to sockets.
Bind the socket to *address*. The socket must not already be bound. (The format Bind the socket to *address*. The socket must not already be bound. (The format
of *address* depends on the address family --- see above.) of *address* depends on the address family --- see above.)
.. audit-event:: socket.bind "self address" .. audit-event:: socket.bind self,address socket.socket.bind
.. method:: socket.close() .. method:: socket.close()
@ -1145,7 +1145,7 @@ to sockets.
:exc:`InterruptedError` exception if the connection is interrupted by a :exc:`InterruptedError` exception if the connection is interrupted by a
signal (or the exception raised by the signal handler). signal (or the exception raised by the signal handler).
.. audit-event:: socket.connect "self address" .. audit-event:: socket.connect self,address socket.socket.connect
.. versionchanged:: 3.5 .. versionchanged:: 3.5
The method now waits until the connection completes instead of raising an The method now waits until the connection completes instead of raising an
@ -1163,7 +1163,7 @@ to sockets.
:c:data:`errno` variable. This is useful to support, for example, asynchronous :c:data:`errno` variable. This is useful to support, for example, asynchronous
connects. connects.
.. audit-event:: socket.connect "self address" .. audit-event:: socket.connect self,address socket.socket.connect_ex
.. method:: socket.detach() .. method:: socket.detach()
@ -1505,7 +1505,7 @@ to sockets.
bytes sent. (The format of *address* depends on the address family --- see bytes sent. (The format of *address* depends on the address family --- see
above.) above.)
.. audit-event:: socket.sendto "self address" .. audit-event:: socket.sendto self,address socket.socket.sendto
.. versionchanged:: 3.5 .. versionchanged:: 3.5
If the system call is interrupted and the signal handler does not raise If the system call is interrupted and the signal handler does not raise
@ -1546,7 +1546,7 @@ to sockets.
.. availability:: most Unix platforms, possibly others. .. availability:: most Unix platforms, possibly others.
.. audit-event:: socket.sendmsg "self address" .. audit-event:: socket.sendmsg self,address socket.socket.sendmsg
.. versionadded:: 3.3 .. versionadded:: 3.3

View File

@ -224,7 +224,7 @@ Module functions and constants
More information about this feature, including a list of recognized options, can More information about this feature, including a list of recognized options, can
be found in the `SQLite URI documentation <https://www.sqlite.org/uri.html>`_. be found in the `SQLite URI documentation <https://www.sqlite.org/uri.html>`_.
.. audit-event:: sqlite3.connect "database" .. audit-event:: sqlite3.connect database sqlite3.connect
.. versionchanged:: 3.4 .. versionchanged:: 3.4
Added the *uri* parameter. Added the *uri* parameter.

View File

@ -585,7 +585,7 @@ functions.
with Popen(["ifconfig"], stdout=PIPE) as proc: with Popen(["ifconfig"], stdout=PIPE) as proc:
log.write(proc.stdout.read()) log.write(proc.stdout.read())
.. audit-event:: subprocess.Popen "executable args cwd env" .. audit-event:: subprocess.Popen executable,args,cwd,env subprocess.Popen
Popen and the other functions in this module that use it raise an Popen and the other functions in this module that use it raise an
:ref:`auditing event <auditing>` ``subprocess.Popen`` with arguments :ref:`auditing event <auditing>` ``subprocess.Popen`` with arguments

View File

@ -86,6 +86,9 @@ always available.
The native equivalent of this function is :c:func:`PySys_Audit`. Using the The native equivalent of this function is :c:func:`PySys_Audit`. Using the
native function is preferred when possible. native function is preferred when possible.
See the :ref:`audit events table <audit-events>` for all events raised by
``CPython``.
.. versionadded:: 3.8 .. versionadded:: 3.8
@ -166,7 +169,7 @@ always available.
This function should be used for internal and specialized purposes only. This function should be used for internal and specialized purposes only.
.. audit-event:: sys._current_frames .. audit-event:: sys._current_frames "" sys._current_frames
.. function:: breakpointhook() .. function:: breakpointhook()
@ -675,7 +678,7 @@ always available.
that is deeper than the call stack, :exc:`ValueError` is raised. The default that is deeper than the call stack, :exc:`ValueError` is raised. The default
for *depth* is zero, returning the frame at the top of the call stack. for *depth* is zero, returning the frame at the top of the call stack.
.. audit-event:: sys._getframe .. audit-event:: sys._getframe "" sys._getframe
.. impl-detail:: .. impl-detail::
@ -1190,7 +1193,7 @@ always available.
``'return'``, ``'c_call'``, ``'c_return'``, or ``'c_exception'``. *arg* depends ``'return'``, ``'c_call'``, ``'c_return'``, or ``'c_exception'``. *arg* depends
on the event type. on the event type.
.. audit-event:: sys.setprofile .. audit-event:: sys.setprofile "" sys.setprofile
The events have the following meaning: The events have the following meaning:
@ -1312,7 +1315,7 @@ always available.
For more information on code and frame objects, refer to :ref:`types`. For more information on code and frame objects, refer to :ref:`types`.
.. audit-event:: sys.settrace .. audit-event:: sys.settrace "" sys.settrace
.. impl-detail:: .. impl-detail::
@ -1334,9 +1337,9 @@ always available.
first time. The *finalizer* will be called when an asynchronous generator first time. The *finalizer* will be called when an asynchronous generator
is about to be garbage collected. is about to be garbage collected.
.. audit-event:: sys.set_asyncgen_hooks_firstiter .. audit-event:: sys.set_asyncgen_hooks_firstiter "" sys.set_asyncgen_hooks
.. audit-event:: sys.set_asyncgen_hooks_finalizer .. audit-event:: sys.set_asyncgen_hooks_finalizer "" sys.set_asyncgen_hooks
Two auditing events are raised because the underlying API consists of two Two auditing events are raised because the underlying API consists of two
calls, each of which must raise its own event. calls, each of which must raise its own event.

View File

@ -141,7 +141,7 @@ Telnet Objects
Do not try to reopen an already connected instance. Do not try to reopen an already connected instance.
.. audit-event:: telnetlib.Telnet.open "self host port" .. audit-event:: telnetlib.Telnet.open self,host,port telnetlib.Telnet.open
.. method:: Telnet.msg(msg, *args) .. method:: Telnet.msg(msg, *args)
@ -178,7 +178,7 @@ Telnet Objects
block if the connection is blocked. May raise :exc:`OSError` if the block if the connection is blocked. May raise :exc:`OSError` if the
connection is closed. connection is closed.
.. audit-event:: telnetlib.Telnet.write "self buffer" .. audit-event:: telnetlib.Telnet.write self,buffer telnetlib.Telnet.write
.. versionchanged:: 3.3 .. versionchanged:: 3.3
This method used to raise :exc:`socket.error`, which is now an alias This method used to raise :exc:`socket.error`, which is now an alias

View File

@ -62,7 +62,7 @@ The module defines the following user-callable items:
The :py:data:`os.O_TMPFILE` flag is used if it is available and works The :py:data:`os.O_TMPFILE` flag is used if it is available and works
(Linux-specific, requires Linux kernel 3.11 or later). (Linux-specific, requires Linux kernel 3.11 or later).
.. audit-event:: tempfile.mkstemp "full-path" .. audit-event:: tempfile.mkstemp fullpath tempfile.TemporaryFile
.. versionchanged:: 3.5 .. versionchanged:: 3.5
@ -87,7 +87,7 @@ The module defines the following user-callable items:
attribute is the underlying true file object. This file-like object can attribute is the underlying true file object. This file-like object can
be used in a :keyword:`with` statement, just like a normal file. be used in a :keyword:`with` statement, just like a normal file.
.. audit-event:: tempfile.mkstemp "full-path" .. audit-event:: tempfile.mkstemp fullpath tempfile.NamedTemporaryFile
.. versionchanged:: 3.8 .. versionchanged:: 3.8
Added *errors* parameter. Added *errors* parameter.
@ -134,7 +134,7 @@ The module defines the following user-callable items:
The directory can be explicitly cleaned up by calling the The directory can be explicitly cleaned up by calling the
:func:`cleanup` method. :func:`cleanup` method.
.. audit-event:: tempfile.mkdtemp "full-path" .. audit-event:: tempfile.mkdtemp fullpath tempfile.TemporaryDirectory
.. versionadded:: 3.2 .. versionadded:: 3.2
@ -183,7 +183,7 @@ The module defines the following user-callable items:
file (as would be returned by :func:`os.open`) and the absolute pathname file (as would be returned by :func:`os.open`) and the absolute pathname
of that file, in that order. of that file, in that order.
.. audit-event:: tempfile.mkstemp "full-path" .. audit-event:: tempfile.mkstemp fullpath tempfile.mkstemp
.. versionchanged:: 3.5 .. versionchanged:: 3.5
*suffix*, *prefix*, and *dir* may now be supplied in bytes in order to *suffix*, *prefix*, and *dir* may now be supplied in bytes in order to
@ -206,7 +206,7 @@ The module defines the following user-callable items:
:func:`mkdtemp` returns the absolute pathname of the new directory. :func:`mkdtemp` returns the absolute pathname of the new directory.
.. audit-event:: tempfile.mkdtemp "full-path" .. audit-event:: tempfile.mkdtemp fullpath tempfile.mkdtemp
.. versionchanged:: 3.5 .. versionchanged:: 3.5
*suffix*, *prefix*, and *dir* may now be supplied in bytes in order to *suffix*, *prefix*, and *dir* may now be supplied in bytes in order to

View File

@ -95,7 +95,7 @@ The :mod:`urllib.request` module defines the following functions:
parameter to ``urllib.urlopen``, can be obtained by using parameter to ``urllib.urlopen``, can be obtained by using
:class:`ProxyHandler` objects. :class:`ProxyHandler` objects.
.. audit-event:: urllib.Request "fullurl data headers method" .. audit-event:: urllib.Request fullurl,data,headers,method urllib.request.urlopen
The default opener raises an :ref:`auditing event <auditing>` The default opener raises an :ref:`auditing event <auditing>`
``urllib.Request`` with arguments ``fullurl``, ``data``, ``headers``, ``urllib.Request`` with arguments ``fullurl``, ``data``, ``headers``,

View File

@ -64,7 +64,7 @@ The following functions are defined:
may work and start the operating system's associated program. However, this may work and start the operating system's associated program. However, this
is neither supported nor portable. is neither supported nor portable.
.. audit-event:: webbrowser.open "url" .. audit-event:: webbrowser.open url webbrowser.open
.. function:: open_new(url) .. function:: open_new(url)

View File

@ -23,7 +23,7 @@ from docutils import nodes, utils
from sphinx import addnodes from sphinx import addnodes
from sphinx.builders import Builder from sphinx.builders import Builder
from sphinx.locale import translators from sphinx.locale import translators
from sphinx.util import status_iterator from sphinx.util import status_iterator, logging
from sphinx.util.nodes import split_explicit_title from sphinx.util.nodes import split_explicit_title
from sphinx.writers.html import HTMLTranslator from sphinx.writers.html import HTMLTranslator
from sphinx.writers.text import TextWriter, TextTranslator from sphinx.writers.text import TextWriter, TextTranslator
@ -157,7 +157,7 @@ class AuditEvent(Directive):
has_content = True has_content = True
required_arguments = 1 required_arguments = 1
optional_arguments = 1 optional_arguments = 2
final_argument_whitespace = True final_argument_whitespace = True
_label = [ _label = [
@ -166,21 +166,49 @@ class AuditEvent(Directive):
"Raises an :ref:`auditing event <auditing>` {name} with arguments {args}.", "Raises an :ref:`auditing event <auditing>` {name} with arguments {args}.",
] ]
@property
def logger(self):
cls = type(self)
return logging.getLogger(cls.__module__ + "." + cls.__name__)
def run(self): def run(self):
name = self.arguments[0]
if len(self.arguments) >= 2 and self.arguments[1]: if len(self.arguments) >= 2 and self.arguments[1]:
args = [ args = (a.strip() for a in self.arguments[1].strip("'\"").split(","))
"``{}``".format(a.strip()) args = [a for a in args if a]
for a in self.arguments[1].strip("'\"").split()
if a.strip()
]
else: else:
args = [] args = []
label = translators['sphinx'].gettext(self._label[min(2, len(args))]) label = translators['sphinx'].gettext(self._label[min(2, len(args))])
text = label.format(name="``{}``".format(self.arguments[0]), text = label.format(name="``{}``".format(name),
args=", ".join(args)) args=", ".join("``{}``".format(a) for a in args if a))
pnode = nodes.paragraph(text, classes=["audit-hook"]) env = self.state.document.settings.env
if not hasattr(env, 'all_audit_events'):
env.all_audit_events = {}
new_info = {
'source': [],
'args': args
}
info = env.all_audit_events.setdefault(name, new_info)
if info is not new_info:
if not self._do_args_match(info['args'], new_info['args']):
self.logger.warn(
"Mismatched arguments for audit-event {}: {!r} != {!r}"
.format(name, info['args'], new_info['args'])
)
if len(self.arguments) >= 3 and self.arguments[2]:
target = self.arguments[2]
ids = []
else:
target = "audit_event_{}_{}".format(name, len(info['source']))
target = re.sub(r'\W', '_', label)
ids = [target]
info['source'].append((env.docname, target))
pnode = nodes.paragraph(text, classes=["audit-hook"], ids=ids)
if self.content: if self.content:
self.state.nested_parse(self.content, self.content_offset, pnode) self.state.nested_parse(self.content, self.content_offset, pnode)
else: else:
@ -189,6 +217,37 @@ class AuditEvent(Directive):
return [pnode] return [pnode]
# This list of sets are allowable synonyms for event argument names.
# If two names are in the same set, they are treated as equal for the
# purposes of warning. This won't help if number of arguments is
# different!
_SYNONYMS = [
{"file", "path", "fd"},
]
def _do_args_match(self, args1, args2):
if args1 == args2:
return True
if len(args1) != len(args2):
return False
for a1, a2 in zip(args1, args2):
if a1 == a2:
continue
if any(a1 in s and a2 in s for s in self._SYNONYMS):
continue
return False
return True
class audit_event_list(nodes.General, nodes.Element):
pass
class AuditEventListDirective(Directive):
def run(self):
return [audit_event_list('')]
# Support for documenting decorators # Support for documenting decorators
@ -394,7 +453,7 @@ class PydocTopicsBuilder(Builder):
'building topics... ', 'building topics... ',
length=len(pydoc_topic_labels)): length=len(pydoc_topic_labels)):
if label not in self.env.domaindata['std']['labels']: if label not in self.env.domaindata['std']['labels']:
self.warn('label %r not in documentation' % label) self.env.logger.warn('label %r not in documentation' % label)
continue continue
docname, labelid, sectname = self.env.domaindata['std']['labels'][label] docname, labelid, sectname = self.env.domaindata['std']['labels'][label]
doctree = self.env.get_and_resolve_doctree(docname, self) doctree = self.env.get_and_resolve_doctree(docname, self)
@ -458,12 +517,72 @@ def parse_pdb_command(env, sig, signode):
return fullname return fullname
def process_audit_events(app, doctree, fromdocname):
for node in doctree.traverse(audit_event_list):
break
else:
return
env = app.builder.env
table = nodes.table(cols=3)
group = nodes.tgroup(
'',
nodes.colspec(colwidth=30),
nodes.colspec(colwidth=55),
nodes.colspec(colwidth=15),
)
head = nodes.thead()
body = nodes.tbody()
table += group
group += head
group += body
row = nodes.row()
row += nodes.entry('', nodes.paragraph('', nodes.Text('Audit event')))
row += nodes.entry('', nodes.paragraph('', nodes.Text('Arguments')))
row += nodes.entry('', nodes.paragraph('', nodes.Text('References')))
head += row
for name in sorted(getattr(env, "all_audit_events", ())):
audit_event = env.all_audit_events[name]
row = nodes.row()
node = nodes.paragraph('', nodes.Text(name))
row += nodes.entry('', node)
node = nodes.paragraph()
for i, a in enumerate(audit_event['args']):
if i:
node += nodes.Text(", ")
node += nodes.literal(a, nodes.Text(a))
row += nodes.entry('', node)
node = nodes.paragraph()
for i, (doc, label) in enumerate(audit_event['source'], start=1):
if isinstance(label, str):
ref = nodes.reference("", nodes.Text("[{}]".format(i)), internal=True)
ref['refuri'] = "{}#{}".format(
app.builder.get_relative_uri(fromdocname, doc),
label,
)
node += ref
row += nodes.entry('', node)
body += row
for node in doctree.traverse(audit_event_list):
node.replace_self(table)
def setup(app): def setup(app):
app.add_role('issue', issue_role) app.add_role('issue', issue_role)
app.add_role('source', source_role) app.add_role('source', source_role)
app.add_directive('impl-detail', ImplementationDetail) app.add_directive('impl-detail', ImplementationDetail)
app.add_directive('availability', Availability) app.add_directive('availability', Availability)
app.add_directive('audit-event', AuditEvent) app.add_directive('audit-event', AuditEvent)
app.add_directive('audit-event-table', AuditEventListDirective)
app.add_directive('deprecated-removed', DeprecatedRemoved) app.add_directive('deprecated-removed', DeprecatedRemoved)
app.add_builder(PydocTopicsBuilder) app.add_builder(PydocTopicsBuilder)
app.add_builder(suspicious.CheckSuspiciousMarkupBuilder) app.add_builder(suspicious.CheckSuspiciousMarkupBuilder)
@ -478,4 +597,5 @@ def setup(app):
app.add_directive_to_domain('py', 'awaitablemethod', PyAwaitableMethod) app.add_directive_to_domain('py', 'awaitablemethod', PyAwaitableMethod)
app.add_directive_to_domain('py', 'abstractmethod', PyAbstractMethod) app.add_directive_to_domain('py', 'abstractmethod', PyAbstractMethod)
app.add_directive('miscnews', MiscNews) app.add_directive('miscnews', MiscNews)
app.connect('doctree-resolved', process_audit_events)
return {'version': '1.0', 'parallel_read_safe': True} return {'version': '1.0', 'parallel_read_safe': True}

View File

@ -148,7 +148,7 @@ class FTP:
self.timeout = timeout self.timeout = timeout
if source_address is not None: if source_address is not None:
self.source_address = source_address self.source_address = source_address
sys.audit("ftplib.FTP.connect", self, self.host, self.port) sys.audit("ftplib.connect", self, self.host, self.port)
self.sock = socket.create_connection((self.host, self.port), self.timeout, self.sock = socket.create_connection((self.host, self.port), self.timeout,
source_address=self.source_address) source_address=self.source_address)
self.af = self.sock.family self.af = self.sock.family
@ -189,7 +189,7 @@ class FTP:
def putline(self, line): def putline(self, line):
if '\r' in line or '\n' in line: if '\r' in line or '\n' in line:
raise ValueError('an illegal newline character should not be contained') raise ValueError('an illegal newline character should not be contained')
sys.audit("ftplib.FTP.sendcmd", self, line) sys.audit("ftplib.sendcmd", self, line)
line = line + CRLF line = line + CRLF
if self.debugging > 1: if self.debugging > 1:
print('*put*', self.sanitize(line)) print('*put*', self.sanitize(line))

View File

@ -289,7 +289,7 @@ class IMAP4:
# (which is used by socket.create_connection()) expects None # (which is used by socket.create_connection()) expects None
# as a default value for host. # as a default value for host.
host = None if not self.host else self.host host = None if not self.host else self.host
sys.audit("imaplib.IMAP4.open", self, self.host, self.port) sys.audit("imaplib.open", self, self.host, self.port)
return socket.create_connection((host, self.port)) return socket.create_connection((host, self.port))
def open(self, host = '', port = IMAP4_PORT): def open(self, host = '', port = IMAP4_PORT):
@ -319,7 +319,7 @@ class IMAP4:
def send(self, data): def send(self, data):
"""Send data to remote.""" """Send data to remote."""
sys.audit("imaplib.IMAP4.send", self, data) sys.audit("imaplib.send", self, data)
self.sock.sendall(data) self.sock.sendall(data)

View File

@ -414,7 +414,7 @@ class _NNTPBase:
def _putline(self, line): def _putline(self, line):
"""Internal: send one line to the server, appending CRLF. """Internal: send one line to the server, appending CRLF.
The `line` must be a bytes-like object.""" The `line` must be a bytes-like object."""
sys.audit("nntplib.NNTP.putline", self, line) sys.audit("nntplib.putline", self, line)
line = line + _CRLF line = line + _CRLF
if self.debugging > 1: print('*put*', repr(line)) if self.debugging > 1: print('*put*', repr(line))
self.file.write(line) self.file.write(line)
@ -1042,7 +1042,7 @@ class NNTP(_NNTPBase):
""" """
self.host = host self.host = host
self.port = port self.port = port
sys.audit("nntplib.NNTP", self, host, port) sys.audit("nntplib.connect", self, host, port)
self.sock = socket.create_connection((host, port), timeout) self.sock = socket.create_connection((host, port), timeout)
file = None file = None
try: try:
@ -1074,7 +1074,7 @@ if _have_ssl:
"""This works identically to NNTP.__init__, except for the change """This works identically to NNTP.__init__, except for the change
in default port and the `ssl_context` argument for SSL connections. in default port and the `ssl_context` argument for SSL connections.
""" """
sys.audit("nntplib.NNTP", self, host, port) sys.audit("nntplib.connect", self, host, port)
self.sock = socket.create_connection((host, port), timeout) self.sock = socket.create_connection((host, port), timeout)
file = None file = None
try: try:

View File

@ -100,7 +100,7 @@ class POP3:
self.host = host self.host = host
self.port = port self.port = port
self._tls_established = False self._tls_established = False
sys.audit("poplib.POP3", self, host, port) sys.audit("poplib.connect", self, host, port)
self.sock = self._create_socket(timeout) self.sock = self._create_socket(timeout)
self.file = self.sock.makefile('rb') self.file = self.sock.makefile('rb')
self._debugging = 0 self._debugging = 0
@ -111,7 +111,7 @@ class POP3:
def _putline(self, line): def _putline(self, line):
if self._debugging > 1: print('*put*', repr(line)) if self._debugging > 1: print('*put*', repr(line))
sys.audit("poplib.POP3.putline", self, line) sys.audit("poplib.putline", self, line)
self.sock.sendall(line + CRLF) self.sock.sendall(line + CRLF)

View File

@ -335,7 +335,7 @@ class SMTP:
port = self.default_port port = self.default_port
if self.debuglevel > 0: if self.debuglevel > 0:
self._print_debug('connect:', (host, port)) self._print_debug('connect:', (host, port))
sys.audit("smtplib.SMTP.connect", self, host, port) sys.audit("smtplib.connect", self, host, port)
self.sock = self._get_socket(host, port, self.timeout) self.sock = self._get_socket(host, port, self.timeout)
self.file = None self.file = None
(code, msg) = self.getreply() (code, msg) = self.getreply()
@ -353,7 +353,7 @@ class SMTP:
# should not be used, but 'data' needs to convert the string to # should not be used, but 'data' needs to convert the string to
# binary itself anyway, so that's not a problem. # binary itself anyway, so that's not a problem.
s = s.encode(self.command_encoding) s = s.encode(self.command_encoding)
sys.audit("smtplib.SMTP.send", self, s) sys.audit("smtplib.send", self, s)
try: try:
self.sock.sendall(s) self.sock.sendall(s)
except OSError: except OSError: