summaryrefslogtreecommitdiffstats
path: root/python/hashstring.cc
diff options
context:
space:
mode:
Diffstat (limited to 'python/hashstring.cc')
-rw-r--r--python/hashstring.cc182
1 files changed, 182 insertions, 0 deletions
diff --git a/python/hashstring.cc b/python/hashstring.cc
new file mode 100644
index 0000000..01f14a0
--- /dev/null
+++ b/python/hashstring.cc
@@ -0,0 +1,182 @@
+/* hashstring.cc - Wrapper around HashString
+ *
+ * Copyright 2009 Julian Andres Klode <jak@debian.org>
+ *
+ * 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.
+ */
+#include <Python.h>
+#include "generic.h"
+#include "apt_pkgmodule.h"
+#include <apt-pkg/hashes.h>
+
+static PyObject *hashstring_new(PyTypeObject *type,PyObject *Args,
+ PyObject *kwds)
+{
+ char *Type = NULL;
+ char *Hash = NULL;
+ char *kwlist[] = {"type", "hash", NULL};
+ if (PyArg_ParseTupleAndKeywords(Args, kwds, "s|s:__new__", kwlist, &Type,
+ &Hash) == 0)
+ return 0;
+ CppPyObject<HashString*> *PyObj = CppPyObject_NEW<HashString*>(NULL, type);
+ if (Hash)
+ PyObj->Object = new HashString(Type,Hash);
+ else // Type is the combined form now (i.e. type:hash)
+ PyObj->Object = new HashString(Type);
+ return PyObj;
+}
+
+static PyObject *hashstring_repr(PyObject *self)
+{
+ HashString *hash = GetCpp<HashString*>(self);
+ return PyString_FromFormat("<%s object: \"%s\">", self->ob_type->tp_name,
+ hash->toStr().c_str());
+}
+
+static PyObject *hashstring_str(PyObject *self)
+{
+ const HashString *hash = GetCpp<HashString*>(self);
+ return CppPyString(hash->toStr());
+}
+
+static PyObject *hashstring_get_hashtype(PyObject *self)
+{
+ const HashString *hash = GetCpp<HashString*>(self);
+ return CppPyString(hash->HashType());
+}
+
+static PyObject *hashstring_get_usable(PyObject *self)
+{
+ const HashString *hash = GetCpp<HashString*>(self);
+ return PyBool_FromLong(hash->usable());
+}
+
+static PyObject *hashstring_get_hashvalue(PyObject *self)
+{
+ const HashString *hash = GetCpp<HashString*>(self);
+ return CppPyString(hash->HashValue());
+}
+
+static char *hashstring_verify_file_doc =
+ "verify_file(filename: str) -> bool\n\n"
+ "Verify that the file indicated by filename matches the hash.";
+
+static PyObject *hashstring_verify_file(PyObject *self,PyObject *args)
+{
+ const HashString *hash = GetCpp<HashString*>(self);
+ char *filename;
+ if (PyArg_ParseTuple(args, "s:verify_file", &filename) == 0)
+ return 0;
+ return PyBool_FromLong(hash->VerifyFile(filename));
+}
+
+static PyMethodDef hashstring_methods[] = {
+ {"verify_file",hashstring_verify_file,METH_VARARGS,
+ hashstring_verify_file_doc},
+ {NULL}
+};
+
+static PyGetSetDef hashstring_getset[] = {
+ {"hashtype",(getter)hashstring_get_hashtype,0,
+ "The type of the hash, as a string (possible: MD5Sum,SHA1,SHA256)."},
+ {"hashvalue",(getter)hashstring_get_hashvalue,0,
+ "The value of the hash, as a hexadecimal string\n"
+ "\n"
+ ".. versionadded:: 1.9.0"},
+ {"usable",(getter)hashstring_get_usable,0,
+ "True if the hashstring is a trusted hash type."},
+ {NULL}
+};
+
+static PyObject *hashstring_richcompare(PyObject *obj1, PyObject *obj2, int op)
+{
+ if (!PyObject_TypeCheck(obj1, &PyHashString_Type))
+ return PyErr_SetString(PyExc_TypeError, "Expected HashString"), nullptr;
+ if (!PyObject_TypeCheck(obj2, &PyHashString_Type))
+ return PyErr_SetString(PyExc_TypeError, "Expected HashString"), nullptr;
+
+ const HashString *a = GetCpp<HashString*>(obj1);
+ const HashString *b = GetCpp<HashString*>(obj2);
+ PyObject *result = Py_False;
+
+ switch (op) {
+ case Py_LT:
+ case Py_GT:
+ result = Py_False;
+ break;
+ case Py_LE:
+ case Py_GE:
+ case Py_EQ:
+ result = *a == *b ? Py_True : Py_False;
+ break;
+ case Py_NE:
+ result = *a != *b ? Py_True : Py_False;
+ break;
+ }
+
+ Py_INCREF(result);
+ return result;
+ }
+
+static char *hashstring_doc =
+ "HashString(type, hash) OR HashString('type:hash')\n\n"
+ "Create a new HashString object. The first form allows you to specify\n"
+ "a type and a hash, and the second form a single string where type and\n"
+ "hash are separated by a colon, e.g.::\n\n"
+ " HashString('MD5Sum', '6cc1b6e6655e3555ac47e5b5fe26d04e')\n\n"
+ "Valid options for 'type' are: MD5Sum, SHA1, SHA256.";
+PyTypeObject PyHashString_Type = {
+ PyVarObject_HEAD_INIT(&PyType_Type, 0)
+ "apt_pkg.HashString", // tp_name
+ sizeof(CppPyObject<HashString*>), // tp_basicsize
+ 0, // tp_itemsize
+ // Methods
+ CppDeallocPtr<HashString*>, // tp_dealloc
+ 0, // tp_print
+ 0, // tp_getattr
+ 0, // tp_setattr
+ 0, // tp_compare
+ hashstring_repr, // tp_repr
+ 0, // tp_as_number
+ 0, // tp_as_sequence
+ 0, // tp_as_mapping
+ 0, // tp_hash
+ 0, // tp_call
+ hashstring_str, // tp_str
+ 0, // tp_getattro
+ 0, // tp_setattro
+ 0, // tp_as_buffer
+ Py_TPFLAGS_DEFAULT | // tp_flags
+ Py_TPFLAGS_BASETYPE,
+ hashstring_doc, // tp_doc
+ 0, // tp_traverse
+ 0, // tp_clear
+ hashstring_richcompare, // tp_richcompare
+ 0, // tp_weaklistoffset
+ 0, // tp_iter
+ 0, // tp_iternext
+ hashstring_methods, // tp_methods
+ 0, // tp_members
+ hashstring_getset, // tp_getset
+ 0, // tp_base
+ 0, // tp_dict
+ 0, // tp_descr_get
+ 0, // tp_descr_set
+ 0, // tp_dictoffset
+ 0, // tp_init
+ 0, // tp_alloc
+ hashstring_new, // tp_new
+};