Move the Checksums module from virt-builder mostly as it is; the only change is that on checksum mismatch an exception is raised rather than invoking "error" directly: this way users of verify_checksum & verify_checksums can do their own handling of the situation. --- builder/Makefile.am | 2 -- builder/builder.ml | 6 +++++- builder/checksums.ml | 57 --------------------------------------------------- builder/checksums.mli | 33 ----------------------------- mllib/Makefile.am | 4 +++- mllib/checksums.ml | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++ mllib/checksums.mli | 35 +++++++++++++++++++++++++++++++ 7 files changed, 99 insertions(+), 94 deletions(-) delete mode 100644 builder/checksums.ml delete mode 100644 builder/checksums.mli create mode 100644 mllib/checksums.ml create mode 100644 mllib/checksums.mli
diff --git a/builder/Makefile.am b/builder/Makefile.am index 7983223..5977d8b 100644 --- a/builder/Makefile.am +++ b/builder/Makefile.am @@ -44,7 +44,6 @@ SOURCES_MLI = \ cache.mli \ cmdline.mli \ downloader.mli \ - checksums.mli \ index.mli \ index_parser.mli \ ini_reader.mli \ @@ -61,7 +60,6 @@ SOURCES_ML = \ utils.ml \ pxzcat.ml \ setlocale.ml \ - checksums.ml \ index.ml \ ini_reader.ml \ yajl.ml \ diff --git a/builder/builder.ml b/builder/builder.ml index fdbe659..799208a 100644 --- a/builder/builder.ml +++ b/builder/builder.ml @@ -307,7 +307,11 @@ let main () = match entry with (* New-style: Using a checksum. *) | { Index.checksums = Some csums } -> - Checksums.verify_checksums csums template + (try Checksums.verify_checksums csums template + with Checksums.Mismatched_checksum (csum, csum_actual) -> + error (f_"%s checksum of template did not match the expected checksum!\n found checksum: %s\n expected checksum: %s\nTry:\n - Use the '-v' option and look for earlier error messages.\n - Delete the cache: virt-builder --delete-cache\n - Check no one has tampered with the website or your network!") + (Checksums.string_of_csum_t csum) csum_actual (Checksums.string_of_csum csum) + ) | { Index.checksums = None } -> (* Old-style: detached signature. *) diff --git a/builder/checksums.ml b/builder/checksums.ml deleted file mode 100644 index c8cdc98..0000000 --- a/builder/checksums.ml +++ /dev/null @@ -1,57 +0,0 @@ -(* virt-builder - * Copyright (C) 2015 Red Hat Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - *) - -open Common_gettext.Gettext -open Common_utils - -open Utils - -open Printf - -type csum_t = -| SHA256 of string -| SHA512 of string - -let string_of_csum_t = function - | SHA256 _ -> "sha256" - | SHA512 _ -> "sha512" - -let string_of_csum = function - | SHA256 c -> c - | SHA512 c -> c - -let verify_checksum csum filename = - let prog, csum_ref = - match csum with - | SHA256 c -> "sha256sum", c - | SHA512 c -> "sha512sum", c - in - - let cmd = sprintf "%s %s" prog (quote filename) in - let lines = external_command cmd in - match lines with - | [] -> - error (f_"%s did not return any output") prog - | line :: _ -> - let csum_actual = fst (String.split " " line) in - if csum_ref <> csum_actual then - error (f_"%s checksum of template did not match the expected checksum!\n found checksum: %s\n expected checksum: %s\nTry:\n - Use the '-v' option and look for earlier error messages.\n - Delete the cache: virt-builder --delete-cache\n - Check no one has tampered with the website or your network!") - (string_of_csum_t csum) csum_actual csum_ref - -let verify_checksums checksums filename = - List.iter (fun c -> verify_checksum c filename) checksums diff --git a/builder/checksums.mli b/builder/checksums.mli deleted file mode 100644 index ef26634..0000000 --- a/builder/checksums.mli +++ /dev/null @@ -1,33 +0,0 @@ -(* virt-builder - * Copyright (C) 2015 Red Hat Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - *) - -type csum_t = -| SHA256 of string -| SHA512 of string - -val verify_checksum : csum_t -> string -> unit -(** Verify the checksum of the file. *) - -val verify_checksums : csum_t list -> string -> unit -(** Verify all the checksums of the file. *) - -val string_of_csum_t : csum_t -> string -(** Return a string representation of the checksum type. *) - -val string_of_csum : csum_t -> string -(** Return a string representation of the checksum value. *) diff --git a/mllib/Makefile.am b/mllib/Makefile.am index 489529a..f100b2f 100644 --- a/mllib/Makefile.am +++ b/mllib/Makefile.am @@ -27,6 +27,7 @@ EXTRA_DIST = \ test-getopt.sh SOURCES_MLI = \ + checksums.mli \ common_utils.mli \ curl.mli \ dev_t.mli \ @@ -60,7 +61,8 @@ SOURCES_ML = \ StatVFS.ml \ JSON.ml \ curl.ml \ - exit.ml + exit.ml \ + checksums.ml SOURCES_C = \ ../fish/decrypt.c \ diff --git a/mllib/checksums.ml b/mllib/checksums.ml new file mode 100644 index 0000000..918a1c2 --- /dev/null +++ b/mllib/checksums.ml @@ -0,0 +1,56 @@ +(* virt-builder + * Copyright (C) 2015 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + *) + +open Common_gettext.Gettext +open Common_utils + +open Printf + +type csum_t = +| SHA256 of string +| SHA512 of string + +exception Mismatched_checksum of (csum_t * string) + +let string_of_csum_t = function + | SHA256 _ -> "sha256" + | SHA512 _ -> "sha512" + +let string_of_csum = function + | SHA256 c -> c + | SHA512 c -> c + +let verify_checksum csum filename = + let prog, csum_ref = + match csum with + | SHA256 c -> "sha256sum", c + | SHA512 c -> "sha512sum", c + in + + let cmd = sprintf "%s %s" prog (Filename.quote filename) in + let lines = external_command cmd in + match lines with + | [] -> + error (f_"%s did not return any output") prog + | line :: _ -> + let csum_actual = fst (String.split " " line) in + if csum_ref <> csum_actual then + raise (Mismatched_checksum (csum, csum_actual)) + +let verify_checksums checksums filename = + List.iter (fun c -> verify_checksum c filename) checksums diff --git a/mllib/checksums.mli b/mllib/checksums.mli new file mode 100644 index 0000000..202bdd1 --- /dev/null +++ b/mllib/checksums.mli @@ -0,0 +1,35 @@ +(* virt-builder + * Copyright (C) 2015 Red Hat Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + *) + +type csum_t = +| SHA256 of string +| SHA512 of string + +exception Mismatched_checksum of (csum_t * string) (* expected checksum, got *) + +val verify_checksum : csum_t -> string -> unit +(** Verify the checksum of the file. *) + +val verify_checksums : csum_t list -> string -> unit +(** Verify all the checksums of the file. *) + +val string_of_csum_t : csum_t -> string +(** Return a string representation of the checksum type. *) + +val string_of_csum : csum_t -> string +(** Return a string representation of the checksum value. *) -- 2.7.4 _______________________________________________ Libguestfs mailing list Libguestfs@redhat.com https://www.redhat.com/mailman/listinfo/libguestfs