diff --git a/dataverse/connection.py b/dataverse/connection.py index 0fbbe4e..9879b7f 100644 --- a/dataverse/connection.py +++ b/dataverse/connection.py @@ -10,10 +10,10 @@ class Connection(object): - def __init__(self, host, token, use_https=True): + def __init__(self, host, token, use_https=True,verify=True): self.token = token self.host = host - + self.verify =verify if use_https: url_scheme = 'https://' else: @@ -23,9 +23,14 @@ def __init__(self, host, token, use_https=True): self.sword_base_url = '{0}/dvn/api/data-deposit/v1.1/swordv2'.format(self.base_url) self.sd_uri = '{0}/service-document'.format(self.sword_base_url) self._service_document = None - - self.get_service_document() - + self.fileAccess_base_url = '{0}/api/access/datafile'.format(self.base_url) + + try: + self.get_service_document() + self.authorized=True + except exceptions.UnauthorizedError: + self.authorized=False + @property def auth(self): return self.token, None @@ -34,13 +39,13 @@ def get_service_document(self, refresh=False): if not refresh and self._service_document is not None: return self._service_document - resp = requests.get(self.sd_uri, auth=self.auth) + resp = requests.get(self.sd_uri, auth=self.auth, verify=self.verify) if resp.status_code == 403: raise exceptions.UnauthorizedError('The credentials provided are invalid.') elif resp.status_code != 200: raise exceptions.ConnectionError('Could not connect to the Dataverse') - + self._service_document = etree.XML(resp.content) return self._service_document diff --git a/dataverse/dataset.py b/dataverse/dataset.py index 4f785ec..f82742e 100644 --- a/dataverse/dataset.py +++ b/dataverse/dataset.py @@ -97,12 +97,17 @@ def id(self): if not self.dataverse: raise NoContainerError('This dataset has not been added to a Dataverse.') + for dataset in self.dataverse.get_contents(refresh=True): - doi = '{0}:{1}/{2}'.format( - dataset['protocol'], - dataset['authority'], - dataset['identifier'], - ) + print(dataset) + try: + doi = '{0}:{1}/{2}'.format( + dataset['protocol'], + dataset['authority'], + dataset['identifier'], + ) + except: + continue if doi == self.doi: self._id = dataset['id'] return self._id @@ -125,7 +130,7 @@ def get_entry(self, refresh=False): if not refresh and self._entry is not None: return etree.tostring(self._entry) - resp = requests.get(self.edit_uri, auth=self.connection.auth) + resp = requests.get(self.edit_uri, auth=self.connection.auth,verify=self.connection.verify) if resp.status_code != 200: raise ConnectionError('Atom entry could not be retrieved.') @@ -159,7 +164,7 @@ def get_statement(self, refresh=False): ) self.statement_uri = link.get('href') - resp = requests.get(self.statement_uri, auth=self.connection.auth) + resp = requests.get(self.statement_uri, auth=self.connection.auth, verify=self.connection.verify) if resp.status_code != 200: raise ConnectionError('Statement could not be retrieved.') @@ -185,13 +190,19 @@ def get_metadata(self, version='latest', refresh=False): if not self.dataverse: raise NoContainerError('This dataset has not been added to a Dataverse.') - url = '{0}/datasets/{1}/versions/:{2}'.format( + try: + version = str(int(version)) #test if string + except: + if not version.startswith(":"): + version=":"+version + + url = '{0}/datasets/{1}/versions/{2}'.format( self.connection.native_base_url, self.id, version, ) - resp = requests.get(url, params={'key': self.connection.token}) + resp = requests.get(url, params={'key': self.connection.token},verify=self.connection.verify) if resp.status_code == 404: raise VersionJsonNotFoundError( @@ -251,7 +262,7 @@ def publish(self): resp = requests.post( self.edit_uri, headers={'In-Progress': 'false', 'Content-Length': 0}, - auth=self.connection.auth, + auth=self.connection.auth,verify=self.connection.verify ) if resp.status_code != 200: @@ -311,10 +322,10 @@ def upload_file(self, filename, content, zip_files=True): } requests.post( - self.edit_media_uri, + self.edit_media_uri.replace("https","http"), data=content, headers=headers, - auth=self.connection.auth, + auth=self.connection.auth,verify=self.connection.verify ) self.get_metadata(refresh=True) @@ -323,7 +334,7 @@ def upload_file(self, filename, content, zip_files=True): def delete_file(self, dataverse_file): resp = requests.delete( dataverse_file.edit_media_uri, - auth=self.connection.auth, + auth=self.connection.auth,verify=self.connection.verify ) if resp.status_code != 204: diff --git a/dataverse/dataverse.py b/dataverse/dataverse.py index bf7831f..ded4433 100644 --- a/dataverse/dataverse.py +++ b/dataverse/dataverse.py @@ -23,7 +23,7 @@ def is_published(self): # Always check latest version collection_info = requests.get( self.collection.get('href'), - auth=self.connection.auth, + auth=self.connection.auth,verify=self.connection.verify ).content status_tag = get_element( @@ -56,7 +56,7 @@ def get_contents(self, refresh=False): ) resp = requests.get( content_uri, - params={'key': self.connection.token} + params={'key': self.connection.token},verify=self.connection.verify ) if resp.status_code != 200: @@ -69,10 +69,11 @@ def get_collection_info(self, refresh=False, timeout=None): if not refresh and self._collection_info: return self._collection_info + #print(self.collection.get('href')) self._collection_info = requests.get( - self.collection.get('href'), + self.collection.get('href').replace("https","http"), auth=self.connection.auth, - timeout=timeout, + timeout=timeout,verify=self.connection.verify ).content return self._collection_info @@ -83,7 +84,7 @@ def publish(self): resp = requests.post( edit_uri, headers={'In-Progress': 'false'}, - auth=self.connection.auth, + auth=self.connection.auth,verify=self.connection.verify ) if resp.status_code != 200: @@ -106,7 +107,7 @@ def _add_dataset(self, dataset): self.collection.get('href'), data=dataset.get_entry(), headers={'Content-type': 'application/atom+xml'}, - auth=self.connection.auth, + auth=self.connection.auth,verify=self.connection.verify ) if resp.status_code != 201: @@ -122,7 +123,7 @@ def delete_dataset(self, dataset): resp = requests.delete( dataset.edit_uri, - auth=self.connection.auth, + auth=self.connection.auth,verify=self.connection.verify ) if resp.status_code == 405: raise MethodNotAllowedError( diff --git a/dataverse/file.py b/dataverse/file.py index 457a489..a036a59 100644 --- a/dataverse/file.py +++ b/dataverse/file.py @@ -19,10 +19,6 @@ def __init__(self, dataset, name, file_id=None): @classmethod def from_json(cls, dataset, json): - try: - name = json['dataFile']['filename'] - file_id = json['dataFile']['id'] - except KeyError: - name = json['datafile']['name'] - file_id = json['datafile']['id'] + name = json['dataFile']['filename'] + file_id = json['dataFile']['id'] return cls(dataset, name, file_id) diff --git a/readme.md b/readme.md index 6fa1898..1e9d62a 100644 --- a/readme.md +++ b/readme.md @@ -1,3 +1,13 @@ +## insecure SSL added +This fork adds an parameter verify to Connection + +cnt = Connection(host,key,use_https=True,verify=False) + +which disables checking of certificates by using https. + +---- + + ## Dataverse API Client This is a library for writing Python applications that make use of Dataverse