bpo-37363: Add audit events for a range of modules (GH-14301)

This commit is contained in:
Steve Dower 2019-06-24 08:42:54 -07:00 committed by GitHub
parent 9bbf4d7083
commit 60419a7e96
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
37 changed files with 165 additions and 18 deletions

View File

@ -2046,7 +2046,7 @@ Data types
.. audit-event:: ctypes.cdata address .. audit-event:: ctypes.cdata address
This method, and others that indirectly call this method, raises an This method, and others that indirectly call this method, raises an
:func:`auditing event <sys.audit>` ``ctypes.cdata`` with argument :ref:`auditing event <auditing>` ``ctypes.cdata`` with argument
``address``. ``address``.
.. method:: from_param(obj) .. method:: from_param(obj)

View File

@ -119,6 +119,8 @@ 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
.. note:: .. note::
The bootstrapping process has side effects on both ``sys.path`` and The bootstrapping process has side effects on both ``sys.path`` and

View File

@ -190,6 +190,8 @@ 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"
.. versionchanged:: 3.3 .. versionchanged:: 3.3
*source_address* parameter was added. *source_address* parameter was added.
@ -223,6 +225,8 @@ 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"
.. method:: FTP.voidcmd(cmd) .. method:: FTP.voidcmd(cmd)
@ -230,6 +234,8 @@ 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"
.. method:: FTP.retrbinary(cmd, callback, blocksize=8192, rest=None) .. method:: FTP.retrbinary(cmd, callback, blocksize=8192, rest=None)

View File

@ -128,6 +128,8 @@ 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"
.. versionadded:: 3.7 .. versionadded:: 3.7
.. _func-bytearray: .. _func-bytearray:
@ -277,7 +279,7 @@ are always available. They are listed here in alphabetical order.
.. audit-event:: compile "source filename" .. audit-event:: compile "source filename"
Raises an :func:`auditing event <sys.audit>` ``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
compilation. compilation.
@ -490,8 +492,8 @@ are always available. They are listed here in alphabetical order.
.. audit-event:: exec code_object .. audit-event:: exec code_object
Raises an :func:`auditing event <sys.audit>` ``exec`` with the code object as Raises an :ref:`auditing event <auditing>` ``exec`` with the code object
the argument. Code compilation events may also be raised. as the argument. Code compilation events may also be raised.
.. index:: builtin: exec .. index:: builtin: exec
@ -525,8 +527,8 @@ are always available. They are listed here in alphabetical order.
.. audit-event:: exec code_object .. audit-event:: exec code_object
Raises an :func:`auditing event <sys.audit>` ``exec`` with the code object as Raises an :ref:`auditing event <auditing>` ``exec`` with the code object
the argument. Code compilation events may also be raised. as the argument. Code compilation events may also be raised.
.. note:: .. note::
@ -779,7 +781,7 @@ are always available. They are listed here in alphabetical order.
.. audit-event:: builtins.input prompt .. audit-event:: builtins.input prompt
Raises an :func:`auditing event <sys.audit>` ``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

View File

@ -52,6 +52,8 @@ 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"
.. note:: .. note::
Using the "``**``" pattern in large directory trees may consume Using the "``**``" pattern in large directory trees may consume
an inordinate amount of time. an inordinate amount of time.
@ -65,6 +67,8 @@ 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"
.. function:: escape(pathname) .. function:: escape(pathname)

View File

@ -361,6 +361,8 @@ 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"
.. method:: IMAP4.partial(message_num, message_part, start, length) .. method:: IMAP4.partial(message_num, message_part, start, length)
@ -430,6 +432,8 @@ 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"
.. method:: IMAP4.setacl(mailbox, who, what) .. method:: IMAP4.setacl(mailbox, who, what)

View File

@ -122,7 +122,7 @@ High-level Module Interface
.. audit-event:: open "path mode flags" .. audit-event:: open "path mode flags"
This function raises an :func:`auditing event <sys.audit>` ``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``
arguments may have been modified or inferred from the original call. arguments may have been modified or inferred from the original call.

View File

@ -79,6 +79,11 @@ 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"
All commands will raise an :ref:`auditing event <auditing>`
``nntplib.NNTP.putline`` with arguments ``self`` and ``line``,
where ``line`` is the bytes about to be sent to the remote host.
.. versionchanged:: 3.2 .. versionchanged:: 3.2
*usenetrc* is now ``False`` by default. *usenetrc* is now ``False`` by default.
@ -100,6 +105,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"
All commands will raise an :ref:`auditing event <auditing>`
``nntplib.NNTP.putline`` with arguments ``self`` and ``line``,
where ``line`` is the bytes about to be sent to the remote host.
.. versionadded:: 3.2 .. versionadded:: 3.2
.. versionchanged:: 3.4 .. versionchanged:: 3.4

View File

@ -1801,6 +1801,8 @@ 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
.. note:: .. note::
To encode ``str`` filenames to ``bytes``, use :func:`~os.fsencode`. To encode ``str`` filenames to ``bytes``, use :func:`~os.fsencode`.
@ -2178,6 +2180,8 @@ 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
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:

View File

@ -181,6 +181,8 @@ 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
.. versionadded:: 3.1 .. versionadded:: 3.1
The *skip* argument. The *skip* argument.

View File

@ -39,6 +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"
All commands will raise an :ref:`auditing event <auditing>`
``poplib.POP3.putline`` with arguments ``self`` and ``line``,
where ``line`` is the bytes about to be sent to the remote host.
.. class:: POP3_SSL(host, port=POP3_SSL_PORT, keyfile=None, certfile=None, timeout=None, context=None) .. class:: POP3_SSL(host, port=POP3_SSL_PORT, keyfile=None, certfile=None, timeout=None, context=None)
@ -54,6 +60,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"
All commands will raise an :ref:`auditing event <auditing>`
``poplib.POP3.putline`` with arguments ``self`` and ``line``,
where ``line`` is the bytes about to be sent to the remote host.
.. versionchanged:: 3.2 .. versionchanged:: 3.2
*context* parameter added. *context* parameter added.

View File

@ -249,6 +249,8 @@ 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"
.. versionchanged:: 3.3 .. versionchanged:: 3.3
Copy metadata when *symlinks* is false. Copy metadata when *symlinks* is false.
Now returns *dst*. Now returns *dst*.
@ -296,6 +298,8 @@ 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
.. 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
if platform supports fd-based functions. if platform supports fd-based functions.
@ -558,6 +562,8 @@ 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"
.. 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
the legacy GNU format for archives created with ``format="tar"``. the legacy GNU format for archives created with ``format="tar"``.

View File

@ -55,6 +55,10 @@ Protocol) and :rfc:`1869` (SMTP Service Extensions).
(250, b'Ok') (250, b'Ok')
>>> >>>
All commands will raise an :ref:`auditing event <auditing>`
``smtplib.SMTP.send`` with arguments ``self`` and ``data``,
where ``data`` is the bytes about to be sent to the remote host.
.. versionchanged:: 3.3 .. versionchanged:: 3.3
Support for the :keyword:`with` statement was added. Support for the :keyword:`with` statement was added.
@ -242,6 +246,8 @@ 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"
.. method:: SMTP.helo(name='') .. method:: SMTP.helo(name='')

View File

@ -224,6 +224,8 @@ 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"
.. versionchanged:: 3.4 .. versionchanged:: 3.4
Added the *uri* parameter. Added the *uri* parameter.

View File

@ -585,6 +585,13 @@ 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"
Popen and the other functions in this module that use it raise an
:ref:`auditing event <auditing>` ``subprocess.Popen`` with arguments
``executable``, ``args``, ``cwd``, ``env``. The value for ``args``
may be a single string or a list of strings, depending on platform.
.. versionchanged:: 3.2 .. versionchanged:: 3.2
Added context manager support. Added context manager support.

View File

@ -141,6 +141,8 @@ 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"
.. method:: Telnet.msg(msg, *args) .. method:: Telnet.msg(msg, *args)
@ -176,6 +178,8 @@ 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"
.. 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
of :exc:`OSError`. of :exc:`OSError`.

View File

@ -62,6 +62,8 @@ 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"
.. versionchanged:: 3.5 .. versionchanged:: 3.5
The :py:data:`os.O_TMPFILE` flag is now used if available. The :py:data:`os.O_TMPFILE` flag is now used if available.
@ -85,6 +87,8 @@ 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"
.. versionchanged:: 3.8 .. versionchanged:: 3.8
Added *errors* parameter. Added *errors* parameter.
@ -130,6 +134,8 @@ 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"
.. versionadded:: 3.2 .. versionadded:: 3.2
@ -177,6 +183,8 @@ 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"
.. 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
obtain a bytes return value. Prior to this, only str was allowed. obtain a bytes return value. Prior to this, only str was allowed.
@ -198,6 +206,8 @@ 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"
.. 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
obtain a bytes return value. Prior to this, only str was allowed. obtain a bytes return value. Prior to this, only str was allowed.

View File

@ -97,7 +97,7 @@ The :mod:`urllib.request` module defines the following functions:
.. audit-event:: urllib.Request "fullurl data headers method" .. audit-event:: urllib.Request "fullurl data headers method"
The default opener raises an :func:`auditing event <sys.audit>` The default opener raises an :ref:`auditing event <auditing>`
``urllib.Request`` with arguments ``fullurl``, ``data``, ``headers``, ``urllib.Request`` with arguments ``fullurl``, ``data``, ``headers``,
``method`` taken from the request object. ``method`` taken from the request object.

View File

@ -64,6 +64,8 @@ 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"
.. function:: open_new(url) .. function:: open_new(url)

View File

@ -115,8 +115,8 @@ class CheckSuspiciousMarkupBuilder(Builder):
def finish(self): def finish(self):
unused_rules = [rule for rule in self.rules if not rule.used] unused_rules = [rule for rule in self.rules if not rule.used]
if unused_rules: if unused_rules:
self.warn('Found %s/%s unused rules:' % self.logger.warn('Found %s/%s unused rules:' %
(len(unused_rules), len(self.rules))) (len(unused_rules), len(self.rules)))
for rule in unused_rules: for rule in unused_rules:
self.logger.info(repr(rule)) self.logger.info(repr(rule))
return return
@ -151,10 +151,10 @@ class CheckSuspiciousMarkupBuilder(Builder):
self.any_issue = True self.any_issue = True
self.write_log_entry(lineno, issue, text) self.write_log_entry(lineno, issue, text)
if py3: if py3:
self.warn('[%s:%d] "%s" found in "%-.120s"' % self.logger.warn('[%s:%d] "%s" found in "%-.120s"' %
(self.docname, lineno, issue, text)) (self.docname, lineno, issue, text))
else: else:
self.warn('[%s:%d] "%s" found in "%-.120s"' % ( self.logger.warn('[%s:%d] "%s" found in "%-.120s"' % (
self.docname.encode(sys.getdefaultencoding(),'replace'), self.docname.encode(sys.getdefaultencoding(),'replace'),
lineno, lineno,
issue.encode(sys.getdefaultencoding(),'replace'), issue.encode(sys.getdefaultencoding(),'replace'),

View File

@ -73,6 +73,8 @@ def _bootstrap(*, root=None, upgrade=False, user=False,
if altinstall and default_pip: if altinstall and default_pip:
raise ValueError("Cannot use altinstall and default_pip together") raise ValueError("Cannot use altinstall and default_pip together")
sys.audit("ensurepip.bootstrap", root)
_disable_pip_configuration_settings() _disable_pip_configuration_settings()
# By default, installing pip and setuptools installs all of the # By default, installing pip and setuptools installs all of the

View File

@ -148,6 +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)
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
@ -188,6 +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)
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

@ -3,6 +3,7 @@
import os import os
import re import re
import fnmatch import fnmatch
import sys
__all__ = ["glob", "iglob", "escape"] __all__ = ["glob", "iglob", "escape"]
@ -37,6 +38,7 @@ def iglob(pathname, *, recursive=False):
return it return it
def _iglob(pathname, recursive, dironly): def _iglob(pathname, recursive, dironly):
sys.audit("glob.glob", pathname, recursive)
dirname, basename = os.path.split(pathname) dirname, basename = os.path.split(pathname)
if not has_magic(pathname): if not has_magic(pathname):
assert not dironly assert not dironly

View File

@ -289,6 +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)
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):
@ -318,6 +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)
self.sock.sendall(data) self.sock.sendall(data)

View File

@ -68,6 +68,7 @@ import socket
import collections import collections
import datetime import datetime
import warnings import warnings
import sys
try: try:
import ssl import ssl
@ -413,6 +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)
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)
@ -1040,6 +1042,7 @@ class NNTP(_NNTPBase):
""" """
self.host = host self.host = host
self.port = port self.port = port
sys.audit("nntplib.NNTP", 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:
@ -1071,6 +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)
self.sock = socket.create_connection((host, port), timeout) self.sock = socket.create_connection((host, port), timeout)
file = None file = None
try: try:

View File

@ -141,6 +141,7 @@ class Pdb(bdb.Bdb, cmd.Cmd):
nosigint=False, readrc=True): nosigint=False, readrc=True):
bdb.Bdb.__init__(self, skip=skip) bdb.Bdb.__init__(self, skip=skip)
cmd.Cmd.__init__(self, completekey, stdin, stdout) cmd.Cmd.__init__(self, completekey, stdin, stdout)
sys.audit("pdb.Pdb")
if stdout: if stdout:
self.use_rawinput = 0 self.use_rawinput = 0
self.prompt = '(Pdb) ' self.prompt = '(Pdb) '

View File

@ -16,6 +16,7 @@ Based on the J. Myers POP3 draft, Jan. 96
import errno import errno
import re import re
import socket import socket
import sys
try: try:
import ssl import ssl
@ -99,6 +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)
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
@ -109,6 +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)
self.sock.sendall(line + CRLF) self.sock.sendall(line + CRLF)

View File

@ -530,6 +530,7 @@ def copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,
function that supports the same signature (like copy()) can be used. function that supports the same signature (like copy()) can be used.
""" """
sys.audit("shutil.copytree", src, dst)
with os.scandir(src) as entries: with os.scandir(src) as entries:
return _copytree(entries=entries, src=src, dst=dst, symlinks=symlinks, return _copytree(entries=entries, src=src, dst=dst, symlinks=symlinks,
ignore=ignore, copy_function=copy_function, ignore=ignore, copy_function=copy_function,
@ -640,6 +641,7 @@ def rmtree(path, ignore_errors=False, onerror=None):
is false and onerror is None, an exception is raised. is false and onerror is None, an exception is raised.
""" """
sys.audit("shutil.rmtree", path)
if ignore_errors: if ignore_errors:
def onerror(*args): def onerror(*args):
pass pass
@ -965,6 +967,7 @@ def make_archive(base_name, format, root_dir=None, base_dir=None, verbose=0,
'owner' and 'group' are used when creating a tar archive. By default, 'owner' and 'group' are used when creating a tar archive. By default,
uses the current owner and group. uses the current owner and group.
""" """
sys.audit("shutil.make_archive", base_name, format, root_dir, base_dir)
save_cwd = os.getcwd() save_cwd = os.getcwd()
if root_dir is not None: if root_dir is not None:
if logger is not None: if logger is not None:

View File

@ -335,6 +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)
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()
@ -352,6 +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)
try: try:
self.sock.sendall(s) self.sock.sendall(s)
except OSError: except OSError:

View File

@ -1268,6 +1268,11 @@ class Popen(object):
comspec = os.environ.get("COMSPEC", "cmd.exe") comspec = os.environ.get("COMSPEC", "cmd.exe")
args = '{} /c "{}"'.format (comspec, args) args = '{} /c "{}"'.format (comspec, args)
if cwd is not None:
cwd = os.fsdecode(cwd)
sys.audit("subprocess.Popen", executable, args, cwd, env)
# Start the process # Start the process
try: try:
hp, ht, pid, tid = _winapi.CreateProcess(executable, args, hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
@ -1276,7 +1281,7 @@ class Popen(object):
int(not close_fds), int(not close_fds),
creationflags, creationflags,
env, env,
os.fsdecode(cwd) if cwd is not None else None, cwd,
startupinfo) startupinfo)
finally: finally:
# Child is launched. Close the parent's copy of those pipe # Child is launched. Close the parent's copy of those pipe
@ -1543,6 +1548,8 @@ class Popen(object):
if executable is None: if executable is None:
executable = args[0] executable = args[0]
sys.audit("subprocess.Popen", executable, args, cwd, env)
if (_USE_POSIX_SPAWN if (_USE_POSIX_SPAWN
and os.path.dirname(executable) and os.path.dirname(executable)
and preexec_fn is None and preexec_fn is None

View File

@ -231,6 +231,7 @@ class Telnet:
self.host = host self.host = host
self.port = port self.port = port
self.timeout = timeout self.timeout = timeout
sys.audit("telnetlib.Telnet.open", self, host, port)
self.sock = socket.create_connection((host, port), timeout) self.sock = socket.create_connection((host, port), timeout)
def __del__(self): def __del__(self):
@ -286,6 +287,7 @@ class Telnet:
""" """
if IAC in buffer: if IAC in buffer:
buffer = buffer.replace(IAC, IAC+IAC) buffer = buffer.replace(IAC, IAC+IAC)
sys.audit("telnetlib.Telnet.write", self, buffer)
self.msg("send %r", buffer) self.msg("send %r", buffer)
self.sock.sendall(buffer) self.sock.sendall(buffer)

View File

@ -43,6 +43,7 @@ import os as _os
import shutil as _shutil import shutil as _shutil
import errno as _errno import errno as _errno
from random import Random as _Random from random import Random as _Random
import sys as _sys
import weakref as _weakref import weakref as _weakref
import _thread import _thread
_allocate_lock = _thread.allocate_lock _allocate_lock = _thread.allocate_lock
@ -244,6 +245,7 @@ def _mkstemp_inner(dir, pre, suf, flags, output_type):
for seq in range(TMP_MAX): for seq in range(TMP_MAX):
name = next(names) name = next(names)
file = _os.path.join(dir, pre + name + suf) file = _os.path.join(dir, pre + name + suf)
_sys.audit("tempfile.mkstemp", file)
try: try:
fd = _os.open(file, flags, 0o600) fd = _os.open(file, flags, 0o600)
except FileExistsError: except FileExistsError:
@ -352,6 +354,7 @@ def mkdtemp(suffix=None, prefix=None, dir=None):
for seq in range(TMP_MAX): for seq in range(TMP_MAX):
name = next(names) name = next(names)
file = _os.path.join(dir, prefix + name + suffix) file = _os.path.join(dir, prefix + name + suffix)
_sys.audit("tempfile.mkdtemp", file)
try: try:
_os.mkdir(file, 0o700) _os.mkdir(file, 0o700)
except FileExistsError: except FileExistsError:
@ -546,7 +549,7 @@ def NamedTemporaryFile(mode='w+b', buffering=-1, encoding=None,
_os.close(fd) _os.close(fd)
raise raise
if _os.name != 'posix' or _os.sys.platform == 'cygwin': if _os.name != 'posix' or _sys.platform == 'cygwin':
# On non-POSIX and Cygwin systems, assume that we cannot unlink a file # On non-POSIX and Cygwin systems, assume that we cannot unlink a file
# while it is open. # while it is open.
TemporaryFile = NamedTemporaryFile TemporaryFile = NamedTemporaryFile

View File

@ -154,6 +154,7 @@ class GenericBrowser(BaseBrowser):
self.basename = os.path.basename(self.name) self.basename = os.path.basename(self.name)
def open(self, url, new=0, autoraise=True): def open(self, url, new=0, autoraise=True):
sys.audit("webbrowser.open", url)
cmdline = [self.name] + [arg.replace("%s", url) cmdline = [self.name] + [arg.replace("%s", url)
for arg in self.args] for arg in self.args]
try: try:
@ -173,6 +174,7 @@ class BackgroundBrowser(GenericBrowser):
def open(self, url, new=0, autoraise=True): def open(self, url, new=0, autoraise=True):
cmdline = [self.name] + [arg.replace("%s", url) cmdline = [self.name] + [arg.replace("%s", url)
for arg in self.args] for arg in self.args]
sys.audit("webbrowser.open", url)
try: try:
if sys.platform[:3] == 'win': if sys.platform[:3] == 'win':
p = subprocess.Popen(cmdline) p = subprocess.Popen(cmdline)
@ -201,7 +203,7 @@ class UnixBrowser(BaseBrowser):
remote_action_newwin = None remote_action_newwin = None
remote_action_newtab = None remote_action_newtab = None
def _invoke(self, args, remote, autoraise): def _invoke(self, args, remote, autoraise, url=None):
raise_opt = [] raise_opt = []
if remote and self.raise_opts: if remote and self.raise_opts:
# use autoraise argument only for remote invocation # use autoraise argument only for remote invocation
@ -237,6 +239,7 @@ class UnixBrowser(BaseBrowser):
return not p.wait() return not p.wait()
def open(self, url, new=0, autoraise=True): def open(self, url, new=0, autoraise=True):
sys.audit("webbrowser.open", url)
if new == 0: if new == 0:
action = self.remote_action action = self.remote_action
elif new == 1: elif new == 1:
@ -253,7 +256,7 @@ class UnixBrowser(BaseBrowser):
args = [arg.replace("%s", url).replace("%action", action) args = [arg.replace("%s", url).replace("%action", action)
for arg in self.remote_args] for arg in self.remote_args]
args = [arg for arg in args if arg] args = [arg for arg in args if arg]
success = self._invoke(args, True, autoraise) success = self._invoke(args, True, autoraise, url)
if not success: if not success:
# remote invocation failed, try straight way # remote invocation failed, try straight way
args = [arg.replace("%s", url) for arg in self.args] args = [arg.replace("%s", url) for arg in self.args]
@ -337,6 +340,7 @@ class Konqueror(BaseBrowser):
""" """
def open(self, url, new=0, autoraise=True): def open(self, url, new=0, autoraise=True):
sys.audit("webbrowser.open", url)
# XXX Currently I know no way to prevent KFM from opening a new win. # XXX Currently I know no way to prevent KFM from opening a new win.
if new == 2: if new == 2:
action = "newTab" action = "newTab"
@ -420,6 +424,7 @@ class Grail(BaseBrowser):
return 1 return 1
def open(self, url, new=0, autoraise=True): def open(self, url, new=0, autoraise=True):
sys.audit("webbrowser.open", url)
if new: if new:
ok = self._remote("LOADNEW " + url) ok = self._remote("LOADNEW " + url)
else: else:
@ -577,6 +582,7 @@ def register_standard_browsers():
if sys.platform[:3] == "win": if sys.platform[:3] == "win":
class WindowsDefault(BaseBrowser): class WindowsDefault(BaseBrowser):
def open(self, url, new=0, autoraise=True): def open(self, url, new=0, autoraise=True):
sys.audit("webbrowser.open", url)
try: try:
os.startfile(url) os.startfile(url)
except OSError: except OSError:
@ -606,6 +612,7 @@ if sys.platform == 'darwin':
self.name = name self.name = name
def open(self, url, new=0, autoraise=True): def open(self, url, new=0, autoraise=True):
sys.audit("webbrowser.open", url)
assert "'" not in url assert "'" not in url
# hack for local urls # hack for local urls
if not ':' in url: if not ':' in url:

View File

@ -0,0 +1,5 @@
Adds audit events for :mod:`ensurepip`, :mod:`ftplib`, :mod:`glob`,
:mod:`imaplib`, :mod:`nntplib`, :mod:`pdb`, :mod:`poplib`, :mod:`shutil`,
:mod:`smtplib`, :mod:`sqlite3`, :mod:`subprocess`, :mod:`telnetlib`,
:mod:`tempfile` and :mod:`webbrowser`, as well as :func:`os.listdir`,
:func:`os.scandir` and :func:`breakpoint`.

View File

@ -85,6 +85,10 @@ static PyObject* module_connect(PyObject* self, PyObject* args, PyObject*
factory = (PyObject*)&pysqlite_ConnectionType; factory = (PyObject*)&pysqlite_ConnectionType;
} }
if (PySys_Audit("sqlite3.connect", "O", database) < 0) {
return NULL;
}
result = PyObject_Call(factory, args, kwargs); result = PyObject_Call(factory, args, kwargs);
return result; return result;

View File

@ -3759,6 +3759,10 @@ static PyObject *
os_listdir_impl(PyObject *module, path_t *path) os_listdir_impl(PyObject *module, path_t *path)
/*[clinic end generated code: output=293045673fcd1a75 input=e3f58030f538295d]*/ /*[clinic end generated code: output=293045673fcd1a75 input=e3f58030f538295d]*/
{ {
if (PySys_Audit("os.listdir", "O",
path->object ? path->object : Py_None) < 0) {
return NULL;
}
#if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR) #if defined(MS_WINDOWS) && !defined(HAVE_OPENDIR)
return _listdir_windows_no_opendir(path, NULL); return _listdir_windows_no_opendir(path, NULL);
#else #else
@ -13164,6 +13168,11 @@ os_scandir_impl(PyObject *module, path_t *path)
#endif #endif
#endif #endif
if (PySys_Audit("os.scandir", "O",
path->object ? path->object : Py_None) < 0) {
return NULL;
}
iterator = PyObject_New(ScandirIterator, &ScandirIteratorType); iterator = PyObject_New(ScandirIterator, &ScandirIteratorType);
if (!iterator) if (!iterator)
return NULL; return NULL;

View File

@ -482,6 +482,11 @@ builtin_breakpoint(PyObject *self, PyObject *const *args, Py_ssize_t nargs, PyOb
PyErr_SetString(PyExc_RuntimeError, "lost sys.breakpointhook"); PyErr_SetString(PyExc_RuntimeError, "lost sys.breakpointhook");
return NULL; return NULL;
} }
if (PySys_Audit("builtins.breakpoint", "O", hook) < 0) {
return NULL;
}
Py_INCREF(hook); Py_INCREF(hook);
PyObject *retval = _PyObject_Vectorcall(hook, args, nargs, keywords); PyObject *retval = _PyObject_Vectorcall(hook, args, nargs, keywords);
Py_DECREF(hook); Py_DECREF(hook);