diff --git a/doc/sphinx-guides/source/_static/installation/files/etc/shibboleth/shibboleth2.xml b/doc/sphinx-guides/source/_static/installation/files/etc/shibboleth/shibboleth2.xml
index dc79aebde38..8aa95b1c10c 100644
--- a/doc/sphinx-guides/source/_static/installation/files/etc/shibboleth/shibboleth2.xml
+++ b/doc/sphinx-guides/source/_static/installation/files/etc/shibboleth/shibboleth2.xml
@@ -41,6 +41,7 @@ https://wiki.shibboleth.net/confluence/display/SHIB2/NativeSPConfiguration
+
diff --git a/doc/sphinx-guides/source/admin/index.rst b/doc/sphinx-guides/source/admin/index.rst
index e632192aed8..35296d86a62 100755
--- a/doc/sphinx-guides/source/admin/index.rst
+++ b/doc/sphinx-guides/source/admin/index.rst
@@ -19,4 +19,8 @@ These "superuser" tasks are managed via the new page called the Dashboard. A use
metadataexport
timers
geoconnect-worldmap
+ user-administration
+ solr-search-index
+ monitoring
+ maintenance
troubleshooting
diff --git a/doc/sphinx-guides/source/admin/maintenance.rst b/doc/sphinx-guides/source/admin/maintenance.rst
new file mode 100644
index 00000000000..09eadb097c4
--- /dev/null
+++ b/doc/sphinx-guides/source/admin/maintenance.rst
@@ -0,0 +1,9 @@
+Maintenance
+===========
+
+.. contents:: Contents:
+ :local:
+
+When you have scheduled down time for your production servers, we provide a :download:`sample maintenance page <../_static/installation/files/etc/maintenance/maintenance.xhtml>` for you to use. To download, right-click and select "Save Link As".
+
+The maintenance page is intended to be a static page served by Apache to provide users with a nicer, more informative experience when the site is unavailable.
\ No newline at end of file
diff --git a/doc/sphinx-guides/source/admin/monitoring.rst b/doc/sphinx-guides/source/admin/monitoring.rst
new file mode 100644
index 00000000000..5e2eb95abca
--- /dev/null
+++ b/doc/sphinx-guides/source/admin/monitoring.rst
@@ -0,0 +1,11 @@
+Monitoring
+===========
+
+.. contents:: Contents:
+ :local:
+
+In production you'll want to monitor the usual suspects such as CPU, memory, free disk space, etc.
+
+https://github.com/IQSS/dataverse/issues/2595 contains some information on enabling monitoring of Glassfish, which is disabled by default.
+
+There is a database table called ``actionlogrecord`` that captures events that may be of interest. See https://github.com/IQSS/dataverse/issues/2729 for more discussion around this table.
diff --git a/doc/sphinx-guides/source/admin/solr-search-index.rst b/doc/sphinx-guides/source/admin/solr-search-index.rst
new file mode 100644
index 00000000000..a599d9c4daa
--- /dev/null
+++ b/doc/sphinx-guides/source/admin/solr-search-index.rst
@@ -0,0 +1,47 @@
+Solr Search Index
+=================
+
+Dataverse requires Solr to be operational at all times. If you stop Solr, you should see a error about this on the home page, which is powered by the search index Solr provides. You can set up Solr by following the steps in our Installation Guide's :doc:`/installation/prerequisites` and :doc:`/installation/config` sections explaining how to configure it. This section you're reading now is about the care and feeding of the search index. PostgreSQL is the "source of truth" and the Dataverse application will copy data from PostgreSQL into Solr. For this reason, the search index can be rebuilt at any time. Depending on the amount of data you have, this can be a slow process. You are encouraged to experiment with production data to get a sense of how long a full reindexing will take.
+
+.. contents:: Contents:
+ :local:
+
+Full Reindex
+-------------
+
+There are two ways to perform a full reindex of the Dataverse search index. Starting with a "clear" ensures a completely clean index but involves downtime. Reindexing in place doesn't involve downtime but does not ensure a completely clean index.
+
+Clear and Reindex
++++++++++++++++++
+
+Clearing Data from Solr
+~~~~~~~~~~~~~~~~~~~~~~~
+
+Please note that the moment you issue this command, it will appear to end users looking at the home page that all data is gone! This is because the home page is powered by the search index.
+
+``curl http://localhost:8080/api/admin/index/clear``
+
+Start Async Reindex
+~~~~~~~~~~~~~~~~~~~
+
+Please note that this operation may take hours depending on the amount of data in your system. This known issue is being tracked at https://github.com/IQSS/dataverse/issues/50
+
+``curl http://localhost:8080/api/admin/index``
+
+Reindex in Place
++++++++++++++++++
+
+An alternative to completely clearing the search index is to reindex in place.
+
+Clear Index Timestamps
+~~~~~~~~~~~~~~~~~~~~~~
+
+``curl -X DELETE http://localhost:8080/api/admin/index/timestamps``
+
+Start or Continue Async Reindex
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If indexing stops, this command should pick up where it left off based on which index timestamps have been set, which is why we start by clearing these timestamps above. These timestamps are stored in the ``dvobject`` database table.
+
+``curl http://localhost:8080/api/admin/index/continue``
+
diff --git a/doc/sphinx-guides/source/admin/troubleshooting.rst b/doc/sphinx-guides/source/admin/troubleshooting.rst
index fe9e8b7c659..fb7ed8a8326 100644
--- a/doc/sphinx-guides/source/admin/troubleshooting.rst
+++ b/doc/sphinx-guides/source/admin/troubleshooting.rst
@@ -5,9 +5,19 @@ Troubleshooting
This new (as of v.4.6) section of the Admin guide is for tips on how to diagnose and fix system problems.
-.. contents:: |toctitle|
+.. contents:: Contents:
:local:
+Glassfish
+---------
+
+``server.log`` is the main place to look when you encounter problems. Hopefully an error message has been logged. If there's a stack trace, it may be of interest to developers, especially they can trace line numbers back to a tagged version.
+
+For debugging purposes, you may find it helpful to increase logging levels as mentioned in the :doc:`/developers/debugging` section of the Developer Guide.
+
+Our guides focus on using the command line to manage Glassfish but you might be interested in an admin GUI at http://localhost:4848
+
+
Deployment fails, "EJB Timer Service not available"
---------------------------------------------------
diff --git a/doc/sphinx-guides/source/admin/user-administration.rst b/doc/sphinx-guides/source/admin/user-administration.rst
new file mode 100644
index 00000000000..370947547d3
--- /dev/null
+++ b/doc/sphinx-guides/source/admin/user-administration.rst
@@ -0,0 +1,39 @@
+User Administration
+===================
+
+This section focuses on user administration tools and tasks.
+
+.. contents:: Contents:
+ :local:
+
+Manage Users Table
+------------------
+
+The Manage Users table gives the network administrator a list of all user accounts in table form. It lists username, full name, email address, and whether or not the user has Superuser status.
+
+Usernames are listed alphabetically and clicking on a username takes you to the account page that contains detailed information on that account.
+
+You can access the Manage Users table by clicking the "Manage Users" button on the Dashboard, which is linked from the header of all Dataverse pages (if you're loggied in as an administrator).
+
+Confirm Email
+-------------
+
+Dataverse encourages builtin/local users to verify their email address upon signup or email change so that sysadmins can be assured that users can be contacted.
+
+The app will send a standard welcome email with a URL the user can click, which, when activated, will store a ``lastconfirmed`` timestamp in the ``authenticateduser`` table of the database. Any time this is "null" for a user (immediately after signup and/or changing of their Dataverse email address), their current email on file is considered to not be verified. The link that is sent expires after a time (the default is 24 hours), but this is configurable by a superuser via the ``:MinutesUntilConfirmEmailTokenExpires`` config option.
+
+Should users' URL token expire, they will see a "Verify Email" button on the account information page to send another URL.
+
+Sysadmins can determine which users have verified their email addresses by looking for the presence of the value ``emailLastConfirmed`` in the JSON output from listing users (see the "Admin" section of the :doc:`/api/native-api`). As mentioned in the :doc:`/user/account` section of the User Guide, the email addresses for Shibboleth users are re-confirmed on every login.
+
+Deleting an API Token
+---------------------
+
+If an API token is compromised it should be deleted. Users can generate a new one for themselves as explained in the :doc:`/user/account` section of the User Guide, but you may want to preemptively delete tokens from the database.
+
+Using the API token 7ae33670-be21-491d-a244-008149856437 as an example:
+
+``delete from apitoken where tokenstring = '7ae33670-be21-491d-a244-008149856437';``
+
+You should expect the output ``DELETE 1`` after issuing the command above.
+
diff --git a/doc/sphinx-guides/source/api/intro.rst b/doc/sphinx-guides/source/api/intro.rst
index d2f6c4e2487..a9543dff0a5 100755
--- a/doc/sphinx-guides/source/api/intro.rst
+++ b/doc/sphinx-guides/source/api/intro.rst
@@ -21,7 +21,7 @@ We use the term "native" to mean that the API is not based on any standard. For
Authentication
--------------
-Most Dataverse APIs require the use of an API token. Instructions for getting a token are described in the :doc:`/user/account` section of the User Guide.
+Most Dataverse APIs require the use of an API token. (In code we sometimes call it a "key" because it's shorter.) Instructions for getting a token are described in the :doc:`/user/account` section of the User Guide.
There are two ways to pass your API token to Dataverse APIs. The preferred method is to send the token in the ``X-Dataverse-key`` HTTP header, as in the following curl example::
diff --git a/doc/sphinx-guides/source/api/native-api.rst b/doc/sphinx-guides/source/api/native-api.rst
index adaff1ff237..846eb01683c 100644
--- a/doc/sphinx-guides/source/api/native-api.rst
+++ b/doc/sphinx-guides/source/api/native-api.rst
@@ -559,9 +559,110 @@ Creates a global role in the Dataverse installation. The data POSTed are assumed
POST http://$SERVER/api/admin/roles
-List all users::
+List users with the options to search and "page" through results. Only accessible to superusers. Optional parameters:
+
+* ``searchTerm`` A string that matches the beginning of a user identifier, first name, last name or email address.
+* ``itemsPerPage`` The number of detailed results to return. The default is 25. This number has no limit. e.g. You could set it to 1000 to return 1,000 results
+* ``selectedPage`` The page of results to return. The default is 1.
+
+ GET http://$SERVER/api/admin/list-users
+
+
+Sample output appears below.
+
+* When multiple pages of results exist, the ``selectedPage`` parameters may be specified.
+* Note, the resulting ``pagination`` section includes ``pageCount``, ``previousPageNumber``, ``nextPageNumber``, and other variables that may be used to re-create the UI.
+
+.. code-block:: json
+
+ {
+ "status":"OK",
+ "data":{
+ "userCount":27,
+ "selectedPage":1,
+ "pagination":{
+ "isNecessary":true,
+ "numResults":27,
+ "numResultsString":"27",
+ "docsPerPage":25,
+ "selectedPageNumber":1,
+ "pageCount":2,
+ "hasPreviousPageNumber":false,
+ "previousPageNumber":1,
+ "hasNextPageNumber":true,
+ "nextPageNumber":2,
+ "startResultNumber":1,
+ "endResultNumber":25,
+ "startResultNumberString":"1",
+ "endResultNumberString":"25",
+ "remainingResults":2,
+ "numberNextResults":2,
+ "pageNumberList":[
+ 1,
+ 2
+ ]
+ },
+ "bundleStrings":{
+ "userId":"ID",
+ "userIdentifier":"Username",
+ "lastName":"Last Name ",
+ "firstName":"First Name ",
+ "email":"Email",
+ "affiliation":"Affiliation",
+ "position":"Position",
+ "isSuperuser":"Superuser",
+ "authenticationProvider":"Authentication",
+ "roles":"Roles",
+ "createdTime":"Created Time",
+ "lastLoginTime":"Last Login Time",
+ "lastApiUseTime":"Last API Use Time"
+ },
+ "users":[
+ {
+ "id":8,
+ "userIdentifier":"created1",
+ "lastName":"created1",
+ "firstName":"created1",
+ "email":"created1@g.com",
+ "affiliation":"hello",
+ "isSuperuser":false,
+ "authenticationProvider":"BuiltinAuthenticationProvider",
+ "roles":"Curator",
+ "createdTime":"2017-06-28 10:36:29.444"
+ },
+ {
+ "id":9,
+ "userIdentifier":"created8",
+ "lastName":"created8",
+ "firstName":"created8",
+ "email":"created8@g.com",
+ "isSuperuser":false,
+ "authenticationProvider":"BuiltinAuthenticationProvider",
+ "roles":"Curator",
+ "createdTime":"2000-01-01 00:00:00.0"
+ },
+ {
+ "id":1,
+ "userIdentifier":"dataverseAdmin",
+ "lastName":"Admin",
+ "firstName":"Dataverse",
+ "email":"dataverse@mailinator2.com",
+ "affiliation":"Dataverse.org",
+ "position":"Admin",
+ "isSuperuser":true,
+ "authenticationProvider":"BuiltinAuthenticationProvider",
+ "roles":"Admin, Contributor",
+ "createdTime":"2000-01-01 00:00:00.0",
+ "lastLoginTime":"2017-07-03 12:22:35.926",
+ "lastApiUseTime":"2017-07-03 12:55:57.186"
+ },
+ **... 22 more user documents ...**
+ ]
+ }
+ }
+
+.. note:: "List all users" ``GET http://$SERVER/api/admin/authenticatedUsers`` is deprecated, but supported.
- GET http://$SERVER/api/admin/authenticatedUsers
List user whose ``identifier`` (without the ``@`` sign) is passed::
diff --git a/doc/sphinx-guides/source/installation/administration.rst b/doc/sphinx-guides/source/installation/administration.rst
deleted file mode 100644
index ed1bb0fd775..00000000000
--- a/doc/sphinx-guides/source/installation/administration.rst
+++ /dev/null
@@ -1,104 +0,0 @@
-Administration
-==============
-
-This section focuses on system and database administration tasks. Please see the :doc:`/user/index` for tasks having to do with having the "Admin" role on a dataverse or dataset.
-
-.. contents:: |toctitle|
- :local:
-
-Solr Search Index
------------------
-
-Dataverse requires Solr to be operational at all times. If you stop Solr, you should see a error about this on the home page, which is powered by the search index Solr provides. You set up Solr by following the steps in the :doc:`prerequisites` section and the :doc:`config` section explained how to configure it. This section is about the care and feeding of the search index. PostgreSQL is the "source of truth" and the Dataverse application will copy data from PostgreSQL into Solr. For this reason, the search index can be rebuilt at any time but depending on the amount of data you have, this can be a slow process. You are encouraged to experiment with production data to get a sense of how long a full reindexing will take.
-
-Full Reindex
-++++++++++++
-
-There are two ways to perform a full reindex of the Dataverse search index. Starting with a "clear" ensures a completely clean index but involves downtime. Reindexing in place doesn't involve downtime but does not ensure a completely clean index.
-
-Clear and Reindex
-~~~~~~~~~~~~~~~~~
-
-**Clearing Data from Solr**
-...........................
-
-Please note that the moment you issue this command, it will appear to end users looking at the home page that all data is gone! This is because the home page is powered by the search index.
-
-``curl http://localhost:8080/api/admin/index/clear``
-
-**Start Async Reindex**
-.......................
-
-Please note that this operation may take hours depending on the amount of data in your system. This known issue is being tracked at https://github.com/IQSS/dataverse/issues/50
-
-``curl http://localhost:8080/api/admin/index``
-
-Reindex in Place
-~~~~~~~~~~~~~~~~
-
-An alternative to completely clearing the search index is to reindex in place.
-
-**Clear Index Timestamps**
-..........................
-
-``curl -X DELETE http://localhost:8080/api/admin/index/timestamps``
-
-**Start or Continue Async Reindex**
-...................................
-
-If indexing stops, this command should pick up where it left off based on which index timestamps have been set, which is why we start by clearing these timestamps above. These timestamps are stored in the ``dvobject`` database table.
-
-``curl http://localhost:8080/api/admin/index/continue``
-
-Glassfish
----------
-
-``server.log`` is the main place to look when you encounter problems. Hopefully an error message has been logged. If there's a stack trace, it may be of interest to developers, especially they can trace line numbers back to a tagged version.
-
-For debugging purposes, you may find it helpful to increase logging levels as mentioned in the :doc:`/developers/debugging` section of the Developer Guide.
-
-This guide has focused on using the command line to manage Glassfish but you might be interested in an admin GUI at http://localhost:4848
-
-Monitoring
-----------
-
-In production you'll want to monitor the usual suspects such as CPU, memory, free disk space, etc.
-
-https://github.com/IQSS/dataverse/issues/2595 contains some information on enabling monitoring of Glassfish, which is disabled by default.
-
-There is a database table called ``actionlogrecord`` that captures events that may be of interest. See https://github.com/IQSS/dataverse/issues/2729 for more discussion around this table.
-
-Maintenance
------------
-
-When you have scheduled down time for your production servers, we provide a :download:`sample maintenance page <../_static/installation/files/etc/maintenance/maintenance.xhtml>` for you to use. To download, right-click and select "Save Link As".
-
-The maintenance page is intended to be a static page served by Apache to provide users with a nicer, more informative experience when the site is unavailable.
-
-User Administration
--------------------
-
-There isn't much in the way of user administration tools built in to Dataverse.
-
-Confirm Email
-+++++++++++++
-
-Dataverse encourages builtin/local users to verify their email address upon signup or email change so that sysadmins can be assured that users can be contacted.
-
-The app will send a standard welcome email with a URL the user can click, which, when activated, will store a ``lastconfirmed`` timestamp in the ``authenticateduser`` table of the database. Any time this is "null" for a user (immediately after signup and/or changing of their Dataverse email address), their current email on file is considered to not be verified. The link that is sent expires after a time (the default is 24 hours), but this is configurable by a superuser via the ``:MinutesUntilConfirmEmailTokenExpires`` config option.
-
-Should users' URL token expire, they will see a "Verify Email" button on the account information page to send another URL.
-
-Sysadmins can determine which users have verified their email addresses by looking for the presence of the value ``emailLastConfirmed`` in the JSON output from listing users (see the "Admin" section of the :doc:`/api/native-api`). As mentioned in the :doc:`/user/account` section of the User Guide, the email addresses for Shibboleth users are re-confirmed on every login.
-
-Deleting an API Token
-+++++++++++++++++++++
-
-If an API token is compromised it should be deleted. Users can generate a new one for themselves as explained in the :doc:`/user/account` section of the User Guide, but you may want to preemptively delete tokens from the database.
-
-Using the API token 7ae33670-be21-491d-a244-008149856437 as an example:
-
-``delete from apitoken where tokenstring = '7ae33670-be21-491d-a244-008149856437';``
-
-You should expect the output ``DELETE 1`` after issuing the command above.
-
diff --git a/doc/sphinx-guides/source/installation/config.rst b/doc/sphinx-guides/source/installation/config.rst
index 4067595b2c1..40a22c7e42a 100644
--- a/doc/sphinx-guides/source/installation/config.rst
+++ b/doc/sphinx-guides/source/installation/config.rst
@@ -6,7 +6,7 @@ Now that you've successfully logged into Dataverse with a superuser account afte
Settings within Dataverse itself are managed via JVM options or by manipulating values in the ``setting`` table directly or through API calls. Configuring Solr requires manipulating XML files.
-Once you have finished securing and configuring your Dataverse installation, proceed to the :doc:`administration` section. Advanced configuration topics are covered in the :doc:`r-rapache-tworavens`, :doc:`shibboleth` and :doc:`oauth2` sections.
+Once you have finished securing and configuring your Dataverse installation, you may proceed to the :doc:`/admin/index` for more information on the ongoing administration of a Dataverse installation. Advanced configuration topics are covered in the :doc:`r-rapache-tworavens`, :doc:`shibboleth` and :doc:`oauth2` sections.
.. contents:: |toctitle|
:local:
@@ -315,12 +315,12 @@ If you are not fronting Glassfish with Apache you'll need to prevent Glassfish f
Putting Your Dataverse Installation on the Map at dataverse.org
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-Congratulations! You've gone live! It's time to announce your new data respository to the world! You are also welcome to contact support@dataverse.org to have the Dataverse team add your installation to the map at http://dataverse.org . Thank you for installing Datavese!
+Congratulations! You've gone live! It's time to announce your new data respository to the world! You are also welcome to contact support@dataverse.org to have the Dataverse team add your installation to the map at http://dataverse.org . Thank you for installing Dataverse!
Administration of Your Dataverse Installation
+++++++++++++++++++++++++++++++++++++++++++++
-Now that you're live you'll want to review the :doc:`/admin/index`. Please note that there is also an :doc:`administration` section of this Installation Guide that will be moved to the newer Admin Guide in the future.
+Now that you're live you'll want to review the :doc:`/admin/index` for more information about the ongoing administration of a Dataverse installation.
JVM Options
-----------
@@ -679,6 +679,15 @@ For dynamically adding information to the top of every page. For example, "For t
``curl -X PUT -d "For testing only..." http://localhost:8080/api/admin/settings/:StatusMessageHeader``
+You can make the text clickable and include an additional message in a pop up by setting ``:StatusMessageText``.
+
+:StatusMessageText
+++++++++++++++++++
+
+After you've set ``:StatusMessageHeader`` you can also make it clickable to have it include text if a popup with this:
+
+``curl -X PUT -d "This appears in a popup." http://localhost:8080/api/admin/settings/:StatusMessageText``
+
:MaxFileUploadSizeInBytes
+++++++++++++++++++++++++
@@ -689,6 +698,13 @@ Notes:
``curl -X PUT -d 2147483648 http://localhost:8080/api/admin/settings/:MaxFileUploadSizeInBytes``
+:ZipDownloadLimit
++++++++++++++++++
+
+For performance reasons, Dataverse will only create zip files on the fly up to 100 MB but the limit can be increased. Here's an example of raising the limit to 1 GB:
+
+``curl -X PUT -d 1000000000 http://localhost:8080/api/admin/settings/:ZipDownloadLimit``
+
:TabularIngestSizeLimit
+++++++++++++++++++++++
@@ -799,7 +815,7 @@ Allow for migration of non-conformant data (especially dates) from DVN 3.x to Da
:MinutesUntilConfirmEmailTokenExpires
+++++++++++++++++++++++++++++++++++++
-The duration in minutes before "Confirm Email" URLs expire. The default is 1440 minutes (24 hours). See also :doc:`/installation/administration`.
+The duration in minutes before "Confirm Email" URLs expire. The default is 1440 minutes (24 hours). See also the :doc:`/admin/user-administration` section of our Admin Guide.
:DefaultAuthProvider
++++++++++++++++++++
@@ -871,7 +887,7 @@ Set the base URL for the "Compute" button for a dataset.
:CloudEnvironmentName
+++++++++++++++++++++
-Set the base URL for the "Compute" button for a dataset.
+Set the name of the cloud environment you've integrated with your Dataverse installation.
``curl -X PUT -d 'Massachusetts Open Cloud (MOC)' http://localhost:8080/api/admin/settings/:CloudEnvironmentName``
diff --git a/doc/sphinx-guides/source/installation/index.rst b/doc/sphinx-guides/source/installation/index.rst
index 0223efcfaf2..0527803c806 100755
--- a/doc/sphinx-guides/source/installation/index.rst
+++ b/doc/sphinx-guides/source/installation/index.rst
@@ -15,7 +15,6 @@ Installation Guide
prerequisites
installation-main
config
- administration
upgrading
r-rapache-tworavens
geoconnect
diff --git a/doc/sphinx-guides/source/installation/prerequisites.rst b/doc/sphinx-guides/source/installation/prerequisites.rst
index a570e5ab84e..1829c6396e8 100644
--- a/doc/sphinx-guides/source/installation/prerequisites.rst
+++ b/doc/sphinx-guides/source/installation/prerequisites.rst
@@ -78,6 +78,8 @@ Adjust this :download:`Glassfish init script <../_static/installation/files/etc/
It is not necessary to have Glassfish running before you execute the Dataverse installation script because it will start Glassfish for you.
+Please note that you must run Glassfish in an English locale. If you are using something like ``LANG=de_DE.UTF-8``, ingest of tabular data will fail with the message "RoundRoutines:decimal separator no in right place".
+
PostgreSQL
----------
diff --git a/doc/sphinx-guides/source/installation/shibboleth.rst b/doc/sphinx-guides/source/installation/shibboleth.rst
index 59562ba0696..a883cef2826 100644
--- a/doc/sphinx-guides/source/installation/shibboleth.rst
+++ b/doc/sphinx-guides/source/installation/shibboleth.rst
@@ -349,7 +349,7 @@ If you have more than one Glassfish server, you should use the same ``sp-cert.pe
Debugging
---------
-The :doc:`administration` section explains how to increase Glassfish logging levels. The relevant classes and packages are:
+The :doc:`/admin/troubleshooting` section of the Admin Guide explains how to increase Glassfish logging levels. The relevant classes and packages are:
- edu.harvard.iq.dataverse.Shib
- edu.harvard.iq.dataverse.authorization.providers.shib
diff --git a/src/main/java/Bundle.properties b/src/main/java/Bundle.properties
index ab8e29b663b..9f8b7a1df6d 100755
--- a/src/main/java/Bundle.properties
+++ b/src/main/java/Bundle.properties
@@ -53,6 +53,8 @@ yes=Yes
no=No
previous=Previous
next=Next
+first=First
+last=Last
more=More...
less=Less...
select=Select...
@@ -491,6 +493,38 @@ harvestserver.newSetDialog.success=Successfully created harvesting set "{0}".
harvestserver.viewEditDialog.title=Edit Harvesting Set
harvestserver.viewEditDialog.btn.save=Save Changes
+#dashboard-users.xhtml
+dashboard.card.users=Users
+dashboard.card.users.header=Dashboard - User List
+dashboard.card.users.super=Superusers
+dashboard.card.users.manage=Manage Users
+dashboard.card.users.message=List and manage users.
+dashboard.list_users.searchTerm.watermark=Search these users...
+
+dashboard.list_users.tbl_header.userId=ID
+dashboard.list_users.tbl_header.userIdentifier=Username
+dashboard.list_users.tbl_header.name=Name
+dashboard.list_users.tbl_header.lastName=Last Name
+dashboard.list_users.tbl_header.firstName=First Name
+dashboard.list_users.tbl_header.email=Email
+dashboard.list_users.tbl_header.affiliation=Affiliation
+dashboard.list_users.tbl_header.roles=Roles
+dashboard.list_users.tbl_header.position=Position
+dashboard.list_users.tbl_header.isSuperuser=Superuser
+dashboard.list_users.tbl_header.authProviderFactoryAlias=Authentication
+dashboard.list_users.tbl_header.createdTime=Created Time
+dashboard.list_users.tbl_header.lastLoginTime=Last Login Time
+dashboard.list_users.tbl_header.lastApiUseTime=Last API Use Time
+
+
+dashboard.list_users.toggleSuperuser=Edit Superuser Status
+dashboard.list_users.toggleSuperuser.confirmationText.add=Are you sure you want to enable superuser status for user {0}?
+dashboard.list_users.toggleSuperuser.confirmationText.remove=Are you sure you want to disable superuser status for user {0}?
+dashboard.list_users.toggleSuperuser.confirm=Continue
+
+dashboard.list_users.api.auth.invalid_apikey=The API key is invalid.
+dashboard.list_users.api.auth.not_superuser=Forbidden. You must be a superuser.
+
#MailServiceBean.java
notification.email.create.dataverse.subject={0}: Your dataverse has been created
@@ -1630,3 +1664,12 @@ citationFrame.banner.message.here=here
citationFrame.banner.closeIcon=Close this message, go to dataset
citationFrame.banner.countdownMessage= This message will close in
citationFrame.banner.countdownMessage.seconds=seconds
+
+# Friendly AuthenticationProvider names
+authenticationProvider.name.builtin=Dataverse
+authenticationProvider.name.null=(provider is unknown)
+authenticationProvider.name.github=GitHub
+authenticationProvider.name.google=Google
+authenticationProvider.name.orcid=ORCiD
+authenticationProvider.name.orcid-sandbox=ORCiD Sandbox
+authenticationProvider.name.shib=Shibboleth
\ No newline at end of file
diff --git a/src/main/java/edu/harvard/iq/dataverse/DataFile.java b/src/main/java/edu/harvard/iq/dataverse/DataFile.java
index d0b511111d8..b189a434008 100644
--- a/src/main/java/edu/harvard/iq/dataverse/DataFile.java
+++ b/src/main/java/edu/harvard/iq/dataverse/DataFile.java
@@ -831,12 +831,12 @@ public Long getPreviousDataFileId(){
return this.previousDataFileId;
}
- public String asPrettyJSON(){
+ public String toPrettyJSON(){
return serializeAsJSON(true);
}
- public String asJSON(){
+ public String toJSON(){
return serializeAsJSON(false);
}
diff --git a/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java b/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java
index 615f6013225..8e75b89d22f 100644
--- a/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java
+++ b/src/main/java/edu/harvard/iq/dataverse/FileMetadata.java
@@ -500,12 +500,12 @@ public int compare(FileMetadata o1, FileMetadata o2) {
- public String asPrettyJSON(){
+ public String toPrettyJSON(){
return serializeAsJSON(true);
}
- public String asJSON(){
+ public String toJSON(){
return serializeAsJSON(false);
}
diff --git a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java
index 5f37aeee11c..c3bf6adacac 100644
--- a/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java
+++ b/src/main/java/edu/harvard/iq/dataverse/MailServiceBean.java
@@ -102,6 +102,7 @@ public void sendMail(String host, String from, String to, String subject, String
private Session session;
public boolean sendSystemEmail(String to, String subject, String messageText) {
+
boolean sent = false;
String rootDataverseName = dataverseService.findRootDataverse().getName();
String body = messageText + BundleUtil.getStringFromBundle("notification.email.closing", Arrays.asList(BrandingUtil.getInstallationBrandName(rootDataverseName)));
@@ -180,7 +181,8 @@ public void sendMail(String from, String to, String subject, String messageText,
}
}
- public Boolean sendNotificationEmail(UserNotification notification){
+ public Boolean sendNotificationEmail(UserNotification notification){
+
boolean retval = false;
String emailAddress = getUserEmailAddress(notification);
if (emailAddress != null){
diff --git a/src/main/java/edu/harvard/iq/dataverse/UserServiceBean.java b/src/main/java/edu/harvard/iq/dataverse/UserServiceBean.java
index f2d2fea395c..dd3ce4e5633 100644
--- a/src/main/java/edu/harvard/iq/dataverse/UserServiceBean.java
+++ b/src/main/java/edu/harvard/iq/dataverse/UserServiceBean.java
@@ -1,15 +1,23 @@
package edu.harvard.iq.dataverse;
-
import edu.harvard.iq.dataverse.authorization.users.AuthenticatedUser;
import edu.harvard.iq.dataverse.search.IndexServiceBean;
+import edu.harvard.iq.dataverse.userdata.UserUtil;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.logging.Level;
import java.sql.Timestamp;
import java.util.Date;
import java.util.logging.Logger;
+import java.util.stream.Collectors;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
+import javax.persistence.Query;
+import org.apache.commons.lang.StringUtils;
+import org.ocpsoft.common.util.Strings;
@Stateless
@Named
@@ -42,7 +50,465 @@ public AuthenticatedUser save(AuthenticatedUser user) {
return user;
}
+
+ /**
+ * Return the user information as a List of AuthenticatedUser objects -- easier to work with in the UI
+ * - With Role added as a transient field
+ * @param searchTerm
+ * @param sortKey
+ * @param resultLimit
+ * @param offset
+ * @return
+ */
+ public List getAuthenticatedUserList(String searchTerm, String sortKey, Integer resultLimit, Integer offset){
+
+ if ((offset == null)||(offset < 0)){
+ offset = 0;
+ }
+
+ List