Release Notes for ReportServer 3.4.0

These release notes reflect the changes with respect to ReportServer 3.3.0.

Some Important Features and Noteworthy Improvements for ReportServer RS3.4.0

Datasinks

Datasinks are the counterpart of datasources in ReportServer. Reports can be sent to any datasink defined, e.g. to a FTP or SFTP datasink. Reports may be sent directly to a datasink (via the SendTo button) or scheduled to be sent to a specific datasink. Multiple datasinks of the same type are allowed, analogously as datasources. Further, as with most other objects in ReportServer, datasinks are maintained in a hierarchical structure. The datasink management module can be found in the Administration module under Datasinks.

Note that that FTP datasinks are supported as of ReportServer 3.4.0. For scheduled reports using the legacy FTP functionality, a dummy FTP datasink is created on ReportServer start (found in the Administration area, in the datasink root folder). This dummy FTP datasink must be adapted in order for these reports to further work. You can see the "dummy ftp datasink" in the screenshot above.

Currently, SFTP datasink authentication supported is by username/password. Note that for SFTP to work, you have to add your SFTP host to your .ssh/known_hosts file (https://en.wikibooks. org/wiki/OpenSSH/Client_Configuration_Files#~/.ssh/known_hosts) in order to verify the identity of the remote host, thus protecting against impersonation or man-in-the-middle attacks. Its location be configured in the /fileserver/etc/security/misc.cf file as described in the Configuration Guide. For manually adding a public key to the .ssh/known_hosts file, check here: https://en.wikibooks.org/wiki/OpenSSH/Client_Configuration_Files#Manually_ Adding_Public_Keys_to_~/.ssh/known_hosts.

The complete /fileserver/etc/security/misc.cf file is the following (check the knownHosts option):


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <juel>
      <expression>
         <blacklist>getClass</blacklist>
      </expression>
   </juel>
   <errorMessages>
      <hideViolatedSecurityExceptionDetails>false</hideViolatedSecurityExceptionDetails>
   </errorMessages>
   <knownHosts>/path/to/.ssh/known_hosts</knownHosts>
</configuration>

Datasinks can be enabled/disabled in the /fileserver/etc/datasinks/datasinks.cf file.

Datasinks are supported as of ReportServer 3.4.0. The legacy FTP configuration in /fileserver/etc/exportfilemd/storage.cf is ignored as of version 3.4.0.

The complete /fileserver/etc/datasinks/datasinks.cf is the following:


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <sftp disabled="false" supportsScheduling="true" />
  <ftp disabled="false" supportsScheduling="true" />
</configuration>

The texts used during scheduling can be configured in the /fileserver/etc/scheduler/scheduler.cf file analogously as the other texts. The complete file is the following (note the fileactionSftp and fileactionFtp sections):


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <scheduler>
      <mailaction html="false">
         <subject>ReportServer: ${subject}</subject>
         <text>${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['mailactionMsgText']}
		 
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelJobName']} ${job.getName()}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelMessage']} ${message}
      </text>
         <attachment>
            <name>rep-${report.getName()}-${RS_CURRENT_DATE}</name>
         </attachment>
      </mailaction>
      <fileaction disabled="false" html="false">
         <subject>ReportServer: ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['fileactionMsgSubject']}</subject>
         <text>${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['fileactionMsgText']}
		 
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelJobName']} ${job.getName()}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelFilename']} ${filename}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelDescription']} ${description}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelTeamspace']} ${teamspace.getName()}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelFolder']} ${folder.getName()}
      </text>
      </fileaction>
      <fileactionSftp disabled="false" html="false">
         <subject>ReportServer: ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['fileactionSftpMsgSubject']}</subject>
         <text>${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['fileactionSftpMsgText']}
		 
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelJobName']} ${job.getName()}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelFilename']} ${filename}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelFolder']} ${folder}
      </text>
      </fileactionSftp>
      <fileactionFtp disabled="false" html="false">
         <subject>ReportServer: ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['fileactionFtpMsgSubject']}</subject>
         <text>${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['fileactionFtpMsgText']}
		 
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelJobName']} ${job.getName()}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelFilename']} ${filename}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelFolder']} ${folder}
      </text>
      </fileactionFtp>
      <notification disabled="false" html="false">
         <scheduled>
            <subject>ReportServer: ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['notificationMsgScheduledSubject']}</subject>
            <text>${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['notificationMsgScheduledText']}

${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelJobName']} ${job.getName()}
${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelUser']} ${scheduleUser}
${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['notificationMsgScheduledNextDates']} ${nextDates}
		</text>
         </scheduled>
         <unscheduled>
            <subject>ReportServer: ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['notificationMsgUnscheduledSubject']}</subject>
            <text>${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['notificationMsgUnscheduledText']}

${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelJobName']} ${jobName}</text>
         </unscheduled>
         <failed>
            <subject>ReportServer: ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['notificationMsgFailedSubject']}</subject>
            <text>${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['notificationMsgFailedText']}

${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelJobName']} ${job.getName()}
${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelErrorMessage']} ${errMsg}
${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelRecipient']} ${recipients}
${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelErrorDetails']} ${stacktrace}
		</text>
         </failed>
      </notification>
      <properties>
         <disabled>false</disabled>
      </properties>
  </scheduler>
</configuration>

Provide Details for ViolatedSecurityExceptions (List Missing Permissions)

Previously, when a user did not have sufficient permissions for accessing some object in ReportServer, it was difficult to determine which permissions exactly were missing, since no details were given in the error message.

In ReportServer 3.4.0 this changed. The following screenshot depicts two examples. On the left side, you see the error messages of previous ReportServer versions, which did not contain any details. On the right side you can see which permissions exactly are missing (Execute rights) for two different objects: above, for the ExportSecurityTarget (i.e. the user does not have Execute-"Ex/Import" generic right). Below, for the dynamic list with id 108158. For the administrator it will be easier to give the user appropriate permissions.

If this level of detail is not desired, it can be configured in the /etc/security/misc.cf configuration file. Here, you can select the level of detail of error messages shown to the user. Currently, the following is supported:

Below you can see the complete default /etc/security/misc.cf file including error message level of detail settings.


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <juel>
      <expression>
         <blacklist>getClass</blacklist>
      </expression>
   </juel>
   <errorMessages>
      <hideViolatedSecurityExceptionDetails>false</hideViolatedSecurityExceptionDetails>
   </errorMessages>
</configuration>

System Console / Live Memory

A new administration area "System Console" was added. For a user to see this, the user needs "System Console" read-access generic permission as shown in the following screenshot. Note that users having this permission can access the complete "System Console" area, i.e. all system console subsections.

We added the subsection "Live JVM Memory", which allows you to analyze live JVM memory usage. Example screenshots are shown below. Per default, it is refreshed every second. This can be configured with the "Refresh interval" field.

Support Sending Reports to SFTP

Analogous to the current FTP functionality, reports can now be sent to a SFTP server. Scheduling is supported here as well.

SFTP server configuration is done in the /fileserver/etc/datasinks/datasinks.cf configuration file:


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <sftp disabled="false" supportsScheduling="true" />
  <ftp disabled="false" supportsScheduling="true" />
</configuration>

Note that for SFTP to work, you have to set the location of your .ssh/known_hosts file (https://en.wikibooks.org/wiki/OpenSSH/Client_Configuration_Files#~/.ssh/known_hosts) in order to verify the identity of the remote host, thus protecting against impersonation or man-in-the-middle attacks. This may be configured in the /fileserver/etc/security/misc.cf file as follows.


<?xml version="1.0" encoding="UTF-8"?> 
<configuration>
	<knownHosts>/path/to/.ssh/known_hosts</knownHosts>
</configuration>

For manually adding a public key to the .ssh/known_hosts file, check here: https://en.wikibooks.org/wiki/OpenSSH/Client_Configuration_Files#Manually_Adding_Public_Keys_to_~/.ssh/known_hosts.

SFTP Email text configuration is done in the /fileserver/etc/scheduler/scheduler.cf file:


<fileactionSftp disabled="false" html="false">
      <subject>Email subject</subject>
      <text>
         Email text
      </text>
</fileactionSftp>

Following you can see the complete default /fileserver/etc/scheduler/scheduler.cf file:


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <scheduler>
      <mailaction html="false">
         <subject>ReportServer: ${subject}</subject>
         <text>${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['mailactionMsgText']}
     
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelReport']} ${report.getName()}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelMessage']} ${message}
      </text>
         <attachment>
            <name>rep-${report.getName()}-${RS_CURRENT_DATE}</name>
         </attachment>
      </mailaction>
      <fileaction disabled="false" html="false">
         <subject>ReportServer: ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['fileactionMsgSubject']}</subject>
         <text>${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['fileactionMsgText']}
     
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelReport']} ${report.getName()}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelFilename']} ${filename}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelDescription']} ${description}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelTeamspace']} ${teamspace.getName()}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelFolder']} ${folder.getName()}
      </text>
      </fileaction>
      <fileactionSftp disabled="false" html="false">
         <subject>ReportServer: ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['fileactionSftpMsgSubject']}</subject>
         <text>${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['fileactionSftpMsgText']}
     
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelReport']} ${report.getName()}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelFilename']} ${filename}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelFolder']} ${folder}
      </text>
      </fileactionSftp>
      <fileactionFtp disabled="false" html="false">
         <subject>ReportServer: ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['fileactionFtpMsgSubject']}</subject>
         <text>${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['fileactionFtpMsgText']}
     
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelReport']} ${report.getName()}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelFilename']} ${filename}
  ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelFolder']} ${folder}
      </text>
      </fileactionFtp>
      <notification disabled="false" html="false">
         <scheduled>
            <subject>ReportServer: ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['notificationMsgScheduledSubject']}</subject>
            <text>${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['notificationMsgScheduledText']}

${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelReport']} ${report.getName()}
${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelUser']} ${scheduleUser}
${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['notificationMsgScheduledNextDates']} ${nextDates}
    </text>
         </scheduled>
         <unscheduled>
            <subject>ReportServer: ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['notificationMsgUnscheduledSubject']}</subject>
            <text>${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['notificationMsgUnscheduledText']}

${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelReport']} ${reportName}</text>
         </unscheduled>
         <failed>
            <subject>ReportServer: ${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['notificationMsgFailedSubject']}</subject>
            <text>${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['notificationMsgFailedText']}

${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelReport']} ${report.getName()}
${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelErrorMessage']} ${errMsg}
${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelRecipient']} ${recipients}
${msgs['net.datenwerke.rs.scheduler.client.scheduler.locale.SchedulerMessages']['labelErrorDetails']} ${stacktrace}
    </text>
         </failed>
      </notification>
      <properties>
         <disabled>false</disabled>
      </properties>
  </scheduler>
</configuration>

Allow to Test Reports

Reports and variants may be now directly tested. This allows to check if the report's query/columns/configuration is correct without having to explicitly execute the corresponding report. This may be done via terminal or GUI. Example screenshots below.

Allow to Export Dynamic List as JXLS Template

JXLS templates are a powerful feature in ReportServer. Nevertheless, creating JXLS templates is sometimes cumbersome. ReportServer now supports exporting dynamic lists as JXLS templates. These can then be easily adapted/configurated as needed with Excel and may be uploaded to ReportServer either as a JXLS report or a JXLS template for the dynamic list. Example screenshots below.

Note that you can configure the default column widths in the /fileserver/exportfilemd/jxlsexport.cf configuration file.


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <jxls>
      <numberColumnWidth>8</numberColumnWidth>
      <textColumnWidth>8</textColumnWidth>
      <dateColumnWidth>8</dateColumnWidth>
      <currencyColumnWidth>8</currencyColumnWidth>
   </jxls>
</configuration>

Allow to Set Name and Description of Scheduling Jobs

Scheduling jobs contain now a name and a description, analogously to other elements in ReportServer. For existing jobs, the report's name and description are being copied into these new fields.

Allow to Change Report of Scheduling Jobs

You can now change the report of an existing scheduling job. This allows you to keep current job configuration while scheduling a different report. A screenshot is shown below.

Allow to Configure if Grid Report should allow to add/duplicate/remove records

You can now turn off adding/duplicating/removing records per grid report. Default is true (allowed).

This can be done via the following settings:


def adapter = definition.getAdapter()
adapter.setCanAddRecords(false)
adapter.setCanDuplicateRecords(false)
adapter.setCanRemoveRecords(false)

Allow to Select Compression in New Scheduler Jobs by Default

While scheduling new jobs, you can select the option "Compress report" if you want the report to be compressed in the email sent. Normally, this option is not selected by default. Now you can set this setting to be selected by default (in /fileserver/etc/main/main.cf):


<scheduler>
    <email>
       <defaultcompression>true</defaultcompression>
    </email>
</scheduler>

If you set this to true, "Report compression" will be automatically selected when scheduling new jobs. Defaults to false.

Following you can see the complete default /fileserver/etc/main/main.cf file.


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <install>
      <basedata>true</basedata>
   </install>
   <default>
      <charset>UTF-8</charset>
   </default>
   <tempdir>tempdir</tempdir>
   <tempfile>
      <lifetime>3600</lifetime>
   </tempfile>
   <maintenance>
      <tasks>
         <interval>600000</interval>
      </tasks>
   </maintenance>
   <search>
      <timeout>5000</timeout>
   </search>
   <pagetitle>ReportServer</pagetitle>
   <scheduler>
     <email>
       <defaultcompression>false</defaultcompression>
     </email>
   </scheduler>
</configuration>

Allow to Execute Dadgets from Dashboard

Reports may now be opened/executed directly directly in the dashboard. You can see this in the following screenshots. When clicking on the "execute" button, the report opens in the report execution view.

Refresh Preview

You can now refresh the report preview directly, refer to the screenshot below. This of course works with the rest of report types as well.

For dynamic lists, you will see a new context menu entry as well:

Allow to List/View Catalina Log Files and Send these via E-mail

You can now list the catalina log files in your catalina.home directory by the terminal command "listlogfiles". If you need to explicitly set the log file path, you can use the logdir setting in the /fileserver/etc/main/main.cf configuration file. You can specify the sorting column(s) by a semicolon-separated list of column numbers in the -s option. Allowed are values 1, 2, and 3 for the first (filename), second (last modified) and third (size) columns, respectively. If you need to sort a given column in descending order, you can enter a - prefix in front of the column’s index. Default sorting is by filename (ascending order). Example output is shown below.

Further, you can use Java regular expressions for filtering files.

The example below lists all log files starting with “reportserver” and sorting them by size in descending order.


listlogfiles -s -3 -f "reportserver.*"

The example below lists all log files starting with “reportserver” and sorting them by size in descending order, followed by filename in ascending order.


listlogfiles -s -3;1 -f "reportserver.*"

Further, you can use the -e option if you want to send the (filtered) log files via e-mail. For example, the following allows you to ZIP and send all log files starting with “reportserver” to the current user via e-mail.


listlogfiles -s -3;1 -f "reportserver.*" -e

By using the viewlogfile command you can see the last 500 lines of a given tomcat file as you can see in the following screenshot.

If needed, you can explicitely set the log directory in /fileserver/etc/main/main.cf (logdir). If not set, it uses the catalina.home path. The default /fileserver/etc/main/main.cf file is the following:


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <install>
      <basedata>true</basedata>
   </install>
   <default>
      <charset>UTF-8</charset>
   </default>
   <tempdir>tempdir</tempdir>
   <!-- Explicitly sets the log directory path. Default uses catalina.home path.
   <logdir>logdir</logdir>
   -->
   <tempfile>
      <lifetime>3600</lifetime>
   </tempfile>
   <maintenance>
      <tasks>
         <interval>600000</interval>
      </tasks>
   </maintenance>
   <search>
      <timeout>5000</timeout>
   </search>
   <pagetitle>ReportServer</pagetitle>
   <scheduler>
     <email>
       <defaultcompression>false</defaultcompression>
     </email>
   </scheduler>
</configuration>

You can configure the texts in the email with the /etc/security/notifications.cf file (logfiles). The default file is the following:


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <createdpassword disabled="false">
    <email>
      <subject>${msgs['net.datenwerke.rs.passwordpolicy.service.locale.PasswordPolicyMessages']['createdPasswordSubject']}</subject>
      <text>${msgs['net.datenwerke.rs.passwordpolicy.service.locale.PasswordPolicyMessages']['createdPasswordSalutation']} ${user.getFirstname()} ${user.getLastname()},
        
${msgs['net.datenwerke.rs.passwordpolicy.service.locale.PasswordPolicyMessages']['createdPasswordIntro']}
        
${user.getUsername()}
        
${msgs['net.datenwerke.rs.passwordpolicy.service.locale.PasswordPolicyMessages']['createdPasswordEnd']}
       
      </text>
    </email>    
  </createdpassword>
  <changedpassword disabled="false">
    <email>
      <subject>${msgs['net.datenwerke.rs.passwordpolicy.service.locale.PasswordPolicyMessages']['changedPasswordSubject']}</subject>
      <text>${msgs['net.datenwerke.rs.passwordpolicy.service.locale.PasswordPolicyMessages']['changedPasswordSalutation']} ${user.getFirstname()} ${user.getLastname()},
        
${msgs['net.datenwerke.rs.passwordpolicy.service.locale.PasswordPolicyMessages']['changedPasswordIntro']}

${user.getUsername()}

${msgs['net.datenwerke.rs.passwordpolicy.service.locale.PasswordPolicyMessages']['changedPasswordEnd']}
      </text>
    </email>    
  </changedpassword>
  <lostpassword indicateWrongUsername="false">
    <email>
      <subject>${msgs['net.datenwerke.rs.passwordpolicy.service.locale.PasswordPolicyMessages']['lostPasswordSubject']}</subject>
      <text>${msgs['net.datenwerke.rs.passwordpolicy.service.locale.PasswordPolicyMessages']['lostPasswordSalutation']} ${user.getFirstname()} ${user.getLastname()},

${msgs['net.datenwerke.rs.passwordpolicy.service.locale.PasswordPolicyMessages']['lostPasswordIntro']}
  
        ${msgs['net.datenwerke.rs.passwordpolicy.service.locale.PasswordPolicyMessages']['lostPasswordUsername']}: ${user.getUsername()}
        ${msgs['net.datenwerke.rs.passwordpolicy.service.locale.PasswordPolicyMessages']['lostPasswordPassword']}: ${password}

${msgs['net.datenwerke.rs.passwordpolicy.service.locale.PasswordPolicyMessages']['lostPasswordEnd']}		
      </text>   
    </email> 
  </lostpassword>
  <logfiles>
    <email>
      <subject>${msgs['net.datenwerke.rs.adminutils.service.locale.AdminUtilsMessages']['emailLogFilesSubject']}</subject>
      <text>${msgs['net.datenwerke.rs.adminutils.service.locale.AdminUtilsMessages']['emailLogFilesSalutation']} ${user.getFirstname()} ${user.getLastname()},

${msgs['net.datenwerke.rs.adminutils.service.locale.AdminUtilsMessages']['emailLogFilesIntro']}

${filter}

${msgs['net.datenwerke.rs.adminutils.service.locale.AdminUtilsMessages']['emailLogFilesEnd']}		
      </text>
    </email> 
  </logfiles>
</configuration>

Allow to Modify Directory's Web Access by Terminal

You can now modify the web access of a fileserver directory or directories by the new dirmod command. E.g. the following command adds web access to all filesystem directories containing “report” in their name:


dirmod webaccess "hql:from FileServerFolder where name like '%report%'" true

Allow to Configure Excel Sheet Titles

You can specify the title of the data and configuration sheets in the exported Excel file by the "datasheet" and "configsheet" parameters in the /fileserver/etc/exportfilemd/excelexport.cf configuration file. The default file is the following:


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <xls>
      <format>xlsx</format>
      <stream>true</stream>
      <datasheet>Dynamic list</datasheet>
      <configsheet>Configuration</configsheet>
   </xls>
</configuration>

Allow to configure URL whitelist

Certain operations, e.g. redirect, are not allowed for external URLs. If you need to allow a URL you can add it to the whitelist in the /fileserver/etc/security/whitelist.cf configuration file.


<?xml version="1.0" encoding="UTF-8"?>
<configuration>
   <urls>
      <!-- <url>http://www.host.com</url> -->
   </urls>
</configuration>

New Features, Improvements and Bug Fixes for ReportServer RS3.4.0-6032

RS-3619 New Feature Show inherited report properties in variant view
RS-4004 New Feature Support sending reports via SFTP
RS-4331 New Feature Allow to configure .ssh/known_hosts file
RS-4387 New Feature Allow to modify the web access property of a given fileserver directory via terminal
RS-4390 New Feature Allow to hide ViolatedSecurityExceptions message details
RS-4391 New Feature Provide details for ViolatedSecurityExceptions (list missing permissions)
RS-4394 New Feature Allow to execute open report execution view directly from report dadget
RS-4395 New Feature Allow to configure (per report dadget) if opening report execution view should be allowed for the given report dadget
RS-4398 New Feature Allow to specify report scheduler job's title and description
RS-4399 New Feature Add "Refresh preview" button to report view
RS-4404 New Feature Add "Refresh" entry to dynamic list context menu
RS-4417 New Feature Allow to configure "show execute" button in library dadgets of report type
RS-4418 New Feature Allow to use object resolver queries in dirmod command
RS-4420 New Feature Report deployment analyis should be able to ignore case-sensitivity in field names by command option
RS-4425 New Feature Allow to disable adding records in grid report with setCanAddRecords()
RS-4429 New Feature Allow to filter scheduler list by "Job name" in scheduler admin view
RS-4432 New Feature Allow to test reports and variants per terminal with "variantTest" command
RS-4433 New Feature The "variantTest" command should work for reports using database bundles
RS-4435 New Feature The user should be able to specify datasources to test in "variantTest" command if report uses datasource bundle
RS-4436 New Feature Allow to test report in scheduler job configuration dialog
RS-4438 New Feature Allow to select compression in new scheduler jobs by default
RS-4443 New Feature Allow JXLS1 template export
RS-4445 New Feature Allow to list tomcat log files per "listlogfiles" terminal command
RS-4448 New Feature Allow to sort log files in "listlogfiles" terminal command by filename, last modified or size
RS-4449 New Feature Allow to filter log files with regular expressions based on their filename
RS-4450 New Feature Allow to send zipped log files per e-mail with the "listlogfiles" terminal command
RS-4453 New Feature Add example script for fetching all fields of all dynamic lists including their calculated columns: fieldsindynamiclists.groovy
RS-4457 New Feature Allow to disable session renewal
RS-4461 New Feature Allow to configure column width for text and numeric columns in JXLS1 template export
RS-4462 New Feature Allow to test reports in the teamspaces
RS-4464 New Feature The "variantTest" command should use object resolver queries for datasource and report selection
RS-4466 New Feature Allow to export report in context menu of scheduler job configuration dialog
RS-4468 New Feature Allow to reverse sorting order in "listlogfiles" terminal command
RS-4470 New Feature Allow to test reports in variant list
RS-4474 New Feature Allow to show the last n lines of a given log file with the "viewlogfile" terminal command
RS-4476 New Feature Allow to disable duplicating records in grid report with setCanDuplicateRecords()
RS-4477 New Feature Allow to disable removing records in grid report with setCanRemoveRecords()
RS-4480 New Feature Allow to change report in scheduler job
RS-4483 New Feature Allow to refresh log file manually opened with "viewlogfile" terminal command
RS-4484 New Feature Allow to send log file displayed with viewlogfile terminal command per email
RS-4490 New Feature Allow to export JXLS1-report template
RS-4491 New Feature Allow to export JXLS1 template for variants of dynamic list
RS-4492 New Feature Allow to configure JXLS1 template export parameters per report
RS-4494 New Feature Allow to sort tomcat logs on multiple columns with "listlogfiles" terminal command
RS-4496 New Feature Allow to explicitly configure log files directory
RS-4500 New Feature Allow to configure texts in email sent with listlogfiles terminal command
RS-4510 New Feature Allow to configure column width for date columns in JXLS1 template export
RS-4511 New Feature Refresh exporter forms default values when changing job name in job configuration window
RS-4518 New Feature Allow to configure default JXLS template export values in configuration file
RS-4519 New Feature Allow to export column alias in JXLS1 template export
RS-4520 New Feature Allow to configure column width for currency columns in JXLS1 template export
RS-4529 New Feature Allow to fluidly create emails with MailBuilder using Builder pattern
RS-4531 New Feature Allow to include filter in email sent by listlogfiles terminal command (set by -f)
RS-4532 New Feature Allow to export JXLS2 template for variants of dynamic list
RS-4533 New Feature Allow to export JXLS2-report template
RS-4534 New Feature Allow to export column alias in JXLS2 template export
RS-4535 New Feature Allow to configure column width for text, numeric, date and currency columns in JXLS2 template export
RS-4547 New Feature Add "System Console" administration area
RS-4548 New Feature Allow to analyze live JVM memory via chart in system console
RS-4551 New Feature Add System Console generic permission
RS-4555 New Feature Add "General Info" system console
RS-4556 New Feature Support aggregations in JXLS2 template export
RS-4559 New Feature Allow line breaks in query of JXLS2 reports
RS-4560 New Feature Allow comments in query of JXLS2 reports
RS-4564 New Feature Allow to start/stop live memory console animation
RS-4566 New Feature Allow to configure number of units in live memory console
RS-4567 New Feature Allow to configure refresh interval in live memory console
RS-4568 New Feature Allow to turn off max memory in live memory console
RS-4571 New Feature Allow to call JVM Garbage Collector in live memory console
RS-4572 New Feature Allow to configure title of the data and configuration sheets in Excel export file
RS-4586 New Feature Allow to configure allowed redir URLs by whitelist configuration file
RS-4594 New Feature Support scheduling reports via SFTP
RS-4595 New Feature Support disabling sending reports via SFTP
RS-4596 New Feature Support disabling scheduling reports via SFTP
RS-4597 New Feature Support JXLS template export to legacy Excel xls files
RS-4600 New Feature Add "Datasinks" administration area
RS-4601 New Feature Add "DatasinkDefinition" entity among with other necessary entities
RS-4603 New Feature Add FTP datasink
RS-4605 New Feature Allow to clear FTP datasink password
RS-4606 New Feature Replace old FTP functionality with FTP datasinks
RS-4610 New Feature Allow to override default FTP folder
RS-4612 New Feature Allow to test ftp datasinks
RS-4616 New Feature Add Datasinks Administration generic permission
RS-4619 New Feature Add system console to Enterprise Edition
RS-4621 New Feature Add datasink security object
RS-4623 New Feature Add SFTP datasink
RS-4627 New Feature Add JXLS Template export to Enterprise Edition
RS-4639 New Feature Support aggregations in JXLS1 template export
RS-4701 New Feature MariaDB support for pivot/Saiku reports
RS-4721 New Feature Allow to test sftp datasinks
RS-3326 Improvement Move external sources out of src directory
RS-3767 Improvement Remove old jxls 2.8.0 patches
RS-3935 Improvement Add options for Java as of version 9 to documentation
RS-4191 Improvement Add missing substitutions in all available scheduler job emails
RS-4334 Improvement Use vfs2 StaticUserAuthenticator in FTP/SFTP for hiding credentials from URL
RS-4392 Improvement Refactor FTP to use commons-vfs2
RS-4409 Improvement Dadget library should allow to configure the "show execute" button of report dadgets
RS-4419 Improvement Report deployment analysis should not ignore case in field names by default
RS-4421 Improvement Report deployment analysis should include the report ids in its title
RS-4423 Improvement Report deployment analysis should include ignore case-sensitivity option
RS-4428 Improvement Replace scheduler list "Report" and "Report description" fields by "Job name" and "Job description"
RS-4430 Improvement Job name and description should be shown in job properties (details)
RS-4437 Improvement Remove unnecessary jersey-multipart-1.19.jar library
RS-4439 Improvement Upgrade to activation-1.1.1.jar
RS-4440 Improvement Remove unnecessary calls to jersey-multipart-1.19.jar
RS-4441 Improvement Remove unnecessary mimepull-1.9.3.jar library
RS-4452 Improvement Show scheduled report in scheduler job configuration dialog
RS-4458 Improvement Separate scheduler metadata and report windows in scheduler job configuration dialog
RS-4459 Improvement Allow to open report in scheduler job configuration dialog
RS-4465 Improvement Check permissions on variantTest and show query only if "administration" and "report management" generic permissions are set (read permission)
RS-4472 Improvement Allow to minimize scheduler job configuration dialog
RS-4473 Improvement Allow to export variant in context menu of variant list
RS-4475 Improvement Allow to autocomplete log files in "viewlogfile" terminal command
RS-4479 Improvement Disable "clear filters" from context menu when filtering is disabled in grid reports
RS-4481 Improvement Use XML file for translations
RS-4482 Improvement Allow to create translation .properties files from XML
RS-4495 Improvement Integrate lambda rethrowing functions / consumers / suppliers
RS-4497 Improvement Allow to configure export type in report tab in job configuration dialog
RS-4499 Improvement Log files methods should restrict access to log directory defined and should not allow access to subdirectories
RS-4501 Improvement Set default job name and description if set in corresponding report
RS-4504 Improvement Allow report server-side search in report catalog dialog for avoiding to load complete catalog on dialog init
RS-4508 Improvement Default values in exporter forms should base on job name in job configuration window
RS-4509 Improvement Allow to include scheduler job id, name and description in scheduler emails
RS-4512 Improvement Limit number of radio buttons per row in scheduler job configuration window
RS-4523 Improvement Adapt reportsinteamspace.groovy example to show compiled reports in TeamSpaces
RS-4526 Improvement Allow file viewer used in viewlogfile terminal command to automatically scroll to end of file
RS-4528 Improvement Move messages in notifications.cf configuration file to appropriate location
RS-4542 Improvement Allow to add comments to excel sheet in ExcelUtilsService
RS-4552 Improvement Move system environment information into general info system console
RS-4562 Improvement Add gxt-chart-4.0.2.jar dependency
RS-4577 Improvement Upgrade to commons-vfs2-2.7.0
RS-4578 Improvement Upgrade to commons-compress-1.20
RS-4579 Improvement Upgrade to commons-collections4-4.4
RS-4580 Improvement Upgrade to commons-lang3-3.11
RS-4581 Improvement Upgrade to commons-net-3.7.2
RS-4584 Improvement Perform redir check in server-side
RS-4588 Improvement Allow to check on blank values for form fields other than strings
RS-4589 Improvement Add icon to "apply" button
RS-4591 Improvement Add jsch-0.1.55.jar dependency
RS-4611 Improvement Install FTP and SFTP datasink instance descriptors
RS-4614 Improvement Install dummy FTP datasink at startup if legacy FTP scheduler actions are found
RS-4622 Improvement Install Datasink root automatically
RS-4624 Improvement JXLS template fields should always be generated in same case (lower case or upper case) as RS returns in JXLS export
RS-4626 Improvement Optimize maintainance queries
RS-4646 Improvement Upgrade to commons-codec-1.15
RS-4647 Improvement Add SparseBitSet-1.2.jar dependency
RS-4648 Improvement Upgrade to poi-4.1.2.jar
RS-4649 Improvement Upgrade to poi-ooxml-4.1.2.jar
RS-4650 Improvement Upgrade to poi-scratchpad-4.1.2jar
RS-4651 Improvement Upgrade to jxls-2.9.0.jar
RS-4652 Improvement Upgrade to jxls-poi-2.9.0.jar
RS-4653 Improvement Remove old poi patches
RS-4654 Improvement Remove unnecessary stax-1.2.0.jar dependency
RS-4655 Improvement Remove unnecessary stax-api-1.0-2-sources.jar library
RS-4656 Improvement Remove unnecessary stax-api-1.0.1.jar library
RS-4657 Improvement Remove unnecessary xml-apis-1.4.01.jar library
RS-4659 Improvement Remove unnecessary bonecp-0.8.0.RELEASE.jar library
RS-4661 Improvement Remove calls to deprecated bonecp library
RS-4662 Improvement Remove unnecessary mx4j-jmx-1.1.jar library
RS-4665 Improvement Remove jmx calls
RS-4667 Improvement Remove unnecessary guice-jmx-3.0.jar library
RS-4668 Improvement Upgrade to gin-3.0.0
RS-4669 Improvement Upgrade to guice-4.2.3
RS-4670 Improvement Upgrade to guava-30.1-jre
RS-4671 Improvement Upgrade to guice-assistedinject-4.2.3
RS-4672 Improvement Upgrade to guice-jndi-4.2.3
RS-4673 Improvement Upgrade to guice-multibindings-4.2.3
RS-4674 Improvement Upgrade to guice-persist-4.2.3
RS-4675 Improvement Upgrade to guice-servlet-4.2.3
RS-4676 Improvement Upgrade to jsr305-3.0.2
RS-4677 Improvement Upgrade to owasp-java-html-sanitizer-20200713.1
RS-4678 Improvement Add checker-qual-3.9.1.jar dependency
RS-4679 Improvement Add error_prone_annotations-2.5.1.jar dependency
RS-4680 Improvement Add failureaccess-1.0.1.jar dependency
RS-4681 Improvement Add j2objc-annotations-1.3.jar dependency
RS-4682 Improvement Add listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar dependency
RS-4683 Improvement Adding new jxls2 template should appear before jxls1 legacy template
RS-4709 Improvement Strings in "Further Examples"- script datasources should have same size as in ReportServer (128)
RS-4718 Improvement Support single quotes in JXLS1 report template export
RS-4719 Improvement Support single quotes in JXLS2 report template export
RS-3531 Bug HTML email is not working with Java 11
RS-3554 Bug Override metadata in variants when including it into datasource parameter query analogously as when this is included in the report query
RS-3555 Bug Override report internal properties in variants when including them into datasource parameter query analogously as when these are included in the report query
RS-3599 Bug Importing reports into TeamSpace always add "(copy)" into report's name
RS-3873 Bug Scheduler dialog should not allow job's end date to be before begin date
RS-4034 Bug mv and cp commands should check permissions on source objects
RS-4202 Bug Datasource parameters are not showing available parameters and expressions in menu
RS-4354 Bug Mondrian 3 chart export is not working
RS-4401 Bug Error stack details are not showing correctly in user error window
RS-4402 Bug Login Bundles are not working together with Java 11
RS-4408 Bug Dashboard library is showing empty message when adding a report dadget to a dashboard
RS-4410 Bug Dadget height can not be set in the dadget library for some dadget types
RS-4412 Bug Refresh interval and height can not be set in dadget library when editing report dadgets
RS-4415 Bug Refresh interval and height can not be set in library dadgets correctly
RS-4416 Bug The incorrect refresh interval, name and height fields should not be shown in dadget library
RS-4493 Bug Edit file tabs are not being shown correctly in some cases
RS-4498 Bug Paging is not actualizing correctly in grid reports when filtering
RS-4557 Bug Aggregations with grouped fields are not showing correctly in dynamic list Excel export
RS-4620 Bug Email date should be set in header explicitly
RS-4637 Bug CE version is not running correctly
RS-4688 Bug Correct javadocs errors
RS-4705 Bug JXLS2 template export is not handling aggregations correctly
RS-4706 Bug JXLS2 template export is not using selected number of columns but all columns in the report
RS-4707 Bug JXLS template is not counting correctly when using aggregations
RS-4708 Bug Aggregations are not working in JXLS2 report template export

New Features, Improvements and Bug Fixes for ReportServer RS3.4.0-6033

RS-4752 Bug "Add Condition" button in conditional scheduling is always disabled

New Features, Improvements and Bug Fixes for ReportServer RS3.4.0-6034

RS-4768 Bug Postgres upgrade is having issues with show_execute_button column

New Features, Improvements and Bug Fixes for ReportServer RS3.4.0-6035

RS-4771 Improvement mail.cf username and password should be @Nullable
RS-4772 Improvement Allow both lower and upper case variable names in upgrade script

New Features, Improvements and Bug Fixes for ReportServer RS3.4.0-6036

RS-4769 Bug Parameters are not showing in dashboard for reports imported from TeamSpace as a reference
RS-4806 Bug Parameters are not working correctly with HTML-output dadgets (except for root user)
RS-4820 Bug Parameter dadget value is not applying for reports imported from TeamSpace as a reference