<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://wiki.eprints.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Drn%40ecs.soton.ac.uk</id>
	<title>EPrints Documentation - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.eprints.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Drn%40ecs.soton.ac.uk"/>
	<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/Special:Contributions/Drn@ecs.soton.ac.uk"/>
	<updated>2026-05-09T04:17:11Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.8</generator>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=YouTube_Import&amp;diff=17059</id>
		<title>YouTube Import</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=YouTube_Import&amp;diff=17059"/>
		<updated>2026-05-08T10:42:40Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added page skeleton for YouTube Import Bazaar package&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Plugins]]&lt;br /&gt;
[[Category:Bazaar_Package]]&lt;br /&gt;
[[Category:Eprints3.4]]&lt;br /&gt;
[[Category:Eprints3.3]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
== Installing Dependencies ==&lt;br /&gt;
=== Python 3.11+ ===&lt;br /&gt;
=== Deno ===&lt;br /&gt;
=== yt-dlp-ejs ===&lt;br /&gt;
=== yt-dlp ===&lt;br /&gt;
&lt;br /&gt;
== Useful Scripts ==&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Issues_with_Installing_EPrints_on_Ubuntu_26.04&amp;diff=17058</id>
		<title>Issues with Installing EPrints on Ubuntu 26.04</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Issues_with_Installing_EPrints_on_Ubuntu_26.04&amp;diff=17058"/>
		<updated>2026-05-01T15:16:52Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added issue with db creation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As of 1st May 2026, Ubuntu 26.04 is under testing to determine if EPrints can be successfully installed and if so if there are any issues with doing this, which require a different approach from the general approach for installing EPrints on Debian/Ubuntu Linux.&lt;br /&gt;
&lt;br /&gt;
==== Current Issues ====&lt;br /&gt;
; Segfault when creating EPrints database : If you use &amp;lt;code&amp;gt;bin/epadmin create pub&amp;lt;/code&amp;gt; to create a new archive, once you approve the creation of the archive's database rather than prompting you for an appropriate username and password for a superuser that can create new database you get a segfault error like below. A resolution to this issue is currently being investigated.&lt;br /&gt;
 Segmentation fault         (core dumped) bin/epadmin create pub&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Issues_with_Installing_EPrints_on_Ubuntu_24.04&amp;diff=17057</id>
		<title>Issues with Installing EPrints on Ubuntu 24.04</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Issues_with_Installing_EPrints_on_Ubuntu_24.04&amp;diff=17057"/>
		<updated>2026-05-01T15:06:08Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* Previous Issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''N.B. It is assumed that you are installing the [[:Category:Eprints3.4 | latest version of 3.4]]. Earlier versions may have issues not listed here.'''&lt;br /&gt;
&lt;br /&gt;
==== Previous Issues ====&lt;br /&gt;
; MySQL root user cannot be used : This is now explained under EPrints' [[Getting Started]] instructions. As it is typical for most modern Linux operating systems.&lt;br /&gt;
; &amp;lt;code&amp;gt;libncurses5&amp;lt;/code&amp;gt; APT package dependency no longer exists : Install &amp;lt;code&amp;gt;libncurses6&amp;lt;/code&amp;gt; instead.  However, as both Ubuntu 24.04 and Ubuntu 26.04 only have libncurses6 the general instructions have been updated to use libncurses6, so this is no longer an issue.&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Issues_with_Installing_EPrints_on_Ubuntu_24.04&amp;diff=17056</id>
		<title>Issues with Installing EPrints on Ubuntu 24.04</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Issues_with_Installing_EPrints_on_Ubuntu_24.04&amp;diff=17056"/>
		<updated>2026-05-01T15:05:00Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* Previous Issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''N.B. It is assumed that you are installing the [[:Category:Eprints3.4 | latest version of 3.4]]. Earlier versions may have issues not listed here.'''&lt;br /&gt;
&lt;br /&gt;
==== Previous Issues ====&lt;br /&gt;
; MySQL root user cannot be used : This is now explained under EPrints' [[Getting Started]] instructions. As it is typical for most modern Linux operating systems.&lt;br /&gt;
; &amp;lt;code&amp;gt;libncurses5&amp;lt;/code&amp;gt; : APT package dependency no longer exists in Ubuntu 24.04 LTS, install &amp;lt;code&amp;gt;libncurses6&amp;lt;/code&amp;gt; instead.  As both Ubuntu 24.04 and Ubuntu 26.04 only have libncurses6 the general instructions have been updated to use libncurses6.&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Issues_with_Installing_EPrints_on_Ubuntu_24.04&amp;diff=17055</id>
		<title>Issues with Installing EPrints on Ubuntu 24.04</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Issues_with_Installing_EPrints_on_Ubuntu_24.04&amp;diff=17055"/>
		<updated>2026-05-01T15:04:43Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Moved libncurses version issue to previous issues&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''N.B. It is assumed that you are installing the [[:Category:Eprints3.4 | latest version of 3.4]]. Earlier versions may have issues not listed here.'''&lt;br /&gt;
&lt;br /&gt;
==== Previous Issues ====&lt;br /&gt;
; MySQL root user cannot be used : This is now explained under EPrints' [[Getting Started]] instructions. As it is typical for most modern Linux operating systems.&lt;br /&gt;
; &amp;lt;code&amp;gt;libncurses5&amp;lt;/code&amp;gt; APT package dependency no longer exists in Ubuntu 24.04 LTS, install &amp;lt;code&amp;gt;libncurses6&amp;lt;/code&amp;gt; instead.  As both Ubuntu 24.04 and Ubuntu 26.04 only have libncurses6 the general instructions have been updated to use libncurses6.&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Issues_with_Installing_EPrints_on_Ubuntu_22.04&amp;diff=17054</id>
		<title>Issues with Installing EPrints on Ubuntu 22.04</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Issues_with_Installing_EPrints_on_Ubuntu_22.04&amp;diff=17054"/>
		<updated>2026-05-01T15:02:56Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added issue as Ubuntu 22.04 is now only LTS that needs libncurses5 rather than libncurses6&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''N.B. It is assumed that you are installing the [[:Category:Eprints3.4 | latest version of 3.4]]. Earlier versions may have issues not listed here.'''&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;big&amp;gt;NO CURRENT ISSUES&amp;lt;/big&amp;gt;'''&lt;br /&gt;
==== Previous issues ====&lt;br /&gt;
; ''libsepol1'' Deb package no longer exists : This has been removed as a dependency on 29th May 2022, as it is not specifically required by EPrints.&lt;br /&gt;
; MySQL root user cannot be used : This is now explained under EPrints' [[Getting Started]] instructions. As it is typical for most modern Linux operating systems.&lt;br /&gt;
; ''libncurses6'' Deb package not available : In more recent versions of Ubuntu libncurses6 is the name for the ncurses package but as Ubuntu 22.04 is older you will need to install ''libncurses5'' instead.&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Installing_EPrints_on_Debian/Ubuntu&amp;diff=17053</id>
		<title>Installing EPrints on Debian/Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Installing_EPrints_on_Debian/Ubuntu&amp;diff=17053"/>
		<updated>2026-05-01T14:59:15Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: libncurses6 is now used by Ubuntu 24.04 and 26.04&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{manual}}&lt;br /&gt;
[[Category:Debian and Ubuntu]]&lt;br /&gt;
[[Category:Installation]]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* Ubuntu 22.04 LTS and Ubuntu 24.04 LTS (non-LTS versions not recommended)&lt;br /&gt;
* Debian 11 (Bullseye) or Debian 12 (Bookworm) - These are not as comprehensively tested as Ubuntu LTS versions.&lt;br /&gt;
&lt;br /&gt;
=== Dependencies and Pre-configuration ===&lt;br /&gt;
'''The ideal way to install from source is via git using the Core Git repositories [https://github.com/eprints/eprints3.4 EPrints 3.4] or [https://github.com/eprints/eprints EPrints 3.3], and installing from a source tarball is generally discouraged.'''&lt;br /&gt;
&lt;br /&gt;
'''Installing from source via git is now the recommended  way to install EPrints for production repositories, after having proved to be a useful installation method to those seeking to develop the EPrints code, develop a plugin or develop a Bazaar package too.'''&lt;br /&gt;
&lt;br /&gt;
First, as the root user install all the dependencies for EPrints ('''N.B.''' Some dependencies may not be able in certain versions of Debian/Ubuntu.  See [[#Operating System Version Specific Requirements|Operating System Version Specific Requirements]] towards the end of this page):&lt;br /&gt;
&lt;br /&gt;
 apt install perl libncurses6 libselinux1 apache2 libapache2-mod-perl2 libxml-libxml-perl \&lt;br /&gt;
   libunicode-string-perl libterm-readkey-perl libmime-lite-perl libmime-types-perl libdigest-sha-perl \&lt;br /&gt;
   libdbd-mysql-perl libxml-parser-perl libxml2-dev libxml-twig-perl libarchive-any-perl libjson-perl \&lt;br /&gt;
   liblwp-protocol-https-perl libtext-unidecode-perl lynx wget ghostscript poppler-utils antiword elinks \&lt;br /&gt;
   texlive-base texlive-binaries psutils imagemagick adduser tar gzip unzip libsearch-xapian-perl \&lt;br /&gt;
   libtex-encode-perl libio-string-perl python3-html2text make libexpat1-dev libxslt1-dev&lt;br /&gt;
&lt;br /&gt;
If you are installing on Ubuntu, install MySQL server and client:&lt;br /&gt;
&lt;br /&gt;
  apt install mysql-server mysql-client libmysqlclient-dev&lt;br /&gt;
&lt;br /&gt;
If you are installing on Debian, install MariaDB server and client:&lt;br /&gt;
&lt;br /&gt;
  apt install mariadb-server mariadb-client libmariadb-dev&lt;br /&gt;
&lt;br /&gt;
Next, create the eprints user&lt;br /&gt;
&lt;br /&gt;
 adduser eprints&lt;br /&gt;
&lt;br /&gt;
Now add the eprints user to the www-data group and vice-versa&lt;br /&gt;
&lt;br /&gt;
 usermod -a -G eprints www-data&lt;br /&gt;
 usermod -a -G www-data eprints&lt;br /&gt;
&lt;br /&gt;
=== Downloading and Deploying EPrints Source ===&lt;br /&gt;
&lt;br /&gt;
==== EPrints 3.4.x for GitHub ====&lt;br /&gt;
&lt;br /&gt;
 apt install git&lt;br /&gt;
 mkdir /opt/eprints3&lt;br /&gt;
 chown eprints:eprints /opt/eprints3&lt;br /&gt;
 chmod 2775 /opt/eprints3&lt;br /&gt;
 su eprints&lt;br /&gt;
 git clone https://github.com/eprints/eprints3.4.git /opt/eprints3&lt;br /&gt;
 cd /opt/eprints3/&lt;br /&gt;
 git checkout tags/v3.4.7&lt;br /&gt;
&lt;br /&gt;
==== EPrints 3.4.x from files.eprints.org ====&lt;br /&gt;
&lt;br /&gt;
 cd /tmp/&lt;br /&gt;
 wget https://files.eprints.org/3288/1/eprints-3.4.7.tar.gz&lt;br /&gt;
 tar -xzvf eprints-3.4.7.tar.gz&lt;br /&gt;
&lt;br /&gt;
Then put in the source code in place:&lt;br /&gt;
&lt;br /&gt;
 mv eprints-3.4.7 /opt/eprints3&lt;br /&gt;
 chmod 2775 /opt/eprints3&lt;br /&gt;
 chown -R eprints:eprints /opt/eprints3&lt;br /&gt;
&lt;br /&gt;
If you want a publications flavoured repository, then also:&lt;br /&gt;
&lt;br /&gt;
 wget https://files.eprints.org/3288/2/eprints-3.4.7-flavours.tar.gz&lt;br /&gt;
 tar -xzvf eprints-3.4.7-flavours.tar.gz&lt;br /&gt;
 mv eprints-3.4.7/flavours/pub_lib /opt/eprints3/flavours&lt;br /&gt;
 chmod -R g+w /opt/eprints3/flavours/pub_lib&lt;br /&gt;
 chown -R eprints:eprints /opt/eprints3/flavours/pub_lib&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Next, as the eprints user copy &amp;lt;code&amp;gt;EPRINTS_PATH/perl_lib/EPrints/SystemSettings.pm.tmpl&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;EPRINTS_PATH/perl_lib/EPrints/SystemSettings.pm&amp;lt;/code&amp;gt;, if it does not already exist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;EPRINTS_PATH&amp;lt;/code&amp;gt; should now always be &amp;lt;code&amp;gt;/opt/eprints3&amp;lt;/code&amp;gt;.  However, historically other paths have been used when EPrints was available as a Deb package.&lt;br /&gt;
&lt;br /&gt;
EPrints is now fully installed at &amp;lt;code&amp;gt;EPRINTS_PATH/&amp;lt;/code&amp;gt;. However, you will not yet have a running archive. Follow the [[Getting Started with EPrints 3]] instructions to set this up.&lt;br /&gt;
&lt;br /&gt;
=== Post-configuration ===&lt;br /&gt;
Next, add the file &amp;lt;code&amp;gt;/etc/apache2/sites-available/eprints.conf&amp;lt;/code&amp;gt; with the following line:&lt;br /&gt;
&lt;br /&gt;
 Include EPRINTS_PATH/cfg/apache.conf&lt;br /&gt;
&lt;br /&gt;
To enable this as root run the command:&lt;br /&gt;
&lt;br /&gt;
 root&amp;gt; a2ensite eprints&lt;br /&gt;
&lt;br /&gt;
Also it may be necessary to disable the default site otherwise the default Apache page will still be shown:&lt;br /&gt;
&lt;br /&gt;
 a2dissite 000-default&lt;br /&gt;
&lt;br /&gt;
Finally, restart Apache:&lt;br /&gt;
&lt;br /&gt;
 service apache2 restart&lt;br /&gt;
&lt;br /&gt;
You should now be able to access your vanilla repository at the hostname you specified when running '''epadmin create''' from the [[Getting Started with EPrints 3]] instructions.  You should then login as the admin user you created during this process and turn on the indexer.  This can be done by clicking on the '''Admin''' link under the Logged in menu, then clicking on the '''System Tools''' tab and finally the '''Start Indexer''' button.&lt;br /&gt;
&lt;br /&gt;
== Operating System Version Specific Requirements ==&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu 22.04 LTS ===&lt;br /&gt;
{{:Issues with Installing EPrints on Ubuntu 22.04}}&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu 24.04 LTS ===&lt;br /&gt;
{{:Issues with Installing EPrints on Ubuntu 24.04}}&lt;br /&gt;
&lt;br /&gt;
=== Debian Known Issues ===&lt;br /&gt;
See [[Debian Known Issues]]&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Issues_with_Installing_EPrints_on_Ubuntu_26.04&amp;diff=17052</id>
		<title>Issues with Installing EPrints on Ubuntu 26.04</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Issues_with_Installing_EPrints_on_Ubuntu_26.04&amp;diff=17052"/>
		<updated>2026-05-01T14:41:11Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added placeholder&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As of 1st May 2026, Ubuntu 26.04 is under testing to determine if EPrints can be successfully installed and if so if there are any issues with doing this, which require a different approach from the general approach for installing EPrints on Debian/Ubuntu Linux.&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Category:Installation&amp;diff=17051</id>
		<title>Category:Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Category:Installation&amp;diff=17051"/>
		<updated>2026-05-01T14:39:37Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* Distribution Notes */ Added Ubunty 26.04 (under testing)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The default installation of EPrints is on a stand-alone linux system, but this is not the only way EPrints can (and has) been installed.&lt;br /&gt;
&lt;br /&gt;
'''The EPrints team currently recommends installing EPrints in one of the following ways:'''&lt;br /&gt;
&lt;br /&gt;
* '''[[Installing EPrints on Debian/Ubuntu]]'''&lt;br /&gt;
* '''[[Installing EPrints on_RHEL/Fedora/CentOS]]'''&lt;br /&gt;
* '''[[Generic_Linux_Installation|Installing from source]]'''&lt;br /&gt;
&lt;br /&gt;
Here are some other ways:&lt;br /&gt;
&lt;br /&gt;
* [[non-root_proxy|Proxied to a non-root user account]]: Where the server and all associated code is installed without root/admin access to anything&lt;br /&gt;
* [[How to set up EPrints on virtual directories other than root|Hosted on virtual directories other than root]] - sharing with other Web applications on the same server&lt;br /&gt;
&lt;br /&gt;
This category contains a range of other sets of instructions for different operating systems and versions of EPrints. Most of them are not supported but may still work. {{EPrintsTech}}&lt;br /&gt;
&lt;br /&gt;
If you want to write installation instructions for a system other than those listed here please do so. Remember to tag the page with &amp;lt;nowiki&amp;gt;[[Category:Installation]]&amp;lt;/nowiki&amp;gt; so that it appears in this list. &lt;br /&gt;
&lt;br /&gt;
'''If you use one of the installation guides below and it doesn't work, edit the page to say what went wrong and how you fixed it. This will help others (and maybe yourself) tackle these problems in the future. [[Template:Register|Here you can register for an eprints.org account]] to edit the wiki.'''&lt;br /&gt;
&lt;br /&gt;
== Distribution Notes ==&lt;br /&gt;
&lt;br /&gt;
Known issues and gotchas on various Linux distributions&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Distibution&lt;br /&gt;
! Support&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| RHEL / Centos / Rocky 8&lt;br /&gt;
| Supported&lt;br /&gt;
| Some minor issues. See [[Issues with installing EPrints on RHEL / CentOS / Rocky 8]].&lt;br /&gt;
|-&lt;br /&gt;
| RHEL / Centos / Rocky 9&lt;br /&gt;
| Supported&lt;br /&gt;
| Some minor issues. See [[Issues with installing EPrints on RHEL / CentOS / Rocky 9]]. EPrints Services test builds against this release.&lt;br /&gt;
|-&lt;br /&gt;
| RHEL / Centos / Rocky 10&lt;br /&gt;
| Supported&lt;br /&gt;
| Some minor issues. See [[Issues with installing EPrints on RHEL / CentOS / Rocky 10]].&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 22.04 LTS&lt;br /&gt;
| Supported&lt;br /&gt;
| Some minor issues. See [[Issues with Installing EPrints on Ubuntu 22.04]].&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 24.04 LTS&lt;br /&gt;
| Supported&lt;br /&gt;
| Some minor issues. See [[Issues with Installing EPrints on Ubuntu 24.04]].&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 26.04 LTS&lt;br /&gt;
| Under testing&lt;br /&gt;
| Any issues will be reported at [[Issues with Installing EPrints on Ubuntu 26.04]].&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Template:EPrints_Metadata_Fields_Content&amp;diff=17050</id>
		<title>Template:EPrints Metadata Fields Content</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Template:EPrints_Metadata_Fields_Content&amp;diff=17050"/>
		<updated>2026-04-30T13:05:23Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* Object Methods */ Added render_name&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Metadata Field Types ==&lt;br /&gt;
&lt;br /&gt;
There are many different types of metadata field. The type controls how a field is rendered, indexed, searched and so forth. A field always has a type and a name property, and usually has several more. Most properties are documented on this page, but some properties are only available to certain types of field, and they are listed on the page for that field. &lt;br /&gt;
&lt;br /&gt;
Some of these subclasses provide very rich features, others very simple. For example the [[url field]] works just like the text field except that it's only valid if it looks like a url and when rendered it is a hyper-link.&lt;br /&gt;
&lt;br /&gt;
A metadata field describes one field of data in one type of [[Data Object]]. For example the &amp;quot;title&amp;quot; field of an [[EPrint Object]] or the &amp;quot;email&amp;quot; field in a [[User Object]]. &lt;br /&gt;
&lt;br /&gt;
Every [[Data Object]] has system fields (which are set by the system, and not alterable), but the [[User Object]] and [[EPrint Object]] have additional fields which are configured on a per-repository basis.&lt;br /&gt;
&lt;br /&gt;
These can be customised in the [[user_fields.pl]] and [[eprint_fields.pl]] files. Note that changing these files does not automatically modify the underlying database so should (generally) only be done before the database is created. Some metadata properties do not affect the database, and are marked as such. &lt;br /&gt;
&lt;br /&gt;
If you add or remove fields, or modify a property which affects the database then you'll need to alter the database to match.  In 3.0 this must be done by hand, but we have plans to build a tool to do this for you.&lt;br /&gt;
&lt;br /&gt;
== Inheritance ==&lt;br /&gt;
&lt;br /&gt;
This is the list of ''useful'' field types. Under it is listed the other field types which are just included for completeness and are not intended to be used as part of the configuration.&lt;br /&gt;
&lt;br /&gt;
Some field types inherit the properties of another, and then modify them in some way. For example the [[namedset field]] works like a [[set field]] except that it gets its options from a namedsets file not from the options=&amp;gt;[] in the field properties.&lt;br /&gt;
&lt;br /&gt;
* '''Basic metadata field''' - this is abstract, fields must be one of the types listed below...&lt;br /&gt;
** '''[[Boolean field|Boolean]]''' - TRUE or FALSE (or can be unset, of course).&lt;br /&gt;
** '''[[Compound field|Compound]]''' - virtual field, joins together several &amp;quot;multiple&amp;quot; fields, e.g. author_name and author_email.&lt;br /&gt;
*** '''[[Dataobjref field|Dataobjref]]''' - references another data object.&lt;br /&gt;
*** '''[[Multilang field|Multilang]]''' - allows language variants of a field, e.g. titles in French, German and/or English.&lt;br /&gt;
*** '''[[Relation field|Relation]]''' - stores a typed relationship with something represented by a URI.&lt;br /&gt;
** '''[[Date field|Date]]''' - stores a date&lt;br /&gt;
*** '''[[Time field|Time]]''' - stores a date and time&lt;br /&gt;
**** '''[[Timestamp field|Timestamp]]''' - stores current date and time&lt;br /&gt;
** '''[[Float field|Float]]''' - stores a floating-point value&lt;br /&gt;
*** '''[[Decimal field|Decimal]]''' - stores a decimal number.  Specifying the length of number before and after the decimal point.&lt;br /&gt;
** '''[[Id field|Id]]''' - like basic text field but search only finds exact matches&lt;br /&gt;
*** '''[[Idci field|Id (case-insensive)]]''' - like Id field but search find exact matches ignoring case (use for usernames, email addresses, etc.)&lt;br /&gt;
**** '''[[Email field|Email]]''' - an email address&lt;br /&gt;
*** '''[[Keywords field|Keywords]]''' - stores as longtext but searchable as exact individual keyword phrases&lt;br /&gt;
*** '''[[Recaptcha field|Recaptcha]]''' - virtual field to display a reCAPTCHA to prevent spamming of public input forms.&lt;br /&gt;
*** '''[[Text field|Text]]''' - the basic text field. Maximum 255 bytes. nb. uft-8 means some chars take more than one byte.&lt;br /&gt;
**** '''[[Longtext field|Longtext]]''' - like text but allows much longer text (65,000 bytes).&lt;br /&gt;
***** '''[[Longtext_counter field|Longtext counter]]''' - like longtext but with a word counter (requires [https://jquery.com/download/ jQuery])&lt;br /&gt;
**** '''[[Pagerange field|Pagerange]]''' - a range of page from one number to another.&lt;br /&gt;
**** '''[[Secret field|Secret]]''' - used to store passwords and other secrets.&lt;br /&gt;
**** '''[[Set field|Set]]''' - a limited set of options&lt;br /&gt;
***** '''[[Namedset field|Namedset]]''' - like a normal set, but takes its options from a [[namedset]] configuration file.&lt;br /&gt;
***** '''[[Subject field|Subject]]''' - possible values are taken from the [[Subject Object|Subject]] hierarchy. &lt;br /&gt;
***** '''[[Base64 field|Base64]]''' - stores Base64 encoded data.&lt;br /&gt;
****** '''[[Image field|Image]]''' - stores image encoded in Base64 data.&lt;br /&gt;
*** '''[[Url field|Url]]''' - stores a URL.&lt;br /&gt;
*** '''[[Uuid field|Uuid]]''' - stores a UUID.&lt;br /&gt;
** '''[[Int field|Int]]''' - an integer value&lt;br /&gt;
*** '''[[Bigint field|Bigint]]''' - a large integer value (can be greater than 2,147,483,647 or less than -2,147,483.647).&lt;br /&gt;
*** '''[[Counter field|Counter]]''' - an auto-incrementing integer value.&lt;br /&gt;
*** '''[[Itemref field|Itemref]]''' - a reference to another [[Data Object]] (e.g. a user or other eprint)&lt;br /&gt;
*** '''[[Pagerange field|Pagerange]]''' - a pagerange, e.g. 122-130&lt;br /&gt;
** '''[[Multipart field|Multipart]]''' - Stores a mutiple sub-fields like a person's name.&lt;br /&gt;
*** '''[[Name field|Name]]''' - Stores a person's name broken up into logical parts.&lt;br /&gt;
** '''[[Subobject field|Subobject]]''' - Stores another data object under a parent data object.&lt;br /&gt;
&lt;br /&gt;
=== Internal-use and Deprecated Field Types ===&lt;br /&gt;
* '''Basic metadata field'''&lt;br /&gt;
** '''[[File field|File]]''' - '''DEPRECATED'''.  Use [[Subobject field]] instead.&lt;br /&gt;
** '''Id''' &lt;br /&gt;
*** '''Text'''&lt;br /&gt;
**** '''Set'''&lt;br /&gt;
***** '''[[Arclanguage field|Arclanguage]]''' - as for set, but the options are the valid languages of this repository.  Probably better to use [[Multilang field]].&lt;br /&gt;
***** '''[[Fields field|Fields]]''' - as for set, but the options are the fields in a dataset.&lt;br /&gt;
***** '''[[Langid field|Langid]]''' - used internally by [[Multilang field]]s to store the language ID.&lt;br /&gt;
**** '''Longtext'''&lt;br /&gt;
***** '''[[Search field|Search]]''' - a serialised search &lt;br /&gt;
** '''Int'''&lt;br /&gt;
*** '''[[Year field|Year]]''' - '''DEPRECATED'''.  Use [[Date field]] instead.&lt;br /&gt;
** '''[[Storable field|Storable]]''' - Stores a serialization of a Perl data structure.&lt;br /&gt;
&lt;br /&gt;
== Properties ==&lt;br /&gt;
&lt;br /&gt;
Note that true/false properties use 1 and 0 to indicate their setting.&lt;br /&gt;
&lt;br /&gt;
Some properties can be temporarily set or overridden by the [[Workflow Format]] and [[Citation Format]] files.&lt;br /&gt;
&lt;br /&gt;
=== Core Properties ===&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''name''' || n/a || YES || This is the internal name of the field. It should only contain alphanumeric characters and underscores. It will be used to identify this field in scripts, other configuration files, in the database, and in the XML export/import system, etc. ||  This property is ''not'' required when defining sub-fields of [[Compound field]]s where &amp;lt;tt&amp;gt;sub_name&amp;lt;/tt&amp;gt; should be used. This property affects the database structure.  It must be unique within the [[Data Object]] (so the [[EPrint Object]] cannot have two fields called &amp;lt;tt&amp;gt;email&amp;lt;/tt&amp;gt; but the EPrint Object and [[User Object]] can each have a field with the same name.&lt;br /&gt;
|-&lt;br /&gt;
| '''type''' || n/a || YES || This sets the type of the metafield, which in turn affects what other properties it may have. || This property affects the database structure.  The value must be one of the metafield types listed above.&lt;br /&gt;
|-&lt;br /&gt;
| '''multiple''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || This indicates if this field is a single value or a list of values. E.g. &amp;lt;tt&amp;gt;title&amp;lt;/tt&amp;gt; is only a single [[Longtext field]] but &amp;lt;tt&amp;gt;creators&amp;lt;/tt&amp;gt; is a multiple [[Compound field]]. || This property affects the database structure. In the database a non-multiple field is stored in one (or more) columns in the main object table, but a multiple field gets its own table.&lt;br /&gt;
|-&lt;br /&gt;
| '''readonly''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether to not make this field editable in the workflow. || This is useful if you want to display the pre-generated value(s) for this field for reference whilst other fields are being edited.&lt;br /&gt;
|-&lt;br /&gt;
| '''sql_index''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || When the database is created this field indicates that an SQL index should be created to speed searching. || This property affects the database structure. Different field types override the default value with the sensible option for that type of field. It is not worth putting a SQL index on a field that is only ever searched for words in it (like title or abstract) but it is worth indexing fields who's values are explicitly searched for, or where ranges are searched (e.g. [[Date field]]s, [[Set field]]s etc.). It is unlikely you will need to set this by hand. You could change it after the database has been created but this will not update the database nor have any other effect.&lt;br /&gt;
|- &lt;br /&gt;
| '''sub_name''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || YES || This is a special property which is required ''instead'' of the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; property for the sub-fields inside [[Compound field]]s.  || This property affects the database structure. The actual name of these fields is then forced to be parent field &amp;lt;tt&amp;gt;name + '_' + sub_name&amp;lt;/tt&amp;gt;. E.g.  Compound field &amp;lt;tt&amp;gt;creators&amp;lt;/tt&amp;gt; is a sub-field with &amp;lt;tt&amp;gt;sub_name =&amp;gt; 'name'&amp;lt;/tt&amp;gt;. In this case the actual name of the name field in the system, database etc. is &amp;lt;tt&amp;gt;creators_name/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| '''virtual''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether this field calculates a value or stores in in the database. || [[Compound field]]s are virtual fields, whereas there sub-fields are not as they store values in the database.  Other types of virtual field will require a &amp;lt;tt&amp;gt;render_value&amp;lt;/tt&amp;gt; to be specified, as with no value stored the default render method will have nothing to display.&lt;br /&gt;
|-&lt;br /&gt;
| '''volatile''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether the field is liable to change frequently. || Setting &amp;lt;code&amp;gt;volatile =&amp;gt; 1&amp;lt;/code&amp;gt; will prevent new revisions being create and avoid other post commit events from being triggered, such as re-indexing.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rendering Properties ===&lt;br /&gt;
&lt;br /&gt;
These properties affect how values of the metadata in this field are rendered.&lt;br /&gt;
&lt;br /&gt;
Certain of these properties can be turned on temporarily by the [[Citation Format]] files - render_magicstop for example.&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''as_list''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Whether to display a collection sub-fields values as a table row or a separate list in the input form || This is only applicable for [[Compound field]]s that have &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt;.  It is useful where the length of the table row would exceed the width of a typical user's window.&lt;br /&gt;
|-&lt;br /&gt;
| '''browse_link''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || This is the name of a view which values of this field should be linked to. || E.g. if there was a &amp;lt;tt&amp;gt;Browse by Publishers&amp;lt;/tt&amp;gt; view configured named &amp;lt;tt&amp;gt;pubs&amp;lt;/tt&amp;gt;, then adding &amp;lt;code&amp;gt;browse_link =&amp;gt; 'pubs'&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;publisher&amp;lt;/tt&amp;gt; field would cause it to be linked into the browse view page for the named publisher whenever it is rendered.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_custom''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Whether to use a pre-defined way of rendering the value for this field. || E.g. for [[Name field]]s by default the name will link to the creators browse view for that name.  This property can be re-used within bespoke render functions to specify whether some custom way of rendering this field' svalue (e.g. with a link) should be used.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_dont_link''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether rendered field is not encapsulated in a hyperlink. || Currently only affects [[Url field]]s and [[Email field]]s.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_dynamic''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether the rendering of this field can use JavaScript to make it dynamic. || [[limit_names_shown.pl]] uses this property to determine if the list of hidden creators/editors can be expanded to show all creators/editors.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_limit''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || How many values for this field should be displayed. || [[limit_names_shown.pl]] uses this property to determine how many creators/editors to display.  If &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; just render all values.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_magicstop''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether to render a full stop at the end of this field, unless the last character is a dot, question mark or exclamation mark. || This helps avoid the ugly &amp;lt;tt&amp;gt;World without Cheese?.&amp;lt;/tt&amp;gt; effect you get when titles end in &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;!&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_noreturn''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether CR (Carriage Return) and LF (Line Feed) characters are turned into normal spaces. ||&lt;br /&gt;
|-&lt;br /&gt;
| '''render_quiet''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether to prevent a big ugly &amp;lt;tt&amp;gt;UNSPECIFIED&amp;lt;/tt&amp;gt; being rendered if field is unset. || E.g. setting &amp;lt;code&amp;gt;render_quiet =&amp;gt; 1&amp;lt;/code&amp;gt; on a field means it just gets rendered as nothing if it is unset.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_single_value''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The value of this property is the name of a function to call to render individual values from this field. || For a multiple field this is called once per value in the list of values. The function should take the following parameters: (&amp;lt;code&amp;gt;$session, $field, $value, $object&amp;lt;/code&amp;gt;). It should return a [[XHTML DOM]] object of the rendered value.&lt;br /&gt;
|- &lt;br /&gt;
| '''render_value''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The value of this property is the name of a function to call to render the the field as a whole.  || As with &amp;lt;tt&amp;gt;render_single_value&amp;lt;/tt&amp;gt;, but this gets passed the entire list of values (an array reference) if it is a multiple field. Parameters passed are: ( code&amp;gt;$session, $self, $value, $all_langs, $no_link, $object&amp;lt;/code&amp;gt; ). &amp;lt;code&amp;gt;$all_langs&amp;lt;/code&amp;gt; indicates that all language variants should be shown and is only really useful for [[Multilang field]]s. &amp;lt;code&amp;gt;$no_link&amp;lt;/code&amp;gt; being true is a request to place no hyperlinks in the resulting HTML. The function should return an [[XHTML DOM]] object of the rendered value.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Input and Validation Properties ===&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''default_value''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The default value to set for this field. || This is mainly used for [[EPrints Glossary#System field|system fields]].  For custom fields it is better to use [[eprint_fields_default.pl]] or similar.&lt;br /&gt;
|-&lt;br /&gt;
| '''expanded_subjects''' || &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; || NO || Subjects to show un-collapsed in the subject tree field in the workflow. || This is only applicable for [[Subject field]]s.  All the fields listed will have their paths in the subject tree expanded so they can be seen, making them easier to find.&lt;br /&gt;
|-&lt;br /&gt;
| '''false_first''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Display the false option before the true option in the input form. || This is only applicable to [[Boolean field]]s.  By default true option is always displayed before the false option.&lt;br /&gt;
|-&lt;br /&gt;
| '''fromform''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The inverse of &amp;lt;tt&amp;gt;toform&amp;lt;/tt&amp;gt;. This takes the value from the form and converts it into the value that will be stored in the database. || This function is passed the parameters: &amp;lt;tt&amp;gt;$value, $session, $object, $basename&amp;lt;/tt&amp;gt; when &amp;lt;tt&amp;gt;$value&amp;lt;/tt&amp;gt; is the value entered on the HTML form, and the return value is the value to be stored in the database. This function is not called when editing the eprint is cancelled.&lt;br /&gt;
|-&lt;br /&gt;
| '''get_item''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || A bespoke function for how to lookup the [[EPrints Glossary#Data object|Data object]] based on the stored value. || Only applicable to [[Itemref field]]s.&lt;br /&gt;
|- &lt;br /&gt;
| '''help_xhtml''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || An [[XHTML DOM]] object to use for the help text for this field. || This can only be set via the [[Workflow Format]] configuration not via the metadata field directly. This is so that the workflow can conditionally change the help on a field.  If you need to change the help text based on the eprint type, then you can just create a bespoke phrase with the format &amp;lt;code&amp;gt;&amp;quot;eprint_fieldhelp_&amp;quot; + fieldname + &amp;quot;.&amp;quot; + eprint_type&amp;lt;/code&amp;gt; (e.g. &amp;lt;code&amp;gt;eprint_fieldhelp_id_number.article&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| '''input_add_boxes''' || &amp;lt;tt&amp;gt;2&amp;lt;/tt&amp;gt; || NO || The number of rows to add when clicking the &amp;lt;tt&amp;gt;More input rows&amp;lt;/tt&amp;gt; button for a field that sets &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt;. || The default value for this property is taken from &amp;lt;tt&amp;gt;cfg.d/[[field_property_defaults.pl]]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|- &lt;br /&gt;
| '''input_boxes''' || &amp;lt;tt&amp;gt;3&amp;lt;/tt&amp;gt; || NO || The number of input rows to initially show for a field that sets &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt;. || The default value for this property is taken from &amp;lt;tt&amp;gt;cfg.d/[[field_property_defaults.pl]]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_cols''' || &amp;lt;tt&amp;gt;60&amp;lt;/tt&amp;gt; || NO || The number of columns in an HTML form field. || The default value for this property is taken from &amp;lt;tt&amp;gt;cfg.d/[[field_property_defaults.pl]]&amp;lt;/tt&amp;gt;.  This in combination with the &amp;lt;tt&amp;gt;maxlength&amp;lt;/tt&amp;gt; property determines the value for &amp;lt;tt&amp;gt;size&amp;lt;/tt&amp;gt; attribute for &amp;lt;code&amp;gt;&amp;lt;input&amp;gt;&amp;lt;/code&amp;gt; HTML fields or the &amp;lt;tt&amp;gt;cols&amp;lt;/tt&amp;gt; attribute for &amp;lt;code&amp;gt;&amp;lt;textarea&amp;gt;&amp;lt;/code&amp;gt; HTML fields (used by [[Longtext field]]s).&lt;br /&gt;
|-&lt;br /&gt;
| '''input_lookup_params''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Additional parameters to pass to the &amp;lt;tt&amp;gt;input_lookup_url&amp;lt;/tt&amp;gt;. || E.g. an indication of which autocomplete file to use.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_lookup_url''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The URL to use for autocompletion. || This is generally set using the workflow configuration rather than directly in the field configuration. The URL must be on the same server hostname as the repository.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_ordered''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether the ordering of values needs to be captured. || In some &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt; fields, such as creators, the order of the values is important and by default numbers are shown to the left of input rows and to the right are ''move up'' and ''move down'' arrows. However, with some &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt; fields the order is not important, in which case you can set this to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; to stop the arrows and numbers being shown.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_rows''' || &amp;lt;tt&amp;gt;10&amp;lt;/tt&amp;gt; || NO || The number of rows in an HTML form field. || The default value for this property is taken from &amp;lt;tt&amp;gt;cfg.d/[[field_property_defaults.pl]]&amp;lt;/tt&amp;gt;  This property determines the value for &amp;lt;tt&amp;gt;size&amp;lt;/tt&amp;gt; attribute for &amp;lt;code&amp;gt;&amp;lt;select&amp;gt;&amp;lt;/code&amp;gt; HTML fields (used by [[Set field]]s)  or the &amp;lt;tt&amp;gt;rows&amp;lt;/tt&amp;gt; attribute for &amp;lt;code&amp;gt;&amp;lt;textarea&amp;gt;&amp;lt;/code&amp;gt;  HTML fields (used by [[Longtext field]]s).&lt;br /&gt;
|-&lt;br /&gt;
| '''maxlength''' || &amp;lt;tt&amp;gt;255&amp;lt;/tt&amp;gt; || NO || The maximum allowed length in characters for a value. || This can be a very simple validation check. Also, it may confuse users to be allowed to type in 255 characters in a field intended for something like a postcode/zipcode.&lt;br /&gt;
|-&lt;br /&gt;
| '''maxwords''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The maximum number of words that should be entered for this field. || This field is only applicable to [[Longtext_counter field]]s.  It does not restrict the number of words, it just displays this limit next to a dynamic counter of the number of words already entered.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_input''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The name of a function which will render the input for this field. || This can be difficult to use as it must return the same CGI parameters as the default input form would have. It is easiest on simple fields. The subroutine is passed the following parameters: &amp;lt;code&amp;gt;$field, $session, $current_value, $dataset, $staff, $hidden_fields, $object, $basename&amp;lt;/code&amp;gt; ). It should return the [[XHTML DOM]] object of the chunk of HTML form.&lt;br /&gt;
|-&lt;br /&gt;
| '''required''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether the field must have a value set. || If this is set to &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; then the field is always marked as required, no matter what the [[Workflow Format]] configuration says.&lt;br /&gt;
|-&lt;br /&gt;
| '''separator''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || What character to use to separate elements of the value for the field for purposes of search || Only used by default for [[Keywords field]]s.&lt;br /&gt;
|-&lt;br /&gt;
| '''show_help''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || How to display the help text for this field in the input form. ||  Can be one of three values: &amp;lt;tt&amp;gt;always&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;never&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;toggle&amp;lt;/tt&amp;gt;.  Toggle (allow to expand or collapse) is used if not explicitly defined.  This can only be overridden in [[Workflow Format]] configuration.&lt;br /&gt;
|-&lt;br /&gt;
| '''title_xhtml''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || An [[XHTML DOM]] object to use for the title for this field. || This can only be set via the [[Workflow Format]] configuration not via the metadata field directly. This is so that the workflow can conditionally change the title of a field.  If you need to change the title based on the eprint type, then you can just create a bespoke phrase with the format &amp;lt;code&amp;gt;&amp;quot;eprint_fieldname_&amp;quot; + fieldname + &amp;quot;.&amp;quot; + eprint_type&amp;lt;/code&amp;gt; (e.g. &amp;lt;code&amp;gt;eprint_fieldname_id_number.article&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| '''toform''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || This function is allowed to modify the current value which appears in the form. || E.g. if your database stores &amp;lt;tt&amp;gt;userid&amp;lt;/tt&amp;gt;s in a field, but you want to allow people to edit them as &amp;lt;tt&amp;gt;username&amp;lt;/tt&amp;gt;s, then this function can be used to take the current value (a &amp;lt;tt&amp;gt;userid&amp;lt;/tt&amp;gt;) and return the associated &amp;lt;tt&amp;gt;username&amp;lt;/tt&amp;gt;. This value is what appears in the field in the search form. It is passed: &amp;lt;code&amp;gt;$value, $session, $object, $basename&amp;lt;/code&amp;gt; and returns the user-facing version of &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ordering, Indexing and Searching ===&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''make_single_value_orderkey''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The &amp;lt;tt&amp;gt;orderkey&amp;lt;/tt&amp;gt; function (potentially language specific) used to order by this field. || This property allows you to define a function or refer to a predefined function to override the default EPrints' orderkey generation. This property is passed each value from multiple fields, in turn. It is passed: &amp;lt;code&amp;gt;$field, $value, $dataset&amp;lt;/code&amp;gt; and returns an &amp;lt;tt&amp;gt;ordervalue&amp;lt;/tt&amp;gt; string.&lt;br /&gt;
|-&lt;br /&gt;
| '''make_value_orderkey''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Like &amp;lt;tt&amp;gt;make_single_value_orderkey&amp;lt;/tt&amp;gt; but this is passed the array reference for a multiple field rather than just single values. || It should return the &amp;lt;tt&amp;gt;orderkey&amp;lt;/tt&amp;gt; string for the entire value. It is passed: &amp;lt;code&amp;gt;$field, $value, $session, $langid, $dataset&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| '''match''' || &amp;lt;tt&amp;gt;EQ&amp;lt;/tt&amp;gt; || NO || How to match the value(s) of this field against search terms. || This property can be &amp;lt;tt&amp;gt;EQ&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;EX&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;IN&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;SET&amp;lt;/tt&amp;gt;.  Default &amp;lt;tt&amp;gt;EQ&amp;lt;/tt&amp;gt; means treat the search term as a single string. Match only whole search term matches the field value (or one of its values if &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt;).  This can be modified for the [[API:EPrints/Search/Field|field in the search form configuration]].&lt;br /&gt;
|-&lt;br /&gt;
| '''merge''' || &amp;lt;tt&amp;gt;ALL&amp;lt;/tt&amp;gt; || NO || Whether this field's values(s) has to match any or all of the search terms || This property can be &amp;lt;tt&amp;gt;ALL&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;ANY&amp;lt;/tt&amp;gt;, Default &amp;lt;tt&amp;gt;ALL&amp;lt;/tt&amp;gt; means all search terms have to match the values(s) in this field. This can be modified for the [[API:EPrints/Search/Field|field in the search form configuration]].  For certain values of &amp;lt;tt&amp;gt;match&amp;lt;/tt&amp;gt; this can also be changed by the user in the search form itself.&lt;br /&gt;
|-&lt;br /&gt;
| '''text_index''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether the indexer considers this field for full-text indexing. || Some types of metadata field have a default of &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt;, e.g. [[Text field]]s and [[Longtext field]]s.&lt;br /&gt;
|-&lt;br /&gt;
| '''search_cols''' || &amp;lt;tt&amp;gt;40&amp;lt;/tt&amp;gt; || NO || How many characters (columns) wide the input field for searching this field. ||  The default value for this property is taken from &amp;lt;tt&amp;gt;cfg.d/[[field_property_defaults.pl]]&amp;lt;/tt&amp;gt;.  If one search field searches more than one field, then the properties from the first field listed are used.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other Properties ===&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''allow_null''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether the value(s) stored in the database when no input is entered should be &amp;lt;tt&amp;gt;NULL&amp;lt;/tt&amp;gt; or an appropriate default value based on its database field type. || This should generally never be set to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; and certainly should not be changed to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; after the field has been added to the database.  You are much better off configuring a default value using &amp;lt;tt&amp;gt;[[eprint_fields_default.pl]]&amp;lt;/tt&amp;gt; or similar.&lt;br /&gt;
|-&lt;br /&gt;
This may be applicable to [[Text field|text]]  &lt;br /&gt;
| '''can_clone''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether the value(s) for this field should be cloned if a new record is created.  || This property is mostly used by system fields such as &amp;lt;tt&amp;gt;dir&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;datestamp&amp;lt;/tt&amp;gt;.  It is applicable when an eprint is cloned using the &amp;lt;tt&amp;gt;Use as template&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;New version&amp;lt;/tt&amp;gt; action buttons.&lt;br /&gt;
|-&lt;br /&gt;
| '''export_as_xml''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether the field value(s) should be exported in an XML export. || This is handy to suppress either confidential or confusing fields, like the &amp;lt;tt&amp;gt;fileinfo&amp;lt;/file&amp;gt; [[EPrints Glossary#System_field|system field]].&lt;br /&gt;
|-&lt;br /&gt;
| '''import''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether new data objects create from an import can set values for the field.  || E.g. &amp;lt;tt&amp;gt;eprintid&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;dir&amp;lt;tt&amp;gt; are determined when the eprint record is created.  Imported metadata would not choose an appropriate value for such fields.&lt;br /&gt;
|-&lt;br /&gt;
| '''replace_core''' ||| &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether the field configuration should replace the exisiting [[EPrints Glossary#Core_field|core (system) field]] with the same &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; || This is useful for particularly bespoke requirements.  It should be used with great care, as system fields are usually hard-coded because they should not be changed.&lt;br /&gt;
|-&lt;br /&gt;
| '''show_in_fieldlist''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether to allow this field to appear in fields lists.  || If set to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; will prevent this field appearing in [[Fields field]] lists.  This is primarily to allow you to remove it from the list of fields in the user configuration which are used to control which fields appear as columns in the Items and Review screens.&lt;br /&gt;
|-&lt;br /&gt;
| '''show_in_html''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether this field is not shown in the [[EPrints Glossary#Details_tab|Details tab]] of the [[EPrints Glossary#EPrint_control_page|eprint control page]]. || This is mostly used to hide confusing internal [[EPrints Glossary#System_field|system field]]s like &amp;lt;tt&amp;gt;dir&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Properties ===&lt;br /&gt;
&lt;br /&gt;
These are set by the system. Editing them by hand will do '''''strange things'''''.&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''confid''' || n/a || YES || The ID of the dataset to which this field belongs. || The value for this property is automatically set when the field is loaded.  It is used to work out what phrase ids etc. it uses.&lt;br /&gt;
|-&lt;br /&gt;
| '''join_path''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || How to join a field that references a different [[Data Object]]. || This should never be defined within a field's configuration.  This is built by search to support building a database query to perform a user's search.&lt;br /&gt;
|-&lt;br /&gt;
| '''parent''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || A reference to the actual parent [[Compound field]] object. || This is set automatically as a reference to the parent field object.&lt;br /&gt;
|-&lt;br /&gt;
| '''parent_name''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The name of the parent [[Compound field]] to which a sub-field belongs. || This is set automatically to be the name of the parent field.&lt;br /&gt;
|-&lt;br /&gt;
| '''provenance''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Where this field configuration was generated. || Typically any field configuration either defined within a [[Data Object|Data object]] or in a configuration file (in a &amp;lt;tt&amp;gt;cfg.d&amp;lt;/tt&amp;gt; directory will leave this as &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; by not specifying this property.  However, fields created using [[Admin/Config._Tools/Manage_Metadata_Fields|Manage Metadata Fields]] will set this to &amp;lt;tt&amp;gt;user&amp;lt;/tt&amp;gt; so it is clear from where this field was created.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Deprecated Properties ===&lt;br /&gt;
&lt;br /&gt;
Do not use these!&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''input_advice_below''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Help text to put directly below the form input field || Deprecated. Defined but no longer functional.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_advice_right''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Help text to put directly to the right of the form input field || Deprecated.  Defined but no longer functional.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_assist''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Provides input assistance. || Deprecated.  Defined but no longer functional.&lt;br /&gt;
|-&lt;br /&gt;
| '''requiredlangs''' || &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; || NO || The natural languages that should be used in the value(s) for this field ||  Deprecated.  Defined but no longer functional.&lt;br /&gt;
|-&lt;br /&gt;
| '''sql_langid''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The language ID for SQL. || Deprecated.  Defined but no longer functional.&lt;br /&gt;
|-&lt;br /&gt;
| '''sql_sorted''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether SQL should be sorted. || Deprecated.  Defined but no longer functional.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Methods ==&lt;br /&gt;
=== Constructor Methods ===&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Exemplar !! Parameters !! Returns !! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''new'''&lt;br /&gt;
||&amp;lt;code&amp;gt;$field = EPrints::MetaField-&amp;gt;new( %properties )&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $class : The sub-class of the new &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; to be created.&lt;br /&gt;
; %properties : A hash of the properties to be used to create this new &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object. Also requires a &amp;lt;code&amp;gt;dataset&amp;lt;/code&amp;gt; attribute to be set or otherwise both &amp;lt;code&amp;gt;confid&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;repository&amp;lt;/code&amp;gt; attributes are required.&lt;br /&gt;
||A new instance of an &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
||Create a new &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; of the appropriate class.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Class Methods ===&lt;br /&gt;
'''TO BE DONE'''&lt;br /&gt;
=== Object Methods ===&lt;br /&gt;
'''TO BE COMPLETED'''&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Exemplar !!Parameters !! Returns !!  Description&lt;br /&gt;
|-&lt;br /&gt;
| '''field_defaults'''&lt;br /&gt;
||&amp;lt;code&amp;gt;$defaults = $field-&amp;gt;field_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
||A hash reference of the default properties for the class of &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; of which this object is an instance.&lt;br /&gt;
||Provides the default properties of this &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|-&lt;br /&gt;
| '''final'''&lt;br /&gt;
||&amp;lt;code&amp;gt;$field-&amp;gt;final&amp;lt;/code&amp;gt;&lt;br /&gt;
|| &lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
||n/a&lt;br /&gt;
||Tells the &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; that it is now read only. Any call to &amp;lt;code&amp;gt;set_property&amp;lt;/code&amp;gt; will produce a abort error.&lt;br /&gt;
|-&lt;br /&gt;
| '''set_property'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$field-&amp;gt;set_property( $property, $value )&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
; $property : The property to be set.&lt;br /&gt;
; $value : The value to set for the &amp;lt;code&amp;gt;$property&amp;lt;/code&amp;gt;.&lt;br /&gt;
||n/a&lt;br /&gt;
||Tells the &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; that it is now read only. Any call to &amp;lt;code&amp;gt;set_property&amp;lt;/code&amp;gt; will produce a abort error.&lt;br /&gt;
|-&lt;br /&gt;
| '''clone'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$newfield = $field-&amp;gt;clone&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
||A new &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object that is a clone of the existing object.&lt;br /&gt;
||Clone the field, so the clone can be edited without affecting the original. Does not deep copy properties which are references - these should be set to new values, rather than the contents altered. E.g. Don't push to a cloned options list, replace it.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| '''repository'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$repository = $field-&amp;gt;repository&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|| The &amp;lt;code&amp;gt;EPrints::Repository&amp;lt;/code&amp;gt; object to which this field belongs.&lt;br /&gt;
|| Get the current repository object.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| '''dataset'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$dataset = $field-&amp;gt;dataset&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;$dataset = $field-&amp;gt;get_dataset&amp;lt;/code&amp;gt;)&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|| The &amp;lt;code&amp;gt;EPrints::DataSet&amp;lt;/code&amp;gt; object to which this field belongs.&lt;br /&gt;
|| Get dataset to which this field belongs.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_name'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$xhtml = $field-&amp;gt;render_name( [ $session ], [ $dataobj] )&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
; $session :  A &amp;lt;code&amp;gt;EPrints::Repository&amp;lt;/code&amp;gt; object. (No longer required but at least a placeholder required if specifying &amp;lt;code&amp;gt;$dataobj&amp;lt;/code&amp;gt;).&lt;br /&gt;
; $dataobj : A data object belong to the &amp;lt;code&amp;gt;$dataset&amp;lt;/code&amp;gt; that has the &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; set for this field.  Only required if you want to use a bespoke phrase based on the type value for the data object, (e.g. &amp;lt;code&amp;gt;&amp;lt;epp:phrase id=&amp;quot;eprint_fieldname_data_type.dataset&amp;quot;&amp;gt;...&amp;lt;/epp:phrase&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
|| A &amp;lt;code&amp;gt;XML::LibXML::DocumentFragment&amp;lt;/code&amp;gt; containing the help text for the field.&lt;br /&gt;
|| Get the help information for a user inputting some data for this field as an XHTML chunk.  Either from a phrase defined for the field or under the field property &amp;lt;code&amp;gt;help_xhtml&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_help'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$xhtml = $field-&amp;gt;render_help&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|| A &amp;lt;code&amp;gt;XML::LibXML::DocumentFragment&amp;lt;/code&amp;gt; containing the help text for the field.&lt;br /&gt;
|| Get the help information for a user inputting some data for this field as an XHTML chunk.  Either from a phrase defined for the field or under the field property &amp;lt;code&amp;gt;help_xhtml&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_input_field'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$xhtml = $field-&amp;gt;render_input_field( $session, $value, $dataset, $staff, $hidden_fields, $obj, $basename, $one_field_component )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
; $session :  A &amp;lt;code&amp;gt;EPrints::Repository&amp;lt;/code&amp;gt; object.&lt;br /&gt;
; $value : The value from the database to be rendered within this field.&lt;br /&gt;
; $dataset : The &amp;lt;code&amp;gt;EPrints::Dataset&amp;lt;/code&amp;gt; to which the field belongs. (Does not always need to be defined) &lt;br /&gt;
; $staff : A boolean (typically &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) for whether the but usually set to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; as this should be managed through a conditional statement in the workflow.&lt;br /&gt;
; $hidden_fields : Extra fields associated with this field but rendered so they cannot be seen by the user (e.g. &amp;lt;code&amp;gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; ... /&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
; $obj : A data object belong to the &amp;lt;code&amp;gt;$dataset&amp;lt;/code&amp;gt; that has the &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; set for this field.&lt;br /&gt;
; $basename : The basename for this field for uses as a prefix when a compound field that contains sub-fields.&lt;br /&gt;
; $one_field_component : A boolean (typically &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) defining whether the workflow component that the field is being rendered has just this field or multiple fields in it.&lt;br /&gt;
|| A &amp;lt;code&amp;gt;XML::LibXML::DocumentFragment&amp;lt;/code&amp;gt; containing an XHTML rendering of the field for input.&lt;br /&gt;
|| Get an XHTML rendering of the field for input.  May be overridden with &amp;lt;code&amp;gt;render_input&amp;lt;/code&amp;gt; property for this field.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utility Methods ===&lt;br /&gt;
'''TO BE DONE'''&lt;br /&gt;
&lt;br /&gt;
=== Deprecated Methods ===&lt;br /&gt;
'''TO BE COMPLETED'''&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Exemplar !!Parameters !! Returns !!  Description&lt;br /&gt;
|-&lt;br /&gt;
| '''display_name'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$dataset = $field-&amp;gt;dataset&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;$dataset = $field-&amp;gt;get_dataset&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
; $session : A &amp;lt;code&amp;gt;EPrints::Repository&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|| The UTF-8 encoded name of this field, in the language of the &amp;lt;code&amp;gt;$session&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|| Get the human-readable name for this field.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Required Phrases ==&lt;br /&gt;
&lt;br /&gt;
These are phrases which you need to define in the local repository phrases file to control how this field renders. Some types of field (eg. [[set field]]s) have additional phrases in addition to the ones listed below.&lt;br /&gt;
&lt;br /&gt;
The actual name of the field, as it will appear to users is stored in &lt;br /&gt;
&lt;br /&gt;
 datasetid + &amp;quot;_fieldname_&amp;quot; + fieldname&lt;br /&gt;
&lt;br /&gt;
The default help to display, when the field is being input, is stored in&lt;br /&gt;
&lt;br /&gt;
 datasetid + &amp;quot;_fieldhelp_&amp;quot; + fieldname&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;epp:phrase id=&amp;quot;eprint_fieldname_abstract&amp;quot;&amp;gt;Abstract&amp;lt;/epp:phrase&amp;gt;&lt;br /&gt;
    &amp;lt;epp:phrase id=&amp;quot;eprint_fieldhelp_abstract&amp;quot;&amp;gt;A summary of the items content. &lt;br /&gt;
       If the item has a formal abstract then that is what should be entered &lt;br /&gt;
       here. No complicated text formatting is possible.&amp;lt;/epp:phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
&lt;br /&gt;
Most fields have a representation in the SQL database using one or more columns. The sub-pages for each field type give the details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
When you request (or set) a value of a metadata field, it is usually handled as a perl scalar (which is a string or number).&lt;br /&gt;
&lt;br /&gt;
ALL values passed around in the API should be encoded in utf-8 or BAD THINGS may happen.&lt;br /&gt;
&lt;br /&gt;
For example,&lt;br /&gt;
&lt;br /&gt;
 $eprint-&amp;gt;set_value( &amp;quot;title&amp;quot;, &amp;quot;For Us, The Living&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
Sets the title to the given string.&lt;br /&gt;
&lt;br /&gt;
 my $foo = $eprint-&amp;gt;get_value( &amp;quot;title&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
Sets $foo to the string of the title, eg. &amp;quot;For Us, The Living&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Multiple Fields ===&lt;br /&gt;
&lt;br /&gt;
If a field is set to multiple, then instead of a single value, a reference to an array of values is used. Eg.&lt;br /&gt;
&lt;br /&gt;
 $eprint-&amp;gt;set_value( &amp;quot;corp_creators&amp;quot;, [ &amp;quot;Jims Research&amp;quot;, &amp;quot;Jones Research ] );&lt;br /&gt;
&lt;br /&gt;
=== Other Exceptions ===&lt;br /&gt;
&lt;br /&gt;
See the specific page for the full details.&lt;br /&gt;
&lt;br /&gt;
* [[name field]]s are represented as a hash of the parts.&lt;br /&gt;
&lt;br /&gt;
* [[compound field]]s do something a bit clever.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Example field definitions that can be copied into an configuration file and edited as appropriates.&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Template:EPrints_Metadata_Fields_Content&amp;diff=17049</id>
		<title>Template:EPrints Metadata Fields Content</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Template:EPrints_Metadata_Fields_Content&amp;diff=17049"/>
		<updated>2026-04-30T12:48:26Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* Object Methods */ Added more object methods&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Metadata Field Types ==&lt;br /&gt;
&lt;br /&gt;
There are many different types of metadata field. The type controls how a field is rendered, indexed, searched and so forth. A field always has a type and a name property, and usually has several more. Most properties are documented on this page, but some properties are only available to certain types of field, and they are listed on the page for that field. &lt;br /&gt;
&lt;br /&gt;
Some of these subclasses provide very rich features, others very simple. For example the [[url field]] works just like the text field except that it's only valid if it looks like a url and when rendered it is a hyper-link.&lt;br /&gt;
&lt;br /&gt;
A metadata field describes one field of data in one type of [[Data Object]]. For example the &amp;quot;title&amp;quot; field of an [[EPrint Object]] or the &amp;quot;email&amp;quot; field in a [[User Object]]. &lt;br /&gt;
&lt;br /&gt;
Every [[Data Object]] has system fields (which are set by the system, and not alterable), but the [[User Object]] and [[EPrint Object]] have additional fields which are configured on a per-repository basis.&lt;br /&gt;
&lt;br /&gt;
These can be customised in the [[user_fields.pl]] and [[eprint_fields.pl]] files. Note that changing these files does not automatically modify the underlying database so should (generally) only be done before the database is created. Some metadata properties do not affect the database, and are marked as such. &lt;br /&gt;
&lt;br /&gt;
If you add or remove fields, or modify a property which affects the database then you'll need to alter the database to match.  In 3.0 this must be done by hand, but we have plans to build a tool to do this for you.&lt;br /&gt;
&lt;br /&gt;
== Inheritance ==&lt;br /&gt;
&lt;br /&gt;
This is the list of ''useful'' field types. Under it is listed the other field types which are just included for completeness and are not intended to be used as part of the configuration.&lt;br /&gt;
&lt;br /&gt;
Some field types inherit the properties of another, and then modify them in some way. For example the [[namedset field]] works like a [[set field]] except that it gets its options from a namedsets file not from the options=&amp;gt;[] in the field properties.&lt;br /&gt;
&lt;br /&gt;
* '''Basic metadata field''' - this is abstract, fields must be one of the types listed below...&lt;br /&gt;
** '''[[Boolean field|Boolean]]''' - TRUE or FALSE (or can be unset, of course).&lt;br /&gt;
** '''[[Compound field|Compound]]''' - virtual field, joins together several &amp;quot;multiple&amp;quot; fields, e.g. author_name and author_email.&lt;br /&gt;
*** '''[[Dataobjref field|Dataobjref]]''' - references another data object.&lt;br /&gt;
*** '''[[Multilang field|Multilang]]''' - allows language variants of a field, e.g. titles in French, German and/or English.&lt;br /&gt;
*** '''[[Relation field|Relation]]''' - stores a typed relationship with something represented by a URI.&lt;br /&gt;
** '''[[Date field|Date]]''' - stores a date&lt;br /&gt;
*** '''[[Time field|Time]]''' - stores a date and time&lt;br /&gt;
**** '''[[Timestamp field|Timestamp]]''' - stores current date and time&lt;br /&gt;
** '''[[Float field|Float]]''' - stores a floating-point value&lt;br /&gt;
*** '''[[Decimal field|Decimal]]''' - stores a decimal number.  Specifying the length of number before and after the decimal point.&lt;br /&gt;
** '''[[Id field|Id]]''' - like basic text field but search only finds exact matches&lt;br /&gt;
*** '''[[Idci field|Id (case-insensive)]]''' - like Id field but search find exact matches ignoring case (use for usernames, email addresses, etc.)&lt;br /&gt;
**** '''[[Email field|Email]]''' - an email address&lt;br /&gt;
*** '''[[Keywords field|Keywords]]''' - stores as longtext but searchable as exact individual keyword phrases&lt;br /&gt;
*** '''[[Recaptcha field|Recaptcha]]''' - virtual field to display a reCAPTCHA to prevent spamming of public input forms.&lt;br /&gt;
*** '''[[Text field|Text]]''' - the basic text field. Maximum 255 bytes. nb. uft-8 means some chars take more than one byte.&lt;br /&gt;
**** '''[[Longtext field|Longtext]]''' - like text but allows much longer text (65,000 bytes).&lt;br /&gt;
***** '''[[Longtext_counter field|Longtext counter]]''' - like longtext but with a word counter (requires [https://jquery.com/download/ jQuery])&lt;br /&gt;
**** '''[[Pagerange field|Pagerange]]''' - a range of page from one number to another.&lt;br /&gt;
**** '''[[Secret field|Secret]]''' - used to store passwords and other secrets.&lt;br /&gt;
**** '''[[Set field|Set]]''' - a limited set of options&lt;br /&gt;
***** '''[[Namedset field|Namedset]]''' - like a normal set, but takes its options from a [[namedset]] configuration file.&lt;br /&gt;
***** '''[[Subject field|Subject]]''' - possible values are taken from the [[Subject Object|Subject]] hierarchy. &lt;br /&gt;
***** '''[[Base64 field|Base64]]''' - stores Base64 encoded data.&lt;br /&gt;
****** '''[[Image field|Image]]''' - stores image encoded in Base64 data.&lt;br /&gt;
*** '''[[Url field|Url]]''' - stores a URL.&lt;br /&gt;
*** '''[[Uuid field|Uuid]]''' - stores a UUID.&lt;br /&gt;
** '''[[Int field|Int]]''' - an integer value&lt;br /&gt;
*** '''[[Bigint field|Bigint]]''' - a large integer value (can be greater than 2,147,483,647 or less than -2,147,483.647).&lt;br /&gt;
*** '''[[Counter field|Counter]]''' - an auto-incrementing integer value.&lt;br /&gt;
*** '''[[Itemref field|Itemref]]''' - a reference to another [[Data Object]] (e.g. a user or other eprint)&lt;br /&gt;
*** '''[[Pagerange field|Pagerange]]''' - a pagerange, e.g. 122-130&lt;br /&gt;
** '''[[Multipart field|Multipart]]''' - Stores a mutiple sub-fields like a person's name.&lt;br /&gt;
*** '''[[Name field|Name]]''' - Stores a person's name broken up into logical parts.&lt;br /&gt;
** '''[[Subobject field|Subobject]]''' - Stores another data object under a parent data object.&lt;br /&gt;
&lt;br /&gt;
=== Internal-use and Deprecated Field Types ===&lt;br /&gt;
* '''Basic metadata field'''&lt;br /&gt;
** '''[[File field|File]]''' - '''DEPRECATED'''.  Use [[Subobject field]] instead.&lt;br /&gt;
** '''Id''' &lt;br /&gt;
*** '''Text'''&lt;br /&gt;
**** '''Set'''&lt;br /&gt;
***** '''[[Arclanguage field|Arclanguage]]''' - as for set, but the options are the valid languages of this repository.  Probably better to use [[Multilang field]].&lt;br /&gt;
***** '''[[Fields field|Fields]]''' - as for set, but the options are the fields in a dataset.&lt;br /&gt;
***** '''[[Langid field|Langid]]''' - used internally by [[Multilang field]]s to store the language ID.&lt;br /&gt;
**** '''Longtext'''&lt;br /&gt;
***** '''[[Search field|Search]]''' - a serialised search &lt;br /&gt;
** '''Int'''&lt;br /&gt;
*** '''[[Year field|Year]]''' - '''DEPRECATED'''.  Use [[Date field]] instead.&lt;br /&gt;
** '''[[Storable field|Storable]]''' - Stores a serialization of a Perl data structure.&lt;br /&gt;
&lt;br /&gt;
== Properties ==&lt;br /&gt;
&lt;br /&gt;
Note that true/false properties use 1 and 0 to indicate their setting.&lt;br /&gt;
&lt;br /&gt;
Some properties can be temporarily set or overridden by the [[Workflow Format]] and [[Citation Format]] files.&lt;br /&gt;
&lt;br /&gt;
=== Core Properties ===&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''name''' || n/a || YES || This is the internal name of the field. It should only contain alphanumeric characters and underscores. It will be used to identify this field in scripts, other configuration files, in the database, and in the XML export/import system, etc. ||  This property is ''not'' required when defining sub-fields of [[Compound field]]s where &amp;lt;tt&amp;gt;sub_name&amp;lt;/tt&amp;gt; should be used. This property affects the database structure.  It must be unique within the [[Data Object]] (so the [[EPrint Object]] cannot have two fields called &amp;lt;tt&amp;gt;email&amp;lt;/tt&amp;gt; but the EPrint Object and [[User Object]] can each have a field with the same name.&lt;br /&gt;
|-&lt;br /&gt;
| '''type''' || n/a || YES || This sets the type of the metafield, which in turn affects what other properties it may have. || This property affects the database structure.  The value must be one of the metafield types listed above.&lt;br /&gt;
|-&lt;br /&gt;
| '''multiple''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || This indicates if this field is a single value or a list of values. E.g. &amp;lt;tt&amp;gt;title&amp;lt;/tt&amp;gt; is only a single [[Longtext field]] but &amp;lt;tt&amp;gt;creators&amp;lt;/tt&amp;gt; is a multiple [[Compound field]]. || This property affects the database structure. In the database a non-multiple field is stored in one (or more) columns in the main object table, but a multiple field gets its own table.&lt;br /&gt;
|-&lt;br /&gt;
| '''readonly''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether to not make this field editable in the workflow. || This is useful if you want to display the pre-generated value(s) for this field for reference whilst other fields are being edited.&lt;br /&gt;
|-&lt;br /&gt;
| '''sql_index''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || When the database is created this field indicates that an SQL index should be created to speed searching. || This property affects the database structure. Different field types override the default value with the sensible option for that type of field. It is not worth putting a SQL index on a field that is only ever searched for words in it (like title or abstract) but it is worth indexing fields who's values are explicitly searched for, or where ranges are searched (e.g. [[Date field]]s, [[Set field]]s etc.). It is unlikely you will need to set this by hand. You could change it after the database has been created but this will not update the database nor have any other effect.&lt;br /&gt;
|- &lt;br /&gt;
| '''sub_name''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || YES || This is a special property which is required ''instead'' of the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; property for the sub-fields inside [[Compound field]]s.  || This property affects the database structure. The actual name of these fields is then forced to be parent field &amp;lt;tt&amp;gt;name + '_' + sub_name&amp;lt;/tt&amp;gt;. E.g.  Compound field &amp;lt;tt&amp;gt;creators&amp;lt;/tt&amp;gt; is a sub-field with &amp;lt;tt&amp;gt;sub_name =&amp;gt; 'name'&amp;lt;/tt&amp;gt;. In this case the actual name of the name field in the system, database etc. is &amp;lt;tt&amp;gt;creators_name/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| '''virtual''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether this field calculates a value or stores in in the database. || [[Compound field]]s are virtual fields, whereas there sub-fields are not as they store values in the database.  Other types of virtual field will require a &amp;lt;tt&amp;gt;render_value&amp;lt;/tt&amp;gt; to be specified, as with no value stored the default render method will have nothing to display.&lt;br /&gt;
|-&lt;br /&gt;
| '''volatile''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether the field is liable to change frequently. || Setting &amp;lt;code&amp;gt;volatile =&amp;gt; 1&amp;lt;/code&amp;gt; will prevent new revisions being create and avoid other post commit events from being triggered, such as re-indexing.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rendering Properties ===&lt;br /&gt;
&lt;br /&gt;
These properties affect how values of the metadata in this field are rendered.&lt;br /&gt;
&lt;br /&gt;
Certain of these properties can be turned on temporarily by the [[Citation Format]] files - render_magicstop for example.&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''as_list''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Whether to display a collection sub-fields values as a table row or a separate list in the input form || This is only applicable for [[Compound field]]s that have &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt;.  It is useful where the length of the table row would exceed the width of a typical user's window.&lt;br /&gt;
|-&lt;br /&gt;
| '''browse_link''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || This is the name of a view which values of this field should be linked to. || E.g. if there was a &amp;lt;tt&amp;gt;Browse by Publishers&amp;lt;/tt&amp;gt; view configured named &amp;lt;tt&amp;gt;pubs&amp;lt;/tt&amp;gt;, then adding &amp;lt;code&amp;gt;browse_link =&amp;gt; 'pubs'&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;publisher&amp;lt;/tt&amp;gt; field would cause it to be linked into the browse view page for the named publisher whenever it is rendered.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_custom''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Whether to use a pre-defined way of rendering the value for this field. || E.g. for [[Name field]]s by default the name will link to the creators browse view for that name.  This property can be re-used within bespoke render functions to specify whether some custom way of rendering this field' svalue (e.g. with a link) should be used.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_dont_link''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether rendered field is not encapsulated in a hyperlink. || Currently only affects [[Url field]]s and [[Email field]]s.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_dynamic''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether the rendering of this field can use JavaScript to make it dynamic. || [[limit_names_shown.pl]] uses this property to determine if the list of hidden creators/editors can be expanded to show all creators/editors.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_limit''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || How many values for this field should be displayed. || [[limit_names_shown.pl]] uses this property to determine how many creators/editors to display.  If &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; just render all values.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_magicstop''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether to render a full stop at the end of this field, unless the last character is a dot, question mark or exclamation mark. || This helps avoid the ugly &amp;lt;tt&amp;gt;World without Cheese?.&amp;lt;/tt&amp;gt; effect you get when titles end in &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;!&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_noreturn''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether CR (Carriage Return) and LF (Line Feed) characters are turned into normal spaces. ||&lt;br /&gt;
|-&lt;br /&gt;
| '''render_quiet''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether to prevent a big ugly &amp;lt;tt&amp;gt;UNSPECIFIED&amp;lt;/tt&amp;gt; being rendered if field is unset. || E.g. setting &amp;lt;code&amp;gt;render_quiet =&amp;gt; 1&amp;lt;/code&amp;gt; on a field means it just gets rendered as nothing if it is unset.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_single_value''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The value of this property is the name of a function to call to render individual values from this field. || For a multiple field this is called once per value in the list of values. The function should take the following parameters: (&amp;lt;code&amp;gt;$session, $field, $value, $object&amp;lt;/code&amp;gt;). It should return a [[XHTML DOM]] object of the rendered value.&lt;br /&gt;
|- &lt;br /&gt;
| '''render_value''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The value of this property is the name of a function to call to render the the field as a whole.  || As with &amp;lt;tt&amp;gt;render_single_value&amp;lt;/tt&amp;gt;, but this gets passed the entire list of values (an array reference) if it is a multiple field. Parameters passed are: ( code&amp;gt;$session, $self, $value, $all_langs, $no_link, $object&amp;lt;/code&amp;gt; ). &amp;lt;code&amp;gt;$all_langs&amp;lt;/code&amp;gt; indicates that all language variants should be shown and is only really useful for [[Multilang field]]s. &amp;lt;code&amp;gt;$no_link&amp;lt;/code&amp;gt; being true is a request to place no hyperlinks in the resulting HTML. The function should return an [[XHTML DOM]] object of the rendered value.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Input and Validation Properties ===&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''default_value''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The default value to set for this field. || This is mainly used for [[EPrints Glossary#System field|system fields]].  For custom fields it is better to use [[eprint_fields_default.pl]] or similar.&lt;br /&gt;
|-&lt;br /&gt;
| '''expanded_subjects''' || &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; || NO || Subjects to show un-collapsed in the subject tree field in the workflow. || This is only applicable for [[Subject field]]s.  All the fields listed will have their paths in the subject tree expanded so they can be seen, making them easier to find.&lt;br /&gt;
|-&lt;br /&gt;
| '''false_first''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Display the false option before the true option in the input form. || This is only applicable to [[Boolean field]]s.  By default true option is always displayed before the false option.&lt;br /&gt;
|-&lt;br /&gt;
| '''fromform''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The inverse of &amp;lt;tt&amp;gt;toform&amp;lt;/tt&amp;gt;. This takes the value from the form and converts it into the value that will be stored in the database. || This function is passed the parameters: &amp;lt;tt&amp;gt;$value, $session, $object, $basename&amp;lt;/tt&amp;gt; when &amp;lt;tt&amp;gt;$value&amp;lt;/tt&amp;gt; is the value entered on the HTML form, and the return value is the value to be stored in the database. This function is not called when editing the eprint is cancelled.&lt;br /&gt;
|-&lt;br /&gt;
| '''get_item''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || A bespoke function for how to lookup the [[EPrints Glossary#Data object|Data object]] based on the stored value. || Only applicable to [[Itemref field]]s.&lt;br /&gt;
|- &lt;br /&gt;
| '''help_xhtml''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || An [[XHTML DOM]] object to use for the help text for this field. || This can only be set via the [[Workflow Format]] configuration not via the metadata field directly. This is so that the workflow can conditionally change the help on a field.  If you need to change the help text based on the eprint type, then you can just create a bespoke phrase with the format &amp;lt;code&amp;gt;&amp;quot;eprint_fieldhelp_&amp;quot; + fieldname + &amp;quot;.&amp;quot; + eprint_type&amp;lt;/code&amp;gt; (e.g. &amp;lt;code&amp;gt;eprint_fieldhelp_id_number.article&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| '''input_add_boxes''' || &amp;lt;tt&amp;gt;2&amp;lt;/tt&amp;gt; || NO || The number of rows to add when clicking the &amp;lt;tt&amp;gt;More input rows&amp;lt;/tt&amp;gt; button for a field that sets &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt;. || The default value for this property is taken from &amp;lt;tt&amp;gt;cfg.d/[[field_property_defaults.pl]]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|- &lt;br /&gt;
| '''input_boxes''' || &amp;lt;tt&amp;gt;3&amp;lt;/tt&amp;gt; || NO || The number of input rows to initially show for a field that sets &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt;. || The default value for this property is taken from &amp;lt;tt&amp;gt;cfg.d/[[field_property_defaults.pl]]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_cols''' || &amp;lt;tt&amp;gt;60&amp;lt;/tt&amp;gt; || NO || The number of columns in an HTML form field. || The default value for this property is taken from &amp;lt;tt&amp;gt;cfg.d/[[field_property_defaults.pl]]&amp;lt;/tt&amp;gt;.  This in combination with the &amp;lt;tt&amp;gt;maxlength&amp;lt;/tt&amp;gt; property determines the value for &amp;lt;tt&amp;gt;size&amp;lt;/tt&amp;gt; attribute for &amp;lt;code&amp;gt;&amp;lt;input&amp;gt;&amp;lt;/code&amp;gt; HTML fields or the &amp;lt;tt&amp;gt;cols&amp;lt;/tt&amp;gt; attribute for &amp;lt;code&amp;gt;&amp;lt;textarea&amp;gt;&amp;lt;/code&amp;gt; HTML fields (used by [[Longtext field]]s).&lt;br /&gt;
|-&lt;br /&gt;
| '''input_lookup_params''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Additional parameters to pass to the &amp;lt;tt&amp;gt;input_lookup_url&amp;lt;/tt&amp;gt;. || E.g. an indication of which autocomplete file to use.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_lookup_url''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The URL to use for autocompletion. || This is generally set using the workflow configuration rather than directly in the field configuration. The URL must be on the same server hostname as the repository.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_ordered''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether the ordering of values needs to be captured. || In some &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt; fields, such as creators, the order of the values is important and by default numbers are shown to the left of input rows and to the right are ''move up'' and ''move down'' arrows. However, with some &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt; fields the order is not important, in which case you can set this to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; to stop the arrows and numbers being shown.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_rows''' || &amp;lt;tt&amp;gt;10&amp;lt;/tt&amp;gt; || NO || The number of rows in an HTML form field. || The default value for this property is taken from &amp;lt;tt&amp;gt;cfg.d/[[field_property_defaults.pl]]&amp;lt;/tt&amp;gt;  This property determines the value for &amp;lt;tt&amp;gt;size&amp;lt;/tt&amp;gt; attribute for &amp;lt;code&amp;gt;&amp;lt;select&amp;gt;&amp;lt;/code&amp;gt; HTML fields (used by [[Set field]]s)  or the &amp;lt;tt&amp;gt;rows&amp;lt;/tt&amp;gt; attribute for &amp;lt;code&amp;gt;&amp;lt;textarea&amp;gt;&amp;lt;/code&amp;gt;  HTML fields (used by [[Longtext field]]s).&lt;br /&gt;
|-&lt;br /&gt;
| '''maxlength''' || &amp;lt;tt&amp;gt;255&amp;lt;/tt&amp;gt; || NO || The maximum allowed length in characters for a value. || This can be a very simple validation check. Also, it may confuse users to be allowed to type in 255 characters in a field intended for something like a postcode/zipcode.&lt;br /&gt;
|-&lt;br /&gt;
| '''maxwords''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The maximum number of words that should be entered for this field. || This field is only applicable to [[Longtext_counter field]]s.  It does not restrict the number of words, it just displays this limit next to a dynamic counter of the number of words already entered.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_input''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The name of a function which will render the input for this field. || This can be difficult to use as it must return the same CGI parameters as the default input form would have. It is easiest on simple fields. The subroutine is passed the following parameters: &amp;lt;code&amp;gt;$field, $session, $current_value, $dataset, $staff, $hidden_fields, $object, $basename&amp;lt;/code&amp;gt; ). It should return the [[XHTML DOM]] object of the chunk of HTML form.&lt;br /&gt;
|-&lt;br /&gt;
| '''required''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether the field must have a value set. || If this is set to &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; then the field is always marked as required, no matter what the [[Workflow Format]] configuration says.&lt;br /&gt;
|-&lt;br /&gt;
| '''separator''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || What character to use to separate elements of the value for the field for purposes of search || Only used by default for [[Keywords field]]s.&lt;br /&gt;
|-&lt;br /&gt;
| '''show_help''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || How to display the help text for this field in the input form. ||  Can be one of three values: &amp;lt;tt&amp;gt;always&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;never&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;toggle&amp;lt;/tt&amp;gt;.  Toggle (allow to expand or collapse) is used if not explicitly defined.  This can only be overridden in [[Workflow Format]] configuration.&lt;br /&gt;
|-&lt;br /&gt;
| '''title_xhtml''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || An [[XHTML DOM]] object to use for the title for this field. || This can only be set via the [[Workflow Format]] configuration not via the metadata field directly. This is so that the workflow can conditionally change the title of a field.  If you need to change the title based on the eprint type, then you can just create a bespoke phrase with the format &amp;lt;code&amp;gt;&amp;quot;eprint_fieldname_&amp;quot; + fieldname + &amp;quot;.&amp;quot; + eprint_type&amp;lt;/code&amp;gt; (e.g. &amp;lt;code&amp;gt;eprint_fieldname_id_number.article&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| '''toform''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || This function is allowed to modify the current value which appears in the form. || E.g. if your database stores &amp;lt;tt&amp;gt;userid&amp;lt;/tt&amp;gt;s in a field, but you want to allow people to edit them as &amp;lt;tt&amp;gt;username&amp;lt;/tt&amp;gt;s, then this function can be used to take the current value (a &amp;lt;tt&amp;gt;userid&amp;lt;/tt&amp;gt;) and return the associated &amp;lt;tt&amp;gt;username&amp;lt;/tt&amp;gt;. This value is what appears in the field in the search form. It is passed: &amp;lt;code&amp;gt;$value, $session, $object, $basename&amp;lt;/code&amp;gt; and returns the user-facing version of &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ordering, Indexing and Searching ===&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''make_single_value_orderkey''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The &amp;lt;tt&amp;gt;orderkey&amp;lt;/tt&amp;gt; function (potentially language specific) used to order by this field. || This property allows you to define a function or refer to a predefined function to override the default EPrints' orderkey generation. This property is passed each value from multiple fields, in turn. It is passed: &amp;lt;code&amp;gt;$field, $value, $dataset&amp;lt;/code&amp;gt; and returns an &amp;lt;tt&amp;gt;ordervalue&amp;lt;/tt&amp;gt; string.&lt;br /&gt;
|-&lt;br /&gt;
| '''make_value_orderkey''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Like &amp;lt;tt&amp;gt;make_single_value_orderkey&amp;lt;/tt&amp;gt; but this is passed the array reference for a multiple field rather than just single values. || It should return the &amp;lt;tt&amp;gt;orderkey&amp;lt;/tt&amp;gt; string for the entire value. It is passed: &amp;lt;code&amp;gt;$field, $value, $session, $langid, $dataset&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| '''match''' || &amp;lt;tt&amp;gt;EQ&amp;lt;/tt&amp;gt; || NO || How to match the value(s) of this field against search terms. || This property can be &amp;lt;tt&amp;gt;EQ&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;EX&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;IN&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;SET&amp;lt;/tt&amp;gt;.  Default &amp;lt;tt&amp;gt;EQ&amp;lt;/tt&amp;gt; means treat the search term as a single string. Match only whole search term matches the field value (or one of its values if &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt;).  This can be modified for the [[API:EPrints/Search/Field|field in the search form configuration]].&lt;br /&gt;
|-&lt;br /&gt;
| '''merge''' || &amp;lt;tt&amp;gt;ALL&amp;lt;/tt&amp;gt; || NO || Whether this field's values(s) has to match any or all of the search terms || This property can be &amp;lt;tt&amp;gt;ALL&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;ANY&amp;lt;/tt&amp;gt;, Default &amp;lt;tt&amp;gt;ALL&amp;lt;/tt&amp;gt; means all search terms have to match the values(s) in this field. This can be modified for the [[API:EPrints/Search/Field|field in the search form configuration]].  For certain values of &amp;lt;tt&amp;gt;match&amp;lt;/tt&amp;gt; this can also be changed by the user in the search form itself.&lt;br /&gt;
|-&lt;br /&gt;
| '''text_index''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether the indexer considers this field for full-text indexing. || Some types of metadata field have a default of &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt;, e.g. [[Text field]]s and [[Longtext field]]s.&lt;br /&gt;
|-&lt;br /&gt;
| '''search_cols''' || &amp;lt;tt&amp;gt;40&amp;lt;/tt&amp;gt; || NO || How many characters (columns) wide the input field for searching this field. ||  The default value for this property is taken from &amp;lt;tt&amp;gt;cfg.d/[[field_property_defaults.pl]]&amp;lt;/tt&amp;gt;.  If one search field searches more than one field, then the properties from the first field listed are used.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other Properties ===&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''allow_null''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether the value(s) stored in the database when no input is entered should be &amp;lt;tt&amp;gt;NULL&amp;lt;/tt&amp;gt; or an appropriate default value based on its database field type. || This should generally never be set to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; and certainly should not be changed to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; after the field has been added to the database.  You are much better off configuring a default value using &amp;lt;tt&amp;gt;[[eprint_fields_default.pl]]&amp;lt;/tt&amp;gt; or similar.&lt;br /&gt;
|-&lt;br /&gt;
This may be applicable to [[Text field|text]]  &lt;br /&gt;
| '''can_clone''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether the value(s) for this field should be cloned if a new record is created.  || This property is mostly used by system fields such as &amp;lt;tt&amp;gt;dir&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;datestamp&amp;lt;/tt&amp;gt;.  It is applicable when an eprint is cloned using the &amp;lt;tt&amp;gt;Use as template&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;New version&amp;lt;/tt&amp;gt; action buttons.&lt;br /&gt;
|-&lt;br /&gt;
| '''export_as_xml''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether the field value(s) should be exported in an XML export. || This is handy to suppress either confidential or confusing fields, like the &amp;lt;tt&amp;gt;fileinfo&amp;lt;/file&amp;gt; [[EPrints Glossary#System_field|system field]].&lt;br /&gt;
|-&lt;br /&gt;
| '''import''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether new data objects create from an import can set values for the field.  || E.g. &amp;lt;tt&amp;gt;eprintid&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;dir&amp;lt;tt&amp;gt; are determined when the eprint record is created.  Imported metadata would not choose an appropriate value for such fields.&lt;br /&gt;
|-&lt;br /&gt;
| '''replace_core''' ||| &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether the field configuration should replace the exisiting [[EPrints Glossary#Core_field|core (system) field]] with the same &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; || This is useful for particularly bespoke requirements.  It should be used with great care, as system fields are usually hard-coded because they should not be changed.&lt;br /&gt;
|-&lt;br /&gt;
| '''show_in_fieldlist''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether to allow this field to appear in fields lists.  || If set to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; will prevent this field appearing in [[Fields field]] lists.  This is primarily to allow you to remove it from the list of fields in the user configuration which are used to control which fields appear as columns in the Items and Review screens.&lt;br /&gt;
|-&lt;br /&gt;
| '''show_in_html''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether this field is not shown in the [[EPrints Glossary#Details_tab|Details tab]] of the [[EPrints Glossary#EPrint_control_page|eprint control page]]. || This is mostly used to hide confusing internal [[EPrints Glossary#System_field|system field]]s like &amp;lt;tt&amp;gt;dir&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Properties ===&lt;br /&gt;
&lt;br /&gt;
These are set by the system. Editing them by hand will do '''''strange things'''''.&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''confid''' || n/a || YES || The ID of the dataset to which this field belongs. || The value for this property is automatically set when the field is loaded.  It is used to work out what phrase ids etc. it uses.&lt;br /&gt;
|-&lt;br /&gt;
| '''join_path''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || How to join a field that references a different [[Data Object]]. || This should never be defined within a field's configuration.  This is built by search to support building a database query to perform a user's search.&lt;br /&gt;
|-&lt;br /&gt;
| '''parent''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || A reference to the actual parent [[Compound field]] object. || This is set automatically as a reference to the parent field object.&lt;br /&gt;
|-&lt;br /&gt;
| '''parent_name''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The name of the parent [[Compound field]] to which a sub-field belongs. || This is set automatically to be the name of the parent field.&lt;br /&gt;
|-&lt;br /&gt;
| '''provenance''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Where this field configuration was generated. || Typically any field configuration either defined within a [[Data Object|Data object]] or in a configuration file (in a &amp;lt;tt&amp;gt;cfg.d&amp;lt;/tt&amp;gt; directory will leave this as &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; by not specifying this property.  However, fields created using [[Admin/Config._Tools/Manage_Metadata_Fields|Manage Metadata Fields]] will set this to &amp;lt;tt&amp;gt;user&amp;lt;/tt&amp;gt; so it is clear from where this field was created.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Deprecated Properties ===&lt;br /&gt;
&lt;br /&gt;
Do not use these!&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''input_advice_below''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Help text to put directly below the form input field || Deprecated. Defined but no longer functional.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_advice_right''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Help text to put directly to the right of the form input field || Deprecated.  Defined but no longer functional.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_assist''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Provides input assistance. || Deprecated.  Defined but no longer functional.&lt;br /&gt;
|-&lt;br /&gt;
| '''requiredlangs''' || &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; || NO || The natural languages that should be used in the value(s) for this field ||  Deprecated.  Defined but no longer functional.&lt;br /&gt;
|-&lt;br /&gt;
| '''sql_langid''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The language ID for SQL. || Deprecated.  Defined but no longer functional.&lt;br /&gt;
|-&lt;br /&gt;
| '''sql_sorted''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether SQL should be sorted. || Deprecated.  Defined but no longer functional.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Methods ==&lt;br /&gt;
=== Constructor Methods ===&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Exemplar !! Parameters !! Returns !! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''new'''&lt;br /&gt;
||&amp;lt;code&amp;gt;$field = EPrints::MetaField-&amp;gt;new( %properties )&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $class : The sub-class of the new &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; to be created.&lt;br /&gt;
; %properties : A hash of the properties to be used to create this new &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object. Also requires a &amp;lt;code&amp;gt;dataset&amp;lt;/code&amp;gt; attribute to be set or otherwise both &amp;lt;code&amp;gt;confid&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;repository&amp;lt;/code&amp;gt; attributes are required.&lt;br /&gt;
||A new instance of an &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
||Create a new &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; of the appropriate class.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Class Methods ===&lt;br /&gt;
'''TO BE DONE'''&lt;br /&gt;
=== Object Methods ===&lt;br /&gt;
'''TO BE COMPLETED'''&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Exemplar !!Parameters !! Returns !!  Description&lt;br /&gt;
|-&lt;br /&gt;
| '''field_defaults'''&lt;br /&gt;
||&amp;lt;code&amp;gt;$defaults = $field-&amp;gt;field_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
||A hash reference of the default properties for the class of &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; of which this object is an instance.&lt;br /&gt;
||Provides the default properties of this &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|-&lt;br /&gt;
| '''final'''&lt;br /&gt;
||&amp;lt;code&amp;gt;$field-&amp;gt;final&amp;lt;/code&amp;gt;&lt;br /&gt;
|| &lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
||n/a&lt;br /&gt;
||Tells the &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; that it is now read only. Any call to &amp;lt;code&amp;gt;set_property&amp;lt;/code&amp;gt; will produce a abort error.&lt;br /&gt;
|-&lt;br /&gt;
| '''set_property'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$field-&amp;gt;set_property( $property, $value )&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
; $property : The property to be set.&lt;br /&gt;
; $value : The value to set for the &amp;lt;code&amp;gt;$property&amp;lt;/code&amp;gt;.&lt;br /&gt;
||n/a&lt;br /&gt;
||Tells the &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; that it is now read only. Any call to &amp;lt;code&amp;gt;set_property&amp;lt;/code&amp;gt; will produce a abort error.&lt;br /&gt;
|-&lt;br /&gt;
| '''clone'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$newfield = $field-&amp;gt;clone&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
||A new &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object that is a clone of the existing object.&lt;br /&gt;
||Clone the field, so the clone can be edited without affecting the original. Does not deep copy properties which are references - these should be set to new values, rather than the contents altered. E.g. Don't push to a cloned options list, replace it.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| '''repository'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$repository = $field-&amp;gt;repository&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|| The &amp;lt;code&amp;gt;EPrints::Repository&amp;lt;/code&amp;gt; object to which this field belongs.&lt;br /&gt;
|| Get the current repository object.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| '''dataset'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$dataset = $field-&amp;gt;dataset&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;$dataset = $field-&amp;gt;get_dataset&amp;lt;/code&amp;gt;)&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|| The &amp;lt;code&amp;gt;EPrints::DataSet&amp;lt;/code&amp;gt; object to which this field belongs.&lt;br /&gt;
|| Get dataset to which this field belongs.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_help'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$xhtml = $field-&amp;gt;render_help&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|| A &amp;lt;code&amp;gt;XML::LibXML::DocumentFragment&amp;lt;/code&amp;gt; containing the help text for the field.&lt;br /&gt;
|| Get the help information for a user inputting some data for this field as an XHTML chunk.  Either from a phrase defined for the field or under the field property &amp;lt;code&amp;gt;help_xhtml&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_input_field'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$xhtml = $field-&amp;gt;render_input_field( $session, $value, $dataset, $staff, $hidden_fields, $obj, $basename, $one_field_component )&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
; $session :  A &amp;lt;code&amp;gt;EPrints::Repository&amp;lt;/code&amp;gt; object.&lt;br /&gt;
; $value : The value from the database to be rendered within this field.&lt;br /&gt;
; $dataset : The &amp;lt;code&amp;gt;EPrints::Dataset&amp;lt;/code&amp;gt; to which the field belongs. (Does not always need to be defined) &lt;br /&gt;
; $staff : A boolean (typically &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) for whether the but usually set to &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; as this should be managed through a conditional statement in the workflow.&lt;br /&gt;
; $hidden_fields : Extra fields associated with this field but rendered so they cannot be seen by the user (e.g. &amp;lt;code&amp;gt;&amp;lt;input type=&amp;quot;hidden&amp;quot; ... /&amp;gt;&amp;lt;/code&amp;gt;).&lt;br /&gt;
; $obj : A data object belong to the &amp;lt;code&amp;gt;$dataset&amp;lt;/code&amp;gt; that has the &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt; set for this field.&lt;br /&gt;
; $basename : The basename for this field for uses as a prefix when a compound field that contains sub-fields.&lt;br /&gt;
; $one_field_component : A boolean (typically &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;) defining whether the workflow component that the field is being rendered has just this field or multiple fields in it.&lt;br /&gt;
|| A &amp;lt;code&amp;gt;XML::LibXML::DocumentFragment&amp;lt;/code&amp;gt; containing an XHTML rendering of the field for input.&lt;br /&gt;
|| Get an XHTML rendering of the field for input.  May be overridden with &amp;lt;code&amp;gt;render_input&amp;lt;/code&amp;gt; property for this field.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Utility Methods ===&lt;br /&gt;
'''TO BE DONE'''&lt;br /&gt;
&lt;br /&gt;
=== Deprecated Methods ===&lt;br /&gt;
'''TO BE COMPLETED'''&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Exemplar !!Parameters !! Returns !!  Description&lt;br /&gt;
|-&lt;br /&gt;
| '''display_name'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$dataset = $field-&amp;gt;dataset&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;$dataset = $field-&amp;gt;get_dataset&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
; $session : A &amp;lt;code&amp;gt;EPrints::Repository&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|| The UTF-8 encoded name of this field, in the language of the &amp;lt;code&amp;gt;$session&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|| Get the human-readable name for this field.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Required Phrases ==&lt;br /&gt;
&lt;br /&gt;
These are phrases which you need to define in the local repository phrases file to control how this field renders. Some types of field (eg. [[set field]]s) have additional phrases in addition to the ones listed below.&lt;br /&gt;
&lt;br /&gt;
The actual name of the field, as it will appear to users is stored in &lt;br /&gt;
&lt;br /&gt;
 datasetid + &amp;quot;_fieldname_&amp;quot; + fieldname&lt;br /&gt;
&lt;br /&gt;
The default help to display, when the field is being input, is stored in&lt;br /&gt;
&lt;br /&gt;
 datasetid + &amp;quot;_fieldhelp_&amp;quot; + fieldname&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;epp:phrase id=&amp;quot;eprint_fieldname_abstract&amp;quot;&amp;gt;Abstract&amp;lt;/epp:phrase&amp;gt;&lt;br /&gt;
    &amp;lt;epp:phrase id=&amp;quot;eprint_fieldhelp_abstract&amp;quot;&amp;gt;A summary of the items content. &lt;br /&gt;
       If the item has a formal abstract then that is what should be entered &lt;br /&gt;
       here. No complicated text formatting is possible.&amp;lt;/epp:phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
&lt;br /&gt;
Most fields have a representation in the SQL database using one or more columns. The sub-pages for each field type give the details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
When you request (or set) a value of a metadata field, it is usually handled as a perl scalar (which is a string or number).&lt;br /&gt;
&lt;br /&gt;
ALL values passed around in the API should be encoded in utf-8 or BAD THINGS may happen.&lt;br /&gt;
&lt;br /&gt;
For example,&lt;br /&gt;
&lt;br /&gt;
 $eprint-&amp;gt;set_value( &amp;quot;title&amp;quot;, &amp;quot;For Us, The Living&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
Sets the title to the given string.&lt;br /&gt;
&lt;br /&gt;
 my $foo = $eprint-&amp;gt;get_value( &amp;quot;title&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
Sets $foo to the string of the title, eg. &amp;quot;For Us, The Living&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Multiple Fields ===&lt;br /&gt;
&lt;br /&gt;
If a field is set to multiple, then instead of a single value, a reference to an array of values is used. Eg.&lt;br /&gt;
&lt;br /&gt;
 $eprint-&amp;gt;set_value( &amp;quot;corp_creators&amp;quot;, [ &amp;quot;Jims Research&amp;quot;, &amp;quot;Jones Research ] );&lt;br /&gt;
&lt;br /&gt;
=== Other Exceptions ===&lt;br /&gt;
&lt;br /&gt;
See the specific page for the full details.&lt;br /&gt;
&lt;br /&gt;
* [[name field]]s are represented as a hash of the parts.&lt;br /&gt;
&lt;br /&gt;
* [[compound field]]s do something a bit clever.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Example field definitions that can be copied into an configuration file and edited as appropriates.&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints_3.4.7&amp;diff=17048</id>
		<title>EPrints 3.4.7</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints_3.4.7&amp;diff=17048"/>
		<updated>2026-04-29T17:11:33Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* Known Issues */ Added issue about error when looking up cache table UUID.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{releasenotes}}&lt;br /&gt;
&lt;br /&gt;
This page contains information about the EPrints v3.4.7 tag and release on GitHub. &lt;br /&gt;
&lt;br /&gt;
== Release Notes ==&lt;br /&gt;
EPrints 3.4.7 is now available on [https://github.com/eprints/eprints3.4/releases/tag/v3.4.7 GitHub].&lt;br /&gt;
* '''Zero codename:''' ''Granita Gregale''&lt;br /&gt;
* '''Publications flavour codename:''' ''Tiramisu Tramontane''&lt;br /&gt;
&lt;br /&gt;
=== New Dependencies ===&lt;br /&gt;
Check earlier dependencies for [[EPrints 3.4.6]] and before.&lt;br /&gt;
&lt;br /&gt;
=== Upgrade Considerations ===&lt;br /&gt;
* If you are upgrading from an earlier version of EPrints 3.4.x and have the the [https://github.com/eprints/metatags metatags] ingredient enabled, as well as disabling this by removing it from your flavour's inc file, if your archive has its own '''cfg/cfg.d/eprint_render.pl''' file, you will need to make sure that the following lines are added to it after similar lines for &amp;lt;code&amp;gt;Export::Simple&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Export::DC&amp;lt;/code&amp;gt;:&lt;br /&gt;
 $links-&amp;gt;appendChild( $repository-&amp;gt;plugin( &amp;quot;Export::HighwirePress&amp;quot; )-&amp;gt;dataobj_to_html_header( $eprint ) );&lt;br /&gt;
 $links-&amp;gt;appendChild( $repository-&amp;gt;plugin( &amp;quot;Export::Prism&amp;quot; )-&amp;gt;dataobj_to_html_header( $eprint ) );&lt;br /&gt;
&lt;br /&gt;
=== Changes Since 3.4.6 ===&lt;br /&gt;
&lt;br /&gt;
==== New Functionality ====&lt;br /&gt;
* Adds &amp;lt;code&amp;gt;check_config&amp;lt;/code&amp;gt; optioion to &amp;lt;code&amp;gt;tools/epm&amp;lt;/code&amp;gt; allowing configuration files (under &amp;lt;code&amp;gt;cfg/&amp;lt;/code&amp;gt;) to be compared between the EPM and the archive and potentially copied to the latter if the file is not already present.&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/425 Allows &amp;lt;code&amp;gt;bin/epadmin&amp;lt;/code&amp;gt; to logout all users (possibly with 1 or more exclusions)]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/434 Implements missing triggers &amp;lt;code&amp;gt;EP_TRIGGER_BEGIN&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EP_TRIGGER_END&amp;lt;/code&amp;gt;]&lt;br /&gt;
* Allows [https://github.com/eprints/eprints3.4/issues/445 browse view variation ordering by number]&lt;br /&gt;
* Adds [https://github.com/eprints/eprints3.4/pull/450 citation cache management script]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/456 Allows static pages to be put behind login (with exceptions)]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/462 Allows custom sort to be applied at a browse menu level]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/490 Adds Highwire Press and PRISM meta tags to head of abstract pages] as favoured by Google Scholar&lt;br /&gt;
&lt;br /&gt;
==== Security and Privacy Improvements ====&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/429 Fixes vulnerability in PrototypeJS]&lt;br /&gt;
** Severity: Low | By default EPrints does not make use of PrototypeJS in a way that actively exposes CVE-2020-27511. EPrints only allows an administrator to modify the JavaScript EPrints serves, such that the vulnerability could be exposed.&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/465 Uses different identifier for recalling search result caches so it cannot be guessed]&lt;br /&gt;
** Severity: Low | Change is only intended to partially mitigate certain excessive search queries, which can sometimes be processor intensive.&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/502 Ups to latest versions of jQuery and JQuery UI available in jquery ingredient]&lt;br /&gt;
** Severity: Low | jquery ingredient is not enabled by default.  Minor upgrade of JQuery libraries is mainly to ensure versions do not fall too far behind the latest, as they may be needed to provide a repository's branding imported from another website.&lt;br /&gt;
&lt;br /&gt;
==== General Improvements ====&lt;br /&gt;
* Tidies up comments under &amp;lt;code&amp;gt;lib/cfg.d/security.pl&amp;lt;/code&amp;gt; to only refer to &amp;lt;code&amp;gt;EPrints::Repository-&amp;gt;ip&amp;lt;/code&amp;gt; function for getting the IP address of the request&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/416 Update Recaptcha3 to work with non-request workflows e.g. registration]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/417 Improves &amp;lt;code&amp;gt;EPrints::Repository-&amp;gt;remote_ip&amp;lt;/code&amp;gt; to disregard invalid IP addresses in &amp;lt;code&amp;gt;X-Forwarded-For&amp;lt;/code&amp;gt;]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/436 Makes document thumbnails use long URL format]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/439 Removes no longer supported &amp;lt;code&amp;gt;cgi/paracite&amp;lt;/code&amp;gt; script]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/443 Improve &amp;lt;code&amp;gt;restrict_paths&amp;lt;/code&amp;gt; by only allowing some IP rather than just disallowing others]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/451 Various improvements to citation caching]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/454 Partially addresses spurious use of &amp;lt;code&amp;gt;X-Forwarded-For&amp;lt;/code&amp;gt; header to pollute stats]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/460 Prevents 'Manage Deposits' taking a long time to load with a lot of items]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/463 Removes references to &amp;lt;code&amp;gt;secure.xml&amp;lt;/code&amp;gt; template and &amp;lt;code&amp;gt;secure_auto.js&amp;lt;/code&amp;gt;]&lt;br /&gt;
* Adds place as a &amp;lt;code&amp;gt;related_url&amp;lt;/code&amp;gt; type&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/482/ Tides up use of &amp;lt;code&amp;gt;get_citaiton_id&amp;lt;/code&amp;gt; in search screens]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/475 Allows any item that has ever been in the live archive to be retired]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/486 Allows &amp;lt;code&amp;gt;EPrints::Document&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;search_related&amp;lt;/code&amp;gt; to be ordered and limited to reduce number of cache tables generated]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/476 Allows placeholder to be optionally displayed for un-named subjects in browse views]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/479 Supports disabling of auto re-searching of cache ID for search has expired]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/492 Supports plugins exporting as attachment rather that in-browser]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/493 Adds 'export_file_as_attachment' option to force exports to be downloaded]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/500 Add view option to suppress 'feeds']&lt;br /&gt;
&lt;br /&gt;
==== Bug Fixes ====&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/399 &amp;lt;code&amp;gt;generate_apacheconf&amp;lt;/code&amp;gt; has issues if archive missing &amp;lt;code&amp;gt;cfg/static/javascript/auto/&amp;lt;/code&amp;gt;]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/415 &amp;lt;code&amp;gt;Boolean&amp;lt;/code&amp;gt; field has inconsistent phrase names]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/418&amp;lt;code&amp;gt;tools/epm&amp;lt;/code&amp;gt;'s &amp;lt;code&amp;gt;link_lib&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;unlink_lib&amp;lt;/code&amp;gt; command so they only remove files referenced in the EPM directory's &amp;lt;code&amp;gt;.epm&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;.epmi&amp;lt;/code&amp;gt; file]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/420 UX/Accessibility issue with &amp;lt;code&amp;gt;Import&amp;lt;/code&amp;gt; plugin actions]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/421 History records not retaining formatting of email reasons]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/422 disabling an EPM removes database tables and fields (and counters) it added to an archive]&lt;br /&gt;
* Better handles [https://github.com/eprints/eprints3.4/issues/419 &amp;lt;code&amp;gt;EPrint::MetaField-&amp;gt;ordervalue_single&amp;lt;/code&amp;gt; returning undefined]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/427 long values in initial dataobj creation leading to empty rows in their database tables]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/432 Updates URLs for GPL/GPL licences to point at GNU rather than Creative Commons website]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/pull/435 typos is template Accessibility report]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/442 &amp;lt;code&amp;gt;EPrint::MetaField::Multipart-&amp;gt;ordervalues_basic&amp;lt;/code&amp;gt; does not forward all parameters]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/pull/426 Applying subtitle to &amp;lt;code&amp;gt;book_title&amp;lt;/code&amp;gt; for book chapter items]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/441 Aligns &amp;lt;code&amp;gt;basic-auth&amp;lt;/code&amp;gt; in Sword and Auth modules] so passwords can contain non-word characters&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/pull/449 Increment of data-row-cell-index for compound field header rows]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/447 citation caching: non-linked cached citations]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/pull/438 before commit trigger changes not appearing in revision files]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/452 &amp;lt;code&amp;gt;EPrints::Plugin::Search::Xapian-&amp;gt;_get_records&amp;lt;/code&amp;gt; cannot handle 0 results]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/453 issues with ReCAPTCHAv3 form being able to submit]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/455 &amp;lt;code&amp;gt;login_required_for_X&amp;lt;/code&amp;gt; functionality not be able to redirect user to a specific page after login]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/444 Fixes aspect ratio for video thumbnails if rotation matrix used]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/457 Only crypt passwords that only contain printable ASCII]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/458 Prevents other sub-field default occasionally be using for another compound field sub-field]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/468 Fixes lightbox popup preview of a video]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/470 Subobject &amp;lt;code&amp;gt;to_sax&amp;lt;/code&amp;gt; causes 500 error if there are multiple and subobject is null]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/470 Sets more sensible &amp;lt;code&amp;gt;maxlength&amp;lt;/code&amp;gt; default for MetaFields that are &amp;lt;code&amp;gt;SQL_CLOB&amp;lt;/code&amp;gt; to avoid truncation]&lt;br /&gt;
* Ensures depositable should be &amp;lt;code&amp;gt;TRUE&amp;lt;/code&amp;gt; not &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; on initial subject creation through &amp;lt;code&amp;gt;Edit::Subject&amp;lt;/code&amp;gt;&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/472 HTML citation export fails if export citation style for eprint exists]&lt;br /&gt;
* Ensures output from get_custom_view_header user-defined function can appear before or after the browse view navigation bar&lt;br /&gt;
* Removes no longer support &amp;lt;code&amp;gt;use encoding...&amp;lt;/code&amp;gt; from random data generator&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/480 Makes 'Move' positions unique]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/485 Retains attribute order in &amp;lt;code&amp;gt;build_attributes&amp;lt;/code&amp;gt;]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/459 Horizontal scrollbar when zoomed to 400%]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/469 default values for search get re-enabled if field left empty]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/473 broken aria reference if help phrase exists, but help isn't shown]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/474 Adds cgi/register to accessibility check]&lt;br /&gt;
* Fixes logic support complex page ranges (e.g. A-2-B-4)&lt;br /&gt;
* Removes &amp;lt;code&amp;gt;rev_number&amp;lt;/code&amp;gt; from eprints in test import data to prevent missing revisions when imported.&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/60 issues when splitting complex page ranges originally implemented for 3.4.2]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/479 historic cache param causing excessive new cache tables]&lt;br /&gt;
* Removes eprint rev_number from test data this cause odd behaviour when importing&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/495 Prevents double presses on search buttons sending multiple requests]&lt;br /&gt;
&lt;br /&gt;
== Known Issues ==&lt;br /&gt;
=== Session Initialisation and Close Bespoke Configuration ===&lt;br /&gt;
EPrints 3.4.7 replaces &amp;lt;code&amp;gt;$c-&amp;gt;{session_init}&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;$c-&amp;gt;{session_close}&amp;lt;/code&amp;gt; configuration in '''lib/cfg.d/session.pl''' with &amp;lt;code&amp;gt;EP_TRIGGER_BEGIN&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EP_TRIGGER_END&amp;lt;/code&amp;gt; triggers.  Although uncommon, if you have modified &amp;lt;code&amp;gt;session_init&amp;lt;/code&amp;gt; in a later configuration file than session.pl and your session_init function requires the &amp;lt;code&amp;gt;EPrints::Repository&amp;lt;/code&amp;gt;'s &amp;lt;code&amp;gt;offline&amp;lt;/code&amp;gt; parameter then will not be sent to the function.  Similarly, if you have modified the &amp;lt;code&amp;gt;session_close&amp;lt;/code&amp;gt; function and this requires and &amp;lt;code&amp;gt;EPrints::Repository&amp;lt;/code&amp;gt; object as a parameter, this will not be sent.  These can be fixed with '''[https://github.com/eprints/eprints3.4/commit/cff8a57e643c230215279f187764fa6ec8d00a99.patch this patch]'''.&lt;br /&gt;
&lt;br /&gt;
=== Error When Looking up UUID for Since Deleted Cache Table ===&lt;br /&gt;
When a repository receive a lot of searches or just a user bookmarks a search results URL.  If this URL is requested again, the cache table it references may have already been deleted.  Rather than checking this first it assume the CacheMap object exists and returns the error message&lt;br /&gt;
 Can't call method &amp;quot;get_value&amp;quot; on an undefined value at /opt/eprints3/perl_lib/EPrints/Database.pm line 2258.&lt;br /&gt;
This can be fixed with the following patch: https://github.com/eprints/eprints3.4/commit/937487175b1cc3e6fc9f7cfbcca87d0dfec6e0ee.patch&lt;br /&gt;
&lt;br /&gt;
== Further Planned Features and Improvements ==&lt;br /&gt;
See [https://github.com/eprints/eprints3.4/milestone/9  3.4.8 milestone on GitHub] for more details.&lt;br /&gt;
&lt;br /&gt;
[[Category:Eprints3.4]]&lt;br /&gt;
[[Category:Releases]]&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Template:EPrints_Metadata_Fields_Content&amp;diff=17047</id>
		<title>Template:EPrints Metadata Fields Content</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Template:EPrints_Metadata_Fields_Content&amp;diff=17047"/>
		<updated>2026-04-29T15:08:22Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added some methods of main MetaField class&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Metadata Field Types ==&lt;br /&gt;
&lt;br /&gt;
There are many different types of metadata field. The type controls how a field is rendered, indexed, searched and so forth. A field always has a type and a name property, and usually has several more. Most properties are documented on this page, but some properties are only available to certain types of field, and they are listed on the page for that field. &lt;br /&gt;
&lt;br /&gt;
Some of these subclasses provide very rich features, others very simple. For example the [[url field]] works just like the text field except that it's only valid if it looks like a url and when rendered it is a hyper-link.&lt;br /&gt;
&lt;br /&gt;
A metadata field describes one field of data in one type of [[Data Object]]. For example the &amp;quot;title&amp;quot; field of an [[EPrint Object]] or the &amp;quot;email&amp;quot; field in a [[User Object]]. &lt;br /&gt;
&lt;br /&gt;
Every [[Data Object]] has system fields (which are set by the system, and not alterable), but the [[User Object]] and [[EPrint Object]] have additional fields which are configured on a per-repository basis.&lt;br /&gt;
&lt;br /&gt;
These can be customised in the [[user_fields.pl]] and [[eprint_fields.pl]] files. Note that changing these files does not automatically modify the underlying database so should (generally) only be done before the database is created. Some metadata properties do not affect the database, and are marked as such. &lt;br /&gt;
&lt;br /&gt;
If you add or remove fields, or modify a property which affects the database then you'll need to alter the database to match.  In 3.0 this must be done by hand, but we have plans to build a tool to do this for you.&lt;br /&gt;
&lt;br /&gt;
== Inheritance ==&lt;br /&gt;
&lt;br /&gt;
This is the list of ''useful'' field types. Under it is listed the other field types which are just included for completeness and are not intended to be used as part of the configuration.&lt;br /&gt;
&lt;br /&gt;
Some field types inherit the properties of another, and then modify them in some way. For example the [[namedset field]] works like a [[set field]] except that it gets its options from a namedsets file not from the options=&amp;gt;[] in the field properties.&lt;br /&gt;
&lt;br /&gt;
* '''Basic metadata field''' - this is abstract, fields must be one of the types listed below...&lt;br /&gt;
** '''[[Boolean field|Boolean]]''' - TRUE or FALSE (or can be unset, of course).&lt;br /&gt;
** '''[[Compound field|Compound]]''' - virtual field, joins together several &amp;quot;multiple&amp;quot; fields, e.g. author_name and author_email.&lt;br /&gt;
*** '''[[Dataobjref field|Dataobjref]]''' - references another data object.&lt;br /&gt;
*** '''[[Multilang field|Multilang]]''' - allows language variants of a field, e.g. titles in French, German and/or English.&lt;br /&gt;
*** '''[[Relation field|Relation]]''' - stores a typed relationship with something represented by a URI.&lt;br /&gt;
** '''[[Date field|Date]]''' - stores a date&lt;br /&gt;
*** '''[[Time field|Time]]''' - stores a date and time&lt;br /&gt;
**** '''[[Timestamp field|Timestamp]]''' - stores current date and time&lt;br /&gt;
** '''[[Float field|Float]]''' - stores a floating-point value&lt;br /&gt;
*** '''[[Decimal field|Decimal]]''' - stores a decimal number.  Specifying the length of number before and after the decimal point.&lt;br /&gt;
** '''[[Id field|Id]]''' - like basic text field but search only finds exact matches&lt;br /&gt;
*** '''[[Idci field|Id (case-insensive)]]''' - like Id field but search find exact matches ignoring case (use for usernames, email addresses, etc.)&lt;br /&gt;
**** '''[[Email field|Email]]''' - an email address&lt;br /&gt;
*** '''[[Keywords field|Keywords]]''' - stores as longtext but searchable as exact individual keyword phrases&lt;br /&gt;
*** '''[[Recaptcha field|Recaptcha]]''' - virtual field to display a reCAPTCHA to prevent spamming of public input forms.&lt;br /&gt;
*** '''[[Text field|Text]]''' - the basic text field. Maximum 255 bytes. nb. uft-8 means some chars take more than one byte.&lt;br /&gt;
**** '''[[Longtext field|Longtext]]''' - like text but allows much longer text (65,000 bytes).&lt;br /&gt;
***** '''[[Longtext_counter field|Longtext counter]]''' - like longtext but with a word counter (requires [https://jquery.com/download/ jQuery])&lt;br /&gt;
**** '''[[Pagerange field|Pagerange]]''' - a range of page from one number to another.&lt;br /&gt;
**** '''[[Secret field|Secret]]''' - used to store passwords and other secrets.&lt;br /&gt;
**** '''[[Set field|Set]]''' - a limited set of options&lt;br /&gt;
***** '''[[Namedset field|Namedset]]''' - like a normal set, but takes its options from a [[namedset]] configuration file.&lt;br /&gt;
***** '''[[Subject field|Subject]]''' - possible values are taken from the [[Subject Object|Subject]] hierarchy. &lt;br /&gt;
***** '''[[Base64 field|Base64]]''' - stores Base64 encoded data.&lt;br /&gt;
****** '''[[Image field|Image]]''' - stores image encoded in Base64 data.&lt;br /&gt;
*** '''[[Url field|Url]]''' - stores a URL.&lt;br /&gt;
*** '''[[Uuid field|Uuid]]''' - stores a UUID.&lt;br /&gt;
** '''[[Int field|Int]]''' - an integer value&lt;br /&gt;
*** '''[[Bigint field|Bigint]]''' - a large integer value (can be greater than 2,147,483,647 or less than -2,147,483.647).&lt;br /&gt;
*** '''[[Counter field|Counter]]''' - an auto-incrementing integer value.&lt;br /&gt;
*** '''[[Itemref field|Itemref]]''' - a reference to another [[Data Object]] (e.g. a user or other eprint)&lt;br /&gt;
*** '''[[Pagerange field|Pagerange]]''' - a pagerange, e.g. 122-130&lt;br /&gt;
** '''[[Multipart field|Multipart]]''' - Stores a mutiple sub-fields like a person's name.&lt;br /&gt;
*** '''[[Name field|Name]]''' - Stores a person's name broken up into logical parts.&lt;br /&gt;
** '''[[Subobject field|Subobject]]''' - Stores another data object under a parent data object.&lt;br /&gt;
&lt;br /&gt;
=== Internal-use and Deprecated Field Types ===&lt;br /&gt;
* '''Basic metadata field'''&lt;br /&gt;
** '''[[File field|File]]''' - '''DEPRECATED'''.  Use [[Subobject field]] instead.&lt;br /&gt;
** '''Id''' &lt;br /&gt;
*** '''Text'''&lt;br /&gt;
**** '''Set'''&lt;br /&gt;
***** '''[[Arclanguage field|Arclanguage]]''' - as for set, but the options are the valid languages of this repository.  Probably better to use [[Multilang field]].&lt;br /&gt;
***** '''[[Fields field|Fields]]''' - as for set, but the options are the fields in a dataset.&lt;br /&gt;
***** '''[[Langid field|Langid]]''' - used internally by [[Multilang field]]s to store the language ID.&lt;br /&gt;
**** '''Longtext'''&lt;br /&gt;
***** '''[[Search field|Search]]''' - a serialised search &lt;br /&gt;
** '''Int'''&lt;br /&gt;
*** '''[[Year field|Year]]''' - '''DEPRECATED'''.  Use [[Date field]] instead.&lt;br /&gt;
** '''[[Storable field|Storable]]''' - Stores a serialization of a Perl data structure.&lt;br /&gt;
&lt;br /&gt;
== Properties ==&lt;br /&gt;
&lt;br /&gt;
Note that true/false properties use 1 and 0 to indicate their setting.&lt;br /&gt;
&lt;br /&gt;
Some properties can be temporarily set or overridden by the [[Workflow Format]] and [[Citation Format]] files.&lt;br /&gt;
&lt;br /&gt;
=== Core Properties ===&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''name''' || n/a || YES || This is the internal name of the field. It should only contain alphanumeric characters and underscores. It will be used to identify this field in scripts, other configuration files, in the database, and in the XML export/import system, etc. ||  This property is ''not'' required when defining sub-fields of [[Compound field]]s where &amp;lt;tt&amp;gt;sub_name&amp;lt;/tt&amp;gt; should be used. This property affects the database structure.  It must be unique within the [[Data Object]] (so the [[EPrint Object]] cannot have two fields called &amp;lt;tt&amp;gt;email&amp;lt;/tt&amp;gt; but the EPrint Object and [[User Object]] can each have a field with the same name.&lt;br /&gt;
|-&lt;br /&gt;
| '''type''' || n/a || YES || This sets the type of the metafield, which in turn affects what other properties it may have. || This property affects the database structure.  The value must be one of the metafield types listed above.&lt;br /&gt;
|-&lt;br /&gt;
| '''multiple''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || This indicates if this field is a single value or a list of values. E.g. &amp;lt;tt&amp;gt;title&amp;lt;/tt&amp;gt; is only a single [[Longtext field]] but &amp;lt;tt&amp;gt;creators&amp;lt;/tt&amp;gt; is a multiple [[Compound field]]. || This property affects the database structure. In the database a non-multiple field is stored in one (or more) columns in the main object table, but a multiple field gets its own table.&lt;br /&gt;
|-&lt;br /&gt;
| '''readonly''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether to not make this field editable in the workflow. || This is useful if you want to display the pre-generated value(s) for this field for reference whilst other fields are being edited.&lt;br /&gt;
|-&lt;br /&gt;
| '''sql_index''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || When the database is created this field indicates that an SQL index should be created to speed searching. || This property affects the database structure. Different field types override the default value with the sensible option for that type of field. It is not worth putting a SQL index on a field that is only ever searched for words in it (like title or abstract) but it is worth indexing fields who's values are explicitly searched for, or where ranges are searched (e.g. [[Date field]]s, [[Set field]]s etc.). It is unlikely you will need to set this by hand. You could change it after the database has been created but this will not update the database nor have any other effect.&lt;br /&gt;
|- &lt;br /&gt;
| '''sub_name''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || YES || This is a special property which is required ''instead'' of the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; property for the sub-fields inside [[Compound field]]s.  || This property affects the database structure. The actual name of these fields is then forced to be parent field &amp;lt;tt&amp;gt;name + '_' + sub_name&amp;lt;/tt&amp;gt;. E.g.  Compound field &amp;lt;tt&amp;gt;creators&amp;lt;/tt&amp;gt; is a sub-field with &amp;lt;tt&amp;gt;sub_name =&amp;gt; 'name'&amp;lt;/tt&amp;gt;. In this case the actual name of the name field in the system, database etc. is &amp;lt;tt&amp;gt;creators_name/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| '''virtual''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether this field calculates a value or stores in in the database. || [[Compound field]]s are virtual fields, whereas there sub-fields are not as they store values in the database.  Other types of virtual field will require a &amp;lt;tt&amp;gt;render_value&amp;lt;/tt&amp;gt; to be specified, as with no value stored the default render method will have nothing to display.&lt;br /&gt;
|-&lt;br /&gt;
| '''volatile''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether the field is liable to change frequently. || Setting &amp;lt;code&amp;gt;volatile =&amp;gt; 1&amp;lt;/code&amp;gt; will prevent new revisions being create and avoid other post commit events from being triggered, such as re-indexing.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Rendering Properties ===&lt;br /&gt;
&lt;br /&gt;
These properties affect how values of the metadata in this field are rendered.&lt;br /&gt;
&lt;br /&gt;
Certain of these properties can be turned on temporarily by the [[Citation Format]] files - render_magicstop for example.&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''as_list''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Whether to display a collection sub-fields values as a table row or a separate list in the input form || This is only applicable for [[Compound field]]s that have &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt;.  It is useful where the length of the table row would exceed the width of a typical user's window.&lt;br /&gt;
|-&lt;br /&gt;
| '''browse_link''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || This is the name of a view which values of this field should be linked to. || E.g. if there was a &amp;lt;tt&amp;gt;Browse by Publishers&amp;lt;/tt&amp;gt; view configured named &amp;lt;tt&amp;gt;pubs&amp;lt;/tt&amp;gt;, then adding &amp;lt;code&amp;gt;browse_link =&amp;gt; 'pubs'&amp;lt;/tt&amp;gt; to the &amp;lt;tt&amp;gt;publisher&amp;lt;/tt&amp;gt; field would cause it to be linked into the browse view page for the named publisher whenever it is rendered.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_custom''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Whether to use a pre-defined way of rendering the value for this field. || E.g. for [[Name field]]s by default the name will link to the creators browse view for that name.  This property can be re-used within bespoke render functions to specify whether some custom way of rendering this field' svalue (e.g. with a link) should be used.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_dont_link''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether rendered field is not encapsulated in a hyperlink. || Currently only affects [[Url field]]s and [[Email field]]s.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_dynamic''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether the rendering of this field can use JavaScript to make it dynamic. || [[limit_names_shown.pl]] uses this property to determine if the list of hidden creators/editors can be expanded to show all creators/editors.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_limit''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || How many values for this field should be displayed. || [[limit_names_shown.pl]] uses this property to determine how many creators/editors to display.  If &amp;lt;code&amp;gt;undef&amp;lt;/code&amp;gt; just render all values.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_magicstop''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether to render a full stop at the end of this field, unless the last character is a dot, question mark or exclamation mark. || This helps avoid the ugly &amp;lt;tt&amp;gt;World without Cheese?.&amp;lt;/tt&amp;gt; effect you get when titles end in &amp;lt;tt&amp;gt;?&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;!&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_noreturn''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether CR (Carriage Return) and LF (Line Feed) characters are turned into normal spaces. ||&lt;br /&gt;
|-&lt;br /&gt;
| '''render_quiet''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether to prevent a big ugly &amp;lt;tt&amp;gt;UNSPECIFIED&amp;lt;/tt&amp;gt; being rendered if field is unset. || E.g. setting &amp;lt;code&amp;gt;render_quiet =&amp;gt; 1&amp;lt;/code&amp;gt; on a field means it just gets rendered as nothing if it is unset.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_single_value''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The value of this property is the name of a function to call to render individual values from this field. || For a multiple field this is called once per value in the list of values. The function should take the following parameters: (&amp;lt;code&amp;gt;$session, $field, $value, $object&amp;lt;/code&amp;gt;). It should return a [[XHTML DOM]] object of the rendered value.&lt;br /&gt;
|- &lt;br /&gt;
| '''render_value''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The value of this property is the name of a function to call to render the the field as a whole.  || As with &amp;lt;tt&amp;gt;render_single_value&amp;lt;/tt&amp;gt;, but this gets passed the entire list of values (an array reference) if it is a multiple field. Parameters passed are: ( code&amp;gt;$session, $self, $value, $all_langs, $no_link, $object&amp;lt;/code&amp;gt; ). &amp;lt;code&amp;gt;$all_langs&amp;lt;/code&amp;gt; indicates that all language variants should be shown and is only really useful for [[Multilang field]]s. &amp;lt;code&amp;gt;$no_link&amp;lt;/code&amp;gt; being true is a request to place no hyperlinks in the resulting HTML. The function should return an [[XHTML DOM]] object of the rendered value.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Input and Validation Properties ===&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''default_value''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The default value to set for this field. || This is mainly used for [[EPrints Glossary#System field|system fields]].  For custom fields it is better to use [[eprint_fields_default.pl]] or similar.&lt;br /&gt;
|-&lt;br /&gt;
| '''expanded_subjects''' || &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; || NO || Subjects to show un-collapsed in the subject tree field in the workflow. || This is only applicable for [[Subject field]]s.  All the fields listed will have their paths in the subject tree expanded so they can be seen, making them easier to find.&lt;br /&gt;
|-&lt;br /&gt;
| '''false_first''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Display the false option before the true option in the input form. || This is only applicable to [[Boolean field]]s.  By default true option is always displayed before the false option.&lt;br /&gt;
|-&lt;br /&gt;
| '''fromform''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The inverse of &amp;lt;tt&amp;gt;toform&amp;lt;/tt&amp;gt;. This takes the value from the form and converts it into the value that will be stored in the database. || This function is passed the parameters: &amp;lt;tt&amp;gt;$value, $session, $object, $basename&amp;lt;/tt&amp;gt; when &amp;lt;tt&amp;gt;$value&amp;lt;/tt&amp;gt; is the value entered on the HTML form, and the return value is the value to be stored in the database. This function is not called when editing the eprint is cancelled.&lt;br /&gt;
|-&lt;br /&gt;
| '''get_item''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || A bespoke function for how to lookup the [[EPrints Glossary#Data object|Data object]] based on the stored value. || Only applicable to [[Itemref field]]s.&lt;br /&gt;
|- &lt;br /&gt;
| '''help_xhtml''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || An [[XHTML DOM]] object to use for the help text for this field. || This can only be set via the [[Workflow Format]] configuration not via the metadata field directly. This is so that the workflow can conditionally change the help on a field.  If you need to change the help text based on the eprint type, then you can just create a bespoke phrase with the format &amp;lt;code&amp;gt;&amp;quot;eprint_fieldhelp_&amp;quot; + fieldname + &amp;quot;.&amp;quot; + eprint_type&amp;lt;/code&amp;gt; (e.g. &amp;lt;code&amp;gt;eprint_fieldhelp_id_number.article&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| '''input_add_boxes''' || &amp;lt;tt&amp;gt;2&amp;lt;/tt&amp;gt; || NO || The number of rows to add when clicking the &amp;lt;tt&amp;gt;More input rows&amp;lt;/tt&amp;gt; button for a field that sets &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt;. || The default value for this property is taken from &amp;lt;tt&amp;gt;cfg.d/[[field_property_defaults.pl]]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|- &lt;br /&gt;
| '''input_boxes''' || &amp;lt;tt&amp;gt;3&amp;lt;/tt&amp;gt; || NO || The number of input rows to initially show for a field that sets &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt;. || The default value for this property is taken from &amp;lt;tt&amp;gt;cfg.d/[[field_property_defaults.pl]]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_cols''' || &amp;lt;tt&amp;gt;60&amp;lt;/tt&amp;gt; || NO || The number of columns in an HTML form field. || The default value for this property is taken from &amp;lt;tt&amp;gt;cfg.d/[[field_property_defaults.pl]]&amp;lt;/tt&amp;gt;.  This in combination with the &amp;lt;tt&amp;gt;maxlength&amp;lt;/tt&amp;gt; property determines the value for &amp;lt;tt&amp;gt;size&amp;lt;/tt&amp;gt; attribute for &amp;lt;code&amp;gt;&amp;lt;input&amp;gt;&amp;lt;/code&amp;gt; HTML fields or the &amp;lt;tt&amp;gt;cols&amp;lt;/tt&amp;gt; attribute for &amp;lt;code&amp;gt;&amp;lt;textarea&amp;gt;&amp;lt;/code&amp;gt; HTML fields (used by [[Longtext field]]s).&lt;br /&gt;
|-&lt;br /&gt;
| '''input_lookup_params''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Additional parameters to pass to the &amp;lt;tt&amp;gt;input_lookup_url&amp;lt;/tt&amp;gt;. || E.g. an indication of which autocomplete file to use.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_lookup_url''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The URL to use for autocompletion. || This is generally set using the workflow configuration rather than directly in the field configuration. The URL must be on the same server hostname as the repository.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_ordered''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether the ordering of values needs to be captured. || In some &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt; fields, such as creators, the order of the values is important and by default numbers are shown to the left of input rows and to the right are ''move up'' and ''move down'' arrows. However, with some &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt; fields the order is not important, in which case you can set this to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; to stop the arrows and numbers being shown.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_rows''' || &amp;lt;tt&amp;gt;10&amp;lt;/tt&amp;gt; || NO || The number of rows in an HTML form field. || The default value for this property is taken from &amp;lt;tt&amp;gt;cfg.d/[[field_property_defaults.pl]]&amp;lt;/tt&amp;gt;  This property determines the value for &amp;lt;tt&amp;gt;size&amp;lt;/tt&amp;gt; attribute for &amp;lt;code&amp;gt;&amp;lt;select&amp;gt;&amp;lt;/code&amp;gt; HTML fields (used by [[Set field]]s)  or the &amp;lt;tt&amp;gt;rows&amp;lt;/tt&amp;gt; attribute for &amp;lt;code&amp;gt;&amp;lt;textarea&amp;gt;&amp;lt;/code&amp;gt;  HTML fields (used by [[Longtext field]]s).&lt;br /&gt;
|-&lt;br /&gt;
| '''maxlength''' || &amp;lt;tt&amp;gt;255&amp;lt;/tt&amp;gt; || NO || The maximum allowed length in characters for a value. || This can be a very simple validation check. Also, it may confuse users to be allowed to type in 255 characters in a field intended for something like a postcode/zipcode.&lt;br /&gt;
|-&lt;br /&gt;
| '''maxwords''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The maximum number of words that should be entered for this field. || This field is only applicable to [[Longtext_counter field]]s.  It does not restrict the number of words, it just displays this limit next to a dynamic counter of the number of words already entered.&lt;br /&gt;
|-&lt;br /&gt;
| '''render_input''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The name of a function which will render the input for this field. || This can be difficult to use as it must return the same CGI parameters as the default input form would have. It is easiest on simple fields. The subroutine is passed the following parameters: &amp;lt;code&amp;gt;$field, $session, $current_value, $dataset, $staff, $hidden_fields, $object, $basename&amp;lt;/code&amp;gt; ). It should return the [[XHTML DOM]] object of the chunk of HTML form.&lt;br /&gt;
|-&lt;br /&gt;
| '''required''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether the field must have a value set. || If this is set to &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; then the field is always marked as required, no matter what the [[Workflow Format]] configuration says.&lt;br /&gt;
|-&lt;br /&gt;
| '''separator''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || What character to use to separate elements of the value for the field for purposes of search || Only used by default for [[Keywords field]]s.&lt;br /&gt;
|-&lt;br /&gt;
| '''show_help''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || How to display the help text for this field in the input form. ||  Can be one of three values: &amp;lt;tt&amp;gt;always&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;never&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;toggle&amp;lt;/tt&amp;gt;.  Toggle (allow to expand or collapse) is used if not explicitly defined.  This can only be overridden in [[Workflow Format]] configuration.&lt;br /&gt;
|-&lt;br /&gt;
| '''title_xhtml''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || An [[XHTML DOM]] object to use for the title for this field. || This can only be set via the [[Workflow Format]] configuration not via the metadata field directly. This is so that the workflow can conditionally change the title of a field.  If you need to change the title based on the eprint type, then you can just create a bespoke phrase with the format &amp;lt;code&amp;gt;&amp;quot;eprint_fieldname_&amp;quot; + fieldname + &amp;quot;.&amp;quot; + eprint_type&amp;lt;/code&amp;gt; (e.g. &amp;lt;code&amp;gt;eprint_fieldname_id_number.article&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| '''toform''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || This function is allowed to modify the current value which appears in the form. || E.g. if your database stores &amp;lt;tt&amp;gt;userid&amp;lt;/tt&amp;gt;s in a field, but you want to allow people to edit them as &amp;lt;tt&amp;gt;username&amp;lt;/tt&amp;gt;s, then this function can be used to take the current value (a &amp;lt;tt&amp;gt;userid&amp;lt;/tt&amp;gt;) and return the associated &amp;lt;tt&amp;gt;username&amp;lt;/tt&amp;gt;. This value is what appears in the field in the search form. It is passed: &amp;lt;code&amp;gt;$value, $session, $object, $basename&amp;lt;/code&amp;gt; and returns the user-facing version of &amp;lt;code&amp;gt;$value&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Ordering, Indexing and Searching ===&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''make_single_value_orderkey''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The &amp;lt;tt&amp;gt;orderkey&amp;lt;/tt&amp;gt; function (potentially language specific) used to order by this field. || This property allows you to define a function or refer to a predefined function to override the default EPrints' orderkey generation. This property is passed each value from multiple fields, in turn. It is passed: &amp;lt;code&amp;gt;$field, $value, $dataset&amp;lt;/code&amp;gt; and returns an &amp;lt;tt&amp;gt;ordervalue&amp;lt;/tt&amp;gt; string.&lt;br /&gt;
|-&lt;br /&gt;
| '''make_value_orderkey''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Like &amp;lt;tt&amp;gt;make_single_value_orderkey&amp;lt;/tt&amp;gt; but this is passed the array reference for a multiple field rather than just single values. || It should return the &amp;lt;tt&amp;gt;orderkey&amp;lt;/tt&amp;gt; string for the entire value. It is passed: &amp;lt;code&amp;gt;$field, $value, $session, $langid, $dataset&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| '''match''' || &amp;lt;tt&amp;gt;EQ&amp;lt;/tt&amp;gt; || NO || How to match the value(s) of this field against search terms. || This property can be &amp;lt;tt&amp;gt;EQ&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;EX&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;IN&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;SET&amp;lt;/tt&amp;gt;.  Default &amp;lt;tt&amp;gt;EQ&amp;lt;/tt&amp;gt; means treat the search term as a single string. Match only whole search term matches the field value (or one of its values if &amp;lt;code&amp;gt;multiple =&amp;gt; 1&amp;lt;/code&amp;gt;).  This can be modified for the [[API:EPrints/Search/Field|field in the search form configuration]].&lt;br /&gt;
|-&lt;br /&gt;
| '''merge''' || &amp;lt;tt&amp;gt;ALL&amp;lt;/tt&amp;gt; || NO || Whether this field's values(s) has to match any or all of the search terms || This property can be &amp;lt;tt&amp;gt;ALL&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;ANY&amp;lt;/tt&amp;gt;, Default &amp;lt;tt&amp;gt;ALL&amp;lt;/tt&amp;gt; means all search terms have to match the values(s) in this field. This can be modified for the [[API:EPrints/Search/Field|field in the search form configuration]].  For certain values of &amp;lt;tt&amp;gt;match&amp;lt;/tt&amp;gt; this can also be changed by the user in the search form itself.&lt;br /&gt;
|-&lt;br /&gt;
| '''text_index''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether the indexer considers this field for full-text indexing. || Some types of metadata field have a default of &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt;, e.g. [[Text field]]s and [[Longtext field]]s.&lt;br /&gt;
|-&lt;br /&gt;
| '''search_cols''' || &amp;lt;tt&amp;gt;40&amp;lt;/tt&amp;gt; || NO || How many characters (columns) wide the input field for searching this field. ||  The default value for this property is taken from &amp;lt;tt&amp;gt;cfg.d/[[field_property_defaults.pl]]&amp;lt;/tt&amp;gt;.  If one search field searches more than one field, then the properties from the first field listed are used.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Other Properties ===&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''allow_null''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether the value(s) stored in the database when no input is entered should be &amp;lt;tt&amp;gt;NULL&amp;lt;/tt&amp;gt; or an appropriate default value based on its database field type. || This should generally never be set to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; and certainly should not be changed to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; after the field has been added to the database.  You are much better off configuring a default value using &amp;lt;tt&amp;gt;[[eprint_fields_default.pl]]&amp;lt;/tt&amp;gt; or similar.&lt;br /&gt;
|-&lt;br /&gt;
This may be applicable to [[Text field|text]]  &lt;br /&gt;
| '''can_clone''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether the value(s) for this field should be cloned if a new record is created.  || This property is mostly used by system fields such as &amp;lt;tt&amp;gt;dir&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;datestamp&amp;lt;/tt&amp;gt;.  It is applicable when an eprint is cloned using the &amp;lt;tt&amp;gt;Use as template&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;New version&amp;lt;/tt&amp;gt; action buttons.&lt;br /&gt;
|-&lt;br /&gt;
| '''export_as_xml''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether the field value(s) should be exported in an XML export. || This is handy to suppress either confidential or confusing fields, like the &amp;lt;tt&amp;gt;fileinfo&amp;lt;/file&amp;gt; [[EPrints Glossary#System_field|system field]].&lt;br /&gt;
|-&lt;br /&gt;
| '''import''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether new data objects create from an import can set values for the field.  || E.g. &amp;lt;tt&amp;gt;eprintid&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;dir&amp;lt;tt&amp;gt; are determined when the eprint record is created.  Imported metadata would not choose an appropriate value for such fields.&lt;br /&gt;
|-&lt;br /&gt;
| '''replace_core''' ||| &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether the field configuration should replace the exisiting [[EPrints Glossary#Core_field|core (system) field]] with the same &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; || This is useful for particularly bespoke requirements.  It should be used with great care, as system fields are usually hard-coded because they should not be changed.&lt;br /&gt;
|-&lt;br /&gt;
| '''show_in_fieldlist''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether to allow this field to appear in fields lists.  || If set to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; will prevent this field appearing in [[Fields field]] lists.  This is primarily to allow you to remove it from the list of fields in the user configuration which are used to control which fields appear as columns in the Items and Review screens.&lt;br /&gt;
|-&lt;br /&gt;
| '''show_in_html''' || &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt; || NO || Whether this field is not shown in the [[EPrints Glossary#Details_tab|Details tab]] of the [[EPrints Glossary#EPrint_control_page|eprint control page]]. || This is mostly used to hide confusing internal [[EPrints Glossary#System_field|system field]]s like &amp;lt;tt&amp;gt;dir&amp;lt;/tt&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Internal Properties ===&lt;br /&gt;
&lt;br /&gt;
These are set by the system. Editing them by hand will do '''''strange things'''''.&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''confid''' || n/a || YES || The ID of the dataset to which this field belongs. || The value for this property is automatically set when the field is loaded.  It is used to work out what phrase ids etc. it uses.&lt;br /&gt;
|-&lt;br /&gt;
| '''join_path''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || How to join a field that references a different [[Data Object]]. || This should never be defined within a field's configuration.  This is built by search to support building a database query to perform a user's search.&lt;br /&gt;
|-&lt;br /&gt;
| '''parent''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || A reference to the actual parent [[Compound field]] object. || This is set automatically as a reference to the parent field object.&lt;br /&gt;
|-&lt;br /&gt;
| '''parent_name''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The name of the parent [[Compound field]] to which a sub-field belongs. || This is set automatically to be the name of the parent field.&lt;br /&gt;
|-&lt;br /&gt;
| '''provenance''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Where this field configuration was generated. || Typically any field configuration either defined within a [[Data Object|Data object]] or in a configuration file (in a &amp;lt;tt&amp;gt;cfg.d&amp;lt;/tt&amp;gt; directory will leave this as &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; by not specifying this property.  However, fields created using [[Admin/Config._Tools/Manage_Metadata_Fields|Manage Metadata Fields]] will set this to &amp;lt;tt&amp;gt;user&amp;lt;/tt&amp;gt; so it is clear from where this field was created.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Deprecated Properties ===&lt;br /&gt;
&lt;br /&gt;
Do not use these!&lt;br /&gt;
&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Default Value !! Required !! Description !! Notes&lt;br /&gt;
|-&lt;br /&gt;
| '''input_advice_below''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Help text to put directly below the form input field || Deprecated. Defined but no longer functional.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_advice_right''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Help text to put directly to the right of the form input field || Deprecated.  Defined but no longer functional.&lt;br /&gt;
|-&lt;br /&gt;
| '''input_assist''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || Provides input assistance. || Deprecated.  Defined but no longer functional.&lt;br /&gt;
|-&lt;br /&gt;
| '''requiredlangs''' || &amp;lt;tt&amp;gt;[]&amp;lt;/tt&amp;gt; || NO || The natural languages that should be used in the value(s) for this field ||  Deprecated.  Defined but no longer functional.&lt;br /&gt;
|-&lt;br /&gt;
| '''sql_langid''' || &amp;lt;tt&amp;gt;undef&amp;lt;/tt&amp;gt; || NO || The language ID for SQL. || Deprecated.  Defined but no longer functional.&lt;br /&gt;
|-&lt;br /&gt;
| '''sql_sorted''' || &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; || NO || Whether SQL should be sorted. || Deprecated.  Defined but no longer functional.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Methods ==&lt;br /&gt;
=== Constructor Methods ===&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Exemplar !! Parameters !! Returns !! Description&lt;br /&gt;
|-&lt;br /&gt;
| '''new'''&lt;br /&gt;
||&amp;lt;code&amp;gt;$field = EPrints::MetaField-&amp;gt;new( %properties )&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $class : The sub-class of the new &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; to be created.&lt;br /&gt;
; %properties : A hash of the properties to be used to create this new &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object. Also requires a &amp;lt;code&amp;gt;dataset&amp;lt;/code&amp;gt; attribute to be set or otherwise both &amp;lt;code&amp;gt;confid&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;repository&amp;lt;/code&amp;gt; attributes are required.&lt;br /&gt;
||A new instance of an &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
||Create a new &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; of the appropriate class.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Class Methods ===&lt;br /&gt;
'''TO BE DONE'''&lt;br /&gt;
=== Object Methods ===&lt;br /&gt;
'''TO BE COMPLETED'''&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Exemplar !!Parameters !! Returns !!  Description&lt;br /&gt;
|-&lt;br /&gt;
| '''field_defaults'''&lt;br /&gt;
||&amp;lt;code&amp;gt;$defaults = $field-&amp;gt;field_defaults&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
||A hash reference of the default properties for the class of &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; of which this object is an instance.&lt;br /&gt;
||Provides the default properties of this &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|-&lt;br /&gt;
| '''final'''&lt;br /&gt;
||&amp;lt;code&amp;gt;$field-&amp;gt;final&amp;lt;/code&amp;gt;&lt;br /&gt;
|| &lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
||n/a&lt;br /&gt;
||Tells the &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; that it is now read only. Any call to &amp;lt;code&amp;gt;set_property&amp;lt;/code&amp;gt; will produce a abort error.&lt;br /&gt;
|-&lt;br /&gt;
| '''set_property'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$field-&amp;gt;set_property( $property, $value )&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
; $property : The property to be set.&lt;br /&gt;
; $value : The value to set for the &amp;lt;code&amp;gt;$property&amp;lt;/code&amp;gt;.&lt;br /&gt;
||n/a&lt;br /&gt;
||Tells the &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; that it is now read only. Any call to &amp;lt;code&amp;gt;set_property&amp;lt;/code&amp;gt; will produce a abort error.&lt;br /&gt;
|-&lt;br /&gt;
| '''clone'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$newfield = $field-&amp;gt;clone&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
||A new &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object that is a clone of the existing object.&lt;br /&gt;
||Clone the field, so the clone can be edited without affecting the original. Does not deep copy properties which are references - these should be set to new values, rather than the contents altered. E.g. Don't push to a cloned options list, replace it.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| '''repository'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$repository = $field-&amp;gt;repository&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|| The &amp;lt;code&amp;gt;EPrints::Repository&amp;lt;/code&amp;gt; object to which this field belongs.&lt;br /&gt;
|| Get the current repository object.&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| '''dataset'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$dataset = $field-&amp;gt;dataset&amp;lt;/code&amp;gt; (or &amp;lt;code&amp;gt;$dataset = $field-&amp;gt;get_dataset&amp;lt;/code&amp;gt;)&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|| The &amp;lt;code&amp;gt;EPrints::DataSet&amp;lt;/code&amp;gt; object to which this field belongs.&lt;br /&gt;
|| Get dataset to which this field belongs.&lt;br /&gt;
|}&lt;br /&gt;
=== Utility Methods ===&lt;br /&gt;
'''TO BE DONE'''&lt;br /&gt;
&lt;br /&gt;
=== Deprecated Methods ===&lt;br /&gt;
'''TO BE COMPLETED'''&lt;br /&gt;
{| cellpadding=&amp;quot;3&amp;quot; cellspacing=&amp;quot;0&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Name !! Exemplar !!Parameters !! Returns !!  Description&lt;br /&gt;
|-&lt;br /&gt;
| '''display_name'''&lt;br /&gt;
|| &amp;lt;code&amp;gt;$dataset = $field-&amp;gt;dataset&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;$dataset = $field-&amp;gt;get_dataset&amp;lt;/code&amp;gt;&lt;br /&gt;
||&lt;br /&gt;
; $self : A &amp;lt;code&amp;gt;EPrints::MetaField&amp;lt;/code&amp;gt; object.&lt;br /&gt;
; $session : A &amp;lt;code&amp;gt;EPrints::Repository&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|| The UTF-8 encoded name of this field, in the language of the &amp;lt;code&amp;gt;$session&amp;lt;/code&amp;gt; object.&lt;br /&gt;
|| Get the human-readable name for this field.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Required Phrases ==&lt;br /&gt;
&lt;br /&gt;
These are phrases which you need to define in the local repository phrases file to control how this field renders. Some types of field (eg. [[set field]]s) have additional phrases in addition to the ones listed below.&lt;br /&gt;
&lt;br /&gt;
The actual name of the field, as it will appear to users is stored in &lt;br /&gt;
&lt;br /&gt;
 datasetid + &amp;quot;_fieldname_&amp;quot; + fieldname&lt;br /&gt;
&lt;br /&gt;
The default help to display, when the field is being input, is stored in&lt;br /&gt;
&lt;br /&gt;
 datasetid + &amp;quot;_fieldhelp_&amp;quot; + fieldname&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;epp:phrase id=&amp;quot;eprint_fieldname_abstract&amp;quot;&amp;gt;Abstract&amp;lt;/epp:phrase&amp;gt;&lt;br /&gt;
    &amp;lt;epp:phrase id=&amp;quot;eprint_fieldhelp_abstract&amp;quot;&amp;gt;A summary of the items content. &lt;br /&gt;
       If the item has a formal abstract then that is what should be entered &lt;br /&gt;
       here. No complicated text formatting is possible.&amp;lt;/epp:phrase&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
&lt;br /&gt;
Most fields have a representation in the SQL database using one or more columns. The sub-pages for each field type give the details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== API ==&lt;br /&gt;
&lt;br /&gt;
When you request (or set) a value of a metadata field, it is usually handled as a perl scalar (which is a string or number).&lt;br /&gt;
&lt;br /&gt;
ALL values passed around in the API should be encoded in utf-8 or BAD THINGS may happen.&lt;br /&gt;
&lt;br /&gt;
For example,&lt;br /&gt;
&lt;br /&gt;
 $eprint-&amp;gt;set_value( &amp;quot;title&amp;quot;, &amp;quot;For Us, The Living&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
Sets the title to the given string.&lt;br /&gt;
&lt;br /&gt;
 my $foo = $eprint-&amp;gt;get_value( &amp;quot;title&amp;quot; );&lt;br /&gt;
&lt;br /&gt;
Sets $foo to the string of the title, eg. &amp;quot;For Us, The Living&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
=== Multiple Fields ===&lt;br /&gt;
&lt;br /&gt;
If a field is set to multiple, then instead of a single value, a reference to an array of values is used. Eg.&lt;br /&gt;
&lt;br /&gt;
 $eprint-&amp;gt;set_value( &amp;quot;corp_creators&amp;quot;, [ &amp;quot;Jims Research&amp;quot;, &amp;quot;Jones Research ] );&lt;br /&gt;
&lt;br /&gt;
=== Other Exceptions ===&lt;br /&gt;
&lt;br /&gt;
See the specific page for the full details.&lt;br /&gt;
&lt;br /&gt;
* [[name field]]s are represented as a hash of the parts.&lt;br /&gt;
&lt;br /&gt;
* [[compound field]]s do something a bit clever.&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
Example field definitions that can be copied into an configuration file and edited as appropriates.&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints_3.4.6&amp;diff=17036</id>
		<title>EPrints 3.4.6</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints_3.4.6&amp;diff=17036"/>
		<updated>2026-02-17T07:40:29Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* General Improvements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{releasenotes}}&lt;br /&gt;
&lt;br /&gt;
This page contains information about the EPrints v3.4.6 tag and release on GitHub.&lt;br /&gt;
&lt;br /&gt;
== Release Notes ==&lt;br /&gt;
EPrints 3.4.6 is now available on [https://github.com/eprints/eprints3.4/releases/tag/v3.4.6 GitHub].&lt;br /&gt;
* '''Zero codename:''' Creme Brulee Cryoseism&lt;br /&gt;
* '''Publications flavour codename:''' Affogato Snowmelt&lt;br /&gt;
&lt;br /&gt;
=== New Dependencies ===&lt;br /&gt;
Check earlier dependencies for [[EPrints 3.4.5]] and before.&lt;br /&gt;
&lt;br /&gt;
=== Changes Since 3.4.5 ===&lt;br /&gt;
&lt;br /&gt;
==== New Functionality ====&lt;br /&gt;
* Adds &amp;lt;code&amp;gt;unlink_lib&amp;lt;/code&amp;gt; option to &amp;lt;code&amp;gt;tools/epm&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Adds &amp;lt;code&amp;gt;--to-link&amp;lt;/code&amp;gt; flag to &amp;lt;code&amp;gt;unpack&amp;lt;/code&amp;gt; option of &amp;lt;code&amp;gt;tools/epm&amp;lt;/code&amp;gt; to allow an EPM file to be unpack so it can subsequently be deployed by &amp;lt;code&amp;gt;link_lib&amp;lt;/code&amp;gt; option.&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/340 Provide support for converting HEIC and WEBP thumbnails]&lt;br /&gt;
* Adds support for setting default reply-to when separate &amp;lt;code&amp;gt;$c-&amp;gt;{adminemail}&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;$c-&amp;gt;{sendermail}&amp;lt;/code&amp;gt;&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/388 Allows certain URL paths to be blocked for certain IPs]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/387 Initial Signposting integration]&lt;br /&gt;
&lt;br /&gt;
==== Security and Privacy Improvements ====&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/347 Implement stronger password hashing]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/344 Creates and enables &amp;lt;code&amp;gt;export_privacy&amp;lt;/code&amp;gt; setting to prevent export formats that include email addresses to be publicly accessible by default].&lt;br /&gt;
* Ensure &amp;lt;code&amp;gt;ga.js&amp;lt;/code&amp;gt; is always served on HTTPS&lt;br /&gt;
* Makes sure &amp;lt;code&amp;gt;cache&amp;lt;/code&amp;gt; parameter value provided by search form is a number to prevent URL injection.&lt;br /&gt;
&lt;br /&gt;
==== General Improvements ====&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/336 Implement Recaptcha field to work with Google ReCAPTCHA v3]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/339 Sets &amp;lt;code&amp;gt;ignore_login_ip = 1&amp;lt;/code&amp;gt; by default if HTTPS is enabled]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/345 Improvements Accessibility based on issues raised by axe DevTools]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/348 Improves message when file retrieval fails]&lt;br /&gt;
* Adds &amp;lt;code&amp;gt;.gitignore&amp;lt;/code&amp;gt; for ingredients other than those included, so those deploying EPrints using Git do not see new ingredients as uncommitted.&lt;br /&gt;
* Updates and tidies &amp;lt;code&amp;gt;SystemSettings.pm&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;SystemSettings.pm.in&amp;lt;/code&amp;gt;&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/355 Adds function to get local path on disk for file object]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/357 Overwrites media video stream if incoming stream is higher res]&lt;br /&gt;
* Uses &amp;lt;code&amp;gt;export&amp;lt;/code&amp;gt; version of citation if exists (rather than &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt;) for HTML export of data objects&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/359 Adds title attribute for preview images to display on hover]&lt;br /&gt;
* Adds function to test if citation style file exists&lt;br /&gt;
* Allows truncated URL linls to set a &amp;lt;code&amp;gt;target&amp;lt;/code&amp;gt; attribute&lt;br /&gt;
* Provide large icons to be printed by EPC &amp;lt;code&amp;gt;icon&amp;lt;/code&amp;gt; function &lt;br /&gt;
* Added EPC &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; function to print out phrases into HTML attributes values&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/362 Allows certain HTML formatting tags in imports, (e.g. from PubMed)]&lt;br /&gt;
* Adds title for action button image&lt;br /&gt;
* Allows fields of various types to be more customisable in search forms&lt;br /&gt;
* Reports useful error message if user tries to remove subject that has children&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/353 Allows way to pass timeout to indexer daemon]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/351 Aligns headings when Itemref occurs within Compound Metafield]&lt;br /&gt;
* Log failure if email attempts send with &amp;lt;code&amp;gt;to_email&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;to_list&amp;lt;/code&amp;gt; set&lt;br /&gt;
* Allows &amp;lt;code&amp;gt;EPrints::Repository::render_option_list&amp;lt;/code&amp;gt; to render select box as disabled&lt;br /&gt;
* Ensures more consistent use of space for results listings where div rather than table rows are now used for better Accessibility&lt;br /&gt;
* Better margin for search results toolbar (e.g. Batch Edit)&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/367 Organise fields under stage in EPrint::View screen by workflow rather than data object]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/370 Rewrite CitationCache code to use EPrints API rather than SQL query]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/360 Allow &amp;quot;make open access&amp;quot; on request copy responses a disable-able field]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/376 Allow signed in user to be logged in Apache access logs]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/382 Adds lastmod attributes to entries in sitemap]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/381 Add &amp;lt;code&amp;gt;threads&amp;lt;/code&amp;gt; option to ffmpeg invocations]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/392 Stop unnecessarily generating list of user's eprints twice for Manage Deposits page load]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/374 Uses &amp;lt;code&amp;gt;Text::Unidecode&amp;lt;/code&amp;gt; primarily to tokenize input for indexing] (rather than manually defining mappings)&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/373 Rework cpan_modules.pl to install all required Perl modules]&lt;br /&gt;
* Allows EPC to render icon without a link&lt;br /&gt;
* Adds commented out config option &amp;lt;code&amp;gt;show_ids_in_log&amp;lt;/code&amp;gt;&lt;br /&gt;
* Removes long since deprecated pagehooks functionality&lt;br /&gt;
* Removes irrelevant &amp;lt;code&amp;gt;dbsid&amp;lt;/code&amp;gt; config setting&lt;br /&gt;
* Improvements to simplify login monitoring configuration&lt;br /&gt;
* Remove reference to defunct &amp;lt;code&amp;gt;quiet&amp;lt;/code&amp;gt; config setting&lt;br /&gt;
&lt;br /&gt;
==== Bug Fixes ====&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/332 Downloading document from preview image does not work for some filenames]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/333 Do not add &amp;lt;code&amp;gt;requester_userid&amp;lt;/code&amp;gt; by default as access table can take a long time to add new fields.  However, ensure if field exists it is set to current user ID, if set].&lt;br /&gt;
* Fixes serialization of EPM for &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; option of &amp;lt;code&amp;gt;tools/epm&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Fixes issues with &amp;lt;code&amp;gt;disable&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;unpack&amp;lt;/code&amp;gt; options for &amp;lt;code&amp;gt;tools/epm&amp;lt;/code&amp;gt;.&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/342 Duplicated &amp;quot;_label&amp;quot; span id]&lt;br /&gt;
* Fixes [https://github.com/eprints/eprints3.4/issues/341 Tab children deemed decorative]&lt;br /&gt;
* Fixes bug preventing user password updates from command line.&lt;br /&gt;
* Fixes intermittent issue with &amp;lt;code&amp;gt;xmlns:xsi&amp;lt;/code&amp;gt; attribute being defined twice on some &amp;lt;code&amp;gt;/cgi/oai2/...&amp;lt;/code&amp;gt; pages.&lt;br /&gt;
* Check that &amp;lt;code&amp;gt;uri&amp;lt;/code&amp;gt; of relation is set before comparing its value for &amp;lt;code&amp;gt;EPrints::DataObj::remove_dataobj_relations&amp;lt;/code&amp;gt;&lt;br /&gt;
* Check that &amp;lt;code&amp;gt;uri&amp;lt;/code&amp;gt; of relation is set before comparing its value for &amp;lt;code&amp;gt;EPrints::MetaField::Relation::to_sax_basic&amp;lt;/code&amp;gt;&lt;br /&gt;
* Check URL is set before testing its length in &amp;lt;code&amp;gt;EPrints::Extras::render_url_truncate_end&amp;lt;/code&amp;gt;&lt;br /&gt;
* Fixes &amp;lt;code&amp;gt;EPrints::XML::SAX::Writer::escape&amp;lt;/code&amp;gt; to make sure &amp;lt;code&amp;gt;$str&amp;lt;/code&amp;gt; is set before applying regular expression&lt;br /&gt;
* Export bar form should use &amp;lt;code&amp;gt;rel_cgipath&amp;lt;/code&amp;gt; not &amp;lt;code&amp;gt;http_cgiroot&amp;lt;/code&amp;gt;&lt;br /&gt;
* Actually use &amp;lt;code&amp;gt;size&amp;lt;/code&amp;gt; when calling &amp;lt;code&amp;gt;EPrints::DataObj::Document::render_icon_link&amp;lt;/code&amp;gt;&lt;br /&gt;
* Ensure lookup of keyname is set before using it in &amp;lt;code&amp;gt;EPrints::Database::get_dataobjs&amp;lt;/code&amp;gt;&lt;br /&gt;
* Testing an import should set the &amp;lt;code&amp;gt;filename&amp;lt;/code&amp;gt; parameter like it would in a real import&lt;br /&gt;
* Checks &amp;lt;code&amp;gt;$c-&amp;gt;{oai}-&amp;gt;{comments}&amp;lt;/code&amp;gt; is set before iterating over it.&lt;br /&gt;
* Prevents bin script from complaining about email-less users. &lt;br /&gt;
* Fixed EPC &amp;lt;code&amp;gt;contains&amp;lt;/code&amp;gt; function to return a boolean value rather than a TRUE/FALSE string.&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/365 Allows documents to &amp;lt;code&amp;gt;redo_thumbnails&amp;lt;/code&amp;gt; even if they have no parent eprint]&lt;br /&gt;
* Fixes wrong optione name for loading external DTDs in XML&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/366 Fixes overloading of etaField &amp;lt;code&amp;gt;render_quiet&amp;lt;/code&amp;gt; attribute by introducing &amp;lt;code&amp;gt;render_column_quiet&amp;lt;/code&amp;gt; attribute&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/369 Fixes unsecure request when uploading file]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/371 Fix encoding issues for bespoke Export plugins]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/334 Using page_id pin in page templates breaks editing static pages in web interface]&lt;br /&gt;
* Checks value is set before performing a regular expression replace in &amp;lt;code&amp;gt;EPrints::MetaField::Search::form_value_basi&amp;lt;/code&amp;gt;&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/375 Return more appropriate &amp;lt;code&amp;gt;500&amp;lt;/code&amp;gt; rather than &amp;lt;code&amp;gt;404&amp;lt;/code&amp;gt; HTTP code if document present but database query fails]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/377 Fixes drag 'n' drop issues leading to zero byte files]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/378 Fixes &amp;quot;More input rows&amp;quot; button affecting layout of Compound field tables in workflow]&lt;br /&gt;
* Ensures clicking tabs on abstract pages does not reload page&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/380 Ensures fields sent in autocompleter requests are encoded]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/383 Allows phrase editor to add phrases for alternative languages]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/385 Fixes bug with edit subjects if ID field value is too long]&lt;br /&gt;
* Fixes warnings produced when &amp;lt;code&amp;gt;readonly&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;show_help&amp;lt;/code&amp;gt; MetaField attributes are not defined when expected&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/48 Fixes further issue with &amp;lt;code&amp;gt;toform&amp;lt;/code&amp;gt; attribute for &amp;lt;code&amp;gt;itemref&amp;lt;/code&amp;gt; MetaField]&lt;br /&gt;
* Fixes warnings when using &amp;lt;codeEPrints::UTils::compare_version function&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/323 Fixes ancestor numbers (of items) in subject-based browse views]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/390 Fixes slow page loads when user has lots of items under Manage Deposits]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/249 Reverts changes to implement subject MetaField's &amp;lt;code&amp;gt;top&amp;lt;/code&amp;gt; attribute as a function] (Best done through conditional in the workflow)&lt;br /&gt;
* Fixes XSLT import/export plugins so they no longer prevent EPrints being run using Apache MPM Event (i.e. threaded)&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/384 Ensure search pages respect &amp;lt;code&amp;gt;template&amp;lt;/code&amp;gt; specified in their configuration]&lt;br /&gt;
* Makes sure XML converted to string does not contain any control/non characters that might break if they attempt to be rendered within XML.&lt;br /&gt;
* Fixes wrong config variable loads for &amp;lt;code&amp;gt;citation_default&amp;lt;/code&amp;gt; for Dublin Core and simple export.&lt;br /&gt;
* Extends sanitization invalid characters for values of ID metadata fields and their subclasses.&lt;br /&gt;
* Fixes various typos&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/395 Fixes broken &amp;lt;code&amp;gt;eprint_status&amp;lt;/code&amp;gt; filters when &amp;lt;code&amp;gt;get_users_owned_eprints&amp;lt;/code&amp;gt; configuration function is defined]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/394 Fixes incorrect white space in citations rendered in emails]&lt;br /&gt;
&lt;br /&gt;
== Known Issues ==&lt;br /&gt;
=== Running generate_apacheconf with an archive without a cfg/static/javascript/auto/ directory ===&lt;br /&gt;
If you are upgrading an EPrints repository and your archive(s) do not have a &amp;lt;code&amp;gt;cfg/static/javascript/auto/&amp;lt;/code&amp;gt; directory then &amp;lt;code&amp;gt;bin/generate_apacheconf&amp;lt;/code&amp;gt; will fail.  This is because 3.4.5 [https://github.com/eprints/eprints3.4/issues/286 introduces] code that makes sure that the maximum upload limit is configured to be the same in the Apache configuration and in EPrints' JavaScript, which prevents you from trying to upload files larger than a certain size.  This is useful because if you just updated the JavaScript, EPrints would allow the upload to start but would then fail when the Apache limit was reached.  So not only would you not be able to upload the file but you would waste a load of time and possibly not understand why the upload failed.&lt;br /&gt;
&lt;br /&gt;
To fix this issue for this version of EPrints, just make sure your archive (or archives) all have a &amp;lt;code&amp;gt;cfg/static/javascript/auto/&amp;lt;/code&amp;gt; before running &amp;lt;code&amp;gt;bin/generate_apacheconf&amp;lt;/code&amp;gt;.  Future versions of EPrints will automatically create this directory if it does not already exist.&lt;br /&gt;
&lt;br /&gt;
=== Subject search does not work in workflows ===&lt;br /&gt;
If you have a subject field which renders as a subject tree in a workflow, the search form will not work.  This is due to the [https://github.com/eprints/eprints3.4/issues/246 fix for ensuring Xapian respect a MetaField's &amp;lt;tt&amp;gt;text_index&amp;lt;/tt&amp;gt; value].  This has the consequence of not indexing the &amp;lt;tt&amp;gt;ancestors&amp;lt;/tt&amp;gt; field for subjects.  This is used by the search to filter out subjects that are not part of the subject sub-tree for a particular MetaField.  [https://github.com/eprints/eprints3.4/commit/3fbd47ccc0d9e66514455c693b62b902790e3326 This patch] fixes [https://github.com/eprints/eprints3.4/issues/411 the issue].  However, you will also need to re-index all subjects:&lt;br /&gt;
 EPRINTS_PATH/bin/epadmin reindex ARCHIVE_ID subject&lt;br /&gt;
&lt;br /&gt;
=== Approved document requests still force user to login ===&lt;br /&gt;
This issue was caused by setting the &amp;lt;code&amp;gt;samesite&amp;lt;/code&amp;gt; attribute for the &amp;lt;code&amp;gt;eprints_doc_request&amp;lt;/code&amp;gt; cookie to &amp;lt;code&amp;gt;Strict&amp;lt;/code&amp;gt;, this cookie is intended to allow the user to access the restricted document for the remainder of their session.  Changing this attributes means some browsers (e.g. Firefox) still send the user to a login page even when clicking the approved request link in the email they received.  This is because the change made to the cookie prevents its from being stored because &amp;lt;code&amp;gt;/cgi/process_request&amp;lt;/code&amp;gt; never fully serves a page.  [https://github.com/eprints/eprints3.4/commit/278b5e599dc9f6aa1e4a20f3b211afabb2a4ea9a This patch] fixes the [https://github.com/eprints/eprints3.4/issues/413 the issue].&lt;br /&gt;
&lt;br /&gt;
=== File uploads not check for size ===&lt;br /&gt;
If you use the &amp;quot;Browse...&amp;quot; or &amp;quot;Choose File&amp;quot; button to upload files using the file dialogue (drag 'n' drop is unaffected) it will not check if the size is above the maximum permitted according to &amp;lt;code&amp;gt;$c-&amp;gt;{max_upload_filesize}&amp;lt;/code&amp;gt;.  If you do it will reach 100% but then it won't ever say it is complete and teh file won't actually have successfully uploaded. [https://github.com/eprints/eprints3.4/commit/2467b680373ac7be831e729a50c632ba7ec15e85This patch] fixes the [https://github.com/eprints/eprints3.4/issues/406 the issue].&lt;br /&gt;
&lt;br /&gt;
== Further Planned Features and Improvements ==&lt;br /&gt;
See [https://github.com/eprints/eprints3.4/milestone/8  3.4.7 milestone on GitHub] for more details.&lt;br /&gt;
&lt;br /&gt;
[[Category:Eprints3.4]]&lt;br /&gt;
[[Category:Releases]]&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Shibboleth&amp;diff=17035</id>
		<title>Shibboleth</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Shibboleth&amp;diff=17035"/>
		<updated>2026-02-04T18:01:19Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Changed from sp_metadata.xml to sp-metadata.xml for better filename convention&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Manual}}&lt;br /&gt;
'''This page details how to install and integrate Shibboleth with EPrints 3.3.x or 3.4.x on a CentOS 7 operating system.'''  The process should be fairly similar for other comparable Red Hat based Linux distributions such as RHEL 7 and Fedora 21/22.  These instructions should also be generally applicable to later versions of RHEL-based Linux (e.g. Rocky Linux 8, Red Hat Enterprise Linux 9, etc.). However, they may be somewhat different for Debian-based Linux, such as Ubuntu and Debian itself and other Linux distributions.  Typically, this will just be different package names and different commands to manage applications.&lt;br /&gt;
&lt;br /&gt;
Generally, it is a good idea to run EPrints with '''HTTPS''' when using Shibboleth authentication for increased security on the attributes being sent back by the Shibboleth Identity Provider (IdP).  Therefore, it is assumed that EPrints has already been set up to use HTTPS and there already exists an '''ssl/securevhost.conf''' under the archive directory structure.&lt;br /&gt;
&lt;br /&gt;
== Installing Shibboleth ==&lt;br /&gt;
* First, add the Shibboleth repository to your list of YUM repositories (if you need this for a different RHEL-based Linux distribution fill in the form at https://shibboleth.net/downloads/service-provider/latest/RPMS/):&lt;br /&gt;
  root&amp;gt; wget -O /etc/yum.repos.d/shibboleth.repo https://shibboleth.net/cgi-bin/sp_repo.cgi?platform=CentOS_7&lt;br /&gt;
&lt;br /&gt;
* Now you can use Yum to install all package dependencies:&lt;br /&gt;
  root&amp;gt; yum install log4shib opensaml shibboleth unixODBC xerces-c xml-security-c xmltooling &lt;br /&gt;
&lt;br /&gt;
* You may be prompted to accept the importing of the key for the Shibboleth repository, for which you should type '''y''' and press enter.&lt;br /&gt;
&lt;br /&gt;
* Once you have done that, test that '''shibd''' has no issues:&lt;br /&gt;
  root&amp;gt; LD_LIBRARY_PATH=/opt/shibboleth/lib64 shibd -t&lt;br /&gt;
&lt;br /&gt;
* ''shibd -t'' should return a couple of warning, like those listed below.  These are due to it not yet being configured.&lt;br /&gt;
  2015-05-11 10:39:01 WARN Shibboleth.Application : insecure cookieProps setting, set to &amp;quot;https&amp;quot; for SSL/TLS-only usage&lt;br /&gt;
  2015-05-11 10:39:01 WARN Shibboleth.Application : handlerSSL should be enabled for SSL/TLS-enabled web sites&lt;br /&gt;
  2015-05-11 10:39:01 WARN Shibboleth.Application : no MetadataProvider available, configure at least one for standard SSO usage&lt;br /&gt;
  overall configuration is loadable, check console for non-fatal problems&lt;br /&gt;
&lt;br /&gt;
* If there are no other warning or error messages from ''shibd -t'', you can start it properly and check to make sure it is running. You may also want ensure Shibboleth starts at boot using '''systemctl  enable'''&lt;br /&gt;
  root&amp;gt; systemctl start shibd.service&lt;br /&gt;
  root&amp;gt; ps aux | grep shib&lt;br /&gt;
  shibd    29338  0.4  0.7 419784 15024 ?        Ssl  11:16   0:00 /usr/sbin/shibd -p /var/run/shibboleth/shibd.pid -f -w 30&lt;br /&gt;
  root     29345  0.0  0.0 112640   940 pts/2    S+   11:17   0:00 grep --color=auto -i shib&lt;br /&gt;
  root&amp;gt; systemctl enable shibd.service&lt;br /&gt;
&lt;br /&gt;
== Configuring Shibboleth ==&lt;br /&gt;
* Replace '''/etc/shibboleth/shibboleth2.xml''' with the following.  Substitute '''foo.eprints.org''' for the hostname of your EPrints repository, '''https://shib.foo.example.org/idp/shibboleth''' with the entity ID for you Shibboleth IdP and '''foo''' in the pathname of files with the name or your repository (e.g. ''foo/attribute-map.xml'' becomes ''myrepo/attribute-map.xml'').  '''(This configuration is intended for Shibboleth SP version 2.x and is liable to cause deprecation warnings if  you have installed a recent version of Shibboleth from a package repository.  [[Shibboleth/3.x|Here is a default shibboleth2.xml configuration for Shibboleth 3.x]]).'''&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;SPConfig xmlns=&amp;quot;urn:mace:shibboleth:3.0:native:sp:config&amp;quot;&lt;br /&gt;
    xmlns:conf=&amp;quot;urn:mace:shibboleth:3.0:native:sp:config&amp;quot;&lt;br /&gt;
    clockSkew=&amp;quot;180&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
    &amp;lt;ApplicationDefaults entityID=&amp;quot;https://foo.eprints.org/shibboleth&amp;quot;&lt;br /&gt;
                         REMOTE_USER=&amp;quot;eppn subject-id pairwise-id persistent-id&amp;quot;&lt;br /&gt;
                         cipherSuites=&amp;quot;DEFAULT:!EXP:!LOW:!aNULL:!eNULL:!DES:!IDEA:!SEED:!RC4:!3DES:!kRSA:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
      &amp;lt;Sessions lifetime=&amp;quot;28800&amp;quot; timeout=&amp;quot;3600&amp;quot; relayState=&amp;quot;ss:mem&amp;quot; &lt;br /&gt;
                checkAddress=&amp;quot;false&amp;quot; handlerSSL=&amp;quot;true&amp;quot; cookieProps=&amp;quot;https&amp;quot;&lt;br /&gt;
                redirectLimit=&amp;quot;exact&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;SSO entityID=&amp;quot;https://shib.foo.example.org/idp/shibboleth&amp;quot;&amp;gt;SAML2&amp;lt;/SSO&amp;gt;&lt;br /&gt;
        &amp;lt;Logout&amp;gt;SAML2 Local&amp;lt;/Logout&amp;gt;&lt;br /&gt;
        &amp;lt;LogoutInitiator type=&amp;quot;Admin&amp;quot; Location=&amp;quot;/Logout/Admin&amp;quot; acl=&amp;quot;127.0.0.1 ::1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Handler type=&amp;quot;Status&amp;quot; Location=&amp;quot;/Status&amp;quot; acl=&amp;quot;127.0.0.1 ::1&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;Handler type=&amp;quot;Session&amp;quot; Location=&amp;quot;/Session&amp;quot; showAttributeValues=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;Handler type=&amp;quot;DiscoveryFeed&amp;quot; Location=&amp;quot;/DiscoFeed&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/Sessions&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
      &amp;lt;Errors supportContact=&amp;quot;root@localhost&amp;quot; helpLocation=&amp;quot;/about.html&amp;quot; styleSheet=&amp;quot;/shibboleth/main.css&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;MetadataProvider type=&amp;quot;XML&amp;quot; path=&amp;quot;foo/idp-metadata.xml&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;AttributeExtractor type=&amp;quot;XML&amp;quot; validate=&amp;quot;true&amp;quot; reloadChanges=&amp;quot;false&amp;quot; path=&amp;quot;foo/attribute-map.xml&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;AttributeFilter type=&amp;quot;XML&amp;quot; validate=&amp;quot;true&amp;quot; path=&amp;quot;attribute-policy.xml&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;CredentialResolver type=&amp;quot;File&amp;quot; use=&amp;quot;signing&amp;quot; key=&amp;quot;foo/sp-key.pem&amp;quot; certificate=&amp;quot;foo/sp-cert.pem&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;CredentialResolver type=&amp;quot;File&amp;quot; use=&amp;quot;encryption&amp;quot; key=&amp;quot;foo/sp-key.pem&amp;quot; certificate=&amp;quot;foo/sp-cert.pem&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/ApplicationDefaults&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
    &amp;lt;SecurityPolicyProvider type=&amp;quot;XML&amp;quot; validate=&amp;quot;true&amp;quot; path=&amp;quot;security-policy.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;ProtocolProvider type=&amp;quot;XML&amp;quot; validate=&amp;quot;true&amp;quot; reloadChanges=&amp;quot;false&amp;quot; path=&amp;quot;protocols.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/SPConfig&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create the directory '''/etc/shibboleth/foo''', substituting ''foo'' for your repository name.&lt;br /&gt;
  root&amp;gt; mkdir /etc/shibboleth/foo&lt;br /&gt;
&lt;br /&gt;
* Copy '''attribute-map.xml''' into this new directory.&lt;br /&gt;
  cp /etc/shibboleth/attribute-map.xml /etc/shibboleth/foo/&lt;br /&gt;
&lt;br /&gt;
* Temporarily rename '''sp-cert.pem''' and '''sp-key.pem''' in '''/etc/shibboleth/''' to '''sp-cert.pem.old''' and '''sp-key.pem.old'''.&lt;br /&gt;
  root&amp;gt; cd /etc/shibboleth&lt;br /&gt;
  root&amp;gt; mv sp-cert.pem sp-cert.pem.old&lt;br /&gt;
  root&amp;gt; mv sp-key.pem sp-key.pem.old&lt;br /&gt;
&lt;br /&gt;
* Run '''keygen.sh''' from the '''/etc/shibboleth/''' directory, as follows replacing '''foo.eprints.org''' with your EPrints repository hostname.&lt;br /&gt;
  root&amp;gt; cd /etc/shibboleth&lt;br /&gt;
  root&amp;gt; ./keygen.sh -f -h foo.eprints.org -e https://foo.eprints.org/shibboleth&lt;br /&gt;
&lt;br /&gt;
* Move the new '''sp-cert.pem''' and '''sp-key.pem''' to '''/etc/shibboleth/foo/''' and move the ''.old'' files back in place:&lt;br /&gt;
  root&amp;gt; cd /etc/shibboleth&lt;br /&gt;
  root&amp;gt; mv sp-cert.pem sp-key.pem foo/&lt;br /&gt;
  root&amp;gt; mv sp-cert.pem.old sp-cert.pem&lt;br /&gt;
  root&amp;gt; mv sp-key.pem.old sp-key.pem&lt;br /&gt;
&lt;br /&gt;
* Check that '''sp-cert.pem''' and '''sp-key.pem''' in '''/etc/shibboleth/foo/''' still have the owner and group '''shibd'''.&lt;br /&gt;
  root&amp;gt; ls -l /etc/shibboleth/foo/sp-*&lt;br /&gt;
  -rw-r--r-- 1 shibd shibd 1192 May  6 19:04 /etc/shibboleth/foo/sp-cert.pem&lt;br /&gt;
  -rw------- 1 shibd shibd 1708 May  6 19:04 /etc/shibboleth/foo/sp-key.pem&lt;br /&gt;
&lt;br /&gt;
* Run '''metagen.sh''' from the '''/etc/shibboleth/''' directory, as follows replacing '''foo.eprints.org''' with your EPrints repository hostname.  You will ultimately need to send the output of this to the person managing the Shibboleth IdP server with which you want to register your EPrints repository as a service.&lt;br /&gt;
  root&amp;gt; cd /etc/shibboleth&lt;br /&gt;
  root&amp;gt; ./metagen.sh -ALO -c foo/sp-cert.pem -h foo.eprints.org -e https://foo.eprints.org/shibboleth &amp;gt; foo/sp-metadata.xml&lt;br /&gt;
&lt;br /&gt;
* Modify ''' foo/sp-metadata.xml''' to add in the namepace definitions by separately changing the &amp;lt;code&amp;gt;md:EntityDescriptor&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ds:KeyInfo&amp;lt;/code&amp;gt; lines as follows from:&lt;br /&gt;
 &amp;lt;md:EntityDescriptor entityID=&amp;quot;https://foo.eprints.org/shibboleth&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
     ...&lt;br /&gt;
       &amp;lt;ds:KeyInfo&amp;gt;&lt;br /&gt;
to:&lt;br /&gt;
 &amp;lt;md:EntityDescriptor xmlns:md=&amp;quot;urn:oasis:names:tc:SAML:2.0:metadata&amp;quot; entityID=&amp;quot;https://foo.eprints.org/shibboleth&amp;quot;&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
     ...&lt;br /&gt;
       &amp;lt;ds:KeyInfo xmlns:ds=&amp;quot;http://www.w3.org/2000/09/xmldsig#&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Use ''wget'' to download the metadata from your Shibboleth IdP (e.g. shib.foo.example.org) to the '''/etc/shibboleth/foo/''' directory.&lt;br /&gt;
  root&amp;gt; wget -O /etc/shibboleth/foo/idp-metadata.xml https://shib.foo.example.org/idp/shibboleth&lt;br /&gt;
&lt;br /&gt;
=== Using Remote IdP Metatdata ===&lt;br /&gt;
&lt;br /&gt;
As IdP Metadata may expire, you may want to use the remote metadata URL rather than a local copy.  This is what you need to do to switch to using remote IdP metadata:&lt;br /&gt;
&lt;br /&gt;
* Edit the '''MetadataProvider''' line to something like the following.  The reloadInterval is best set to 7200 but this can be set less frequently:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;MetadataProvider type=&amp;quot;XML&amp;quot; url=&amp;quot;https://shib.foo.example.org/idp/metadata.xml&amp;quot; backingFilePath=&amp;quot;foo/idp-metadata.xml&amp;quot; reloadInterval=&amp;quot;7200&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Make sure the reloadInterval is appropriate for the IdP metadata you are downloading.  If you have large metadata file,(e.g. from a federated metadata service containing metadata for other IdPs), then it may be better to set this higher than the default.  However, the configuration checker may warn you that your reload interval is too long, so you may have to choose to ignore this, if you want to avoid downloading a large federated metadata file too often.&lt;br /&gt;
&lt;br /&gt;
* Make sure that the directory '''/etc/shibboleth/foo/''' and '''/etc/shibboleth/foo/idp-metadata.xml''' if it already exists) are owned by '''shibd''':&lt;br /&gt;
&lt;br /&gt;
 chown shibd:shibd /etc/shibboleth/foo/&lt;br /&gt;
 chown shibd:shibd /etc/shibboleth/foo/idp-metadata.xml&lt;br /&gt;
&lt;br /&gt;
* To test Shibboleth you will need to make sure your '''LD_LIBRARY_PATH''' is set the same as shibd would have when started using ''systemctl shibd start''.&lt;br /&gt;
 &lt;br /&gt;
 LD_LIBRARY_PATH=/opt/shibboleth/lib64:$LD_LIBRARY_PATH shibd -t&lt;br /&gt;
This should return the message: ''overall configuration is loadable, check console for non-fatal problems''.&lt;br /&gt;
&lt;br /&gt;
* The above message is because it is now advised not to leave the MetadataGenerator enabled unnecessarily.  However, whilst you are setting up Shibboleth, it is useful to have the metadata generator, save you needing to build your own Service Provider metadata file to register with your Identity Provider.  Later on you can comment out the MetadataGenerator line to stop getting this warning message.&lt;br /&gt;
&lt;br /&gt;
* Now you can restart '''shibd''' properly:&lt;br /&gt;
&lt;br /&gt;
 systemctl restart shibd&lt;br /&gt;
&lt;br /&gt;
== Configuring Apache and EPrints ==&lt;br /&gt;
'''N.B. All these actions should be carried out by the ''eprints'' user, except when prepended with ''root&amp;gt;'' which means the command should be run as the ''root'' user.'''&lt;br /&gt;
* Add the following configuration to your archive's '''ssl/securevhost.conf''', after the '''Include /opt/eprints3/cfg/apache_ssl/foo.conf''', substituting '''foo''' for your archive's name where appropriate.  (This assumes you are running Apache 2.4 or greater).  See [[#Apache 2.2 (and lower) Configuration for EPrints Shibboleth Integration |Troubleshooting]] for instructions on the configuration to use for Apache 2.2. or lower.&lt;br /&gt;
&lt;br /&gt;
 Alias /shibboleth /opt/eprints3/archives/foo/shibboleth&lt;br /&gt;
 &amp;lt;Location &amp;quot;/shibboleth&amp;quot;&amp;gt;&lt;br /&gt;
   SetHandler perl-script&lt;br /&gt;
   PerlHandler ModPerl::Registry&lt;br /&gt;
   PerlSendHeader Off&lt;br /&gt;
   Options ExecCGI FollowSymLinks&lt;br /&gt;
 &lt;br /&gt;
   AuthType shibboleth&lt;br /&gt;
   ShibRequestSetting requireSession 1&lt;br /&gt;
   require shib-session&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /cgi/shibboleth&amp;gt;&lt;br /&gt;
   AuthType shibboleth&lt;br /&gt;
   ShibRequestSetting requireSession 1&lt;br /&gt;
   require shib-session&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Copy the following code into your archive (e.g. /opt/eprints3/archives/foo/) as '''cgi/shibboleth'''.&lt;br /&gt;
 use EPrints;&lt;br /&gt;
 use strict;&lt;br /&gt;
 my $session = new EPrints::Session;&lt;br /&gt;
 exit( 0 ) unless( defined $session );&lt;br /&gt;
 &lt;br /&gt;
 $session-&amp;gt;send_http_header( &amp;quot;content_type&amp;quot; =&amp;gt; &amp;quot;text/html&amp;quot; );&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;&amp;amp;lt;html&amp;amp;gt;&amp;amp;lt;head/&amp;amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;amp;lt;code&amp;amp;gt;\n&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 foreach my $key (sort keys(%ENV)) {&lt;br /&gt;
   print &amp;quot;&amp;amp;lt;p&amp;amp;gt;$key = $ENV{$key}&amp;amp;lt;/p&amp;amp;gt;&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;&amp;amp;lt;/code&amp;amp;gt;&amp;amp;lt;/body&amp;amp;gt;&amp;amp;lt;/html&amp;amp;gt;&amp;quot;;&lt;br /&gt;
 $session-&amp;gt;terminate;&lt;br /&gt;
 exit;&lt;br /&gt;
&lt;br /&gt;
* Now restart Shibboleth and Apache:&lt;br /&gt;
  root&amp;gt; systemctl restart shibd.service&lt;br /&gt;
  root&amp;gt; apachectl restart&lt;br /&gt;
&lt;br /&gt;
* In a web browser go the '''/cgi/shibboleth''' page for your repository, (e.g. ''https://foo.eprints.org/cgi/shibboleth'').  You should be redirected to an error page for your your Shibboleth IdP (e.g. ''https://shib.foo.example.org/idp/profile/SAML2/Redirect/SSO?...'').  &lt;br /&gt;
&lt;br /&gt;
* If instead you are displayed with a list of key values or are forbidden to access the page, you have not configured Apache properly, if so, see [[#Apache_Configuration_Issues|Apache_Configuration_Issues]] under [[#Troubleshooting|Troubleshooting]].  If you see an error message like the one below, you have not set up Shibboleth properly, if so, see [[#Shibboleth_Configuration_Issues|Shibboleth_Configuration_Issues]] under [[#Troubleshooting|Troubleshooting]].&lt;br /&gt;
 opensaml::saml2md::MetadataException&lt;br /&gt;
 The system encountered an error at Wed May 6 15:19:27 2015&lt;br /&gt;
 To report this problem, please contact the site administrator at root@localhost.&lt;br /&gt;
 Please include the following message in any email:&lt;br /&gt;
 opensaml::saml2md::MetadataException at (http://foo.eprints.org/cgi/shibboleth)&lt;br /&gt;
 Unable to locate metadata for identity provider (https://shib.foo.example.org/idp/shibboleth)&lt;br /&gt;
&lt;br /&gt;
* Next, copy the following code into your archive (e.g. ''/opt/eprints3/archives/foo/'') as '''cfg/cfg.d/zz_shibboleth.pl'''.  This is needed to redirect login and logout to use Shibboleth rather than local login.&lt;br /&gt;
 $c-&amp;gt;{get_login_url} = sub {&lt;br /&gt;
   my( $session, $target ) = @_;&lt;br /&gt;
 &lt;br /&gt;
   # preserve CGI params&lt;br /&gt;
   $session-&amp;gt;read_params;&lt;br /&gt;
   $target = $session-&amp;gt;get_url(&lt;br /&gt;
     host =&amp;gt; 1,&lt;br /&gt;
     path =&amp;gt; &amp;quot;auto&amp;quot;,&lt;br /&gt;
     query =&amp;gt; 1,&lt;br /&gt;
   );&lt;br /&gt;
 &lt;br /&gt;
   my $url = URI-&amp;gt;new( $session-&amp;gt;config( &amp;quot;https_url&amp;quot; )  . &amp;quot;/shibboleth/login&amp;quot; );&lt;br /&gt;
   $url-&amp;gt;query_form( target =&amp;gt; &amp;quot;$target&amp;quot; );&lt;br /&gt;
   return &amp;quot;$url&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 $c-&amp;gt;{on_logout} = sub {&lt;br /&gt;
   my( $session ) = @_;&lt;br /&gt;
   my $query = $session-&amp;gt;query;&lt;br /&gt;
   return unless defined $query;&lt;br /&gt;
 &lt;br /&gt;
   # remove _shibsession_ cookie&lt;br /&gt;
   my( $shibname, $shibvalue );&lt;br /&gt;
   for( $query-&amp;gt;cookie() ) {&lt;br /&gt;
     if( $_ =~ /^_shibsession/ ) {&lt;br /&gt;
       $shibname = $_;&lt;br /&gt;
       $shibvalue = $query-&amp;gt;cookie( $shibname );&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   my $cookie = $query-&amp;gt;cookie(&lt;br /&gt;
     -name    =&amp;gt; $shibname,&lt;br /&gt;
     -path    =&amp;gt; &amp;quot;/&amp;quot;,&lt;br /&gt;
     -value   =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
     -host  =&amp;gt; $session-&amp;gt;config(&amp;quot;cookie_domain&amp;quot;),&lt;br /&gt;
     -expires =&amp;gt; &amp;quot;-1d&amp;quot;,&lt;br /&gt;
   );&lt;br /&gt;
   EPrints::Apache::AnApache::header_out(&lt;br /&gt;
     $session-&amp;gt;{request},&lt;br /&gt;
     &amp;quot;Set-Cookie&amp;quot; =&amp;gt; $cookie &lt;br /&gt;
   );&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 push @{$c-&amp;gt;{rewrite_exceptions}}, &amp;quot;/shibboleth/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
* Create a folder at the top level of your archive (e.g. ''/opt/eprints3/archives/foo/'') called '''shibboleth''' and copy the main CSS file for Shibboleth into this folder:&lt;br /&gt;
 eprints&amp;gt; mkdir /opt/eprints3/archives/foo/shibboleth/&lt;br /&gt;
 eprints&amp;gt; cp /usr/share/shibboleth/main.css /opt/eprints3/archives/foo/shibboleth/&lt;br /&gt;
&lt;br /&gt;
* Now, copy the following code into your archive (e.g. ''/opt/eprints3/archives/foo/'') as '''shibboleth/login'''.  This is the most basic login script that should work with the minimal attributes any Shibboleth IdP returns and '''only logging in users with existing accounts'''. Look under the [[#Customisation|Customisation]] section for advice on how to modify this script to meet your requirements, such as creation user accounts on-the-fly.&lt;br /&gt;
 use EPrints;&lt;br /&gt;
 use strict;&lt;br /&gt;
 &lt;br /&gt;
 my $session = EPrints::Session-&amp;gt;new();&lt;br /&gt;
 my $url = $session-&amp;gt;param( &amp;quot;target&amp;quot; );&lt;br /&gt;
 if ( defined $url )&lt;br /&gt;
 {&lt;br /&gt;
   my $target_uri = URI-&amp;gt;new( $url );&lt;br /&gt;
   my $repository_uri = URI-&amp;gt;new( $session-&amp;gt;get_repository-&amp;gt;get_conf( 'base_url' ) );&lt;br /&gt;
   if ( !$target_uri-&amp;gt;can( 'host' ) || $target_uri-&amp;gt;host ne $repository_uri-&amp;gt;host )&lt;br /&gt;
   {&lt;br /&gt;
     $url = undef;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 $url = $session-&amp;gt;get_repository-&amp;gt;get_conf( &amp;quot;userhome&amp;quot; ) unless EPrints::Utils::is_set( $url );&lt;br /&gt;
 &lt;br /&gt;
 my $user = &amp;amp;get_user;&lt;br /&gt;
 &lt;br /&gt;
 if( defined $user )&lt;br /&gt;
 {&lt;br /&gt;
   $user-&amp;gt;set_value( &amp;quot;last_login&amp;quot;, EPrints::Time::get_iso_timestamp() );&lt;br /&gt;
   $user-&amp;gt;commit;&lt;br /&gt;
 &lt;br /&gt;
   EPrints::DataObj::LoginTicket-&amp;gt;expire_all( $session );&lt;br /&gt;
   $session-&amp;gt;dataset( &amp;quot;loginticket&amp;quot; )-&amp;gt;create_dataobj({&lt;br /&gt;
     userid =&amp;gt; $user-&amp;gt;id,&lt;br /&gt;
   })-&amp;gt;set_cookies();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
   $url = $session-&amp;gt;get_repository-&amp;gt;get_conf( &amp;quot;base_url&amp;quot; ) . &amp;quot;/account_required.html&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 $session-&amp;gt;send_http_header( &amp;quot;content-type&amp;quot; =&amp;gt; &amp;quot;text/html&amp;quot; );&lt;br /&gt;
 print '&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;url='.$url.'&amp;quot;/&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;';&lt;br /&gt;
 $session-&amp;gt;terminate;&lt;br /&gt;
   &lt;br /&gt;
 sub get_user &lt;br /&gt;
 {&lt;br /&gt;
   my ( $username, $email ) = ( undef, &amp;quot;&amp;quot; );&lt;br /&gt;
   if( $ENV{eppn} )&lt;br /&gt;
   {&lt;br /&gt;
    ( $username ) = split( /@/, $ENV{eppn}, 2);&lt;br /&gt;
    $username = lc( $username );&lt;br /&gt;
    $email = $ENV{eppn};&lt;br /&gt;
   }&lt;br /&gt;
   return unless EPrints::Utils::is_set( $username );&lt;br /&gt;
   my $user = $session-&amp;gt;user_by_username( $username );&lt;br /&gt;
   if( defined $user &amp;amp;&amp;amp; defined $email )&lt;br /&gt;
   {&lt;br /&gt;
     $user-&amp;gt;set_value( &amp;quot;email&amp;quot;, $email );&lt;br /&gt;
     $user-&amp;gt;commit;&lt;br /&gt;
   }&lt;br /&gt;
   return $user;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Next, add the following markup to '''cfg/lang/en/static/account_required.xpage''' under your archive (e.g. ''/opt/eprints3/archives/foo/'').  Substituting ''staff and students of the University of Foo'' to describe to which particular group of people logged in access is restricted.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; standalone=&amp;quot;no&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE page SYSTEM &amp;quot;entities.dtd&amp;quot; &amp;gt;&lt;br /&gt;
 &amp;lt;xpage:page xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; xmlns:xpage=&amp;quot;http://eprints.org/ep3/xpage&amp;quot; xmlns:epc=&amp;quot;http://eprints.org/ep3/control&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;xpage:title&amp;gt;Login Failed&amp;lt;/xpage:title&amp;gt;&lt;br /&gt;
 &amp;lt;xpage:body&amp;gt;&lt;br /&gt;
    &amp;amp;lt;p style='text-align: center;'&amp;amp;gt;Please note that only staff and students of the University of Foo may log in to &amp;lt;epc:phrase ref=&amp;quot;archive_name&amp;quot; /&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &amp;lt;/xpage:body&amp;gt;&lt;br /&gt;
 &amp;lt;/xpage:page&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Now, reload Apache.&lt;br /&gt;
  root&amp;gt; apachectl reload&lt;br /&gt;
&lt;br /&gt;
* In a web browser go to the '''/shibboleth/login''' page for your repository, (e.g. ''https://foo.eprints.org/shibboleth/login'').  Like before with ''/cgi/shibboleth'' you should be taken to your Shibboleth IdP's site albeit displaying an error message.&lt;br /&gt;
&lt;br /&gt;
* The Shibboleth IdP shows an error message because EPrints as a Shibboleth Service Provider is not yet registered with it.  To do this you need to send the administrator of the Shibboleth IdP the metadata for your Service Provider.  You will have generated this earlier when you ran &amp;lt;code&amp;gt;metagen.sh&amp;lt;/code&amp;gt;.  Copy off your EPrints server the file that this wrote (e.g. to &amp;lt;tt&amp;gt;/etc/shibboleth/foo/sp-metadata.xml&amp;lt;/tt&amp;gt;) and send it to the Shibboleth IdP administrator.  They should be able to upload this to register EPrints as a Service Provider application.&lt;br /&gt;
&lt;br /&gt;
* Once registered, use a web browser to go to '''/shibboleth/login''' page for your repository, (e.g. ''https://foo.eprints.org/shibboleth/login'') again.  This time you should be prompted for a username and password on the Shibboleth IdP site. Once you have typed this in and clicked to login, you should be returned to EPrints on the '''/cgi/users/home''' page for your repository.  If not, see [[#Login_Issues|Login Issues]] under [[#Troubleshooting|Troubleshooting]] below.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Apache Configuration Issues ===&lt;br /&gt;
==== Apache 2.2 (and lower) Configuration for EPrints Shibboleth Integration ====&lt;br /&gt;
* Similarly to the instructions for Apache 2.4 and above, place the slightly different following configuration after the '''Include''' line for ''apache_ssl/foo.conf'', (substituting '''foo''' for your archive's name):&lt;br /&gt;
&lt;br /&gt;
  Alias /shibboleth /opt/eprints3/archives/foo/shibboleth&lt;br /&gt;
  &amp;lt;Directory &amp;quot;/opt/eprints3/archives/foo/shibboleth&amp;quot;&amp;gt;&lt;br /&gt;
    SetHandler perl-script&lt;br /&gt;
    PerlHandler ModPerl::Registry&lt;br /&gt;
    PerlSendHeader Off&lt;br /&gt;
    Options ExecCGI FollowSymLinks&lt;br /&gt;
  &lt;br /&gt;
    AuthType shibboleth&lt;br /&gt;
    ShibRequireSession On&lt;br /&gt;
    require valid-user&lt;br /&gt;
  &amp;lt;/Directory&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Location /cgi/shibboleth&amp;gt;&lt;br /&gt;
    AuthType shibboleth&lt;br /&gt;
    ShibRequireSession On&lt;br /&gt;
    require valid-user&lt;br /&gt;
  &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Shibboleth Configuration Issues ===&lt;br /&gt;
==== With attribute-map.xml ====&lt;br /&gt;
When authenticating using Shibboleth to login to EPrints you may see the following line in '''/var/log/shibboleth.shibd.log'''&lt;br /&gt;
&lt;br /&gt;
  2015-09-09 09:26:43 INFO Shibboleth.AttributeExtractor.XML [2]: skipping unmapped SAML 2.0 Attribute with Name:  urn:mace:dir:attribute-def:department&lt;br /&gt;
&lt;br /&gt;
In some cases this might not be an issue, as EPrints does not necessarily to make use of all the attributes returned by the IdP but without a mapping in attribute-map.xml.  In this case '''urn:mace:dir:attribute-def:department''' is not by default needed by EPrints to create/update a user account.  However, values like '''sn''', '''givenName''' and '''mail''' are but if you have used the attribute-map.xml provided later on the page you should not see a line like above in '''shibd.log'''.  In some cases you may still see an line like this in the log even if you think you have defined the attribute.  The line below demonstrate two known issues:&lt;br /&gt;
&lt;br /&gt;
  2015-09-09 09:26:43 INFO Shibboleth.AttributeExtractor.XML [2]: skipping unmapped SAML 2.0 Attribute with Name:  givenName, Format:urn:oasis:names:tc:SAML:2.0:attrname-format:basic&lt;br /&gt;
&lt;br /&gt;
# The attribute itself has no namespace it is just '''givenName''' rather than '''urn:mace:dir:attribute-def:givenName'''&lt;br /&gt;
# The attribute has a format that most also be defined in the attribute-map.xml attribute.&lt;br /&gt;
&lt;br /&gt;
Below shows how to both include the format, which is required for the attribute to be successful mapped.  As well as define the name of the attribute without a namespace:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Attribute name=&amp;quot;givenName&amp;quot; nameFormat=&amp;quot;urn:oasis:names:tc:SAML:2.0:attrname-format:basic&amp;quot; id=&amp;quot;givenName&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A typical Shibboleth IdP would have both a namespaced attribute name and would not apply a format to an attribute that is a simple text string.  Therefore it is worth enquiring with the IdP provider if either of these two happen to be the case.  The Shibboleth Service Provider can be [[Shibboleth Debug Logging|run in debug mode]], which may help your figure out what attributes are being mapped..&lt;br /&gt;
&lt;br /&gt;
==== With idp-metadata.xml ====&lt;br /&gt;
If you want to be able extract scoped attributes (e.g. '''eduPersonPrincipalName''' otherwise described as '''eppn''').  Then you will need to ensure that the expected scope of this attribute, (effectively the domain part in eduPersonPrincipalName is the scope or one of the scopes in the idp-metadata.xml you downloaded from the Shibboleth IdP.  For example if the '''eduPersonPrincipalName''' is '''bar@foo.ac.uk'''.  Then the following should be defined in idp-metadata.xml ('''N.B. the namespace abbreviations (md: and shibmd:) may be different for the IdP you are working with'''):&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;md:Extensions&amp;gt;&lt;br /&gt;
    &amp;lt;shibmd:Scope regexp=&amp;quot;false&amp;quot;&amp;gt;foo.ac.uk&amp;lt;/shibmd:Scope&amp;gt;&lt;br /&gt;
  &amp;lt;/md:Extensions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Login Issues ===&lt;br /&gt;
To be added.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Customisation ==&lt;br /&gt;
&lt;br /&gt;
=== Shibboleth /etc/shibboleth/foo/attribute-map.xml config ===&lt;br /&gt;
This is adapted from the default '''attribute-map.xml''' provided when the Shibboleth SP package is installed to only include the attribute subsequently used by EPrints Shibboleth Perl script that can be found below.  Namely:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!Field name&lt;br /&gt;
!Field description			&lt;br /&gt;
!SAML v1.1 attribute URN&lt;br /&gt;
!SAMLv2 attribute URN&lt;br /&gt;
|-&lt;br /&gt;
|eppn			&lt;br /&gt;
|Edu Person Principal Name&lt;br /&gt;
|urn:mace:dir:attribute-def:eduPersonPrincipalName&lt;br /&gt;
|urn:oid:1.3.6.1.4.1.5923.1.1.1.6&lt;br /&gt;
|-&lt;br /&gt;
|sn&lt;br /&gt;
|Surname						&lt;br /&gt;
|urn:mace:dir:attribute-def:sn								&lt;br /&gt;
|urn:oid:2.5.4.4&lt;br /&gt;
|-&lt;br /&gt;
|givenName&lt;br /&gt;
|Given (first) name(s)&lt;br /&gt;
|urn:mace:dir:attribute-def:givenName&lt;br /&gt;
|urn:oid:2.5.4.42&lt;br /&gt;
|-&lt;br /&gt;
|mail&lt;br /&gt;
|Email address	&lt;br /&gt;
|urn:mace:dir:attribute-def:mail&lt;br /&gt;
|urn:oid:0.9.2342.19200300.100.1.3  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You may wish to refer to the default '''attribute-map.xml''' is you want to use other attributes.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Attributes xmlns=&amp;quot;urn:mace:shibboleth:2.0:attribute-map&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:mace:dir:attribute-def:eduPersonPrincipalName&amp;quot; id=&amp;quot;eppn&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AttributeDecoder xsi:type=&amp;quot;ScopedAttributeDecoder&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:oid:1.3.6.1.4.1.5923.1.1.1.6&amp;quot; id=&amp;quot;eppn&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AttributeDecoder xsi:type=&amp;quot;ScopedAttributeDecoder&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:mace:dir:attribute-def:sn&amp;quot; id=&amp;quot;sn&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:mace:dir:attribute-def:givenName&amp;quot; id=&amp;quot;givenName&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:mace:dir:attribute-def:mail&amp;quot; id=&amp;quot;mail&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:oid:2.5.4.4&amp;quot; nameFormat=&amp;quot;urn:oasis:names:tc:SAML:2.0:attrname-format:basic&amp;quot; id=&amp;quot;sn&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:oid:2.5.4.42&amp;quot; nameFormat=&amp;quot;urn:oasis:names:tc:SAML:2.0:attrname-format:basic&amp;quot; id=&amp;quot;givenName&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:oid:0.9.2342.19200300.100.1.3&amp;quot; nameFormat=&amp;quot;urn:oasis:names:tc:SAML:2.0:attrname-format:basic&amp;quot; id=&amp;quot;mail&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;/Attributes&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== EPrints /shibboleth/login script with user account creation ===&lt;br /&gt;
This is the standard EPrints Shibboleth login script.  It makes a number of assumptions:&lt;br /&gt;
# That accounts should be created if they do not already exist for a particular user.&lt;br /&gt;
# That you wish to create a standard user account (not an editor administrator) account.&lt;br /&gt;
# That the Shibboleth IdP provides all the attributes (eduPersonPrinicpalName (seen as eppn), sn, givenName and mail) required.&lt;br /&gt;
&lt;br /&gt;
 use EPrints;&lt;br /&gt;
 use strict;&lt;br /&gt;
 &lt;br /&gt;
 my $session = EPrints::Session-&amp;gt;new();&lt;br /&gt;
 my $url = $session-&amp;gt;param( &amp;quot;target&amp;quot; );&lt;br /&gt;
 if ( defined $url )&lt;br /&gt;
 {&lt;br /&gt;
   my $target_uri = URI-&amp;gt;new( $url );&lt;br /&gt;
   my $repository_uri = URI-&amp;gt;new( $session-&amp;gt;get_repository-&amp;gt;get_conf( 'base_url' ) );&lt;br /&gt;
   if ( !$target_uri-&amp;gt;can( 'host' ) || $target_uri-&amp;gt;host ne $repository_uri-&amp;gt;host )&lt;br /&gt;
   {&lt;br /&gt;
     $url = undef;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 $url = $session-&amp;gt;get_repository-&amp;gt;get_conf( &amp;quot;userhome&amp;quot; ) unless EPrints::Utils::is_set( $url );&lt;br /&gt;
 &lt;br /&gt;
 my $user = &amp;amp;get_user;&lt;br /&gt;
 &lt;br /&gt;
 if( defined $user )&lt;br /&gt;
 {&lt;br /&gt;
   $user-&amp;gt;set_value( &amp;quot;last_login&amp;quot;, EPrints::Time::get_iso_timestamp() );&lt;br /&gt;
   $user-&amp;gt;commit;&lt;br /&gt;
 &lt;br /&gt;
   EPrints::DataObj::LoginTicket-&amp;gt;expire_all( $session );&lt;br /&gt;
   $session-&amp;gt;dataset( &amp;quot;loginticket&amp;quot; )-&amp;gt;create_dataobj({&lt;br /&gt;
     userid =&amp;gt; $user-&amp;gt;id,&lt;br /&gt;
   })-&amp;gt;set_cookies();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
   $url = $session-&amp;gt;get_repository-&amp;gt;get_conf( &amp;quot;base_url&amp;quot; ) . &amp;quot;/account_required.html&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 $session-&amp;gt;send_http_header( &amp;quot;content-type&amp;quot; =&amp;gt; &amp;quot;text/html&amp;quot; );&lt;br /&gt;
 print '&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;url='.$url.'&amp;quot;/&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;';&lt;br /&gt;
 $session-&amp;gt;terminate;&lt;br /&gt;
 &lt;br /&gt;
 sub get_user&lt;br /&gt;
 {&lt;br /&gt;
   my ($username, $given, $family, $email) = (undef, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   if( $ENV{eppn} )&lt;br /&gt;
   {&lt;br /&gt;
     ( $username ) = split( /@/, $ENV{eppn}, 2);&lt;br /&gt;
     $username = lc( $username );&lt;br /&gt;
   }&lt;br /&gt;
   $email = $ENV{mail} if $ENV{mail};&lt;br /&gt;
   if( $ENV{givenName} )&lt;br /&gt;
   {&lt;br /&gt;
     $given = lc( $ENV{givenName} );&lt;br /&gt;
     $given =~ s/^(.)/uc($1)/e;&lt;br /&gt;
     $given =~ s/([- ].)/uc($1)/e;&lt;br /&gt;
   }&lt;br /&gt;
   if( $ENV{sn} )&lt;br /&gt;
   {&lt;br /&gt;
     $family = lc( $ENV{sn} );&lt;br /&gt;
     $family =~ s/^(.)/uc($1)/e;&lt;br /&gt;
     $family =~ s/([- ].)/uc($1)/e;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   return unless EPrints::Utils::is_set( $username );&lt;br /&gt;
 &lt;br /&gt;
   my $user = $session-&amp;gt;user_by_username( $username ); # relying on this to be case insensitive&lt;br /&gt;
 &lt;br /&gt;
   if( !defined $user )&lt;br /&gt;
   {&lt;br /&gt;
     my $usertype = 'user';&lt;br /&gt;
     $user = EPrints::DataObj::User::create( $session, $usertype );&lt;br /&gt;
     $user-&amp;gt;set_value( &amp;quot;username&amp;quot;, $username );&lt;br /&gt;
   }&lt;br /&gt;
   my $name = {&lt;br /&gt;
     given =&amp;gt; $given,&lt;br /&gt;
     family =&amp;gt; $family,&lt;br /&gt;
   };&lt;br /&gt;
   $user-&amp;gt;set_value( &amp;quot;name&amp;quot;, $name );&lt;br /&gt;
   $user-&amp;gt;set_value( &amp;quot;email&amp;quot;, $email );&lt;br /&gt;
   $user-&amp;gt;commit;&lt;br /&gt;
   return $user;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Further Information ==&lt;br /&gt;
* Older instructions of how to set up EPrints for Shibboleth using UK Access management Federation discovery service is available [[Shibboleth authentication|here]].&lt;br /&gt;
&lt;br /&gt;
* For general information about installing and configuring Shibboleth [http://shibboleth.internet2.edu/ click here].&lt;br /&gt;
&lt;br /&gt;
* [https://docs.openathens.net/display/public/TPA/Sign+in+to+a+generic+application+using+OpenAthens#SignintoagenericapplicationusingOpenAthens-SetupthecustomSAMLresourceinOpenAthens Instructions of connection a Shibboleth Service Provider with OpenAthens]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Authentication]]&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints_Flavours&amp;diff=17034</id>
		<title>EPrints Flavours</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints_Flavours&amp;diff=17034"/>
		<updated>2026-01-27T10:09:04Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Since EPrints 3.4 flavours have been introduced into EPrints.  Flavours provide customisation for different types of EPrints.  The following four flavours are currently exist:&lt;br /&gt;
# '''Publications''' - This is the original EPrints for research publications. Its flavours sub-directory is '''[[flavours/pub_lib/|pub_lib]]''', which comes as part of the core codebase but is provided separately on [https://files.eprints.org files.eprints.org].&lt;br /&gt;
# '''Research Data''' - This provides specific customisations for research data. Its flavours sub-directory is '''[[flavours/data_lib/|data_lib]]'''.&lt;br /&gt;
# '''Open Education''' -  This provides specific customisations for open education, previously known as EdShare. Its flavours sub-directory is '''[[flavours/edu_lib/|edu_lib]]'''.&lt;br /&gt;
# '''Research Impact''' -  This provides specific customisations for capturing research impact. Its flavours sub-directory is '''[[flavours/impact_lib/|impact_lib]]''' and can be checked out from [https://github.com/eprints/impact_lib GitHub].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installing a Flavour ==&lt;br /&gt;
If you install EPrints from [https://files.eprints.org files.eprints.org] instead of before when you could just download a single tarball, you will need to:&lt;br /&gt;
&lt;br /&gt;
# Download the '''EPrints Zero''' tarball which is a base version of EPrints without any specializations for publications, like was the case for EPrints 3.3 and earlier.&lt;br /&gt;
# Unpack the '''EPrints Zero''' tarball to '''[[EPrints_Directory_Structure_Tree|/opt/eprints3/]]'''&lt;br /&gt;
# Download the flavour you want, such as the publication flavour tarball, and unpack it into '''[[EPrints_Directory_Structure/eprints3/flavours|/opt/eprints3/flavours/]]'''.&lt;br /&gt;
&lt;br /&gt;
After you have finished installing EPrints as a flavour, you may also want to add [[EPrints Ingredients|Ingredients]].  Ingredients are often similar to [https://bazaar.eprints.org Bazaar] plug-ins and intend to replace some of the more complex Bazaar plug-ins, which are not really suited to a one-click installation as they need extensive configuration and/or non-EPrints dependencies.&lt;br /&gt;
&lt;br /&gt;
[[Category:Customisation]]&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Flavours/impact_lib/&amp;diff=17033</id>
		<title>Flavours/impact lib/</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Flavours/impact_lib/&amp;diff=17033"/>
		<updated>2026-01-27T10:08:43Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added impact_lib directory&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{dirs}}&lt;br /&gt;
{{noeditdir}}&lt;br /&gt;
&lt;br /&gt;
The '''flavours/impact_lib/''' directory contains configuration and code for the [[EPrints Flavours|impact flavour]].  Like the [[EPrints_Directory_Structure/eprints3/lib|lib/]] directory, files under this directory should not be modified but instead copied to the equivalent archive level directory and modified there.&lt;br /&gt;
&lt;br /&gt;
*'''[[EPrints_Directory_Structure/eprints3|eprints3]]/[[EPrints_Directory_Structure/eprints3/flavours|flavours]]/impact_lib'''&lt;br /&gt;
** ''TO BE ADDED''&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints_Flavours&amp;diff=17032</id>
		<title>EPrints Flavours</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints_Flavours&amp;diff=17032"/>
		<updated>2026-01-27T10:07:34Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added impact flavour&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Since EPrints 3.4 flavours have been introduced into EPrints.  Flavours provide customisation for different types of EPrints.  The following four flavours are currently exist:&lt;br /&gt;
# '''Publications''' - This is the original EPrints for research publications. Its flavours sub-directory is '''[[flavours/pub_lib/|pub_lib]]''', which comes as part of the core codebase but is provided separately on [https://files.eprints.org files.eprints.org].&lt;br /&gt;
# '''Research Data''' - This provides specific customisations for research data. Its flavours sub-directory is '''[[flavours/data_lib/|data_lib]]'''.&lt;br /&gt;
# '''Open Education''' -  This provides specific customisations for open education, previously known as EdShare. Its flavours sub-directory is '''[[flavours/edu_lib/|edu_lib]]'''.&lt;br /&gt;
# '''Research Impact''' -  This provides specific customisations for capturing research impact. Its flavours sub-directory is '''[[flavours/impact_lib/|impact_lib]]''' and can be checked out from [https://github.com/eprints/impact_lib|GitHub].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Installing a Flavour ==&lt;br /&gt;
If you install EPrints from [https://files.eprints.org files.eprints.org] instead of before when you could just download a single tarball, you will need to:&lt;br /&gt;
&lt;br /&gt;
# Download the '''EPrints Zero''' tarball which is a base version of EPrints without any specializations for publications, like was the case for EPrints 3.3 and earlier.&lt;br /&gt;
# Unpack the '''EPrints Zero''' tarball to '''[[EPrints_Directory_Structure_Tree|/opt/eprints3/]]'''&lt;br /&gt;
# Download the flavour you want, such as the publication flavour tarball, and unpack it into '''[[EPrints_Directory_Structure/eprints3/flavours|/opt/eprints3/flavours/]]'''.&lt;br /&gt;
&lt;br /&gt;
After you have finished installing EPrints as a flavour, you may also want to add [[EPrints Ingredients|Ingredients]].  Ingredients are often similar to [https://bazaar.eprints.org Bazaar] plug-ins and intend to replace some of the more complex Bazaar plug-ins, which are not really suited to a one-click installation as they need extensive configuration and/or non-EPrints dependencies.&lt;br /&gt;
&lt;br /&gt;
[[Category:Customisation]]&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Main_Page&amp;diff=17031</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Main_Page&amp;diff=17031"/>
		<updated>2026-01-27T08:37:18Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* Add-ons, patches and translations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Howto]]__NOTOC__&lt;br /&gt;
= Welcome to the EPrints Wiki =&lt;br /&gt;
&lt;br /&gt;
This wiki contains technical and user-contributed documentation for the [[Introduction|EPrints repository software]].&lt;br /&gt;
&lt;br /&gt;
[http://tryme.demo.eprints-hosting.org/ Demoprints] is our live, online server that allows anyone to try EPrints without having to install it first.  There are also [http://pub.demo.eprints-hosting.org/ examples] of various 'flavours' of EPrints available to view as well as some more information on the [https://eprints.org/ EPrints project] and related activities.&lt;br /&gt;
&lt;br /&gt;
==New to EPrints?==&lt;br /&gt;
&lt;br /&gt;
Found out more through our:&lt;br /&gt;
* [[EPrints Glossary]] - Descriptions of the terminology used within EPrints repository software.&lt;br /&gt;
* [[:Category:Training Video|Video Training Course]] - Videos showing how to use, configure, maintain and develop EPrints repository software.&lt;br /&gt;
* [[EPrints_Manual|Documentation]] - Written documentation for how to use, configure, maintain and develop EPrints repository software.&lt;br /&gt;
* Mailing lists - There are two mail lists that you might like to join and where you can ask for help and share ideas:&lt;br /&gt;
**  '''[[eprints-tech Mailing List|The EPrints Technical Mailing List]]''' &lt;br /&gt;
*** If you have technical questions, or a part of your EPrints installation is not working properly, this group has people who might be able to help!&lt;br /&gt;
*** [[eprints-tech Mailing List|Click here]] for information about [[eprints-tech Mailing List#Subscription_Options|subscribing to this list]] or [[eprints-tech Mailing List#List_Archives|reading its archives]].&lt;br /&gt;
** '''[https://groups.google.com/forum/#!forum/eprints-uk-user-group The EPrints User Group Google Group]'''&lt;br /&gt;
*** This group is for anyone involved in using EPrints.  Ask questions, share ideas, hear about forthcoming meetings.&lt;br /&gt;
* How to [[Main_Page#Contributing_to_the_Wiki|contribute to the EPrints wiki]]&lt;br /&gt;
* EPrints source code on GitHub:&lt;br /&gt;
** Core and major plugins - https://github.com/eprints&lt;br /&gt;
** Community code sharing - https://eprintsug.github.io and the repositories at https://github.com/eprintsug&lt;br /&gt;
&lt;br /&gt;
== Download EPrints ==&lt;br /&gt;
&lt;br /&gt;
{{Download}}&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Installation|Installing]] EPrints on various platforms&lt;br /&gt;
&lt;br /&gt;
==[[New_Repository | Getting Started]]==&lt;br /&gt;
&lt;br /&gt;
* [[EPrints Manual|EPrints 3 Documentation]]&lt;br /&gt;
* [[Perl 101 for EPrints]]&lt;br /&gt;
* [[Frequently Asked Questions]]&lt;br /&gt;
* [[:Category:Howto|How to ...]]&lt;br /&gt;
* [[:Category:Plugins|Plugins and Bazaar packages for EPrints]]&lt;br /&gt;
* [[:Category:Training Video|EPrints Training Course]]&lt;br /&gt;
&lt;br /&gt;
==Getting Support==&lt;br /&gt;
&lt;br /&gt;
* [https://www.eprints.org/eprints-services/ EPrints Services] - premium support, training and hosting from EPrints experts&lt;br /&gt;
* [[Contact]] - mailing lists, bug reports etc.&lt;br /&gt;
* [[User group meetings]] - regional meetings for users, which often have notes, presentations and information of general interest&lt;br /&gt;
&lt;br /&gt;
==Add-ons, patches and translations==&lt;br /&gt;
* As of version 3.4 EPrints can be deployed in one of a number of [[EPrints Flavours|flavours]].  The flavours can be supplemented with [[EPrints Ingredients|ingredients]].  These ingredients are [https://github.com/search?q=topic%3Aingredient+org%3Aeprints+org%3Aeprintsug&amp;amp;type=repositories available from GitHub].&lt;br /&gt;
* As of version 3.3 EPrints can now install plugins and translations through the [https://bazaar.eprints.org EPrints Bazaar] the wiki also has information about [[:Category:EPrints Bazaar|packaging plugins for the Bazaar]].&lt;br /&gt;
* The [https://files.eprints.org/ EPrints Files Repository] contains add-on and 3rd party scripts, patches and translations. This also provides an archive of all previous EPrints releases (3.0 onwards).&lt;br /&gt;
* [[:Category:Plugins|Plugins]]: Some Wiki pages about scripts and patches.&lt;br /&gt;
&lt;br /&gt;
{{Register}}&lt;br /&gt;
&lt;br /&gt;
==Contributing to EPrints==&lt;br /&gt;
&lt;br /&gt;
* [[Usability|EPrints usability]]&lt;br /&gt;
* New features in EPrints - [[:Category:Releases|released]] and [[:Category:Planned Releases|proposed]]&lt;br /&gt;
* [[How to contribute|How to contribute to EPrints development]]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4 EPrints 3.4 on GitHub] - Codebase, releases and issues tracker for EPrints 3.4.&lt;br /&gt;
* [https://github.com/eprints/eprints3 EPrints 3.3 on GitHub] - Codebase, releases and issues tracker for EPrints 3.3 (legacy).&lt;br /&gt;
&lt;br /&gt;
== Content management ==&lt;br /&gt;
&lt;br /&gt;
* [[Digital preservation]]: managing content for longer-term access and use&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Main_Page&amp;diff=17030</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Main_Page&amp;diff=17030"/>
		<updated>2026-01-27T08:36:16Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* Add-ons, patches and translations */ Added point about 3.4 ingredients&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Howto]]__NOTOC__&lt;br /&gt;
= Welcome to the EPrints Wiki =&lt;br /&gt;
&lt;br /&gt;
This wiki contains technical and user-contributed documentation for the [[Introduction|EPrints repository software]].&lt;br /&gt;
&lt;br /&gt;
[http://tryme.demo.eprints-hosting.org/ Demoprints] is our live, online server that allows anyone to try EPrints without having to install it first.  There are also [http://pub.demo.eprints-hosting.org/ examples] of various 'flavours' of EPrints available to view as well as some more information on the [https://eprints.org/ EPrints project] and related activities.&lt;br /&gt;
&lt;br /&gt;
==New to EPrints?==&lt;br /&gt;
&lt;br /&gt;
Found out more through our:&lt;br /&gt;
* [[EPrints Glossary]] - Descriptions of the terminology used within EPrints repository software.&lt;br /&gt;
* [[:Category:Training Video|Video Training Course]] - Videos showing how to use, configure, maintain and develop EPrints repository software.&lt;br /&gt;
* [[EPrints_Manual|Documentation]] - Written documentation for how to use, configure, maintain and develop EPrints repository software.&lt;br /&gt;
* Mailing lists - There are two mail lists that you might like to join and where you can ask for help and share ideas:&lt;br /&gt;
**  '''[[eprints-tech Mailing List|The EPrints Technical Mailing List]]''' &lt;br /&gt;
*** If you have technical questions, or a part of your EPrints installation is not working properly, this group has people who might be able to help!&lt;br /&gt;
*** [[eprints-tech Mailing List|Click here]] for information about [[eprints-tech Mailing List#Subscription_Options|subscribing to this list]] or [[eprints-tech Mailing List#List_Archives|reading its archives]].&lt;br /&gt;
** '''[https://groups.google.com/forum/#!forum/eprints-uk-user-group The EPrints User Group Google Group]'''&lt;br /&gt;
*** This group is for anyone involved in using EPrints.  Ask questions, share ideas, hear about forthcoming meetings.&lt;br /&gt;
* How to [[Main_Page#Contributing_to_the_Wiki|contribute to the EPrints wiki]]&lt;br /&gt;
* EPrints source code on GitHub:&lt;br /&gt;
** Core and major plugins - https://github.com/eprints&lt;br /&gt;
** Community code sharing - https://eprintsug.github.io and the repositories at https://github.com/eprintsug&lt;br /&gt;
&lt;br /&gt;
== Download EPrints ==&lt;br /&gt;
&lt;br /&gt;
{{Download}}&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Installation|Installing]] EPrints on various platforms&lt;br /&gt;
&lt;br /&gt;
==[[New_Repository | Getting Started]]==&lt;br /&gt;
&lt;br /&gt;
* [[EPrints Manual|EPrints 3 Documentation]]&lt;br /&gt;
* [[Perl 101 for EPrints]]&lt;br /&gt;
* [[Frequently Asked Questions]]&lt;br /&gt;
* [[:Category:Howto|How to ...]]&lt;br /&gt;
* [[:Category:Plugins|Plugins and Bazaar packages for EPrints]]&lt;br /&gt;
* [[:Category:Training Video|EPrints Training Course]]&lt;br /&gt;
&lt;br /&gt;
==Getting Support==&lt;br /&gt;
&lt;br /&gt;
* [https://www.eprints.org/eprints-services/ EPrints Services] - premium support, training and hosting from EPrints experts&lt;br /&gt;
* [[Contact]] - mailing lists, bug reports etc.&lt;br /&gt;
* [[User group meetings]] - regional meetings for users, which often have notes, presentations and information of general interest&lt;br /&gt;
&lt;br /&gt;
==Add-ons, patches and translations==&lt;br /&gt;
* As of version 3.4 EPrints can be deployed in one of a number of [[EPrints FLavours|flavours]].  The flavours can be supplemented with [[EPrints Ingredients|ingredients]].  These ingredients are [https://github.com/search?q=topic%3Aingredient+org%3Aeprints+org%3Aeprintsug&amp;amp;type=repositories available from GitHub].&lt;br /&gt;
* As of version 3.3 EPrints can now install plugins and translations through the [https://bazaar.eprints.org EPrints Bazaar] the wiki also has information about [[:Category:EPrints Bazaar|packaging plugins for the Bazaar]].&lt;br /&gt;
* The [https://files.eprints.org/ EPrints Files Repository] contains add-on and 3rd party scripts, patches and translations. This also provides an archive of all previous EPrints releases (3.0 onwards).&lt;br /&gt;
* [[:Category:Plugins|Plugins]]: Some Wiki pages about scripts and patches.&lt;br /&gt;
&lt;br /&gt;
{{Register}}&lt;br /&gt;
&lt;br /&gt;
==Contributing to EPrints==&lt;br /&gt;
&lt;br /&gt;
* [[Usability|EPrints usability]]&lt;br /&gt;
* New features in EPrints - [[:Category:Releases|released]] and [[:Category:Planned Releases|proposed]]&lt;br /&gt;
* [[How to contribute|How to contribute to EPrints development]]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4 EPrints 3.4 on GitHub] - Codebase, releases and issues tracker for EPrints 3.4.&lt;br /&gt;
* [https://github.com/eprints/eprints3 EPrints 3.3 on GitHub] - Codebase, releases and issues tracker for EPrints 3.3 (legacy).&lt;br /&gt;
&lt;br /&gt;
== Content management ==&lt;br /&gt;
&lt;br /&gt;
* [[Digital preservation]]: managing content for longer-term access and use&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Main_Page&amp;diff=17029</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Main_Page&amp;diff=17029"/>
		<updated>2026-01-27T08:03:27Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* New to EPrints? */ Added descriptions for videos and documentation.  Removed link to working groups&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Howto]]__NOTOC__&lt;br /&gt;
= Welcome to the EPrints Wiki =&lt;br /&gt;
&lt;br /&gt;
This wiki contains technical and user-contributed documentation for the [[Introduction|EPrints repository software]].&lt;br /&gt;
&lt;br /&gt;
[http://tryme.demo.eprints-hosting.org/ Demoprints] is our live, online server that allows anyone to try EPrints without having to install it first.  There are also [http://pub.demo.eprints-hosting.org/ examples] of various 'flavours' of EPrints available to view as well as some more information on the [https://eprints.org/ EPrints project] and related activities.&lt;br /&gt;
&lt;br /&gt;
==New to EPrints?==&lt;br /&gt;
&lt;br /&gt;
Found out more through our:&lt;br /&gt;
* [[EPrints Glossary]] - Descriptions of the terminology used within EPrints repository software.&lt;br /&gt;
* [[:Category:Training Video|Video Training Course]] - Videos showing how to use, configure, maintain and develop EPrints repository software.&lt;br /&gt;
* [[EPrints_Manual|Documentation]] - Written documentation for how to use, configure, maintain and develop EPrints repository software.&lt;br /&gt;
* Mailing lists - There are two mail lists that you might like to join and where you can ask for help and share ideas:&lt;br /&gt;
**  '''[[eprints-tech Mailing List|The EPrints Technical Mailing List]]''' &lt;br /&gt;
*** If you have technical questions, or a part of your EPrints installation is not working properly, this group has people who might be able to help!&lt;br /&gt;
*** [[eprints-tech Mailing List|Click here]] for information about [[eprints-tech Mailing List#Subscription_Options|subscribing to this list]] or [[eprints-tech Mailing List#List_Archives|reading its archives]].&lt;br /&gt;
** '''[https://groups.google.com/forum/#!forum/eprints-uk-user-group The EPrints User Group Google Group]'''&lt;br /&gt;
*** This group is for anyone involved in using EPrints.  Ask questions, share ideas, hear about forthcoming meetings.&lt;br /&gt;
* How to [[Main_Page#Contributing_to_the_Wiki|contribute to the EPrints wiki]]&lt;br /&gt;
* EPrints source code on GitHub:&lt;br /&gt;
** Core and major plugins - https://github.com/eprints&lt;br /&gt;
** Community code sharing - https://eprintsug.github.io and the repositories at https://github.com/eprintsug&lt;br /&gt;
&lt;br /&gt;
== Download EPrints ==&lt;br /&gt;
&lt;br /&gt;
{{Download}}&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Installation|Installing]] EPrints on various platforms&lt;br /&gt;
&lt;br /&gt;
==[[New_Repository | Getting Started]]==&lt;br /&gt;
&lt;br /&gt;
* [[EPrints Manual|EPrints 3 Documentation]]&lt;br /&gt;
* [[Perl 101 for EPrints]]&lt;br /&gt;
* [[Frequently Asked Questions]]&lt;br /&gt;
* [[:Category:Howto|How to ...]]&lt;br /&gt;
* [[:Category:Plugins|Plugins and Bazaar packages for EPrints]]&lt;br /&gt;
* [[:Category:Training Video|EPrints Training Course]]&lt;br /&gt;
&lt;br /&gt;
==Getting Support==&lt;br /&gt;
&lt;br /&gt;
* [https://www.eprints.org/eprints-services/ EPrints Services] - premium support, training and hosting from EPrints experts&lt;br /&gt;
* [[Contact]] - mailing lists, bug reports etc.&lt;br /&gt;
* [[User group meetings]] - regional meetings for users, which often have notes, presentations and information of general interest&lt;br /&gt;
&lt;br /&gt;
==Add-ons, patches and translations==&lt;br /&gt;
&lt;br /&gt;
* As of version 3.3 EPrints can now install plugins and translations through the [https://bazaar.eprints.org EPrints Bazaar] the wiki also has information about [[:Category:EPrints Bazaar|packaging plugins for the Bazaar]].&lt;br /&gt;
* The [https://files.eprints.org/ EPrints Files Repository] contains add-on and 3rd party scripts, patches and translations. This also provides an archive of all previous EPrints releases (3.0 onwards).&lt;br /&gt;
* [[:Category:Plugins|Plugins]]: Some Wiki pages about scripts and patches.&lt;br /&gt;
&lt;br /&gt;
{{Register}}&lt;br /&gt;
&lt;br /&gt;
==Contributing to EPrints==&lt;br /&gt;
&lt;br /&gt;
* [[Usability|EPrints usability]]&lt;br /&gt;
* New features in EPrints - [[:Category:Releases|released]] and [[:Category:Planned Releases|proposed]]&lt;br /&gt;
* [[How to contribute|How to contribute to EPrints development]]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4 EPrints 3.4 on GitHub] - Codebase, releases and issues tracker for EPrints 3.4.&lt;br /&gt;
* [https://github.com/eprints/eprints3 EPrints 3.3 on GitHub] - Codebase, releases and issues tracker for EPrints 3.3 (legacy).&lt;br /&gt;
&lt;br /&gt;
== Content management ==&lt;br /&gt;
&lt;br /&gt;
* [[Digital preservation]]: managing content for longer-term access and use&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=MediaWiki:Sidebar&amp;diff=17028</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=MediaWiki:Sidebar&amp;diff=17028"/>
		<updated>2026-01-26T16:21:00Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added glossary to sidebar&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** mainpage|Front Page&lt;br /&gt;
** Entire_Manual|EPrints 3 Manual&lt;br /&gt;
** Category:Training Video|EPrints Training Course&lt;br /&gt;
** EPrints Glossary|EPrints Glossary&lt;br /&gt;
** Installation|Installing EPrints&lt;br /&gt;
** Category:Howto|How-to Configure EPrints&lt;br /&gt;
** Category:API|EPrints 3.2+ API&lt;br /&gt;
** Category:EPrints 3 Reference|EPrints 3 Reference&lt;br /&gt;
** Category:Plugins|EPrints Plugins&lt;br /&gt;
* Wiki&lt;br /&gt;
** Special:Categories|All categories&lt;br /&gt;
** Special:Recentchanges|Recent changes&lt;br /&gt;
** mainpage|mainpage&lt;br /&gt;
** helppage|help&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Manual&amp;diff=17027</id>
		<title>Manual</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Manual&amp;diff=17027"/>
		<updated>2026-01-26T16:14:27Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* Installation */ upped version numbers for OS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
See the [[Main Page]] for other areas of this wiki.&lt;br /&gt;
&lt;br /&gt;
* [[Introduction|Introduction to EPrints]] and [[History|History of EPrints]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;table cellpadding=&amp;quot;10&amp;quot;&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td width=&amp;quot;33%&amp;quot; valign=&amp;quot;top&amp;quot;&amp;gt; &lt;br /&gt;
= Releases =&lt;br /&gt;
{{releasenotes}}&lt;br /&gt;
''See also the note on [[EPrints Version Numbering]]''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Download =&lt;br /&gt;
{{Download}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Installation =&lt;br /&gt;
* [[Recommended Platforms]]&lt;br /&gt;
* [[Required software]]&lt;br /&gt;
* Install Guides&lt;br /&gt;
** [[Installing EPrints on RHEL/Fedora/CentOS]]&lt;br /&gt;
*** Primarily RedHat Enterprise Linux (RHEL) and Rocky Linux 8 or 9 (and latterly 10)&lt;br /&gt;
*** Guides for installing from RPM package and from source.&lt;br /&gt;
** [[Installing EPrints on Debian/Ubuntu]]&lt;br /&gt;
*** Primarily Ubuntu 22.04 LTS and 24.04 LTS.&lt;br /&gt;
*** Guides for installing from Deb package and from source.&lt;br /&gt;
* [[Installation|Generic EPrints installation instructions]]&lt;br /&gt;
* [[How to use EPrints with HTTPS]]&lt;br /&gt;
** [[Setting up HTTPS using Let's Encrypt]]&lt;br /&gt;
** [[HTTPS-only and HSTS]]&lt;br /&gt;
* [[Installing EPrints using Docker]]&lt;br /&gt;
&lt;br /&gt;
= Post Installation =&lt;br /&gt;
* [[Getting Started with EPrints 3]]&lt;br /&gt;
&lt;br /&gt;
= Maintenance =&lt;br /&gt;
* [[Backups]]&lt;br /&gt;
* [[Generate Scripts]]&lt;br /&gt;
* [[Alerts]]&lt;br /&gt;
* [[Log Files]]&lt;br /&gt;
* [[Automating your maintenance]]&lt;br /&gt;
* [[Troubleshooting]]&lt;br /&gt;
* [[Apache Hardening]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;td width=&amp;quot;33%&amp;quot; valign=&amp;quot;top&amp;quot; style=&amp;quot;border-left: solid 1px #ccc; border-right: solid 1px #ccc;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Training Materials =&lt;br /&gt;
* [[:Category:Training Video|EPrints Training Course]]&lt;br /&gt;
* [http://www.eprints.org/software/training/ Training materials] provided by EPrints Services.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= How-to Guides =&lt;br /&gt;
''[http://en.wikipedia.org/wiki/Howto What is a how-to?]&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Howto|Orientation/Overview]] &amp;lt;span style=&amp;quot;color: #f94; font-size: 130%&amp;quot;&amp;gt;(Start here)&amp;lt;/span&amp;gt;&lt;br /&gt;
** [[Configuration orientation|New to EPrints 3?]]  - ''before diving into the how-tos, take some time to read through this brief orientation guide and familiarise yourself with the EPrints configuration landscape ...''&lt;br /&gt;
* [[Front Page Warning | Removing the Front Page Warning]] - Your first go at branding&lt;br /&gt;
* [[Branding with confidence]] - ''one of the most common EPrints customisations is to add your own institution's branding and &amp;quot;look and feel&amp;quot; to the interface...''&lt;br /&gt;
** [[Branding, the next level]] - ''how to completely change the interface to your own design''&lt;br /&gt;
* [[OAI]]&lt;br /&gt;
* [[Adding new views]]&lt;br /&gt;
* Workflow&lt;br /&gt;
* Deposit Types&lt;br /&gt;
** [[Removing types]]&lt;br /&gt;
* Metadata&lt;br /&gt;
* Subjects (fold in with Organisation Hierarchy under &amp;quot;controled vocabularies&amp;quot;)&lt;br /&gt;
* [[EPrints_3_Organisation_Hierarchy|Organisation Hierarchy]] - ''how to put your own organisation's Hierarchy into EPrints 3''&lt;br /&gt;
* Searches&lt;br /&gt;
* [[Autocompletion and Authority Files (Romeo Autocomplete)]] - ''add autocomplete functionality to the Publication Title input field based on an authority file downloaded from EPrints Romeo...''&lt;br /&gt;
* [[Create Export Plugins]] - ''create a Perl Module that will export your data...''&lt;br /&gt;
* [[Login-Only Repository]] - ''require a username and password to access all pages (including search, browse, and the front page)...''&lt;br /&gt;
* [[Change Deposit Status in Bulk]] - ''move a large number of deposits from inbox to archive.''&lt;br /&gt;
* [[SWORD]] - ''how to configure the SWORD protocol on EPrints.''&lt;br /&gt;
* [[Custom handlers]] - ''how to add a custom handler for intergration with third-party applications.''&lt;br /&gt;
* [[User Deposit Agreement]] - ''How to add a user deposit agreement to the workflow.''&lt;br /&gt;
* [[ORCID]]&lt;br /&gt;
** [[Import From ORCID]]&lt;br /&gt;
* Javascript&lt;br /&gt;
** [[Include Javascript in the workflow]]&lt;br /&gt;
* DKIM email verification&lt;br /&gt;
** [[How to configure DKIM email verification (using sendmail on Rocky9)]]&lt;br /&gt;
&lt;br /&gt;
= How to contribute =&lt;br /&gt;
There's a number of different ways you can contribute to the EPrints project. This section covers all the ones we can think of...&lt;br /&gt;
&lt;br /&gt;
Always make an entry on http://files.eprints.org/ for your contribution, even if you don't upload the files. This will make it the one-stop place for people to find EPrints extensions.&lt;br /&gt;
&lt;br /&gt;
* [[:Category:Documentation Needed| Create some of the missing documentation]]&lt;br /&gt;
* [[Contribute: Plugins | Plugins]]&lt;br /&gt;
* [[Contribute: Scripts | Scripts]]&lt;br /&gt;
* [[Contribute: Themes | Themes]]&lt;br /&gt;
* [[Contribute: Translations | Translations]]&lt;br /&gt;
* [[Contribute: Other | Other neighbourly things to do]]&lt;br /&gt;
* [[Extension Packages]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Misc =&lt;br /&gt;
* [[Preservation Support]] in EPrints 3&lt;br /&gt;
* [[:Category:Languages|Language support and translations]]&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;td valign=&amp;quot;top&amp;quot; width=&amp;quot;33%&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Technical Reference =&lt;br /&gt;
* [[EPrints Directory Structure]] - How code and configuation files are organised.&lt;br /&gt;
* [[EPrints Glossary]] - A listing of terminology used within EPrints.&lt;br /&gt;
* [[User Menu]] - Explaining the menu options available to an EPrints user.&lt;br /&gt;
* [[Admin|Admin Menu]] - Explaining the tools available to a repository administrator.&lt;br /&gt;
* [[Metadata]] - configuring metadata fields.&lt;br /&gt;
* [[Archives/ARCHIVEID/cfg/|Repository Configuration]]&lt;br /&gt;
* [[XML Configuration]] Files&lt;br /&gt;
** [[EPScript]] - documentation for the EP3 Scripting language (for use in citations and workflow files).&lt;br /&gt;
** [[EPrints Control Format]] - the structure used to embed EPScript in an XML configuration file.&lt;br /&gt;
** [[Citation Format]]&lt;br /&gt;
** [[Workflow Format]] - the structure of the EP3 workflow files&lt;br /&gt;
** [[Phrase Format]]&lt;br /&gt;
** [[Template Format]]&lt;br /&gt;
** [[XPAGE Format]]&lt;br /&gt;
* [[XML Export Format]]&lt;br /&gt;
* EPrints data structure &lt;br /&gt;
** of the software&lt;br /&gt;
** of the database (relating the dataobjects to each other using eprints fields)&lt;br /&gt;
* [[Data Object]]s and data sets&lt;br /&gt;
** The [[EPrint Object]]&lt;br /&gt;
** The [[User Object]]&lt;br /&gt;
** The [[Document Object]]&lt;br /&gt;
** The [[Subject Object]]&lt;br /&gt;
** The [[Saved Search Object]]&lt;br /&gt;
** The [[History Object]]&lt;br /&gt;
** The [[Access Object]]&lt;br /&gt;
** The [[Request Object]]&lt;br /&gt;
* [[:Category:Plugins|Plugins]]&lt;br /&gt;
** [[Create Export Plugins|Export]]&lt;br /&gt;
** Import &lt;br /&gt;
** [[Screen Plugins|Screen]]&lt;br /&gt;
* [[Autocompletion]]&lt;br /&gt;
** [[Understanding IDs in Workflow Forms]]&lt;br /&gt;
* [[API]]&lt;br /&gt;
* [[Dynamic Template System]]&lt;br /&gt;
* [[Config Options by File]]&lt;br /&gt;
* [[Triggers|Trigger functions]]&lt;br /&gt;
&lt;br /&gt;
= The EPrints Bazaar =&lt;br /&gt;
* [[:Category:EPrints_Bazaar|The EPrints Bazaar]] (Start Here)&lt;br /&gt;
* The [[EPM Specification]]&lt;br /&gt;
* [[:Category:Bazaar_Package|Bazaar Packages]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Installation&amp;diff=17026</id>
		<title>Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Installation&amp;diff=17026"/>
		<updated>2026-01-26T16:12:23Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{manual}}&lt;br /&gt;
[[Category:Installation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Installing EPrints on RHEL/Fedora/CentOS|Installation on Red Hat Enterprise based Linux]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Installing_EPrints_on_Debian/Ubuntu|Installation on Debian/Ubuntu]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Generic Linux Installation|Installation on Generic Linux Operating System]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{:Category:Installation}}&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Installation&amp;diff=17025</id>
		<title>Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Installation&amp;diff=17025"/>
		<updated>2026-01-26T16:11:55Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{manual}}&lt;br /&gt;
[[Category:Installation]]&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Installing EPrints on RHEL/Fedora/CentOS|Installation on Red Hat Enterprise based Linux]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Installing_EPrints_on_Debian/Ubuntu|Installation on Debian/Ubuntu]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Generic Linux Installation|Installation on Generic Linux Operating System]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{:Category:Installation}}&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Installation&amp;diff=17024</id>
		<title>Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Installation&amp;diff=17024"/>
		<updated>2026-01-26T16:11:16Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{manual}}&lt;br /&gt;
[[Category:Installation]]&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Installing EPrints on RHEL/Fedora/CentOS|Installation on Red Hat Enterprise based Linux]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Installing_EPrints_on_Debian/Ubuntu|Installation on Debian/Ubuntu]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Generic Linux Installation|Installation on Generic Linux Operating System]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{:Category:Installation}}&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Installation&amp;diff=17023</id>
		<title>Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Installation&amp;diff=17023"/>
		<updated>2026-01-26T16:10:45Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{manual}}&lt;br /&gt;
[[Category:Installation]]&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Installing EPrints on RHEL/Fedora/CentOS|Installation on Red Hat Enterprise based Linux]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Installing_EPrints_on_Debian/Ubuntu|Installation on Debian/Ubuntu]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Generic Linux Installation|Installation on Generic Linux Operating System]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{:Category:Installation}}&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=MediaWiki:Sidebar&amp;diff=17022</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=MediaWiki:Sidebar&amp;diff=17022"/>
		<updated>2026-01-26T16:10:25Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Switch to main installation page not category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* navigation&lt;br /&gt;
** mainpage|Front Page&lt;br /&gt;
** Entire_Manual|EPrints 3 Manual&lt;br /&gt;
** Category:Training Video|EPrints Training Course&lt;br /&gt;
** Installation|Installing EPrints&lt;br /&gt;
** Category:Howto|How-to Configure EPrints&lt;br /&gt;
** Category:API|EPrints 3.2+ API&lt;br /&gt;
** Category:EPrints 3 Reference|EPrints 3 Reference&lt;br /&gt;
** Category:Plugins|EPrints Plugins&lt;br /&gt;
* Wiki&lt;br /&gt;
** Special:Categories|All categories&lt;br /&gt;
** Special:Recentchanges|Recent changes&lt;br /&gt;
** mainpage|mainpage&lt;br /&gt;
** helppage|help&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Installation&amp;diff=17020</id>
		<title>Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Installation&amp;diff=17020"/>
		<updated>2026-01-26T09:10:09Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{manual}}&lt;br /&gt;
[[Category:Installation]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Installing EPrints on RHEL/Fedora/CentOS|Installation on Red Hat Enterprise based Linux]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Installing_EPrints_on_Debian/Ubuntu|Installation on Debian/Ubuntu]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Generic Linux Installation|Installation on Generic Linux Operating System]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{:Category:Installation}}&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Installation&amp;diff=17019</id>
		<title>Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Installation&amp;diff=17019"/>
		<updated>2026-01-26T09:09:58Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{manual}}&lt;br /&gt;
[[Category:Installation]]&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Installing EPrints on RHEL/Fedora/CentOS|Installation on Red Hat Enterprise based Linux]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Installing_EPrints_on_Debian/Ubuntu|Installation on Debian/Ubuntu]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Generic Linux Installation|Installation on Generic Linux Operating System]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hr/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{:Category:Installation}}&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Installing_EPrints_on_Debian/Ubuntu&amp;diff=17018</id>
		<title>Installing EPrints on Debian/Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Installing_EPrints_on_Debian/Ubuntu&amp;diff=17018"/>
		<updated>2026-01-26T09:04:16Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added to manual&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{manual}}&lt;br /&gt;
[[Category:Debian and Ubuntu]]&lt;br /&gt;
[[Category:Installation]]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* Ubuntu 22.04 LTS and Ubuntu 24.04 LTS (non-LTS versions not recommended)&lt;br /&gt;
* Debian 11 (Bullseye) or Debian 12 (Bookworm) - These are not as comprehensively tested as Ubuntu LTS versions.&lt;br /&gt;
&lt;br /&gt;
=== Dependencies and Pre-configuration ===&lt;br /&gt;
'''The ideal way to install from source is via git using the Core Git repositories [https://github.com/eprints/eprints3.4 EPrints 3.4] or [https://github.com/eprints/eprints EPrints 3.3], and installing from a source tarball is generally discouraged.'''&lt;br /&gt;
&lt;br /&gt;
'''Installing from source via git is now the recommended  way to install EPrints for production repositories, after having proved to be a useful installation method to those seeking to develop the EPrints code, develop a plugin or develop a Bazaar package too.'''&lt;br /&gt;
&lt;br /&gt;
First, as the root user install all the dependencies for EPrints ('''N.B.''' Some dependencies may not be able in certain versions of Debian/Ubuntu.  See [[#Operating System Version Specific Requirements|Operating System Version Specific Requirements]] towards the end of this page):&lt;br /&gt;
&lt;br /&gt;
 apt install perl libncurses5 libselinux1 apache2 libapache2-mod-perl2 libxml-libxml-perl \&lt;br /&gt;
   libunicode-string-perl libterm-readkey-perl libmime-lite-perl libmime-types-perl libdigest-sha-perl \&lt;br /&gt;
   libdbd-mysql-perl libxml-parser-perl libxml2-dev libxml-twig-perl libarchive-any-perl libjson-perl \&lt;br /&gt;
   liblwp-protocol-https-perl libtext-unidecode-perl lynx wget ghostscript poppler-utils antiword elinks \&lt;br /&gt;
   texlive-base texlive-binaries psutils imagemagick adduser tar gzip unzip libsearch-xapian-perl \&lt;br /&gt;
   libtex-encode-perl libio-string-perl python3-html2text make libexpat1-dev libxslt1-dev&lt;br /&gt;
&lt;br /&gt;
If you are installing on Ubuntu, install MySQL server and client:&lt;br /&gt;
&lt;br /&gt;
  apt install mysql-server mysql-client libmysqlclient-dev&lt;br /&gt;
&lt;br /&gt;
If you are installing on Debian, install MariaDB server and client:&lt;br /&gt;
&lt;br /&gt;
  apt install mariadb-server mariadb-client libmariadb-dev&lt;br /&gt;
&lt;br /&gt;
Next, create the eprints user&lt;br /&gt;
&lt;br /&gt;
 adduser eprints&lt;br /&gt;
&lt;br /&gt;
Now add the eprints user to the www-data group and vice-versa&lt;br /&gt;
&lt;br /&gt;
 usermod -a -G eprints www-data&lt;br /&gt;
 usermod -a -G www-data eprints&lt;br /&gt;
&lt;br /&gt;
=== Downloading and Deploying EPrints Source ===&lt;br /&gt;
&lt;br /&gt;
==== EPrints 3.4.x for GitHub ====&lt;br /&gt;
&lt;br /&gt;
 apt install git&lt;br /&gt;
 mkdir /opt/eprints3&lt;br /&gt;
 chown eprints:eprints /opt/eprints3&lt;br /&gt;
 chmod 2775 /opt/eprints3&lt;br /&gt;
 su eprints&lt;br /&gt;
 git clone https://github.com/eprints/eprints3.4.git /opt/eprints3&lt;br /&gt;
 cd /opt/eprints3/&lt;br /&gt;
 git checkout tags/v3.4.7&lt;br /&gt;
&lt;br /&gt;
==== EPrints 3.4.x from files.eprints.org ====&lt;br /&gt;
&lt;br /&gt;
 cd /tmp/&lt;br /&gt;
 wget https://files.eprints.org/3288/1/eprints-3.4.7.tar.gz&lt;br /&gt;
 tar -xzvf eprints-3.4.7.tar.gz&lt;br /&gt;
&lt;br /&gt;
Then put in the source code in place:&lt;br /&gt;
&lt;br /&gt;
 mv eprints-3.4.7 /opt/eprints3&lt;br /&gt;
 chmod 2775 /opt/eprints3&lt;br /&gt;
 chown -R eprints:eprints /opt/eprints3&lt;br /&gt;
&lt;br /&gt;
If you want a publications flavoured repository, then also:&lt;br /&gt;
&lt;br /&gt;
 wget https://files.eprints.org/3288/2/eprints-3.4.7-flavours.tar.gz&lt;br /&gt;
 tar -xzvf eprints-3.4.7-flavours.tar.gz&lt;br /&gt;
 mv eprints-3.4.7/flavours/pub_lib /opt/eprints3/flavours&lt;br /&gt;
 chmod -R g+w /opt/eprints3/flavours/pub_lib&lt;br /&gt;
 chown -R eprints:eprints /opt/eprints3/flavours/pub_lib&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
Next, as the eprints user copy &amp;lt;code&amp;gt;EPRINTS_PATH/perl_lib/EPrints/SystemSettings.pm.tmpl&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;EPRINTS_PATH/perl_lib/EPrints/SystemSettings.pm&amp;lt;/code&amp;gt;, if it does not already exist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;EPRINTS_PATH&amp;lt;/code&amp;gt; should now always be &amp;lt;code&amp;gt;/opt/eprints3&amp;lt;/code&amp;gt;.  However, historically other paths have been used when EPrints was available as a Deb package.&lt;br /&gt;
&lt;br /&gt;
EPrints is now fully installed at &amp;lt;code&amp;gt;EPRINTS_PATH/&amp;lt;/code&amp;gt;. However, you will not yet have a running archive. Follow the [[Getting Started with EPrints 3]] instructions to set this up.&lt;br /&gt;
&lt;br /&gt;
=== Post-configuration ===&lt;br /&gt;
Next, add the file &amp;lt;code&amp;gt;/etc/apache2/sites-available/eprints.conf&amp;lt;/code&amp;gt; with the following line:&lt;br /&gt;
&lt;br /&gt;
 Include EPRINTS_PATH/cfg/apache.conf&lt;br /&gt;
&lt;br /&gt;
To enable this as root run the command:&lt;br /&gt;
&lt;br /&gt;
 root&amp;gt; a2ensite eprints&lt;br /&gt;
&lt;br /&gt;
Also it may be necessary to disable the default site otherwise the default Apache page will still be shown:&lt;br /&gt;
&lt;br /&gt;
 a2dissite 000-default&lt;br /&gt;
&lt;br /&gt;
Finally, restart Apache:&lt;br /&gt;
&lt;br /&gt;
 service apache2 restart&lt;br /&gt;
&lt;br /&gt;
You should now be able to access your vanilla repository at the hostname you specified when running '''epadmin create''' from the [[Getting Started with EPrints 3]] instructions.  You should then login as the admin user you created during this process and turn on the indexer.  This can be done by clicking on the '''Admin''' link under the Logged in menu, then clicking on the '''System Tools''' tab and finally the '''Start Indexer''' button.&lt;br /&gt;
&lt;br /&gt;
== Operating System Version Specific Requirements ==&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu 22.04 LTS ===&lt;br /&gt;
{{:Issues with Installing EPrints on Ubuntu 22.04}}&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu 24.04 LTS ===&lt;br /&gt;
{{:Issues with Installing EPrints on Ubuntu 24.04}}&lt;br /&gt;
&lt;br /&gt;
=== Debian Known Issues ===&lt;br /&gt;
See [[Debian Known Issues]]&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Installing_EPrints_on_RHEL/Fedora/CentOS&amp;diff=17017</id>
		<title>Installing EPrints on RHEL/Fedora/CentOS</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Installing_EPrints_on_RHEL/Fedora/CentOS&amp;diff=17017"/>
		<updated>2026-01-26T09:03:52Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added to manual&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{manual}}&lt;br /&gt;
[[Category:Installation]]&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
* Red Hat Enterprise (RHEL) / CentOS / Rocky Linux 8 or 9. (EPrints can be installed on RHEL / CentOS / Rocky Linux 10 but there are currently a [[#RHEL / CentOS / Rocky 10|number of issues]], some which should be resolved in later version of these Linux OSs).&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
* Pre-install and enable the EPEL DNF repository.&lt;br /&gt;
**: &amp;lt;code&amp;gt;dnf install epel-release&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pre-install and enable the CodeReady Builder DNF repository.&lt;br /&gt;
** RHEL&lt;br /&gt;
**: &amp;lt;code&amp;gt;subscription-manager repos --enable &amp;quot;codeready-builder-for-rhel-$(releasever)-$(arch)-rpms&amp;quot;&amp;lt;/code&amp;gt;&lt;br /&gt;
** CentOS Stream / Rocky Linux 8&lt;br /&gt;
**: &amp;lt;code&amp;gt;dnf config-manager --set-enabled powertools&amp;lt;/code&amp;gt;&lt;br /&gt;
** CentOS Stream / Rocky Linux 9 and 10&lt;br /&gt;
**: &amp;lt;code&amp;gt;dnf config-manager --set-enabled crb&amp;lt;/code&amp;gt;&lt;br /&gt;
* Pre-install MySQL server and client and make sure the former is enabled and running.&lt;br /&gt;
** RHEL / Fedora:&lt;br /&gt;
**: &amp;lt;code&amp;gt;dnf install mysql-server mysql mysql-devel&amp;lt;br/&amp;gt;&amp;amp;nbsp;systemctl enable --now mysqld&amp;lt;/code&amp;gt;&lt;br /&gt;
** CentOS / Rocky Linux:&lt;br /&gt;
**: &amp;lt;code&amp;gt;dnf install mariadb-server mariadb mariadb-devel&amp;lt;br/&amp;gt;&amp;amp;nbsp;systemctl enable --now mariadb&amp;lt;/code&amp;gt;&lt;br /&gt;
* From the MySQL command prompt, pre-configure an eprints user with password for MariaDB/MySQL, which can be used as the Database super user when creating the database for an archive. (Be sure to change the password from &amp;quot;changeme&amp;quot;):&lt;br /&gt;
*: &amp;lt;code&amp;gt;CREATE USER 'eprints'@'localhost' IDENTIFIED by 'changeme';&amp;lt;br/&amp;gt;&amp;amp;nbsp;GRANT ALL PRIVILEGES ON *.* TO 'eprints'@'localhost' WITH GRANT OPTION;&amp;lt;/code&amp;gt;&lt;br /&gt;
* As root, from a command prompt add the &amp;lt;tt&amp;gt;eprints&amp;lt;/tt&amp;gt; user:&lt;br /&gt;
*: &amp;lt;code&amp;gt;adduser eprints&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
The following RPMs need to be installed using the dnf command:&lt;br /&gt;
 dnf install libxml2 libxslt httpd mod_perl perl-Apache-DBI perl-DBI perl-DBD-MySQL perl-IO-Socket-SSL \&lt;br /&gt;
     perl-Time-HiRes perl-CGI perl-Digest-MD5 perl-Digest-SHA perl-Digest-SHA1 perl-JSON perl-XML-LibXML \&lt;br /&gt;
     perl-XML-LibXSLT perl-XML-SAX perl-MIME-Lite perl-Text-Unidecode perl-JSON perl-Unicode-Collate \&lt;br /&gt;
     perl-LWP-Protocol-https perl-IO-String tetex-latex wget gzip tar ImageMagick poppler-utils \&lt;br /&gt;
     chkconfig unzip cpan python3-html2text expat-devel libxslt-devel&lt;br /&gt;
&lt;br /&gt;
'''N.B.''' If you are running RHEL / CentOS / Rocky Linux 10, '''perl-Apache-DBI''' is no longer available and will need to be installed with CPAN and '''python3-html2text''' will not be available until RHEL / CentOS / Rocky Linux 10.1.  You should exclude these when running the dnf command above.  (See [[#RHEL_.2F_CentOS_.2F_Rocky_10|Operating System Version Specific Requirements for RHEL / CentOS / Rocky Linux 10]] below for more details).&lt;br /&gt;
&lt;br /&gt;
== Installing EPrints 3.4.7 from Source ==&lt;br /&gt;
'''Ideally you will install from source from [https://github.com/eprints/eprints3.4 EPrints Core Git repository], which includes the core codebase and the publications flavour.  However, you may choose to download tarballs of the EPrints core codebase and publications flavour from files.eprints.org as an alternative means of installation.&lt;br /&gt;
&lt;br /&gt;
=== From GitHub ===&lt;br /&gt;
Clone the Git repository from GitHub to &amp;lt;tt&amp;gt;/opt/&amp;lt;/tt&amp;gt; and set the &amp;lt;tt&amp;gt;eprints&amp;lt;/tt&amp;gt; user as the owner.  It is probably best to checkout the latest release rather than using HEAD, which may have known issues:&lt;br /&gt;
&lt;br /&gt;
 dnf install git&lt;br /&gt;
 mkdir /opt/eprints3&lt;br /&gt;
 chown eprints:eprints /opt/eprints3&lt;br /&gt;
 chmod 2775 /opt/eprints3&lt;br /&gt;
 su eprints&lt;br /&gt;
 git clone https://github.com/eprints/eprints3.4.git /opt/eprints3&lt;br /&gt;
 cd /opt/eprints3/&lt;br /&gt;
 git checkout tags/v3.4.7&lt;br /&gt;
&lt;br /&gt;
=== From files.eprints.org ===&lt;br /&gt;
Download and unpack the core codebase tarball for files.eprints.org.&lt;br /&gt;
 cd /tmp/&lt;br /&gt;
 wget https://files.eprints.org/3288/1/eprints-3.4.7.tar.gz&lt;br /&gt;
 tar -xzvf eprints-3.4.7.tar.gz&lt;br /&gt;
&lt;br /&gt;
Then move in the source code into place:&lt;br /&gt;
 mv eprints-3.4.7 /opt/eprints3&lt;br /&gt;
 chmod 2775 /opt/eprints3&lt;br /&gt;
 chown -R eprints:eprints /opt/eprints3&lt;br /&gt;
&lt;br /&gt;
If you want a publications flavoured repository, then you will also need to download, unpack and move that into the appropriate location:&lt;br /&gt;
 wget https://files.eprints.org/3288/2/eprints-3.4.7-flavours.tar.gz&lt;br /&gt;
 tar -xzvf eprints-3.4.7-flavours.tar.gz&lt;br /&gt;
 mv eprints-3.4.7/flavours/pub_lib /opt/eprints3/flavours&lt;br /&gt;
 chmod -R g+w /opt/eprints3/flavours/pub_lib&lt;br /&gt;
 chown -R eprints:eprints /opt/eprints3/flavours/pub_lib&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&amp;lt;span id=&amp;quot;getting_started_and_apache&amp;quot;&amp;gt;EPrints&amp;lt;/span&amp;gt; is now fully installed at &amp;lt;tt&amp;gt;/opt/eprints3&amp;lt;/tt&amp;gt;. However, you will not yet have a running archive. Follow the [[Getting Started with EPrints 3]] instructions to set this up.&lt;br /&gt;
&lt;br /&gt;
== Post-configuration ==&lt;br /&gt;
Add the &amp;lt;tt&amp;gt;eprints&amp;lt;/tt&amp;gt; user to the &amp;lt;tt&amp;gt;apache&amp;lt;/tt&amp;gt; group and vice-versa.&lt;br /&gt;
 usermod -aG apache eprints&lt;br /&gt;
 usermod -aG eprints apache&lt;br /&gt;
&lt;br /&gt;
Finally, restart Apache:&lt;br /&gt;
  service httpd restart&lt;br /&gt;
&lt;br /&gt;
=== SELinux ===&lt;br /&gt;
There is a fair chance your operating system will have SELinux enabled.  If so, follow the advice at [[EPrints and SELinux]] for how to let EPrints do what it needs to do through SELinux.  Otherwise, you could disable SELinux with the following:&lt;br /&gt;
 setenforce 0&lt;br /&gt;
However, that will only disable it until the next reboot. You should also edit '''/etc/selinux/config''' and make sure the &amp;lt;code&amp;gt;SELINUX=enforcing&amp;lt;/code&amp;gt; is set to:&lt;br /&gt;
 SELINUX=disabled&lt;br /&gt;
&lt;br /&gt;
== Non-critical Dependencies ==&lt;br /&gt;
Some of EPrints non-core functionality may not work out of the box as these dependencies are not included as part of the installation process.  Here is a list of known additional packages (and the DNF repositories in which they can be found) or CPAN modules than can be installed.  The latter should be installed using the ''cpan'' command as the root user.&lt;br /&gt;
 &lt;br /&gt;
* '''perl-Geo-IP (epel)''' - Allows IRstats2 to determine the location of views/downloads for publications. (RHEL/CentOS/Rocky Linux 8 only)&lt;br /&gt;
* '''perl-GeoIP2 (@System and epel)''' - Allows IRstats2 to determine the location of views/downloads for publications. (RHEL/CentOS/Rocky Linux 9+)&lt;br /&gt;
* '''perl-Spreadsheet-WriteExcel (epel)''' - To allow Multiline Excel export.&lt;br /&gt;
* '''CPAN module Text::Refer''' - Required for EndNote import.&lt;br /&gt;
* '''CPAN module TeX::Encode''' - Required for BibTex export needed for publications flavour.&lt;br /&gt;
* '''perl-Image-ExifTool (epel)''' - Sometimes needed to support generation of thumbnails for uploaded documents/images.&lt;br /&gt;
* '''perl-LWP-Protocol-https (base)''' - Needed by DataCite plugin to register repository DOIs.&lt;br /&gt;
&lt;br /&gt;
== Operating System Version Specific Requirements ==&lt;br /&gt;
&lt;br /&gt;
=== RHEL / CentOS / Rocky 8 ===&lt;br /&gt;
{{:Issues with installing EPrints on RHEL / CentOS / Rocky 8}}&lt;br /&gt;
&lt;br /&gt;
=== RHEL / CentOS / Rocky 9 ===&lt;br /&gt;
{{:Issues with installing EPrints on RHEL / CentOS / Rocky 9}}&lt;br /&gt;
&lt;br /&gt;
=== RHEL / CentOS / Rocky 10 ===&lt;br /&gt;
{{:Issues with installing EPrints on RHEL / CentOS / Rocky 10}}&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
* If setup is successful but then you cannot access EPrints through your web browser this is often due to firewalld being enabled by default on recent versions of RHEL, Fedora and CentOS.  If firewalld is running either disable it (&amp;lt;tt&amp;gt;systemctl disable --now firewalld&amp;lt;/tt&amp;gt;) or [https://docs.rackspace.com/support/how-to/allow-web-traffic-in-a-firewalld-software-firewall/ configure it to allow HTTP/HTTPS traffic].&lt;br /&gt;
* If you are running a version of EPrints below 3.4.6 you cannot run Apache in MPM event mode and you need to use MPM prefork instead.  This is due to Perl's &amp;lt;tt&amp;gt;XML::LibXSLT&amp;lt;/tt&amp;gt; being initiated at the wrong time leading earlier version of EPrints to cause Apache (httpd) to segfault when started.  If you are running an earlier version and want to run Apache in MPM event mode, you can uninstall &amp;lt;tt&amp;gt;XML::LibXSLT&amp;lt;/tt&amp;gt; either as the RPM perl-XML-LibXSLT or possible from CPAN using &amp;lt;code&amp;gt;cpanm --uninstall XML::LibXSLT&amp;lt;/code&amp;gt;.&lt;br /&gt;
* If you are having problems uploading files or similar functional issues, this may be due to SELinux being enabled. [[EPrints and SELinux|See advice for enabling SELinux with EPrints]].&lt;br /&gt;
* If you are having trouble getting additional subdomains beyond username.eprints-hosting.org working, then it could be you need wildcards enabled on the DNS records to facilitate the likes of somethingcoolhere.username.eprints-hosting.org urls.&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Template:Manual&amp;diff=17016</id>
		<title>Template:Manual</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Template:Manual&amp;diff=17016"/>
		<updated>2026-01-26T09:03:31Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added links to installation of EPrints on different linux OS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{box|title=Manual Sections|content=&lt;br /&gt;
* [[Introduction]]&lt;br /&gt;
** [[Contact|How to Get Help/Support]]&lt;br /&gt;
** [[History]]&lt;br /&gt;
* Installing EPrints &amp;amp; Getting Started&lt;br /&gt;
** [[Recommended Platforms]]&lt;br /&gt;
** [[Required software|Installing Required Software]]&lt;br /&gt;
** [[Installation|Installing EPrints]]&lt;br /&gt;
*** [[Installing EPrints on RHEL/Fedora/CentOS|Installation on RHEL-based Linux]]&lt;br /&gt;
*** [[Installing_EPrints_on_Debian/Ubuntu|Installation on Debian/Ubuntu]]&lt;br /&gt;
*** [[Generic Linux Installation|Installation on Generic Linux OS]]&lt;br /&gt;
** [[Upgrading|Upgrading EPrints]]&lt;br /&gt;
** [[Getting Started]]&lt;br /&gt;
** [[Backups]]&lt;br /&gt;
** [[Troubleshooting]]&lt;br /&gt;
** Advanced Installation&lt;br /&gt;
*** [[How to use EPrints with HTTPS]]&lt;br /&gt;
*** [[Setting up email]]&lt;br /&gt;
* Configuring EPrints&lt;br /&gt;
** [[Branding/Logos]]&lt;br /&gt;
** [[Metadata|Deposit Types and Metadata]]&lt;br /&gt;
** [[Organisation Hierarchy]]&lt;br /&gt;
** [[Searches]]&lt;br /&gt;
* Advanced Configuration/Howtos&lt;br /&gt;
** [[Setting up HTTPS using Let's Encrypt]]&lt;br /&gt;
** [[HTTPS-only and HSTS]]&lt;br /&gt;
** [[Shibboleth|User Authentication using Shibboleth]]&lt;br /&gt;
* Technical Reference&lt;br /&gt;
** [[EPrints configuration|EPrints Configuration Reference]]&lt;br /&gt;
** [[Repository configuration|Repository Configuration Reference]]&lt;br /&gt;
** [[Metadata|Metadata Reference]] (also [[Functions]])&lt;br /&gt;
** [[API Overview]]&lt;br /&gt;
* [[Entire Manual]] (for printing)&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Manual]]&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Template:Manual&amp;diff=17015</id>
		<title>Template:Manual</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Template:Manual&amp;diff=17015"/>
		<updated>2026-01-26T09:02:57Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added links to installation of EPrints on different linux OS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{box|title=Manual Sections|content=&lt;br /&gt;
* [[Introduction]]&lt;br /&gt;
** [[Contact|How to Get Help/Support]]&lt;br /&gt;
** [[History]]&lt;br /&gt;
* Installing EPrints &amp;amp; Getting Started&lt;br /&gt;
** [[Recommended Platforms]]&lt;br /&gt;
** [[Required software|Installing Required Software]]&lt;br /&gt;
** [[Installation|Installing EPrints]]&lt;br /&gt;
*** [[Installing EPrints on RHEL/Fedora/CentOS|Installation on Red Hat Enterprise based Linux]]&lt;br /&gt;
*** [[Installing_EPrints_on_Debian/Ubuntu|Installation on Debian/Ubuntu]]&lt;br /&gt;
*** [[Generic Linux Installation|Installation on Generic Linux Operating System]]&lt;br /&gt;
** [[Upgrading|Upgrading EPrints]]&lt;br /&gt;
** [[Getting Started]]&lt;br /&gt;
** [[Backups]]&lt;br /&gt;
** [[Troubleshooting]]&lt;br /&gt;
** Advanced Installation&lt;br /&gt;
*** [[How to use EPrints with HTTPS]]&lt;br /&gt;
*** [[Setting up email]]&lt;br /&gt;
* Configuring EPrints&lt;br /&gt;
** [[Branding/Logos]]&lt;br /&gt;
** [[Metadata|Deposit Types and Metadata]]&lt;br /&gt;
** [[Organisation Hierarchy]]&lt;br /&gt;
** [[Searches]]&lt;br /&gt;
* Advanced Configuration/Howtos&lt;br /&gt;
** [[Setting up HTTPS using Let's Encrypt]]&lt;br /&gt;
** [[HTTPS-only and HSTS]]&lt;br /&gt;
** [[Shibboleth|User Authentication using Shibboleth]]&lt;br /&gt;
* Technical Reference&lt;br /&gt;
** [[EPrints configuration|EPrints Configuration Reference]]&lt;br /&gt;
** [[Repository configuration|Repository Configuration Reference]]&lt;br /&gt;
** [[Metadata|Metadata Reference]] (also [[Functions]])&lt;br /&gt;
** [[API Overview]]&lt;br /&gt;
* [[Entire Manual]] (for printing)&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Manual]]&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Installation&amp;diff=17014</id>
		<title>Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Installation&amp;diff=17014"/>
		<updated>2026-01-26T09:00:35Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added generic linux link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{manual}}&lt;br /&gt;
[[Category:Installation]]&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Installing EPrints on RHEL/Fedora/CentOS|Installation on Red Hat Enterprise based Linux]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Installing_EPrints_on_Debian/Ubuntu|Installation on Debian/Ubuntu]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Generic Linux Installation|Installation on Generic Linux Operating System]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Installation&amp;diff=17013</id>
		<title>Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Installation&amp;diff=17013"/>
		<updated>2026-01-26T08:59:18Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added links to different flavours of Linux&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{manual}}&lt;br /&gt;
[[Category:Installation]]&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Installing EPrints on RHEL/Fedora/CentOS|Installation on Red Hat Enterprise based Linux]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;&amp;lt;big&amp;gt;[[Installing_EPrints_on_Debian/Ubuntu|Installation on Debian/Ubuntu]]&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&amp;lt;/big&amp;gt;&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Generic_Linux_Installation&amp;diff=17012</id>
		<title>Generic Linux Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Generic_Linux_Installation&amp;diff=17012"/>
		<updated>2026-01-26T08:54:46Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Drn@ecs.soton.ac.uk moved page Installation to Generic Linux Installation without leaving a redirect: Reorganise to point people towards supported Linux OS&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{manual}}&lt;br /&gt;
[[Category:Installation]]&lt;br /&gt;
'''Below describes installing EPrints on a generic Linux distribution.  It is recommended that EPrints is installed on either [[Installing EPrints on RHEL/Fedora/CentOS|Red Hat based]] or [[Installing EPrints on Debian/Ubuntu|Debian based]] Linux.'''&lt;br /&gt;
&lt;br /&gt;
==Download==&lt;br /&gt;
EPrints can be downloaded from https://files.eprints.org/&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
''If you are upgrading an existing installation of eprints please see the section on [[Upgrading]] section of this manual.''&lt;br /&gt;
&lt;br /&gt;
EPrints needs to be installed as the same user as the apache webserver runs as. We suggest you install it as user &amp;quot;eprints&amp;quot; and group &amp;quot;eprints&amp;quot;. Under some UNIX platforms, creating a user and group can be done using the &amp;quot;adduser&amp;quot; command. Otherwise refer to your operating system documentation.&lt;br /&gt;
&lt;br /&gt;
Unpack the eprints tar.gz file:&lt;br /&gt;
&lt;br /&gt;
 % gunzip eprints-3.something.tar.gz&lt;br /&gt;
 % tar xf eprints-3.something.tar&lt;br /&gt;
&lt;br /&gt;
Now run the &amp;quot;configure&amp;quot; script. This is a /bin/sh script which will attempt to locate various parts of your system such as the perl binary. It will also check your system for required components.&lt;br /&gt;
&lt;br /&gt;
 % cd eprints-3.something&lt;br /&gt;
 % ./configure&lt;br /&gt;
&lt;br /&gt;
By default the system installs as user and group &amp;quot;eprints&amp;quot;. You will need to change this if you are not installing as either &amp;quot;root&amp;quot; or &amp;quot;eprints&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The configure script accepts a number of options. &lt;br /&gt;
&lt;br /&gt;
; --help : List all the options (many are intended for compiled software and are ignored).&lt;br /&gt;
&lt;br /&gt;
Recommended:&lt;br /&gt;
&lt;br /&gt;
; --prefix=PREFIX : Where to install EPrints (or look for a version to upgrade). By default &amp;lt;tt&amp;gt;/opt/eprints3/&amp;lt;/tt&amp;gt;&lt;br /&gt;
; --with-smtp-server=[HOST] : Use HOST to deliver mail. If the server running EPrints has an MTA such as &amp;lt;tt&amp;gt;exim&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;sendmail&amp;lt;/tt&amp;gt;, you can specify '''localhost'''. If you do not specify this option, you will get a warning to configure it later.&lt;br /&gt;
; --with-user=[USER] : Install eprints to run as USER. By default &amp;quot;eprints&amp;quot;.&lt;br /&gt;
; --with-group=[GROUP] : Install eprints to run as GROUP. By default &amp;quot;eprints&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Optional:&lt;br /&gt;
&lt;br /&gt;
; --with-perl=[PATH] : Path of perl interpreter (in case configure can't find it, or you have more than one and want to use a specific one).&lt;br /&gt;
; --with-virtualhost=[VIRTUALHOST] : Use VIRTUALHOST rather than * for apache VirtualHost directives.&lt;br /&gt;
; --with-toolpath=[PATH] : An alternate path to search for the required binaries.&lt;br /&gt;
; --disable-diskfree : Disable disk free space calls. These can cause problems on some platforms, notably 64-bit. &lt;br /&gt;
&lt;br /&gt;
Deprecated:&lt;br /&gt;
&lt;br /&gt;
; --with-apache=1 : Use Apache 1.x.x instead of 2.x.x, but EPrints 3 does not support this.&lt;br /&gt;
&lt;br /&gt;
Once you are happy with your configuration you may install eprints by running install.pl:&lt;br /&gt;
&lt;br /&gt;
 % ./install.pl&lt;br /&gt;
&lt;br /&gt;
Now you should edit the configuration file for your copy of apache. This is often &amp;lt;tt&amp;gt;/usr/local/apache/conf/http.conf&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;/etc/httpd/conf/httpd.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add this line: (If you didn't install eprints in &amp;lt;tt&amp;gt;/opt/eprints3/&amp;lt;/tt&amp;gt; replace that with the location on your system).&lt;br /&gt;
 Include /opt/eprints3/cfg/apache.conf&lt;br /&gt;
Note that this file is only available after you created your archive via &amp;lt;tt&amp;gt;epadmin create&amp;lt;/tt&amp;gt;. See [[Getting_Started_with_EPrints_3#Running_epadmin|Running epadmin]] for more information on creating an archive.&lt;br /&gt;
&lt;br /&gt;
You need to make sure the apache user have read/write access to the installation directory (/opt/eprints3). The user ''must'' be the same as the user you installed eprints as. We recommend to configure your apache to run as:&lt;br /&gt;
&lt;br /&gt;
 User eprints&lt;br /&gt;
 Group eprints&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Recommended_Platforms&amp;diff=17011</id>
		<title>Recommended Platforms</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Recommended_Platforms&amp;diff=17011"/>
		<updated>2026-01-26T08:53:02Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Updated recommended OS versions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{manual}}&lt;br /&gt;
[[Category:Installation]]&lt;br /&gt;
[[Category: Out of Date]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Red Hat based Linux''' - [[Installing EPrints on RHEL/Fedora/CentOS|Installation Guide]]&lt;br /&gt;
** Red Hat Enterprise Linux (RHEL) (http://www.redhat.com/rhel/): Red Hat Enterprise Linux (RHEL) 9 is currently recommended. However, RHEL 10 should now be suitable as long as you are running at least version 10.1.&lt;br /&gt;
** Fedora Core (http://fedora.redhat.com/): Fedora 42 or later currently recommended.  However, Fedora version move on quickly, so go out of support quickly and are not regularly tested and therefore Fedora is not recommended for production EPrints repositories.&lt;br /&gt;
** Rocky Linux (https://www.rockylinux.org/): Rocky Linux 9 is currently recommended.  However, Rocky Linux 10 should now be suitable as long as you are running at least version 10.1.&lt;br /&gt;
** Alma Linux, Oracle Linux and other derived versions of RHEL should also be suitable.  Version 9 of these Linuxes are currently recommended but version 10 should be suitable as long as you are running at least version 10.1. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* '''Debian based Linux''' - [[Installing EPrints on Debian/Ubuntu|Installation Guide]]&lt;br /&gt;
** Debian (https://www.debian.org/) - 11 (Bullseye), 12 (Bookworm) or 13 (Trixie) are currently recommended.&lt;br /&gt;
** Ubuntu (https://www.ubuntu.com/) - Ubuntu 22.04 LTS or 24.04 LTS are currently recommended.  Non-LTS Ubuntu versions are not recommended.&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Cgi/&amp;diff=17010</id>
		<title>Cgi/</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Cgi/&amp;diff=17010"/>
		<updated>2026-01-09T17:03:55Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{dirs}}&lt;br /&gt;
&lt;br /&gt;
These scripts handle the dynamic parts of the website.&lt;br /&gt;
&lt;br /&gt;
*'''[[EPrints_Directory_Structure/eprints3|eprints3]]/cgi'''&lt;br /&gt;
** '''[[cgi/ajax/|ajax/]] -&lt;br /&gt;
** '''cal''' - Provides a calendar layout that could be used for selecting dates or time spans.&lt;br /&gt;
** '''confirm''' - Provide a shim to /cgi/register to allow changes to a user's password or email address to be confirmed through an email link.&lt;br /&gt;
** '''counter''' - Provides some simple machine-readable stats on the repository.&lt;br /&gt;
**  '''dataset_dictionary''' - Provides a dictionary of all fields associated woth a dataset, including their name, type, label and help text.&lt;br /&gt;
**  '''embed_player''' - Embeds an HTML5 video element to preview video files.&lt;br /&gt;
** '''export''' - Export a data object, multiple data objects or the repository in a particular format.&lt;br /&gt;
** '''exportview''' - Exports a list of publications from a browse view listing in a particular format.&lt;br /&gt;
** '''google_site''' - Searches the repository host with given search terms using Google.&lt;br /&gt;
** '''handle_404''' - Ensure a properly branded 404 Not Found page is displayed when an EPrint is missing.&lt;br /&gt;
** '''history_search''' - Allows search for all records where a particular field has been changed in certain time frame.&lt;br /&gt;
** '''latest''' - Display the latest EPrints deposited to the repository's live archive. &lt;br /&gt;
** '''latest_tool''' - More customisable tool for displaying latest EPrints deposited to the repository's live archive. &lt;br /&gt;
** '''logout''' - Logs a user out and redirects to logged out page&lt;br /&gt;
** '''oai2''' - The OAI interface.&lt;br /&gt;
** '''oai_accesslogs''' -&lt;br /&gt;
** '''opensearch''' -&lt;br /&gt;
** '''opensearchdescription''' -&lt;br /&gt;
** '''openurl''' -&lt;br /&gt;
** '''process_request''' -&lt;br /&gt;
** '''register''' -&lt;br /&gt;
** '''request_doc''' -&lt;br /&gt;
** '''reset_password''' -&lt;br /&gt;
** '''saved_search''' -&lt;br /&gt;
** '''schema''' -&lt;br /&gt;
** '''search''' -&lt;br /&gt;
** '''set_lang''' -&lt;br /&gt;
** '''[[cgi/toolbox/|toolbox/]]''' -&lt;br /&gt;
** '''[[cgi/users/|users/]]''' - Contains scripts which require a valid login.&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Accessibility_Timeline_and_Roadmap&amp;diff=17009</id>
		<title>Accessibility Timeline and Roadmap</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Accessibility_Timeline_and_Roadmap&amp;diff=17009"/>
		<updated>2026-01-05T15:08:04Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added page about Accessibility timeline/roadmap&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes the timeline of Accessibility developments for EPrints and the further plans for improving Accessibility into the future.&lt;br /&gt;
&lt;br /&gt;
== EPrints 3.4.2 released (July 2020) ==&lt;br /&gt;
Ensures all pages accessible without login are accessibility compliant, except where this would directly affect them from fulfilling their function as an Open Access archive, (e.g. links to PDF documents). This includes:&lt;br /&gt;
# Fully static pages. Such as the Home, About, About EPrints, Repository Policies, Accessibility, etc. pages.&lt;br /&gt;
# Standard form-based pages. Such as Simple Search, Advanced Search, Create Account pages.&lt;br /&gt;
# Pages generated from user-generated content. Such as browse views, abstract pages, result pages from searches, etc. Assuming typical user-generated content.&lt;br /&gt;
&lt;br /&gt;
== EPrints 3.4.3 released (April 2021) ==&lt;br /&gt;
Ensures all commonly used pages accessible to only logged in users are accessibility compliant, when using typical user-generated content. This includes:&lt;br /&gt;
# Manage deposits page&lt;br /&gt;
# View and edit pages for deposits&lt;br /&gt;
# Review pages for deposits&lt;br /&gt;
# Manage records page and its subsidiary &amp;quot;Manage [dataset]&amp;quot; pages&lt;br /&gt;
# Admin Menu&lt;br /&gt;
# Create, view and edit pages for users&lt;br /&gt;
# View and edit pages for saved searches&lt;br /&gt;
# Admin search pages for items, issues, users and history&lt;br /&gt;
# Repository status page&lt;br /&gt;
# Create user page&lt;br /&gt;
# EPrints Bazaar&lt;br /&gt;
# Send test email page&lt;br /&gt;
# Database schema page&lt;br /&gt;
# Storage manager page&lt;br /&gt;
# Phrase editor and editing phrases pages&lt;br /&gt;
# Edit subject pages&lt;br /&gt;
# Manage metadata fields pages&lt;br /&gt;
&lt;br /&gt;
== EPrints 3.4.4 released (August 2022) ==&lt;br /&gt;
Incremental modifications to further improve accessibility changes made in 3.4.2 and 3.4.3 and fixes any snags associated with these changes. In particular, improving the functionality to allow the number of names displayed in a citation to be limited but expanded on request.&lt;br /&gt;
&lt;br /&gt;
== EPrints 3.4.5 released (May 2023) ==&lt;br /&gt;
Further incremental changes and snag fixes. In particular, the use of fieldsets and legends in search and input forms to make them easier to style with CSS.&lt;br /&gt;
&lt;br /&gt;
== EPrints 3.4.6 released (August 2024) ==&lt;br /&gt;
Further incremental changes and snag fixes. Including increased usage or appropriate ARIA attributes for elements.&lt;br /&gt;
&lt;br /&gt;
== EPrints 3.4.7 released (August 2025) ==&lt;br /&gt;
Further incremental changes and snag fixes.&lt;br /&gt;
# Removing dangling ARIA describedby attributes for fields with no help text.&lt;br /&gt;
# Ensuring unique element IDs for common actions in different tabs.&lt;br /&gt;
# Adding /cgi/register to the Accessibility report.&lt;br /&gt;
&lt;br /&gt;
== EPrints 3.5 (Coming soon) ==&lt;br /&gt;
Improving the accessibility of PDF documents uploaded to EPrints repositories. In particular, tools to insert metadata and accessibility features into uploaded files.&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints_3.4.8&amp;diff=17008</id>
		<title>EPrints 3.4.8</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints_3.4.8&amp;diff=17008"/>
		<updated>2025-12-29T19:43:19Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* Release Notes (Provisional) */ All changes up to 29th December 2025&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains information about the provisional EPrints v3.4.8 tag and release on GitHub.  A date for this release is yet to be scheduled.&lt;br /&gt;
&lt;br /&gt;
== Release Notes (Provisional) ==&lt;br /&gt;
EPrints 3.4.8 is planned to be released in the Summer of 2026.&lt;br /&gt;
* '''Zero codename:''' ''TO BE DETERMINED''&lt;br /&gt;
* '''Publications flavour codename:''' ''TO BE DETERMINED''&lt;br /&gt;
&lt;br /&gt;
=== New Dependencies ===&lt;br /&gt;
Check earlier dependencies for [[EPrints 3.4.7]] and before.&lt;br /&gt;
&lt;br /&gt;
If you wish to set a timezone of the dates and times displayed on your repository, you will need to make sure the &amp;lt;code&amp;gt;DateTime&amp;lt;/code&amp;gt; Perl module is installed.  For RHEL-based Linux this can be installed with the &amp;lt;code&amp;gt;perl-DateTime&amp;lt;/code&amp;gt; RPM.  For Debian-based Linux this requires &amp;lt;code&amp;gt;libdatetime-perl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Changes Since 3.4.7 ===&lt;br /&gt;
&lt;br /&gt;
==== New Functionality ====&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/commit/be86f99b3662083a4f35034f14776d86bcc9e087 Adds &amp;lt;code&amp;gt;export_file_as_attachment&amp;lt;/code&amp;gt; option to force exports to be downloaded]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/513 Adds an export plugin for document URLs]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/512 Adds clear buttons to multiple &amp;lt;code&amp;gt;Compound&amp;lt;/code&amp;gt; fields]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/525 Adds support for rendering time with a given timezone]&lt;br /&gt;
&lt;br /&gt;
==== Security and Privacy Improvements ====&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/511 Prevents 'javascript:' URLs from being saved in URL fields]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/commit/c5884562ed72b31681d3f0308b5987b2564052ad Modifies fix for SetLang referrer misuse] &lt;br /&gt;
&lt;br /&gt;
==== General Improvements ====&lt;br /&gt;
* Updates metatags functionality to equivalent to [https://github.com/eprints/metatags/releases/tag/v1.4 v1.4] plus further improvements to ensure its export plugins are compliant with unit tests&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/515 Removes the progress bar even if the upload fails]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/commit/5fe2b24938ed19c38b0ffa6a5bc5d67253cfb514 Remove no longer required &amp;lt;code&amp;gt;progressid&amp;lt;/code&amp;gt; from file uploads]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/519 Adds support for number format months to BibTex import]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/518 Makes the default encoding of imports 'UTF-8']&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/520 Adds labels connecting to radio buttons for &amp;lt;code&amp;gt;Boolean&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Set&amp;lt;/code&amp;gt;]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/commit/21687bd917244717674e613ce0d0e372fffcf619 Improves &amp;lt;code&amp;gt;Longtext_counter&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;MetaField&amp;lt;/code&amp;gt;]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/530 Removes MPM event warning message]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/527 Improves CRUD API fault tolerance]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/536 Better specifies MetaField property defaults]&lt;br /&gt;
&lt;br /&gt;
==== Bug Fixes ====&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/503 Fixes sample &amp;lt;code&amp;gt;EP_TRIGGER_BEGIN&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EP_TRIGGER_END&amp;lt;/code&amp;gt; subroutines]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/521 Checks that &amp;lt;code&amp;gt;$id-&amp;gt;{id_type}&amp;lt;/code&amp;gt; is set before comparing it]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/531 Fixes issues with &amp;lt;code&amp;gt;Convert::PlainText&amp;lt;/code&amp;gt; handling large DOCX]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/commit/d1777a5a3170afed02f727b989cb8ebc009c3549 Makes unsupported packaging format a bad request (400) not server error (500)]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/534 Don't add export link elements to deleted item page head]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/535 Specifies more appropriate &amp;lt;code&amp;gt;empty_value&amp;lt;/code&amp;gt;s for &amp;lt;code&amp;gt;Int&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;Float&amp;lt;/code&amp;gt; MetaFields]&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/issues/508 Fixes &amp;lt;code&amp;gt;eval&amp;lt;/code&amp;gt; blocks calling user-defined &amp;lt;code&amp;gt;toform&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;fromform&amp;lt;/code&amp;gt; functions to work as effective try/catch blocks.&lt;br /&gt;
&lt;br /&gt;
== Planned Features and Improvements ==&lt;br /&gt;
See [https://github.com/eprints/eprints3.4/milestone/9  3.4.8 milestone on GitHub] for more details.&lt;br /&gt;
&lt;br /&gt;
[[Category:Eprints3.4]]&lt;br /&gt;
[[Category:Planned Releases]]&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=EPrints_3.4.8&amp;diff=17007</id>
		<title>EPrints 3.4.8</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=EPrints_3.4.8&amp;diff=17007"/>
		<updated>2025-12-29T18:52:10Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* Bug Fixes */ Added changes up to 2nd September 2025&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page contains information about the provisional EPrints v3.4.8 tag and release on GitHub.  A date for this release is yet to be scheduled.&lt;br /&gt;
&lt;br /&gt;
== Release Notes (Provisional) ==&lt;br /&gt;
EPrints 3.4.8 is planned to be released in the Summer of 2026.&lt;br /&gt;
* '''Zero codename:''' ''TO BE DETERMINED''&lt;br /&gt;
* '''Publications flavour codename:''' ''TO BE DETERMINED''&lt;br /&gt;
&lt;br /&gt;
=== New Dependencies ===&lt;br /&gt;
Check earlier dependencies for [[EPrints 3.4.7]] and before.&lt;br /&gt;
&lt;br /&gt;
If you wish to set a timezone of the dates and times displayed on your repository, you will need to make sure the &amp;lt;code&amp;gt;DateTime&amp;lt;/code&amp;gt; Perl module is installed.  For RHEL-based Linux this can be installed with the &amp;lt;code&amp;gt;perl-DateTime&amp;lt;/code&amp;gt; RPM.  For Debian-based Linux this requires &amp;lt;code&amp;gt;libdatetime-perl&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Changes Since 3.4.7 ===&lt;br /&gt;
&lt;br /&gt;
==== New Functionality ====&lt;br /&gt;
&lt;br /&gt;
==== Security and Privacy Improvements ====&lt;br /&gt;
&lt;br /&gt;
==== General Improvements ====&lt;br /&gt;
&lt;br /&gt;
==== Bug Fixes ====&lt;br /&gt;
* [https://github.com/eprints/eprints3.4/pull/503 Fixes sample &amp;lt;code&amp;gt;EP_TRIGGER_BEGIN&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;EP_TRIGGER_END&amp;lt;code&amp;gt; subroutines]&lt;br /&gt;
&lt;br /&gt;
== Planned Features and Improvements ==&lt;br /&gt;
See [https://github.com/eprints/eprints3.4/milestone/9  3.4.8 milestone on GitHub] for more details.&lt;br /&gt;
&lt;br /&gt;
[[Category:Eprints3.4]]&lt;br /&gt;
[[Category:Planned Releases]]&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Issues_with_installing_EPrints_on_RHEL_/_CentOS_/_Rocky_10&amp;diff=17006</id>
		<title>Issues with installing EPrints on RHEL / CentOS / Rocky 10</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Issues_with_installing_EPrints_on_RHEL_/_CentOS_/_Rocky_10&amp;diff=17006"/>
		<updated>2025-11-26T23:48:24Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: 10.1 is now out so python3-html2text should now be installable with dnf&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;No other known issues beyond those below if running at least EPrints 3.4.6.&lt;br /&gt;
&lt;br /&gt;
==== mod_perl cannot handle dir_perms parameter ====&lt;br /&gt;
By default EPrints is configures its &amp;lt;tt&amp;gt;dir_perms&amp;lt;/tt&amp;gt; parameter to &amp;lt;code&amp;gt;02775&amp;lt;/code&amp;gt; in &amp;lt;tt&amp;gt;perl_lib/EPrints/SystemSettings.pm&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;lib/syscfg.d/core.pl&amp;lt;/tt&amp;gt;. This is used when creating a new directory with &amp;lt;tt&amp;gt;EPrints::System::mkdir&amp;lt;/tt&amp;gt;, which call &amp;lt;tt&amp;gt;CORE::mkdir&amp;lt;/tt&amp;gt;.  Previously this core Perl function has ignored the mask for the setuid/setgid/sticky bit so it did not matter^ if &amp;lt;tt&amp;gt;dir_perms&amp;lt;/tt&amp;gt; was &amp;lt;code&amp;gt;02775&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;0775&amp;lt;/code&amp;gt; but the version of mod_perl used on RHEL-based Linux 10 now gets confused by this and will fail to create directory.  To fix this you will need to modify &amp;lt;tt&amp;gt;lib/syscfg.d/core.pl&amp;lt;/tt&amp;gt; and set &amp;lt;code&amp;gt;$c-&amp;gt;{dir_perms}&amp;lt;/code&amp;gt; as follows:&lt;br /&gt;
 $c-&amp;gt;{dir_perms} = '0775';&lt;br /&gt;
In addition, to make sure that the setgid bit gets set the same as it would before, it is advised you make sure all the sub-directories in your archive have the setgid bit set:&lt;br /&gt;
 find EPRINTS_PATH/archives/ARCHIVE_ID -type d -exec chmod g+s {} \;&lt;br /&gt;
Technically, it should not be necessary to do this to all directories, it might be sufficient to do this only to the html and documents directories, as well as their sub-directories but there should not be any problem updating all the archive's directories.&lt;br /&gt;
&lt;br /&gt;
^This is why &amp;lt;tt&amp;gt;EPrints::System::mkdir&amp;lt;/tt&amp;gt; would subsequently called &amp;lt;tt&amp;gt;CORE::chmod&amp;lt;/tt&amp;gt; to update setuid/setgid/sticky bits on the newly created directories.&lt;br /&gt;
&lt;br /&gt;
==== perl-Apache-DBI not available through DNF package manager ====&lt;br /&gt;
RHEL / CentOS / Rocky 10 does not include perl-Apache-DBI in their DNF package managers.  Therefore, you will need to install afterwards using cpan:&lt;br /&gt;
 cpan Apache::DBI&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Category:Installation&amp;diff=17005</id>
		<title>Category:Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Category:Installation&amp;diff=17005"/>
		<updated>2025-11-26T23:46:57Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* Distribution Notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The default installation of EPrints is on a stand-alone linux system, but this is not the only way EPrints can (and has) been installed.&lt;br /&gt;
&lt;br /&gt;
'''The EPrints team currently recommends installing EPrints in one of the following ways:'''&lt;br /&gt;
&lt;br /&gt;
* '''[[Installing EPrints on Debian/Ubuntu]]'''&lt;br /&gt;
* '''[[Installing EPrints on_RHEL/Fedora/CentOS]]'''&lt;br /&gt;
* '''[[Installation|Installing from source]]'''&lt;br /&gt;
&lt;br /&gt;
Here are some other ways:&lt;br /&gt;
&lt;br /&gt;
* [[non-root_proxy|Proxied to a non-root user account]]: Where the server and all associated code is installed without root/admin access to anything&lt;br /&gt;
* [[How to set up EPrints on virtual directories other than root|Hosted on virtual directories other than root]] - sharing with other Web applications on the same server&lt;br /&gt;
&lt;br /&gt;
This category contains a range of other sets of instructions for different operating systems and versions of EPrints. Most of them are not supported but may still work. {{EPrintsTech}}&lt;br /&gt;
&lt;br /&gt;
If you want to write installation instructions for a system other than those listed here please do so. Remember to tag the page with &amp;lt;nowiki&amp;gt;[[Category:Installation]]&amp;lt;/nowiki&amp;gt; so that it appears in this list. &lt;br /&gt;
&lt;br /&gt;
'''If you use one of the installation guides below and it doesn't work, edit the page to say what went wrong and how you fixed it. This will help others (and maybe yourself) tackle these problems in the future. [[Template:Register|Here you can register for an eprints.org account]] to edit the wiki.'''&lt;br /&gt;
&lt;br /&gt;
== Distribution Notes ==&lt;br /&gt;
&lt;br /&gt;
Known issues and gotchas on various Linux distributions&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Distibution&lt;br /&gt;
! Support&lt;br /&gt;
! Notes&lt;br /&gt;
|-&lt;br /&gt;
| RHEL / Centos / Rocky 8&lt;br /&gt;
| Supported&lt;br /&gt;
| Some minor issues. See [[Issues with installing EPrints on RHEL / CentOS / Rocky 8]].&lt;br /&gt;
|-&lt;br /&gt;
| RHEL / Centos / Rocky 9&lt;br /&gt;
| Supported&lt;br /&gt;
| Some minor issues. See [[Issues with installing EPrints on RHEL / CentOS / Rocky 9]]. EPrints Services test builds against this release.&lt;br /&gt;
|-&lt;br /&gt;
| RHEL / Centos / Rocky 10&lt;br /&gt;
| Supported&lt;br /&gt;
| Some minor issues. See [[Issues with installing EPrints on RHEL / CentOS / Rocky 10]].&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 22.04 LTS&lt;br /&gt;
| Supported&lt;br /&gt;
| Some minor issues. See [[Issues with Installing EPrints on Ubuntu 22.04]].&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu 24.04 LTS&lt;br /&gt;
| Supported&lt;br /&gt;
| Some minor issues. See [[Issues with Installing EPrints on Ubuntu 24.04]].&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Shibboleth_Debug_Logging&amp;diff=17004</id>
		<title>Shibboleth Debug Logging</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Shibboleth_Debug_Logging&amp;diff=17004"/>
		<updated>2025-11-17T13:27:02Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* Decoding a CipherValue */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As described on the main [[Shibboleth]] page.  EPrints uses the Shibboleth Service Provider (SP) provided by shibboleth.net.  This includes a logger that can be configured at '''/etc/shibboleth/shibd.logger''' and which logs to '''/var/log/shibboleth/shibd.log'''.  This typically only logs errors and warnings and the occasionally informationl log message, typically when starting or stopping.  However, if you are having problems with the Shibboleth SP, particularly when setting up, it may be useful to enable debug.  To do this&lt;br /&gt;
&lt;br /&gt;
1. Edit the '''/etc/shibboleth/shibd.logger''' and uncomment the following lines:&lt;br /&gt;
 # tracing of SAML messages and security policies&lt;br /&gt;
 #log4j.category.OpenSAML.MessageDecoder=DEBUG&lt;br /&gt;
 #log4j.category.OpenSAML.MessageEncoder=DEBUG&lt;br /&gt;
 #log4j.category.OpenSAML.SecurityPolicyRule=DEBUG&lt;br /&gt;
 #log4j.category.XMLTooling.SOAPClient=DEBUG&lt;br /&gt;
 # interprocess message remoting&lt;br /&gt;
 #log4j.category.Shibboleth.Listener=DEBUG&lt;br /&gt;
 # mapping of requests to applicationId&lt;br /&gt;
 #log4j.category.Shibboleth.RequestMapper=DEBUG&lt;br /&gt;
 # high level session cache operations&lt;br /&gt;
 #log4j.category.Shibboleth.SessionCache=DEBUG&lt;br /&gt;
 # persistent storage and caching&lt;br /&gt;
 #log4j.category.XMLTooling.StorageService=DEBUG&lt;br /&gt;
So they look like&lt;br /&gt;
 # tracing of SAML messages and security policies&lt;br /&gt;
 log4j.category.OpenSAML.MessageDecoder=DEBUG&lt;br /&gt;
 log4j.category.OpenSAML.MessageEncoder=DEBUG&lt;br /&gt;
 log4j.category.OpenSAML.SecurityPolicyRule=DEBUG&lt;br /&gt;
 log4j.category.XMLTooling.SOAPClient=DEBUG&lt;br /&gt;
 # interprocess message remoting&lt;br /&gt;
 log4j.category.Shibboleth.Listener=DEBUG&lt;br /&gt;
 # mapping of requests to applicationId&lt;br /&gt;
 log4j.category.Shibboleth.RequestMapper=DEBUG&lt;br /&gt;
 # high level session cache operations&lt;br /&gt;
 log4j.category.Shibboleth.SessionCache=DEBUG&lt;br /&gt;
 # persistent storage and caching&lt;br /&gt;
 log4j.category.XMLTooling.StorageService=DEBUG&lt;br /&gt;
&lt;br /&gt;
2. Test the Shibboleth SP is correctly configured&lt;br /&gt;
 shibd -t&lt;br /&gt;
&lt;br /&gt;
3. Restart the Shibboleth SP&lt;br /&gt;
 systemctl restart shibd&lt;br /&gt;
&lt;br /&gt;
There is various debugging that has been enabled by these changes.  Particularly useful are the first two line:&lt;br /&gt;
 log4j.category.OpenSAML.MessageDecoder=DEBUG&lt;br /&gt;
 log4j.category.OpenSAML.MessageEncoder=DEBUG&lt;br /&gt;
This will allow you to see the XML messages sent to and from the Shibboleth Identity Provider (IdP), such as MicroSoft Entra or OpenAthens.  &lt;br /&gt;
&lt;br /&gt;
== Debugging User Attributes Mapping Issues ==&lt;br /&gt;
This debugging can be particularly useful if you are trying to work attributes in your attribute-map.xml are not being mapped as expected.  If you tail the log file '''/var/log/shibboleth/shibd.log''' and then try to login using the Shibboleth, you should see a line in the logs that starts:&lt;br /&gt;
 &amp;lt;samlp:Response ...&lt;br /&gt;
If you copy the whole of that line into a text file in /tmp/ and save it.  Then you can run xmllint on it to format the output.  E.g.&lt;br /&gt;
 xmllint --format /tmp/saml-response.xml&lt;br /&gt;
If attributes are being mapped, in the formatted output you should be able to see section that starts with an '''AttributeStatment''' XML tag  (However, if you don't see this, then your data may be encrypted as a '''CipherValue''' under '''CipherData'''.  if so, follow the instructions under [[#Decoding a CipherValue|Decoding a CipherValue]] .  E.g.&lt;br /&gt;
 &amp;lt;AttributeStatement&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;http://schemas.microsoft.com/identity/claims/tenantid&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;01234567-89ab-cdef-0123-456789abcdef&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;http://schemas.microsoft.com/identity/claims/objectidentifier&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;fedcba98-7654-3210-fedc-ba9876543210&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;http://schemas.microsoft.com/identity/claims/identityprovider&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;https://sts.windows.net/89abcdef-0123-4567-89ab-cdef01234567/&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;http://schemas.microsoft.com/claims/authnmethodsreferences&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;http://schemas.microsoft.com/claims/multipleauthn&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;urn:oid:0.9.2342.19200300.100.1.3&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;j.bloggs@example.org&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;urn:oid:2.5.4.4&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;Bloggs&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;urn:oid:2.5.4.42&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;Joe&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
 &amp;lt;/AttributeStatement&amp;gt;&lt;br /&gt;
If you cannot find users attributes you are expecting to see based on what you have configurured in your Shibboleth SP's attribute-map.xml, then you will need to get the maintainer of Shibboleth IdP to make sure these attributes are released or otherwise release attributes that store the sane user metadata.  At this point you can re-run this debugging to see what user attributes you are now getting and update your Shibboleth SP's attribute-map.xml as appropriate.&lt;br /&gt;
&lt;br /&gt;
'''When you have finished debugging.  It is sensible to comment out the debug lines in '''/etc/shibboleth/shibd.logger''' again and restart the Shibboleth SP.'''&lt;br /&gt;
&lt;br /&gt;
== Decoding a CipherValue ==&lt;br /&gt;
1. Download [https://gist.github.com/orimanabu/b2a7afcc6b6f59e475cad918914eb4b9|this Python script]: &lt;br /&gt;
 cd /tmp/&lt;br /&gt;
 wget https://gist.githubusercontent.com/orimanabu/b2a7afcc6b6f59e475cad918914eb4b9/raw/99e4f6e9c71fc5d2a9f4021d3336f28dab0927a7/decrypt_saml_response.py&lt;br /&gt;
&lt;br /&gt;
2. Create a Python virtual environment, activate it and make sure pip is upgraded:&lt;br /&gt;
 python -m venv venv&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 pip install --upgrade pip&lt;br /&gt;
&lt;br /&gt;
3. Install Python modules required by the script&lt;br /&gt;
 pip install lxml&lt;br /&gt;
 pip install PyCryptodome&lt;br /&gt;
&lt;br /&gt;
4. Now you can run the script.  (It is assumed that your key is in the default location for the Shibboleth SP.  Check this is correct according to the CredentialResolver tag in /etc/shibboleth/shibboleth2.xml.  If you have a separate encryption and signing key, be sure to use the encryption one in the command below).&lt;br /&gt;
 cat /tmp/saml-response.xml | python decrypt_saml_response.py -k /etc/shibboleth/sp-key.pem -p&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Shibboleth_Debug_Logging&amp;diff=17003</id>
		<title>Shibboleth Debug Logging</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Shibboleth_Debug_Logging&amp;diff=17003"/>
		<updated>2025-11-17T13:26:05Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added instructions for how to decode SAML message&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As described on the main [[Shibboleth]] page.  EPrints uses the Shibboleth Service Provider (SP) provided by shibboleth.net.  This includes a logger that can be configured at '''/etc/shibboleth/shibd.logger''' and which logs to '''/var/log/shibboleth/shibd.log'''.  This typically only logs errors and warnings and the occasionally informationl log message, typically when starting or stopping.  However, if you are having problems with the Shibboleth SP, particularly when setting up, it may be useful to enable debug.  To do this&lt;br /&gt;
&lt;br /&gt;
1. Edit the '''/etc/shibboleth/shibd.logger''' and uncomment the following lines:&lt;br /&gt;
 # tracing of SAML messages and security policies&lt;br /&gt;
 #log4j.category.OpenSAML.MessageDecoder=DEBUG&lt;br /&gt;
 #log4j.category.OpenSAML.MessageEncoder=DEBUG&lt;br /&gt;
 #log4j.category.OpenSAML.SecurityPolicyRule=DEBUG&lt;br /&gt;
 #log4j.category.XMLTooling.SOAPClient=DEBUG&lt;br /&gt;
 # interprocess message remoting&lt;br /&gt;
 #log4j.category.Shibboleth.Listener=DEBUG&lt;br /&gt;
 # mapping of requests to applicationId&lt;br /&gt;
 #log4j.category.Shibboleth.RequestMapper=DEBUG&lt;br /&gt;
 # high level session cache operations&lt;br /&gt;
 #log4j.category.Shibboleth.SessionCache=DEBUG&lt;br /&gt;
 # persistent storage and caching&lt;br /&gt;
 #log4j.category.XMLTooling.StorageService=DEBUG&lt;br /&gt;
So they look like&lt;br /&gt;
 # tracing of SAML messages and security policies&lt;br /&gt;
 log4j.category.OpenSAML.MessageDecoder=DEBUG&lt;br /&gt;
 log4j.category.OpenSAML.MessageEncoder=DEBUG&lt;br /&gt;
 log4j.category.OpenSAML.SecurityPolicyRule=DEBUG&lt;br /&gt;
 log4j.category.XMLTooling.SOAPClient=DEBUG&lt;br /&gt;
 # interprocess message remoting&lt;br /&gt;
 log4j.category.Shibboleth.Listener=DEBUG&lt;br /&gt;
 # mapping of requests to applicationId&lt;br /&gt;
 log4j.category.Shibboleth.RequestMapper=DEBUG&lt;br /&gt;
 # high level session cache operations&lt;br /&gt;
 log4j.category.Shibboleth.SessionCache=DEBUG&lt;br /&gt;
 # persistent storage and caching&lt;br /&gt;
 log4j.category.XMLTooling.StorageService=DEBUG&lt;br /&gt;
&lt;br /&gt;
2. Test the Shibboleth SP is correctly configured&lt;br /&gt;
 shibd -t&lt;br /&gt;
&lt;br /&gt;
3. Restart the Shibboleth SP&lt;br /&gt;
 systemctl restart shibd&lt;br /&gt;
&lt;br /&gt;
There is various debugging that has been enabled by these changes.  Particularly useful are the first two line:&lt;br /&gt;
 log4j.category.OpenSAML.MessageDecoder=DEBUG&lt;br /&gt;
 log4j.category.OpenSAML.MessageEncoder=DEBUG&lt;br /&gt;
This will allow you to see the XML messages sent to and from the Shibboleth Identity Provider (IdP), such as MicroSoft Entra or OpenAthens.  &lt;br /&gt;
&lt;br /&gt;
== Debugging User Attributes Mapping Issues ==&lt;br /&gt;
This debugging can be particularly useful if you are trying to work attributes in your attribute-map.xml are not being mapped as expected.  If you tail the log file '''/var/log/shibboleth/shibd.log''' and then try to login using the Shibboleth, you should see a line in the logs that starts:&lt;br /&gt;
 &amp;lt;samlp:Response ...&lt;br /&gt;
If you copy the whole of that line into a text file in /tmp/ and save it.  Then you can run xmllint on it to format the output.  E.g.&lt;br /&gt;
 xmllint --format /tmp/saml-response.xml&lt;br /&gt;
If attributes are being mapped, in the formatted output you should be able to see section that starts with an '''AttributeStatment''' XML tag  (However, if you don't see this, then your data may be encrypted as a '''CipherValue''' under '''CipherData'''.  if so, follow the instructions under [[#Decoding a CipherValue|Decoding a CipherValue]] .  E.g.&lt;br /&gt;
 &amp;lt;AttributeStatement&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;http://schemas.microsoft.com/identity/claims/tenantid&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;01234567-89ab-cdef-0123-456789abcdef&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;http://schemas.microsoft.com/identity/claims/objectidentifier&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;fedcba98-7654-3210-fedc-ba9876543210&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;http://schemas.microsoft.com/identity/claims/identityprovider&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;https://sts.windows.net/89abcdef-0123-4567-89ab-cdef01234567/&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;http://schemas.microsoft.com/claims/authnmethodsreferences&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;http://schemas.microsoft.com/claims/multipleauthn&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;urn:oid:0.9.2342.19200300.100.1.3&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;j.bloggs@example.org&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;urn:oid:2.5.4.4&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;Bloggs&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;urn:oid:2.5.4.42&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;Joe&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
 &amp;lt;/AttributeStatement&amp;gt;&lt;br /&gt;
If you cannot find users attributes you are expecting to see based on what you have configurured in your Shibboleth SP's attribute-map.xml, then you will need to get the maintainer of Shibboleth IdP to make sure these attributes are released or otherwise release attributes that store the sane user metadata.  At this point you can re-run this debugging to see what user attributes you are now getting and update your Shibboleth SP's attribute-map.xml as appropriate.&lt;br /&gt;
&lt;br /&gt;
'''When you have finished debugging.  It is sensible to comment out the debug lines in '''/etc/shibboleth/shibd.logger''' again and restart the Shibboleth SP.'''&lt;br /&gt;
&lt;br /&gt;
== Decoding a CipherValue ==&lt;br /&gt;
1. Download [https://gist.github.com/orimanabu/b2a7afcc6b6f59e475cad918914eb4b9|this Python script]: &lt;br /&gt;
 cd /tmp/&lt;br /&gt;
 wget https://gist.githubusercontent.com/orimanabu/b2a7afcc6b6f59e475cad918914eb4b9/raw/99e4f6e9c71fc5d2a9f4021d3336f28dab0927a7/decrypt_saml_response.py&lt;br /&gt;
&lt;br /&gt;
2. Create a Python virtual environment, activate it and make sure pip is upgraded:&lt;br /&gt;
 python -m venv venv&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 pip install --upgrade pip&lt;br /&gt;
&lt;br /&gt;
3. Install Python modules required by the script&lt;br /&gt;
 pip install lxml&lt;br /&gt;
 pip install PyCryptodome&lt;br /&gt;
&lt;br /&gt;
4. Now you can run the script.  (It is assumed that your key is in the default location for the Shibboleth SP.  Check this is correct according to the CredentialResolver tag in /etc/shibboleth/shibboleth2.xml).&lt;br /&gt;
 cat /tmp/saml-response.xml | python decrypt_saml_response.py -k /etc/shibboleth/sp-key.pem -p&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Shibboleth_Debug_Logging&amp;diff=17001</id>
		<title>Shibboleth Debug Logging</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Shibboleth_Debug_Logging&amp;diff=17001"/>
		<updated>2025-11-17T11:10:24Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* Debugging User Attributes Mapping Issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As described on the main [[Shibboleth] page.  EPrints uses the Shibboleth Service Provider (SP) provided by shibboleth.net.  This includes a logger that can be configured at '''/etc/shibboleth/shibd.logger''' and which logs to '''/var/log/shibboleth/shibd.log'''.  This typically only logs errors and warnings and the occasionally informationl log message, typically when starting or stopping.  However, if you are having problems with the Shibboleth SP, particularly when setting up, it may be useful to enable debug.  To do this&lt;br /&gt;
&lt;br /&gt;
1. Edit the '''/etc/shibboleth/shibd.logger''' and uncomment the following lines:&lt;br /&gt;
 # tracing of SAML messages and security policies&lt;br /&gt;
 #log4j.category.OpenSAML.MessageDecoder=DEBUG&lt;br /&gt;
 #log4j.category.OpenSAML.MessageEncoder=DEBUG&lt;br /&gt;
 #log4j.category.OpenSAML.SecurityPolicyRule=DEBUG&lt;br /&gt;
 #log4j.category.XMLTooling.SOAPClient=DEBUG&lt;br /&gt;
 # interprocess message remoting&lt;br /&gt;
 #log4j.category.Shibboleth.Listener=DEBUG&lt;br /&gt;
 # mapping of requests to applicationId&lt;br /&gt;
 #log4j.category.Shibboleth.RequestMapper=DEBUG&lt;br /&gt;
 # high level session cache operations&lt;br /&gt;
 #log4j.category.Shibboleth.SessionCache=DEBUG&lt;br /&gt;
 # persistent storage and caching&lt;br /&gt;
 #log4j.category.XMLTooling.StorageService=DEBUG&lt;br /&gt;
So they look like&lt;br /&gt;
 # tracing of SAML messages and security policies&lt;br /&gt;
 log4j.category.OpenSAML.MessageDecoder=DEBUG&lt;br /&gt;
 log4j.category.OpenSAML.MessageEncoder=DEBUG&lt;br /&gt;
 log4j.category.OpenSAML.SecurityPolicyRule=DEBUG&lt;br /&gt;
 log4j.category.XMLTooling.SOAPClient=DEBUG&lt;br /&gt;
 # interprocess message remoting&lt;br /&gt;
 log4j.category.Shibboleth.Listener=DEBUG&lt;br /&gt;
 # mapping of requests to applicationId&lt;br /&gt;
 log4j.category.Shibboleth.RequestMapper=DEBUG&lt;br /&gt;
 # high level session cache operations&lt;br /&gt;
 log4j.category.Shibboleth.SessionCache=DEBUG&lt;br /&gt;
 # persistent storage and caching&lt;br /&gt;
 log4j.category.XMLTooling.StorageService=DEBUG&lt;br /&gt;
&lt;br /&gt;
2. Test the Shibboleth SP is correctly configured&lt;br /&gt;
 shibd -t&lt;br /&gt;
&lt;br /&gt;
3. Restart the Shibboleth SP&lt;br /&gt;
 systemctl restart shibd&lt;br /&gt;
&lt;br /&gt;
There is various debugging that has been enabled by these changes.  Particularly useful are the first two line:&lt;br /&gt;
 log4j.category.OpenSAML.MessageDecoder=DEBUG&lt;br /&gt;
 log4j.category.OpenSAML.MessageEncoder=DEBUG&lt;br /&gt;
This will allow you to see the XML messages sent to and from the Shibboleth Identity Provider (IdP), such as MicroSoft Entra or OpenAthens.  &lt;br /&gt;
&lt;br /&gt;
== Debugging User Attributes Mapping Issues ==&lt;br /&gt;
This debugging can be particularly useful if you are trying to work attributes in your attribute-map.xml are not being mapped as expected.  If you tail the log file '''/var/log/shibboleth/shibd.log''' and then try to login using the Shibboleth, you should see a line in the logs that starts:&lt;br /&gt;
 &amp;lt;samlp:Response ...&lt;br /&gt;
If you copy the whole of that line into a text file in /tmp/ and save it.  Then you can run xmllint on it to format the output.  E.g.&lt;br /&gt;
 xmllint --format /tmp/saml-response.xml&lt;br /&gt;
If attributes are being mapped, in the formatted output you should be able to see section that starts with an '''AttributeStatment''' XML tag.  E.g.&lt;br /&gt;
 &amp;lt;AttributeStatement&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;http://schemas.microsoft.com/identity/claims/tenantid&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;01234567-89ab-cdef-0123-456789abcdef&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;http://schemas.microsoft.com/identity/claims/objectidentifier&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;fedcba98-7654-3210-fedc-ba9876543210&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;http://schemas.microsoft.com/identity/claims/identityprovider&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;https://sts.windows.net/89abcdef-0123-4567-89ab-cdef01234567/&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;http://schemas.microsoft.com/claims/authnmethodsreferences&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;http://schemas.microsoft.com/claims/multipleauthn&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;urn:oid:0.9.2342.19200300.100.1.3&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;j.bloggs@example.org&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;urn:oid:2.5.4.4&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;Bloggs&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;urn:oid:2.5.4.42&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;Joe&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
   &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
 &amp;lt;/AttributeStatement&amp;gt;&lt;br /&gt;
If you cannot find users attributes you are expecting to see based on what you have configurured in your Shibboleth SP's attribute-map.xml, then you will need to get the maintainer of Shibboleth IdP to make sure these attributes are released or otherwise release attributes that store the sane user metadata.  At this point you can re-run this debugging to see what user attributes you are now getting and update your Shibboleth SP's attribute-map.xml as appropriate.&lt;br /&gt;
&lt;br /&gt;
'''When you have finished debugging.  It is sensible to comment out the debug lines in '''/etc/shibboleth/shibd.logger''' again and restart the Shibboleth SP.'''&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Shibboleth_Debug_Logging&amp;diff=17000</id>
		<title>Shibboleth Debug Logging</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Shibboleth_Debug_Logging&amp;diff=17000"/>
		<updated>2025-11-17T11:09:11Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: Added some basic debug instructions, mainly for user attribute mapping&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As described on the main [[Shibboleth] page.  EPrints uses the Shibboleth Service Provider (SP) provided by shibboleth.net.  This includes a logger that can be configured at '''/etc/shibboleth/shibd.logger''' and which logs to '''/var/log/shibboleth/shibd.log'''.  This typically only logs errors and warnings and the occasionally informationl log message, typically when starting or stopping.  However, if you are having problems with the Shibboleth SP, particularly when setting up, it may be useful to enable debug.  To do this&lt;br /&gt;
&lt;br /&gt;
1. Edit the '''/etc/shibboleth/shibd.logger''' and uncomment the following lines:&lt;br /&gt;
 # tracing of SAML messages and security policies&lt;br /&gt;
 #log4j.category.OpenSAML.MessageDecoder=DEBUG&lt;br /&gt;
 #log4j.category.OpenSAML.MessageEncoder=DEBUG&lt;br /&gt;
 #log4j.category.OpenSAML.SecurityPolicyRule=DEBUG&lt;br /&gt;
 #log4j.category.XMLTooling.SOAPClient=DEBUG&lt;br /&gt;
 # interprocess message remoting&lt;br /&gt;
 #log4j.category.Shibboleth.Listener=DEBUG&lt;br /&gt;
 # mapping of requests to applicationId&lt;br /&gt;
 #log4j.category.Shibboleth.RequestMapper=DEBUG&lt;br /&gt;
 # high level session cache operations&lt;br /&gt;
 #log4j.category.Shibboleth.SessionCache=DEBUG&lt;br /&gt;
 # persistent storage and caching&lt;br /&gt;
 #log4j.category.XMLTooling.StorageService=DEBUG&lt;br /&gt;
So they look like&lt;br /&gt;
 # tracing of SAML messages and security policies&lt;br /&gt;
 log4j.category.OpenSAML.MessageDecoder=DEBUG&lt;br /&gt;
 log4j.category.OpenSAML.MessageEncoder=DEBUG&lt;br /&gt;
 log4j.category.OpenSAML.SecurityPolicyRule=DEBUG&lt;br /&gt;
 log4j.category.XMLTooling.SOAPClient=DEBUG&lt;br /&gt;
 # interprocess message remoting&lt;br /&gt;
 log4j.category.Shibboleth.Listener=DEBUG&lt;br /&gt;
 # mapping of requests to applicationId&lt;br /&gt;
 log4j.category.Shibboleth.RequestMapper=DEBUG&lt;br /&gt;
 # high level session cache operations&lt;br /&gt;
 log4j.category.Shibboleth.SessionCache=DEBUG&lt;br /&gt;
 # persistent storage and caching&lt;br /&gt;
 log4j.category.XMLTooling.StorageService=DEBUG&lt;br /&gt;
&lt;br /&gt;
2. Test the Shibboleth SP is correctly configured&lt;br /&gt;
 shibd -t&lt;br /&gt;
&lt;br /&gt;
3. Restart the Shibboleth SP&lt;br /&gt;
 systemctl restart shibd&lt;br /&gt;
&lt;br /&gt;
There is various debugging that has been enabled by these changes.  Particularly useful are the first two line:&lt;br /&gt;
 log4j.category.OpenSAML.MessageDecoder=DEBUG&lt;br /&gt;
 log4j.category.OpenSAML.MessageEncoder=DEBUG&lt;br /&gt;
This will allow you to see the XML messages sent to and from the Shibboleth Identity Provider (IdP), such as MicroSoft Entra or OpenAthens.  &lt;br /&gt;
&lt;br /&gt;
== Debugging User Attributes Mapping Issues ==&lt;br /&gt;
This debugging can be particularly useful if you are trying to work attributes in your attribute-map.xml are not being mapped as expected.  If you tail the log file '''/var/log/shibboleth/shibd.log''' and then try to login using the Shibboleth, you should see a line in the logs that starts:&lt;br /&gt;
 &amp;lt;samlp:Response ...&lt;br /&gt;
If you copy the whole of that line into a text file in /tmp/ and save it.  Then you can run xmllint on it to format the output.  E.g.&lt;br /&gt;
 xmllint --format /tmp/saml-response.xml&lt;br /&gt;
If attributes are being mapped, in the formatted output you should be able to see section that starts with an '''AttributeStatment''' XML tag.  E.g.&lt;br /&gt;
 &amp;lt;AttributeStatement&amp;gt;&lt;br /&gt;
   &amp;lt;Attribute Name=&amp;quot;http://schemas.microsoft.com/identity/claims/tenantid&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;AttributeValue&amp;gt;01234567-89ab-cdef-0123-456789abcdef&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
      &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
      &amp;lt;Attribute Name=&amp;quot;http://schemas.microsoft.com/identity/claims/objectidentifier&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;AttributeValue&amp;gt;fedcba98-7654-3210-fedc-ba9876543210&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
      &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
      &amp;lt;Attribute Name=&amp;quot;http://schemas.microsoft.com/identity/claims/identityprovider&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;AttributeValue&amp;gt;https://sts.windows.net/89abcdef-0123-4567-89ab-cdef01234567/&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
      &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
      &amp;lt;Attribute Name=&amp;quot;http://schemas.microsoft.com/claims/authnmethodsreferences&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;AttributeValue&amp;gt;http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
        &amp;lt;AttributeValue&amp;gt;http://schemas.microsoft.com/claims/multipleauthn&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
      &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
      &amp;lt;Attribute Name=&amp;quot;urn:oid:0.9.2342.19200300.100.1.3&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;AttributeValue&amp;gt;j.bloggs@example.org&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
      &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
      &amp;lt;Attribute Name=&amp;quot;urn:oid:2.5.4.4&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;AttributeValue&amp;gt;Bloggs&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
      &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
      &amp;lt;Attribute Name=&amp;quot;urn:oid:2.5.4.42&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;AttributeValue&amp;gt;Joe&amp;lt;/AttributeValue&amp;gt;&lt;br /&gt;
      &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
    &amp;lt;/AttributeStatement&amp;gt;&lt;br /&gt;
If you cannot find users attributes you are expecting to see based on what you have configurured in your Shibboleth SP's attribute-map.xml, then you will need to get the maintainer of Shibboleth IdP to make sure these attributes are released or otherwise release attributes that store the sane user metadata.  At this point you can re-run this debugging to see what user attributes you are now getting and update your Shibboleth SP's attribute-map.xml as appropriate.&lt;br /&gt;
&lt;br /&gt;
'''When you have finished debugging.  It is sensible to comment out the debug lines in '''/etc/shibboleth/shibd.logger''' again and restart the Shibboleth SP.'''&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Shibboleth&amp;diff=16999</id>
		<title>Shibboleth</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Shibboleth&amp;diff=16999"/>
		<updated>2025-11-17T10:45:43Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* With attribute-map.xml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Manual}}&lt;br /&gt;
'''This page details how to install and integrate Shibboleth with EPrints 3.3.x or 3.4.x on a CentOS 7 operating system.'''  The process should be fairly similar for other comparable Red Hat based Linux distributions such as RHEL 7 and Fedora 21/22.  These instructions should also be generally applicable to later versions of RHEL-based Linux (e.g. Rocky Linux 8, Red Hat Enterprise Linux 9, etc.). However, they may be somewhat different for Debian-based Linux, such as Ubuntu and Debian itself and other Linux distributions.  Typically, this will just be different package names and different commands to manage applications.&lt;br /&gt;
&lt;br /&gt;
Generally, it is a good idea to run EPrints with '''HTTPS''' when using Shibboleth authentication for increased security on the attributes being sent back by the Shibboleth Identity Provider (IdP).  Therefore, it is assumed that EPrints has already been set up to use HTTPS and there already exists an '''ssl/securevhost.conf''' under the archive directory structure.&lt;br /&gt;
&lt;br /&gt;
== Installing Shibboleth ==&lt;br /&gt;
* First, add the Shibboleth repository to your list of YUM repositories (if you need this for a different RHEL-based Linux distribution fill in the form at https://shibboleth.net/downloads/service-provider/latest/RPMS/):&lt;br /&gt;
  root&amp;gt; wget -O /etc/yum.repos.d/shibboleth.repo https://shibboleth.net/cgi-bin/sp_repo.cgi?platform=CentOS_7&lt;br /&gt;
&lt;br /&gt;
* Now you can use Yum to install all package dependencies:&lt;br /&gt;
  root&amp;gt; yum install log4shib opensaml shibboleth unixODBC xerces-c xml-security-c xmltooling &lt;br /&gt;
&lt;br /&gt;
* You may be prompted to accept the importing of the key for the Shibboleth repository, for which you should type '''y''' and press enter.&lt;br /&gt;
&lt;br /&gt;
* Once you have done that, test that '''shibd''' has no issues:&lt;br /&gt;
  root&amp;gt; LD_LIBRARY_PATH=/opt/shibboleth/lib64 shibd -t&lt;br /&gt;
&lt;br /&gt;
* ''shibd -t'' should return a couple of warning, like those listed below.  These are due to it not yet being configured.&lt;br /&gt;
  2015-05-11 10:39:01 WARN Shibboleth.Application : insecure cookieProps setting, set to &amp;quot;https&amp;quot; for SSL/TLS-only usage&lt;br /&gt;
  2015-05-11 10:39:01 WARN Shibboleth.Application : handlerSSL should be enabled for SSL/TLS-enabled web sites&lt;br /&gt;
  2015-05-11 10:39:01 WARN Shibboleth.Application : no MetadataProvider available, configure at least one for standard SSO usage&lt;br /&gt;
  overall configuration is loadable, check console for non-fatal problems&lt;br /&gt;
&lt;br /&gt;
* If there are no other warning or error messages from ''shibd -t'', you can start it properly and check to make sure it is running. You may also want ensure Shibboleth starts at boot using '''systemctl  enable'''&lt;br /&gt;
  root&amp;gt; systemctl start shibd.service&lt;br /&gt;
  root&amp;gt; ps aux | grep shib&lt;br /&gt;
  shibd    29338  0.4  0.7 419784 15024 ?        Ssl  11:16   0:00 /usr/sbin/shibd -p /var/run/shibboleth/shibd.pid -f -w 30&lt;br /&gt;
  root     29345  0.0  0.0 112640   940 pts/2    S+   11:17   0:00 grep --color=auto -i shib&lt;br /&gt;
  root&amp;gt; systemctl enable shibd.service&lt;br /&gt;
&lt;br /&gt;
== Configuring Shibboleth ==&lt;br /&gt;
* Replace '''/etc/shibboleth/shibboleth2.xml''' with the following.  Substitute '''foo.eprints.org''' for the hostname of your EPrints repository, '''https://shib.foo.example.org/idp/shibboleth''' with the entity ID for you Shibboleth IdP and '''foo''' in the pathname of files with the name or your repository (e.g. ''foo/attribute-map.xml'' becomes ''myrepo/attribute-map.xml'').  '''(This configuration is intended for Shibboleth SP version 2.x and is liable to cause deprecation warnings if  you have installed a recent version of Shibboleth from a package repository.  [[Shibboleth/3.x|Here is a default shibboleth2.xml configuration for Shibboleth 3.x]]).'''&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;SPConfig xmlns=&amp;quot;urn:mace:shibboleth:3.0:native:sp:config&amp;quot;&lt;br /&gt;
    xmlns:conf=&amp;quot;urn:mace:shibboleth:3.0:native:sp:config&amp;quot;&lt;br /&gt;
    clockSkew=&amp;quot;180&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
    &amp;lt;ApplicationDefaults entityID=&amp;quot;https://foo.eprints.org/shibboleth&amp;quot;&lt;br /&gt;
                         REMOTE_USER=&amp;quot;eppn subject-id pairwise-id persistent-id&amp;quot;&lt;br /&gt;
                         cipherSuites=&amp;quot;DEFAULT:!EXP:!LOW:!aNULL:!eNULL:!DES:!IDEA:!SEED:!RC4:!3DES:!kRSA:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
      &amp;lt;Sessions lifetime=&amp;quot;28800&amp;quot; timeout=&amp;quot;3600&amp;quot; relayState=&amp;quot;ss:mem&amp;quot; &lt;br /&gt;
                checkAddress=&amp;quot;false&amp;quot; handlerSSL=&amp;quot;true&amp;quot; cookieProps=&amp;quot;https&amp;quot;&lt;br /&gt;
                redirectLimit=&amp;quot;exact&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;SSO entityID=&amp;quot;https://shib.foo.example.org/idp/shibboleth&amp;quot;&amp;gt;SAML2&amp;lt;/SSO&amp;gt;&lt;br /&gt;
        &amp;lt;Logout&amp;gt;SAML2 Local&amp;lt;/Logout&amp;gt;&lt;br /&gt;
        &amp;lt;LogoutInitiator type=&amp;quot;Admin&amp;quot; Location=&amp;quot;/Logout/Admin&amp;quot; acl=&amp;quot;127.0.0.1 ::1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Handler type=&amp;quot;Status&amp;quot; Location=&amp;quot;/Status&amp;quot; acl=&amp;quot;127.0.0.1 ::1&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;Handler type=&amp;quot;Session&amp;quot; Location=&amp;quot;/Session&amp;quot; showAttributeValues=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;Handler type=&amp;quot;DiscoveryFeed&amp;quot; Location=&amp;quot;/DiscoFeed&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/Sessions&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
      &amp;lt;Errors supportContact=&amp;quot;root@localhost&amp;quot; helpLocation=&amp;quot;/about.html&amp;quot; styleSheet=&amp;quot;/shibboleth/main.css&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;MetadataProvider type=&amp;quot;XML&amp;quot; path=&amp;quot;foo/idp-metadata.xml&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;AttributeExtractor type=&amp;quot;XML&amp;quot; validate=&amp;quot;true&amp;quot; reloadChanges=&amp;quot;false&amp;quot; path=&amp;quot;foo/attribute-map.xml&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;AttributeFilter type=&amp;quot;XML&amp;quot; validate=&amp;quot;true&amp;quot; path=&amp;quot;attribute-policy.xml&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;CredentialResolver type=&amp;quot;File&amp;quot; use=&amp;quot;signing&amp;quot; key=&amp;quot;foo/sp-key.pem&amp;quot; certificate=&amp;quot;foo/sp-cert.pem&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;CredentialResolver type=&amp;quot;File&amp;quot; use=&amp;quot;encryption&amp;quot; key=&amp;quot;foo/sp-key.pem&amp;quot; certificate=&amp;quot;foo/sp-cert.pem&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/ApplicationDefaults&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
    &amp;lt;SecurityPolicyProvider type=&amp;quot;XML&amp;quot; validate=&amp;quot;true&amp;quot; path=&amp;quot;security-policy.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;ProtocolProvider type=&amp;quot;XML&amp;quot; validate=&amp;quot;true&amp;quot; reloadChanges=&amp;quot;false&amp;quot; path=&amp;quot;protocols.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/SPConfig&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create the directory '''/etc/shibboleth/foo''', substituting ''foo'' for your repository name.&lt;br /&gt;
  root&amp;gt; mkdir /etc/shibboleth/foo&lt;br /&gt;
&lt;br /&gt;
* Copy '''attribute-map.xml''' into this new directory.&lt;br /&gt;
  cp /etc/shibboleth/attribute-map.xml /etc/shibboleth/foo/&lt;br /&gt;
&lt;br /&gt;
* Temporarily rename '''sp-cert.pem''' and '''sp-key.pem''' in '''/etc/shibboleth/''' to '''sp-cert.pem.old''' and '''sp-key.pem.old'''.&lt;br /&gt;
  root&amp;gt; cd /etc/shibboleth&lt;br /&gt;
  root&amp;gt; mv sp-cert.pem sp-cert.pem.old&lt;br /&gt;
  root&amp;gt; mv sp-key.pem sp-key.pem.old&lt;br /&gt;
&lt;br /&gt;
* Run '''keygen.sh''' from the '''/etc/shibboleth/''' directory, as follows replacing '''foo.eprints.org''' with your EPrints repository hostname.&lt;br /&gt;
  root&amp;gt; cd /etc/shibboleth&lt;br /&gt;
  root&amp;gt; ./keygen.sh -f -h foo.eprints.org -e https://foo.eprints.org/shibboleth&lt;br /&gt;
&lt;br /&gt;
* Move the new '''sp-cert.pem''' and '''sp-key.pem''' to '''/etc/shibboleth/foo/''' and move the ''.old'' files back in place:&lt;br /&gt;
  root&amp;gt; cd /etc/shibboleth&lt;br /&gt;
  root&amp;gt; mv sp-cert.pem sp-key.pem foo/&lt;br /&gt;
  root&amp;gt; mv sp-cert.pem.old sp-cert.pem&lt;br /&gt;
  root&amp;gt; mv sp-key.pem.old sp-key.pem&lt;br /&gt;
&lt;br /&gt;
* Check that '''sp-cert.pem''' and '''sp-key.pem''' in '''/etc/shibboleth/foo/''' still have the owner and group '''shibd'''.&lt;br /&gt;
  root&amp;gt; ls -l /etc/shibboleth/foo/sp-*&lt;br /&gt;
  -rw-r--r-- 1 shibd shibd 1192 May  6 19:04 /etc/shibboleth/foo/sp-cert.pem&lt;br /&gt;
  -rw------- 1 shibd shibd 1708 May  6 19:04 /etc/shibboleth/foo/sp-key.pem&lt;br /&gt;
&lt;br /&gt;
* Run '''metagen.sh''' from the '''/etc/shibboleth/''' directory, as follows replacing '''foo.eprints.org''' with your EPrints repository hostname.  You will ultimately need to send the output of this to the person managing the Shibboleth IdP server with which you want to register your EPrints repository as a service.&lt;br /&gt;
  root&amp;gt; cd /etc/shibboleth&lt;br /&gt;
  root&amp;gt; ./metagen.sh -ALO -c foo/sp-cert.pem -h foo.eprints.org -e https://foo.eprints.org/shibboleth &amp;gt; foo/sp_metadata.xml&lt;br /&gt;
&lt;br /&gt;
* Modify ''' foo/sp_metadata.xml''' to add in the namepace definitions by separately changing the &amp;lt;code&amp;gt;md:EntityDescriptor&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ds:KeyInfo&amp;lt;/code&amp;gt; lines as follows from:&lt;br /&gt;
 &amp;lt;md:EntityDescriptor entityID=&amp;quot;https://foo.eprints.org/shibboleth&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
     ...&lt;br /&gt;
       &amp;lt;ds:KeyInfo&amp;gt;&lt;br /&gt;
to:&lt;br /&gt;
 &amp;lt;md:EntityDescriptor xmlns:md=&amp;quot;urn:oasis:names:tc:SAML:2.0:metadata&amp;quot; entityID=&amp;quot;https://foo.eprints.org/shibboleth&amp;quot;&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
     ...&lt;br /&gt;
       &amp;lt;ds:KeyInfo xmlns:ds=&amp;quot;http://www.w3.org/2000/09/xmldsig#&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Use ''wget'' to download the metadata from your Shibboleth IdP (e.g. shib.foo.example.org) to the '''/etc/shibboleth/foo/''' directory.&lt;br /&gt;
  root&amp;gt; wget -O /etc/shibboleth/foo/idp-metadata.xml https://shib.foo.example.org/idp/shibboleth&lt;br /&gt;
&lt;br /&gt;
=== Using Remote IdP Metatdata ===&lt;br /&gt;
&lt;br /&gt;
As IdP Metadata may expire, you may want to use the remote metadata URL rather than a local copy.  This is what you need to do to switch to using remote IdP metadata:&lt;br /&gt;
&lt;br /&gt;
* Edit the '''MetadataProvider''' line to something like the following.  The reloadInterval is best set to 7200 but this can be set less frequently:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;MetadataProvider type=&amp;quot;XML&amp;quot; url=&amp;quot;https://shib.foo.example.org/idp/metadata.xml&amp;quot; backingFilePath=&amp;quot;foo/idp-metadata.xml&amp;quot; reloadInterval=&amp;quot;7200&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Make sure the reloadInterval is appropriate for the IdP metadata you are downloading.  If you have large metadata file,(e.g. from a federated metadata service containing metadata for other IdPs), then it may be better to set this higher than the default.  However, the configuration checker may warn you that your reload interval is too long, so you may have to choose to ignore this, if you want to avoid downloading a large federated metadata file too often.&lt;br /&gt;
&lt;br /&gt;
* Make sure that the directory '''/etc/shibboleth/foo/''' and '''/etc/shibboleth/foo/idp-metadata.xml''' if it already exists) are owned by '''shibd''':&lt;br /&gt;
&lt;br /&gt;
 chown shibd:shibd /etc/shibboleth/foo/&lt;br /&gt;
 chown shibd:shibd /etc/shibboleth/foo/idp-metadata.xml&lt;br /&gt;
&lt;br /&gt;
* To test Shibboleth you will need to make sure your '''LD_LIBRARY_PATH''' is set the same as shibd would have when started using ''systemctl shibd start''.&lt;br /&gt;
 &lt;br /&gt;
 LD_LIBRARY_PATH=/opt/shibboleth/lib64:$LD_LIBRARY_PATH shibd -t&lt;br /&gt;
This should return the message: ''overall configuration is loadable, check console for non-fatal problems''.&lt;br /&gt;
&lt;br /&gt;
* The above message is because it is now advised not to leave the MetadataGenerator enabled unnecessarily.  However, whilst you are setting up Shibboleth, it is useful to have the metadata generator, save you needing to build your own Service Provider metadata file to register with your Identity Provider.  Later on you can comment out the MetadataGenerator line to stop getting this warning message.&lt;br /&gt;
&lt;br /&gt;
* Now you can restart '''shibd''' properly:&lt;br /&gt;
&lt;br /&gt;
 systemctl restart shibd&lt;br /&gt;
&lt;br /&gt;
== Configuring Apache and EPrints ==&lt;br /&gt;
'''N.B. All these actions should be carried out by the ''eprints'' user, except when prepended with ''root&amp;gt;'' which means the command should be run as the ''root'' user.'''&lt;br /&gt;
* Add the following configuration to your archive's '''ssl/securevhost.conf''', after the '''Include /opt/eprints3/cfg/apache_ssl/foo.conf''', substituting '''foo''' for your archive's name where appropriate.  (This assumes you are running Apache 2.4 or greater).  See [[#Apache 2.2 (and lower) Configuration for EPrints Shibboleth Integration |Troubleshooting]] for instructions on the configuration to use for Apache 2.2. or lower.&lt;br /&gt;
&lt;br /&gt;
 Alias /shibboleth /opt/eprints3/archives/foo/shibboleth&lt;br /&gt;
 &amp;lt;Location &amp;quot;/shibboleth&amp;quot;&amp;gt;&lt;br /&gt;
   SetHandler perl-script&lt;br /&gt;
   PerlHandler ModPerl::Registry&lt;br /&gt;
   PerlSendHeader Off&lt;br /&gt;
   Options ExecCGI FollowSymLinks&lt;br /&gt;
 &lt;br /&gt;
   AuthType shibboleth&lt;br /&gt;
   ShibRequestSetting requireSession 1&lt;br /&gt;
   require shib-session&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /cgi/shibboleth&amp;gt;&lt;br /&gt;
   AuthType shibboleth&lt;br /&gt;
   ShibRequestSetting requireSession 1&lt;br /&gt;
   require shib-session&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Copy the following code into your archive (e.g. /opt/eprints3/archives/foo/) as '''cgi/shibboleth'''.&lt;br /&gt;
 use EPrints;&lt;br /&gt;
 use strict;&lt;br /&gt;
 my $session = new EPrints::Session;&lt;br /&gt;
 exit( 0 ) unless( defined $session );&lt;br /&gt;
 &lt;br /&gt;
 $session-&amp;gt;send_http_header( &amp;quot;content_type&amp;quot; =&amp;gt; &amp;quot;text/html&amp;quot; );&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;&amp;amp;lt;html&amp;amp;gt;&amp;amp;lt;head/&amp;amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;amp;lt;code&amp;amp;gt;\n&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 foreach my $key (sort keys(%ENV)) {&lt;br /&gt;
   print &amp;quot;&amp;amp;lt;p&amp;amp;gt;$key = $ENV{$key}&amp;amp;lt;/p&amp;amp;gt;&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;&amp;amp;lt;/code&amp;amp;gt;&amp;amp;lt;/body&amp;amp;gt;&amp;amp;lt;/html&amp;amp;gt;&amp;quot;;&lt;br /&gt;
 $session-&amp;gt;terminate;&lt;br /&gt;
 exit;&lt;br /&gt;
&lt;br /&gt;
* Now restart Shibboleth and Apache:&lt;br /&gt;
  root&amp;gt; systemctl restart shibd.service&lt;br /&gt;
  root&amp;gt; apachectl restart&lt;br /&gt;
&lt;br /&gt;
* In a web browser go the '''/cgi/shibboleth''' page for your repository, (e.g. ''https://foo.eprints.org/cgi/shibboleth'').  You should be redirected to an error page for your your Shibboleth IdP (e.g. ''https://shib.foo.example.org/idp/profile/SAML2/Redirect/SSO?...'').  &lt;br /&gt;
&lt;br /&gt;
* If instead you are displayed with a list of key values or are forbidden to access the page, you have not configured Apache properly, if so, see [[#Apache_Configuration_Issues|Apache_Configuration_Issues]] under [[#Troubleshooting|Troubleshooting]].  If you see an error message like the one below, you have not set up Shibboleth properly, if so, see [[#Shibboleth_Configuration_Issues|Shibboleth_Configuration_Issues]] under [[#Troubleshooting|Troubleshooting]].&lt;br /&gt;
 opensaml::saml2md::MetadataException&lt;br /&gt;
 The system encountered an error at Wed May 6 15:19:27 2015&lt;br /&gt;
 To report this problem, please contact the site administrator at root@localhost.&lt;br /&gt;
 Please include the following message in any email:&lt;br /&gt;
 opensaml::saml2md::MetadataException at (http://foo.eprints.org/cgi/shibboleth)&lt;br /&gt;
 Unable to locate metadata for identity provider (https://shib.foo.example.org/idp/shibboleth)&lt;br /&gt;
&lt;br /&gt;
* Next, copy the following code into your archive (e.g. ''/opt/eprints3/archives/foo/'') as '''cfg/cfg.d/zz_shibboleth.pl'''.  This is needed to redirect login and logout to use Shibboleth rather than local login.&lt;br /&gt;
 $c-&amp;gt;{get_login_url} = sub {&lt;br /&gt;
   my( $session, $target ) = @_;&lt;br /&gt;
 &lt;br /&gt;
   # preserve CGI params&lt;br /&gt;
   $session-&amp;gt;read_params;&lt;br /&gt;
   $target = $session-&amp;gt;get_url(&lt;br /&gt;
     host =&amp;gt; 1,&lt;br /&gt;
     path =&amp;gt; &amp;quot;auto&amp;quot;,&lt;br /&gt;
     query =&amp;gt; 1,&lt;br /&gt;
   );&lt;br /&gt;
 &lt;br /&gt;
   my $url = URI-&amp;gt;new( $session-&amp;gt;config( &amp;quot;https_url&amp;quot; )  . &amp;quot;/shibboleth/login&amp;quot; );&lt;br /&gt;
   $url-&amp;gt;query_form( target =&amp;gt; &amp;quot;$target&amp;quot; );&lt;br /&gt;
   return &amp;quot;$url&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 $c-&amp;gt;{on_logout} = sub {&lt;br /&gt;
   my( $session ) = @_;&lt;br /&gt;
   my $query = $session-&amp;gt;query;&lt;br /&gt;
   return unless defined $query;&lt;br /&gt;
 &lt;br /&gt;
   # remove _shibsession_ cookie&lt;br /&gt;
   my( $shibname, $shibvalue );&lt;br /&gt;
   for( $query-&amp;gt;cookie() ) {&lt;br /&gt;
     if( $_ =~ /^_shibsession/ ) {&lt;br /&gt;
       $shibname = $_;&lt;br /&gt;
       $shibvalue = $query-&amp;gt;cookie( $shibname );&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   my $cookie = $query-&amp;gt;cookie(&lt;br /&gt;
     -name    =&amp;gt; $shibname,&lt;br /&gt;
     -path    =&amp;gt; &amp;quot;/&amp;quot;,&lt;br /&gt;
     -value   =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
     -host  =&amp;gt; $session-&amp;gt;config(&amp;quot;cookie_domain&amp;quot;),&lt;br /&gt;
     -expires =&amp;gt; &amp;quot;-1d&amp;quot;,&lt;br /&gt;
   );&lt;br /&gt;
   EPrints::Apache::AnApache::header_out(&lt;br /&gt;
     $session-&amp;gt;{request},&lt;br /&gt;
     &amp;quot;Set-Cookie&amp;quot; =&amp;gt; $cookie &lt;br /&gt;
   );&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 push @{$c-&amp;gt;{rewrite_exceptions}}, &amp;quot;/shibboleth/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
* Create a folder at the top level of your archive (e.g. ''/opt/eprints3/archives/foo/'') called '''shibboleth''' and copy the main CSS file for Shibboleth into this folder:&lt;br /&gt;
 eprints&amp;gt; mkdir /opt/eprints3/archives/foo/shibboleth/&lt;br /&gt;
 eprints&amp;gt; cp /usr/share/shibboleth/main.css /opt/eprints3/archives/foo/shibboleth/&lt;br /&gt;
&lt;br /&gt;
* Now, copy the following code into your archive (e.g. ''/opt/eprints3/archives/foo/'') as '''shibboleth/login'''.  This is the most basic login script that should work with the minimal attributes any Shibboleth IdP returns and '''only logging in users with existing accounts'''. Look under the [[#Customisation|Customisation]] section for advice on how to modify this script to meet your requirements, such as creation user accounts on-the-fly.&lt;br /&gt;
 use EPrints;&lt;br /&gt;
 use strict;&lt;br /&gt;
 &lt;br /&gt;
 my $session = EPrints::Session-&amp;gt;new();&lt;br /&gt;
 my $url = $session-&amp;gt;param( &amp;quot;target&amp;quot; );&lt;br /&gt;
 if ( defined $url )&lt;br /&gt;
 {&lt;br /&gt;
   my $target_uri = URI-&amp;gt;new( $url );&lt;br /&gt;
   my $repository_uri = URI-&amp;gt;new( $session-&amp;gt;get_repository-&amp;gt;get_conf( 'base_url' ) );&lt;br /&gt;
   if ( !$target_uri-&amp;gt;can( 'host' ) || $target_uri-&amp;gt;host ne $repository_uri-&amp;gt;host )&lt;br /&gt;
   {&lt;br /&gt;
     $url = undef;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 $url = $session-&amp;gt;get_repository-&amp;gt;get_conf( &amp;quot;userhome&amp;quot; ) unless EPrints::Utils::is_set( $url );&lt;br /&gt;
 &lt;br /&gt;
 my $user = &amp;amp;get_user;&lt;br /&gt;
 &lt;br /&gt;
 if( defined $user )&lt;br /&gt;
 {&lt;br /&gt;
   $user-&amp;gt;set_value( &amp;quot;last_login&amp;quot;, EPrints::Time::get_iso_timestamp() );&lt;br /&gt;
   $user-&amp;gt;commit;&lt;br /&gt;
 &lt;br /&gt;
   EPrints::DataObj::LoginTicket-&amp;gt;expire_all( $session );&lt;br /&gt;
   $session-&amp;gt;dataset( &amp;quot;loginticket&amp;quot; )-&amp;gt;create_dataobj({&lt;br /&gt;
     userid =&amp;gt; $user-&amp;gt;id,&lt;br /&gt;
   })-&amp;gt;set_cookies();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
   $url = $session-&amp;gt;get_repository-&amp;gt;get_conf( &amp;quot;base_url&amp;quot; ) . &amp;quot;/account_required.html&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 $session-&amp;gt;send_http_header( &amp;quot;content-type&amp;quot; =&amp;gt; &amp;quot;text/html&amp;quot; );&lt;br /&gt;
 print '&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;url='.$url.'&amp;quot;/&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;';&lt;br /&gt;
 $session-&amp;gt;terminate;&lt;br /&gt;
   &lt;br /&gt;
 sub get_user &lt;br /&gt;
 {&lt;br /&gt;
   my ( $username, $email ) = ( undef, &amp;quot;&amp;quot; );&lt;br /&gt;
   if( $ENV{eppn} )&lt;br /&gt;
   {&lt;br /&gt;
    ( $username ) = split( /@/, $ENV{eppn}, 2);&lt;br /&gt;
    $username = lc( $username );&lt;br /&gt;
    $email = $ENV{eppn};&lt;br /&gt;
   }&lt;br /&gt;
   return unless EPrints::Utils::is_set( $username );&lt;br /&gt;
   my $user = $session-&amp;gt;user_by_username( $username );&lt;br /&gt;
   if( defined $user &amp;amp;&amp;amp; defined $email )&lt;br /&gt;
   {&lt;br /&gt;
     $user-&amp;gt;set_value( &amp;quot;email&amp;quot;, $email );&lt;br /&gt;
     $user-&amp;gt;commit;&lt;br /&gt;
   }&lt;br /&gt;
   return $user;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Next, add the following markup to '''cfg/lang/en/static/account_required.xpage''' under your archive (e.g. ''/opt/eprints3/archives/foo/'').  Substituting ''staff and students of the University of Foo'' to describe to which particular group of people logged in access is restricted.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; standalone=&amp;quot;no&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE page SYSTEM &amp;quot;entities.dtd&amp;quot; &amp;gt;&lt;br /&gt;
 &amp;lt;xpage:page xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; xmlns:xpage=&amp;quot;http://eprints.org/ep3/xpage&amp;quot; xmlns:epc=&amp;quot;http://eprints.org/ep3/control&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;xpage:title&amp;gt;Login Failed&amp;lt;/xpage:title&amp;gt;&lt;br /&gt;
 &amp;lt;xpage:body&amp;gt;&lt;br /&gt;
    &amp;amp;lt;p style='text-align: center;'&amp;amp;gt;Please note that only staff and students of the University of Foo may log in to &amp;lt;epc:phrase ref=&amp;quot;archive_name&amp;quot; /&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &amp;lt;/xpage:body&amp;gt;&lt;br /&gt;
 &amp;lt;/xpage:page&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Now, reload Apache.&lt;br /&gt;
  root&amp;gt; apachectl reload&lt;br /&gt;
&lt;br /&gt;
* In a web browser go to the '''/shibboleth/login''' page for your repository, (e.g. ''https://foo.eprints.org/shibboleth/login'').  Like before with ''/cgi/shibboleth'' you should be taken to your Shibboleth IdP's site albeit displaying an error message.&lt;br /&gt;
&lt;br /&gt;
* The Shibboleth IdP shows an error message because EPrints as a Shibboleth Service Provider is not yet registered with it.  To do this you need to send the administrator of the Shibboleth IdP the metadata for your Service Provider.  You will have generated this earlier when you ran &amp;lt;code&amp;gt;metagen.sh&amp;lt;/code&amp;gt;.  Copy off your EPrints server the file that this wrote (e.g. to &amp;lt;tt&amp;gt;/etc/shibboleth/foo/sp_metadata.xml&amp;lt;/tt&amp;gt;) and send it to the Shibboleth IdP administrator.  They should be able to upload this to register EPrints as a Service Provider application.&lt;br /&gt;
&lt;br /&gt;
* Once registered, use a web browser to go to '''/shibboleth/login''' page for your repository, (e.g. ''https://foo.eprints.org/shibboleth/login'') again.  This time you should be prompted for a username and password on the Shibboleth IdP site. Once you have typed this in and clicked to login, you should be returned to EPrints on the '''/cgi/users/home''' page for your repository.  If not, see [[#Login_Issues|Login Issues]] under [[#Troubleshooting|Troubleshooting]] below.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Apache Configuration Issues ===&lt;br /&gt;
==== Apache 2.2 (and lower) Configuration for EPrints Shibboleth Integration ====&lt;br /&gt;
* Similarly to the instructions for Apache 2.4 and above, place the slightly different following configuration after the '''Include''' line for ''apache_ssl/foo.conf'', (substituting '''foo''' for your archive's name):&lt;br /&gt;
&lt;br /&gt;
  Alias /shibboleth /opt/eprints3/archives/foo/shibboleth&lt;br /&gt;
  &amp;lt;Directory &amp;quot;/opt/eprints3/archives/foo/shibboleth&amp;quot;&amp;gt;&lt;br /&gt;
    SetHandler perl-script&lt;br /&gt;
    PerlHandler ModPerl::Registry&lt;br /&gt;
    PerlSendHeader Off&lt;br /&gt;
    Options ExecCGI FollowSymLinks&lt;br /&gt;
  &lt;br /&gt;
    AuthType shibboleth&lt;br /&gt;
    ShibRequireSession On&lt;br /&gt;
    require valid-user&lt;br /&gt;
  &amp;lt;/Directory&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Location /cgi/shibboleth&amp;gt;&lt;br /&gt;
    AuthType shibboleth&lt;br /&gt;
    ShibRequireSession On&lt;br /&gt;
    require valid-user&lt;br /&gt;
  &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Shibboleth Configuration Issues ===&lt;br /&gt;
==== With attribute-map.xml ====&lt;br /&gt;
When authenticating using Shibboleth to login to EPrints you may see the following line in '''/var/log/shibboleth.shibd.log'''&lt;br /&gt;
&lt;br /&gt;
  2015-09-09 09:26:43 INFO Shibboleth.AttributeExtractor.XML [2]: skipping unmapped SAML 2.0 Attribute with Name:  urn:mace:dir:attribute-def:department&lt;br /&gt;
&lt;br /&gt;
In some cases this might not be an issue, as EPrints does not necessarily to make use of all the attributes returned by the IdP but without a mapping in attribute-map.xml.  In this case '''urn:mace:dir:attribute-def:department''' is not by default needed by EPrints to create/update a user account.  However, values like '''sn''', '''givenName''' and '''mail''' are but if you have used the attribute-map.xml provided later on the page you should not see a line like above in '''shibd.log'''.  In some cases you may still see an line like this in the log even if you think you have defined the attribute.  The line below demonstrate two known issues:&lt;br /&gt;
&lt;br /&gt;
  2015-09-09 09:26:43 INFO Shibboleth.AttributeExtractor.XML [2]: skipping unmapped SAML 2.0 Attribute with Name:  givenName, Format:urn:oasis:names:tc:SAML:2.0:attrname-format:basic&lt;br /&gt;
&lt;br /&gt;
# The attribute itself has no namespace it is just '''givenName''' rather than '''urn:mace:dir:attribute-def:givenName'''&lt;br /&gt;
# The attribute has a format that most also be defined in the attribute-map.xml attribute.&lt;br /&gt;
&lt;br /&gt;
Below shows how to both include the format, which is required for the attribute to be successful mapped.  As well as define the name of the attribute without a namespace:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Attribute name=&amp;quot;givenName&amp;quot; nameFormat=&amp;quot;urn:oasis:names:tc:SAML:2.0:attrname-format:basic&amp;quot; id=&amp;quot;givenName&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A typical Shibboleth IdP would have both a namespaced attribute name and would not apply a format to an attribute that is a simple text string.  Therefore it is worth enquiring with the IdP provider if either of these two happen to be the case.  The Shibboleth Service Provider can be [[Shibboleth Debug Logging|run in debug mode]], which may help your figure out what attributes are being mapped..&lt;br /&gt;
&lt;br /&gt;
==== With idp-metadata.xml ====&lt;br /&gt;
If you want to be able extract scoped attributes (e.g. '''eduPersonPrincipalName''' otherwise described as '''eppn''').  Then you will need to ensure that the expected scope of this attribute, (effectively the domain part in eduPersonPrincipalName is the scope or one of the scopes in the idp-metadata.xml you downloaded from the Shibboleth IdP.  For example if the '''eduPersonPrincipalName''' is '''bar@foo.ac.uk'''.  Then the following should be defined in idp-metadata.xml ('''N.B. the namespace abbreviations (md: and shibmd:) may be different for the IdP you are working with'''):&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;md:Extensions&amp;gt;&lt;br /&gt;
    &amp;lt;shibmd:Scope regexp=&amp;quot;false&amp;quot;&amp;gt;foo.ac.uk&amp;lt;/shibmd:Scope&amp;gt;&lt;br /&gt;
  &amp;lt;/md:Extensions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Login Issues ===&lt;br /&gt;
To be added.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Customisation ==&lt;br /&gt;
&lt;br /&gt;
=== Shibboleth /etc/shibboleth/foo/attribute-map.xml config ===&lt;br /&gt;
This is adapted from the default '''attribute-map.xml''' provided when the Shibboleth SP package is installed to only include the attribute subsequently used by EPrints Shibboleth Perl script that can be found below.  Namely:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!Field name&lt;br /&gt;
!Field description			&lt;br /&gt;
!SAML v1.1 attribute URN&lt;br /&gt;
!SAMLv2 attribute URN&lt;br /&gt;
|-&lt;br /&gt;
|eppn			&lt;br /&gt;
|Edu Person Principal Name&lt;br /&gt;
|urn:mace:dir:attribute-def:eduPersonPrincipalName&lt;br /&gt;
|urn:oid:1.3.6.1.4.1.5923.1.1.1.6&lt;br /&gt;
|-&lt;br /&gt;
|sn&lt;br /&gt;
|Surname						&lt;br /&gt;
|urn:mace:dir:attribute-def:sn								&lt;br /&gt;
|urn:oid:2.5.4.4&lt;br /&gt;
|-&lt;br /&gt;
|givenName&lt;br /&gt;
|Given (first) name(s)&lt;br /&gt;
|urn:mace:dir:attribute-def:givenName&lt;br /&gt;
|urn:oid:2.5.4.42&lt;br /&gt;
|-&lt;br /&gt;
|mail&lt;br /&gt;
|Email address	&lt;br /&gt;
|urn:mace:dir:attribute-def:mail&lt;br /&gt;
|urn:oid:0.9.2342.19200300.100.1.3  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You may wish to refer to the default '''attribute-map.xml''' is you want to use other attributes.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Attributes xmlns=&amp;quot;urn:mace:shibboleth:2.0:attribute-map&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:mace:dir:attribute-def:eduPersonPrincipalName&amp;quot; id=&amp;quot;eppn&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AttributeDecoder xsi:type=&amp;quot;ScopedAttributeDecoder&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:oid:1.3.6.1.4.1.5923.1.1.1.6&amp;quot; id=&amp;quot;eppn&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AttributeDecoder xsi:type=&amp;quot;ScopedAttributeDecoder&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:mace:dir:attribute-def:sn&amp;quot; id=&amp;quot;sn&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:mace:dir:attribute-def:givenName&amp;quot; id=&amp;quot;givenName&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:mace:dir:attribute-def:mail&amp;quot; id=&amp;quot;mail&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:oid:2.5.4.4&amp;quot; nameFormat=&amp;quot;urn:oasis:names:tc:SAML:2.0:attrname-format:basic&amp;quot; id=&amp;quot;sn&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:oid:2.5.4.42&amp;quot; nameFormat=&amp;quot;urn:oasis:names:tc:SAML:2.0:attrname-format:basic&amp;quot; id=&amp;quot;givenName&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:oid:0.9.2342.19200300.100.1.3&amp;quot; nameFormat=&amp;quot;urn:oasis:names:tc:SAML:2.0:attrname-format:basic&amp;quot; id=&amp;quot;mail&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;/Attributes&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== EPrints /shibboleth/login script with user account creation ===&lt;br /&gt;
This is the standard EPrints Shibboleth login script.  It makes a number of assumptions:&lt;br /&gt;
# That accounts should be created if they do not already exist for a particular user.&lt;br /&gt;
# That you wish to create a standard user account (not an editor administrator) account.&lt;br /&gt;
# That the Shibboleth IdP provides all the attributes (eduPersonPrinicpalName (seen as eppn), sn, givenName and mail) required.&lt;br /&gt;
&lt;br /&gt;
 use EPrints;&lt;br /&gt;
 use strict;&lt;br /&gt;
 &lt;br /&gt;
 my $session = EPrints::Session-&amp;gt;new();&lt;br /&gt;
 my $url = $session-&amp;gt;param( &amp;quot;target&amp;quot; );&lt;br /&gt;
 if ( defined $url )&lt;br /&gt;
 {&lt;br /&gt;
   my $target_uri = URI-&amp;gt;new( $url );&lt;br /&gt;
   my $repository_uri = URI-&amp;gt;new( $session-&amp;gt;get_repository-&amp;gt;get_conf( 'base_url' ) );&lt;br /&gt;
   if ( !$target_uri-&amp;gt;can( 'host' ) || $target_uri-&amp;gt;host ne $repository_uri-&amp;gt;host )&lt;br /&gt;
   {&lt;br /&gt;
     $url = undef;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 $url = $session-&amp;gt;get_repository-&amp;gt;get_conf( &amp;quot;userhome&amp;quot; ) unless EPrints::Utils::is_set( $url );&lt;br /&gt;
 &lt;br /&gt;
 my $user = &amp;amp;get_user;&lt;br /&gt;
 &lt;br /&gt;
 if( defined $user )&lt;br /&gt;
 {&lt;br /&gt;
   $user-&amp;gt;set_value( &amp;quot;last_login&amp;quot;, EPrints::Time::get_iso_timestamp() );&lt;br /&gt;
   $user-&amp;gt;commit;&lt;br /&gt;
 &lt;br /&gt;
   EPrints::DataObj::LoginTicket-&amp;gt;expire_all( $session );&lt;br /&gt;
   $session-&amp;gt;dataset( &amp;quot;loginticket&amp;quot; )-&amp;gt;create_dataobj({&lt;br /&gt;
     userid =&amp;gt; $user-&amp;gt;id,&lt;br /&gt;
   })-&amp;gt;set_cookies();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
   $url = $session-&amp;gt;get_repository-&amp;gt;get_conf( &amp;quot;base_url&amp;quot; ) . &amp;quot;/account_required.html&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 $session-&amp;gt;send_http_header( &amp;quot;content-type&amp;quot; =&amp;gt; &amp;quot;text/html&amp;quot; );&lt;br /&gt;
 print '&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;url='.$url.'&amp;quot;/&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;';&lt;br /&gt;
 $session-&amp;gt;terminate;&lt;br /&gt;
 &lt;br /&gt;
 sub get_user&lt;br /&gt;
 {&lt;br /&gt;
   my ($username, $given, $family, $email) = (undef, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   if( $ENV{eppn} )&lt;br /&gt;
   {&lt;br /&gt;
     ( $username ) = split( /@/, $ENV{eppn}, 2);&lt;br /&gt;
     $username = lc( $username );&lt;br /&gt;
   }&lt;br /&gt;
   $email = $ENV{mail} if $ENV{mail};&lt;br /&gt;
   if( $ENV{givenName} )&lt;br /&gt;
   {&lt;br /&gt;
     $given = lc( $ENV{givenName} );&lt;br /&gt;
     $given =~ s/^(.)/uc($1)/e;&lt;br /&gt;
     $given =~ s/([- ].)/uc($1)/e;&lt;br /&gt;
   }&lt;br /&gt;
   if( $ENV{sn} )&lt;br /&gt;
   {&lt;br /&gt;
     $family = lc( $ENV{sn} );&lt;br /&gt;
     $family =~ s/^(.)/uc($1)/e;&lt;br /&gt;
     $family =~ s/([- ].)/uc($1)/e;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   return unless EPrints::Utils::is_set( $username );&lt;br /&gt;
 &lt;br /&gt;
   my $user = $session-&amp;gt;user_by_username( $username ); # relying on this to be case insensitive&lt;br /&gt;
 &lt;br /&gt;
   if( !defined $user )&lt;br /&gt;
   {&lt;br /&gt;
     my $usertype = 'user';&lt;br /&gt;
     $user = EPrints::DataObj::User::create( $session, $usertype );&lt;br /&gt;
     $user-&amp;gt;set_value( &amp;quot;username&amp;quot;, $username );&lt;br /&gt;
   }&lt;br /&gt;
   my $name = {&lt;br /&gt;
     given =&amp;gt; $given,&lt;br /&gt;
     family =&amp;gt; $family,&lt;br /&gt;
   };&lt;br /&gt;
   $user-&amp;gt;set_value( &amp;quot;name&amp;quot;, $name );&lt;br /&gt;
   $user-&amp;gt;set_value( &amp;quot;email&amp;quot;, $email );&lt;br /&gt;
   $user-&amp;gt;commit;&lt;br /&gt;
   return $user;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Further Information ==&lt;br /&gt;
* Older instructions of how to set up EPrints for Shibboleth using UK Access management Federation discovery service is available [[Shibboleth authentication|here]].&lt;br /&gt;
&lt;br /&gt;
* For general information about installing and configuring Shibboleth [http://shibboleth.internet2.edu/ click here].&lt;br /&gt;
&lt;br /&gt;
* [https://docs.openathens.net/display/public/TPA/Sign+in+to+a+generic+application+using+OpenAthens#SignintoagenericapplicationusingOpenAthens-SetupthecustomSAMLresourceinOpenAthens Instructions of connection a Shibboleth Service Provider with OpenAthens]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Authentication]]&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.eprints.org/w/index.php?title=Shibboleth&amp;diff=16998</id>
		<title>Shibboleth</title>
		<link rel="alternate" type="text/html" href="https://wiki.eprints.org/w/index.php?title=Shibboleth&amp;diff=16998"/>
		<updated>2025-11-17T10:45:19Z</updated>

		<summary type="html">&lt;p&gt;Drn@ecs.soton.ac.uk: /* Shibboleth Configuration Issues */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Manual}}&lt;br /&gt;
'''This page details how to install and integrate Shibboleth with EPrints 3.3.x or 3.4.x on a CentOS 7 operating system.'''  The process should be fairly similar for other comparable Red Hat based Linux distributions such as RHEL 7 and Fedora 21/22.  These instructions should also be generally applicable to later versions of RHEL-based Linux (e.g. Rocky Linux 8, Red Hat Enterprise Linux 9, etc.). However, they may be somewhat different for Debian-based Linux, such as Ubuntu and Debian itself and other Linux distributions.  Typically, this will just be different package names and different commands to manage applications.&lt;br /&gt;
&lt;br /&gt;
Generally, it is a good idea to run EPrints with '''HTTPS''' when using Shibboleth authentication for increased security on the attributes being sent back by the Shibboleth Identity Provider (IdP).  Therefore, it is assumed that EPrints has already been set up to use HTTPS and there already exists an '''ssl/securevhost.conf''' under the archive directory structure.&lt;br /&gt;
&lt;br /&gt;
== Installing Shibboleth ==&lt;br /&gt;
* First, add the Shibboleth repository to your list of YUM repositories (if you need this for a different RHEL-based Linux distribution fill in the form at https://shibboleth.net/downloads/service-provider/latest/RPMS/):&lt;br /&gt;
  root&amp;gt; wget -O /etc/yum.repos.d/shibboleth.repo https://shibboleth.net/cgi-bin/sp_repo.cgi?platform=CentOS_7&lt;br /&gt;
&lt;br /&gt;
* Now you can use Yum to install all package dependencies:&lt;br /&gt;
  root&amp;gt; yum install log4shib opensaml shibboleth unixODBC xerces-c xml-security-c xmltooling &lt;br /&gt;
&lt;br /&gt;
* You may be prompted to accept the importing of the key for the Shibboleth repository, for which you should type '''y''' and press enter.&lt;br /&gt;
&lt;br /&gt;
* Once you have done that, test that '''shibd''' has no issues:&lt;br /&gt;
  root&amp;gt; LD_LIBRARY_PATH=/opt/shibboleth/lib64 shibd -t&lt;br /&gt;
&lt;br /&gt;
* ''shibd -t'' should return a couple of warning, like those listed below.  These are due to it not yet being configured.&lt;br /&gt;
  2015-05-11 10:39:01 WARN Shibboleth.Application : insecure cookieProps setting, set to &amp;quot;https&amp;quot; for SSL/TLS-only usage&lt;br /&gt;
  2015-05-11 10:39:01 WARN Shibboleth.Application : handlerSSL should be enabled for SSL/TLS-enabled web sites&lt;br /&gt;
  2015-05-11 10:39:01 WARN Shibboleth.Application : no MetadataProvider available, configure at least one for standard SSO usage&lt;br /&gt;
  overall configuration is loadable, check console for non-fatal problems&lt;br /&gt;
&lt;br /&gt;
* If there are no other warning or error messages from ''shibd -t'', you can start it properly and check to make sure it is running. You may also want ensure Shibboleth starts at boot using '''systemctl  enable'''&lt;br /&gt;
  root&amp;gt; systemctl start shibd.service&lt;br /&gt;
  root&amp;gt; ps aux | grep shib&lt;br /&gt;
  shibd    29338  0.4  0.7 419784 15024 ?        Ssl  11:16   0:00 /usr/sbin/shibd -p /var/run/shibboleth/shibd.pid -f -w 30&lt;br /&gt;
  root     29345  0.0  0.0 112640   940 pts/2    S+   11:17   0:00 grep --color=auto -i shib&lt;br /&gt;
  root&amp;gt; systemctl enable shibd.service&lt;br /&gt;
&lt;br /&gt;
== Configuring Shibboleth ==&lt;br /&gt;
* Replace '''/etc/shibboleth/shibboleth2.xml''' with the following.  Substitute '''foo.eprints.org''' for the hostname of your EPrints repository, '''https://shib.foo.example.org/idp/shibboleth''' with the entity ID for you Shibboleth IdP and '''foo''' in the pathname of files with the name or your repository (e.g. ''foo/attribute-map.xml'' becomes ''myrepo/attribute-map.xml'').  '''(This configuration is intended for Shibboleth SP version 2.x and is liable to cause deprecation warnings if  you have installed a recent version of Shibboleth from a package repository.  [[Shibboleth/3.x|Here is a default shibboleth2.xml configuration for Shibboleth 3.x]]).'''&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;SPConfig xmlns=&amp;quot;urn:mace:shibboleth:3.0:native:sp:config&amp;quot;&lt;br /&gt;
    xmlns:conf=&amp;quot;urn:mace:shibboleth:3.0:native:sp:config&amp;quot;&lt;br /&gt;
    clockSkew=&amp;quot;180&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
    &amp;lt;ApplicationDefaults entityID=&amp;quot;https://foo.eprints.org/shibboleth&amp;quot;&lt;br /&gt;
                         REMOTE_USER=&amp;quot;eppn subject-id pairwise-id persistent-id&amp;quot;&lt;br /&gt;
                         cipherSuites=&amp;quot;DEFAULT:!EXP:!LOW:!aNULL:!eNULL:!DES:!IDEA:!SEED:!RC4:!3DES:!kRSA:!SSLv2:!SSLv3:!TLSv1:!TLSv1.1&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
      &amp;lt;Sessions lifetime=&amp;quot;28800&amp;quot; timeout=&amp;quot;3600&amp;quot; relayState=&amp;quot;ss:mem&amp;quot; &lt;br /&gt;
                checkAddress=&amp;quot;false&amp;quot; handlerSSL=&amp;quot;true&amp;quot; cookieProps=&amp;quot;https&amp;quot;&lt;br /&gt;
                redirectLimit=&amp;quot;exact&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;SSO entityID=&amp;quot;https://shib.foo.example.org/idp/shibboleth&amp;quot;&amp;gt;SAML2&amp;lt;/SSO&amp;gt;&lt;br /&gt;
        &amp;lt;Logout&amp;gt;SAML2 Local&amp;lt;/Logout&amp;gt;&lt;br /&gt;
        &amp;lt;LogoutInitiator type=&amp;quot;Admin&amp;quot; Location=&amp;quot;/Logout/Admin&amp;quot; acl=&amp;quot;127.0.0.1 ::1&amp;quot; /&amp;gt;&lt;br /&gt;
        &amp;lt;Handler type=&amp;quot;Status&amp;quot; Location=&amp;quot;/Status&amp;quot; acl=&amp;quot;127.0.0.1 ::1&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;Handler type=&amp;quot;Session&amp;quot; Location=&amp;quot;/Session&amp;quot; showAttributeValues=&amp;quot;false&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;Handler type=&amp;quot;DiscoveryFeed&amp;quot; Location=&amp;quot;/DiscoFeed&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;/Sessions&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
      &amp;lt;Errors supportContact=&amp;quot;root@localhost&amp;quot; helpLocation=&amp;quot;/about.html&amp;quot; styleSheet=&amp;quot;/shibboleth/main.css&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;MetadataProvider type=&amp;quot;XML&amp;quot; path=&amp;quot;foo/idp-metadata.xml&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;AttributeExtractor type=&amp;quot;XML&amp;quot; validate=&amp;quot;true&amp;quot; reloadChanges=&amp;quot;false&amp;quot; path=&amp;quot;foo/attribute-map.xml&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;AttributeFilter type=&amp;quot;XML&amp;quot; validate=&amp;quot;true&amp;quot; path=&amp;quot;attribute-policy.xml&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;CredentialResolver type=&amp;quot;File&amp;quot; use=&amp;quot;signing&amp;quot; key=&amp;quot;foo/sp-key.pem&amp;quot; certificate=&amp;quot;foo/sp-cert.pem&amp;quot;/&amp;gt;&lt;br /&gt;
      &amp;lt;CredentialResolver type=&amp;quot;File&amp;quot; use=&amp;quot;encryption&amp;quot; key=&amp;quot;foo/sp-key.pem&amp;quot; certificate=&amp;quot;foo/sp-cert.pem&amp;quot;/&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;/ApplicationDefaults&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
    &amp;lt;SecurityPolicyProvider type=&amp;quot;XML&amp;quot; validate=&amp;quot;true&amp;quot; path=&amp;quot;security-policy.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;ProtocolProvider type=&amp;quot;XML&amp;quot; validate=&amp;quot;true&amp;quot; reloadChanges=&amp;quot;false&amp;quot; path=&amp;quot;protocols.xml&amp;quot;/&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/SPConfig&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Create the directory '''/etc/shibboleth/foo''', substituting ''foo'' for your repository name.&lt;br /&gt;
  root&amp;gt; mkdir /etc/shibboleth/foo&lt;br /&gt;
&lt;br /&gt;
* Copy '''attribute-map.xml''' into this new directory.&lt;br /&gt;
  cp /etc/shibboleth/attribute-map.xml /etc/shibboleth/foo/&lt;br /&gt;
&lt;br /&gt;
* Temporarily rename '''sp-cert.pem''' and '''sp-key.pem''' in '''/etc/shibboleth/''' to '''sp-cert.pem.old''' and '''sp-key.pem.old'''.&lt;br /&gt;
  root&amp;gt; cd /etc/shibboleth&lt;br /&gt;
  root&amp;gt; mv sp-cert.pem sp-cert.pem.old&lt;br /&gt;
  root&amp;gt; mv sp-key.pem sp-key.pem.old&lt;br /&gt;
&lt;br /&gt;
* Run '''keygen.sh''' from the '''/etc/shibboleth/''' directory, as follows replacing '''foo.eprints.org''' with your EPrints repository hostname.&lt;br /&gt;
  root&amp;gt; cd /etc/shibboleth&lt;br /&gt;
  root&amp;gt; ./keygen.sh -f -h foo.eprints.org -e https://foo.eprints.org/shibboleth&lt;br /&gt;
&lt;br /&gt;
* Move the new '''sp-cert.pem''' and '''sp-key.pem''' to '''/etc/shibboleth/foo/''' and move the ''.old'' files back in place:&lt;br /&gt;
  root&amp;gt; cd /etc/shibboleth&lt;br /&gt;
  root&amp;gt; mv sp-cert.pem sp-key.pem foo/&lt;br /&gt;
  root&amp;gt; mv sp-cert.pem.old sp-cert.pem&lt;br /&gt;
  root&amp;gt; mv sp-key.pem.old sp-key.pem&lt;br /&gt;
&lt;br /&gt;
* Check that '''sp-cert.pem''' and '''sp-key.pem''' in '''/etc/shibboleth/foo/''' still have the owner and group '''shibd'''.&lt;br /&gt;
  root&amp;gt; ls -l /etc/shibboleth/foo/sp-*&lt;br /&gt;
  -rw-r--r-- 1 shibd shibd 1192 May  6 19:04 /etc/shibboleth/foo/sp-cert.pem&lt;br /&gt;
  -rw------- 1 shibd shibd 1708 May  6 19:04 /etc/shibboleth/foo/sp-key.pem&lt;br /&gt;
&lt;br /&gt;
* Run '''metagen.sh''' from the '''/etc/shibboleth/''' directory, as follows replacing '''foo.eprints.org''' with your EPrints repository hostname.  You will ultimately need to send the output of this to the person managing the Shibboleth IdP server with which you want to register your EPrints repository as a service.&lt;br /&gt;
  root&amp;gt; cd /etc/shibboleth&lt;br /&gt;
  root&amp;gt; ./metagen.sh -ALO -c foo/sp-cert.pem -h foo.eprints.org -e https://foo.eprints.org/shibboleth &amp;gt; foo/sp_metadata.xml&lt;br /&gt;
&lt;br /&gt;
* Modify ''' foo/sp_metadata.xml''' to add in the namepace definitions by separately changing the &amp;lt;code&amp;gt;md:EntityDescriptor&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ds:KeyInfo&amp;lt;/code&amp;gt; lines as follows from:&lt;br /&gt;
 &amp;lt;md:EntityDescriptor entityID=&amp;quot;https://foo.eprints.org/shibboleth&amp;quot;&amp;gt;&lt;br /&gt;
   ...&lt;br /&gt;
     ...&lt;br /&gt;
       &amp;lt;ds:KeyInfo&amp;gt;&lt;br /&gt;
to:&lt;br /&gt;
 &amp;lt;md:EntityDescriptor xmlns:md=&amp;quot;urn:oasis:names:tc:SAML:2.0:metadata&amp;quot; entityID=&amp;quot;https://foo.eprints.org/shibboleth&amp;quot;&amp;gt; &lt;br /&gt;
   ...&lt;br /&gt;
     ...&lt;br /&gt;
       &amp;lt;ds:KeyInfo xmlns:ds=&amp;quot;http://www.w3.org/2000/09/xmldsig#&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Use ''wget'' to download the metadata from your Shibboleth IdP (e.g. shib.foo.example.org) to the '''/etc/shibboleth/foo/''' directory.&lt;br /&gt;
  root&amp;gt; wget -O /etc/shibboleth/foo/idp-metadata.xml https://shib.foo.example.org/idp/shibboleth&lt;br /&gt;
&lt;br /&gt;
=== Using Remote IdP Metatdata ===&lt;br /&gt;
&lt;br /&gt;
As IdP Metadata may expire, you may want to use the remote metadata URL rather than a local copy.  This is what you need to do to switch to using remote IdP metadata:&lt;br /&gt;
&lt;br /&gt;
* Edit the '''MetadataProvider''' line to something like the following.  The reloadInterval is best set to 7200 but this can be set less frequently:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;MetadataProvider type=&amp;quot;XML&amp;quot; url=&amp;quot;https://shib.foo.example.org/idp/metadata.xml&amp;quot; backingFilePath=&amp;quot;foo/idp-metadata.xml&amp;quot; reloadInterval=&amp;quot;7200&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Make sure the reloadInterval is appropriate for the IdP metadata you are downloading.  If you have large metadata file,(e.g. from a federated metadata service containing metadata for other IdPs), then it may be better to set this higher than the default.  However, the configuration checker may warn you that your reload interval is too long, so you may have to choose to ignore this, if you want to avoid downloading a large federated metadata file too often.&lt;br /&gt;
&lt;br /&gt;
* Make sure that the directory '''/etc/shibboleth/foo/''' and '''/etc/shibboleth/foo/idp-metadata.xml''' if it already exists) are owned by '''shibd''':&lt;br /&gt;
&lt;br /&gt;
 chown shibd:shibd /etc/shibboleth/foo/&lt;br /&gt;
 chown shibd:shibd /etc/shibboleth/foo/idp-metadata.xml&lt;br /&gt;
&lt;br /&gt;
* To test Shibboleth you will need to make sure your '''LD_LIBRARY_PATH''' is set the same as shibd would have when started using ''systemctl shibd start''.&lt;br /&gt;
 &lt;br /&gt;
 LD_LIBRARY_PATH=/opt/shibboleth/lib64:$LD_LIBRARY_PATH shibd -t&lt;br /&gt;
This should return the message: ''overall configuration is loadable, check console for non-fatal problems''.&lt;br /&gt;
&lt;br /&gt;
* The above message is because it is now advised not to leave the MetadataGenerator enabled unnecessarily.  However, whilst you are setting up Shibboleth, it is useful to have the metadata generator, save you needing to build your own Service Provider metadata file to register with your Identity Provider.  Later on you can comment out the MetadataGenerator line to stop getting this warning message.&lt;br /&gt;
&lt;br /&gt;
* Now you can restart '''shibd''' properly:&lt;br /&gt;
&lt;br /&gt;
 systemctl restart shibd&lt;br /&gt;
&lt;br /&gt;
== Configuring Apache and EPrints ==&lt;br /&gt;
'''N.B. All these actions should be carried out by the ''eprints'' user, except when prepended with ''root&amp;gt;'' which means the command should be run as the ''root'' user.'''&lt;br /&gt;
* Add the following configuration to your archive's '''ssl/securevhost.conf''', after the '''Include /opt/eprints3/cfg/apache_ssl/foo.conf''', substituting '''foo''' for your archive's name where appropriate.  (This assumes you are running Apache 2.4 or greater).  See [[#Apache 2.2 (and lower) Configuration for EPrints Shibboleth Integration |Troubleshooting]] for instructions on the configuration to use for Apache 2.2. or lower.&lt;br /&gt;
&lt;br /&gt;
 Alias /shibboleth /opt/eprints3/archives/foo/shibboleth&lt;br /&gt;
 &amp;lt;Location &amp;quot;/shibboleth&amp;quot;&amp;gt;&lt;br /&gt;
   SetHandler perl-script&lt;br /&gt;
   PerlHandler ModPerl::Registry&lt;br /&gt;
   PerlSendHeader Off&lt;br /&gt;
   Options ExecCGI FollowSymLinks&lt;br /&gt;
 &lt;br /&gt;
   AuthType shibboleth&lt;br /&gt;
   ShibRequestSetting requireSession 1&lt;br /&gt;
   require shib-session&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /cgi/shibboleth&amp;gt;&lt;br /&gt;
   AuthType shibboleth&lt;br /&gt;
   ShibRequestSetting requireSession 1&lt;br /&gt;
   require shib-session&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Copy the following code into your archive (e.g. /opt/eprints3/archives/foo/) as '''cgi/shibboleth'''.&lt;br /&gt;
 use EPrints;&lt;br /&gt;
 use strict;&lt;br /&gt;
 my $session = new EPrints::Session;&lt;br /&gt;
 exit( 0 ) unless( defined $session );&lt;br /&gt;
 &lt;br /&gt;
 $session-&amp;gt;send_http_header( &amp;quot;content_type&amp;quot; =&amp;gt; &amp;quot;text/html&amp;quot; );&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;&amp;amp;lt;html&amp;amp;gt;&amp;amp;lt;head/&amp;amp;gt;&amp;amp;lt;body&amp;amp;gt;&amp;amp;lt;code&amp;amp;gt;\n&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 foreach my $key (sort keys(%ENV)) {&lt;br /&gt;
   print &amp;quot;&amp;amp;lt;p&amp;amp;gt;$key = $ENV{$key}&amp;amp;lt;/p&amp;amp;gt;&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 print &amp;quot;&amp;amp;lt;/code&amp;amp;gt;&amp;amp;lt;/body&amp;amp;gt;&amp;amp;lt;/html&amp;amp;gt;&amp;quot;;&lt;br /&gt;
 $session-&amp;gt;terminate;&lt;br /&gt;
 exit;&lt;br /&gt;
&lt;br /&gt;
* Now restart Shibboleth and Apache:&lt;br /&gt;
  root&amp;gt; systemctl restart shibd.service&lt;br /&gt;
  root&amp;gt; apachectl restart&lt;br /&gt;
&lt;br /&gt;
* In a web browser go the '''/cgi/shibboleth''' page for your repository, (e.g. ''https://foo.eprints.org/cgi/shibboleth'').  You should be redirected to an error page for your your Shibboleth IdP (e.g. ''https://shib.foo.example.org/idp/profile/SAML2/Redirect/SSO?...'').  &lt;br /&gt;
&lt;br /&gt;
* If instead you are displayed with a list of key values or are forbidden to access the page, you have not configured Apache properly, if so, see [[#Apache_Configuration_Issues|Apache_Configuration_Issues]] under [[#Troubleshooting|Troubleshooting]].  If you see an error message like the one below, you have not set up Shibboleth properly, if so, see [[#Shibboleth_Configuration_Issues|Shibboleth_Configuration_Issues]] under [[#Troubleshooting|Troubleshooting]].&lt;br /&gt;
 opensaml::saml2md::MetadataException&lt;br /&gt;
 The system encountered an error at Wed May 6 15:19:27 2015&lt;br /&gt;
 To report this problem, please contact the site administrator at root@localhost.&lt;br /&gt;
 Please include the following message in any email:&lt;br /&gt;
 opensaml::saml2md::MetadataException at (http://foo.eprints.org/cgi/shibboleth)&lt;br /&gt;
 Unable to locate metadata for identity provider (https://shib.foo.example.org/idp/shibboleth)&lt;br /&gt;
&lt;br /&gt;
* Next, copy the following code into your archive (e.g. ''/opt/eprints3/archives/foo/'') as '''cfg/cfg.d/zz_shibboleth.pl'''.  This is needed to redirect login and logout to use Shibboleth rather than local login.&lt;br /&gt;
 $c-&amp;gt;{get_login_url} = sub {&lt;br /&gt;
   my( $session, $target ) = @_;&lt;br /&gt;
 &lt;br /&gt;
   # preserve CGI params&lt;br /&gt;
   $session-&amp;gt;read_params;&lt;br /&gt;
   $target = $session-&amp;gt;get_url(&lt;br /&gt;
     host =&amp;gt; 1,&lt;br /&gt;
     path =&amp;gt; &amp;quot;auto&amp;quot;,&lt;br /&gt;
     query =&amp;gt; 1,&lt;br /&gt;
   );&lt;br /&gt;
 &lt;br /&gt;
   my $url = URI-&amp;gt;new( $session-&amp;gt;config( &amp;quot;https_url&amp;quot; )  . &amp;quot;/shibboleth/login&amp;quot; );&lt;br /&gt;
   $url-&amp;gt;query_form( target =&amp;gt; &amp;quot;$target&amp;quot; );&lt;br /&gt;
   return &amp;quot;$url&amp;quot;;&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 $c-&amp;gt;{on_logout} = sub {&lt;br /&gt;
   my( $session ) = @_;&lt;br /&gt;
   my $query = $session-&amp;gt;query;&lt;br /&gt;
   return unless defined $query;&lt;br /&gt;
 &lt;br /&gt;
   # remove _shibsession_ cookie&lt;br /&gt;
   my( $shibname, $shibvalue );&lt;br /&gt;
   for( $query-&amp;gt;cookie() ) {&lt;br /&gt;
     if( $_ =~ /^_shibsession/ ) {&lt;br /&gt;
       $shibname = $_;&lt;br /&gt;
       $shibvalue = $query-&amp;gt;cookie( $shibname );&lt;br /&gt;
     }&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   my $cookie = $query-&amp;gt;cookie(&lt;br /&gt;
     -name    =&amp;gt; $shibname,&lt;br /&gt;
     -path    =&amp;gt; &amp;quot;/&amp;quot;,&lt;br /&gt;
     -value   =&amp;gt; &amp;quot;&amp;quot;,&lt;br /&gt;
     -host  =&amp;gt; $session-&amp;gt;config(&amp;quot;cookie_domain&amp;quot;),&lt;br /&gt;
     -expires =&amp;gt; &amp;quot;-1d&amp;quot;,&lt;br /&gt;
   );&lt;br /&gt;
   EPrints::Apache::AnApache::header_out(&lt;br /&gt;
     $session-&amp;gt;{request},&lt;br /&gt;
     &amp;quot;Set-Cookie&amp;quot; =&amp;gt; $cookie &lt;br /&gt;
   );&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 push @{$c-&amp;gt;{rewrite_exceptions}}, &amp;quot;/shibboleth/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
* Create a folder at the top level of your archive (e.g. ''/opt/eprints3/archives/foo/'') called '''shibboleth''' and copy the main CSS file for Shibboleth into this folder:&lt;br /&gt;
 eprints&amp;gt; mkdir /opt/eprints3/archives/foo/shibboleth/&lt;br /&gt;
 eprints&amp;gt; cp /usr/share/shibboleth/main.css /opt/eprints3/archives/foo/shibboleth/&lt;br /&gt;
&lt;br /&gt;
* Now, copy the following code into your archive (e.g. ''/opt/eprints3/archives/foo/'') as '''shibboleth/login'''.  This is the most basic login script that should work with the minimal attributes any Shibboleth IdP returns and '''only logging in users with existing accounts'''. Look under the [[#Customisation|Customisation]] section for advice on how to modify this script to meet your requirements, such as creation user accounts on-the-fly.&lt;br /&gt;
 use EPrints;&lt;br /&gt;
 use strict;&lt;br /&gt;
 &lt;br /&gt;
 my $session = EPrints::Session-&amp;gt;new();&lt;br /&gt;
 my $url = $session-&amp;gt;param( &amp;quot;target&amp;quot; );&lt;br /&gt;
 if ( defined $url )&lt;br /&gt;
 {&lt;br /&gt;
   my $target_uri = URI-&amp;gt;new( $url );&lt;br /&gt;
   my $repository_uri = URI-&amp;gt;new( $session-&amp;gt;get_repository-&amp;gt;get_conf( 'base_url' ) );&lt;br /&gt;
   if ( !$target_uri-&amp;gt;can( 'host' ) || $target_uri-&amp;gt;host ne $repository_uri-&amp;gt;host )&lt;br /&gt;
   {&lt;br /&gt;
     $url = undef;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 $url = $session-&amp;gt;get_repository-&amp;gt;get_conf( &amp;quot;userhome&amp;quot; ) unless EPrints::Utils::is_set( $url );&lt;br /&gt;
 &lt;br /&gt;
 my $user = &amp;amp;get_user;&lt;br /&gt;
 &lt;br /&gt;
 if( defined $user )&lt;br /&gt;
 {&lt;br /&gt;
   $user-&amp;gt;set_value( &amp;quot;last_login&amp;quot;, EPrints::Time::get_iso_timestamp() );&lt;br /&gt;
   $user-&amp;gt;commit;&lt;br /&gt;
 &lt;br /&gt;
   EPrints::DataObj::LoginTicket-&amp;gt;expire_all( $session );&lt;br /&gt;
   $session-&amp;gt;dataset( &amp;quot;loginticket&amp;quot; )-&amp;gt;create_dataobj({&lt;br /&gt;
     userid =&amp;gt; $user-&amp;gt;id,&lt;br /&gt;
   })-&amp;gt;set_cookies();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
   $url = $session-&amp;gt;get_repository-&amp;gt;get_conf( &amp;quot;base_url&amp;quot; ) . &amp;quot;/account_required.html&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 $session-&amp;gt;send_http_header( &amp;quot;content-type&amp;quot; =&amp;gt; &amp;quot;text/html&amp;quot; );&lt;br /&gt;
 print '&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;url='.$url.'&amp;quot;/&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;';&lt;br /&gt;
 $session-&amp;gt;terminate;&lt;br /&gt;
   &lt;br /&gt;
 sub get_user &lt;br /&gt;
 {&lt;br /&gt;
   my ( $username, $email ) = ( undef, &amp;quot;&amp;quot; );&lt;br /&gt;
   if( $ENV{eppn} )&lt;br /&gt;
   {&lt;br /&gt;
    ( $username ) = split( /@/, $ENV{eppn}, 2);&lt;br /&gt;
    $username = lc( $username );&lt;br /&gt;
    $email = $ENV{eppn};&lt;br /&gt;
   }&lt;br /&gt;
   return unless EPrints::Utils::is_set( $username );&lt;br /&gt;
   my $user = $session-&amp;gt;user_by_username( $username );&lt;br /&gt;
   if( defined $user &amp;amp;&amp;amp; defined $email )&lt;br /&gt;
   {&lt;br /&gt;
     $user-&amp;gt;set_value( &amp;quot;email&amp;quot;, $email );&lt;br /&gt;
     $user-&amp;gt;commit;&lt;br /&gt;
   }&lt;br /&gt;
   return $user;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
* Next, add the following markup to '''cfg/lang/en/static/account_required.xpage''' under your archive (e.g. ''/opt/eprints3/archives/foo/'').  Substituting ''staff and students of the University of Foo'' to describe to which particular group of people logged in access is restricted.&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; standalone=&amp;quot;no&amp;quot; ?&amp;gt;&lt;br /&gt;
 &amp;lt;!DOCTYPE page SYSTEM &amp;quot;entities.dtd&amp;quot; &amp;gt;&lt;br /&gt;
 &amp;lt;xpage:page xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; xmlns:xpage=&amp;quot;http://eprints.org/ep3/xpage&amp;quot; xmlns:epc=&amp;quot;http://eprints.org/ep3/control&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;lt;xpage:title&amp;gt;Login Failed&amp;lt;/xpage:title&amp;gt;&lt;br /&gt;
 &amp;lt;xpage:body&amp;gt;&lt;br /&gt;
    &amp;amp;lt;p style='text-align: center;'&amp;amp;gt;Please note that only staff and students of the University of Foo may log in to &amp;lt;epc:phrase ref=&amp;quot;archive_name&amp;quot; /&amp;gt;&amp;amp;lt;/p&amp;amp;gt;&lt;br /&gt;
 &amp;lt;/xpage:body&amp;gt;&lt;br /&gt;
 &amp;lt;/xpage:page&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Now, reload Apache.&lt;br /&gt;
  root&amp;gt; apachectl reload&lt;br /&gt;
&lt;br /&gt;
* In a web browser go to the '''/shibboleth/login''' page for your repository, (e.g. ''https://foo.eprints.org/shibboleth/login'').  Like before with ''/cgi/shibboleth'' you should be taken to your Shibboleth IdP's site albeit displaying an error message.&lt;br /&gt;
&lt;br /&gt;
* The Shibboleth IdP shows an error message because EPrints as a Shibboleth Service Provider is not yet registered with it.  To do this you need to send the administrator of the Shibboleth IdP the metadata for your Service Provider.  You will have generated this earlier when you ran &amp;lt;code&amp;gt;metagen.sh&amp;lt;/code&amp;gt;.  Copy off your EPrints server the file that this wrote (e.g. to &amp;lt;tt&amp;gt;/etc/shibboleth/foo/sp_metadata.xml&amp;lt;/tt&amp;gt;) and send it to the Shibboleth IdP administrator.  They should be able to upload this to register EPrints as a Service Provider application.&lt;br /&gt;
&lt;br /&gt;
* Once registered, use a web browser to go to '''/shibboleth/login''' page for your repository, (e.g. ''https://foo.eprints.org/shibboleth/login'') again.  This time you should be prompted for a username and password on the Shibboleth IdP site. Once you have typed this in and clicked to login, you should be returned to EPrints on the '''/cgi/users/home''' page for your repository.  If not, see [[#Login_Issues|Login Issues]] under [[#Troubleshooting|Troubleshooting]] below.&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Apache Configuration Issues ===&lt;br /&gt;
==== Apache 2.2 (and lower) Configuration for EPrints Shibboleth Integration ====&lt;br /&gt;
* Similarly to the instructions for Apache 2.4 and above, place the slightly different following configuration after the '''Include''' line for ''apache_ssl/foo.conf'', (substituting '''foo''' for your archive's name):&lt;br /&gt;
&lt;br /&gt;
  Alias /shibboleth /opt/eprints3/archives/foo/shibboleth&lt;br /&gt;
  &amp;lt;Directory &amp;quot;/opt/eprints3/archives/foo/shibboleth&amp;quot;&amp;gt;&lt;br /&gt;
    SetHandler perl-script&lt;br /&gt;
    PerlHandler ModPerl::Registry&lt;br /&gt;
    PerlSendHeader Off&lt;br /&gt;
    Options ExecCGI FollowSymLinks&lt;br /&gt;
  &lt;br /&gt;
    AuthType shibboleth&lt;br /&gt;
    ShibRequireSession On&lt;br /&gt;
    require valid-user&lt;br /&gt;
  &amp;lt;/Directory&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;Location /cgi/shibboleth&amp;gt;&lt;br /&gt;
    AuthType shibboleth&lt;br /&gt;
    ShibRequireSession On&lt;br /&gt;
    require valid-user&lt;br /&gt;
  &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Shibboleth Configuration Issues ===&lt;br /&gt;
==== With attribute-map.xml ====&lt;br /&gt;
When authenticating using Shibboleth to login to EPrints you may see the following line in '''/var/log/shibboleth.shibd.log'''&lt;br /&gt;
&lt;br /&gt;
  2015-09-09 09:26:43 INFO Shibboleth.AttributeExtractor.XML [2]: skipping unmapped SAML 2.0 Attribute with Name:  urn:mace:dir:attribute-def:department&lt;br /&gt;
&lt;br /&gt;
In some cases this might not be an issue, as EPrints does not necessarily to make use of all the attributes returned by the IdP but without a mapping in attribute-map.xml.  In this case '''urn:mace:dir:attribute-def:department''' is not by default needed by EPrints to create/update a user account.  However, values like '''sn''', '''givenName''' and '''mail''' are but if you have used the attribute-map.xml provided later on the page you should not see a line like above in '''shibd.log'''.  In some cases you may still see an line like this in the log even if you think you have defined the attribute.  The line below demonstrate two known issues:&lt;br /&gt;
&lt;br /&gt;
  2015-09-09 09:26:43 INFO Shibboleth.AttributeExtractor.XML [2]: skipping unmapped SAML 2.0 Attribute with Name:  givenName, Format:urn:oasis:names:tc:SAML:2.0:attrname-format:basic&lt;br /&gt;
&lt;br /&gt;
# The attribute itself has no namespace it is just '''givenName''' rather than '''urn:mace:dir:attribute-def:givenName'''&lt;br /&gt;
# The attribute has a format that most also be defined in the attribute-map.xml attribute.&lt;br /&gt;
&lt;br /&gt;
Below shows how to both include the format, which is required for the attribute to be successful mapped.  As well as define the name of the attribute without a namespace:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Attribute name=&amp;quot;givenName&amp;quot; nameFormat=&amp;quot;urn:oasis:names:tc:SAML:2.0:attrname-format:basic&amp;quot; id=&amp;quot;givenName&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A typical Shibboleth IdP would have both a namespaced attribute name and would not apply a format to an attribute that is a simple text string.  Therefore it is worth enquiring with the IdP provider if either of these two happen to be the case.  The Shibboleth Service Provider can be [[run in debug mode|Shibboleth Debug Logging]], which may help your figure out what attributes are being mapped..&lt;br /&gt;
&lt;br /&gt;
==== With idp-metadata.xml ====&lt;br /&gt;
If you want to be able extract scoped attributes (e.g. '''eduPersonPrincipalName''' otherwise described as '''eppn''').  Then you will need to ensure that the expected scope of this attribute, (effectively the domain part in eduPersonPrincipalName is the scope or one of the scopes in the idp-metadata.xml you downloaded from the Shibboleth IdP.  For example if the '''eduPersonPrincipalName''' is '''bar@foo.ac.uk'''.  Then the following should be defined in idp-metadata.xml ('''N.B. the namespace abbreviations (md: and shibmd:) may be different for the IdP you are working with'''):&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;md:Extensions&amp;gt;&lt;br /&gt;
    &amp;lt;shibmd:Scope regexp=&amp;quot;false&amp;quot;&amp;gt;foo.ac.uk&amp;lt;/shibmd:Scope&amp;gt;&lt;br /&gt;
  &amp;lt;/md:Extensions&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Login Issues ===&lt;br /&gt;
To be added.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Customisation ==&lt;br /&gt;
&lt;br /&gt;
=== Shibboleth /etc/shibboleth/foo/attribute-map.xml config ===&lt;br /&gt;
This is adapted from the default '''attribute-map.xml''' provided when the Shibboleth SP package is installed to only include the attribute subsequently used by EPrints Shibboleth Perl script that can be found below.  Namely:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;10&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
!Field name&lt;br /&gt;
!Field description			&lt;br /&gt;
!SAML v1.1 attribute URN&lt;br /&gt;
!SAMLv2 attribute URN&lt;br /&gt;
|-&lt;br /&gt;
|eppn			&lt;br /&gt;
|Edu Person Principal Name&lt;br /&gt;
|urn:mace:dir:attribute-def:eduPersonPrincipalName&lt;br /&gt;
|urn:oid:1.3.6.1.4.1.5923.1.1.1.6&lt;br /&gt;
|-&lt;br /&gt;
|sn&lt;br /&gt;
|Surname						&lt;br /&gt;
|urn:mace:dir:attribute-def:sn								&lt;br /&gt;
|urn:oid:2.5.4.4&lt;br /&gt;
|-&lt;br /&gt;
|givenName&lt;br /&gt;
|Given (first) name(s)&lt;br /&gt;
|urn:mace:dir:attribute-def:givenName&lt;br /&gt;
|urn:oid:2.5.4.42&lt;br /&gt;
|-&lt;br /&gt;
|mail&lt;br /&gt;
|Email address	&lt;br /&gt;
|urn:mace:dir:attribute-def:mail&lt;br /&gt;
|urn:oid:0.9.2342.19200300.100.1.3  &lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You may wish to refer to the default '''attribute-map.xml''' is you want to use other attributes.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Attributes xmlns=&amp;quot;urn:mace:shibboleth:2.0:attribute-map&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:mace:dir:attribute-def:eduPersonPrincipalName&amp;quot; id=&amp;quot;eppn&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AttributeDecoder xsi:type=&amp;quot;ScopedAttributeDecoder&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:oid:1.3.6.1.4.1.5923.1.1.1.6&amp;quot; id=&amp;quot;eppn&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;AttributeDecoder xsi:type=&amp;quot;ScopedAttributeDecoder&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/Attribute&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:mace:dir:attribute-def:sn&amp;quot; id=&amp;quot;sn&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:mace:dir:attribute-def:givenName&amp;quot; id=&amp;quot;givenName&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:mace:dir:attribute-def:mail&amp;quot; id=&amp;quot;mail&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:oid:2.5.4.4&amp;quot; nameFormat=&amp;quot;urn:oasis:names:tc:SAML:2.0:attrname-format:basic&amp;quot; id=&amp;quot;sn&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:oid:2.5.4.42&amp;quot; nameFormat=&amp;quot;urn:oasis:names:tc:SAML:2.0:attrname-format:basic&amp;quot; id=&amp;quot;givenName&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;Attribute name=&amp;quot;urn:oid:0.9.2342.19200300.100.1.3&amp;quot; nameFormat=&amp;quot;urn:oasis:names:tc:SAML:2.0:attrname-format:basic&amp;quot; id=&amp;quot;mail&amp;quot;/&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
  &amp;lt;/Attributes&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== EPrints /shibboleth/login script with user account creation ===&lt;br /&gt;
This is the standard EPrints Shibboleth login script.  It makes a number of assumptions:&lt;br /&gt;
# That accounts should be created if they do not already exist for a particular user.&lt;br /&gt;
# That you wish to create a standard user account (not an editor administrator) account.&lt;br /&gt;
# That the Shibboleth IdP provides all the attributes (eduPersonPrinicpalName (seen as eppn), sn, givenName and mail) required.&lt;br /&gt;
&lt;br /&gt;
 use EPrints;&lt;br /&gt;
 use strict;&lt;br /&gt;
 &lt;br /&gt;
 my $session = EPrints::Session-&amp;gt;new();&lt;br /&gt;
 my $url = $session-&amp;gt;param( &amp;quot;target&amp;quot; );&lt;br /&gt;
 if ( defined $url )&lt;br /&gt;
 {&lt;br /&gt;
   my $target_uri = URI-&amp;gt;new( $url );&lt;br /&gt;
   my $repository_uri = URI-&amp;gt;new( $session-&amp;gt;get_repository-&amp;gt;get_conf( 'base_url' ) );&lt;br /&gt;
   if ( !$target_uri-&amp;gt;can( 'host' ) || $target_uri-&amp;gt;host ne $repository_uri-&amp;gt;host )&lt;br /&gt;
   {&lt;br /&gt;
     $url = undef;&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
 $url = $session-&amp;gt;get_repository-&amp;gt;get_conf( &amp;quot;userhome&amp;quot; ) unless EPrints::Utils::is_set( $url );&lt;br /&gt;
 &lt;br /&gt;
 my $user = &amp;amp;get_user;&lt;br /&gt;
 &lt;br /&gt;
 if( defined $user )&lt;br /&gt;
 {&lt;br /&gt;
   $user-&amp;gt;set_value( &amp;quot;last_login&amp;quot;, EPrints::Time::get_iso_timestamp() );&lt;br /&gt;
   $user-&amp;gt;commit;&lt;br /&gt;
 &lt;br /&gt;
   EPrints::DataObj::LoginTicket-&amp;gt;expire_all( $session );&lt;br /&gt;
   $session-&amp;gt;dataset( &amp;quot;loginticket&amp;quot; )-&amp;gt;create_dataobj({&lt;br /&gt;
     userid =&amp;gt; $user-&amp;gt;id,&lt;br /&gt;
   })-&amp;gt;set_cookies();&lt;br /&gt;
 }&lt;br /&gt;
 else&lt;br /&gt;
 {&lt;br /&gt;
   $url = $session-&amp;gt;get_repository-&amp;gt;get_conf( &amp;quot;base_url&amp;quot; ) . &amp;quot;/account_required.html&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 $session-&amp;gt;send_http_header( &amp;quot;content-type&amp;quot; =&amp;gt; &amp;quot;text/html&amp;quot; );&lt;br /&gt;
 print '&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta http-equiv=&amp;quot;refresh&amp;quot; content=&amp;quot;0;url='.$url.'&amp;quot;/&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;';&lt;br /&gt;
 $session-&amp;gt;terminate;&lt;br /&gt;
 &lt;br /&gt;
 sub get_user&lt;br /&gt;
 {&lt;br /&gt;
   my ($username, $given, $family, $email) = (undef, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
   if( $ENV{eppn} )&lt;br /&gt;
   {&lt;br /&gt;
     ( $username ) = split( /@/, $ENV{eppn}, 2);&lt;br /&gt;
     $username = lc( $username );&lt;br /&gt;
   }&lt;br /&gt;
   $email = $ENV{mail} if $ENV{mail};&lt;br /&gt;
   if( $ENV{givenName} )&lt;br /&gt;
   {&lt;br /&gt;
     $given = lc( $ENV{givenName} );&lt;br /&gt;
     $given =~ s/^(.)/uc($1)/e;&lt;br /&gt;
     $given =~ s/([- ].)/uc($1)/e;&lt;br /&gt;
   }&lt;br /&gt;
   if( $ENV{sn} )&lt;br /&gt;
   {&lt;br /&gt;
     $family = lc( $ENV{sn} );&lt;br /&gt;
     $family =~ s/^(.)/uc($1)/e;&lt;br /&gt;
     $family =~ s/([- ].)/uc($1)/e;&lt;br /&gt;
   }&lt;br /&gt;
 &lt;br /&gt;
   return unless EPrints::Utils::is_set( $username );&lt;br /&gt;
 &lt;br /&gt;
   my $user = $session-&amp;gt;user_by_username( $username ); # relying on this to be case insensitive&lt;br /&gt;
 &lt;br /&gt;
   if( !defined $user )&lt;br /&gt;
   {&lt;br /&gt;
     my $usertype = 'user';&lt;br /&gt;
     $user = EPrints::DataObj::User::create( $session, $usertype );&lt;br /&gt;
     $user-&amp;gt;set_value( &amp;quot;username&amp;quot;, $username );&lt;br /&gt;
   }&lt;br /&gt;
   my $name = {&lt;br /&gt;
     given =&amp;gt; $given,&lt;br /&gt;
     family =&amp;gt; $family,&lt;br /&gt;
   };&lt;br /&gt;
   $user-&amp;gt;set_value( &amp;quot;name&amp;quot;, $name );&lt;br /&gt;
   $user-&amp;gt;set_value( &amp;quot;email&amp;quot;, $email );&lt;br /&gt;
   $user-&amp;gt;commit;&lt;br /&gt;
   return $user;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Further Information ==&lt;br /&gt;
* Older instructions of how to set up EPrints for Shibboleth using UK Access management Federation discovery service is available [[Shibboleth authentication|here]].&lt;br /&gt;
&lt;br /&gt;
* For general information about installing and configuring Shibboleth [http://shibboleth.internet2.edu/ click here].&lt;br /&gt;
&lt;br /&gt;
* [https://docs.openathens.net/display/public/TPA/Sign+in+to+a+generic+application+using+OpenAthens#SignintoagenericapplicationusingOpenAthens-SetupthecustomSAMLresourceinOpenAthens Instructions of connection a Shibboleth Service Provider with OpenAthens]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Authentication]]&lt;/div&gt;</summary>
		<author><name>Drn@ecs.soton.ac.uk</name></author>
		
	</entry>
</feed>