Commit graph

153 commits

Author SHA1 Message Date
Lukas Pühringer
dd855b1fca
Merge pull request #2241 from jku/repository-lib-uploader
Examples: Add repository uploader
2023-02-08 10:30:52 +01:00
Jussi Kukkonen
b67b8c8ad3 Whitespace changes to make new black linter happy
Signed-off-by: Jussi Kukkonen <jkukkonen@google.com>
2023-02-06 15:29:28 +02:00
Jussi Kukkonen
d36c0cfa02 examples: Rename client example directory
Signed-off-by: Jussi Kukkonen <jkukkonen@google.com>
2023-02-02 16:25:47 +02:00
Jussi Kukkonen
d61dbabc78
Merge pull request #2281 from fridex/pydocstyle-d209
Fix pydocstyle D209
2023-02-02 14:33:41 +02:00
Lukas Pühringer
93b8fb6377
Merge pull request #2279 from fridex/export-targetfile-ngclient
Export TUF TargetFile in ngclient
2023-01-31 09:19:41 +01:00
Fridolin Pokorny
744f75c1e7
Fix pydocstyle D209
Fix multi-line docstring closing quotes should be on a separate line

Signed-off-by: Fridolin Pokorny <fridolin.pokorny@datadoghq.com>
2023-01-26 16:36:13 +01:00
Fridolin Pokorny
524a6b848f
Export TUF TargetFile in ngclient
Signed-off-by: Fridolin Pokorny <fridolin.pokorny@datadoghq.com>
2023-01-26 15:54:44 +01:00
Fridolin Pokorny
5d347b8707
Fix pydocstyle D400: first line should end with a period
Signed-off-by: Fridolin Pokorny <fridolin.pokorny@datadoghq.com>
2023-01-26 15:33:09 +01:00
Jussi Kukkonen
889b218e7a Add comment explaining public status to the module itself
Signed-off-by: Jussi Kukkonen <jkukkonen@google.com>
2023-01-26 09:33:44 +02:00
Jussi Kukkonen
f8a7881c87 Make RequestsFetcher public
This is useful for those who want to use the default fetcher
but modify some attributes

The file itself could be moved to tuf/ngclient/ but this is not done yet
as sigstore-python is using this internal module. Move can be done once
sigstore-python 1.0 is no longer relevant.

Fixes #2268

Signed-off-by: Jussi Kukkonen <jkukkonen@google.com>
2023-01-25 15:55:11 +02:00
Jussi Kukkonen
e1d15887a8 ngclient: Remove "Optional" from helper props
The properties in TrustedMetadataSet are a bit difficult to use
with static typing since they return Optional but in many cases
we know the "None"-case is impossible.

Remove None from annotation: the idea is that calling the property
getter too early is a programming error: it will result in KeyError
which is consistent:
 * trusted_set["timestamp"] raises KeyError if timestamp is not set
 * trusted_set.timestamp raises KeyError if timestamp is not set

Signed-off-by: Jussi Kukkonen <jkukkonen@google.com>
2022-12-27 16:56:32 +02:00
Aditya Shrivastav
42cb50b15b
Merge branch 'theupdateframework:develop' into metaclass-fix 2022-12-27 16:28:43 +05:30
adityashrivastav1
086216f7cc unused variable removed, inheritance fixed
Signed-off-by: adityashrivastav1 <aditya.shri9981@gmail.com>
2022-12-27 16:27:17 +05:30
adityashrivastav1
2c15c75e50 class FetcherInterface() changed to FetchterInterface(abc.ABC)
Signed-off-by: adityashrivastav1 <aditya.shri9981@gmail.com>
signed off
Signed-off-by: adityashrivastav1 <aditya.shri9981@gmail.com>
2022-12-27 15:44:54 +05:30
Jussi Kukkonen
ba9ea5b88c
Merge pull request #2230 from fridex/pydocstyle-imperative-mood
Fix pydocstyle D401: first line should be in imperative mood
2022-12-27 11:47:46 +02:00
Jussi Kukkonen
e5856f7c91
Merge pull request #2233 from fridex/tuf-ngclient-api
Provide __all__ for tuf.ngclient module
2022-12-27 11:28:33 +02:00
William Woodruff
2876bfd764
tuf: move INFO logs to DEBUG or WARNING
Signed-off-by: William Woodruff <william@trailofbits.com>
2022-12-20 16:36:04 -05:00
Fridolin Pokorny
9ffb4a4474
Provide __all__ for tuf.ngclient module
Signed-off-by: Fridolin Pokorny <fridolin.pokorny@datadoghq.com>
2022-12-20 00:17:31 +01:00
Fridolin Pokorny
c4e1479003
Fix pydocstyle D401: first line should be in imperative mood
Signed-off-by: Fridolin Pokorny <fridolin.pokorny@datadoghq.com>
2022-12-18 13:13:35 +01:00
Lukas Pühringer
c6f8b5817b
Merge pull request #2197 from jku/client-robustness
ngclient: Fail gracefully on missing role
2022-12-16 10:23:08 +01:00
Martin Vrachev
c8d79a323c
Updater: add missing config docstring
Signed-off-by: Martin Vrachev <mvrachev@vmware.com>
2022-12-06 17:50:13 +02:00
Jussi Kukkonen
6450a3a8ff ngclient: Fail gracefully on missing role
If role is delegated but missing from snapshot, we currently raise a
undocumented KeyError: a generic RepositoryError seems better as callers
are expected to handle it (and adding a more specific error seems
useless as this is a repository software bug, not just expired metadata or
something).

The same check is also done later in TrustedMetadataSet but I think
keeping the check in both is clearest.

Fixes #2195

Signed-off-by: Jussi Kukkonen <jkukkonen@google.com>
2022-11-28 11:20:31 +02:00
Jussi Kukkonen
f56d5267ed README: Remove limitations
There may be ways to unsafely use the client library but situation
should be significantly better now with ngclient:
  * metadata writing is safer, more atomic
  * non-root cached metadata is never trusted (so inconsistent
    cached repository is not a security issue)
  * the cache locations are now clearly application
    decisions (they are required Updater constructor args)

Move the notice to Updater module documentation.

Signed-off-by: Jussi Kukkonen <jkukkonen@google.com>
2022-11-18 13:16:41 +02:00
Jussi Kukkonen
35a7dd58c5 RequestsFetcher: satisfy mypy with small fix
The typeshed annotations for requests say that the hostname could be None:
I think this is untrue but let's keep mypy happy.

Signed-off-by: Jussi Kukkonen <jkukkonen@google.com>
2022-10-31 21:25:02 +03:00
KOLANICH
0c9c494261 Supported schemes without netloc.
Signed-off-by: KOLANICH <KOLANICH@users.noreply.github.com>
2022-10-31 21:23:56 +03:00
Abhisman Sarkar
c9505ae3cc Updated updater.py
Changed None to ``None`` in the docstring

Signed-off-by: Abhisman Sarkar <abhisman.sarkar@gmail.com>
2022-07-07 08:17:39 +05:30
Martin Vrachev
5fd3ddccbc ngclient: pick old timestamp if new.ver is equal
In the spec version 1.0.30, a new change has been added considering what
should happen if there is a new timestamp with the same version.
It says the following:
"In case they [versions] are equal, discard the new
timestamp metadata and abort the update cycle.
This is normal and it shouldn't raise any error."

In other words, if there is a new timestamp with the same version, then
stop the update process and use the old timestamp.

Those changes reflect these latest specification modifications.

Signed-off-by: Martin Vrachev <mvrachev@vmware.com>
2022-06-21 14:52:31 +03:00
Martin Vrachev
15cd42c0d6 Delegations: add support for succinct_roles
This commit contains 2 API changes in "Delegations" class from
tuf/api/metadata.py:
1. roles argment is made optional
2. unrecognized_fields argument becomes the 4-th rather than the 3-rd
as it used to be

In this commit, I add support for succinct_roles roles inside
Delegations class. This change is related to TAP 15 proposal.

Signed-off-by: Martin Vrachev <mvrachev@vmware.com>
2022-06-17 13:33:01 +03:00
Jussi Kukkonen
46979bb46d
Merge pull request #2002 from abs007/patch-1916
Appending Fetcher docs to state the method to be implemented.
2022-05-31 15:17:52 +03:00
Jussi Kukkonen
e78b1aaa7d
Merge pull request #2003 from dhavalgshah/kceu22_bugbash/issue1999
fix:  ngclient: temp_file could be undefined #1999
2022-05-31 10:04:07 +03:00
Abhisman Sarkar
4a2fdabc2d Fixes #1916
The class docstring for FetcherInterface needed to clearly state that
only _fetch() had to be implemented in it's implementation. This is
because the public API of the interface is implemented already.

Signed-off-by: Abhisman Sarkar <abhisman.sarkar@gmail.com>
2022-05-17 09:40:16 +05:30
Dhaval Shah
ac7ecfb8d5 fix: Uninitialized local #1999
Annotating local temp_file_name variable is simple than
to annotate temp_file.

Fixes #1999

Signed-off-by: Dhaval Shah <30974879+dhavalgshah@users.noreply.github.com>
2022-05-11 12:04:36 +05:30
Radoslav Dimitrov
9d441da73b docs: remove a duplicated word in refresh() doc comment
Signed-off-by: Radoslav Dimitrov <dimitrovr@vmware.com>
2022-05-10 12:29:30 +03:00
Dhaval Shah
b23c5d9fe5
fix: ngclient: temp_file could be undefined #1999
Fixes ngclient: temp_file could be undefined #1999

Signed-off-by: Dhaval Shah <30974879+dhavalgshah@users.noreply.github.com>
2022-05-10 00:32:20 +05:30
Kairo de Araujo
b5e42c1c92 import requests.exceptions is not necessary
All calls use requests.* and importing requests.exceptions is not
necessary.

Signed-off-by: Kairo de Araujo <kdearaujo@vmware.com>
2022-03-31 10:58:53 +02:00
Ivana Atanasova
d8d0486514 Fix expired metadata tests
This change fixes the expired metadata tests to mock `datetime`
as previously they mocked `time` incorrectly, which did not affect
update methods, as they use `datetime.datetime.utcnow()` to
calculate now

Signed-off-by: Ivana Atanasova <iyovcheva@vmware.com>
2022-03-18 19:53:50 +02:00
Ivana Atanasova
a0d31854bc Fix line lengths in ngclient docstrings
This change shortens line lengths that exceed the requiremets and
adds more clarification on methods where the short message is not
complete enough

Signed-off-by: Ivana Atanasova <iyovcheva@vmware.com>
2022-02-11 15:33:48 +02:00
Ivana Atanasova
43080e1228 Unify wording of docstrings language in ngclient
This change unifies common wording in the docstrings library of
ngclient, like "Args" vs. "Arguments"

Signed-off-by: Ivana Atanasova <iyovcheva@vmware.com>
2022-02-11 14:51:51 +02:00
Ivana Atanasova
d399ad5d1b Unify article in ngclient docstrings
This change updates the docstrings library of ngclient with no
article for all Args in order to be unified amongst all python-tuf
docstrings

Signed-off-by: Ivana Atanasova <iyovcheva@vmware.com>
2022-02-11 14:51:51 +02:00
Ivana Atanasova
d8f60e1baf Unify quoting in ngclient docstrings
This change updates the docstrings library of ngclient with
unified double backtick quoting for better readability

Signed-off-by: Ivana Atanasova <iyovcheva@vmware.com>
2022-02-11 14:51:28 +02:00
Jussi Kukkonen
e6f363273f ngclient: Small refactor, avoid isinstance
Signed-off-by: Jussi Kukkonen <jkukkonen@vmware.com>
2022-02-04 11:03:12 +02:00
Jussi Kukkonen
6b079eefec ngclient: Add missing f to an f-string
Signed-off-by: Jussi Kukkonen <jkukkonen@vmware.com>
2022-02-04 11:03:12 +02:00
Jussi Kukkonen
6718620d60 fetcher: docstring fix
Make the dosctring match the similar argument in download_bytes()

Signed-off-by: Jussi Kukkonen <jkukkonen@vmware.com>
2022-02-04 11:03:12 +02:00
Jussi Kukkonen
17f2ddff02 exceptions: rename FetcherHTTPError
I've not supported many renames but I'm suggesting this one:
FetcherHTTPError was created because we needed to signal 403/404
from the fetcher to updater. At that time the download error hierarchy
in general was not thought out.

Now we have a couple of different errors all derived from
DownloadError. I believe it does not make sense to point out "Fetcher"
in one of their names: DownloadHTTPError makes it clearer this is a
specific type of DownloadError.

Signed-off-by: Jussi Kukkonen <jkukkonen@vmware.com>
2022-02-04 11:03:12 +02:00
Jussi Kukkonen
4efd9496dc ngclient: Make DownloadErrors consistent
Fetcher interface should only raise DownloadErrors,
regardless of the implementation.
 * Make sure fetch() wraps non-DownloadError errors in a DownloadError
 * Make the abstract function private _fetch()
 * Try to be more consistent in doscstrings

This now makes the example client more sensible (when server does not
respond):
    $ ./client_example.py download qwerty
    ...
    Failed to download target qwerty: Failed to download url http://127.0.0.1:8000/metadata/2.root.json

(here the latter part of the error string comes from DownloadError
raised by FetcherInterface.fetch())

Signed-off-by: Jussi Kukkonen <jkukkonen@vmware.com>
2022-02-04 11:03:12 +02:00
Jussi Kukkonen
d3ca8fd2fe ngclient: Remove obsolete TODOs
First TODO is now handled (or we have PRs already).
Second TODO is moved to issue #1804.

Signed-off-by: Jussi Kukkonen <jkukkonen@vmware.com>
2022-01-28 09:53:03 +02:00
Martin Vrachev
3fa0668f89 ngclient: simplify storing a downloaded file
Replace the usage of securesystemslib.util.persist_temp_file() with
shutil.copyfileobj() as file system abstraction is not used in the
client.
This way we prevent securesystemslib.exception.StorageError from
leaking through client API calls.

Note: with those changes we are no longer do fsync.

Signed-off-by: Martin Vrachev <mvrachev@vmware.com>
2022-01-27 16:15:11 +02:00
lukpueh
d95ead6280
Merge pull request #1787 from MVrachev/ngclient-exceptions
Review and document ngclient exceptions
2022-01-27 14:28:13 +01:00
Martin Vrachev
9f7866db0a Additions to the client exceptions
I made a review on all files inside tuf/ngclient to see which of them
needs additions or changes in their function docstrings regarding
exceptions.

I didn't find any changes required inside the request_fetcher.py
and of course inside the config module.
Other than that multiple additions had to be made.

For trusted_metadata_set we had a discussion with Jussi that there is
no need to list each of the specific RepositoryErrors one by one as
this is an internal module and this will only create a bigger
maintenance burden.

For updater.py we had discussions with Jussi and Lukas that we want to
document only those exceptions that could be potentially handled.
This means there is no point in documenting each of the RepositoryErrors
or DownloadErrors separately.

Finally, I added a little documentation for download_bytes() inside
fetcher.py, as it's naming, suggests it's not an internal function.

Signed-off-by: Martin Vrachev <mvrachev@vmware.com>
2022-01-27 14:39:24 +02:00
Jussi Kukkonen
b8759a9937 ngclient: allow compression in HTTP responses
This commit tries to deal with two interests:
* metadata is highly repetitive and compressible: allowing compression
  would be good
* there may be broken web servers (see
  404838abcc/src/pip/_internal/download.py (L842))
  that have problems with compression on already compressed target files

We can make things better for that first interest while we have no real
data for the second interest -- our current workarounds to avoid
compression are based on hearsay, not testing.

Now that individual fetchers are possible I suggest we simplify
ngclient and allow compression. As an example the pip Fetcher
could still use the pip response chunking code with all their
workarounds -- pip certainly has better capability to maintain
a mountain of workarounds and also has endless amounts of real-world
testing compared to python-tuf.

Details:
* Stop modifying Accept-Encoding (Requests default includes gzip)
* Don't use response.raw in RequestsFetcher as there is no need:
  This was a workaround for false "Content-encoding: gzip" inserted by
  a broken server -- and the workaround was only possible because we
  knew we never asked for compression
* Fix issue in test_session_get_timeout(): it's not mocking the error
  that requests really raises in this case

Fixes #1251

Signed-off-by: Jussi Kukkonen <jkukkonen@vmware.com>
2022-01-25 15:03:35 +02:00