diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst index 59af4f00eee..a28c1d43b45 100644 --- a/doc/sphinx-guides/source/api/native-api.rst +++ b/doc/sphinx-guides/source/api/native-api.rst @@ -125,12 +125,12 @@ List versions of the dataset:: Show a version of the dataset. The Dataset also include any metadata blocks the data might have:: GET http://$SERVER/api/datasets/$id/versions/$versionNumber?key=$apiKey - - + + Export the metadata of the current published version of a dataset in various formats see Note below:: GET http://$SERVER/api/datasets/export?exporter=ddi&persistentId=$persistentId - + Note: Supported exporters (export formats) are ddi, oai_ddi, dcterms, oai_dc, and dataverse_json. @@ -163,9 +163,9 @@ To revert to the default logic, use ``:publicationDate`` as the ``$datasetFieldT Note that the dataset field used has to be a date field:: PUT http://$SERVER/api/datasets/$id/citationdate?key=$apiKey - + Restores the default logic of the field type to be used as the citation date. Same as ``PUT`` with ``:publicationDate`` body:: - + DELETE http://$SERVER/api/datasets/$id/citationdate?key=$apiKey List all the role assignments at the given dataset:: @@ -368,18 +368,29 @@ Toggles superuser mode on the ``AuthenticatedUser`` whose ``identifier`` (withou POST http://$SERVER/api/admin/superuser/$identifier +List all role assignments of a role assignee (i.e. a user or a group):: + + GET http://$SERVER/api/admin/assignments/assignees/$identifier + +Note that ``identifier`` can contain slashes (e.g. ``&ip/localhost-users``). + IpGroups ^^^^^^^^ -List all the ip groups:: +Lists all the ip groups:: GET http://$SERVER/api/admin/groups/ip -Adds a new ip group. POST data should specify the group in JSON format. Examples are available at ``data/ipGroup1.json``. :: +Adds a new ip group. POST data should specify the group in JSON format. Examples are available at the ``data`` folder. Using this method, an IP Group is always created, but its ``alias`` might be different than the one appearing in the +JSON file, to ensure it is unique. :: POST http://$SERVER/api/admin/groups/ip -Returns a the group in a JSON format. ``groupIdtf`` can either be the group id in the database (in case it is numeric), or the group alias. :: +Creates or updates the ip group ``$groupAlias``. :: + + POST http://$SERVER/api/admin/groups/ip/$groupAlias + +Returns a the group in a JSON format. ``$groupIdtf`` can either be the group id in the database (in case it is numeric), or the group alias. :: GET http://$SERVER/api/admin/groups/ip/$groupIdtf diff --git a/scripts/api/data/ipGroup-all-ipv4.json b/scripts/api/data/ipGroup-all-ipv4.json new file mode 100644 index 00000000000..c5ff32def44 --- /dev/null +++ b/scripts/api/data/ipGroup-all-ipv4.json @@ -0,0 +1,5 @@ +{ + "alias":"all-ipv4", + "name":"IP group to match all IPv4 addresses", + "ranges" : [["0.0.0.0", "255.255.255.255"]] +} diff --git a/scripts/api/data/ipGroup3.json b/scripts/api/data/ipGroup-all.json similarity index 100% rename from scripts/api/data/ipGroup3.json rename to scripts/api/data/ipGroup-all.json diff --git a/scripts/api/data/ipGroup-localhost.json b/scripts/api/data/ipGroup-localhost.json index 4a5f7facfef..4f8d2f708b2 100644 --- a/scripts/api/data/ipGroup-localhost.json +++ b/scripts/api/data/ipGroup-localhost.json @@ -1,6 +1,5 @@ { "alias":"localhost", "name":"Localhost connections", - "ranges" : [["127.0.0.1", "127.0.0.1"], - ["::1", "::1"]] + "addresses": [ "::1", "127.0.0.1" ] } diff --git a/scripts/api/data/ipGroup-single-IPv4.json b/scripts/api/data/ipGroup-single-IPv4.json new file mode 100644 index 00000000000..515c512bcd1 --- /dev/null +++ b/scripts/api/data/ipGroup-single-IPv4.json @@ -0,0 +1,5 @@ +{ + "alias":"singleIPv4", + "name":"Single IPv4", + "addresses" : ["128.0.0.7"] +} diff --git a/scripts/api/data/ipGroup-single-IPv6.json b/scripts/api/data/ipGroup-single-IPv6.json new file mode 100644 index 00000000000..73eaa8e60a1 --- /dev/null +++ b/scripts/api/data/ipGroup-single-IPv6.json @@ -0,0 +1,5 @@ +{ + "alias":"singleIPv6", + "name":"Single IPv6", + "addresses" : ["aa:bb:cc:dd:ee:ff::1"] +} diff --git a/scripts/api/data/ipGroupDuplicate-v1.json b/scripts/api/data/ipGroupDuplicate-v1.json new file mode 100644 index 00000000000..eda0c8eb49b --- /dev/null +++ b/scripts/api/data/ipGroupDuplicate-v1.json @@ -0,0 +1,7 @@ +{ + "alias":"ipGroup-dup", + "name":"IP Group with duplicate files (1)", + "description":"This is the FIRST version of the group", + "ranges" : [["60.0.0.0", "60.0.0.255"], + ["60::1", "60::ffff"]] +} diff --git a/scripts/api/data/ipGroupDuplicate-v2.json b/scripts/api/data/ipGroupDuplicate-v2.json new file mode 100644 index 00000000000..8db88e97fe7 --- /dev/null +++ b/scripts/api/data/ipGroupDuplicate-v2.json @@ -0,0 +1,7 @@ +{ + "alias":"ipGroup-dup", + "name":"IP Group with duplicate files-v2", + "description":"This is the second version of the group", + "ranges" : [["70.0.0.0", "70.0.0.255"], + ["70::1", "70::ffff"]] +} diff --git a/scripts/issues/1380/01-add.localhost.sh b/scripts/issues/1380/01-add.localhost.sh new file mode 100755 index 00000000000..331011d5fa2 --- /dev/null +++ b/scripts/issues/1380/01-add.localhost.sh @@ -0,0 +1,2 @@ +# Add the localhost group to the system. +curl -X POST -H"Content-Type:application/json" -d@../../api/data/ipGroup-localhost.json localhost:8080/api/admin/groups/ip diff --git a/scripts/issues/1380/02-build-dv-structure.sh b/scripts/issues/1380/02-build-dv-structure.sh new file mode 100755 index 00000000000..f0936e3cf69 --- /dev/null +++ b/scripts/issues/1380/02-build-dv-structure.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +echo Run this after running setup-users.sh, and making Pete an +echo admin on the root dataverse. + + +PETE=$(grep :result: users.out | grep Pete | cut -f4 -d: | tr -d \ ) +UMA=$(grep :result: users.out | grep Uma | cut -f4 -d: | tr -d \ ) + +pushd ../../api +./setup-dvs.sh $PETE $UMA +popd diff --git a/scripts/issues/1380/add-ip-group.sh b/scripts/issues/1380/add-ip-group.sh new file mode 100755 index 00000000000..2fba944807c --- /dev/null +++ b/scripts/issues/1380/add-ip-group.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +# Add the passed group to the system. +curl -X POST -H"Content-Type:application/json" -d@../../api/data/$1 localhost:8080/api/admin/groups/ip diff --git a/scripts/issues/1380/add-user b/scripts/issues/1380/add-user new file mode 100755 index 00000000000..1781181bb79 --- /dev/null +++ b/scripts/issues/1380/add-user @@ -0,0 +1,3 @@ +#!/bin/bash +# add-user dv group user api-token +curl -H "Content-type:application/json" -X POST -d"[$3]" localhost:8080/api/dataverses/$1/groups/$2/roleAssignees?key=$4 diff --git a/scripts/issues/1380/data/3-eg1.json b/scripts/issues/1380/data/3-eg1.json new file mode 100644 index 00000000000..a874d69a2e8 --- /dev/null +++ b/scripts/issues/1380/data/3-eg1.json @@ -0,0 +1 @@ +["&explicit/3-eg1"] diff --git a/scripts/issues/1380/data/guest.json b/scripts/issues/1380/data/guest.json new file mode 100644 index 00000000000..3e4188a7167 --- /dev/null +++ b/scripts/issues/1380/data/guest.json @@ -0,0 +1 @@ +[":guest"] diff --git a/scripts/issues/1380/data/locals.json b/scripts/issues/1380/data/locals.json new file mode 100644 index 00000000000..8bb5e3e4162 --- /dev/null +++ b/scripts/issues/1380/data/locals.json @@ -0,0 +1 @@ +["&ip/localhost"] diff --git a/scripts/issues/1380/data/pete.json b/scripts/issues/1380/data/pete.json new file mode 100644 index 00000000000..298e813d2bc --- /dev/null +++ b/scripts/issues/1380/data/pete.json @@ -0,0 +1 @@ +["@pete"] diff --git a/scripts/issues/1380/data/uma.json b/scripts/issues/1380/data/uma.json new file mode 100644 index 00000000000..3caf8c5c9cc --- /dev/null +++ b/scripts/issues/1380/data/uma.json @@ -0,0 +1 @@ +["@uma"] diff --git a/scripts/issues/1380/db-list-dvs b/scripts/issues/1380/db-list-dvs new file mode 100755 index 00000000000..4161f7fdd03 --- /dev/null +++ b/scripts/issues/1380/db-list-dvs @@ -0,0 +1 @@ +psql dvndb -c "select dvobject.id, name, alias, owner_id from dvobject inner join dataverse on dvobject.id = dataverse.id" diff --git a/scripts/issues/1380/delete-ip-group b/scripts/issues/1380/delete-ip-group new file mode 100755 index 00000000000..b6138d95024 --- /dev/null +++ b/scripts/issues/1380/delete-ip-group @@ -0,0 +1,9 @@ +#/bin/bahx +if [ $# -eq 0 ] + then + echo "Please provide IP group id" + echo "e.g $0 845" + exit 1 +fi + +curl -X DELETE http://localhost:8080/api/admin/groups/ip/$1 diff --git a/scripts/issues/1380/dvs.gv b/scripts/issues/1380/dvs.gv new file mode 100644 index 00000000000..526066000a2 --- /dev/null +++ b/scripts/issues/1380/dvs.gv @@ -0,0 +1,19 @@ +digraph { +d1[label="Root"] +d2[label="Top dataverse of Pete"] +d3[label="Pete's public place"] +d4[label="Pete's restricted data"] +d5[label="Pete's secrets"] +d6[label="Top dataverse of Uma"] +d7[label="Uma's first"] +d8[label="Uma's restricted"] + +d1 -> d2 +d2 -> d3 +d2 -> d4 +d2 -> d5 +d1 -> d6 +d6 -> d7 +d6 -> d8 + +} diff --git a/scripts/issues/1380/dvs.pdf b/scripts/issues/1380/dvs.pdf new file mode 100644 index 00000000000..5169f449420 Binary files /dev/null and b/scripts/issues/1380/dvs.pdf differ diff --git a/scripts/issues/1380/explicitGroup1.json b/scripts/issues/1380/explicitGroup1.json new file mode 100644 index 00000000000..337a0b62dcb --- /dev/null +++ b/scripts/issues/1380/explicitGroup1.json @@ -0,0 +1,5 @@ +{ + "description":"Sample Explicit Group", + "displayName":"Close Collaborators", + "aliasInOwner":"eg1" +} diff --git a/scripts/issues/1380/explicitGroup2.json b/scripts/issues/1380/explicitGroup2.json new file mode 100644 index 00000000000..fbac263665c --- /dev/null +++ b/scripts/issues/1380/explicitGroup2.json @@ -0,0 +1,5 @@ +{ + "description":"Sample Explicit Group", + "displayName":"Not-So-Close Collaborators", + "aliasInOwner":"eg2" +} diff --git a/scripts/issues/1380/keys.txt b/scripts/issues/1380/keys.txt new file mode 100644 index 00000000000..9dc47d356c1 --- /dev/null +++ b/scripts/issues/1380/keys.txt @@ -0,0 +1,3 @@ +Keys for P e t e and U m a. Produced by running setup-all.sh from the /scripts/api folder. +Pete:757a6493-456a-4bf0-943e-9b559d551a3f +Uma:8797f19b-b8aa-4f96-a789-1b99506f2eab diff --git a/scripts/issues/1380/list-groups-for b/scripts/issues/1380/list-groups-for new file mode 100755 index 00000000000..063b92c9b6a --- /dev/null +++ b/scripts/issues/1380/list-groups-for @@ -0,0 +1,2 @@ +#!/bin/bash +curl -s -X GET http://localhost:8080/api/test/explicitGroups/$1 | jq . diff --git a/scripts/issues/1380/list-ip-groups.sh b/scripts/issues/1380/list-ip-groups.sh new file mode 100755 index 00000000000..fba29cced4e --- /dev/null +++ b/scripts/issues/1380/list-ip-groups.sh @@ -0,0 +1,2 @@ +#!/bin/bash +curl -X GET http://localhost:8080/api/admin/groups/ip | jq . diff --git a/scripts/issues/1380/truth-table.numbers b/scripts/issues/1380/truth-table.numbers new file mode 100644 index 00000000000..86f67386fbb Binary files /dev/null and b/scripts/issues/1380/truth-table.numbers differ diff --git a/scripts/issues/1380/users.out b/scripts/issues/1380/users.out new file mode 100644 index 00000000000..337b9e2ce01 --- /dev/null +++ b/scripts/issues/1380/users.out @@ -0,0 +1,6 @@ +{"status":"OK","data":{"user":{"id":4,"firstName":"Gabbi","lastName":"Guest","userName":"gabbi","affiliation":"low","position":"A Guest","email":"gabbi@malinator.com"},"authenticatedUser":{"id":4,"identifier":"@gabbi","displayName":"Gabbi Guest","firstName":"Gabbi","lastName":"Guest","email":"gabbi@malinator.com","superuser":false,"affiliation":"low","position":"A Guest","persistentUserId":"gabbi","authenticationProviderId":"builtin"},"apiToken":"d1940786-c315-491e-9812-a8ff809289cc"}} +{"status":"OK","data":{"user":{"id":5,"firstName":"Cathy","lastName":"Collaborator","userName":"cathy","affiliation":"mid","position":"Data Scientist","email":"cathy@malinator.com"},"authenticatedUser":{"id":5,"identifier":"@cathy","displayName":"Cathy Collaborator","firstName":"Cathy","lastName":"Collaborator","email":"cathy@malinator.com","superuser":false,"affiliation":"mid","position":"Data Scientist","persistentUserId":"cathy","authenticationProviderId":"builtin"},"apiToken":"0ddfcb1e-fb51-4ce7-88ab-308b23e13e9a"}} +{"status":"OK","data":{"user":{"id":6,"firstName":"Nick","lastName":"NSA","userName":"nick","affiliation":"gov","position":"Signals Intelligence","email":"nick@malinator.com"},"authenticatedUser":{"id":6,"identifier":"@nick","displayName":"Nick NSA","firstName":"Nick","lastName":"NSA","email":"nick@malinator.com","superuser":false,"affiliation":"gov","position":"Signals Intelligence","persistentUserId":"nick","authenticationProviderId":"builtin"},"apiToken":"6d74745d-1733-459a-ae29-422110056ec0"}} +reporting API keys +:result: Pete's key is: 757a6493-456a-4bf0-943e-9b559d551a3f +:result: Uma's key is: 8797f19b-b8aa-4f96-a789-1b99506f2eab \ No newline at end of file diff --git a/scripts/search/tests/ipgroup-add b/scripts/search/tests/ipgroup-add index 8033b277258..d41679fd188 100755 --- a/scripts/search/tests/ipgroup-add +++ b/scripts/search/tests/ipgroup-add @@ -1,5 +1,5 @@ #!/bin/sh . scripts/search/export-keys -OUTPUT=`curl -s -X POST -d @scripts/api/data/ipGroup3.json http://localhost:8080/api/admin/groups/ip -H "Content-type:application/json"` +OUTPUT=`curl -s -X POST -d @scripts/api/data/ipGroup-all.json http://localhost:8080/api/admin/groups/ip -H "Content-type:application/json"` echo $OUTPUT echo $OUTPUT | jq . diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFile.java b/src/main/java/edu/harvard/iq/dataverse/DataFile.java index 7faa8b485d5..057faf4211e 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DataFile.java +++ b/src/main/java/edu/harvard/iq/dataverse/DataFile.java @@ -229,6 +229,11 @@ public String getOriginalFileFormat() { return null; } + @Override + public boolean isAncestorOf( DvObject other ) { + return equals(other); + } + /* * A user-friendly version of the "original format": */ diff --git a/src/main/java/edu/harvard/iq/dataverse/Dataset.java b/src/main/java/edu/harvard/iq/dataverse/Dataset.java index 0acf76dc00e..39a953d0de7 100644 --- a/src/main/java/edu/harvard/iq/dataverse/Dataset.java +++ b/src/main/java/edu/harvard/iq/dataverse/Dataset.java @@ -654,5 +654,9 @@ public String getDisplayName() { protected boolean isPermissionRoot() { return false; } - + + @Override + public boolean isAncestorOf( DvObject other ) { + return equals(other) || equals(other.getOwner()); + } } diff --git a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java index 882608dff45..55811ac8b1a 100644 --- a/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java +++ b/src/main/java/edu/harvard/iq/dataverse/DatasetPage.java @@ -83,7 +83,6 @@ import javax.faces.event.AjaxBehaviorEvent; -import javax.faces.context.ExternalContext; import org.apache.commons.lang.StringEscapeUtils; import org.primefaces.component.tabview.TabView; @@ -187,7 +186,6 @@ public enum DisplayMode { private List