Skip to content

Commit

Permalink
get_url - Allow checksum file to be local file:// url (ansible#71205)
Browse files Browse the repository at this point in the history
This would be a partial solution for ansible#69364 in that the SHASUMS file can be downloaded and gpg verified but then used from the downloaded location to verify the get_url's file.
* Make checksum url parsing more explicit

Use urlsplit to test if the checksum string has a (currently tested and) supported url scheme.

* Fix whitespace
* Changelog fragment
* Added tests
* Fix typo in test setup
  • Loading branch information
madeddie authored and bcoca committed Aug 19, 2020
1 parent 7d773e7 commit 12ca7cd
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 1 deletion.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
minor_changes:
- get_url - allow checksum urls to point to file:// resources, moving scheme test to function
10 changes: 9 additions & 1 deletion lib/ansible/modules/get_url.py
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,14 @@ def extract_filename_from_headers(headers):
return res


def is_url(checksum):
"""
Returns True if checksum value has supported URL scheme, else False."""
supported_schemes = ('http', 'https', 'ftp', 'file')

return urlsplit(checksum).scheme in supported_schemes


# ==============================================================
# main

Expand Down Expand Up @@ -487,7 +495,7 @@ def main():
except ValueError:
module.fail_json(msg="The checksum parameter has to be in format <algorithm>:<checksum>", **result)

if checksum.startswith('http://') or checksum.startswith('https://') or checksum.startswith('ftp://'):
if is_url(checksum):
checksum_url = checksum
# download checksum file to checksum_tmpsrc
checksum_tmpsrc, checksum_info = url_get(module, checksum_url, dest, use_proxy, last_mod_time, force, timeout, headers, tmp_dest)
Expand Down
13 changes: 13 additions & 0 deletions test/integration/targets/get_url/tasks/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -407,15 +407,28 @@
path: "{{ remote_tmp_dir }}/27617sha256_with_dot.txt"
register: stat_result_sha256_with_dot

- name: download src with sha256 checksum url with file scheme
get_url:
url: 'http://localhost:{{ http_port }}/27617.txt'
dest: '{{ remote_tmp_dir }}/27617sha256_with_file_scheme.txt'
checksum: 'sha256:file://{{ files_dir }}/sha256sum.txt'
register: result_sha256_with_file_scheme

- stat:
path: "{{ remote_tmp_dir }}/27617sha256_with_dot.txt"
register: stat_result_sha256_with_file_scheme

- name: Assert that the file was downloaded
assert:
that:
- result_sha1 is changed
- result_sha256 is changed
- result_sha256_with_dot is changed
- result_sha256_with_file_scheme is changed
- "stat_result_sha1.stat.exists == true"
- "stat_result_sha256.stat.exists == true"
- "stat_result_sha256_with_dot.stat.exists == true"
- "stat_result_sha256_with_file_scheme.stat.exists == true"

#https://github.com/ansible/ansible/issues/16191
- name: Test url split with no filename
Expand Down

0 comments on commit 12ca7cd

Please sign in to comment.