<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.open-xchange.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Malasa</id>
	<title>Open-Xchange - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.open-xchange.com/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Malasa"/>
	<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=Special:Contributions/Malasa"/>
	<updated>2026-06-30T23:01:51Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=25566</id>
		<title>AppSuite:Filestorages</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=25566"/>
		<updated>2020-08-18T04:57:16Z</updated>

		<summary type="html">&lt;p&gt;Malasa: /* Microsoft Onedrive */ changed azure page link, configuration changed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Note:''' you can find updated guides at [https://documentation.open-xchange.com/7.10.2/middleware/3rd_party_integrations.html https://documentation.open-xchange.com/7.10.2/middleware/3rd_party_integrations.html]&lt;br /&gt;
&lt;br /&gt;
This page is only for pre 7.10.2 versions.&lt;br /&gt;
&lt;br /&gt;
= Common preparations =&lt;br /&gt;
This page shows how to setup external file stores. For all of these file stores you have to install the package &amp;quot;open-xchange-oauth&amp;quot;, which provides the necessary authentication mechanisms.&lt;br /&gt;
&lt;br /&gt;
Moreover your setup is required to be reachable via HTTPS, since the providers expect that a call-back URL to your setup is specified. Such a call-back URL is only accepted if it contains the &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://&amp;quot;&amp;lt;/source&amp;gt; scheme., e.g.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;quot;https://my.oxsetup.invalid/ajax/defer&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Keep HTTPS protocol ==&lt;br /&gt;
[[Appsuite:Grizzly#Cluster_setup]] shows that HTTPS communication is terminated by the Apache balancer in front of the Open-Xchange nodes. To let the Open-Xchange application know about the HTTPS protocol that is used to communicate with the Apache server:&lt;br /&gt;
* Either set a special header in the SSL virtual hosts configurations in Apache to forward this information. The de facto standard for this is the &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;X-Forwarded-Proto&amp;quot;&amp;lt;/source&amp;gt; header. See [[Appsuite:Grizzly#X-FORWARDED-PROTO_Header]] for how to setup that header.&lt;br /&gt;
* Or force the Open-Xchange application to assume it is reached via SSL through setting property &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;properties&amp;quot;&amp;gt;&amp;quot;com.openexchange.forceHTTPS=true&amp;quot;&amp;lt;/source&amp;gt; in file ''/opt/open-xchange/etc/server.properties''.&lt;br /&gt;
&lt;br /&gt;
== Deferrer URL ==&lt;br /&gt;
Open-Xchange application uses the deferrer URL as call-back for some of the providers, which use OAuth v2.0 authentication (such as Google).&lt;br /&gt;
&lt;br /&gt;
If your OX server is reachable only via one host name, you won't have to do anything. If it is reachable by more than one host name, create or open the file ''/opt/openexchange/etc/deferrer.properties'' and set the properties therein as such:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.http.deferrer.url=https://mymaindomain.invalid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Dropbox =&lt;br /&gt;
&lt;br /&gt;
To setup the Dropbox file store you have to install the package &amp;quot;open-xchange-file-storage-dropbox&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Registering your app ==&lt;br /&gt;
* Log in to your Dropbox account [https://www.dropbox.com/login here], and create your Dropbox app [https://www.dropbox.com/developers/apps/create here]&lt;br /&gt;
* There are two options available creating an app, Drops-in App &amp;amp; Dropbox API App. Please select '''Dropbox API''' app and enter the name of your app.&lt;br /&gt;
* Go to [https://www.dropbox.com/developers/apps App Console] and select your created app. Select settings tab to view the &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;APP_KEY&amp;lt;/source&amp;gt; (App key) and &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;SECRET_KEY&amp;lt;/source&amp;gt; (App secret) and to configure the redirect URI to your AppSuite platform under the Oauth2 section. All the other fields can keep their default value.&lt;br /&gt;
* Please ensure the following conditions are met for the redirect URI:&lt;br /&gt;
** The redirect URI uses &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://&amp;quot;&amp;lt;/source&amp;gt; as protocol&lt;br /&gt;
** The redirect URI follows the pattern: &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://&amp;quot; + &amp;lt;host-name&amp;gt; + &amp;quot;/ajax/defer&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
** E.g. &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://myappsuite.mydomain.invalid/ajax/defer&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
In addition you have to configure the following properties in file ''/opt/open-xchange/etc/dropboxoauth.properties'':&lt;br /&gt;
&lt;br /&gt;
* Enable the OAuth connector to Dropbox OAuth&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.dropbox=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the API key and secret&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.dropbox.apiKey=REPLACE_THIS_WITH_DROPBOX_APP_KEY&lt;br /&gt;
 com.openexchange.oauth.dropbox.apiSecret=REPLACE_THIS_WITH_DROPBOX_APP_SECRET&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the redirect URL. Please ensure the use the same URL as specified in the Dropbox App:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.dropbox.redirectUrl=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the product ID of the registered Dropbox app&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.dropbox.productName=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can define them system-wide or via the config cascade mechanism.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-file-storage-dropbox|toplevel=products|sopath=appsuite/stable/backend|version=App Suite}}&lt;br /&gt;
&lt;br /&gt;
= Google Drive = &lt;br /&gt;
&lt;br /&gt;
To setup the Google Drive file store you have to install the package &amp;quot;open-xchange-file-storage-googledrive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Registering your app ==&lt;br /&gt;
* Sign in to [https://console.developers.google.com/ Google Developers Console] using your Google account&lt;br /&gt;
* Please follow [https://developers.google.com/identity/sign-in/web/devconsole-project these] instructions to create a new project with a client ID, which is needed to call the sign-in API&lt;br /&gt;
* Enable the following APIs for your project&lt;br /&gt;
** BigQuery API&lt;br /&gt;
** Calendar API&lt;br /&gt;
** Contacts API&lt;br /&gt;
** Drive API&lt;br /&gt;
** Drive SDK&lt;br /&gt;
** Gmail API&lt;br /&gt;
** Google Cloud SQL&lt;br /&gt;
** Google Cloud Storage&lt;br /&gt;
** Google Cloud Storage JSON API&lt;br /&gt;
* perform [https://support.google.com/webmasters/answer/35179 Google's site verification]&lt;br /&gt;
** you can use any method listed by Google in general&lt;br /&gt;
** in case our OXaaS offering is used the HTML tag and HTML file methods are not accessible but the DNS based approach is required&lt;br /&gt;
* [[AppSuite:GoogleAppVerification|get your app verified by Google]] to avoid awkward warnings&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
In addition you have to configure the following properties in file ''/opt/open-xchange/etc/googleoauth.properties'':&lt;br /&gt;
&lt;br /&gt;
* Enable the OAuth connector to Google OAuth&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.google=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the API key and secret, which is Client ID and Client Secret to call the sign-in API (Select your project, select API manager from upper left burger menu, select credentials in left side bar, select Client ID for Web application)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.google.apiKey=REPLACE_THIS_WITH_YOUR_CLIENT_ID&lt;br /&gt;
 com.openexchange.oauth.google.apiSecret=REPLACE_THIS_WITH_YOUR_CLIENT_SECRET&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the redirect URL. Please ensure the following conditions are met:&lt;br /&gt;
** The redirect URL specified in the Google App needs to be the same as the one specified by this   property.&lt;br /&gt;
** The redirect URI uses &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://&amp;quot;&amp;lt;/source&amp;gt; as protocol&lt;br /&gt;
** The redirect URI follows the pattern: &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://&amp;quot; + &amp;lt;host-name&amp;gt; + &amp;quot;/ajax/defer&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.google.redirectUrl=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
E.g. &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://myappsuite.mydomain.invalid/ajax/defer&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the product ID of the registered Google app&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.google.productName=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can define them system-wide or via the config cascade mechanism.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-file-storage-googledrive|toplevel=products|sopath=appsuite/stable/backend|version=App Suite}}&lt;br /&gt;
&lt;br /&gt;
= Microsoft Onedrive =&lt;br /&gt;
To setup the Microsoft OneDrive file store you have to install the package &amp;quot;open-xchange-file-storage-onedrive&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
== Registering your app ==&lt;br /&gt;
* register your app on the [https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade Azure App registration] page&lt;br /&gt;
* application ID maps to apiKey in OX properties&lt;br /&gt;
* create credentials and copy it to apiSecret&lt;br /&gt;
* choose &amp;quot;Web&amp;quot; as platform&lt;br /&gt;
* enter the redirect URI/URL, see below &lt;br /&gt;
* enter profile data for your application&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
In addition you have to configure the following properties in file ''/opt/open-xchange/etc/microsoftgraphoauth.properties'' (before 7.10.x ''/opt/open-xchange/etc/msliveconntectoauth.properties''): &lt;br /&gt;
&lt;br /&gt;
* Enable the OAuth connector&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.microsoft.graph=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the API key and secret&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.microsoft.graph.apiKey=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_CLIENT_KEY&lt;br /&gt;
 com.openexchange.oauth.microsoft.graph.apiSecret=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_CLIENT_SECRET&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the redirect URL&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.microsoft.graph.redirectUrl=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_REDIRECT_URL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: the redirect URL must be the same as defined in the azure app registration, it should be https://&amp;lt;REPLACE_WITH_FQDN&amp;gt;/ajax/defer&lt;br /&gt;
&lt;br /&gt;
You can define them system-wide or via the config cascade mechanism.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-file-storage-onedrive|toplevel=products|sopath=appsuite/stable/backend|version=App Suite}}&lt;br /&gt;
&lt;br /&gt;
= Box.com = &lt;br /&gt;
To setup the Box.com file store you have to install the package &amp;quot;open-xchange-file-storage-boxcom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Registering your app ==&lt;br /&gt;
* Sign in to [https://developers.box.com/ box Developers]&lt;br /&gt;
* Select '''Create a Box Application'''&lt;br /&gt;
* Select '''Box Content'''&lt;br /&gt;
* Hit '''Configure your application'''&lt;br /&gt;
* Enter ''redirect_uri''' (the deferrer URL; e.g. &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://my.oxsetup.invalid/ajax/defer&amp;quot;&amp;lt;/source&amp;gt;)&lt;br /&gt;
* Enable ''Read and write all files and folders''&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
In addition you have to configure the following properties in file ''/opt/open-xchange/etc/boxcomoauth.properties'':&lt;br /&gt;
&lt;br /&gt;
* Enable the OAuth connector&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.boxcom=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the API key and secret&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.boxcom.apiKey=REPLACE_THIS_WITH_YOUR_BOX_CLIENT_KEY&lt;br /&gt;
 com.openexchange.oauth.boxcom.apiSecret=REPLACE_THIS_WITH_YOUR_BOX_CLIENT_SECRET&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the redirect URL&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.boxcom.redirectUrl=REPLACE_THIS_WITH_YOUR_BOX_REDIRECT_URL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can define them system-wide or via the config cascade mechanism.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-file-storage-boxcom|toplevel=products|sopath=appsuite/stable/backend|version=App Suite}}&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=25235</id>
		<title>AppSuite:Filestorages</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=25235"/>
		<updated>2020-01-30T11:35:56Z</updated>

		<summary type="html">&lt;p&gt;Malasa: link to doc.o.c&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Note:''' you can find updated guides at [https://documentation.open-xchange.com/7.10.2/middleware/3rd_party_integrations.html https://documentation.open-xchange.com/7.10.2/middleware/3rd_party_integrations.html]&lt;br /&gt;
&lt;br /&gt;
This page is only for pre 7.10.2 versions.&lt;br /&gt;
&lt;br /&gt;
= Common preparations =&lt;br /&gt;
This page shows how to setup external file stores. For all of these file stores you have to install the package &amp;quot;open-xchange-oauth&amp;quot;, which provides the necessary authentication mechanisms.&lt;br /&gt;
&lt;br /&gt;
Moreover your setup is required to be reachable via HTTPS, since the providers expect that a call-back URL to your setup is specified. Such a call-back URL is only accepted if it contains the &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://&amp;quot;&amp;lt;/source&amp;gt; scheme., e.g.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;quot;https://my.oxsetup.invalid/ajax/defer&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Keep HTTPS protocol ==&lt;br /&gt;
[[Appsuite:Grizzly#Cluster_setup]] shows that HTTPS communication is terminated by the Apache balancer in front of the Open-Xchange nodes. To let the Open-Xchange application know about the HTTPS protocol that is used to communicate with the Apache server:&lt;br /&gt;
* Either set a special header in the SSL virtual hosts configurations in Apache to forward this information. The de facto standard for this is the &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;X-Forwarded-Proto&amp;quot;&amp;lt;/source&amp;gt; header. See [[Appsuite:Grizzly#X-FORWARDED-PROTO_Header]] for how to setup that header.&lt;br /&gt;
* Or force the Open-Xchange application to assume it is reached via SSL through setting property &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;properties&amp;quot;&amp;gt;&amp;quot;com.openexchange.forceHTTPS=true&amp;quot;&amp;lt;/source&amp;gt; in file ''/opt/open-xchange/etc/server.properties''.&lt;br /&gt;
&lt;br /&gt;
== Deferrer URL ==&lt;br /&gt;
Open-Xchange application uses the deferrer URL as call-back for some of the providers, which use OAuth v2.0 authentication (such as Google).&lt;br /&gt;
&lt;br /&gt;
If your OX server is reachable only via one host name, you won't have to do anything. If it is reachable by more than one host name, create or open the file ''/opt/openexchange/etc/deferrer.properties'' and set the properties therein as such:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.http.deferrer.url=https://mymaindomain.invalid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Dropbox =&lt;br /&gt;
&lt;br /&gt;
To setup the Dropbox file store you have to install the package &amp;quot;open-xchange-file-storage-dropbox&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Registering your app ==&lt;br /&gt;
* Log in to your Dropbox account [https://www.dropbox.com/login here], and create your Dropbox app [https://www.dropbox.com/developers/apps/create here]&lt;br /&gt;
* There are two options available creating an app, Drops-in App &amp;amp; Dropbox API App. Please select '''Dropbox API''' app and enter the name of your app.&lt;br /&gt;
* Go to [https://www.dropbox.com/developers/apps App Console] and select your created app. Select settings tab to view the &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;APP_KEY&amp;lt;/source&amp;gt; (App key) and &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;SECRET_KEY&amp;lt;/source&amp;gt; (App secret) and to configure the redirect URI to your AppSuite platform under the Oauth2 section. All the other fields can keep their default value.&lt;br /&gt;
* Please ensure the following conditions are met for the redirect URI:&lt;br /&gt;
** The redirect URI uses &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://&amp;quot;&amp;lt;/source&amp;gt; as protocol&lt;br /&gt;
** The redirect URI follows the pattern: &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://&amp;quot; + &amp;lt;host-name&amp;gt; + &amp;quot;/ajax/defer&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
** E.g. &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://myappsuite.mydomain.invalid/ajax/defer&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
In addition you have to configure the following properties in file ''/opt/open-xchange/etc/dropboxoauth.properties'':&lt;br /&gt;
&lt;br /&gt;
* Enable the OAuth connector to Dropbox OAuth&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.dropbox=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the API key and secret&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.dropbox.apiKey=REPLACE_THIS_WITH_DROPBOX_APP_KEY&lt;br /&gt;
 com.openexchange.oauth.dropbox.apiSecret=REPLACE_THIS_WITH_DROPBOX_APP_SECRET&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the redirect URL. Please ensure the use the same URL as specified in the Dropbox App:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.dropbox.redirectUrl=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the product ID of the registered Dropbox app&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.dropbox.productName=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can define them system-wide or via the config cascade mechanism.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-file-storage-dropbox|toplevel=products|sopath=appsuite/stable/backend|version=App Suite}}&lt;br /&gt;
&lt;br /&gt;
= Google Drive = &lt;br /&gt;
&lt;br /&gt;
To setup the Google Drive file store you have to install the package &amp;quot;open-xchange-file-storage-googledrive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Registering your app ==&lt;br /&gt;
* Sign in to [https://console.developers.google.com/ Google Developers Console] using your Google account&lt;br /&gt;
* Please follow [https://developers.google.com/identity/sign-in/web/devconsole-project these] instructions to create a new project with a client ID, which is needed to call the sign-in API&lt;br /&gt;
* Enable the following APIs for your project&lt;br /&gt;
** BigQuery API&lt;br /&gt;
** Calendar API&lt;br /&gt;
** Contacts API&lt;br /&gt;
** Drive API&lt;br /&gt;
** Drive SDK&lt;br /&gt;
** Gmail API&lt;br /&gt;
** Google Cloud SQL&lt;br /&gt;
** Google Cloud Storage&lt;br /&gt;
** Google Cloud Storage JSON API&lt;br /&gt;
* perform [https://support.google.com/webmasters/answer/35179 Google's site verification]&lt;br /&gt;
** you can use any method listed by Google in general&lt;br /&gt;
** in case our OXaaS offering is used the HTML tag and HTML file methods are not accessible but the DNS based approach is required&lt;br /&gt;
* [[AppSuite:GoogleAppVerification|get your app verified by Google]] to avoid awkward warnings&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
In addition you have to configure the following properties in file ''/opt/open-xchange/etc/googleoauth.properties'':&lt;br /&gt;
&lt;br /&gt;
* Enable the OAuth connector to Google OAuth&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.google=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the API key and secret, which is Client ID and Client Secret to call the sign-in API (Select your project, select API manager from upper left burger menu, select credentials in left side bar, select Client ID for Web application)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.google.apiKey=REPLACE_THIS_WITH_YOUR_CLIENT_ID&lt;br /&gt;
 com.openexchange.oauth.google.apiSecret=REPLACE_THIS_WITH_YOUR_CLIENT_SECRET&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the redirect URL. Please ensure the following conditions are met:&lt;br /&gt;
** The redirect URL specified in the Google App needs to be the same as the one specified by this   property.&lt;br /&gt;
** The redirect URI uses &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://&amp;quot;&amp;lt;/source&amp;gt; as protocol&lt;br /&gt;
** The redirect URI follows the pattern: &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://&amp;quot; + &amp;lt;host-name&amp;gt; + &amp;quot;/ajax/defer&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.google.redirectUrl=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
E.g. &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://myappsuite.mydomain.invalid/ajax/defer&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the product ID of the registered Google app&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.google.productName=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can define them system-wide or via the config cascade mechanism.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-file-storage-googledrive|toplevel=products|sopath=appsuite/stable/backend|version=App Suite}}&lt;br /&gt;
&lt;br /&gt;
= Microsoft Onedrive =&lt;br /&gt;
To setup the Microsoft OneDrive file store you have to install the package &amp;quot;open-xchange-file-storage-onedrive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Registering your app ==&lt;br /&gt;
* Please follow [https://msdn.microsoft.com/en-us/library/ff751474.aspx this guide] to create/register your app&lt;br /&gt;
* application ID maps to apiKey in OX properties&lt;br /&gt;
* create credentials and copy it to apiSecret&lt;br /&gt;
* choose &amp;quot;Web&amp;quot; as platform&lt;br /&gt;
* enter the redirect URL according to the instruction in msliveconnectoauth.properties&lt;br /&gt;
* enter profile data for your application&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
In addition you have to configure the following properties in file ''/opt/open-xchange/etc/msliveconntectoauth.properties'':&lt;br /&gt;
&lt;br /&gt;
* Enable the OAuth connector&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.msliveconnect=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the API key and secret&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.msliveconnect.apiKey=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_CLIENT_KEY&lt;br /&gt;
 com.openexchange.oauth.msliveconnect.apiSecret=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_CLIENT_SECRET&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the redirect URL&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.msliveconnect.redirectUrl=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_REDIRECT_URL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can define them system-wide or via the config cascade mechanism.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-file-storage-onedrive|toplevel=products|sopath=appsuite/stable/backend|version=App Suite}}&lt;br /&gt;
&lt;br /&gt;
= Box.com = &lt;br /&gt;
To setup the Box.com file store you have to install the package &amp;quot;open-xchange-file-storage-boxcom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Registering your app ==&lt;br /&gt;
* Sign in to [https://developers.box.com/ box Developers]&lt;br /&gt;
* Select '''Create a Box Application'''&lt;br /&gt;
* Select '''Box Content'''&lt;br /&gt;
* Hit '''Configure your application'''&lt;br /&gt;
* Enter ''redirect_uri''' (the deferrer URL; e.g. &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://my.oxsetup.invalid/ajax/defer&amp;quot;&amp;lt;/source&amp;gt;)&lt;br /&gt;
* Enable ''Read and write all files and folders''&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
In addition you have to configure the following properties in file ''/opt/open-xchange/etc/boxcomoauth.properties'':&lt;br /&gt;
&lt;br /&gt;
* Enable the OAuth connector&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.boxcom=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the API key and secret&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.boxcom.apiKey=REPLACE_THIS_WITH_YOUR_BOX_CLIENT_KEY&lt;br /&gt;
 com.openexchange.oauth.boxcom.apiSecret=REPLACE_THIS_WITH_YOUR_BOX_CLIENT_SECRET&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the redirect URL&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.boxcom.redirectUrl=REPLACE_THIS_WITH_YOUR_BOX_REDIRECT_URL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can define them system-wide or via the config cascade mechanism.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-file-storage-boxcom|toplevel=products|sopath=appsuite/stable/backend|version=App Suite}}&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=Template:OXLoadBalancingClustering_Database&amp;diff=24915</id>
		<title>Template:OXLoadBalancingClustering Database</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=Template:OXLoadBalancingClustering_Database&amp;diff=24915"/>
		<updated>2019-10-08T19:01:06Z</updated>

		<summary type="html">&lt;p&gt;Malasa: typo ist&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
You can choose between Galera or Master/Slave replication. We like to recommend to use Galera for higher redudancy, easier operations, und synchronous semantics (so you can run OX without our &amp;quot;replication monitor&amp;quot;). For POC or demo setups, a single standalone database setup might be sufficient.&lt;br /&gt;
&lt;br /&gt;
== Standalone database setup ==&lt;br /&gt;
&lt;br /&gt;
=== Preparations ===&lt;br /&gt;
&lt;br /&gt;
Our configuration process includes wiping and reinitializing the datadir. This is usually not a problem in a fresh installation. If you want to upgrade an existing database server, please be prepared to wipe the datadir, i.e. take a &amp;lt;code&amp;gt;mysqldump&amp;lt;/code&amp;gt; for later restoration into the properly configured master.&lt;br /&gt;
&lt;br /&gt;
 mysqldump --databases configdb oxdb_{5..14} &amp;gt; backup.sql&lt;br /&gt;
&lt;br /&gt;
Be sure to verify the list of databases.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Note: the following list is not an exclusive list or authorative statement about supported MySQL flavors / versions. Please consult the official support / system requirements statement.&lt;br /&gt;
&lt;br /&gt;
Please follow the upstream docs for your preferred flavor to get the software installed on your system.&lt;br /&gt;
&lt;br /&gt;
* MariaDB (10.1, 10.2): https://downloads.mariadb.org/&lt;br /&gt;
* Oracle MySQL Community Server (5.6, 5.7): https://dev.mysql.com/downloads/mysql/&lt;br /&gt;
&lt;br /&gt;
Make sure to doublecheck the service is not running (or stop it) after installation as we need to perform some reconfigurations.&lt;br /&gt;
&lt;br /&gt;
 service mysql stop&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
MySQL configuration advise is given in our [[My.cnf|MySQL configuration article]]. Please consult that page for configuration information and create configuration files as described there.&lt;br /&gt;
&lt;br /&gt;
Some settings we recommend to change require that the database gets re-initialized. We assume you don't have data there (since we are covering a fresh install) or you have taken a backup for later restore as explained above in the Preparations section.&lt;br /&gt;
&lt;br /&gt;
 cd /var/lib/&lt;br /&gt;
 mv mysql mysql.old.datadir&lt;br /&gt;
 mkdir mysql&lt;br /&gt;
 chown mysql.mysql mysql&lt;br /&gt;
 &lt;br /&gt;
 # mariadb&lt;br /&gt;
 mysql_install_db&lt;br /&gt;
 # mariadb 10.2&lt;br /&gt;
 mysql_install_db --user=mysql&lt;br /&gt;
 # oracle 5.6&lt;br /&gt;
 mysql_install_db -u mysql&lt;br /&gt;
 # oracle 5.7&lt;br /&gt;
 mysqld --initialize-insecure --user=mysql&lt;br /&gt;
&lt;br /&gt;
(Don't be worried about the &amp;lt;code&amp;gt;insecure&amp;lt;/code&amp;gt;, it just means we set the db root pw in the next steps.)&lt;br /&gt;
&lt;br /&gt;
Start the service. The actual command depends on your OS and on the MySQL flavor.&lt;br /&gt;
&lt;br /&gt;
 service mysql start&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;mysql_secure_installation&amp;lt;/code&amp;gt; for a &amp;quot;secure by default&amp;quot; installation:&lt;br /&gt;
&lt;br /&gt;
 mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
That tool will ask for the current root password (which is empty by default) and subsequently questions like:&lt;br /&gt;
&lt;br /&gt;
 Change the root password? [Y/n]&lt;br /&gt;
 Remove anonymous users? [Y/n]&lt;br /&gt;
 Disallow root login remotely? [Y/n]&lt;br /&gt;
 Remove test database and access to it? [Y/n]&lt;br /&gt;
 Reload privilege tables now? [Y/n]&lt;br /&gt;
&lt;br /&gt;
You should answer all these questions with &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Configure a strong password for the MySQL &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; user.&lt;br /&gt;
&lt;br /&gt;
The further steps in this guide omit &amp;lt;code&amp;gt;-u -p&amp;lt;/code&amp;gt; arguments to the MySQL client. Rather than passing them on the command line [https://dev.mysql.com/doc/refman/5.7/en/password-security-user.html] it is recommended to place the credentials in a file like &amp;lt;code&amp;gt;/root/.my.cnf&amp;lt;/code&amp;gt; like&lt;br /&gt;
&lt;br /&gt;
 [client]&lt;br /&gt;
 user=root&lt;br /&gt;
 password=wip9Phae3Beijeed&lt;br /&gt;
&lt;br /&gt;
Make sure the service is enabled by the OS's init system. The actual command depends on your OS and on the MySQL flavor.&lt;br /&gt;
&lt;br /&gt;
 systemctl enable mysql.service&lt;br /&gt;
&lt;br /&gt;
You should now be able to restore your previously taken backup.&lt;br /&gt;
&lt;br /&gt;
 # If you took a dump for restore before&lt;br /&gt;
 mysql &amp;lt; backup.sql&lt;br /&gt;
&lt;br /&gt;
=== Configure OX to use with a standalone database ===&lt;br /&gt;
&lt;br /&gt;
Not much special wisdom here. OX was designed to be used with master/slave databases, and a standalone master works just as well, if we register it as a master, and not registering a slave.&lt;br /&gt;
&lt;br /&gt;
For the ConfigDB, &amp;lt;code&amp;gt;configdb.properties&amp;lt;/code&amp;gt; allows configuration of a &amp;lt;code&amp;gt;writeUrl&amp;lt;/code&amp;gt; (which is set to the correct values if you use &amp;lt;code&amp;gt;oxinstaller&amp;lt;/code&amp;gt; with the correct argument &amp;lt;code&amp;gt;--configdb-writehost&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
The single database is then used for reading and writing.&lt;br /&gt;
&lt;br /&gt;
For the individiual UserDBs, use &amp;lt;code&amp;gt;registerdatabase -m true&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Galera database setup ==&lt;br /&gt;
&lt;br /&gt;
=== Preparations ===&lt;br /&gt;
&lt;br /&gt;
Our configuration process includes wiping and reinitializing the datadir. This is usually not a problem in a fresh installation. If you want to upgrade an existing database to Galera cluster, please be prepared to wipe the datadir, i.e. take a &amp;lt;code&amp;gt;mysqldump&amp;lt;/code&amp;gt; for later restoration into the properly configured master.&lt;br /&gt;
&lt;br /&gt;
Depeding on the flavor of the current database, this can be something like&lt;br /&gt;
&lt;br /&gt;
 # mariadb or oracle mysql without GTIDs&lt;br /&gt;
 mysqldump --databases configdb oxdb_{5..14} &amp;gt; backup.sql&lt;br /&gt;
 &lt;br /&gt;
 # mysql 5.6 with GTIDs... we dont want GTIDs here&lt;br /&gt;
 mysqldump --databases --set-gtid-purged=OFF configdb oxdb_{5..14} &amp;gt; backup.sql&lt;br /&gt;
&lt;br /&gt;
Be sure to verify the list of databases.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Please follow the upstream docs for your preferred flavor to get the software installed on your system.&lt;br /&gt;
&lt;br /&gt;
* Percona XtraDB Cluster (5.6, 5.7): https://www.percona.com/doc/percona-xtradb-cluster/LATEST/install/index.html&lt;br /&gt;
* MariaDB Galera Cluster (10.0, 10.1): https://mariadb.com/kb/en/library/getting-started-with-mariadb-galera-cluster/ (Note: with 10.0, socat is required, but not a package dependency, so you need to explicitly install also socat)&lt;br /&gt;
&lt;br /&gt;
Make sure to doublecheck the service is not running (or stop it) after installation as we need to perform some reconfigurations.&lt;br /&gt;
&lt;br /&gt;
 service mysql stop&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
Galera-specific MySQL configuration advise is included in our main [[My.cnf|MySQL configuration article]]. Please consult that page for configuration information.&lt;br /&gt;
&lt;br /&gt;
That page suggests a setup were we add three custom config files to &amp;lt;code&amp;gt;/etc/mysql/ox.conf.d/&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;ox.cnf&amp;lt;/code&amp;gt; for general tuning/sizing, &amp;lt;code&amp;gt;wsrep.cnf&amp;lt;/code&amp;gt; for clusterwide galera configuration, and &amp;lt;code&amp;gt;host.cnf&amp;lt;/code&amp;gt; for host-specific settings.&lt;br /&gt;
&lt;br /&gt;
Adjust the general settings and tunings in &amp;lt;code&amp;gt;ox.cnf&amp;lt;/code&amp;gt; according to your sizing etc.&lt;br /&gt;
&lt;br /&gt;
Adjust &amp;lt;code&amp;gt;wsrep.cnf&amp;lt;/code&amp;gt; to reflect local paths, cluster member addresses, etc.&lt;br /&gt;
&lt;br /&gt;
Adjust &amp;lt;code&amp;gt;host.cnf&amp;lt;/code&amp;gt; to give node-local IPs, etc.&lt;br /&gt;
&lt;br /&gt;
Version-specific hints:&lt;br /&gt;
&lt;br /&gt;
 # percona 5.6: unknown variable 'pxc_strict_mode=ENFORCING' ... unset that one&lt;br /&gt;
 # mariadb 10.1: add wsrep_on=ON&lt;br /&gt;
 # mariadb 10.0 and 10.1: set wsrep_node_incoming_address=192.168.1.22:3306 in host.cnf, otherwise the status wsrep_incoming_addresses might not be shown correctly(?!)&lt;br /&gt;
&lt;br /&gt;
Some settings we recommend to change require that the database gets re-initialized. We assume you don't have data there (since we are covering a fresh install) or you have taken a backup for later restore as explained above in the Preparations section.&lt;br /&gt;
&lt;br /&gt;
 cd /var/lib/&lt;br /&gt;
 mv mysql mysql.old.datadir&lt;br /&gt;
 mkdir mysql&lt;br /&gt;
 chown mysql.mysql mysql&lt;br /&gt;
 &lt;br /&gt;
 # mariadb 10.0 and 10.1&lt;br /&gt;
 mysql_install_db&lt;br /&gt;
 # mariadb 10.2&lt;br /&gt;
 mysql_install_db --user=mysql&lt;br /&gt;
 # percona 5.6&lt;br /&gt;
 mysqld --user=mysql&lt;br /&gt;
 # percona 5.7&lt;br /&gt;
 mysqld --initialize-insecure --user=mysql&lt;br /&gt;
&lt;br /&gt;
(Don't be worried about the &amp;lt;code&amp;gt;insecure&amp;lt;/code&amp;gt;, it just means we set the db root pw in the next steps.)&lt;br /&gt;
&lt;br /&gt;
=== Cluster startup ===&lt;br /&gt;
&lt;br /&gt;
Typically on startup a Galera node tries to join a cluster, and if it fails, it will exit. Thus, when no cluster nodes are running, the first cluster node to be started needs to be told to not try to join a cluster, but rather bootstrap a new cluster. The exact arguments vary from version to version and from flavor to flavor.&lt;br /&gt;
&lt;br /&gt;
==== First node ====&lt;br /&gt;
&lt;br /&gt;
So we initialize the cluster bootstrap on the first node:&lt;br /&gt;
&lt;br /&gt;
 # percona 5.6, 5.7&lt;br /&gt;
 service mysql bootstrap-pxc&lt;br /&gt;
 # mariadb 10.0&lt;br /&gt;
 service mysql bootstrap&lt;br /&gt;
 # mariadb 10.1, 10.2&lt;br /&gt;
 galera_new_cluster&lt;br /&gt;
&lt;br /&gt;
Run &amp;lt;code&amp;gt;mysql_secure_installation&amp;lt;/code&amp;gt; for a &amp;quot;secure by default&amp;quot; installation:&lt;br /&gt;
&lt;br /&gt;
 mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
The further steps in this guide omit &amp;lt;code&amp;gt;-u -p&amp;lt;/code&amp;gt; arguments to the MySQL client. Rather than passing them on the command line [https://dev.mysql.com/doc/refman/5.7/en/password-security-user.html] it is recommended to place the credentials in a file like &amp;lt;code&amp;gt;/root/.my.cnf&amp;lt;/code&amp;gt; like&lt;br /&gt;
&lt;br /&gt;
 [client]&lt;br /&gt;
 user=root&lt;br /&gt;
 password=wip9Phae3Beijeed&lt;br /&gt;
&lt;br /&gt;
We need a Galera replication user:&lt;br /&gt;
&lt;br /&gt;
 CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'OpIdjijwef0';&lt;br /&gt;
 -- percona 5.6, mariadb 10.0&lt;br /&gt;
 GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';&lt;br /&gt;
 -- percona 5.7, mariadb 10.1, 10.2&lt;br /&gt;
 GRANT PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
(Debian specific note: MariaDB provided startup scripts use the distro's mechanism of verifying startup/shutdown using a system user, so we create that as well:&lt;br /&gt;
&lt;br /&gt;
 # mariadb 10.0, 10.1, 10.2&lt;br /&gt;
 GRANT ALL PRIVILEGES ON *.* TO &amp;quot;debian-sys-maint&amp;quot;@&amp;quot;localhost&amp;quot; IDENTIFIED BY &amp;quot;adBexthTsI5TaEps&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
If you do this, yo need to synchronize the &amp;lt;code&amp;gt;/etc/mysql/debian.cnf&amp;lt;/code&amp;gt; file from the first node to the other nodes as well.)&lt;br /&gt;
&lt;br /&gt;
==== Other nodes ====&lt;br /&gt;
&lt;br /&gt;
On the other nodes, we only need to restart the service now, to trigger a full state transfer from the first node to the other nodes.&lt;br /&gt;
&lt;br /&gt;
We recommend to do this serially to let one state transfer complete before the second state transfer.&lt;br /&gt;
&lt;br /&gt;
==== First node (continued) ====&lt;br /&gt;
&lt;br /&gt;
Only applicable if you used &amp;lt;code&amp;gt;galera_new_cluster&amp;lt;/code&amp;gt; before rather than the service script: In order to get the systemctl status consistent, restart the service on the first node:&lt;br /&gt;
&lt;br /&gt;
 # mariadb 10.1, 10.2: restart the service so that the systemctl status is consistent&lt;br /&gt;
 mysqladmin shutdown&lt;br /&gt;
 service mysql bootstrap&lt;br /&gt;
&lt;br /&gt;
=== Verify the replication ===&lt;br /&gt;
&lt;br /&gt;
The key tool to verify replication status is&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; show status like &amp;quot;%wsrep%&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
This will give a lot of output. You want to verify in particular&lt;br /&gt;
&lt;br /&gt;
 +------------------------------+--------------------------------------+&lt;br /&gt;
 | Variable_name                | Value                                |&lt;br /&gt;
 +------------------------------+--------------------------------------+&lt;br /&gt;
 | wsrep_cluster_size           | 3                                    |&lt;br /&gt;
 | wsrep_cluster_status         | Primary                              |&lt;br /&gt;
 | wsrep_local_state            | 4                                    |&lt;br /&gt;
 | wsrep_local_state_comment    | Synced                               |&lt;br /&gt;
 | wsrep_ready                  | ON                                   |&lt;br /&gt;
 +------------------------------+--------------------------------------+&lt;br /&gt;
&lt;br /&gt;
You can also explicitly verify replication by creating / inserting DBs, tables, rows on one node and select on other nodes.&lt;br /&gt;
&lt;br /&gt;
==== Troubleshooting ====&lt;br /&gt;
&lt;br /&gt;
The logs are helpful. Always.&lt;br /&gt;
&lt;br /&gt;
Common mistakes are listed below.&lt;br /&gt;
&lt;br /&gt;
If the Galera module does not get loaded at all:&lt;br /&gt;
* Configuration settings in ''my.cnf'' which are incompatible to Galera&lt;br /&gt;
* Wrong path of the shared object providing the Galera plugin in wsrep.cnf (wsrep_provider)&lt;br /&gt;
&lt;br /&gt;
If the first node starts, but the second / third nodes can not be added to the cluster:&lt;br /&gt;
* User for the replication not created correctly on the first Galera node&lt;br /&gt;
* SST fails due to missing / wrong version prerequisite packages (not everything is hardcoded in package dependencies -- make sure you got percona-xtrabackup installed in the correct version, and also socat). If SST fails, do not only look into mysqls primary error logs, but also into logfiles from the SST tool in /var/lib/mysql on the donor node.&lt;br /&gt;
&lt;br /&gt;
=== Notes about configuring OX for use with Galera ===&lt;br /&gt;
&lt;br /&gt;
==== Write requests ====&lt;br /&gt;
&lt;br /&gt;
Open-Xchange supports Galera as database backend only in the configuration where all writes are directed to one Galera node. For availability, it makes sense to not configure one Galera node's IP address directly, but rather employ some HA solution which offers active-passive functionality. Options therefore are discussed below.&lt;br /&gt;
&lt;br /&gt;
==== Read requests ====&lt;br /&gt;
&lt;br /&gt;
Read requests can be directed to any node in the Galera cluster. Our standard approach is to recommend to use a loadbalancer to implement round-robin over all nodes in a Galera cluster for the read requests. But you can also chose to use a dedicated read node (the same node, or a different node, than the write node). Each of the approaches has its own advantages.&lt;br /&gt;
&lt;br /&gt;
* Load balancer based setup: Read requests get distributed round-robin between the Galera nodes. Theoretically by distributing the load of the read requests, you benefit from lower latencies and more throughput. But this has never been benchmarked yet. For a discussion of available loadbalances, see next section. OX-wise, in this configuration, you have two alternatives: &lt;br /&gt;
** The Galera option wsrep_causal_reads=1 option enables you to configure OX with its replication monitor disabled (com.openexchange.database.replicationMonitor=false in configdb.properties). This is the setup which seems to perform best according to our experience as turning off the replication monitor reduces the commits on the DB and thus the write operations per second on the underlying storage significantly, which outweights the drawback from having higher commit latency due to fully synchronous mode.&lt;br /&gt;
** Alternatively, you can run Galera with wsrep_causal_reads=0 when switching on OX builtin replication monitor. This is also a valid setup.&lt;br /&gt;
* Use a designated floating IP for the read requests: This eliminates the need of a load balancer. With this option you will not gain any performance, but the quantitative benefit is unclear anyhow.&lt;br /&gt;
* Use the floating IP for the writes also for the reads: In this scenario, you direct all database queries only to one Galera node, and the other two nodes are only getting queries in case of a failure of that node. In this case, you can even use wsrep_causal_reads=0 while still having OX builtin replication monitor switched off. However we do not expect this option to be superior to the round-robin loadbalancer approach.&lt;br /&gt;
&lt;br /&gt;
=== Loadbalancer options ===&lt;br /&gt;
&lt;br /&gt;
While the JDBC driver has some round-robin load balancing capabilities built-in, we don't recommend it for production use since it lacks possibilities to check the Galera nodes health states.&lt;br /&gt;
&lt;br /&gt;
Loadbalancers used for OX -&amp;gt; Galera loadbalancing should be able to implement active-passive instances for the write requests, and active-active (round-robin) instances for the read requests. (If they cannot implement active-passive, you can still take a floating IP therefore.) Furthermore it is required to configure node health checks not only on the TCP level (by a simple connect), but to query the Galera health status periodically, evaluating Galera WSREP status variables. Otherwise split-brain scenarios or other bad states cannot be detected. For an example of such an health check, see our [[Clustercheck]] page.&lt;br /&gt;
&lt;br /&gt;
Some customers use loadbalancing appliances. It is important to check that if the (virtual) infrastructure offers &amp;quot;loadbalancer&amp;quot; instances that they satisfy the given requirements. Often this is not the case. In particular, a simple &amp;quot;DNS round robin&amp;quot; approach is not viable.&lt;br /&gt;
&lt;br /&gt;
==== LVS/ipvsadm/keepalived ====&lt;br /&gt;
&lt;br /&gt;
If you want to create your own loadbalancers based on Linux, we usually recommend LVS (Linux Virtual Servers) controlled by Keepalived. LVS is a set of kernel modules implementing a L4 loadbalancer which performs quite well. Keepalived is a userspace daemon to control LVS rules, using health checks to reconfigure LVS rules if required. Keepalived / LVS requires one (or, for availability, two) dedicated linux nodes to run on. This can be a disadvantage for some installations, but usually, it pays off. We provide some configuration information on Keepalived [[Keepalived|here]].&lt;br /&gt;
&lt;br /&gt;
==== MariaDB Maxscale ====&lt;br /&gt;
&lt;br /&gt;
Since Maxscale has become GA in 2015, it seems to have undergone significant stability, performance and functional improvements. We are currently experimenting with Maxscale and share our installation / configuration knowledge [[Maxscale|here]]. It looks quite promising and might become ''the standard replacement'' for HAproxy, while we still presume Keepalived offers superior robustness and performance, coming with the cost of the requirement for one (or more) dedicated loadbalancer nodes.&lt;br /&gt;
&lt;br /&gt;
==== HAproxy ====&lt;br /&gt;
&lt;br /&gt;
In case where the Keepalived based approach is not feasible due to its requirements on the infrastructure, it is also possible to use a HAproxy based solution where HAproxy processes run on each of the OX nodes, configured for one round-robin and one active/passive instance. OX is then connecting to the local HAproxy instances. It is vital to configure HAproxy timeouts different from the defaults, otherwise HAproxy will kill active DB connections, causing errors. Be aware that in large installations the number of (distributed) HAproxy instances can get quite large. Some configuration hints for HAproxy are available [[HAproxy|here]].&lt;br /&gt;
&lt;br /&gt;
== Master/Slave database setup ==&lt;br /&gt;
&lt;br /&gt;
While we also support also &amp;quot;legacy&amp;quot; (pre-GTID) Master/Slave replication, we recommend to use GTID based replication, for easier setup and failure recovery. Support for GTID based replication has been added with OX 7.8.0.&lt;br /&gt;
&lt;br /&gt;
GTID has been available since MySQL 5.6, so no 5.5 installation instructions below, sorry. We try to be generic in this documentation (thus, applicable to Oracle Community Edition and MariaDB) and point out differences where needed. Note: Instructions below include information about Oracle Community MySQL 5.7 which is not yet formally supported.&lt;br /&gt;
&lt;br /&gt;
=== Preparations ===&lt;br /&gt;
&lt;br /&gt;
Our configuration process includes wiping and reinitializing the datadir. This is usually not a problem in a fresh installation. If you want to upgrade an existing database to GTID master-slave, please be prepared to wipe the datadir, i.e. take a &amp;lt;code&amp;gt;mysqldump&amp;lt;/code&amp;gt; for later restoration into the properly configured master.&lt;br /&gt;
&lt;br /&gt;
Depeding on the flavor of the current database, this can be something like&lt;br /&gt;
&lt;br /&gt;
 # mariadb or oracle mysql without GTIDs&lt;br /&gt;
 mysqldump --databases configdb oxdb_{5..14} &amp;gt; backup.sql&lt;br /&gt;
 &lt;br /&gt;
 # mysql 5.6 with GTIDs... we dont want GTIDs here&lt;br /&gt;
 mysqldump --databases --set-gtid-purged=OFF configdb oxdb_{5..14} &amp;gt; backup.sql&lt;br /&gt;
&lt;br /&gt;
Be sure to verify the list of databases.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
Software installation is identical for master and slave.&lt;br /&gt;
&lt;br /&gt;
Please follow the instructions for installing from The vendors.&lt;br /&gt;
&lt;br /&gt;
* Oracle Community Edition: https://dev.mysql.com/doc/mysql-apt-repo-quick-guide/en/&lt;br /&gt;
* MariaDB (10.0, 10.1): https://downloads.mariadb.org/mariadb/repositories/&lt;br /&gt;
&lt;br /&gt;
Stop the service (if it is running):&lt;br /&gt;
&lt;br /&gt;
 service mysql stop&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
Configuration as per configuration files is also identical for master and slave.&lt;br /&gt;
&lt;br /&gt;
Consult [[My.cnf]] for general recommendations how to configure databases for usage with OX.&lt;br /&gt;
&lt;br /&gt;
For GTID based replication, make sure you add some configurables to a new &amp;lt;code&amp;gt;/etc/mysql/ox.conf.d/gtid.cnf&amp;lt;/code&amp;gt; file (assuming you are following our proposed schema of adding a &amp;lt;code&amp;gt;!includedir /etc/mysql/ox.conf.d/&amp;lt;/code&amp;gt;&amp;quot; directive to &amp;lt;code&amp;gt;/etc/mysql/my.cnf&amp;lt;/code&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 # GTID&lt;br /&gt;
 log-bin=mysql-bin&lt;br /&gt;
 server-id=...&lt;br /&gt;
 log_slave_updates = ON&lt;br /&gt;
&lt;br /&gt;
Oracle Community Edition: we need to add also&lt;br /&gt;
&lt;br /&gt;
 enforce_gtid_consistency = ON&lt;br /&gt;
 gtid_mode = ON&lt;br /&gt;
&lt;br /&gt;
(GTID mode is on by default on MariaDB.)&lt;br /&gt;
&lt;br /&gt;
Use unique a &amp;lt;code&amp;gt;server-id&amp;lt;/code&amp;gt; for each server; like &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; for the master, &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; for slave. For more complicated setups (like multiple slaves), adjust accordingly.&lt;br /&gt;
&lt;br /&gt;
Since applying our configuration / sizing requires reinitialization of the MySQL datadir, we wipe/recreate it. Caution: this assumes we are running an empty database. If there is data in the database you want to keep, use mysqldump. See Preparation section above.&lt;br /&gt;
&lt;br /&gt;
So, to initialize the datadir:&lt;br /&gt;
&lt;br /&gt;
 cd /var/lib/&lt;br /&gt;
 mv mysql mysql.old.datadir&lt;br /&gt;
 mkdir mysql&lt;br /&gt;
 chown mysql.mysql mysql&lt;br /&gt;
&lt;br /&gt;
(When coming from an existing installation, be sure to wipe also old binlogs. They can confuse the server on startup. Their location varies by configuration.)&lt;br /&gt;
&lt;br /&gt;
The step to initialize the datadir is different for the different DBs:&lt;br /&gt;
&lt;br /&gt;
 # MariaDB 10.0, 10.1&lt;br /&gt;
 mysql_install_db&lt;br /&gt;
 &lt;br /&gt;
 # MariaDB 10.2&lt;br /&gt;
 mysql_install_db --user=mysql&lt;br /&gt;
 &lt;br /&gt;
 # Oracle 5.6&lt;br /&gt;
 mysql_install_db -u mysql&lt;br /&gt;
 &lt;br /&gt;
 # Oracle 5.7&lt;br /&gt;
 mysqld --initialize-insecure --user=mysql&lt;br /&gt;
&lt;br /&gt;
(Don't be worried about the &amp;lt;code&amp;gt;insecure&amp;lt;/code&amp;gt;, it just means we set the db root pw in the next steps.)&lt;br /&gt;
&lt;br /&gt;
Then:&lt;br /&gt;
&lt;br /&gt;
 service mysql restart&lt;br /&gt;
 mysql_secure_installation&lt;br /&gt;
&lt;br /&gt;
We want to emphasize the last step to run &amp;quot;secure&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Steps up to here apply to both the designated master and slave. The next steps will apply to the master.&lt;br /&gt;
&lt;br /&gt;
=== Replication Setup ===&lt;br /&gt;
&lt;br /&gt;
==== Master Setup ====&lt;br /&gt;
&lt;br /&gt;
Create a replication user on the master (but, as always, pick your own password, and use the same password in the slave setup below):&lt;br /&gt;
&lt;br /&gt;
 mysql -e &amp;quot;CREATE USER 'repl'@'gtid-slave.localdomain' IDENTIFIED BY 'IvIjyoffod2'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'gtid-slave.localdomain';&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Now would also be the time to restore a previously created mysqldump, or add other users you need for adminstration, monitoring etc (like &amp;lt;code&amp;gt;debian-sys-maint@localhost&amp;lt;/code&amp;gt;, for example). Adding the OX users is explained below (&amp;quot;Creating Open-Xchange user&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
 # If you took a dump for restore before&lt;br /&gt;
 mysql &amp;lt; backup.sql&lt;br /&gt;
&lt;br /&gt;
To prepare for the initial sync of the slave, set the master read-only:&lt;br /&gt;
&lt;br /&gt;
 mysql -e &amp;quot;SET @@global.read_only = ON;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Create a dump to initialize the slave:&lt;br /&gt;
&lt;br /&gt;
 # MariaDB&lt;br /&gt;
 mysqldump --all-databases --triggers --routines --events --master-data --gtid &amp;gt; master.sql&lt;br /&gt;
 &lt;br /&gt;
 # Oracle&lt;br /&gt;
 mysqldump --all-databases --triggers --routines --events --set-gtid-purged=ON &amp;gt; master.sql&lt;br /&gt;
&lt;br /&gt;
Transfer to the slave:&lt;br /&gt;
&lt;br /&gt;
 scp master.sql gtid-slave:&lt;br /&gt;
&lt;br /&gt;
==== Slave Setup ====&lt;br /&gt;
&lt;br /&gt;
Configure the replication master settings. Note we don't need complicated binlog position settings etc with GTID.&lt;br /&gt;
&lt;br /&gt;
Yet again DB-specific (use the repl user password from above):&lt;br /&gt;
&lt;br /&gt;
 # MariaDB&lt;br /&gt;
 mysql -e 'CHANGE MASTER TO MASTER_HOST=&amp;quot;gtid-master.localdomain&amp;quot;, MASTER_USER=&amp;quot;repl&amp;quot;, MASTER_PASSWORD=&amp;quot;IvIjyoffod2&amp;quot;;'&lt;br /&gt;
 &lt;br /&gt;
 # Oracle&lt;br /&gt;
 mysql -e &amp;quot;CHANGE MASTER TO MASTER_HOST='gtid-master.localdomain', MASTER_USER='repl', MASTER_PASSWORD='IvIjyoffod2', MASTER_AUTO_POSITION=1;&amp;quot;&lt;br /&gt;
 # https://www.percona.com/blog/2013/02/08/how-to-createrestore-a-slave-using-gtid-replication-in-mysql-5-6/&lt;br /&gt;
 mysql -e &amp;quot;RESET MASTER;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Read the master dump:&lt;br /&gt;
&lt;br /&gt;
 mysql &amp;lt; master.sql&lt;br /&gt;
&lt;br /&gt;
Start replication on the slave:&lt;br /&gt;
&lt;br /&gt;
 mysql -e 'START SLAVE;'&lt;br /&gt;
 mysql -e 'SHOW SLAVE STATUS\G'&lt;br /&gt;
&lt;br /&gt;
==== Master Setup (continued) ====&lt;br /&gt;
&lt;br /&gt;
Finally, unset read-only on the master:&lt;br /&gt;
&lt;br /&gt;
 # on the master&lt;br /&gt;
 mysql -e &amp;quot;SET @@global.read_only = OFF;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Configure OX to use with Master/Slave replication ===&lt;br /&gt;
&lt;br /&gt;
Not much special wisdom here. OX was designed to be used with master/slave databases. For the ConfigDB, &amp;lt;code&amp;gt;configdb.properties&amp;lt;/code&amp;gt; allows configuration of a &amp;lt;code&amp;gt;readUrl&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;writeUrl&amp;lt;/code&amp;gt; (both of which are set to the correct values if you use &amp;lt;code&amp;gt;oxinstaller&amp;lt;/code&amp;gt; with the correct arguments &amp;lt;code&amp;gt;--configdb-readhost&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;--configdb-writehost&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
(Obviously, the master is for writing and the slave is for reading.)&lt;br /&gt;
&lt;br /&gt;
For the individiual UserDBs, use &amp;lt;code&amp;gt;registerdatabase -m true&amp;lt;/code&amp;gt; for the masters and &amp;lt;code&amp;gt;registerdatabase -m false -M ...&amp;lt;/code&amp;gt; for the respective slaves.&lt;br /&gt;
&lt;br /&gt;
Be sure to have enabled the replication monitor in &amp;lt;code&amp;gt;configdb.properties&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;com.openexchange.database.replicationMonitor=true&amp;lt;/code&amp;gt; (which it is by default); while GTID can show synchronous semantics, it is specified to silently fall back to asynchronous in certain circumstances, so synchronity is not guaranteed.&lt;br /&gt;
&lt;br /&gt;
We recommend, though, to not register the databases directly by their native hostname or IP, but rather use some kind of HA system in order to be able to easily move a floating/failover IP from the master to the slave in case of master failure. Configuring and running such systems (like, corosync/pacemaker, keepalived, or whatever) is out of scope of this documentation, however.&lt;br /&gt;
&lt;br /&gt;
== Creating Open-Xchange user ==&lt;br /&gt;
&lt;br /&gt;
Now setup access for the Open-Xchange Server database user 'openexchange' to configdb and the oxdb for both groupware server addresses. These databases do not exist yet, but will be created during the Open-Xchange Server installation.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
&lt;br /&gt;
* Please use a real password.&lt;br /&gt;
* The IPs in this example belong to the two different Open-Xchange Servers, please adjust them accordingly.&lt;br /&gt;
* If using a database on the same host as the middlware (usually done for POCs and demo installations), you need to grant also to the ''localhost'' host.&lt;br /&gt;
* Consult [[AppSuite:DB_user_privileges]] (or ''grep GRANT /opt/open-xchange/sbin/initconfigdb'') for an up-to-date list of required privileges. The following statement was correct as of the time of writing this section.&lt;br /&gt;
&lt;br /&gt;
 mysql&amp;gt; GRANT CREATE, LOCK TABLES, REFERENCES, INDEX, DROP, DELETE, ALTER, SELECT, UPDATE, INSERT, CREATE TEMPORARY TABLES, SHOW VIEW, SHOW DATABASES ON *.* TO 'openexchange'@'10.20.30.213' IDENTIFIED BY 'IntyoyntOat1'  WITH GRANT OPTION;&lt;br /&gt;
 mysql&amp;gt; GRANT CREATE, LOCK TABLES, REFERENCES, INDEX, DROP, DELETE, ALTER, SELECT, UPDATE, INSERT, CREATE TEMPORARY TABLES, SHOW VIEW, SHOW DATABASES ON *.* TO 'openexchange'@'10.20.30.215' IDENTIFIED BY 'IntyoyntOat1'  WITH GRANT OPTION;&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX6:OXtender_for_Business_Mobility_Installation_Guide&amp;diff=24914</id>
		<title>OX6:OXtender for Business Mobility Installation Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX6:OXtender_for_Business_Mobility_Installation_Guide&amp;diff=24914"/>
		<updated>2019-10-01T05:12:27Z</updated>

		<summary type="html">&lt;p&gt;Malasa: removed old installation howtos/versions from requirements&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Open-Xchange Connector for Business Mobility =&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
&lt;br /&gt;
With the Connector for Business Mobility, Open-Xchange also introduces the Universal Synchronization Module (USM). This module provides a framework for synchronization protocols such as Microsoft Exchange ActiveSync (EAS) or other services building on this foundation. USM acts as a layer between the Open-Xchange HTTP API and the synchronization protocol. It handles synchronization specific tasks like conflict management.&lt;br /&gt;
The synchronization stack (USM) and protocol implementation (EAS) are shipped as OSGi bundles and run as a plug-in of an Open-Xchange instance.&lt;br /&gt;
&lt;br /&gt;
=== Component Overview ===&lt;br /&gt;
USM, EAS and OX work together as components. This is a general outline about how these components interact.&lt;br /&gt;
&lt;br /&gt;
When the device initiates a synchronization through ActiveSync, it contacts the webserver using the URL /Microsoft-Server-ActiveSync via HTTP/s. This URL is forwarded to the Open-Xchange application server where the corresponding servlet is offered by the EAS component. The EAS component then uses USM to initiate a connection to the OX HTTP API and exchanges groupware data. In all cases, USM works as an client to the Open-Xchange HTTP API. It also uses some database tables which are accessed through the Open-Xchange SQL interface to store metadata like synchronization status. The same component stack is used to transport groupware data back to the device.&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
Since the Connector for Business Mobility is a server plug-in based on the OSGi Framework it can be added to an existing Open-Xchange installation very easily.&lt;br /&gt;
&lt;br /&gt;
'''Please Note:''' To get in favor of the latest minor features and bugfixes, you need to have a valid license.  The article [[UpdatingOXPackages | Updating OX-Packages]] explains how that can be done.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-meta-mobility|sopath=OXtender-stable/BusinessMobilityOXtender|ldbaccount=LDBACCOUNT:LDBPASSWD|reponame=oxmobility}}&lt;br /&gt;
&lt;br /&gt;
Follow this [http://software.open-xchange.com/OX6/doc/BusinessMobilityOXtender/ link] to download the User Manuals in different languages.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now the Open-Xchange groupware and admin service needs to be restarted:&lt;br /&gt;
 /etc/init.d/open-xchange-groupware restart&lt;br /&gt;
 /etc/init.d/open-xchange-admin restart&lt;br /&gt;
&lt;br /&gt;
On the first login after the restart, all required database tables will be created.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-meta-mobility|sopath=6.22/OXtender-stable/BusinessMobilityOXtender|ldbaccount=LDBACCOUNT:LDBPASSWD|reponame=oxmobility|version=v6.22.x}}&lt;br /&gt;
&lt;br /&gt;
=== RedHat Enterprise Linux 5 ===&lt;br /&gt;
'''Please note,''' the last available version for RHEL5 is 6.22.0&lt;br /&gt;
&lt;br /&gt;
 $ vim /etc/yum.repos.d/oxmobility.repo&lt;br /&gt;
 &lt;br /&gt;
 [oxmobility]&lt;br /&gt;
 name=Open-Xchange&lt;br /&gt;
 baseurl=http://LDBACCOUNT:LDBPASSWD@software.open-xchange.com/OX6/6.22/6.22.0/OXtender/BusinessMobilityOXtender/RHEL5/&lt;br /&gt;
 gpgkey=http://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ yum update&lt;br /&gt;
 $ yum install open-xchange-meta-mobility&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Now the Open-Xchange service needs to be restarted:&lt;br /&gt;
&lt;br /&gt;
 /etc/init.d/open-xchange restart&lt;br /&gt;
&lt;br /&gt;
On the first login after the restart, all required database tables will be created.&lt;br /&gt;
&lt;br /&gt;
== Download and Installation on Server Edition / App Suite for UCS ==&lt;br /&gt;
&lt;br /&gt;
If you have purchased the OX Server Edition / App Suite for UCS, the Connector is part of the offering. Installation of the Connector with the following steps:&lt;br /&gt;
&lt;br /&gt;
* The new license is already registered at the LDB after purchase.&lt;br /&gt;
* Log on at the Univention Management Console (UMC)&lt;br /&gt;
* Make sure, that the correct LDB account has been selected in the UMC module &amp;quot;OX License Management&amp;quot;&lt;br /&gt;
* Click on &amp;quot;App Center&amp;quot; at the UMC und switch to the tab &amp;quot;Repository Settings&amp;quot;&lt;br /&gt;
* Within the component list, select &amp;quot;Connector for Business Mobility&amp;quot; and press the &amp;quot;Install&amp;quot; button&lt;br /&gt;
&lt;br /&gt;
== Installation on OX App Suite ==&lt;br /&gt;
The download and installation information for Open-Xchange App Suite product family (Open-Xchange Server Edition and Hosting Edition) is available at: http://oxpedia.org/wiki/index.php?title=AppSuite:Connector_for_Business_Mobility_Installation_Guide&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Mail Push ===&lt;br /&gt;
&lt;br /&gt;
In order to get mail push, either install and configure the package open-xchange-push-malpoll, which is not recommended on large deployments or if you're using cyrus-imap, read the [[MailNotify Bundle‎‎]] instructions on how to set up real mail push with cyrus.&lt;br /&gt;
&lt;br /&gt;
=== Open-Xchange configuration ===&lt;br /&gt;
The configuration for USM and the EAS protocol can be found in these two configuration files:&lt;br /&gt;
 /opt/open-xchange/etc/usm.properties&lt;br /&gt;
 /opt/open-xchange/etc/eas.properties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Make sure that the Open-Xchange Server URL is set properly in usm.properties. This needs to be the machine which provides the web interface. Usually, this is localhost, as the webserver and Open-Xchange run on the same machine.&lt;br /&gt;
 com.openexchange.usm.ox.url=http://localhost/ajax/&lt;br /&gt;
&lt;br /&gt;
in case webserver and Open-Xchange aren't running on the same machine:&lt;br /&gt;
 com.openexchange.usm.ox.url=http://$FQDN/ajax/&lt;br /&gt;
(Where $FQDN is the fully qualified domain name of your frontend system)&lt;br /&gt;
&lt;br /&gt;
On clustered setups, adjust the file&lt;br /&gt;
/opt/open-xchange/etc/noipcheck.cnf&lt;br /&gt;
to include the range of IP addresses of the servers on which USM is running.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Documentation about the configuration parameters can be found inside the configuration files. If you change any attribute at the configuration files, the Open-Xchange groupware service needs to be restarted.&lt;br /&gt;
&lt;br /&gt;
=== Enabling ActiveSync for user accounts ===&lt;br /&gt;
In order to use synchronization through ActiveSync, this feature needs to be activated for user accounts. You can either activate it for specific users or a whole context.&lt;br /&gt;
&lt;br /&gt;
Activating ActiveSync for specific users:&lt;br /&gt;
 /opt/open-xchange/sbin/changeuser -c 1 -A oxadmin -P admin_password -u testuser --access-usm on --access-active-sync on&lt;br /&gt;
&lt;br /&gt;
Activating ActiveSync for a whole context:&lt;br /&gt;
 /opt/open-xchange/sbin/changecontext -c 1 -A oxadminmaster -P admin_master_password --access-usm on --access-active-sync on&lt;br /&gt;
&lt;br /&gt;
== Log files and issue tracking ==&lt;br /&gt;
When facing problems with synchronization, there are several ways to get more information than provided via device or platform specific error codes.&lt;br /&gt;
&lt;br /&gt;
=== Server-side logging: Options ===&lt;br /&gt;
By default, the log output is non verbose. Only severe errors will be logged. To enable a more detailed log output, the logging mechanism needs to be configured. This depends on the used mechanism. &lt;br /&gt;
&lt;br /&gt;
There are three different mechanisms, depending on your server version: If you use 7.4.2 or later, we use ''logback''. Before that, the default was ''commons logging'', unless you explicitly installed ''Log4j''.&lt;br /&gt;
&lt;br /&gt;
==== Logback ====&lt;br /&gt;
As said, this is the default after (and including) 7.4.2. To get more verbose output, simply extend the logback.xml configuration file by the following line:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;logger level=&amp;quot;DEBUG&amp;quot; name=&amp;quot;com.openexchange.usm&amp;quot;/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Commons Logging ====&lt;br /&gt;
This is the default logging mechanism prior to 7.4.2. If the Open-Xchange Server log output is written to ''var/log/open-xchange/open-xchange.log'' it is an indicator that this mechanism is in use. To make the log output more verbose, add the following parameter:&lt;br /&gt;
&lt;br /&gt;
 vim /opt/open-xchange/etc/file-logging.properties&lt;br /&gt;
 [...]&lt;br /&gt;
 com.openexchange.usm.level=FINE&lt;br /&gt;
&lt;br /&gt;
This will enable a software debug log for all components using USM, including EAS after restarting Open-Xchange Server.&lt;br /&gt;
&lt;br /&gt;
==== Log4j ====&lt;br /&gt;
If the package ''open-xchange-log4j'' is installed, Open-Xchange Server will log via a UDP network socket. In most cases a syslog daemon is listening to this socket and will write the log data to a platform specif file like ''/var/log/syslog''. To make the log output more verbose, add the following parameter:&lt;br /&gt;
&lt;br /&gt;
 vim /opt/open-xchange/etc/log4j.xml&lt;br /&gt;
 [...]&lt;br /&gt;
    &amp;lt;category name=&amp;quot;com.openexchange.usm&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;level value=&amp;quot;DEBUG&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;appender-ref ref=&amp;quot;SERVER_LOG&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/category&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please note that the XML syntax must be correct. This will enable a software debug log for all components using USM, including EAS after restarting Open-Xchange Server.&lt;br /&gt;
&lt;br /&gt;
=== Client-side logging: EAS debug logfile ===&lt;br /&gt;
While the generic Open-Xchange Server log file will keep track on errors reported by the software components, the EAS debug log file will print all data transfered to the device as XML. Please note: this log file may contain confidential data about the users personal groupware objects. Make sure that no unauthorized access to those log files is possible in order to maintain privacy. Change the configuration file accordingly and set a output path which can only accessed by authorized persons.&lt;br /&gt;
&lt;br /&gt;
 vim /opt/open-xchange/etc/eas.properties&lt;br /&gt;
 [...]&lt;br /&gt;
 com.openexchange.usm.eas.debug_log=/tmp/EAS-debug.log&lt;br /&gt;
&lt;br /&gt;
This will enable a XML based debug log for all EAS connections, after restarting Open-Xchange Server.&lt;br /&gt;
&lt;br /&gt;
=== Network traffic ===&lt;br /&gt;
When using unencrypted connections between the device and USM and USM and Open-Xchange Server (not recommended), it's possible to analyze the network traffic with tools like ngrep or wireshark. When using encrypted data connections using SSL, the transfered data can be decrypted using the corresponding private key. Please note that there are two network streams, one from the device to USM (external) and one from USM to OX (internal).&lt;br /&gt;
&lt;br /&gt;
== Bug-Reporting == &lt;br /&gt;
Please report bugs via the Open-Xchange Bugzilla:&lt;br /&gt;
&lt;br /&gt;
[https://bugs.open-xchange.com/ Direct link to Open-Xchange Bugzilla]&lt;br /&gt;
&lt;br /&gt;
* Product: Connector for Business Mobility&lt;br /&gt;
&lt;br /&gt;
[[Category: OX6]]&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=TicketSystemCustomerGuide&amp;diff=24880</id>
		<title>TicketSystemCustomerGuide</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=TicketSystemCustomerGuide&amp;diff=24880"/>
		<updated>2019-09-02T11:26:28Z</updated>

		<summary type="html">&lt;p&gt;Malasa: pgp link changed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Author: Maurice de la Ferté &amp;lt;maurice.delaferte@open-xchange.com&amp;gt; --&amp;gt;&lt;br /&gt;
[[Category: Support]]&lt;br /&gt;
&lt;br /&gt;
= Ticket System User Guide for Customers =&lt;br /&gt;
&lt;br /&gt;
==Indroduction==&lt;br /&gt;
Customers with valid support license have access to all their tickets via the Open-Xchange ticket system (OTRS). The ticket system provides additional features for communication between you and Open-xchange, but it is not meant as a full substitution of email conversation. Hence you still have to start new incident requests via email like described at&lt;br /&gt;
&lt;br /&gt;
http://knowledgebase.open-xchange.com/support/contact-support-bug-reporting/contact-support/english.html&lt;br /&gt;
&lt;br /&gt;
This user guide gives an overview about the usage and benefits using this interface.&lt;br /&gt;
&lt;br /&gt;
==Preliminary==&lt;br /&gt;
First you have to know the login name of your Open-Xchange Portal account where the license keys are registered. If your license key doesn't include a support option you don't have access rights to the ticket system.&lt;br /&gt;
&lt;br /&gt;
Please check the used email address of your Portal account via 'Edit your data' inside the license portal, it was used for your ticket system account provisioning and is now disconnected to the Portal account settings. Your ticket system and Portal account passwords are also disconnected and you have to use the password recovery of the ticket system to set the initial password. If you observe a wrong or improper email address in your Portal settings, please contact the Open-Xchange Support so we can use the address of your choice for the ticket system. In case you have purchased a new support option, the ticket system account will be provisioned within 24 hours automatically.&lt;br /&gt;
&lt;br /&gt;
'''Important: Your ticket system login will be disabled automatically in case your support option expires. Please note, this can be caused by date or if the number of allowed requests outrange the contractual limit.'''&lt;br /&gt;
&lt;br /&gt;
==How to get Access==&lt;br /&gt;
The very first time you have to use the password recovery ([https://otrs.open-xchange.com/otrs/customer.pl#Reset Forgot password?]) with the Portal account name of the following link, further steps are described within an email, you will get to the address explain inside the preliminary section:&lt;br /&gt;
&lt;br /&gt;
  Login URL: https://otrs.open-xchange.com/otrs/customer.pl&lt;br /&gt;
&lt;br /&gt;
==Ticket System Overview==&lt;br /&gt;
After login you will enter the overview page 'My Tickets', this view is sadly misleading because it will list only invalid tickets.&lt;br /&gt;
&lt;br /&gt;
[[File:SupportTicketSystemCustomerGuide-OverviewDefault.png]]&lt;br /&gt;
&lt;br /&gt;
'''Important: You have to switch to 'Tickets' --&amp;gt; 'Company tickets' to get the list for valid tickets.'''&lt;br /&gt;
&lt;br /&gt;
[[File:SupportTicketSystemCustomerGuide-OverviewCompany.png]]&lt;br /&gt;
&lt;br /&gt;
'''Overview Top Bar'''&lt;br /&gt;
  Tickets&lt;br /&gt;
    My Tickets --&amp;gt; Default view with invalid only tickets&lt;br /&gt;
    Company tickets --&amp;gt; Relevant company view with valid tickets&lt;br /&gt;
    Search --&amp;gt; Ticket Search&lt;br /&gt;
  Preferences --&amp;gt; Password change, language settings, PGP keys, etc ..&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
You will get a direct link by an auto reply after your initial reporting email, hence it should be very easy to navigate to the ticket you are looking for.&lt;br /&gt;
&lt;br /&gt;
[[File:SupportTicketSystemCustomerGuide-AutoReplyEmailExample.png]]&lt;br /&gt;
&lt;br /&gt;
Once you open the ticket detail view, you will get an overview of important details about ticket number, current state and priority within a small box at upper right of the window. Also you will find a reply button at the bottom left on the page.&lt;br /&gt;
&lt;br /&gt;
[[File:SupportTicketSystemCustomerGuide-TicketDetailView.png]]&lt;br /&gt;
&lt;br /&gt;
By clicking on 'Reply' you are able to give us additional details, add attachments up to 500MB size or close the ticket by your self.&lt;br /&gt;
&lt;br /&gt;
[[File:SupportTicketSystemCustomerGuide-ReplyWindow.png]]&lt;br /&gt;
&lt;br /&gt;
==Personal Data Policy==&lt;br /&gt;
According to German law, companies are forced to handle any (log) files from customers which contain data related to a third person or has any personal protection in a special way. Personal data shall mean any information concerning the personal or material circumstances of an identified or identifiable natural person. Even so they have to be deleted once they aren't used any more. To fulfil this requirement, customers and support agents have to keep the readable ticket communication, in form of email/article body, subject or attachment names, free from any personal data. This can be every thing from names, email addresses, screen-shots, logs files and even credentials to system accounts. This personal data only has to be handed over in form of attachments which was common practice before. Transfer channels for personal data are attachments via the ticket system, attachment in encrypted emails or provided by protected download links. How to send encrypted emails via PGP is described [https://confluence-public.open-xchange.com/display/SKB/How+to+send+an+encrypted+email+to+Open-Xchange+Support here].&lt;br /&gt;
&lt;br /&gt;
The integrity of an 'Incident Request' with all available data needs to be saved up to 90 days after a ticket was closed to ensure a holistic assessment in case of Contractual complaints. This time frame is mandatory and gives also the customer time for detailed tests. In case of reopening an incident within these three months all information is still available and needs not to be recollected by customers and end users.&lt;br /&gt;
&lt;br /&gt;
Open-Xchange introduced a weekly deletion process, the deletion work on ticket attachments and on raw email files which are affected by attachments. The automatic deletion of all ticket attachments takes place weekly at Sunday and affects all tickets which are in a 'closed' state since 90 days.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OXLDAPSync_Guide&amp;diff=24562</id>
		<title>OXLDAPSync Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OXLDAPSync_Guide&amp;diff=24562"/>
		<updated>2019-03-15T06:12:22Z</updated>

		<summary type="html">&lt;p&gt;Malasa: added box for &amp;quot;not supported&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;border:2px solid red; text-align:center; padding: 1em; margin: 0.5em;&amp;quot;&amp;gt;This page is DEPRECATED. oxldapsync is not supported and is outdated.&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|toplevel=components|pluginname=oxldapsync|sopath=unsupported/oxldapsync|reponame=oxldapsync|version=OX 6.22 or newer}}&lt;br /&gt;
&lt;br /&gt;
= How to run OX LDAP Sync =&lt;br /&gt;
&lt;br /&gt;
With OX LDAP Sync you can sync user and group objects from a LDAP compatible&lt;br /&gt;
directory with Open-Xchange. When you modify or add an user to your&lt;br /&gt;
ldap directory oxldapsync will also modify or add the user to Open-Xchange.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
# An LDAP-server (currently openldap and ADS are supported)&lt;br /&gt;
# You need one user distinguished name who at least can search and            read user objects. If you decide to synchronize groups, the ldap user needs to search and read these objects, too.&lt;br /&gt;
# If you want to synchronize groups you need to know if the           membership to the group is defined by the userid or by the           complete distinguished name of the user.&lt;br /&gt;
# User attributes you want to sync with Open-Xchange&lt;br /&gt;
# Open-Xchange must authenticate against the LDAP server instead of the database, which is the default. In order to achieve that, deinstall package &amp;lt;tt&amp;gt;open-xchange-authentication-database&amp;lt;/tt&amp;gt; and install &amp;lt;tt&amp;gt;open-xchange-authentication-ldap&amp;lt;/tt&amp;gt; and configure it accordingly in changing /opt/open-xchange/etc/groupware/ldap.properties. As an alternative, &amp;lt;tt&amp;gt;open-xchange-authentication-imap&amp;lt;/tt&amp;gt; could be used, if your IMAP server authenticates against your LDAP server.&lt;br /&gt;
&lt;br /&gt;
== configuring OX LDAP Sync ==&lt;br /&gt;
&lt;br /&gt;
After installing OXSync you will find the configuration files under&lt;br /&gt;
/opt/oxldapsync/etc. You can use the example configuration files&lt;br /&gt;
ldapsync.conf (openldap) and ldapsyn-ads.conf (Active Directory) as&lt;br /&gt;
starting point.&lt;br /&gt;
&lt;br /&gt;
=== OpenLDAP ===&lt;br /&gt;
&lt;br /&gt;
Open ldapsync in your favourite text editor change following options to your needs:&lt;br /&gt;
&lt;br /&gt;
                ldapuri                     with dns-name or ip of your&lt;br /&gt;
                                            LDAP-Server&lt;br /&gt;
                userbasedn                  distinguished name under which the&lt;br /&gt;
                                            script will find user objects&lt;br /&gt;
                groupbasedn                 distinguished name under which the&lt;br /&gt;
                                            script will find group objects&lt;br /&gt;
                ldaptype                    type of ldap in this case openldap&lt;br /&gt;
                ldapuserdn                  distinguished name of the user&lt;br /&gt;
                                            which will be used to query the&lt;br /&gt;
                                            directory&lt;br /&gt;
                ldapuserpassword            password for the ldapuser&lt;br /&gt;
                mappingfile                 absolute path to your ldap&lt;br /&gt;
                                            attribute -&amp;gt; ox attribute mapping&lt;br /&gt;
                updategroups                &amp;quot;yes&amp;quot; if you want to also sync&lt;br /&gt;
                                            groups with ox&lt;br /&gt;
                updateAliases               shall mail aliases of a user get&lt;br /&gt;
                                            updated with the one from the ldap.&lt;br /&gt;
                                            In case you can name only one&lt;br /&gt;
                                            mailaddress on your directory, say&lt;br /&gt;
                                            no here and you can manually add&lt;br /&gt;
                                            further mailaddresses in ox. They&lt;br /&gt;
                                            will not get deleted by the&lt;br /&gt;
                                            synctool.&lt;br /&gt;
                usemodifytimestamp          set to yes, to update only users&lt;br /&gt;
                                            since last run&lt;br /&gt;
                userfilter                  searchfilter to find user objects,&lt;br /&gt;
                                            internal default&lt;br /&gt;
                                            &amp;quot;(objectClass=inetOrgPerson)&amp;quot;&lt;br /&gt;
                groupfilter                 searchfilter to find group objects,&lt;br /&gt;
                                            internal default&lt;br /&gt;
                                            &amp;quot;(objectClass=posixGroup)&amp;quot;&lt;br /&gt;
                deleteusers                 Say yes if you want to delete users&lt;br /&gt;
                                            in ox which are not in your&lt;br /&gt;
                                            directory and are not named by the&lt;br /&gt;
                                            &amp;quot;dontModifyUids&amp;quot; option&lt;br /&gt;
                deletegroups                say yes to delete empty and non&lt;br /&gt;
                                            existing groups in ldap in ox&lt;br /&gt;
                dontModifyUids              list of comma separeted uid's which&lt;br /&gt;
                                            shall not be modified by the sync&lt;br /&gt;
                                            script. You should note at least&lt;br /&gt;
                                            the contextadmin&lt;br /&gt;
                groupMemberAttribute        name of attribute which holds the&lt;br /&gt;
                                            members in a group object&lt;br /&gt;
                memberAttributeIsDN         say yes if groupMemberAttribute is&lt;br /&gt;
                                            a distinguished name&lt;br /&gt;
                groupDisplayNameAttribute   displayname attribute for group&lt;br /&gt;
                groupNumberAttribute        unique number attribute for group&lt;br /&gt;
                userPrimaryGroupAttribute   attribute name where a users primary&lt;br /&gt;
                                            is stored&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the mapping file you will find ox options to create or modify users. The name on the left side of the equal sign is the name for the ox options. On the right side you name the ldap attribute name for this option. You can also give static values by enclosing them with qoutes.&lt;br /&gt;
&lt;br /&gt;
=== Active Directory ===&lt;br /&gt;
&lt;br /&gt;
For active directory synchronization just modify at least ldapuri, userbasedn, groupbasedn, ldapuserdn and ldapuserpassword.&lt;br /&gt;
&lt;br /&gt;
To run the script type&lt;br /&gt;
&lt;br /&gt;
 $ /opt/oxldapsync/sbin/oxldapsync.pl -f &amp;lt;CONFIG FILENAME&amp;gt; \&lt;br /&gt;
                                    -A &amp;lt;CONTEXT ADMIN USERNAME&amp;gt; \&lt;br /&gt;
                                    -P &amp;lt;CONTEXT ADMIN PASSWORD&amp;gt; \&lt;br /&gt;
                                    -c &amp;lt;CONTEXTID&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Additional parameters are:&lt;br /&gt;
&lt;br /&gt;
                        -h       help message&lt;br /&gt;
                        -n       don't save last user search time&lt;br /&gt;
                        -v       Verbose mode&lt;br /&gt;
                        -s       print messages to stdout&lt;br /&gt;
&lt;br /&gt;
To run this program regularly just create a cronjob&lt;br /&gt;
&lt;br /&gt;
= Troubleshooting =&lt;br /&gt;
== Special chars scrambled ==&lt;br /&gt;
If you run OX LDAP Sync via Cronjob an the umlauts (ä,ö,ü,...) of your entries in the &amp;quot;Global Addressbook&amp;quot; are scrambled, try setting the LANG environment variable in your crontab, e. g. German UTF-8 users should set this to something like this:&lt;br /&gt;
&lt;br /&gt;
 LANG=de_DE.UTF-8&lt;br /&gt;
 #m      h       dom     mon     dow     command&lt;br /&gt;
 0       23      *       *       Sun     /path/to/oxldapsync.pl&lt;br /&gt;
&lt;br /&gt;
For more information on using the crontab please visit [http://tldp.org/LDP/LGNET/151/prestia.html this howto at The Linux Documentation Project].&lt;br /&gt;
&lt;br /&gt;
[[Category: OX6]]&lt;br /&gt;
[[Category: AppSuite]]&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Banner&amp;diff=24280</id>
		<title>AppSuite:Banner</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Banner&amp;diff=24280"/>
		<updated>2018-09-24T08:18:42Z</updated>

		<summary type="html">&lt;p&gt;Malasa: typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version until|7.8.4}}&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Since OX App Suite 7.8.0 it is possible to have a banner on top of the application. &lt;br /&gt;
&lt;br /&gt;
Please Note: This functionality is only supported with v7.8.x.&lt;br /&gt;
&lt;br /&gt;
[[File:Banner.png]]&lt;br /&gt;
&lt;br /&gt;
By default the banner is disabled, to use it edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/settings/appsuite.properties&amp;lt;/code&amp;gt; and add:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
io.ox/core//banner/visible=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To change the default values you have to add them to &amp;lt;code&amp;gt;/opt/open-xchange/etc/as-config.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default:&lt;br /&gt;
    host: all&lt;br /&gt;
    bannerCompany: 'mycompany'&lt;br /&gt;
    bannerProductName: 'myproductname'&lt;br /&gt;
    bannerHeight: 60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
note: the leading spaces are important in a .yml file.&lt;br /&gt;
&lt;br /&gt;
This would enable and change the company/product name for all hosts/users. A more fine grained configuration is possible via the configcascade.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Quick_launcher&amp;diff=24208</id>
		<title>AppSuite:Quick launcher</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Quick_launcher&amp;diff=24208"/>
		<updated>2018-08-01T06:39:19Z</updated>

		<summary type="html">&lt;p&gt;Malasa: init&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;With OX App Suite 7.10 a new concept of starting applications was introduced and replaced the tabs from previous versions.&lt;br /&gt;
&lt;br /&gt;
By default you can switch the applications in the upper right part of the screen on the icon which looks like a numeric keypad.&lt;br /&gt;
&lt;br /&gt;
It is however possible to enable a quick launcher to have the most used applications on the left side.&lt;br /&gt;
&lt;br /&gt;
First you have to set the default configuration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;vim /opt/open-xchange/etc/settings/appsuite.properties&amp;lt;/code&amp;gt; and add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
io.ox/core//apps/quickLaunchCount=3&lt;br /&gt;
io.ox/core//apps/quickLaunch=io.ox/mail/main,io.ox/calendar/main,io.ox/files/main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will enable three new quick launchers, mail, calendar and drive. 3 is the maximum.&lt;br /&gt;
&lt;br /&gt;
To make it possible for the user to change the applications you have to un-protect the setting:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;vim /opt/open-xchange/etc/meta/appsuite.yaml&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
io.ox/core//apps/quickLaunch:&lt;br /&gt;
    protected: false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Note''': as in all yaml files: the leading spaces (4) on the second line are important. &lt;br /&gt;
&lt;br /&gt;
After a restart or &amp;lt;code&amp;gt;reloadconfiguration&amp;lt;/code&amp;gt; of OX App Suite and a re-login you should see three new icons on the left. If you also un-protected the setting you can change the applications in Settings/Basic settings.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=Twitter_Bundles&amp;diff=24184</id>
		<title>Twitter Bundles</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=Twitter_Bundles&amp;diff=24184"/>
		<updated>2018-07-19T09:33:36Z</updated>

		<summary type="html">&lt;p&gt;Malasa: clean up, new screenshots&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Using Twitter with Open-Xchange =&lt;br /&gt;
&lt;br /&gt;
== Preparation ==&lt;br /&gt;
&lt;br /&gt;
You MAY want to replace the standard configuration of twitter integration. This depends on whether you want your own company-name to be shown to users during the twitter authentication process. If you want this please follow these steps:&lt;br /&gt;
&lt;br /&gt;
* Go to https://dev.twitter.com/apps&lt;br /&gt;
* Log into Twitter&lt;br /&gt;
* Click &amp;quot;Create a new application&amp;quot; on the right&lt;br /&gt;
 &lt;br /&gt;
Make sure that you update to the latest version of Open-Xchange Appsuite.&lt;br /&gt;
&lt;br /&gt;
[[File:Twitter_new_01.png]]&lt;br /&gt;
&lt;br /&gt;
* Enter appropriate Information in &amp;quot;Name&amp;quot;, &amp;quot;Description&amp;quot;, &amp;quot;Website&amp;quot; and &amp;quot;Callback URL&amp;quot;. &amp;quot;Callback URL&amp;quot; should be the URL by which the Server is reachable (This is not checked at this moment but may be in the future).&lt;br /&gt;
* Enter the text displayed in the captcha into the textfield below&lt;br /&gt;
* Check &amp;quot;Yes, I agree&amp;quot; under &amp;quot;Developer Rules Of The Road&amp;quot;&lt;br /&gt;
* Click &amp;quot;Create your Twitter application&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Twitter_new_02.png]]&lt;br /&gt;
&lt;br /&gt;
'''Note:''' the callback URL has to be https and with the /ajax/defer path at the end.&lt;br /&gt;
&lt;br /&gt;
* In the following overview click &amp;quot;Keys and Access Tokens&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Twitter_new_04.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* Change in the &amp;quot;Permissions&amp;quot; tab &amp;quot;Read only&amp;quot; to &amp;quot;Read and Write&amp;quot; (should be default)&lt;br /&gt;
* Click &amp;quot;Update settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You can also update:&lt;br /&gt;
* Fill &amp;quot;Organization name&amp;quot; and &amp;quot;Organization website&amp;quot; if wanted&lt;br /&gt;
* Upload a custom application icon if wanted&lt;br /&gt;
&lt;br /&gt;
Edit the file /opt/open-xchange/etc/twitteroauth.properties and insert the key and secret from the settings page above, like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
com.openexchange.oauth.twitter.apiKey=0JtyhCeuc7kZotWGx037jxlsG&lt;br /&gt;
com.openexchange.oauth.twitter.apiSecret=n8y34hSfeLa0kCizUrcnYjeUg49OfIz7De8SiKZ4TKwfKWYppj&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-oauth open-xchange-messaging|toplevel=products |sopath=appsuite/stable/backend |version=App Suite}}&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-oauth|sopath=stable}}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=File:Twitter_new_04.png&amp;diff=24183</id>
		<title>File:Twitter new 04.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=File:Twitter_new_04.png&amp;diff=24183"/>
		<updated>2018-07-19T09:14:23Z</updated>

		<summary type="html">&lt;p&gt;Malasa: Malasa uploaded a new version of &amp;amp;quot;File:Twitter new 04.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=File:Twitter_new_02.png&amp;diff=24182</id>
		<title>File:Twitter new 02.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=File:Twitter_new_02.png&amp;diff=24182"/>
		<updated>2018-07-19T09:11:08Z</updated>

		<summary type="html">&lt;p&gt;Malasa: Malasa uploaded a new version of &amp;amp;quot;File:Twitter new 02.png&amp;amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=Twitter_Bundles&amp;diff=24177</id>
		<title>Twitter Bundles</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=Twitter_Bundles&amp;diff=24177"/>
		<updated>2018-07-18T11:53:21Z</updated>

		<summary type="html">&lt;p&gt;Malasa: added note about correct callback url, see bug 59098&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Using Twitter with Open-Xchange =&lt;br /&gt;
&lt;br /&gt;
== Preparation ==&lt;br /&gt;
&lt;br /&gt;
You MAY want to replace the standard configuration of twitter integration. This depends on whether you want your own company-name to be shown to users during the twitter authentication process. If you want this please follow these steps:&lt;br /&gt;
&lt;br /&gt;
* Go to https://dev.twitter.com/apps&lt;br /&gt;
* Log into Twitter&lt;br /&gt;
* Click &amp;quot;Create a new application&amp;quot; on the right&lt;br /&gt;
&lt;br /&gt;
'''NOTE''': the callback URL changed recently, it has to be '''https://yxz.mycompany.com/ajax/defer''' and not http://xyz.mycompany.com as seen in the screenshots. Note it is https now and has an added path.&lt;br /&gt;
 &lt;br /&gt;
Make sure that you update to the latest version of Open-Xchange Appsuite.&lt;br /&gt;
&lt;br /&gt;
[[File:Twitter_new_01.png]]&lt;br /&gt;
&lt;br /&gt;
* Enter appropriate Information in &amp;quot;Name&amp;quot;, &amp;quot;Description&amp;quot;, &amp;quot;Website&amp;quot; and &amp;quot;Callback URL&amp;quot;. &amp;quot;Callback URL&amp;quot; should be the URL by which the Server is reachable (This is not checked at this moment but may be in the future).&lt;br /&gt;
* Enter the text displayed in the captcha into the textfield below&lt;br /&gt;
* Check &amp;quot;Yes, I agree&amp;quot; under &amp;quot;Developer Rules Of The Road&amp;quot;&lt;br /&gt;
* Click &amp;quot;Create your Twitter application&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Twitter_new_02.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Twitter_new_03.png]]&lt;br /&gt;
&lt;br /&gt;
* In the following overview click &amp;quot;Settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Twitter_new_04.png]]&lt;br /&gt;
&lt;br /&gt;
* Change &amp;quot;Access&amp;quot; from &amp;quot;Read only&amp;quot; to &amp;quot;Read and Write&amp;quot;&lt;br /&gt;
* Fill &amp;quot;Organization name&amp;quot; and &amp;quot;Organization website&amp;quot; if wanted&lt;br /&gt;
* Upload a custom application icon if wanted&lt;br /&gt;
* Click &amp;quot;Update this Twitter application´s settings&amp;quot;&lt;br /&gt;
&lt;br /&gt;
[[File:Twitter_new_05.png]]&lt;br /&gt;
&lt;br /&gt;
* Copy the String under &amp;quot;Consumer key&amp;quot; and paste it into the file &amp;quot;twitter.properties&amp;quot; as parameter &amp;quot;com.openexchange.twitter.consumerKey&amp;quot; (replacing the existing key there)&lt;br /&gt;
&lt;br /&gt;
* Copy the String under &amp;quot;Consumer secret&amp;quot; and paste it into the file &amp;quot;twitter.properties&amp;quot; as parameter &amp;quot;com.openexchange.twitter.consumerSecret&amp;quot; (replacing the existing key there)&lt;br /&gt;
&lt;br /&gt;
[[File:Twitter_new_06.png]]&lt;br /&gt;
&lt;br /&gt;
[[File:Twitter_new_07.png]]&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-oauth open-xchange-messaging|toplevel=products |sopath=appsuite/stable/backend |version=App Suite}}&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-oauth-twitter open-xchange-twitter open-xchange-messaging-twitter|sopath=stable}}&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=My.cnf&amp;diff=24172</id>
		<title>My.cnf</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=My.cnf&amp;diff=24172"/>
		<updated>2018-07-17T11:26:47Z</updated>

		<summary type="html">&lt;p&gt;Malasa: fixed wrong utf8_general_ci instead of utf8mb4_general_ci&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This page lists some performance tuning parameters which we recommend for tuning MySQL database services used for Open-Xchange installations.&lt;br /&gt;
&lt;br /&gt;
We cannot guarantee this is an exhaustive list of required settings. So treat this list of tunings as probably required, but not necessarily sufficient settings for optimal MySQL performance.&lt;br /&gt;
&lt;br /&gt;
Furthermore, as MySQL changes over time, settings which have been correct as of the time of writing may become incorrect later.&lt;br /&gt;
&lt;br /&gt;
However, this list of settings is the result of internal performance testing and real world customer feedback, so it should be valid to some extent.&lt;br /&gt;
&lt;br /&gt;
In the end, proper configuration of the database service for performance, but also consistency, durability and high availability is in the responsibility of the customer.&lt;br /&gt;
&lt;br /&gt;
=== Performance items ===&lt;br /&gt;
&lt;br /&gt;
* You should adjust the &amp;lt;code&amp;gt;innodb_buffer_pool_size&amp;lt;/code&amp;gt; parameter for reasonable memory usage. Our DB sizing is mainly memory-driven and this is where most of the memory goes. Our standard DB machine sizing assumption is 32 GB if MySQL dedicated memory on a 48 GB total memory machine. On such a machine, you would configure 32 GB for the innodb_buffer_pool size, being aware that MySQL does also require memory for other things, in particular there are some also per-connection related memory spendings, which can become substantial if you allow for a lot of maximum concurrent connections. Please watch your memory configuration carefully, use monitoring and tools like mysqltuner.pl.&lt;br /&gt;
&lt;br /&gt;
* On bigger installations you should use &amp;lt;code&amp;gt;innodb_file_per_table = 1&amp;lt;/code&amp;gt;, which is creating single files instead of one big blob. If you change this parameter after the database initialization you have to recreate (like dump/drop and re-import) the tables.&lt;br /&gt;
&lt;br /&gt;
* It can help to put different parts of the mysql datadir (iblog, ibdata) on different filesystems / storage devices. This depends on your infrastructure. Settings herefore are &amp;lt;code&amp;gt;datadir&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;innodb_data_home_dir&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;innodb_log_group_home_dir&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* If your storage is fast (handle a lot of IOPS), you may want to adjust the &amp;lt;code&amp;gt;innodb_io_capacity&amp;lt;/code&amp;gt; setting, which defines a limit for the IOPS MySQL will create. The default is 200, which is sensible for single spindle disks. But if you have storage appliances with a lot of fast SAS drives, or even SSDs, this limit can be increased greatly.&lt;br /&gt;
&lt;br /&gt;
=== Functional items ===&lt;br /&gt;
&lt;br /&gt;
* Query cache is to be switched off; as we found in our own benchmarks and as backed up by upstreams, this hurts performance in load situations with high concurrency. [https://dev.mysql.com/doc/refman/5.7/en/query-cache.htm The query cache is deprecated as of MySQL 5.7.20, and is removed in MySQL 8.0], so we recommend also to switch that off.&lt;br /&gt;
* Starting with App Suite 7.10.0, &amp;lt;code&amp;gt;character_set_server&amp;lt;/code&amp;gt; must be set to &amp;lt;code&amp;gt;utf8mb4&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;collation_server&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;utf8mb4_general_ci&amp;lt;/code&amp;gt;&lt;br /&gt;
* Starting with MySQL 5.7 &amp;lt;code&amp;gt;innodb_strict_mode&amp;lt;/code&amp;gt; must be disabled.&lt;br /&gt;
* Starting with MySQL 5.7 and MariaDB 10.2 &amp;lt;code&amp;gt;sql_mode&amp;lt;/code&amp;gt; must be configured according to belows matrix.&lt;br /&gt;
&lt;br /&gt;
==== SQL mode matrix ====&lt;br /&gt;
&lt;br /&gt;
The default for the &amp;lt;code&amp;gt;sql_mode&amp;lt;/code&amp;gt; setting changes regularly with MariaDB and MySQL releases and is not even consistent anymore between the two derivates. SQL modes affect how data and queries are handled at runtime. Enabling strict modes might lead to errors in terms of failing queries or even update tasks. We strongly recommend the following configuration to avoid according runtime errors:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| sql_mode&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| App Suite 7.8.4&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;| App Suite 7.10.0&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| MySQL 5.6&lt;br /&gt;
| &amp;lt;code&amp;gt;NO_ENGINE_SUBSTITUTION&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;NO_ENGINE_SUBSTITUTION&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| MySQL 5.7&lt;br /&gt;
| &amp;lt;code&amp;gt;NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,ONLY_FULL_GROUP_BY&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| MariaDB 10.1&lt;br /&gt;
| &amp;lt;code&amp;gt;NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! scope=&amp;quot;row&amp;quot;| MariaDB 10.2&lt;br /&gt;
| &amp;lt;code&amp;gt;NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Sample config files ===&lt;br /&gt;
&lt;br /&gt;
For easy deployment we recommend not to edit existing the existing my.cnf file, rather assume the distro provides sane settings for most of the items and override items where needed.&lt;br /&gt;
&lt;br /&gt;
As in MySQL there is a [https://dev.mysql.com/doc/refman/5.7/en/option-files.html last instance wins] semantic in options file parsing, we propose to create a custom include directory &amp;quot;ox.conf.d&amp;quot;, put our custom config files therein, and include this directory as latest directory in /etc/mysql/my.cnf.&lt;br /&gt;
&lt;br /&gt;
To put in that directory, we have one main tuning file called tunings.cnf, one galera-related file if galera is in use, and one more galera host-specific file which contains per-host settings if using galera (separate in a file of its own for easier configuration management).&lt;br /&gt;
&lt;br /&gt;
So, start with adding to the existing my.cnf at the very bottom:&lt;br /&gt;
&lt;br /&gt;
 !includedir /etc/mysql/ox.conf.d/&lt;br /&gt;
&lt;br /&gt;
Create that directory and put in there the generic ox tunings file /etc/mysql/ox.conf.d/tunings.cnf:&lt;br /&gt;
&lt;br /&gt;
 [mysqld]&lt;br /&gt;
 bind-address		 = *&lt;br /&gt;
 &lt;br /&gt;
 #innodb_use_native_aio = 0&lt;br /&gt;
 &lt;br /&gt;
 table_open_cache = 3072&lt;br /&gt;
 table_definition_cache = 4096&lt;br /&gt;
 max_heap_table_size = 64M&lt;br /&gt;
 tmp_table_size = 64M&lt;br /&gt;
 max_connections = 505&lt;br /&gt;
 max_user_connections = 500&lt;br /&gt;
 max_allowed_packet = 16M&lt;br /&gt;
 thread_cache_size = 32&lt;br /&gt;
 query_cache_size = 0&lt;br /&gt;
 query_cache_type = 0&lt;br /&gt;
 default_storage_engine = InnoDB&lt;br /&gt;
 innodb_buffer_pool_size = 32G&lt;br /&gt;
 # the default value in MySQL 5.6.6 and higher is 8 when innodb_buffer_pool_size is greater than or equal to 1GB. Otherwise, the default is 1. &lt;br /&gt;
 innodb_buffer_pool_instances = 32&lt;br /&gt;
 innodb_data_file_path = ibdata1:128M:autoextend&lt;br /&gt;
 innodb_file_per_table = 1&lt;br /&gt;
 # innodb_log_file_size should be 25% of the innodb_buffer_pool_size&lt;br /&gt;
 innodb_log_file_size = 4GB&lt;br /&gt;
 # default and recommended value is 2&lt;br /&gt;
 innodb_log_files_in_group = 2&lt;br /&gt;
 # adjust according to your storage&lt;br /&gt;
 #innodb_io_capacity = 1000&lt;br /&gt;
 &lt;br /&gt;
 # we are unsure about this setting. Newer versions of MariaDB seem to be fine with low (=1) settings for this value.&lt;br /&gt;
 # Traditionally we encountered values up to 4x the number of cores.&lt;br /&gt;
 # Default seems to be number of cores, so let's stick the default&lt;br /&gt;
 # In the end, we need to leave this setting up to you: if you dont get full cpu utilization in cpu-bound situations, this might be a setting to increase.&lt;br /&gt;
 #thread_pool_size = 32&lt;br /&gt;
 &lt;br /&gt;
 binlog_cache_size = 1M&lt;br /&gt;
 sync_binlog = 8&lt;br /&gt;
 binlog_format = row&lt;br /&gt;
 &lt;br /&gt;
 character_set_server = utf8&lt;br /&gt;
 collation_server = utf8_general_ci&lt;br /&gt;
 &lt;br /&gt;
 # This was default_table_type previous to MySQL 5.5&lt;br /&gt;
 default_storage_engine = InnoDB&lt;br /&gt;
 &lt;br /&gt;
 innodb_autoinc_lock_mode = 2&lt;br /&gt;
 &lt;br /&gt;
 # keep until 5.6, deprecated later&lt;br /&gt;
 innodb_locks_unsafe_for_binlog = 1&lt;br /&gt;
 &lt;br /&gt;
 # we found this has huge impact on (galera) performance&lt;br /&gt;
 # default (consistent) setting of 1 greatly severs performance&lt;br /&gt;
 # in galera (or async master-slave) deployments, you might be ok with setting this to 0 or 2,&lt;br /&gt;
 # assuming our consistency / availability comes from replication / other cluster nodes&lt;br /&gt;
 innodb_flush_log_at_trx_commit = 0&lt;br /&gt;
 &lt;br /&gt;
 # for performance testing systems, to not use excessive disk space&lt;br /&gt;
 #expire_logs_days = 1&lt;br /&gt;
 &lt;br /&gt;
 # MySQL 5.7.7 has changed the default to 1. Disable it explicitly to prevent from errors based on invalid data stored by former App Suite or MySQL versions.&lt;br /&gt;
 innodb_strict_mode = 0&lt;br /&gt;
 &lt;br /&gt;
 # The following value refers to App Suite 7.10 on top of MySQL 5.7. For other combinations see the sql mode matrix at http://oxpedia.org/wiki/index.php?title=My.cnf.&lt;br /&gt;
 sql_mode = NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER,ONLY_FULL_GROUP_BY&lt;br /&gt;
&lt;br /&gt;
If using galera, use the following galera configuration file /etc/mysql/ox.conf.d/wsrep.cnf:&lt;br /&gt;
&lt;br /&gt;
 [mysqld]&lt;br /&gt;
 # adjust for your distros SO location&lt;br /&gt;
 wsrep_provider=/usr/lib/libgalera_smm.so&lt;br /&gt;
 &lt;br /&gt;
 # this is the big winner and enables us to switch off OX's replication monitor&lt;br /&gt;
 wsrep_sync_wait=1&lt;br /&gt;
 &lt;br /&gt;
 # pick a unique cluster name&lt;br /&gt;
 wsrep_cluster_name=devcluster&lt;br /&gt;
 # adjust for your IPs / hostnames&lt;br /&gt;
 wsrep_cluster_address=gcomm://10.20.29.68,10.20.29.69,10.20.29.70&lt;br /&gt;
 &lt;br /&gt;
 # put this in host.cnf&lt;br /&gt;
 #wsrep_node_name=...&lt;br /&gt;
 #wsrep_node_address=...&lt;br /&gt;
 &lt;br /&gt;
 wsrep_sst_method=xtrabackup-v2&lt;br /&gt;
 # wsrep_sst_auth if of format username:password&lt;br /&gt;
 # pick whatever you configured on the donor node&lt;br /&gt;
 wsrep_sst_auth=sstuser:...&lt;br /&gt;
 &lt;br /&gt;
 # galera-specific tunings&lt;br /&gt;
 wsrep_slave_threads = 32&lt;br /&gt;
 pxc_strict_mode=ENFORCING&lt;br /&gt;
&lt;br /&gt;
Galera-related host-specific settings go in /etc/mysql/ox.conf.d/host.cnf:&lt;br /&gt;
&lt;br /&gt;
 [mysqld]&lt;br /&gt;
 # the nodes hostname&lt;br /&gt;
 wsrep_node_name=...&lt;br /&gt;
 # and the IP of the wsrep relevant interface, if multiple&lt;br /&gt;
 wsrep_node_address=10.20.29.68&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:DocumentConverterInstall&amp;diff=23942</id>
		<title>AppSuite:DocumentConverterInstall</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:DocumentConverterInstall&amp;diff=23942"/>
		<updated>2018-05-17T13:19:00Z</updated>

		<summary type="html">&lt;p&gt;Malasa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Description =&lt;br /&gt;
&lt;br /&gt;
This is the Open-Xchange implementation of the [[AppSuite:DocumentConverterAPIInstall|Document Converter API]]. While the API is open, the implementation is not licensed under GPL. It maintains the running instances of readerengines, which are headless OpenOffice instances. This behavior can be configured through documenterconverter.properties configuration file. The Document Converter is only available via a valid Open-Xchange license key.&lt;br /&gt;
&lt;br /&gt;
See [[AppSuite:ReaderEngineInstall|Readerengine installation instructions]] for details on the setup of the underlying readerengine.&lt;br /&gt;
&lt;br /&gt;
For a more detailed guide explaining different installation variants, inluding details on installing Document Converter Client in various configurations, visit the [[AppSuite:DocumentConverter_Installation_Guide|Installation Guide]]. The client is required in order to preview documents.&lt;br /&gt;
&lt;br /&gt;
Instructions for manual steps needed for the [[AppSuite:DocumentConverterUpdate782|Update to 7.8.2]] from earlier versions.&lt;br /&gt;
&lt;br /&gt;
The Document Converter is installed according to the following instructions.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-documentconverter-server|toplevel=products|sopath=appsuite/stable/documentconverter|version=App Suite|reponame=documentconverter|ldbaccount=CUSTOMERID:PASSWORD}}&lt;br /&gt;
&lt;br /&gt;
You also have to add the update repository:&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-documentconverter-server|toplevel=components|sopath=documentconverter/updates/7.8.4|version=App Suite|reponame=documentconverter|ldbaccount=CUSTOMERID:PASSWORD}}&lt;br /&gt;
&lt;br /&gt;
[[Category:AppSuite]]&lt;br /&gt;
[[Category:Administrator]]&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=Export_ical/vcard&amp;diff=23803</id>
		<title>Export ical/vcard</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=Export_ical/vcard&amp;diff=23803"/>
		<updated>2018-01-25T04:59:05Z</updated>

		<summary type="html">&lt;p&gt;Malasa: changed user/pw sending in curl&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is an example script that is able to get contacts,appointments,tasks as well as the global addressbook ical/vcard format.&lt;br /&gt;
&lt;br /&gt;
'''NOTE:'''This example does the http request for the login as GET, so user name&lt;br /&gt;
and password is logged in the apache log. The example only works for users that&lt;br /&gt;
are created with the language en_US&lt;br /&gt;
&lt;br /&gt;
 ~/bin&amp;gt; ./extract.sh --help&lt;br /&gt;
 usage ./extract.sh serverurl user password&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 &lt;br /&gt;
 SERVER=http://your.ox.server&lt;br /&gt;
 USER=user@context&lt;br /&gt;
 PASSWORD=userspw&lt;br /&gt;
 &lt;br /&gt;
 test &amp;quot;$1&amp;quot; = &amp;quot;--help&amp;quot; &amp;amp;&amp;amp; echo &amp;quot;usage $0 serverurl user password&amp;quot; &amp;amp;&amp;amp; exit 1&lt;br /&gt;
 &lt;br /&gt;
 test -z $1 || SERVER=$1&lt;br /&gt;
 test -z $2 || USER=$2&lt;br /&gt;
 test -z $3 || PASSWORD=$3&lt;br /&gt;
 &lt;br /&gt;
 CURL='curl -b cookies -c cookies -H Expect: -s -L --location-trusted -k'&lt;br /&gt;
 &lt;br /&gt;
 SESSION=`$CURL --data &amp;quot;name=$USER&amp;amp;password=$PASSWORD&amp;quot; &amp;quot;$SERVER/ajax/login?action=login&amp;quot; \&lt;br /&gt;
         |sed 's/^.*session\&amp;quot;:\&amp;quot;\([0-9A-Fa-f]*\)\&amp;quot;.*$/\1/'`&lt;br /&gt;
 &lt;br /&gt;
 echo $SESSION | grep &amp;quot;error&amp;quot; &amp;amp;&amp;amp; echo &amp;quot;got no session, login failed&amp;quot; &amp;amp;&amp;amp; exit 1&lt;br /&gt;
 &lt;br /&gt;
 P_FOLDERS=`$CURL -X GET &amp;quot;$SERVER/ajax/folders?action=list&amp;amp;columns=1%2C301%2C300%2C307%2C304%2C306%2C302%2C305%2C308%2C311%2C2%2C314%2C313%2C315&amp;amp;session=$SESSION&amp;amp;parent=1&amp;quot;`&lt;br /&gt;
 &lt;br /&gt;
 TASK=&amp;quot;not found&amp;quot;&lt;br /&gt;
 TASK=`echo $P_FOLDERS | sed 's/,\&amp;quot;tasks\&amp;quot;.*$//' | sed 's/.*\[\([0-9]*\)$/\1/'`&lt;br /&gt;
 CAL=&amp;quot;not found&amp;quot;&lt;br /&gt;
 CAL=`echo $P_FOLDERS | sed 's/,\&amp;quot;calendar\&amp;quot;.*$//' | sed 's/.*\[\([0-9]*\)$/\1/'`&lt;br /&gt;
 CON=&amp;quot;not found&amp;quot;&lt;br /&gt;
 CON=`echo $P_FOLDERS | sed 's/,\&amp;quot;contacts\&amp;quot;.*$//' | sed 's/.*\[\([0-9]*\)$/\1/'`&lt;br /&gt;
 &lt;br /&gt;
 echo ------------------------------------------------------&lt;br /&gt;
 echo exporting private task folder $TASK:&lt;br /&gt;
 echo ------------------------------------------------------&lt;br /&gt;
 $CURL $URL -X GET &amp;quot;$SERVER/ajax/export?action=ICAL&amp;amp;session=$SESSION&amp;amp;folder=$TASK&amp;quot;&lt;br /&gt;
 echo ------------------------------------------------------&lt;br /&gt;
 echo exporting private calendar folder $CAL:&lt;br /&gt;
 echo ------------------------------------------------------&lt;br /&gt;
 $CURL $URL -X GET &amp;quot;$SERVER/ajax/export?action=ICAL&amp;amp;session=$SESSION&amp;amp;folder=$CAL&amp;quot;&lt;br /&gt;
 echo ------------------------------------------------------&lt;br /&gt;
 echo exporting private contacts folder $CON:&lt;br /&gt;
 echo ------------------------------------------------------&lt;br /&gt;
 $CURL $URL -X GET &amp;quot;$SERVER/ajax/export?action=VCARD&amp;amp;session=$SESSION&amp;amp;folder=$CON&amp;quot;&lt;br /&gt;
 echo ------------------------------------------------------&lt;br /&gt;
 echo &amp;quot;exporting global address book contacts folder 6:&amp;quot;&lt;br /&gt;
 echo ------------------------------------------------------&lt;br /&gt;
 $CURL $URL -X GET &amp;quot;$SERVER/ajax/export?action=VCARD&amp;amp;session=$SESSION&amp;amp;folder=6&amp;quot;&lt;br /&gt;
 echo ------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
[[Category: OX6]]&lt;br /&gt;
[[Category: Command line]]&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=23459</id>
		<title>AppSuite:Filestorages</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=23459"/>
		<updated>2017-05-30T04:32:18Z</updated>

		<summary type="html">&lt;p&gt;Malasa: path not etc/groupware anymore&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Common preparations =&lt;br /&gt;
This page shows how to setup external file stores. For all of these file stores you have to install the package &amp;quot;open-xchange-oauth&amp;quot;, which provides the necessary authentication mechanisms.&lt;br /&gt;
&lt;br /&gt;
Moreover your setup is required to be reachable via HTTPS, since the providers expect that a call-back URL to your setup is specified. Such a call-back URL is only accepted if it contains the &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://&amp;quot;&amp;lt;/source&amp;gt; scheme., e.g.:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
 &amp;quot;https://my.oxsetup.invalid/ajax/defer&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Keep HTTPS protocol ==&lt;br /&gt;
[[Appsuite:Grizzly#Cluster_setup]] shows that HTTPS communication is terminated by the Apache balancer in front of the Open-Xchange nodes. To let the Open-Xchange application know about the HTTPS protocol that is used to communicate with the Apache server:&lt;br /&gt;
* Either set a special header in the SSL virtual hosts configurations in Apache to forward this information. The de facto standard for this is the &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;X-Forwarded-Proto&amp;quot;&amp;lt;/source&amp;gt; header. See [[Appsuite:Grizzly#X-FORWARDED-PROTO_Header]] for how to setup that header.&lt;br /&gt;
* Or force the Open-Xchange application to assume it is reached via SSL through setting property &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;properties&amp;quot;&amp;gt;&amp;quot;com.openexchange.forceHTTPS=true&amp;quot;&amp;lt;/source&amp;gt; in file ''/opt/open-xchange/etc/server.properties''.&lt;br /&gt;
&lt;br /&gt;
== Deferrer URL ==&lt;br /&gt;
Open-Xchange application uses the deferrer URL as call-back for some of the providers, which use OAuth v2.0 authentication (such as Google).&lt;br /&gt;
&lt;br /&gt;
If your OX server is reachable only via one host name, you won't have to do anything. If it is reachable by more than one host name, create or open the file ''/opt/openexchange/etc/deferrer.properties'' and set the properties therein as such:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.http.deferrer.url=https://mymaindomain.invalid&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Dropbox =&lt;br /&gt;
&lt;br /&gt;
To setup the Dropbox file store you have to install the package &amp;quot;open-xchange-file-storage-dropbox&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Registering your app ==&lt;br /&gt;
* Log in to your Dropbox account [https://www.dropbox.com/login here], and create your Dropbox app [https://www.dropbox.com/developers/apps/create here]&lt;br /&gt;
* There are two options available creating an app, Drops-in App &amp;amp; Dropbox API App. Please select '''Dropbox API''' app and enter the name of your app.&lt;br /&gt;
* Go to [https://www.dropbox.com/developers/apps App Console] and select your created app. Select settings tab to view the &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;APP_KEY&amp;lt;/source&amp;gt; (App key) and &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;SECRET_KEY&amp;lt;/source&amp;gt; (App secret)&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
In addition you have to configure the following properties in file ''/opt/open-xchange/etc/dropboxoauth.properties'':&lt;br /&gt;
&lt;br /&gt;
* Enable the OAuth connector to Dropbox OAuth&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.dropbox=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the API key and secret&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.dropbox.apiKey=REPLACE_THIS_WITH_DROPBOX_APP_KEY&lt;br /&gt;
 com.openexchange.oauth.dropbox.apiSecret=REPLACE_THIS_WITH_DROPBOX_APP_SECRET&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the redirect URL. Please ensure the following conditions are met:&lt;br /&gt;
** The redirect URL specified in the Dropbox App needs to be the same as the one specified by this   property.&lt;br /&gt;
** The redirect URI uses &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://&amp;quot;&amp;lt;/source&amp;gt; as protocol&lt;br /&gt;
** The redirect URI follows the pattern: &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://&amp;quot; + &amp;lt;host-name&amp;gt; + &amp;quot;/ajax/defer&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.dropbox.redirectUrl=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
E.g. &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://myappsuite.mydomain.invalid/ajax/defer&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the product ID of the registered Dropbox app&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.dropbox.productName=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can define them system-wide or via the config cascade mechanism.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-file-storage-dropbox|toplevel=products|sopath=appsuite/stable/backend|version=App Suite}}&lt;br /&gt;
&lt;br /&gt;
= Google Drive = &lt;br /&gt;
&lt;br /&gt;
To setup the Google Drive file store you have to install the package &amp;quot;open-xchange-file-storage-googledrive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Registering your app ==&lt;br /&gt;
* Sign in to [https://console.developers.google.com/ Google Developers Console] using your Google account&lt;br /&gt;
* Please follow [https://developers.google.com/identity/sign-in/web/devconsole-project these] instructions to create a new project with a client ID, which is needed to call the sign-in API&lt;br /&gt;
* Enable the following APIs for your project&lt;br /&gt;
** BigQuery API&lt;br /&gt;
** Calendar API&lt;br /&gt;
** Contacts API&lt;br /&gt;
** Drive API&lt;br /&gt;
** Drive SDK&lt;br /&gt;
** Gmail API&lt;br /&gt;
** Google Cloud SQL&lt;br /&gt;
** Google Cloud Storage&lt;br /&gt;
** Google Cloud Storage JSON API&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
In addition you have to configure the following properties in file ''/opt/open-xchange/etc/googleoauth.properties'':&lt;br /&gt;
&lt;br /&gt;
* Enable the OAuth connector to Google OAuth&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.google=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the API key and secret, which is Client ID and Client Secret to call the sign-in API (Select your project, select API manager from upper left burger menu, select credentials in left side bar, select Client ID for Web application)&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.google.apiKey=REPLACE_THIS_WITH_YOUR_CLIENT_ID&lt;br /&gt;
 com.openexchange.oauth.google.apiSecret=REPLACE_THIS_WITH_YOUR_CLIENT_SECRET&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the redirect URL. Please ensure the following conditions are met:&lt;br /&gt;
** The redirect URL specified in the Google App needs to be the same as the one specified by this   property.&lt;br /&gt;
** The redirect URI uses &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://&amp;quot;&amp;lt;/source&amp;gt; as protocol&lt;br /&gt;
** The redirect URI follows the pattern: &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://&amp;quot; + &amp;lt;host-name&amp;gt; + &amp;quot;/ajax/defer&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.google.redirectUrl=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
E.g. &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://myappsuite.mydomain.invalid/ajax/defer&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the product ID of the registered Google app&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.google.productName=&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can define them system-wide or via the config cascade mechanism.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-file-storage-googledrive|toplevel=products|sopath=appsuite/stable/backend|version=App Suite}}&lt;br /&gt;
&lt;br /&gt;
= Microsoft Onedrive =&lt;br /&gt;
To setup the Microsoft OneDrive file store you have to install the package &amp;quot;open-xchange-file-storage-onedrive&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Registering your app ==&lt;br /&gt;
* Please follow [https://msdn.microsoft.com/en-us/library/ff751474.aspx this guide] to create/register your app&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
In addition you have to configure the following properties in file ''/opt/open-xchange/etc/msliveconntectoauth.properties'':&lt;br /&gt;
&lt;br /&gt;
* Enable the OAuth connector&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.msliveconnect=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the API key and secret&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.msliveconnect.apiKey=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_CLIENT_KEY&lt;br /&gt;
 com.openexchange.oauth.msliveconnect.apiSecret=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_CLIENT_SECRET&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the redirect URL&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.msliveconnect.redirectUrl=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_REDIRECT_URL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can define them system-wide or via the config cascade mechanism.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-file-storage-onedrive|toplevel=products|sopath=appsuite/stable/backend|version=App Suite}}&lt;br /&gt;
&lt;br /&gt;
= Box.com = &lt;br /&gt;
To setup the Box.com file store you have to install the package &amp;quot;open-xchange-file-storage-boxcom&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== Registering your app ==&lt;br /&gt;
* Sign in to [https://developers.box.com/ box Developers]&lt;br /&gt;
* Select '''Create a Box Application'''&lt;br /&gt;
* Select '''Box Content'''&lt;br /&gt;
* Hit '''Configure your application'''&lt;br /&gt;
* Enter ''redirect_uri''' (the deferrer URL; e.g. &amp;lt;source enclose=&amp;quot;none&amp;quot; lang=&amp;quot;java&amp;quot;&amp;gt;&amp;quot;https://my.oxsetup.invalid/ajax/defer&amp;quot;&amp;lt;/source&amp;gt;)&lt;br /&gt;
* Enable ''Read and write all files and folders''&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
In addition you have to configure the following properties in file ''/opt/open-xchange/etc/boxcomoauth.properties'':&lt;br /&gt;
&lt;br /&gt;
* Enable the OAuth connector&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.boxcom=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the API key and secret&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.boxcom.apiKey=REPLACE_THIS_WITH_YOUR_BOX_CLIENT_KEY&lt;br /&gt;
 com.openexchange.oauth.boxcom.apiSecret=REPLACE_THIS_WITH_YOUR_BOX_CLIENT_SECRET&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Set the redirect URL&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;properties&amp;quot;&amp;gt;&lt;br /&gt;
 com.openexchange.oauth.boxcom.redirectUrl=REPLACE_THIS_WITH_YOUR_BOX_REDIRECT_URL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can define them system-wide or via the config cascade mechanism.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-file-storage-boxcom|toplevel=products|sopath=appsuite/stable/backend|version=App Suite}}&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:OX_Guard&amp;diff=23141</id>
		<title>AppSuite:OX Guard</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:OX_Guard&amp;diff=23141"/>
		<updated>2017-03-22T08:08:33Z</updated>

		<summary type="html">&lt;p&gt;Malasa: /* Apache */ wrong location proxypass&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OX Guard (Version 2.4+ )=&lt;br /&gt;
&lt;br /&gt;
For previous versions of OX Guard, please click here&lt;br /&gt;
* [[AppSuite:OX_Guard_2-0|Installation and information of OX Guard 2.0 - 2.2]]&lt;br /&gt;
&lt;br /&gt;
If upgrading from 2.0 or 2.2, please see the following article&lt;br /&gt;
* [[Appsuite:OX_Guard_Upgrade_OSGI|Upgrading from 2.0 or 2.2 to 2.4]]&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
OX Guard is a fully integrated security add-on to OX App Suite that provides end users with a flexible email and file encryption solution. OX Guard is a highly scalable, multi server, feature rich solution that is so simple-to-use that end users will actually use it. With a single click a user can take control of their security and send secure emails and share encrypted files. This can be done from any device to both OX App Suite and non-OX App Suite users.&lt;br /&gt;
&lt;br /&gt;
OX Guard uses standard PGP encryption for the encryption of email and files. PGP has been around for a long time, yet has not really caught on with the masses. This is generally blamed on the confusion and complications of managing the keys, understanding trust, PGP format types, and lack of trusted central key repositories. Guard simplifies all of this, making PGP encryption as easy as a one click process, with no keys to keep track of, yet the options of advanced PGP management for those that know how.&lt;br /&gt;
&lt;br /&gt;
This article will guide you through the installation of Guard and describes the basic configuration and software requirements. As it is intended as a quick walk-through it assumes an existing installation of the operating system including a single server App Suite setup as well as average system administration skills. This guide will also show you how to setup a basic installation with none of the typically used distributed environment settings. The objective of this guide is:&lt;br /&gt;
&lt;br /&gt;
* To setup a single server installation&lt;br /&gt;
* To setup a single Guard instance on an existing Open-Xchange installation, no cluster&lt;br /&gt;
* To use the database service on the existing Open-Xchange installation for Guard, no replication&lt;br /&gt;
* To provide a basic configuration setup, no mail server configuration&lt;br /&gt;
&lt;br /&gt;
=== Key Features ===&lt;br /&gt;
&lt;br /&gt;
* Simple security at the touch of a button&lt;br /&gt;
* Provides user based security - Separate from provider&lt;br /&gt;
* Supplementary security to Provider based security - Layered&lt;br /&gt;
* Powerful features yet simple to use and understand&lt;br /&gt;
* Security - Inside and outside of the OX environment&lt;br /&gt;
* Email and Drive integration&lt;br /&gt;
* Uses proven PGP security&lt;br /&gt;
&lt;br /&gt;
=== Availability ===&lt;br /&gt;
&lt;br /&gt;
If an OX App Suite customer would like to evaluate OX Guard integration, the first step is to contact OX Sales. OX Sales will then work on the request and send prices and license/API (for the hosted infrastructure) key details to the customer.&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
Please review [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_System_Requirements#OX_Guard OX Guard Requirements] for a full list of requirements.&lt;br /&gt;
&lt;br /&gt;
Since OX Guard is a Microservice it can either be added to an existing Open-Xchange installation or it can be deployed on a dedicated environment. OX App Suite v7.8.1 or later is required to operate this extension both in a single or multi server environments.&lt;br /&gt;
&lt;br /&gt;
==== Prerequisites ====&lt;br /&gt;
&lt;br /&gt;
* Open-Xchange REST API&lt;br /&gt;
* Grizzly HTTP connector (open-xchange-grizzly)&lt;br /&gt;
* A supported Java Virtual Machine (Java 7)&lt;br /&gt;
* An Open-Xchange App Suite installation v7.8.1 or later&lt;br /&gt;
* Please Note: To get access to the latest minor features and bug fixes, you need to have a valid license. The article [https://oxpedia.org/wiki/index.php?title=AppSuite:UpdatingOXPackages Updating OX-Packages] explains how that can be done.&lt;br /&gt;
&lt;br /&gt;
==== Version Matrix ====&lt;br /&gt;
{|&lt;br /&gt;
! style=&amp;quot;text-align:left;&amp;quot;| Core Version&lt;br /&gt;
! Guard Version&lt;br /&gt;
|-&lt;br /&gt;
|7.8.1&lt;br /&gt;
|2.4.0 or 2.4.2&lt;br /&gt;
|-&lt;br /&gt;
|7.8.2&lt;br /&gt;
|2.4.2&lt;br /&gt;
|-&lt;br /&gt;
|7.8.3&lt;br /&gt;
|2.6.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Important Notes ===&lt;br /&gt;
&lt;br /&gt;
==== Customisation ====&lt;br /&gt;
&lt;br /&gt;
OX Guard version supports branding / theming using the configuration cascade, defining a templateID for a user or context. Check the [https://oxpedia.org/wiki/index.php?title=AppSuite:GuardCustomization OX Guard Customisation] article for more details.&lt;br /&gt;
&lt;br /&gt;
==== Mail Resolver ====&lt;br /&gt;
&lt;br /&gt;
READ THIS VERY CAREFULLY; BEFORE PROCEEDING WITH GUARD INSTALLATION!&lt;br /&gt;
&lt;br /&gt;
The Guard installation must be able to determine if an email recipient is a local OX user or if it should be a guest account. The default MailResolver uses the context domain name to do this. On many installations, domains may extend across multiple context and multiple database shards. In these cases, the default MailResolver won't work. In addition, if a custom authentication package is used, the Mail Resolver will likely not work.&lt;br /&gt;
&lt;br /&gt;
Once Guard is installed, please be sure to test the mail resolver using:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;/opt/open-xchange/sbin/guard test email@domain&amp;lt;/source&amp;gt;&lt;br /&gt;
to see if the mail Resolver works.&lt;br /&gt;
&lt;br /&gt;
If the test does not work, you will likely need a custom Mail Resolver. Please see [https://oxpedia.org/wiki/index.php?title=AppSuite:GuardMailResolver Mail Resolver] page&lt;br /&gt;
&lt;br /&gt;
This resolver software ''depends heavily on your local deployment''.&lt;br /&gt;
&lt;br /&gt;
== Download and Installation ==&lt;br /&gt;
&lt;br /&gt;
=== General ===&lt;br /&gt;
&lt;br /&gt;
The installation of the &amp;lt;code&amp;gt;open-xchange-backend-plugin&amp;lt;/code&amp;gt; package which is required for Guard and the main &amp;lt;code&amp;gt;open-xchange-guard&amp;lt;/code&amp;gt; package in version 2.4.0 will eventually execute database update tasks if installed and activated. Please take this into account.&lt;br /&gt;
&lt;br /&gt;
There are several components to the Guard service. They can be all installed on the same server as the OX middleware or on a separate server.&lt;br /&gt;
&lt;br /&gt;
The components required for the OX middleware are: &amp;lt;code&amp;gt;open-xchange-rest&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-guard-backend-plugin&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The components required for the OX frontend are: &amp;lt;code&amp;gt;open-xchange-guard-ui&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;open-xchange-guard-ui-static&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;open-xchange-guard-reader&amp;lt;/code&amp;gt; and optionally &amp;lt;code&amp;gt;open-xchange-guard-help-en-us&amp;lt;/code&amp;gt; (or preferred language for help files)&lt;br /&gt;
&lt;br /&gt;
The components required for the Guard server &amp;lt;code&amp;gt;open-xchange-guard&amp;lt;/code&amp;gt; and either &amp;lt;code&amp;gt;open-xchange-guard-file-storage&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;open-xchange-guard-s3-storage&amp;lt;/code&amp;gt; depending on what storage you want to use. The examples below make use of the &amp;lt;code&amp;gt;open-xchange-guard-file-storage&amp;lt;/code&amp;gt;. Adjust the commands accordingly to fit your needs. In addition &amp;lt;code&amp;gt;open-xchange&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-core&amp;lt;/code&amp;gt; are required to run OX Guard.&lt;br /&gt;
&lt;br /&gt;
=== Debian Linux 7.0 (Wheezy) (valid until v2.4.2) ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange apt configuration:&lt;br /&gt;
&lt;br /&gt;
 deb https://software.open-xchange.com/products/guard/2.4.2/guard/DebianWheezy /&lt;br /&gt;
 deb https://software.open-xchange.com/products/appsuite/7.8.2/backend/DebianWheezy /&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and then run for a single node installation:&lt;br /&gt;
&lt;br /&gt;
 $ apt-get update&lt;br /&gt;
 $ apt-get install open-xchange-rest open-xchange-guard open-xchange-guard-file-storage open-xchange-guard-ui open-xchange-guard-ui-static open-xchange-guard-backend-plugin open-xchange-guard-reader&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or the following for a distributed installation:&lt;br /&gt;
&lt;br /&gt;
 $ apt-get update&lt;br /&gt;
 $ apt-get install open-xchange-guard open-xchange-guard-file-storagec&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The packages &amp;lt;code&amp;gt;open-xchange-guard-ui&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;open-xchange-rest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-guard-backend-plugin&amp;lt;/code&amp;gt; missing in the distributed installation have to be installed on the node running the middleware.  The packages &amp;lt;code&amp;gt;open-xchange-guard-ui-static&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-guard-reader&amp;lt;/code&amp;gt; must be installed in the frontend (apache node).&lt;br /&gt;
&lt;br /&gt;
=== Debian Linux 8.0 (Jessie) ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange apt configuration:&lt;br /&gt;
&lt;br /&gt;
 deb https://software.open-xchange.com/products/guard/stable/guard/DebianJessie /&lt;br /&gt;
 deb https://software.open-xchange.com/products/appsuite/stable/backend/DebianJessie /&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and then run for a single node installation:&lt;br /&gt;
&lt;br /&gt;
 $ apt-get update&lt;br /&gt;
 $ apt-get install open-xchange-rest open-xchange-guard open-xchange-guard-file-storage open-xchange-guard-ui open-xchange-guard-ui-static open-xchange-guard-backend-plugin open-xchange-guard-reader&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or the following for a distributed installation:&lt;br /&gt;
&lt;br /&gt;
 $ apt-get update&lt;br /&gt;
 $ apt-get install open-xchange-guard open-xchange-guard-file-storage&amp;lt;/source&amp;gt;&lt;br /&gt;
The packages &amp;lt;code&amp;gt;open-xchange-guard-ui&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;open-xchange-rest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-guard-backend-plugin&amp;lt;/code&amp;gt; missing in the distributed installation have to be installed on the node running the middleware.  The packages &amp;lt;code&amp;gt;open-xchange-guard-ui-static&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-guard-reader&amp;lt;/code&amp;gt; must be installed in the frontend (apache node).&lt;br /&gt;
&lt;br /&gt;
=== RedHat Enterprise Linux 6 or CentOS 6 ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange yum configuration:&lt;br /&gt;
&lt;br /&gt;
 [open-xchange-guard-stable-guard]&lt;br /&gt;
 name=Open-Xchange-guard-stable-guard&lt;br /&gt;
 baseurl=https://software.open-xchange.com/products/guard/stable/guard/RHEL6/&lt;br /&gt;
 gpgkey=https://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
&lt;br /&gt;
 [ox-backend]&lt;br /&gt;
 name=Open-Xchange-backend&lt;br /&gt;
 baseurl=https://software.open-xchange.com/products/appsuite/stable/backend/RHEL6/&lt;br /&gt;
 gpgkey=https://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and then run for a single node installation:&lt;br /&gt;
&lt;br /&gt;
 $ yum update&lt;br /&gt;
 $ yum install open-xchange-rest open-xchange-guard open-xchange-guard-file-storage open-xchange-guard-ui open-xchange-guard-ui-static open-xchange-guard-backend-plugin open-xchange-guard-reader&amp;lt;/source&amp;gt;&lt;br /&gt;
or the following for a distributed installation:&lt;br /&gt;
&lt;br /&gt;
 $ yum update&lt;br /&gt;
 $ yum install open-xchange-guard open-xchange-guard-file-storage&amp;lt;/source&amp;gt;&lt;br /&gt;
The packages &amp;lt;code&amp;gt;open-xchange-guard-ui&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;open-xchange-rest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-guard-backend-plugin&amp;lt;/code&amp;gt; missing in the distributed installation have to be installed on the node running the middleware.  The packages &amp;lt;code&amp;gt;open-xchange-guard-ui-static&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-guard-reader&amp;lt;/code&amp;gt; must be installed in the frontend (apache node).&lt;br /&gt;
&lt;br /&gt;
=== Redhat Enterprise Linux 7 or CentOS 7 ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange yum configuration:&lt;br /&gt;
&lt;br /&gt;
 [open-xchange-guard-stable-guard]&lt;br /&gt;
 name=Open-Xchange-guard-stable-guard&lt;br /&gt;
 baseurl=https://software.open-xchange.com/products/guard/stable/guard/RHEL7/&lt;br /&gt;
 gpgkey=https://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
&lt;br /&gt;
 [ox-backend]&lt;br /&gt;
 name=Open-Xchange-backend&lt;br /&gt;
 baseurl=https://software.open-xchange.com/products/appsuite/stable/backend/RHEL7/&lt;br /&gt;
 gpgkey=https://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and then run for a single node installation:&lt;br /&gt;
&lt;br /&gt;
 $ yum update&lt;br /&gt;
 $ yum install open-xchange-rest open-xchange-guard open-xchange-guard-file-storage open-xchange-guard-ui open-xchange-guard-ui-static open-xchange-guard-backend-plugin&amp;lt;/source&amp;gt;&lt;br /&gt;
or the following for a distributed installation:&lt;br /&gt;
&lt;br /&gt;
 $ yum update&lt;br /&gt;
 $ yum install open-xchange-guard open-xchange-guard-file-storage&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The packages &amp;lt;code&amp;gt;open-xchange-guard-ui&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;open-xchange-rest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-guard-backend-plugin&amp;lt;/code&amp;gt; missing in the distributed installation have to be installed on the node running the middleware.  The packages &amp;lt;code&amp;gt;open-xchange-guard-ui-static&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-guard-reader&amp;lt;/code&amp;gt; must be installed in the frontend (apache node).&lt;br /&gt;
&lt;br /&gt;
=== SUSE Linux Enterprise Server 11 (valid until v2.4.2) ===&lt;br /&gt;
&lt;br /&gt;
Add the package repository using zypper if not already present:&lt;br /&gt;
&lt;br /&gt;
 $ zypper ar https://software.open-xchange.com/products/guard/2.4.2/guard/SLES11 guard-stable-guard&lt;br /&gt;
 $ zypper ar https://software.open-xchange.com/products/appsuite/7.8.2/backend/SLES11 ox-backend&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and then run for a single node installation:&lt;br /&gt;
&lt;br /&gt;
 $ zypper ref&lt;br /&gt;
 $ zypper in open-xchange-rest open-xchange-guard open-xchange-guard-file-storage open-xchange-guard-ui open-xchange-guard-ui-static open-xchange-guard-backend-plugin open-xchange-guard-reader&amp;lt;/source&amp;gt;&lt;br /&gt;
or the following for a distributed installation:&lt;br /&gt;
&lt;br /&gt;
 $ zypper ref&lt;br /&gt;
 $ zypper in open-xchange-guard open-xchange-guard-file-storage&amp;lt;/source&amp;gt;&lt;br /&gt;
The packages &amp;lt;code&amp;gt;open-xchange-guard-ui&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;open-xchange-rest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-guard-backend-plugin&amp;lt;/code&amp;gt; missing in the distributed installation have to be installed on the node running the middleware.  The packages &amp;lt;code&amp;gt;open-xchange-guard-ui-static&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-guard-reader&amp;lt;/code&amp;gt; must be installed in the frontend (apache node).&lt;br /&gt;
&lt;br /&gt;
Guard requires Java 1.7, which will be installed through the Guard packages, still SUSE Linux Enterprise Server 11 will not use Java 1.7 by default. Therefore we have to set Java 1.7 as the default instead of Java 1.6:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ update-alternatives --config java&amp;lt;/source&amp;gt;&lt;br /&gt;
Now select the Java 1.7 JRE, example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;There are 2 alternatives which provide 'java'.&lt;br /&gt;
&lt;br /&gt;
  Selection    Alternative&lt;br /&gt;
-----------------------------------------------&lt;br /&gt;
*         1    /usr/lib64/jvm/jre-1.6.0-ibm/bin/java&lt;br /&gt;
 +        2    /usr/lib64/jvm/jre-1.7.0-ibm/bin/java&lt;br /&gt;
&lt;br /&gt;
Press enter to keep the default[*], or type selection number: 2&lt;br /&gt;
Using '/usr/lib64/jvm/jre-1.7.0-ibm/bin/java' to provide 'java'.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SUSE Linux Enterprise Server 12 ===&lt;br /&gt;
&lt;br /&gt;
Add the package repository using zypper if not already present:&lt;br /&gt;
&lt;br /&gt;
 $ zypper ar https://software.open-xchange.com/products/guard/stable/guard/SLE_12 guard-stable-guard&lt;br /&gt;
 $ zypper ar https://software.open-xchange.com/products/appsuite/stable/backend/SLE_12 ox-backend&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and then run for a single node installation:&lt;br /&gt;
&lt;br /&gt;
 $ zypper ref&lt;br /&gt;
 $ zypper in open-xchange-rest open-xchange-guard open-xchange-guard-file-storage open-xchange-guard-ui open-xchange-guard-ui-static open-xchange-guard-reader&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or the following for a distributed installation:&lt;br /&gt;
&lt;br /&gt;
 $ zypper ref&lt;br /&gt;
 $ zypper in open-xchange-guard open-xchange-guard-file-storage&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The packages &amp;lt;code&amp;gt;open-xchange-guard-ui&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;open-xchange-rest&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-guard-backend-plugin&amp;lt;/code&amp;gt; missing in the distributed installation have to be installed on the node running the middleware.  The packages &amp;lt;code&amp;gt;open-xchange-guard-ui-static&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;open-xchange-guard-reader&amp;lt;/code&amp;gt; must be installed in the frontend (apache node).&lt;br /&gt;
&lt;br /&gt;
Guard requires Java 1.7, which will be installed through the Guard packages, still SUSE Linux Enterprise Server 11 will not use Java 1.7 by default. Therefor we have to set Java 1.7 as the default instead of Java 1.6:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ update-alternatives --config java&amp;lt;/source&amp;gt;&lt;br /&gt;
Now select the Java 1.7 JRE, example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;There are 2 alternatives which provide 'java'.&lt;br /&gt;
&lt;br /&gt;
  Selection    Alternative&lt;br /&gt;
-----------------------------------------------&lt;br /&gt;
*         1    /usr/lib64/jvm/jre-1.6.0-ibm/bin/java&lt;br /&gt;
 +        2    /usr/lib64/jvm/jre-1.7.0-ibm/bin/java&lt;br /&gt;
&lt;br /&gt;
Press enter to keep the default[*], or type selection number: 2&lt;br /&gt;
Using '/usr/lib64/jvm/jre-1.7.0-ibm/bin/java' to provide 'java'.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Univention Corporate Server ===&lt;br /&gt;
&lt;br /&gt;
If you have purchased the OX App Suite for UCS, the OX Guard is part of the offering. OX Guard is available in the Univention App Center. Please check the UMC module App Center for the installation of the OX Guard at your already available environment.&lt;br /&gt;
&lt;br /&gt;
Please note: By default, OX Guard generates the link to the secure content for external recipients on the basis of the local fully qualified domain name (FQDN). If the local FQDN is not reachable from the Internet, it has to be specified manually. This can be done by setting a UCR variable, e.g. via the UMC module &amp;amp;quot;Univention Configuration Registry&amp;amp;quot;. The variable has to contain the external FQDN of the OX Guard system:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;oxguard/cfg/guard.properties/com.openexchange.guard.externalEmailURL=HOSTNAME.DOMAINNAME&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Update OX Guard ==&lt;br /&gt;
&lt;br /&gt;
This section contains information about updating a 2.4.0 version (e.g. for patch fixes). Upgrading from prior versions is discussed in different articles. You can find more information in the '''Update OX Guard Versions &amp;amp;lt;= 2.2.x''' and '''Update OX Guard Versions &amp;amp;lt;= 2.0.x''' sections below.&lt;br /&gt;
&lt;br /&gt;
=== Debian Linux 7.0 (Wheezy) (valid until v2.4.2) ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange apt configuration:&lt;br /&gt;
&lt;br /&gt;
 deb https://LDBUSER:LDBPASSWORD@software.open-xchange.com/products/guard/2.4.2/guard/updates/DebianWheezy /&lt;br /&gt;
 deb https://LDBUSER:LDBPASSWORD@software.open-xchange.com/products/appsuite/7.8.2/backend/DebianWheezy /&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then run:&lt;br /&gt;
&lt;br /&gt;
 $ apt-get update&lt;br /&gt;
 $ apt-get dist-upgrade&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to see, what apt-get is going to do without actually doing it, you can run:&lt;br /&gt;
&lt;br /&gt;
 $ apt-get dist-upgrade -s&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Debian Linux 8.0 (Jessie) ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange apt configuration:&lt;br /&gt;
&lt;br /&gt;
 deb https://LDBUSER:LDBPASSWORD@software.open-xchange.com/products/guard/stable/guard/updates/DebianJessie /&lt;br /&gt;
 deb https://LDBUSER:LDBPASSWORD@software.open-xchange.com/products/appsuite/stable/backend/DebianJessie /&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then run:&lt;br /&gt;
&lt;br /&gt;
 $ apt-get update&lt;br /&gt;
 $ apt-get dist-upgrade&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to see, what apt-get is going to do without actually doing it, you can run:&lt;br /&gt;
&lt;br /&gt;
 $ apt-get dist-upgrade -s&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Redhat Enterprise Linux 6 or CentOS 6 ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange yum configuration:&lt;br /&gt;
&lt;br /&gt;
 [open-xchange-guard-stable-guard-updates]&lt;br /&gt;
 name=Open-Xchange-guard-stable-guard-updates&lt;br /&gt;
 baseurl=https://LDBUSER:LDBPASSWORD@software.open-xchange.com/products/guard/stable/guard/updates/RHEL6/&lt;br /&gt;
 gpgkey=https://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
&lt;br /&gt;
 [ox-backend]&lt;br /&gt;
 name=Open-Xchange-backend&lt;br /&gt;
 baseurl=https://LDBUSER:LDBPASSWORD@software.open-xchange.com/products/appsuite/stable/backend/updates/RHEL6/&lt;br /&gt;
 gpgkey=https://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and then run:&lt;br /&gt;
&lt;br /&gt;
 $ yum update&lt;br /&gt;
 $ yum upgrade&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Redhat Enterprise Linux 7 or CentOS 7 ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange yum configuration:&lt;br /&gt;
&lt;br /&gt;
 [open-xchange-guard-stable-guard-updates]&lt;br /&gt;
 name=Open-Xchange-guard-stable-guard-updates&lt;br /&gt;
 baseurl=https://LDBUSER:LDBPASSWORD@software.open-xchange.com/products/guard/stable/guard/updates/RHEL7/&lt;br /&gt;
 gpgkey=https://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
&lt;br /&gt;
 [ox-backend]&lt;br /&gt;
 name=Open-Xchange-backend&lt;br /&gt;
 baseurl=https://LDBUSER:LDBPASSWORD@software.open-xchange.com/products/appsuite/stable/backend/updates/RHEL7/&lt;br /&gt;
 gpgkey=https://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and then run:&lt;br /&gt;
&lt;br /&gt;
 $ yum update&lt;br /&gt;
 $ yum upgrade&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SUSE Linux Enterprise Server 11 (valid until v2.4.2) ===&lt;br /&gt;
&lt;br /&gt;
Add the package repository using &amp;lt;code&amp;gt;zypper&amp;lt;/code&amp;gt; if not already present:&lt;br /&gt;
&lt;br /&gt;
 $ zypper ar https://LDBUSER:LDBPASSWORD@software.open-xchange.com/products/guard/2.4.2/guard/updates/SLES11 guard-stable-guard-updates&lt;br /&gt;
 $ zypper ar https://LDBUSER:LDBPASSWORD@software.open-xchange.com/products/appsuite/7.8.2/backend/updates/SLES11 ox-backend&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and then run:&lt;br /&gt;
&lt;br /&gt;
 $ zypper dup -r guard-stable-guard-backend-updates&lt;br /&gt;
 $ zypper dup -r guard-stable-guard-ui-updates&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might need to run:&lt;br /&gt;
&lt;br /&gt;
 $ zypper ref&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to update the repository metadata before running &amp;lt;code&amp;gt;zypper&amp;lt;/code&amp;gt; up.&lt;br /&gt;
&lt;br /&gt;
=== SUSE Linux Enterprise Server 12 ===&lt;br /&gt;
&lt;br /&gt;
Add the package repository using &amp;lt;code&amp;gt;zypper&amp;lt;/code&amp;gt; if not already present:&lt;br /&gt;
&lt;br /&gt;
 $ zypper ar https://LDBUSER:LDBPASSWORD@software.open-xchange.com/products/guard/stable/guard/updates/SLE_12 guard-stable-guard-updates&lt;br /&gt;
 $ zypper ar https://LDBUSER:LDBPASSWORD@software.open-xchange.com/products/appsuite/stable/backend/updates/SLE_12 ox-backend&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and then run:&lt;br /&gt;
&lt;br /&gt;
 $ zypper dup -r guard-stable-guard-backend-updates&lt;br /&gt;
 $ zypper dup -r guard-stable-guard-ui-updates&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You might need to run:&lt;br /&gt;
&lt;br /&gt;
 $ zypper ref&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to update the repository metadata before running &amp;lt;code&amp;gt;zypper&amp;lt;/code&amp;gt; up.&lt;br /&gt;
&lt;br /&gt;
=== Univention Corporate Server ===&lt;br /&gt;
&lt;br /&gt;
If you have purchased the OX App Suite for UCS, the OX Guard is part of the offering. OX Guard is available in the Univention App Center. Please check the UMC module App Center for the update of the OX Guard.&lt;br /&gt;
&lt;br /&gt;
=== Update OX Guard Versions &amp;amp;lt;= 2.2.x ===&lt;br /&gt;
&lt;br /&gt;
If you are upgrading from a 2.2 version to 2.4, please read the [[Appsuite:OX_Guard_Upgrade_OSGI|Upgrading from 2.0 or 2.2 to 2.4]] article.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following gives an overview of the most important settings to enable Guard for users on the Open-Xchange installation. Some of those settings have to be modified in order to establish the database and REST API access from the Guard service. All settings relating to the Guard backend component are located in the configuration file &amp;lt;code&amp;gt;guard-core.properties&amp;lt;/code&amp;gt; located in &amp;lt;code&amp;gt;/opt/open-xchange/etc&amp;lt;/code&amp;gt;. The default configuration should be sufficient for a basic &amp;amp;quot;up-and-running&amp;amp;quot; setup (with the exception of defining the database username and password). Please refer to the inline documentation of the configuration file for more advanced options. Additional information can be found in the [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_Guard_Configuration Guard Configuration] article.&lt;br /&gt;
&lt;br /&gt;
=== Basic Configuration ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ vim /opt/open-xchange/etc/guard-core.properties&amp;lt;/source&amp;gt;&lt;br /&gt;
Guard database for storing Guard user information, main lookup tables:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;com.openexchange.guard.oxguardDatabaseHostname=localhost&amp;lt;/source&amp;gt;&lt;br /&gt;
Guard database that stores keys for guest users. May be the same as above. New guest shards will be created on this database as needed. If not supplied, will use the &amp;lt;code&amp;gt;oxguardDatabaseHostname&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;com.openexchange.guard.oxguardShardDatabase=localhost&amp;lt;/source&amp;gt;&lt;br /&gt;
Username and Password for the databases above:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;com.openexchange.guard.databaseUsername=openexchange&lt;br /&gt;
com.openexchange.guard.databasePassword=db_password&amp;lt;/source&amp;gt;&lt;br /&gt;
Open-Xchange REST API host:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;com.openexchange.guard.restApiHostname=localhost&amp;lt;/source&amp;gt;&lt;br /&gt;
Open-Xchange REST API username and password (need to be defined in the OX backend in the &amp;amp;quot;Configure services&amp;amp;quot; below):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;com.openexchange.guard.restApiUsername=apiusername&lt;br /&gt;
com.openexchange.guard.restApiPassword=apipassword&amp;lt;/source&amp;gt;&lt;br /&gt;
External URL for this Open-Xchange installation. This setting will be used to generate the link to the secure content for external recipients:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;com.openexchange.guard.externalEmailURL=URL_TO_OX&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Middleware Configuration on OX Guard node ===&lt;br /&gt;
&lt;br /&gt;
If you are installing OX Guard on a node that until yet did not host an Open-Xchange middleware you have to additionally configure some parts of the following properties files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;configdb.properties&amp;lt;/code&amp;gt;: information about the existing configuration database.&lt;br /&gt;
* &amp;lt;code&amp;gt;server.properties&amp;lt;/code&amp;gt;: information about the connections have to be set.&lt;br /&gt;
* &amp;lt;code&amp;gt;system.properties&amp;lt;/code&amp;gt;: at least &amp;lt;code&amp;gt;SERVER_NAME&amp;lt;/code&amp;gt; should be set.&lt;br /&gt;
&lt;br /&gt;
=== Sevices Configuration ===&lt;br /&gt;
&lt;br /&gt;
==== Apache ====&lt;br /&gt;
&lt;br /&gt;
Configure the &amp;lt;code&amp;gt;mod_proxy_http&amp;lt;/code&amp;gt; module by adding the Guard API.&lt;br /&gt;
&lt;br /&gt;
===== Redhat Enterprise Linux 6 or CentOS 6 =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ vim /etc/httpd/conf.d/proxy_http.conf&amp;lt;/source&amp;gt;&lt;br /&gt;
===== Debian GNU/Linux 7.0 and SUSE Linux Enterprise Server 11 =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ vim /etc/apache2/conf.d/proxy_http.conf&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&amp;lt;Proxy balancer://oxguard&amp;gt;&lt;br /&gt;
       Order deny,allow&lt;br /&gt;
       Allow from all&lt;br /&gt;
&lt;br /&gt;
       BalancerMember http://localhost:8009/ timeout=1800 smax=0 ttl=60 retry=60 loadfactor=100 route=OX1&lt;br /&gt;
       ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=ON&lt;br /&gt;
       SetEnv proxy-initial-not-pooled&lt;br /&gt;
       SetEnv proxy-sendchunked&lt;br /&gt;
&amp;lt;/Proxy&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ProxyPass /appsuite/api/oxguard balancer://oxguard/oxguard&lt;br /&gt;
ProxyPass /pks balancer://oxguard/pgp&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Please Note''': The Guard API settings must be inserted '''''before''''' the existing &amp;lt;code&amp;gt;&amp;amp;lt;Proxy /appsuite/api&amp;amp;gt;&amp;lt;/code&amp;gt; parameter.&lt;br /&gt;
&lt;br /&gt;
'''Also Note''':  If you already have a Proxy balancer for the OX backend with the same URL (say http://localhost:8080) then you don't need the second BalacnerMember entry, and you can just have the ProxyPass address that balancer instead.&lt;br /&gt;
&lt;br /&gt;
After the configuration is done, restart the Apache webserver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ apachectl restart&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Open-Xchange ====&lt;br /&gt;
&lt;br /&gt;
Edit the &amp;lt;code&amp;gt;guard-api.properties&amp;lt;/code&amp;gt; configuration file for the OX backend which contain some general Guard settings. Please remove comments in front of the following settings to the configuration file &amp;lt;code&amp;gt;guard-api.properties&amp;lt;/code&amp;gt; on the Open-Xchange backend servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ vim /opt/open-xchange/etc/guard-api.properties&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;# OX GUard general permission, required to activate Guard in the AppSuite UI.&lt;br /&gt;
com.openexchange.capability.guard=true&lt;br /&gt;
&lt;br /&gt;
# Default theme template id for all users that have no custom template id configured.&lt;br /&gt;
com.openexchange.guard.templateID=0&amp;lt;/source&amp;gt;&lt;br /&gt;
Configure the API username and password that you assigned to Guard in the &amp;lt;code&amp;gt;server.properties&amp;lt;/code&amp;gt; file:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ vim /opt/open-xchange/etc/server.properties&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;# Specify the user name used for HTTP basic auth by internal REST servlet&lt;br /&gt;
com.openexchange.rest.services.basic-auth.login=apiusername&lt;br /&gt;
&lt;br /&gt;
# Specify the password used for HTTP basic auth by internal REST servlet&lt;br /&gt;
com.openexchange.rest.services.basic-auth.password=apipassword&amp;lt;/source&amp;gt;&lt;br /&gt;
Finally, the OX backend needs to know where the Guard server is located. This is used to notify the Guard server of changes in users, and to send emails marked for signature. The URL for the Guard server should include the URL suffix &amp;lt;code&amp;gt;/guardadmin&amp;lt;/code&amp;gt;. In the event of a cluster setup, any Guard server can be referenced here, as it is not session specific, though ideally would have a HTTP load balancer/failover URL:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ vim /opt/open-xchange/etc/guard-api.properties&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;# Specifies the URI to the OX Guard end-point; e.g. http://guard.host.invalid:8081/guardadmin&lt;br /&gt;
# Default is empty&lt;br /&gt;
com.openexchange.guard.endpoint=http://guardserver:8009/guardadmin&amp;lt;/source&amp;gt;&lt;br /&gt;
Restart the OX backend&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ /etc/init.d/open-xchange restart&amp;lt;/source&amp;gt;&lt;br /&gt;
==== SELinux ====&lt;br /&gt;
&lt;br /&gt;
Running SELinux prohibits your local Open-Xchange backend service to connect to localhost:8009, which is where the Guard backend service listens to. In order to allow localhost connections to 8009 execute the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ setsebool -P httpd_can_network_connect 1&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Generating the &amp;lt;code&amp;gt;oxguardpass&amp;lt;/code&amp;gt; ===&lt;br /&gt;
&lt;br /&gt;
Once the Guard configuration (database and backend configuration) and the service configuration has been applied, the Guard administration script needs to be executed in order to create the master password file in &amp;lt;code&amp;gt;/opt/open-xchange/etc/oxguardpass&amp;lt;/code&amp;gt;. The initiation only needs to be done '''once''' for a multi server setup, for details please see the sections '''Optional''' and/or '''Clustering'''.&lt;br /&gt;
&lt;br /&gt;
'''Please Note''': If you run a cluster of OX / Guard nodes, only execute this command on '''ONE''' node. Not on all nodes! See [https://oxpedia.org/wiki/index.php?title=AppSuite:GuardCluster OX Guard Clustering] for details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ /opt/open-xchange/sbin/guard --init&amp;lt;/source&amp;gt;&lt;br /&gt;
'''Please Note''': It is important to understand that the master password file located at &amp;lt;code&amp;gt;/opt/open-xchange/etc/oxguardpass&amp;lt;/code&amp;gt; is required to reset user passwords; without them the administrator will not be able to reset user passwords anymore in the future. The file contains the passwords used to encrypt the master database key, as well as passwords used to encrypt protected data in the users table. It must be the same on all Guard servers.&lt;br /&gt;
&lt;br /&gt;
=== Test Setup ===&lt;br /&gt;
&lt;br /&gt;
Not required, but it is a good idea to test the Guard setup before starting the initialization. The test function will verify that Guard has a good connection to the OX backend, and that it can resolve email addresses to users.&lt;br /&gt;
&lt;br /&gt;
To test, use an email address that exists on the OX backend (john@example.com for this example)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;/opt/open-xchange/sbin/guard --test john@example.com&amp;lt;/source&amp;gt;&lt;br /&gt;
Guard should return information from the OX backend regarding the user associated with &amp;amp;quot;john@example.com&amp;amp;quot;. Problems resolving information for the user should be resolved before using Guard. Check Rest API passwords and settings if errors returned.&lt;br /&gt;
&lt;br /&gt;
=== Enabling Guard for Users ===&lt;br /&gt;
&lt;br /&gt;
Guard provides two capabilities for users in the environment as well as a basic &amp;amp;quot;core&amp;amp;quot; level:&lt;br /&gt;
&lt;br /&gt;
* Guard: &amp;lt;code&amp;gt;com.openexchange.capability.guard&amp;lt;/code&amp;gt;&lt;br /&gt;
* Guard Mail: &amp;lt;code&amp;gt;com.openexchange.capability.guard-mail&amp;lt;/code&amp;gt;&lt;br /&gt;
* Guard Drive: &amp;lt;code&amp;gt;com.openexchange.capability.guard-drive&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;quot;core&amp;amp;quot; Guard enabled a basic read functionality for Guard encrypted emails. We recommend enabling this for all users, as this allows all recipients to read Guard emails sent to them. Great opportunity for upsell. Recipients with only Guard enabled can then do a secure reply to the sender, but they can't start a new email or add recipients.&lt;br /&gt;
&lt;br /&gt;
'''Guard Mail''' and '''Guard Drive''' are additional options for users. &amp;amp;quot;Guard Mail&amp;amp;quot; allows users the full functionality of Guard emails. &amp;amp;quot;Guard Drive&amp;amp;quot; allows for encryption and decryption of drive files.&lt;br /&gt;
&lt;br /&gt;
Each of those two Guard components is enabled for all users that have the according capability configured. Please note that users need to have the Drive permission set to use Guard Drive. So the users that have Guard Drive enabled must be a subset of those users with OX Drive permission. Since v7.6.0 we enforce this via the default configuration. Those capabilities can be activated for specific user by using the Open-Xchange provisioning scripts:&lt;br /&gt;
&lt;br /&gt;
==== Guard Mail: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ /opt/open-xchange/sbin/changeuser -c 1 -A oxadmin -P admin_password -u testuser --config/com.openexchange.capability.guard-mail=true&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Guard Drive: ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ /opt/open-xchange/sbin/changeuser -c 1 -A oxadmin -P admin_password -u testuser --config/com.openexchange.capability.guard-drive=true&amp;lt;/source&amp;gt;&lt;br /&gt;
'''Please Note''': Guard Drive requires Guard Mail to be configured for the user as well. In addition, these capabilities may be configured globally by editing the &amp;lt;code&amp;gt;guard-api.properties&amp;lt;/code&amp;gt; file on the OX bakend.&lt;br /&gt;
&lt;br /&gt;
=== Recipient key detection ===&lt;br /&gt;
&lt;br /&gt;
==== Local ====&lt;br /&gt;
&lt;br /&gt;
Guard needs to determine if an email recipients email address is an internal or external (non-ox) user.&lt;br /&gt;
&lt;br /&gt;
To detect if the recipient is an account on the same OX Guard system there is a mechanism needed to map a recipient mail address to the correct local OX context. The default implementation delivered in the product achieves that by looking up the mail domain (@example.com) within the list of context mappings. That is at least not possible in case of ISPs where different users/contexts use the same mail domain. In case your OX system does not use mail domains in context mappings it is required to deploy an OX OSGi bundle implementing the &amp;lt;code&amp;gt;com.openexchange.mailmapping.MailResolver&amp;lt;/code&amp;gt; class or by interfacing Guard with your mail resolver system. Please see [https://oxpedia.org/wiki/index.php?title=AppSuite:GuardMailResolver OX Guard Mail Resolver] for details.&lt;br /&gt;
&lt;br /&gt;
==== External ====&lt;br /&gt;
&lt;br /&gt;
Starting with Guard 2.0, Guard will use public PGP Key servers if configured to find PGP Public keys. In addition, Guard will also look up SRV records for PGP Key servers for a recipients domain. This follows the standards [http://tools.ietf.org/html/draft-shaw-openpgp-hkp-00#page-9 OpenPGP Draft].&lt;br /&gt;
&lt;br /&gt;
External PGP servers to use can be configured in the guard.properties file on the Guard servers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;com.openexchange.guard.publicPGPDirectory = hkp://keys.gnupg.net:11371, hkp://pgp.mit.edu:11371&amp;lt;/source&amp;gt;&lt;br /&gt;
If you would like this Guard installation discoverable by other Guard servers, then create an SRV record for each domain (&amp;amp;quot;example.com&amp;amp;quot; in this illustration):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;_hkp._tcp.open-xchange.com. 28800 IN    SRV     10 1 80 appsuite.example.com.&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Please Note''' PGP Public key servers by default append use the URL server/pks when the record is obtained from an SRV record. The proxy above routes anything with the Apache domain/pks to the OX Guard PGP server.&lt;br /&gt;
&lt;br /&gt;
=== Clustering ===&lt;br /&gt;
&lt;br /&gt;
You can run multiple OX Guard servers in your environment to ensure high availability or enhance scalability. OX Guard integrates seamlessly into the existing Open-Xchange infrastructure by using the existing interface standards and is therefor transparent to the environment. A couple of things have to be prepared in order to loosely couple OX Guard servers with Open-Xchange servers in a cluster.&lt;br /&gt;
&lt;br /&gt;
==== MySQL ====&lt;br /&gt;
&lt;br /&gt;
The MySQL servers need to be configured in order to allow access to the configdb of Open-Xchange. To do so you need to set the following configuration in the MySQL &amp;lt;code&amp;gt;my.cnf&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;bind = 0.0.0.0&amp;lt;/source&amp;gt;&lt;br /&gt;
This allows the Guard backend to bind to the MySQL host which is configured in the &amp;lt;code&amp;gt;guard-core.properties&amp;lt;/code&amp;gt; file with &amp;lt;code&amp;gt;com.openexchange.guard.configdbHostname&amp;lt;/code&amp;gt;. After the bind for the MySQL instance is configured and the OX Guard backend would be able to connect to the configured host, you have to grant access for the OX Guard service on the MySQL instance to manage the databases. Do so by connecting to the MySQL server via the MySQL client. Authenticate if necessary and execute the following, please note that you have to modify the hostname / IP address of the client who should be able to connect to this database, it should include all possible OX Guard servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;sql&amp;quot;&amp;gt;GRANT ALL PRIVILEGES ON *.* TO 'openexchange'@'oxguard.example.com' IDENTIFIED BY ‘secret’;&amp;lt;/source&amp;gt;&lt;br /&gt;
==== Apache ====&lt;br /&gt;
&lt;br /&gt;
OX Guard uses the Open-Xchange REST API to store and fetch data from the Open-Xchange databases. The REST API is a servlet running in the Grizzly container. By default it is not exposed as a servlet through Apache and is only accessibly via port 8009. In order to use Apache's load balancing via &amp;lt;code&amp;gt;mod_proxy&amp;lt;/code&amp;gt; we need to add a servlet called &amp;amp;quot;preliminary&amp;amp;quot; to &amp;lt;code&amp;gt;proxy_http.conf&amp;lt;/code&amp;gt;, example based on a clustered &amp;lt;code&amp;gt;mod_proxy&amp;lt;/code&amp;gt;configuration:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&amp;lt;Location /preliminary&amp;gt;&lt;br /&gt;
     Order Deny,Allow&lt;br /&gt;
     Deny from all&lt;br /&gt;
     # Only allow access from Guard servers within the network. Do not expose this&lt;br /&gt;
     # location outside of your network. In case you use a load balancing service in front&lt;br /&gt;
     # of your Apache infrastructure you should make sure that access to /preliminary will&lt;br /&gt;
     # be blocked from the Internet / outside clients. Examples:&lt;br /&gt;
     # Allow from 192.168.0.1&lt;br /&gt;
     # Allow from 192.168.1.1 192.168.1.2&lt;br /&gt;
     # Allow from 192.168.0.&lt;br /&gt;
&amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ProxyPass /preliminary balancer://oxcluster/preliminary&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure that the balancer is properly configured in the &amp;lt;code&amp;gt;mod_proxy&amp;lt;/code&amp;gt; configuration. Examples on how to do so can be found in our clustering configuration for Open-Xchange AppSuite. Like explained in the example above, please make sure that this location is only available in your internal network, there is no need to expose &amp;lt;code&amp;gt;/preliminary&amp;lt;/code&amp;gt; to the public, it is only used by Guard servers to connect to the OX backend. If you have a load balancer in front of the Apache cluster you should consider blocking access to &amp;lt;code&amp;gt;/preliminary&amp;lt;/code&amp;gt; from WAN to restrict access to the servlet to internal network services only.&lt;br /&gt;
&lt;br /&gt;
Now add the OX Guard &amp;lt;code&amp;gt;BalancerMembers&amp;lt;/code&amp;gt; to the oxguard balancer configuration (also in &amp;lt;code&amp;gt;proxy_http.conf&amp;lt;/code&amp;gt;) to address all your OX Guard nodes in the cluster in this balancer configuration. The configuration has to be applied to all Apache nodes within the cluster.&lt;br /&gt;
&lt;br /&gt;
If the Apache server is a dedicated server &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; instance you also have to install the OX Guard UI-Static package on all Apache nodes in the cluster in order to provide static files like images or CSS to the OX Guard client. Example for Debian (the OX Guard repository has to be configured in the package management prior):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ apt-get install open-xchange-guard-ui-static&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Open-Xchange ====&lt;br /&gt;
&lt;br /&gt;
Disable the Open-Xchange IPCheck for session verification. This is required because OX Guard will use the users session cookie to connect to the Open-Xchange REST API, but as a different IP address than the OX Guard server has been used during authentication the request would fail if you don't disable the IPCheck:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ vim /opt/open-xchange/etc/server.properties&amp;lt;/source&amp;gt;&lt;br /&gt;
and set:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;com.openexchange.IPCheck=false&amp;lt;/source&amp;gt;&lt;br /&gt;
The OX Guard UI package has to be installed on all Open-Xchange backend nodes as well, example for Debian (the OX Guard repository has to be configured in the package management prior):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;$ apt-get install open-xchange-guard-ui&amp;lt;/source&amp;gt;&lt;br /&gt;
Restart the Open-Xchange service afterwards.&lt;br /&gt;
&lt;br /&gt;
==== OX Guard ====&lt;br /&gt;
&lt;br /&gt;
For details in clustering Guard servers, please see [https://oxpedia.org/wiki/index.php?title=AppSuite:GuardCluster OX Guard Clustering]. It is '''critical''' that all Guard servers have the same &amp;lt;code&amp;gt;oxguardpass&amp;lt;/code&amp;gt; file. Please see the clustering link for details. Do not run &amp;lt;code&amp;gt;/opt/open-xchange/sbin/guard --init&amp;lt;/code&amp;gt; on more than one server.&lt;br /&gt;
&lt;br /&gt;
After all the services like MySQL, Apache and Open-Xchange have been configured you need to update the OX Guard backend configuration to point to the correct API endpoints. Set the REST API endpoint to an Apache server by setting the following value in &amp;lt;code&amp;gt;/opt/open-xchange/etc/guard-core.properties&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;com.openexchange.guard.restApiHostname=apache.example.com&amp;lt;/source&amp;gt;&lt;br /&gt;
Per default Guard will try to connect to port 8009 to this host, but as we configured the REST API to be proxies thorugh the servlet &amp;lt;code&amp;gt;/preliminary&amp;lt;/code&amp;gt; on every Apache we now also need to change the target port for the REST API. You can do so by adding the following line into &amp;lt;code&amp;gt;/opt/open-xchange/etc/guard-core.properties&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;com.openexchange.guard.oxBackendPort=80&amp;lt;/source&amp;gt;&lt;br /&gt;
Please also change all settings in regards to MySQL like &amp;lt;code&amp;gt;com.openexchange.guard.configdbHostname&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;com.openexchange.guard.oxguardDatabaseHostname&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;com.openexchange.guard.databaseUsername&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;om.openexchange.guard.databasePassword&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Afterwards restart the OX Guard service and check the log file if the OX Guard backend is able to connect to the configured REST API.&lt;br /&gt;
&lt;br /&gt;
=== Multi Node ===&lt;br /&gt;
&lt;br /&gt;
If you have multiple OX and Guard installations, please see the following documentation [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_Guard_Modular OX Guard Modular Setup].&lt;br /&gt;
&lt;br /&gt;
== Support API ==&lt;br /&gt;
&lt;br /&gt;
The OX Guard Support API enables administrative access to various functions for maintaining OX Guard from a client in a role as a support employee. A client has to do a BASIC AUTH authentication in order to access the API. Username and password can be configured in the guard.properties file using the following settings:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;# Specify the username and password for accessing the Support API of Guard&lt;br /&gt;
com.openexchange.guard.supportapiusername=&lt;br /&gt;
com.openexchange.guard.supportapipassword=&amp;lt;/source&amp;gt;&lt;br /&gt;
In contrast to the rest of the OX Guard requests, the OX Guard support API requests are accessible using: /guardsupport. This distinction allows more flexible configuration since the support API should not always be accessible from everywhere. &lt;br /&gt;
&lt;br /&gt;
'''Warning''': Exposing the support API to the internet could be huge security risk. Only add to Apache if you know what you are doing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Reset password ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;POST /guardsupport/?action=reset_password&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Performs a password reset and sends a new random generated password to a specified email address by the user or a default address if the user did not specify an email address. (''Since Guard 2.0'')&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; – The email address of the user to reset the password for&lt;br /&gt;
* &amp;lt;code&amp;gt;default&amp;lt;/code&amp;gt; (optional) – The email address to send the new password to, if the user did not specify a secondary email address&lt;br /&gt;
&lt;br /&gt;
Response:&lt;br /&gt;
PRIMARY if the reset was sent to the primary email address.  SECONDARY if the reset email was sent to the secondary email address that the user specified&lt;br /&gt;
&lt;br /&gt;
=== Expose key ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;POST /guardsupport/?action=expose_key&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Marks a deleted user key temporary as “exposed” and creates a unique URL for downloading the exposed key. Automatic resetting of exposed keys to &amp;amp;quot;not exposed&amp;amp;quot; is scheduled once a day and resets all exposed keys which have been exposed before X hours, where X can be configured using com.openexchange.guard.exposedKeyDurationInHours in the guard.properties files. (''Since Guard 2.0'')&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt; – The email address of the user to expose the deleted keys for&lt;br /&gt;
* &amp;lt;code&amp;gt;cid&amp;lt;/code&amp;gt; – The context id&lt;br /&gt;
&lt;br /&gt;
Response: A URL pointing to the downloadable exposed keys.&lt;br /&gt;
&lt;br /&gt;
=== Delete user ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;POST /guardsupport/?action=delete_user&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deletes all keys related to a certain user. The keys are backed up and can be exposed using the “expose_key” call. (''Since Guard 2.0'')&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;user_id&amp;lt;/code&amp;gt; – The user's id&lt;br /&gt;
* &amp;lt;code&amp;gt;cid&amp;lt;/code&amp;gt; - The context id&lt;br /&gt;
&lt;br /&gt;
== Customisation ==&lt;br /&gt;
&lt;br /&gt;
Guard's templates are customisable at the user and context level. Please see [https://oxpedia.org/wiki/index.php?title=AppSuite:GuardCustomization Customisation] for details.&lt;br /&gt;
&lt;br /&gt;
== Entropy ==&lt;br /&gt;
&lt;br /&gt;
Guard requires entropy (randomness) to generate the private/public keys that are used. Depending on the server and it's environment, this may become a problem. Please see [https://oxpedia.org/wiki/index.php?title=AppSuite:GuardEntropy Entropy] for a possible solution.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=Authentication_IMAP_Plugin_description&amp;diff=22830</id>
		<title>Authentication IMAP Plugin description</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=Authentication_IMAP_Plugin_description&amp;diff=22830"/>
		<updated>2017-01-26T07:12:09Z</updated>

		<summary type="html">&lt;p&gt;Malasa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Open-Xchange IMAP authentication module =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
The Open-Xchange IMAP authentication module is used to perform the Open-Xchange authentication against a IMAP server. During login, a IMAP connection is opened with the user credentials given through the Open-Xchange API, e.g. the GUI login mask. If that IMAP connection succeeds, the user is authenticated and finally logged in to its Open-Xchange session.&lt;br /&gt;
&lt;br /&gt;
The module does replace the database authentication module installed by default.&lt;br /&gt;
&lt;br /&gt;
=== IMAP Authentication Matrix ===&lt;br /&gt;
&lt;br /&gt;
The IMAP authentication module has configuration parameters which do influence the username used for the IMAP connection during login.  The configuration file is:&lt;br /&gt;
&lt;br /&gt;
 /opt/open-xchange/etc/imapauth.properties&lt;br /&gt;
&lt;br /&gt;
The parameters are:&lt;br /&gt;
&lt;br /&gt;
* com.openexchange.mail.loginSource&lt;br /&gt;
* USE_FULL_LOGIN_INFO&lt;br /&gt;
* USE_MULTIPLE&lt;br /&gt;
* USE_FULL_LOGIN_INFO_FOR_USER_LOOKUP (starting with 7.8.1)&lt;br /&gt;
* USE_FULL_LOGIN_INFO_FOR_CONTEXT_LOOKUP (starting with 7.8.2)&lt;br /&gt;
&lt;br /&gt;
The following examples make the behavior of that parameters visible. The login string, passed as example to the Open-Xchange login mask, is&lt;br /&gt;
&lt;br /&gt;
 user@domain.tld&lt;br /&gt;
&lt;br /&gt;
during the user provisioning, following attributes are set for the context via the createcontext call:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| attribute&lt;br /&gt;
| value&lt;br /&gt;
|-&lt;br /&gt;
| contextname&lt;br /&gt;
| domain.tld&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
and the following parameters via the creatuser call:&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| attribute&lt;br /&gt;
| value&lt;br /&gt;
|-&lt;br /&gt;
| imaplogin&lt;br /&gt;
| user1337&lt;br /&gt;
|-&lt;br /&gt;
| username&lt;br /&gt;
| user&lt;br /&gt;
|-&lt;br /&gt;
| email&lt;br /&gt;
| exampleuser@otherdomain.tld&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
com.openexchange.mail.loginSource=login&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot; | '''Property/Property''' &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''USE_FULL_LOGIN_INFO''' &lt;br /&gt;
|-&lt;br /&gt;
! '''true''' &lt;br /&gt;
! '''false'''&lt;br /&gt;
|-&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot; | '''USE_MULTIPLE''' &lt;br /&gt;
! '''true''' &lt;br /&gt;
| user1337&lt;br /&gt;
| user1337&lt;br /&gt;
|-&lt;br /&gt;
! | '''false''' &lt;br /&gt;
| user@domain.tld&lt;br /&gt;
| user&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
com.openexchange.mail.loginSource=mail&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot; | '''Property/Property''' &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''USE_FULL_LOGIN_INFO''' &lt;br /&gt;
|-&lt;br /&gt;
! '''true''' &lt;br /&gt;
! '''false'''&lt;br /&gt;
|-&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot; | '''USE_MULTIPLE''' &lt;br /&gt;
! '''true''' &lt;br /&gt;
| exampleuser@otherdomain.tld&lt;br /&gt;
| exampleuser@otherdomain.tld&lt;br /&gt;
|-&lt;br /&gt;
! | '''false''' &lt;br /&gt;
| user@domain.tld&lt;br /&gt;
| user&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
com.openexchange.mail.loginSource=name&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; align=&amp;quot;center&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! rowspan=&amp;quot;2&amp;quot; colspan=&amp;quot;2&amp;quot; | '''Property/Property''' &lt;br /&gt;
!colspan=&amp;quot;2&amp;quot; | '''USE_FULL_LOGIN_INFO''' &lt;br /&gt;
|-&lt;br /&gt;
! '''true''' &lt;br /&gt;
! '''false'''&lt;br /&gt;
|-&lt;br /&gt;
!rowspan=&amp;quot;2&amp;quot; | '''USE_MULTIPLE''' &lt;br /&gt;
! '''true''' &lt;br /&gt;
| user@domain.tld&lt;br /&gt;
| user&lt;br /&gt;
|-&lt;br /&gt;
! | '''false''' &lt;br /&gt;
| user@domain.tld&lt;br /&gt;
| user&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== IMAP Authentication Extensions ===&lt;br /&gt;
Since v7.8.1 the &amp;quot;USE_FULL_LOGIN_INFO_FOR_USER_LOOKUP&amp;quot; property gets introduced. According to the semantics of the &amp;quot;USE_FULL_LOGIN_INFO&amp;quot; property, the &amp;quot;USE_FULL_LOGIN_INFO_FOR_USER_LOOKUP&amp;quot; property controls whether the full login string is supposed to be considered as the internal user name. If set to &amp;quot;true&amp;quot; the full login string is used to look-up the user; e.g. uses &amp;quot;jane@somewhere.org&amp;quot; instead of only &amp;quot;jane&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This is useful for setups, in which the full E-Mail address is used for the internal user name. Please note, that to allow provisioning of full E-Mail addresses the USER_ID check in AdminUser.properties needs to be turned off or allow the '@' character. You have to add the individual E-Mail addresses which belong to a context in the loginmapping (-L for create/changecontext). You can add multiple E-Mail addresses to the loginmapping, separated by a comma.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-authentication-imap|toplevel=products|sopath=appsuite/stable/backend|version=App Suite}}&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Context_management&amp;diff=22490</id>
		<title>AppSuite:Context management</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Context_management&amp;diff=22490"/>
		<updated>2016-11-03T05:36:30Z</updated>

		<summary type="html">&lt;p&gt;Malasa: /* Parameters */ added note to quota for signatures&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== createcontext ==&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;createcontext&amp;lt;/code&amp;gt;''' is the tool to create new contexts. A context is an independent instance within the createcontext Open-Xchange system and holds users, groups&lt;br /&gt;
and resources and all their objects. Data from one context is not visible to other contexts. Module access (calendar, tasks, email) can be set via predefined &amp;quot;access combination names&amp;quot;. These&lt;br /&gt;
names can be configured on the server side. All users which are created during later use of the &amp;quot;createuser&amp;quot; tool will inherit the module access rights from the context. If you do not specify any&lt;br /&gt;
access rights on createcontext minimal access rights will be granted. Currently, these are Webmail and Contacts access rights.&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -h,--help&lt;br /&gt;
|Prints a help text&lt;br /&gt;
|-&lt;br /&gt;
| --environment&lt;br /&gt;
|Show info about commandline environment&lt;br /&gt;
|-&lt;br /&gt;
| --nonl&lt;br /&gt;
|Remove all newlines (\n) from output&lt;br /&gt;
|-&lt;br /&gt;
| --responsetimeout &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|response timeout in seconds for reading response from the backend (default 0s; infinite) '''Available with v7.8.0'''&lt;br /&gt;
|-&lt;br /&gt;
| -c,--contextid &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|The id of the context, when starting with 0, 0 is deleted&lt;br /&gt;
|-&lt;br /&gt;
| -q,--quota &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|Context wide filestore quota in MB. -1 = unlimited. Note: since 7.8.2 you need quota to store signatures, even you don't use the infostore/drive. Therefore you should always set a small amount so users can store signatures.&lt;br /&gt;
|-&lt;br /&gt;
| -u,--username &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Username for the new context admin user&lt;br /&gt;
|-&lt;br /&gt;
| -d,--displayname &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Displayname for the new context admin user&lt;br /&gt;
|-&lt;br /&gt;
| -g,--givenname &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Given name for the new context admin user&lt;br /&gt;
|-&lt;br /&gt;
| -s,--surname &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Surname/last name for the new context Admin user&lt;br /&gt;
|-&lt;br /&gt;
| -p,--password &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Password for the new context Admin user&lt;br /&gt;
|-&lt;br /&gt;
| -e,--email &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Primary E-Mail address for the new context Admin user&lt;br /&gt;
|-&lt;br /&gt;
| -l,--lang &amp;amp;lt;lang&amp;amp;gt;&lt;br /&gt;
|Language for the new context Admin user&lt;br /&gt;
|-&lt;br /&gt;
| -t,--timezone &amp;amp;lt;timezone&amp;amp;gt;&lt;br /&gt;
|Timezone for the new context Amin user&lt;br /&gt;
|-&lt;br /&gt;
| -N,--contextname &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Context name&lt;br /&gt;
|-&lt;br /&gt;
| -L,--addmapping &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Add login mappings separated by &amp;quot;,&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -F,--destination-store-id &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|Specifies the optional file store identifier to which the context gets assigned; if missing the file store gets auto-detected&lt;br /&gt;
|-&lt;br /&gt;
| -D,--destination-database-id &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|Specifies the optional database identifier to which the context gets assigned; if missing the database gets auto-detected&lt;br /&gt;
|-&lt;br /&gt;
| --access-combination-name &amp;amp;lt;access-combination-name&amp;amp;gt;&lt;br /&gt;
|Access combination name&lt;br /&gt;
|-&lt;br /&gt;
| --access-denied-portal &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Denies portal access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --csv-import &amp;amp;lt;CSV file&amp;amp;gt; &lt;br /&gt;
| Full path to CSV file with user data to import. This option makes mandatory options obsolete, except credential options (if needed). &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== --csv-import &amp;lt;CSV file&amp;gt; ====&lt;br /&gt;
&lt;br /&gt;
Full path to CSV file with user data to import. This option makes mandatory command line options obsolete, except credential options (if needed). But they&lt;br /&gt;
have to be set in the CSV file.&lt;br /&gt;
&lt;br /&gt;
With this option you can specify a csv file (a full pathname must be given) with the data which should be imported. The columnnames in the CSV file must be&lt;br /&gt;
the same as the long-options of the command line tools, without the prefix &amp;quot;--&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
This option will normally be used to fill new large installations with the new data. So instead of calling&lt;br /&gt;
the command line tools in a shell script every time, just a csv file needs to be created, containing the whole data.&lt;br /&gt;
&lt;br /&gt;
Note that the credentials of the masteradmin in the createcontext call&lt;br /&gt;
must be given on the command line with the -A and -P options nevertheless - if authentication is enabled. If the createuser command line tool is used, the credentials are part of the csv file, and&lt;br /&gt;
cannot be set as options on the command line itself. The reason for this different behavior is that different contexts have different credentials for the admin user, so they must be set in every&lt;br /&gt;
line of the csv file. Opposed to this the credentials of the masteradmin are always the same.&lt;br /&gt;
&lt;br /&gt;
==== Extra parameters when authentication is enabled ====&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -A,--adminuser &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Master Admin user name&lt;br /&gt;
|-&lt;br /&gt;
| -P,--adminpass &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Master Admin password&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; on success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;gt;0&amp;lt;/code&amp;gt; on failure&lt;br /&gt;
&lt;br /&gt;
=== Mandatory parameters ===&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;contextid {adminuser adminpass} quota username displayname givenname surname password email&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Command output ===&lt;br /&gt;
&lt;br /&gt;
On success:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;context &amp;amp;lt;contextid&amp;amp;gt; created&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On&lt;br /&gt;
failure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;context &amp;amp;lt;contextid&amp;amp;gt; could not be created: &amp;amp;lt;reason from server&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;root@oxhe~# &amp;lt;/code&amp;gt;'''&amp;lt;code&amp;gt;/opt/open-xchange/sbin/createcontext&lt;br /&gt;
-c 123 -q 1000 -N CompanyA -u &amp;quot;admin&amp;quot; -d &amp;quot;Admin of CompanyA&amp;quot; -g John -s Example -p newpw -e john@example.com&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;context 123&lt;br /&gt;
created&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== deletecontext ==&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;deletecontext&amp;lt;/code&amp;gt;''' is the tool to delete contexts and all data stored that belong to it. This includes all database entries and files in the infostore but no&lt;br /&gt;
E-Mail components.&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -h,--help&lt;br /&gt;
|Prints a help text&lt;br /&gt;
|-&lt;br /&gt;
| --environment&lt;br /&gt;
|Show info about commandline environment&lt;br /&gt;
|-&lt;br /&gt;
| --nonl&lt;br /&gt;
|Remove all newlines (\n) from output&lt;br /&gt;
|-&lt;br /&gt;
| --responsetimeout &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|response timeout in seconds for reading response from the backend (default 0s; infinite) '''Available with v7.8.0'''&lt;br /&gt;
|-&lt;br /&gt;
| -c,--contextid &amp;amp;lt;contextid&amp;amp;gt;&lt;br /&gt;
|The id of the context&lt;br /&gt;
|-&lt;br /&gt;
| -N,--contextname &amp;amp;lt;contextname&amp;amp;gt;&lt;br /&gt;
|Context name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Extra parameters when authentication is enabled ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -A,--adminuser &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Master Admin user name&lt;br /&gt;
|-&lt;br /&gt;
| -P,--adminpass &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Master Admin password&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; on success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;gt;0&amp;lt;/code&amp;gt; on failure&lt;br /&gt;
&lt;br /&gt;
=== Mandatory parameters ===&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;(contextid or contexname) {adminuser adminpass}&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Command output ===&lt;br /&gt;
&lt;br /&gt;
On success:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;context &amp;amp;lt;contextid&amp;amp;gt; deleted&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On failure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;context&lt;br /&gt;
&amp;amp;lt;contextid&amp;amp;gt; could not be deleted: &amp;amp;lt;reason from server&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;root@oxhe~# &amp;lt;/code&amp;gt;'''&amp;lt;code&amp;gt;/opt/open-xchange/sbin/deletecontext -c&lt;br /&gt;
123&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;context 123 deleted&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== listcontext ==&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;listcontext&amp;lt;/code&amp;gt;''' is the tool to list and search for contexts.&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -h,--help&lt;br /&gt;
|Prints a help text&lt;br /&gt;
|-&lt;br /&gt;
| --environment&lt;br /&gt;
|Show info about commandline environment&lt;br /&gt;
|-&lt;br /&gt;
| --nonl&lt;br /&gt;
|Remove all newlines (\n) from output&lt;br /&gt;
|-&lt;br /&gt;
| --responsetimeout &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|response timeout in seconds for reading response from the backend (default 0s; infinite) '''Available with v7.8.0'''&lt;br /&gt;
|-&lt;br /&gt;
| -s,--searchpattern &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Search/List pattern, default “*”&lt;br /&gt;
|-&lt;br /&gt;
| --csv&lt;br /&gt;
|Command output as csv&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Extra parameters when authentication is enabled ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -A,--adminuser &amp;amp;lt;adminuser&amp;amp;gt;&lt;br /&gt;
|Master Admin user name&lt;br /&gt;
|-&lt;br /&gt;
| -P,--adminpass &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Master Admin password&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; on success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;gt;0&amp;lt;/code&amp;gt; on failure&lt;br /&gt;
&lt;br /&gt;
=== Mandatory parameters ===&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;{adminuser adminpass}&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Command output ===&lt;br /&gt;
&lt;br /&gt;
Standard output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;cid fid fname enabled qmax qused name&lt;br /&gt;
lmappings . . ... ... ... ... ... ...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
csv output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;id,filestore_id,filestore_name,enabled,max_quota,used_quota,name,lmappings&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;root@oxhe:/opt/open-xchange/sbin# ./listcontexts cid fid fname&lt;br /&gt;
enabled qmax qused name lmappings 6 3 6_ctx_store true 1000 0 customerA 6,customerA,secondlogin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
== disablecontext ==&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;disablecontext&amp;lt;/code&amp;gt;''' is the tool to disable contexts. Whenever a customer tries to log in to a disabled context, the login is denied.&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -h,--help&lt;br /&gt;
|Prints a help text&lt;br /&gt;
|-&lt;br /&gt;
| --environment&lt;br /&gt;
|Show info about commandline environment&lt;br /&gt;
|-&lt;br /&gt;
| --nonl&lt;br /&gt;
|Remove all newlines (\n) from output&lt;br /&gt;
|-&lt;br /&gt;
| --responsetimeout &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|response timeout in seconds for reading response from the backend (default 0s; infinite) '''Available with v7.8.0'''&lt;br /&gt;
|-&lt;br /&gt;
| -c,--contextid &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|The id of the context&lt;br /&gt;
|-&lt;br /&gt;
| -N,--contextname &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Context name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Extra parameters when authentication is enabled ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -A,--adminuser &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Master Admin user name&lt;br /&gt;
|-&lt;br /&gt;
| -P,--adminpass &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Master Admin password&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; on success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;gt;0&amp;lt;/code&amp;gt; on&lt;br /&gt;
failure&lt;br /&gt;
&lt;br /&gt;
=== Mandatory parameters ===&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;(contextid or&lt;br /&gt;
contextname) {adminuser adminpass}&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Command output ===&lt;br /&gt;
&lt;br /&gt;
On&lt;br /&gt;
success:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;context &amp;amp;lt;contextid&amp;amp;gt; disabled&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On failure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;context &amp;amp;lt;contextid&amp;amp;gt; could not be disabled:&lt;br /&gt;
&amp;amp;lt;reason from server&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;root@oxhe~# &amp;lt;/code&amp;gt;'''&amp;lt;code&amp;gt;/opt/open-xchange/sbin/disablecontext -c 123&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;context 123&lt;br /&gt;
disabled&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== disableallcontexts ==&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;disableallcontexts&amp;lt;/code&amp;gt;''' is the tool to disable all contexts. Whenever a customer tries to log in to a disabled context, the login is denied.&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -h,--help&lt;br /&gt;
|Prints a help text&lt;br /&gt;
|-&lt;br /&gt;
| --environment&lt;br /&gt;
|Show info about commandline environment&lt;br /&gt;
|-&lt;br /&gt;
| --nonl&lt;br /&gt;
|Remove all newlines (\n) from output&lt;br /&gt;
|-&lt;br /&gt;
| --responsetimeout &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|response timeout in seconds for reading response from the backend (default 0s; infinite) '''Available with v7.8.0'''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Extra parameters when authentication is enabled ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -A,--adminuser &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Master Admin user&lt;br /&gt;
name&lt;br /&gt;
|-&lt;br /&gt;
| -P,--adminpass &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Master Admin password&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; on success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;gt;0&amp;lt;/code&amp;gt; on&lt;br /&gt;
failure&lt;br /&gt;
&lt;br /&gt;
=== Mandatory parameters ===&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;{adminuser&lt;br /&gt;
adminpass}&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Command output ===&lt;br /&gt;
&lt;br /&gt;
On success:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all contexts disabled&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On failure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all contexts could not be disabled: &amp;amp;lt;reason from server&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;root@oxhe~# &amp;lt;/code&amp;gt;'''&amp;lt;code&amp;gt;/opt/open-xchange/sbin/disableallcontexts&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all contexts disabled&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== enablecontext ==&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;enablecontext&amp;lt;/code&amp;gt;''' is the tool to enable a disabled context.&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -h,--help&lt;br /&gt;
|Prints a help text&lt;br /&gt;
|-&lt;br /&gt;
| --environment&lt;br /&gt;
|Show info about commandline environment&lt;br /&gt;
|-&lt;br /&gt;
| --nonl&lt;br /&gt;
|Remove all newlines (\n) from&lt;br /&gt;
output&lt;br /&gt;
|-&lt;br /&gt;
| -c,--contextid &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|The id of the context&lt;br /&gt;
|-&lt;br /&gt;
| -N,--contextname &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Context name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Extra parameters when authentication is enabled ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -A,--adminuser &amp;amp;lt;adminuser&amp;amp;gt;&lt;br /&gt;
|Master Admin user name&lt;br /&gt;
|-&lt;br /&gt;
| -P,--adminpass &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Master Admin password&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; on success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;gt;0&amp;lt;/code&amp;gt; on failure&lt;br /&gt;
&lt;br /&gt;
=== Mandatory parameters ===&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;(contextid or contextname) {adminuser adminpass}&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Command output ===&lt;br /&gt;
&lt;br /&gt;
On success:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;context &amp;amp;lt;contextid&amp;amp;gt; enabled&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On failure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;context &amp;amp;lt;contextid&amp;amp;gt; could not be enabled: &amp;amp;lt;reason from server&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;root@oxhe~#&lt;br /&gt;
&amp;lt;/code&amp;gt;'''&amp;lt;code&amp;gt;/opt/open-xchange/sbin/enablecontext -c 123&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;context &amp;amp;lt;contextid&amp;amp;gt; enabled&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== enableallcontexts ==&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;enableallcontexts&amp;lt;/code&amp;gt;''' is the tool to enable all disabled contexts.&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -h,--help&lt;br /&gt;
|Prints a help text&lt;br /&gt;
|-&lt;br /&gt;
| --environment&lt;br /&gt;
|Show info about commandline environment&lt;br /&gt;
|-&lt;br /&gt;
| --nonl&lt;br /&gt;
|Remove all newlines (\n) from&lt;br /&gt;
output&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Extra parameters when authentication is enabled ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -A,--adminuser &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Master Admin user name&lt;br /&gt;
|-&lt;br /&gt;
| -P,--adminpass&lt;br /&gt;
&amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Master Admin password&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; on success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;gt;0&amp;lt;/code&amp;gt; on failure&lt;br /&gt;
&lt;br /&gt;
=== Mandatory parameters ===&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;{adminuser adminpass}&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Command output ===&lt;br /&gt;
&lt;br /&gt;
On success:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all contexts enabled&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On&lt;br /&gt;
failure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all contexts could not be enabled: &amp;amp;lt;reason from server&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;root@oxhe~# &amp;lt;/code&amp;gt;'''&amp;lt;code&amp;gt;/opt/open-xchange/sbin/enableallcontexts&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;all contexts enabled&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== getcontextcapabilities ==&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;getcontextcapabilities&amp;lt;/code&amp;gt;''' is the tool to list available capabilities for a certain context.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -h,--help&lt;br /&gt;
|Prints a help text&lt;br /&gt;
|-&lt;br /&gt;
| --environment&lt;br /&gt;
|Show info about commandline environment&lt;br /&gt;
|-&lt;br /&gt;
| --nonl&lt;br /&gt;
|Remove all newlines (\n) from output&lt;br /&gt;
|-&lt;br /&gt;
| --responsetimeout &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|response timeout in seconds for reading response from the backend (default 0s; infinite) '''Available with v7.8.0'''&lt;br /&gt;
|-&lt;br /&gt;
| -c,--contextid &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|The id of the context&lt;br /&gt;
|-&lt;br /&gt;
| -N,--contextname &amp;amp;lt;contextname&amp;amp;gt;&lt;br /&gt;
|context name&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Extra parameters when authentication is enabled ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -A,--adminuser &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Context Admin user name&lt;br /&gt;
|-&lt;br /&gt;
| -P,--adminpass &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Context Admin password&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; on success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;gt;0&amp;lt;/code&amp;gt; on failure&lt;br /&gt;
&lt;br /&gt;
=== Mandatory parameters ===&lt;br /&gt;
&amp;lt;code&amp;gt;contextid adminuser adminpass&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Command output ===&lt;br /&gt;
&lt;br /&gt;
Either &amp;quot;There are no capabilities set for context &amp;amp;lt;context-id&amp;amp;gt;&amp;quot;&lt;br /&gt;
or a line-wise listing of identifiers for available capabilities&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; root@oxhe:~# /opt/open-xchange/sbin/getcontextcapabilities -c 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== changecontext ==&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;changecontext&amp;lt;/code&amp;gt;''' makes context-wide changes.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you specify module access options; e.g. &amp;quot;--access-edit-password on&amp;quot;; then please be aware that basic module access set is the one from context's administrator. Meaning any option not explicitly specified as CLI argument will fall-back to context administrator setting for _every_ user in associated context.&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can use changecontext to change the current quota for a given context. When the context has more changecontext space in use than the new quota allows,&lt;br /&gt;
the customer is only able to delete files until the usage is below quota. Module access (calendar,tasks,email) can be set via predefined &amp;quot;access combination names&amp;quot;. These names can be configured on&lt;br /&gt;
the server side. All users which are created during later use of the &amp;quot;createuser&amp;quot; tool will inherit the module access rights from the context. If you do not specify any access rights on&lt;br /&gt;
createcontext minimal access rights will be granted. Currently, these are Webmail and Contacts access rights.&lt;br /&gt;
&lt;br /&gt;
There are some default combinations in the ModuleAccessDefinitions.properties&lt;br /&gt;
file on the admin server, like:&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|webmail=webmail, contacts, globaladdressbookdisabled, collectemailaddresses, editpassword&lt;br /&gt;
|-&lt;br /&gt;
|pim=webmail, ''calendar'', contacts, ''tasks'', globaladdressbookdisabled, collectemailaddresses, ''multiplemailaccounts'', ''subscription'', ''publication'', editpassword&lt;br /&gt;
|-&lt;br /&gt;
|pim_infostore=webmail, calendar, contacts, tasks, ''infostore'', ''webdav'', globaladdressbookdisabled, collectemailaddresses, multiplemailaccounts, subscription, publication&lt;br /&gt;
|-&lt;br /&gt;
|pim_mobility=webmail, calendar, contacts, tasks, syncml, ''usm'', activesync, globaladdressbookdisabled, collectemailaddresses, multiplemailaccounts, subscription, publication, ''editpassword''&lt;br /&gt;
|-&lt;br /&gt;
|groupware_standard=webmail, calendar, contacts, infostore, tasks, webdav, ical, vcard, readcreatesharedfolders, delegatetask, editpublicfolders, editgroup, editresource, editpassword, collectemailaddresses, multiplemailaccounts, subscription, publication (Groupware Standard always gets new features except mobility and OXtender. ) &lt;br /&gt;
|-&lt;br /&gt;
|groupware_premium=webmail, calendar, contacts, infostore, tasks, webdav, ''webdavxml'', ical, vcard, ''syncml, ''usm'', ''olox20'', ''activesync'', readcreatesharedfolders, delegatetask, editpublicfolders, editgroup, editresource, editpassword, collectemailaddresses, multiplemailaccounts, subscription, publication&lt;br /&gt;
|-&lt;br /&gt;
|all=webmail, calendar, contacts, infostore, tasks, webdav, webdavxml, ical, vcard, syncml, usm, olox20, activesync, readcreatesharedfolders, delegatetask, editpublicfolders, editgroup, editresource, editpassword, ''publicfoldereditable'', collectemailaddresses, multiplemailaccounts, subscription, publication (This is a right tailored to a context administrator)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Italics denote additional rights in comparison to the previous set where applicable.&lt;br /&gt;
&lt;br /&gt;
When having changed the access rights of the context and its users with &amp;quot;changecontext&amp;quot; the &amp;quot;downgrade&amp;quot; command should be called on the admin server. All unnecessary data are removed from&lt;br /&gt;
the data base via &amp;quot;groupware api&amp;quot;. If e. g. the context 1 is changed from &amp;quot;pim_infostore&amp;quot; to &amp;quot;webmail&amp;quot;, the &amp;quot;downgrade&amp;quot; command has to be called for this context then. Then, all unnecessary&lt;br /&gt;
folders for this context are removed from the data base.&lt;br /&gt;
&lt;br /&gt;
=== Parameters ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -h,- -help&lt;br /&gt;
|Prints a help text&lt;br /&gt;
|-&lt;br /&gt;
| --environment&lt;br /&gt;
|Show info about commandline environment&lt;br /&gt;
|-&lt;br /&gt;
| --nonl&lt;br /&gt;
|Remove all newlines (\n) from output&lt;br /&gt;
|-&lt;br /&gt;
| --responsetimeout &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|response timeout in seconds for reading response from the backend (default 0s; infinite) '''Available with v7.8.0'''&lt;br /&gt;
|-&lt;br /&gt;
| -c,- -contextid &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|The id of the context&lt;br /&gt;
|-&lt;br /&gt;
| -N,- -contextname &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|The name of the context&lt;br /&gt;
|-&lt;br /&gt;
| -L,- -addmapping &amp;amp;lt;string(s)&amp;amp;gt;&lt;br /&gt;
|Add login mappings. Separated by &amp;quot;,&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -R,- -removemapping &amp;amp;lt;stirng(s)&amp;amp;gt;&lt;br /&gt;
|Remove login mappings. Separated by &amp;quot;,&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -q,- -quota &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|Quota for the context filestore in MB&lt;br /&gt;
|-&lt;br /&gt;
| --access-combination-name &amp;amp;lt;access-combination-name&amp;amp;gt;&lt;br /&gt;
|Access combination name&lt;br /&gt;
|-&lt;br /&gt;
| --capabilities-to-add &amp;amp;lt;capabilities-to-add&amp;amp;gt;&lt;br /&gt;
| The capabilities to add as a comma-separated string (from 7.2.0 on)&lt;br /&gt;
|-&lt;br /&gt;
| --capabilities-to-remove &amp;amp;lt;capabilities-to-remove&amp;amp;gt;&lt;br /&gt;
| The capabilities to remove as a comma-separated string  (from 7.2.0 on)&lt;br /&gt;
|-&lt;br /&gt;
| --capabilities-to-drop &amp;amp;lt;capabilities-to-drop&amp;amp;gt;&lt;br /&gt;
|The capabilities to drop; e.g. cleanse from storage; as a comma-separated string (from 7.6.0 on)&lt;br /&gt;
|-&lt;br /&gt;
| --quota-module &amp;amp;lt;quota-module&amp;amp;gt;&lt;br /&gt;
|The identifier of the module to which to apply the quota value (from 7.2.0 on)&lt;br /&gt;
|-&lt;br /&gt;
| --quota-value &amp;amp;lt;quota-value&amp;amp;gt;&lt;br /&gt;
| from v7.2.0 on: The quota value; zero is unlimited&amp;lt;br&amp;gt;from v7.6.0 on: The numeric quota value specifying the max. number of items allowed for context. Zero is unlimited. A value less than zero deletes the quota entry (and falls back to configured behavior)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Extra parameters when authentication is enabled ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| -A,- -adminuser &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Master Admin user name&lt;br /&gt;
|-&lt;br /&gt;
| -P,- -adminpass &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Master Admin password&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Return value ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; on success&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;amp;gt;0&amp;lt;/code&amp;gt; on&lt;br /&gt;
failure&lt;br /&gt;
&lt;br /&gt;
=== Mandatory parameters ===&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;(contextid or&lt;br /&gt;
contextname) {adminuser adminpass} and at minimum one attribute to change&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
=== Command output ===&lt;br /&gt;
&lt;br /&gt;
On success:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;context &amp;amp;lt;contextid&amp;amp;gt; changed&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On failure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;context&lt;br /&gt;
&amp;amp;lt;contextid&amp;amp;gt; could not be changed: &amp;amp;lt;reason from server&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;root@oxhe~# &amp;lt;/code&amp;gt;'''&amp;lt;code&amp;gt;/opt/open-xchange/sbin/changecontext -c 123 -q&lt;br /&gt;
500&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;context 123 changed&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== getAdminId ==&lt;br /&gt;
&lt;br /&gt;
Returns the ID of the context administrator.&lt;br /&gt;
&lt;br /&gt;
[[Category: Administrator]]&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]]&lt;br /&gt;
[[Category: AdminGuide]]&lt;br /&gt;
[[Category: CommandLineTools]]&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=ContextRestore_Bundle&amp;diff=22422</id>
		<title>ContextRestore Bundle</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=ContextRestore_Bundle&amp;diff=22422"/>
		<updated>2016-10-05T10:42:39Z</updated>

		<summary type="html">&lt;p&gt;Malasa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Context Restore Documentation =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This document contains descriptions about the context restore bundle. This&lt;br /&gt;
bundle is a solution for restoring one single context out of a mysql dump from&lt;br /&gt;
a complete Open-Xchange database. In a distributed setup, it is possible to use&lt;br /&gt;
several files containing the dumps of different databases. The tool described&lt;br /&gt;
within this document does fetch the needed information out of these files.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
You must not delete the last context from within a database schema.&lt;br /&gt;
If you just have ONE context left in your system, do NOT delete it.&lt;br /&gt;
That is because the deletion of the last contexts leads into deletion of the entire schema.&lt;br /&gt;
In that case, you have to restore a complete database dump. restorecontext will not work in that case.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
For correct operation, it is required that the mysql dumps for this tool&lt;br /&gt;
represent a consistent state of all databases the Open-Xchange server has under&lt;br /&gt;
control.  Furthermore this consistent state needs also to include the backup of&lt;br /&gt;
the filestore.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-admin-plugin-contextrestore|sopath=stable|version=7.x}}&lt;br /&gt;
&lt;br /&gt;
After the package has been installed, a new shell script named&lt;br /&gt;
&amp;lt;tt&amp;gt;/opt/open-xchange/sbin/restorecontext&amp;lt;/tt&amp;gt; The server needs to be&lt;br /&gt;
restarted to make the new functionality available. The functionality is&lt;br /&gt;
accessible via RMI, CLT and SOAP.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
A complete database backup has to be done before the new function can be used.&lt;br /&gt;
The Tool described within this document requires a full SQL dump of the&lt;br /&gt;
databases involved. This can be done by executing the command &lt;br /&gt;
&lt;br /&gt;
 $ mysqldump --all-databases --single-transaction --hex-blob&lt;br /&gt;
&lt;br /&gt;
on all database machines registered in Open-Xchange as well as the&lt;br /&gt;
configuration Database. These three parameters are very important. The first one&lt;br /&gt;
lets the dump contain every database on the specified database host, the&lt;br /&gt;
second is used for a consistent backup and the third one is used to let all binary data&lt;br /&gt;
appear as hex in the dump. Instead of &amp;lt;tt&amp;gt;–-all-databases&amp;lt;/tt&amp;gt; you can also&lt;br /&gt;
use &amp;lt;tt&amp;gt;–-database&amp;lt;/tt&amp;gt; with the right database(s), if none of the switches are given as&lt;br /&gt;
direct argument then mysql will left out essential data in the dump. For a full&lt;br /&gt;
backup the switch &amp;lt;tt&amp;gt;--all-databases&amp;lt;/tt&amp;gt; is recommended.&lt;br /&gt;
&lt;br /&gt;
The usage of the command line tool is self-explanatory as it confirms to the&lt;br /&gt;
standard unix behavior. &amp;lt;tt&amp;gt;--help&amp;lt;/tt&amp;gt; will show a short help with the available&lt;br /&gt;
parameters.&lt;br /&gt;
&lt;br /&gt;
The main arguments of the tool are different database dumps (from the configdb&lt;br /&gt;
and the distributed user data databases). On success the tool returns the path to&lt;br /&gt;
the filestore of the given context. The files below this path have to be restored&lt;br /&gt;
afterwards in a separate process which is not part of the Open-Xchange system.&lt;br /&gt;
An example of a restore would look like this:&lt;br /&gt;
&lt;br /&gt;
 $ restorecontext -A oxadminmaster -P secret -c 1 \&lt;br /&gt;
    -f /path/to/configdb.sql,/path/to/userdb.sql,/path/to/userdb1.sql,...&lt;br /&gt;
&lt;br /&gt;
'''Note:''' restorecontext will only restore data from the database, not from the filestore. During the restore the context and the filestore content will be deleted, so make a backup first or if you deleted an context by accident you have to restore the filestore content after restorecontext.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Old dump without --hex-blob ===&lt;br /&gt;
&lt;br /&gt;
If you have done a dump according to a former version of this document the dump contains the &lt;br /&gt;
direct binary data which can't be understood by the restore tool. You will get errors like &lt;br /&gt;
&amp;quot;Data truncation: Data too long for column 'uuid' at row 1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION: The steps below need to be done on a NEW MySQL instance NOT the productive one.'''&lt;br /&gt;
&lt;br /&gt;
To get the correct version of the dump you need to apply the dump to a clean MySQL database.&lt;br /&gt;
If the dump was created with &amp;lt;tt&amp;gt;--all-databases&amp;lt;/tt&amp;gt; you can just pipe the contents into mysql:&lt;br /&gt;
&amp;lt;tt&amp;gt;mysql &amp;lt; mydump.txt&amp;lt;/tt&amp;gt;. If you have different dump for each database you have to create&lt;br /&gt;
the corresponding database in MySQL first. The name of the database to be created can be found at&lt;br /&gt;
the beginning of the dump file&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- Host: localhost    Database: configdb&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
So for the example simply issue &amp;lt;tt&amp;gt;create database configdb&amp;lt;/tt&amp;gt; and apply the dump directly to &lt;br /&gt;
this database: &amp;lt;tt&amp;gt;mysql configdb &amp;lt; mydump.txt&amp;lt;/tt&amp;gt; (pay attention to give the name of the database &lt;br /&gt;
to mysql in this case).&lt;br /&gt;
Afterwards just create the mysqldump from this database with the correct --hex-blob parameter.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=ContextRestore_Bundle&amp;diff=22421</id>
		<title>ContextRestore Bundle</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=ContextRestore_Bundle&amp;diff=22421"/>
		<updated>2016-10-05T09:39:20Z</updated>

		<summary type="html">&lt;p&gt;Malasa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Context Restore Documentation =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
This document contains descriptions about the context restore bundle. This&lt;br /&gt;
bundle is a solution for restoring one single context out of a mysql dump from&lt;br /&gt;
a complete Open-Xchange database. In a distributed setup, it is possible to use&lt;br /&gt;
several files containing the dumps of different databases. The tool described&lt;br /&gt;
within this document does fetch the needed information out of these files.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
You must not delete the last context from within a database schema.&lt;br /&gt;
If you just have ONE context left in your system, do NOT delete it.&lt;br /&gt;
That is because the deletion of the last contexts leads into deletion of the entire schema.&lt;br /&gt;
In that case, you have to restore a complete database dump. restorecontext will not work in that case.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
For correct operation, it is required that the mysql dumps for this tool&lt;br /&gt;
represent a consistent state of all databases the Open-Xchange server has under&lt;br /&gt;
control.  Furthermore this consistent state needs also to include the backup of&lt;br /&gt;
the filestore.&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-admin-plugin-contextrestore|sopath=stable|version=7.x}}&lt;br /&gt;
&lt;br /&gt;
After the package has been installed, a new shell script named&lt;br /&gt;
&amp;lt;tt&amp;gt;/opt/open-xchange/sbin/restorecontext&amp;lt;/tt&amp;gt; The server needs to be&lt;br /&gt;
restarted to make the new functionality available. The functionality is&lt;br /&gt;
accessible via RMI, CLT and SOAP.&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
A complete database backup has to be done before the new function can be used.&lt;br /&gt;
The Tool described within this document requires a full SQL dump of the&lt;br /&gt;
databases involved. This can be done by executing the command &lt;br /&gt;
&lt;br /&gt;
 $ mysqldump --all-databases --single-transaction --hex-blob&lt;br /&gt;
&lt;br /&gt;
on all database machines registered in Open-Xchange as well as the&lt;br /&gt;
configuration Database. These three parameters are very important. The first one&lt;br /&gt;
lets the dump contain every database on the specified database host, the&lt;br /&gt;
second is used for a consistent backup and the third one is used to let all binary data&lt;br /&gt;
appear as hex in the dump. Instead of &amp;lt;tt&amp;gt;–-all-databases&amp;lt;/tt&amp;gt; you can also&lt;br /&gt;
use &amp;lt;tt&amp;gt;–-database&amp;lt;/tt&amp;gt; with the right database(s), if none of the switches are given as&lt;br /&gt;
direct argument then mysql will left out essential data in the dump. For a full&lt;br /&gt;
backup the switch &amp;lt;tt&amp;gt;--all-databases&amp;lt;/tt&amp;gt; is recommended.&lt;br /&gt;
&lt;br /&gt;
The usage of the command line tool is self-explanatory as it confirms to the&lt;br /&gt;
standard unix behavior. &amp;lt;tt&amp;gt;--help&amp;lt;/tt&amp;gt; will show a short help with the available&lt;br /&gt;
parameters.&lt;br /&gt;
&lt;br /&gt;
The main arguments of the tool are different database dumps (from the configdb&lt;br /&gt;
and the distributed user data databases). On success the tool returns the path to&lt;br /&gt;
the filestore of the given context. The files below this path have to be restored&lt;br /&gt;
afterwards in a separate process which is not part of the Open-Xchange system.&lt;br /&gt;
An example of a restore would look like this:&lt;br /&gt;
&lt;br /&gt;
 $ restorecontext -A oxadminmaster -P secret -c 1 \&lt;br /&gt;
    -f /path/to/configdb.sql,/path/to/userdb.sql,/path/to/userdb1.sql,...&lt;br /&gt;
&lt;br /&gt;
Note: restorecontext will only restore data from the database, not from the filestore. During the restore the filestore content for the context will be deleted, so make a backup first or if you deleted an context by accident you have to restore the filestore content after restorecontext.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Old dump without --hex-blob ===&lt;br /&gt;
&lt;br /&gt;
If you have done a dump according to a former version of this document the dump contains the &lt;br /&gt;
direct binary data which can't be understood by the restore tool. You will get errors like &lt;br /&gt;
&amp;quot;Data truncation: Data too long for column 'uuid' at row 1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
'''ATTENTION: The steps below need to be done on a NEW MySQL instance NOT the productive one.'''&lt;br /&gt;
&lt;br /&gt;
To get the correct version of the dump you need to apply the dump to a clean MySQL database.&lt;br /&gt;
If the dump was created with &amp;lt;tt&amp;gt;--all-databases&amp;lt;/tt&amp;gt; you can just pipe the contents into mysql:&lt;br /&gt;
&amp;lt;tt&amp;gt;mysql &amp;lt; mydump.txt&amp;lt;/tt&amp;gt;. If you have different dump for each database you have to create&lt;br /&gt;
the corresponding database in MySQL first. The name of the database to be created can be found at&lt;br /&gt;
the beginning of the dump file&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
-- Host: localhost    Database: configdb&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
So for the example simply issue &amp;lt;tt&amp;gt;create database configdb&amp;lt;/tt&amp;gt; and apply the dump directly to &lt;br /&gt;
this database: &amp;lt;tt&amp;gt;mysql configdb &amp;lt; mydump.txt&amp;lt;/tt&amp;gt; (pay attention to give the name of the database &lt;br /&gt;
to mysql in this case).&lt;br /&gt;
Afterwards just create the mysqldump from this database with the correct --hex-blob parameter.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:ExternalLoginPage&amp;diff=22348</id>
		<title>AppSuite:ExternalLoginPage</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:ExternalLoginPage&amp;diff=22348"/>
		<updated>2016-08-24T12:06:08Z</updated>

		<summary type="html">&lt;p&gt;Malasa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= How to set up an external login page for App Suite =&lt;br /&gt;
&lt;br /&gt;
== Who should read this document ==&lt;br /&gt;
&lt;br /&gt;
This document is written for web developers who would like to create a custom login mask for the OX App Suite. The login mask can reside on an external server i. e., not directly located in the domain of the Open-Xchange machines. It is also intended for administrators who install and maintain Open-Xchange services.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== HTML ==&lt;br /&gt;
&lt;br /&gt;
The Open-Xchange [https://documentation.open-xchange.com/latest/middleware/http_api.html HTTP API (Form login)] has a function to&lt;br /&gt;
create a session from external.&lt;br /&gt;
&lt;br /&gt;
The full detailed explanation how the HTML form is used and errors can be handled can be found here:&lt;br /&gt;
&lt;br /&gt;
[[OXSessionFormLogin|OX Session Formlogin]]&lt;br /&gt;
&lt;br /&gt;
== Redirect to custom login ==&lt;br /&gt;
&lt;br /&gt;
Users can still access the original product login site. If this is not wanted the following Apache &lt;br /&gt;
configuration for your VirtualHost can be used to redirect all requests to your custom login page:&lt;br /&gt;
&lt;br /&gt;
before 7.8.0:&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteRule ^/appsuite/signin /custom-login.html [R]&lt;br /&gt;
&lt;br /&gt;
Since 7.8.0 it can be configured directly in &amp;lt;code&amp;gt;/opt/open-xchange/etc/as-config.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Override certain settings&lt;br /&gt;
default:&lt;br /&gt;
    host: all&lt;br /&gt;
    loginLocation: 'http://example.com/appsuite/mycustomlogin.html'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: you need to have the right syntax (like leading spaces) in the .yml file.&lt;br /&gt;
&lt;br /&gt;
It is possible to have different login pages for different domains, just add another section with a different host: &amp;lt;mydomain.com&amp;gt; line.&lt;br /&gt;
&lt;br /&gt;
== Setting custom login as logout location ==&lt;br /&gt;
&lt;br /&gt;
If users should be directed to the custom login form after logout from App Suite the following property can be set globally somewhere in /opt/open-xchange/etc/settings/. Either create a new properties file or add the option in any existing one. For more complex setups e.g. with different brands please check out how to set this property in context or user scope which is explained [[ConfigCascade|here]].&lt;br /&gt;
&lt;br /&gt;
 io.ox/core//customLocations/logout=https://login.example.com&lt;br /&gt;
&lt;br /&gt;
For cases where only one custom login page exists for all users it's also recommended to set&lt;br /&gt;
&lt;br /&gt;
 logoutLocation: 'https://login.example.com/'&lt;br /&gt;
&lt;br /&gt;
in '''/opt/open-xchange/etc/as-config.yml'''. This setting takes effect for example if an autologin session is expired. as-config.yml itself defines settings in dependence of the hostname configured for the Open-Xchange access.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:OX_Drive&amp;diff=21835</id>
		<title>AppSuite:OX Drive</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:OX_Drive&amp;diff=21835"/>
		<updated>2016-04-18T12:11:36Z</updated>

		<summary type="html">&lt;p&gt;Malasa: /* 7.8.0 and earlier */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OX Drive =&lt;br /&gt;
&lt;br /&gt;
In OX App Suite, Open-Xchange provides a cloud storage called OX Drive. It provides file- and folder synchronization across multiple devices in the most simplest way for the end user, fully optimized for each device type. This article explains how to set up the server-side components for OX Drive, as well as details about the app setup.&lt;br /&gt;
&lt;br /&gt;
== Key features ==&lt;br /&gt;
&lt;br /&gt;
* Native Apps for Windows, Mac OS, iOS and Android&lt;br /&gt;
* Easy and attractive upsell properties (e.g. Upsell based on Quota limitations)&lt;br /&gt;
* Apps are specially designed for the devices they run on taking into account limitations such as battery life, screen limitations, bandwidth etc.&lt;br /&gt;
* Controlled synchronization of files across devices&lt;br /&gt;
* Storage management (e.g. quota control, upload limits)&lt;br /&gt;
* Connection type recognition and adaptation (e.g. Wi-Fi, cell network)&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
&lt;br /&gt;
OX Drive is a combination of two components:&lt;br /&gt;
* OX Drive in OX App Suite&lt;br /&gt;
* OX Drive Apps (optional native app components for synchronization)&lt;br /&gt;
&lt;br /&gt;
OX Drive is available for the following native apps:&lt;br /&gt;
* OX Drive for Windows&lt;br /&gt;
* OX Drive for Mac OS&lt;br /&gt;
* OX Drive for iOS&lt;br /&gt;
* OX Drive for Android&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
You will find the requirements under [[AppSuite:OX_System_Requirements#OX_Drive_for_Clients|OX Drive App and Platform Requirements]]&lt;br /&gt;
&lt;br /&gt;
= Server-side Installation and Configuration =&lt;br /&gt;
&lt;br /&gt;
This chapter describes how the backend components of OX Drive are installed and configured on the server.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* Open-Xchange Server v7.4.2 and above (''open-xchange-core'')&lt;br /&gt;
* Grizzly HTTP connector (''open-xchange-grizzly''), see [[AppSuite:Grizzly]] for details, with ''Comet'' support enabled in ''grizzly.properties''&lt;br /&gt;
* Valid Push-Certificates / API keys for cloud-based notifications, see configuration below&lt;br /&gt;
* Enabled Hazelcast for inter-OX-communication, see [[AppSuite:Running_a_cluster]] for details&lt;br /&gt;
&lt;br /&gt;
== Available packages ==&lt;br /&gt;
&lt;br /&gt;
Open-Xchange Drive is available with the following backend packages:&lt;br /&gt;
&lt;br /&gt;
* ''open-xchange-drive'' - The main server components for OX Drive&lt;br /&gt;
* ''open-xchange-drive-comet'' - Provides the Push interface via long-polling for the desktop apps&lt;br /&gt;
* ''open-xchange-drive-help-*'' - Online help in various languages for the OX Drive applications (these were called ''open-xchange-appsuite-help-drive-*'' in versions earlier than Open-Xchange Server v7.6.2)&lt;br /&gt;
* ''open-xchange-drive-restricted'' - Restricted components, including prerequisites for cloud-based push notifications&lt;br /&gt;
&lt;br /&gt;
Installation on the server varies depending on the underlying distribution, details are available in the following chapters.&lt;br /&gt;
&lt;br /&gt;
=== OX Drive for Windows ===&lt;br /&gt;
&lt;br /&gt;
Additionally OX Drive for Windows can be provided to users by installing additional packages. However there are significant differences between 7.8.0 and earlier releases and 7.8.1 and later ones:&lt;br /&gt;
&lt;br /&gt;
==== 7.8.0 and earlier ====&lt;br /&gt;
&lt;br /&gt;
OX Drive for Windows can be provided via the [[AppSuite:Open-Xchange_Updater|Open-Xchange Updater]] by installing the package ''open-xchange-updater-drive''. Initial installation and updates are performed by the Updater then. You don't have to add the repositories below.&lt;br /&gt;
&lt;br /&gt;
==== 7.8.1 and later ====&lt;br /&gt;
&lt;br /&gt;
With OX App Suite 7.8.1 and OX Drive for Windows 2.0.0, the app is able to update itself and can be downloaded from the Web UI directly via the [[AppSuite:Client_Onoarding|App Onboarding Wizard]]. Therefore the wizard must be installed and configured for OX Drive users. Besides the client onboarding feature you need the following packages:&lt;br /&gt;
&lt;br /&gt;
* ''open-xchange-drive-client-windows'' - The main server component to provide the app&lt;br /&gt;
* ''open-xchange-drive-client-windows-generic'' - The package providing the final binary files to be installed on users machines.&lt;br /&gt;
&lt;br /&gt;
To make the app download available via the app onboarding wizard, you need to enable the according scenario. Edit ''/opt/open-xchange/etc/client-onboarding-scenarios.yml'' and get to the ''drivewindowsclientinstall'' section, where you have to set the ''enabled'' property to ''true''.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Please note that there still exists a compatibility layer between the old Updater-based approach and the new direct install and self-update one. If you start providing OX Drive for Windows with 7.8.1 or later you MAY decide to enable that compatibility by installing ''open-xchange-updater-drive'', however we advice not to do so. If you already provided OX Drive for Windows with 7.8.0 or earlier, you MUST install this package and further provide the Updater. Otherwise the apps out there will not be able to be updated to the 2.0.0 version, which is then self-update capable.&lt;br /&gt;
&lt;br /&gt;
===== Custom branded apps =====&lt;br /&gt;
&lt;br /&gt;
OX Drive for Windows can be purchased with a custom theming. In such cases, the according binary files need to be installed on the middleware servers. Instead of the ''open-xchange-drive-client-windows-generic'' package, a package containing the branded binaries will be provided as ''open-xchange-drive-client-windows-&amp;lt;brand-name&amp;gt;'' and needs to be installed. You MUST then set the property ''com.openexchange.drive.update.branding'' in ''/opt/open-xchange/etc/drive-client-windows.properties'' to ''&amp;lt;brand-name&amp;gt;'' accordingly.&lt;br /&gt;
&lt;br /&gt;
It is also possible to provide multiple brands of the app via the same OX App Suite deployment, multiple ''open-xchange-drive-client-windows-&amp;lt;brand-name&amp;gt;'' packages can be installed in parallel. Which brand is available for a certain user is determined by the ''com.openexchange.drive.update.branding'' property, which can be overwritten via [[ConfigCascade|Config Cascade]] therefore.&lt;br /&gt;
&lt;br /&gt;
App brands can be managed via command line tools. The tool ''/opt/open-xchange/sbin/listdriveclients'' lists all installed brands. After updating a certain brand by installing a newer package version or installing an additional one, no server restart is necessary. Instead ''/opt/open-xchange/sbin/reloaddriveclients'' can be executed to refresh the internal server state.&lt;br /&gt;
&lt;br /&gt;
=== Redhat Enterprise Linux 6 or CentOS 6 ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange yum configuration:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=rhelname|pc2v=RHEL6|backend}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=rhelname|pc2v=RHEL6|drive-help}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=rhelname|pc2v=RHEL6|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|backend/updates|drive|updater}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=rhelname|pc2v=RHEL6|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-help/updates}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=rhelname|pc2v=RHEL6|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-client-windows}}&lt;br /&gt;
&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ yum update&lt;br /&gt;
 $ yum install open-xchange-drive open-xchange-drive-comet open-xchange-drive-restricted open-xchange-drive-client-windows&lt;br /&gt;
&lt;br /&gt;
=== Redhat Enterprise Linux 7 or CentOS 7 ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange yum configuration:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=rhelname|pc2v=RHEL7|backend}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=rhelname|pc2v=RHEL7|drive-help}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=rhelname|pc2v=RHEL7|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|backend/updates|drive|updater}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=rhelname|pc2v=RHEL7|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-help/updates}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=rhelname|pc2v=RHEL7|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-client-windows}}&lt;br /&gt;
&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ yum update&lt;br /&gt;
 $ yum install open-xchange-drive open-xchange-drive-comet open-xchange-drive-restricted open-xchange-drive-client-windows&lt;br /&gt;
&lt;br /&gt;
=== Debian GNU/Linux 7.0 ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange apt configuration:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=debianname|pc2v=DebianWheezy|backend}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=debianname|pc2v=DebianWheezy|drive-help}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=debianname|pc2v=DebianWheezy|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|backend/updates|drive|updater}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=debianname|pc2v=DebianWheezy|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-help/updates}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=debianname|pc2v=DebianWheezy|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-client-windows}}&lt;br /&gt;
&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ apt-get update&lt;br /&gt;
 $ apt-get install open-xchange-drive open-xchange-drive-comet open-xchange-drive-restricted open-xchange-drive-client-windows&lt;br /&gt;
&lt;br /&gt;
=== Debian GNU/Linux 8.0 ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange apt configuration:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=debianname|pc2v=DebianJessie|backend}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=debianname|pc2v=DebianJessie|drive-help}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=debianname|pc2v=DebianJessie|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|backend/updates|drive|updater}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=debianname|pc2v=DebianJessie|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-help/updates}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=debianname|pc2v=DebianJessie|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-client-windows}}&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ apt-get update&lt;br /&gt;
 $ apt-get install open-xchange-drive open-xchange-drive-comet open-xchange-drive-restricted open-xchange-drive-client-windows&lt;br /&gt;
&lt;br /&gt;
=== SUSE Linux Enterprise Server 11 ===&lt;br /&gt;
&lt;br /&gt;
Add the package repository using zypper if not already present:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=susename|pc2v=SLES11|backend}}&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=susename|pc2v=SLES11|drive-help}}&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=susename|pc2v=SLES11|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|backend/updates|drive|updater}}&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=susename|pc2v=SLES11|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-help/updates}}&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=susename|pc2v=SLES11|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-client-windows}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ zypper ref&lt;br /&gt;
 $ zypper in open-xchange-drive open-xchange-drive-comet open-xchange-drive-restricted open-xchange-drive-client-windows&lt;br /&gt;
&lt;br /&gt;
=== SUSE Linux Enterprise Server 12 ===&lt;br /&gt;
&lt;br /&gt;
Add the package repository using zypper if not already present:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=susename|pc2v=SLE_12|backend}}&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=susename|pc2v=SLE_12|drive-help}}&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products/appsuite/stable|pc2n=susename|pc2v=SLE_12|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|backend/updates|drive|updater}}&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=susename|pc2v=SLE_12|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-help/updates}}&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products/drive/stable|pc2n=susename|pc2v=SLE_12|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|drive-client-windows}}&lt;br /&gt;
&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ zypper ref&lt;br /&gt;
 $ zypper in open-xchange-drive open-xchange-drive-comet open-xchange-drive-restricted open-xchange-drive-client-windows&lt;br /&gt;
&lt;br /&gt;
=== OX Server Edition / App Suite for UCS ===&lt;br /&gt;
&lt;br /&gt;
If you have purchased the OX Server Edition / App Suite for UCS, the OX Drive is part of the offering and after the installation/update available. The necessary package for push, is available with a valid license and can be installed via the Univention App Center.&lt;br /&gt;
&lt;br /&gt;
* The new license is already registered at the LDB after purchase.&lt;br /&gt;
* Log on at the Univention Management Console (UMC)&lt;br /&gt;
* Make sure, that the correct LDB account has been selected in the UMC module &amp;quot;OX License Management&amp;quot;&lt;br /&gt;
* Click on &amp;quot;App Center&amp;quot; at the UMC und switch to the tab &amp;quot;Repository Settings&amp;quot;&lt;br /&gt;
* Within the component list, select &amp;quot;Open-Xchange Drive&amp;quot; and press the &amp;quot;Install&amp;quot; button&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following gives an overview about the most important settings to enable file synchronization via OX Drive, especially when it comes to real-time Push notifications for the apps.&lt;br /&gt;
&lt;br /&gt;
All settings regarding the OX Drive backend component are located in the configuration file ''drive.properties''. The default configuration should be sufficient for a basic &amp;quot;up-and-running&amp;quot; setup (with the exception of defining the Push certificates and API keys for cloud-based app notifications, see next chapters). Please refer to the inline documentation of the configuration file for more advanced options. &lt;br /&gt;
&lt;br /&gt;
=== Push via Google Cloud Messaging (GCM) ===&lt;br /&gt;
&lt;br /&gt;
The OX Drive application for Android devices is able to receive Push notifications from the Open-Xchange Server via [http://developer.android.com/google/gcm/index.html Google Cloud Messaging (GCM)]. To issue those Push messages, the backend needs to be provided with a suitable API key for the corresponding Android app application. The API key is included in the restricted components installation package ''open-xchange-drive-restricted'' for the &amp;quot;vanilla&amp;quot; Android app. Alternatively, the key can be specified directly in the ''drive.properties'' configuration file:&lt;br /&gt;
&lt;br /&gt;
 # Specifies the API key of the server application. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.drive.events.gcm.enabled&amp;quot; is &amp;quot;true&amp;quot; and the package &lt;br /&gt;
 # containing the restricted drive components is not installed.&lt;br /&gt;
 com.openexchange.drive.events.gcm.key=&lt;br /&gt;
&lt;br /&gt;
Push via GCM can be enabled via:&lt;br /&gt;
&lt;br /&gt;
 # Enables or disables push event notifications to apps using the Google&lt;br /&gt;
 # Cloud Messaging (GCM) service. This requires a valid configuration for the &lt;br /&gt;
 # GCM API key, see options below. Defaults to &amp;quot;false&amp;quot;. &lt;br /&gt;
 com.openexchange.drive.events.gcm.enabled=true&lt;br /&gt;
&lt;br /&gt;
Please note that push via GCM needs to be enabled explicitly - also if ''open-xchange-drive-restricted'' is installed.&lt;br /&gt;
&lt;br /&gt;
=== Push via Apple Push Notification service (APNs) ===&lt;br /&gt;
&lt;br /&gt;
The OX Drive application for iOS and Mac OS devices is able to receive Push notifications from the Open-Xchange Server via [http://developer.apple.com/library/IOS/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html Apple Push Notification service (APNs)]. To issue those Push messages, the backend needs to be provided with a suitable keystore container file (PKCS #12) containing the APNs certificate and keys. Note that the Mac OS desktop app and the iOS mobile app are served separately with different certificates, so that both needs to be configured independantly. The required certificates are already included in the restricted components installation package ''open-xchange-drive-restricted'' for the &amp;quot;vanilla&amp;quot; iOS and Mac OS app applications. Therefore no additional configuration is needed. Alternatively, a external certificate can be specified directly in the ''drive.properties'' configuration file (the following only shows the setup for iOS). First, the path to the PKCS #12 container file needs to be specified at:&lt;br /&gt;
&lt;br /&gt;
 # Specifies the path to the local keystore file (PKCS #12) containing the APNS &lt;br /&gt;
 # certificate and keys for the iOS application, e.g. &lt;br /&gt;
 # &amp;quot;/opt/open-xchange/etc/drive-apns.p12&amp;quot;. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.drive.events.apn.enabled&amp;quot; is &amp;quot;true&amp;quot; and the package &lt;br /&gt;
 # containing the restricted drive components is not installed.&lt;br /&gt;
 com.openexchange.drive.events.apn.ios.keystore=&lt;br /&gt;
&lt;br /&gt;
This file is opened by the backend using the password as supplied via: &lt;br /&gt;
 &lt;br /&gt;
 # Specifies the password used when creating the referenced keystore containing&lt;br /&gt;
 # the certificate of the iOS application. Note that blank or null passwords &lt;br /&gt;
 # are in violation of the PKCS #12 specifications. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.drive.events.apn.enabled&amp;quot; is &amp;quot;true&amp;quot; and the package &lt;br /&gt;
 # containing the restricted drive components is not installed.&lt;br /&gt;
 com.openexchange.drive.events.apn.ios.password=&lt;br /&gt;
&lt;br /&gt;
Configuration also allows to switch between development and production environments, however, this setting should be ''true'' normally:&lt;br /&gt;
&lt;br /&gt;
 # Indicates which APNS service is used when sending push notifications to iOS&lt;br /&gt;
 # devices. A value of &amp;quot;true&amp;quot; will use the production service, a value of &lt;br /&gt;
 # &amp;quot;false&amp;quot; the sandbox service. Defaults to &amp;quot;true&amp;quot;.&lt;br /&gt;
 com.openexchange.drive.events.apn.ios.production=true&lt;br /&gt;
&lt;br /&gt;
The OX backend contacts the APNs servers from time to time to get informed about apps no longer reachable apps where the applications was uninstalled. The interval can be defined with the following setting: &lt;br /&gt;
&lt;br /&gt;
 # Configures the interval between queries to the APN feedback service for the&lt;br /&gt;
 # subscribed iOS devices. The value can be defined using units of measurement: &lt;br /&gt;
 # &amp;quot;D&amp;quot; (=days), &amp;quot;W&amp;quot; (=weeks) and &amp;quot;H&amp;quot; (=hours). Defaults to &amp;quot;1D&amp;quot; (one day). &lt;br /&gt;
 # Leaving this parameter empty disables the feedback queries on this node. &lt;br /&gt;
 # Since each received feedback is processed cluster-wide, only one node in the &lt;br /&gt;
 # cluster should be enabled here. &lt;br /&gt;
 com.openexchange.drive.events.apn.ios.feedbackQueryInterval=1D&lt;br /&gt;
&lt;br /&gt;
Please note that if you have multiple backend nodes in the cluster, it's recommended that only one node is configured to contact the feedback query service. Finally, Push notifications via APN for iOS can be enabled via:&lt;br /&gt;
&lt;br /&gt;
 # Enables or disables push event notifications to apps using the Apple Push&lt;br /&gt;
 # Notification service (APNS) for Mac OS devices. This requires a valid &lt;br /&gt;
 # configuration for the APNS certificate and keys, see either options below, &lt;br /&gt;
 # or install the restricted components packages for drive. Defaults to &lt;br /&gt;
 # &amp;quot;false&amp;quot;. &lt;br /&gt;
 com.openexchange.drive.events.apn.ios.enabled=false&lt;br /&gt;
&lt;br /&gt;
As stated above, configuration for Push notifications via APN for the Mac OS desktop application is configured similarly, the relevant options are prefixed with ''com.openexchange.drive.events.apn.macos''. Please also note that push via APNS needs to be enabled explicitly - also if ''open-xchange-drive-restricted'' is installed.&lt;br /&gt;
&lt;br /&gt;
=== Further Configuration ===&lt;br /&gt;
&lt;br /&gt;
* The backend component of OX Drive supplies the apps with various hyperlinks, e.g. deep-links to files and folders in the groupware webinterface or an URL to the online help. In order to point to the suitable web interface, please ensure that the correct UI web path is configured via ''com.openexchange.UIWebPath'' located in ''server.properties''.&lt;br /&gt;
* As already mentioned above, the backend relies on the [https://grizzly.java.net/comet.html Comet] component of the Grizzly http connector for sending push notifications to the desktop apps. Therefore, ''com.openexchange.http.grizzly.hasCometEnabled'' needs to be set to ''true'' in ''grizzly.properties''.&lt;br /&gt;
&lt;br /&gt;
= Enabling OX Drive for Users =&lt;br /&gt;
&lt;br /&gt;
OX Drive is enabled for all users that have the capability ''com.openexchange.capability.drive''. Please note that users need to have the ''infostore'' permission set to use drive. So the users that have ''drive'' enabled must be a subset of those users with ''infostore'' permission. Since 7.6.0 we enforce this via the default configuration. You can also enable this cabaility globally with the following setting in the ''drive.properties'' configuration file:&lt;br /&gt;
&lt;br /&gt;
 # Enables or disables the &amp;quot;drive&amp;quot; module capability globally. The capability&lt;br /&gt;
 # can also be set more fine-grained via config cascade. Per default it is only&lt;br /&gt;
 # enabled for users that have the &amp;quot;infostore&amp;quot; permission set. This is configured&lt;br /&gt;
 # in /opt/open-xchange/etc/contextSets/drive.yml.&lt;br /&gt;
 com.openexchange.capability.drive=false&lt;br /&gt;
&lt;br /&gt;
More details about capabilities can be found at [[AppSuite:Capabilities]]. Furthermore, this capability can be defined in a more granular way using the Config Cascade as described at [[ConfigCascade]].&lt;br /&gt;
&lt;br /&gt;
= Installation of the Apps =&lt;br /&gt;
&lt;br /&gt;
== Installation of Mac OS X Desktop App ==&lt;br /&gt;
&lt;br /&gt;
The OX Drive for Mac OS X will be provided via the Apple App Store:&lt;br /&gt;
&lt;br /&gt;
* https://itunes.apple.com/app/ox-drive/id818195014?mt=12&lt;br /&gt;
&lt;br /&gt;
=== Enabling the Finder Extension on Mac OS X ===&lt;br /&gt;
&lt;br /&gt;
In order to be able to use the Finder to open documents or share objects on a Mac OS X workstation, you need to enable the Drive Finder Extension.&lt;br /&gt;
&lt;br /&gt;
How to enable the Drive Finder Extension on a Mac OS X workstation:&lt;br /&gt;
# Open the System Preferences. In the System Preferences window, select Extensions.&lt;br /&gt;
# In the Extensions window, select Finder. Enable Drive Finder Extension.&lt;br /&gt;
&lt;br /&gt;
== Installation of Windows Desktop App ==&lt;br /&gt;
&lt;br /&gt;
See [[AppSuite:OX_Drive#OX_Drive_for_Windows|OX Drive for Windows]].&lt;br /&gt;
&lt;br /&gt;
== Installation on Mobile Apps ==&lt;br /&gt;
&lt;br /&gt;
The OX Drive App is available via the different App Stores:&lt;br /&gt;
&lt;br /&gt;
* iOS: https://itunes.apple.com/app/ox-drive/id798570177?mt=8&lt;br /&gt;
&lt;br /&gt;
* Android: https://play.google.com/store/apps/details?id=com.openexchange.drive.vanilla&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== App Configuration and Deployment ==&lt;br /&gt;
&lt;br /&gt;
The user needs to enter the server URL and provide his username and password. Afterwards, app-specific settings may be configured. This includes the synchronization mode (All files / Favorites only) and Photostream settings on mobile devices, or the local root synchronization folder for the desktop applications. More information is available in the online documentation. &lt;br /&gt;
&lt;br /&gt;
After the initial synchronization is completed, all further changes are synchronized instantly across all devices.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= FAQ =&lt;br /&gt;
&lt;br /&gt;
You will find it under [http://knowledgebase.open-xchange.com/sales-marketing/additional-software/frequently-asked-questions/ox-drive-for-clients.html OX Drive App and Platform FAQ].&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Embedding_your_settings_into_AppSuite_settings&amp;diff=21488</id>
		<title>AppSuite:Embedding your settings into AppSuite settings</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Embedding_your_settings_into_AppSuite_settings&amp;diff=21488"/>
		<updated>2016-02-15T12:14:01Z</updated>

		<summary type="html">&lt;p&gt;Malasa: added settings folder, advancedMode info&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- !!! --&amp;gt;&lt;br /&gt;
&amp;lt;!-- PLEASE APPLY CHANGES ONLY TO THE NEW TECHNICAL DOCUMENTATION: wd/frontend/web/documentation --&amp;gt; &lt;br /&gt;
&amp;lt;!-- !!! --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Embedding your settings into AppSuite settings&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Synopsis:'' This article explains how you can embed your own configuration page via iFrame into the AppSuite's settings and pass our session onto your implementation. This is a replacement for &amp;quot;Config Jump&amp;quot; of OX6. Not to be confused with [[AppSuite:Creating_a_settings_section_in_AppSuite_settings | simply adding new settings]] into AppSuite&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Declare the page you want to embed ==&lt;br /&gt;
&lt;br /&gt;
Before you start you need to know the group where you want to add the settings (since 7.8.0):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gerneral:&lt;br /&gt;
Basic Settings&lt;br /&gt;
Accounts&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
Portal&lt;br /&gt;
Mail&lt;br /&gt;
Guard&lt;br /&gt;
Address Book&lt;br /&gt;
Calendar&lt;br /&gt;
Tasks&lt;br /&gt;
Drive&lt;br /&gt;
&lt;br /&gt;
tools:&lt;br /&gt;
Pubications and Subscriptions&lt;br /&gt;
Error Log&lt;br /&gt;
Download&lt;br /&gt;
&lt;br /&gt;
external:&lt;br /&gt;
Groups&lt;br /&gt;
Resources&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: the layout of the settings page might differ depending on which packages you have installed and/or which capabilities the user has.&lt;br /&gt;
&lt;br /&gt;
You can declare pages to embed via [[ConfigCascade|Config Cascade]] settings. There are several ways to do so, this example uses the most comfortable one, a YAML declaration:&lt;br /&gt;
&lt;br /&gt;
 ➜ /opt/open-xchange/etc/settings/configjump.yml&lt;br /&gt;
 io.ox/settings/configjump//changePlans:&lt;br /&gt;
    url: &amp;quot;http://localhost/~fla/changePlans.php?token=[token]&amp;quot;&lt;br /&gt;
    group: general&lt;br /&gt;
    title: &amp;quot;Change Plan&amp;quot;&lt;br /&gt;
    before: &amp;quot;io.ox/settings/accounts&amp;quot;&lt;br /&gt;
    advancedMode: false # not needed anymore for 7.8.0&lt;br /&gt;
&lt;br /&gt;
''io.ox/settings/configjump'' contains one object per embedded page (e.g. &amp;quot;changePlans&amp;quot;). If you want to add more pages, follow this pattern.&lt;br /&gt;
&lt;br /&gt;
An object of this type has the following properties:&lt;br /&gt;
&lt;br /&gt;
* '''url''': The URL to be branched to. The place holder [token] will be replaced by the token you get from the token login system&lt;br /&gt;
* '''title''': The title as to be seen on the settings page.&lt;br /&gt;
* '''group''': Settings section where the page is supposed to appear. Valid groups are: &amp;quot;general&amp;quot;, &amp;quot;main&amp;quot;, &amp;quot;tools&amp;quot;, and &amp;quot;external&amp;quot;. Default is &amp;quot;tools&amp;quot;. For settings inside folders you have to use the group and the name of the config object, for example: group: main/io.ox/mail&lt;br /&gt;
* '''after''', '''before''' or '''index''': To define the exact location of the page. ''Hint:'' If you want to name a page as reference (as opposed to using the index), you need to figure out the name. One way to do so is go to that page in the settings and check for the id parameter in the URL (for example http://my.ox/appsuite/#!!&amp;amp;app=io.ox/settings&amp;amp;folder=virtual/settings/io.ox/tasks will be io.ox/tasks)&lt;br /&gt;
&lt;br /&gt;
It's also possible to provide custom translations for the title. Just add &amp;quot;title_&amp;quot; plus the locale:&lt;br /&gt;
 &lt;br /&gt;
 io.ox/settings/configjump//changePlans:&lt;br /&gt;
    url: &amp;quot;http://localhost/~fla/changePlans.php?token=[token]&amp;quot;&lt;br /&gt;
    title: &amp;quot;Change Plan&amp;quot;&lt;br /&gt;
    title_en_US: &amp;quot;Change plan&amp;quot;&lt;br /&gt;
    title_de_DE: &amp;quot;Plan ändern&amp;quot;&lt;br /&gt;
    title_fr_FR: &amp;quot;...&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    after: &amp;quot;io.ox/mail&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Create a secret ==&lt;br /&gt;
&lt;br /&gt;
Now you just need to declare the app your are about to embed in the backend and you are good to go:&lt;br /&gt;
&lt;br /&gt;
 ➜ cat /opt/open-xchange/etc/tokenlogin-secrets&lt;br /&gt;
 #&lt;br /&gt;
 # Listing of known Web Application secrets followed by an optional semicolon-separated parameter list&lt;br /&gt;
 #&lt;br /&gt;
 # e.g. 1254654698621354; accessPasword=true&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 # Dummy entry&lt;br /&gt;
 # 1234-56789-98765-4321; accessPassword=true&lt;br /&gt;
 12345-phpapp-54321&lt;br /&gt;
&lt;br /&gt;
This secret, combined with the token, can be traded for a login.&lt;br /&gt;
&lt;br /&gt;
== Redeem a token ==&lt;br /&gt;
&lt;br /&gt;
 GET /login?action=redeemToken&lt;br /&gt;
&lt;br /&gt;
* '''token''': The token you want to trade.&lt;br /&gt;
* '''secret''': A valid secret for your app.&lt;br /&gt;
&lt;br /&gt;
This request can be sent by the embedded app to the AppSuite backend to get authorisation info.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:AppSuite]]&lt;br /&gt;
&lt;br /&gt;
[[Category:UI]][[Category:Backend]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Administrator]][[Category:Developer]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stuck somewhere? ==&lt;br /&gt;
You got stuck with a problem while developing? OXpedia might help you out with the article about [[AppSuite:Debugging_the_UI | debugging the UI]].&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Embedding_your_settings_into_AppSuite_settings&amp;diff=21487</id>
		<title>AppSuite:Embedding your settings into AppSuite settings</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Embedding_your_settings_into_AppSuite_settings&amp;diff=21487"/>
		<updated>2016-02-15T10:20:53Z</updated>

		<summary type="html">&lt;p&gt;Malasa: added overview of groups&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- !!! --&amp;gt;&lt;br /&gt;
&amp;lt;!-- PLEASE APPLY CHANGES ONLY TO THE NEW TECHNICAL DOCUMENTATION: wd/frontend/web/documentation --&amp;gt; &lt;br /&gt;
&amp;lt;!-- !!! --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Embedding your settings into AppSuite settings&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
''Synopsis:'' This article explains how you can embed your own configuration page via iFrame into the AppSuite's settings and pass our session onto your implementation. This is a replacement for &amp;quot;Config Jump&amp;quot; of OX6. Not to be confused with [[AppSuite:Creating_a_settings_section_in_AppSuite_settings | simply adding new settings]] into AppSuite&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Declare the page you want to embed ==&lt;br /&gt;
&lt;br /&gt;
Before you start you need to know the group where you want to add the settings (since 7.8.0):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gerneral:&lt;br /&gt;
Basic Settings&lt;br /&gt;
Accounts&lt;br /&gt;
&lt;br /&gt;
main:&lt;br /&gt;
Portal&lt;br /&gt;
Mail&lt;br /&gt;
Guard&lt;br /&gt;
Address Book&lt;br /&gt;
Calendar&lt;br /&gt;
Tasks&lt;br /&gt;
Drive&lt;br /&gt;
&lt;br /&gt;
tools:&lt;br /&gt;
Pubications and Subscriptions&lt;br /&gt;
Error Log&lt;br /&gt;
Download&lt;br /&gt;
&lt;br /&gt;
external:&lt;br /&gt;
Groups&lt;br /&gt;
Resources&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: the layout of the settings page might differ depending on which packages you have installed and/or which capabilities the user has.&lt;br /&gt;
&lt;br /&gt;
You can declare pages to embed via [[ConfigCascade|Config Cascade]] settings. There are several ways to do so, this example uses the most comfortable one, a YAML declaration:&lt;br /&gt;
&lt;br /&gt;
 ➜ /opt/open-xchange/etc/settings/configjump.yml&lt;br /&gt;
 io.ox/settings/configjump//changePlans:&lt;br /&gt;
    url: &amp;quot;http://localhost/~fla/changePlans.php?token=[token]&amp;quot;&lt;br /&gt;
    group: general&lt;br /&gt;
    title: &amp;quot;Change Plan&amp;quot;&lt;br /&gt;
    before: &amp;quot;io.ox/settings/accounts&amp;quot;&lt;br /&gt;
    advancedMode: false&lt;br /&gt;
&lt;br /&gt;
''io.ox/settings/configjump'' contains one object per embedded page (e.g. &amp;quot;changePlans&amp;quot;). If you want to add more pages, follow this pattern.&lt;br /&gt;
&lt;br /&gt;
An object of this type has the following properties:&lt;br /&gt;
&lt;br /&gt;
* '''url''': The URL to be branched to. The place holder [token] will be replaced by the token you get from the token login system&lt;br /&gt;
* '''title''': The title as to be seen on the settings page.&lt;br /&gt;
* '''group''': Settings section where the page is supposed to appear. Valid groups are: &amp;quot;general&amp;quot;, &amp;quot;main&amp;quot;, &amp;quot;tools&amp;quot;, and &amp;quot;external&amp;quot;. Default is &amp;quot;tools&amp;quot;.&lt;br /&gt;
* '''after''', '''before''' or '''index''': To define the exact location of the page. ''Hint:'' If you want to name a page as reference (as opposed to using the index), you need to figure out the name. One way to do so is go to that page in the settings and check for the id parameter in the URL (for example http://my.ox/appsuite/#!!&amp;amp;app=io.ox/settings&amp;amp;folder=virtual/settings/io.ox/tasks will be io.ox/tasks)&lt;br /&gt;
&lt;br /&gt;
It's also possible to provide custom translations for the title. Just add &amp;quot;title_&amp;quot; plus the locale:&lt;br /&gt;
 &lt;br /&gt;
 io.ox/settings/configjump//changePlans:&lt;br /&gt;
    url: &amp;quot;http://localhost/~fla/changePlans.php?token=[token]&amp;quot;&lt;br /&gt;
    title: &amp;quot;Change Plan&amp;quot;&lt;br /&gt;
    title_en_US: &amp;quot;Change plan&amp;quot;&lt;br /&gt;
    title_de_DE: &amp;quot;Plan ändern&amp;quot;&lt;br /&gt;
    title_fr_FR: &amp;quot;...&amp;quot;&lt;br /&gt;
    ...&lt;br /&gt;
    after: &amp;quot;io.ox/mail&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Create a secret ==&lt;br /&gt;
&lt;br /&gt;
Now you just need to declare the app your are about to embed in the backend and you are good to go:&lt;br /&gt;
&lt;br /&gt;
 ➜ cat /opt/open-xchange/etc/tokenlogin-secrets&lt;br /&gt;
 #&lt;br /&gt;
 # Listing of known Web Application secrets followed by an optional semicolon-separated parameter list&lt;br /&gt;
 #&lt;br /&gt;
 # e.g. 1254654698621354; accessPasword=true&lt;br /&gt;
 #&lt;br /&gt;
 &lt;br /&gt;
 # Dummy entry&lt;br /&gt;
 # 1234-56789-98765-4321; accessPassword=true&lt;br /&gt;
 12345-phpapp-54321&lt;br /&gt;
&lt;br /&gt;
This secret, combined with the token, can be traded for a login.&lt;br /&gt;
&lt;br /&gt;
== Redeem a token ==&lt;br /&gt;
&lt;br /&gt;
 GET /login?action=redeemToken&lt;br /&gt;
&lt;br /&gt;
* '''token''': The token you want to trade.&lt;br /&gt;
* '''secret''': A valid secret for your app.&lt;br /&gt;
&lt;br /&gt;
This request can be sent by the embedded app to the AppSuite backend to get authorisation info.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:AppSuite]]&lt;br /&gt;
&lt;br /&gt;
[[Category:UI]][[Category:Backend]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Administrator]][[Category:Developer]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Stuck somewhere? ==&lt;br /&gt;
You got stuck with a problem while developing? OXpedia might help you out with the article about [[AppSuite:Debugging_the_UI | debugging the UI]].&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Banner&amp;diff=21431</id>
		<title>AppSuite:Banner</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Banner&amp;diff=21431"/>
		<updated>2016-02-10T12:11:43Z</updated>

		<summary type="html">&lt;p&gt;Malasa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This information is valid for 7.8.0&lt;br /&gt;
&lt;br /&gt;
Since AppSuite 7.8.0 it is possible to have a banner on top of the application:&lt;br /&gt;
&lt;br /&gt;
[[File:Banner.png]]&lt;br /&gt;
&lt;br /&gt;
By default the banner is disabled, to use it edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/settings/appsuite.properties&amp;lt;/code&amp;gt; and add:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
io.ox/core//banner/visible=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To change the default values you have to add them to &amp;lt;code&amp;gt;/opt/open-xchange/etc/as-config.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default:&lt;br /&gt;
    host: all&lt;br /&gt;
    bannerCompany: 'mycompany'&lt;br /&gt;
    bannerProductName: 'myproductname'&lt;br /&gt;
    bannerHeight: 60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
note: the leading spaces are important in a .yml file.&lt;br /&gt;
&lt;br /&gt;
This would enable and change the company/product name for all hosts/users. A more fine grained configuration is possible via the configcascade.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=File:Banner.png&amp;diff=21430</id>
		<title>File:Banner.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=File:Banner.png&amp;diff=21430"/>
		<updated>2016-02-10T12:10:35Z</updated>

		<summary type="html">&lt;p&gt;Malasa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Banner&amp;diff=21429</id>
		<title>AppSuite:Banner</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Banner&amp;diff=21429"/>
		<updated>2016-02-10T12:10:19Z</updated>

		<summary type="html">&lt;p&gt;Malasa: Created page with &amp;quot;This information is valid for 7.8.0  Since AppSuite 7.8.0 it is possible to have a banner on top of the application  File:Banner.png  By default the banner is disabled, to...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This information is valid for 7.8.0&lt;br /&gt;
&lt;br /&gt;
Since AppSuite 7.8.0 it is possible to have a banner on top of the application&lt;br /&gt;
&lt;br /&gt;
[[File:Banner.png]]&lt;br /&gt;
&lt;br /&gt;
By default the banner is disabled, to use it edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/settings/appsuite.properties&amp;lt;/code&amp;gt; and add:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
io.ox/core//banner/visible=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To change the default values you have to add them to &amp;lt;code&amp;gt;/opt/open-xchange/etc/as-config.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default:&lt;br /&gt;
    host: all&lt;br /&gt;
    bannerCompany: 'mycompany'&lt;br /&gt;
    bannerProductName: 'myproductname'&lt;br /&gt;
    bannerHeight: 60&lt;br /&gt;
    autoStart: &amp;quot;io.ox/contacts/main&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
note: the leading spaces are important in a .yml file.&lt;br /&gt;
&lt;br /&gt;
This would enable and change the company/product name for all hosts/users. A more fine grained configuration is possible via the configcascade.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:ExternalLoginPage&amp;diff=21331</id>
		<title>AppSuite:ExternalLoginPage</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:ExternalLoginPage&amp;diff=21331"/>
		<updated>2016-01-19T08:28:37Z</updated>

		<summary type="html">&lt;p&gt;Malasa: /* Redirect to custom login */ added as-config.yml&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= How to set up an external login page for App Suite =&lt;br /&gt;
&lt;br /&gt;
== Who should read this document ==&lt;br /&gt;
&lt;br /&gt;
This document is written for web developers who would like to create a custom login mask for the OX App Suite. The login mask can reside on an external server i. e., not directly located in the domain of the Open-Xchange machines. It is also intended for administrators who install and maintain Open-Xchange services.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== HTML ==&lt;br /&gt;
&lt;br /&gt;
The Open-Xchange [[HTTP_API#Form_Login_.28since_6.20.29|HTTP API]] has a function to&lt;br /&gt;
create a session from external.&lt;br /&gt;
&lt;br /&gt;
The full detailed explanation how the HTML form is used and errors can be handled can be found here:&lt;br /&gt;
&lt;br /&gt;
[[OXSessionFormLogin|OX Session Formlogin]]&lt;br /&gt;
&lt;br /&gt;
== Redirect to custom login ==&lt;br /&gt;
&lt;br /&gt;
Users can still access the original product login site. If this is not wanted the following Apache &lt;br /&gt;
configuration for your VirtualHost can be used to redirect all requests to your custom login page:&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteRule ^/appsuite/signin /custom-login.html [R]&lt;br /&gt;
&lt;br /&gt;
Since 7.8.0 it can be configured directly in &amp;lt;code&amp;gt;/opt/open-xchange/etc/as-config.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Override certain settings&lt;br /&gt;
default:&lt;br /&gt;
    host: all&lt;br /&gt;
    loginLocation: 'http://example.com/appsuite/mycustomlogin.html'&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note: you need to have the right syntax (like leading spaces) in the .yml file.&lt;br /&gt;
&lt;br /&gt;
== Setting custom login as logout location ==&lt;br /&gt;
&lt;br /&gt;
If users should be directed to the custom login form after logout from App Suite the following property can be set globally somewhere in /opt/open-xchange/etc/settings/. Either create a new properties file or add the option in any existing one. For more complex setups e.g. with different brands please check out how to set this property in context or user scope which is explained [[ConfigCascade|here]].&lt;br /&gt;
&lt;br /&gt;
 io.ox/core//customLocations/logout=https://login.example.com&lt;br /&gt;
&lt;br /&gt;
For cases where only one custom login page exists for all users it's also recommended to set&lt;br /&gt;
&lt;br /&gt;
 logoutLocation: 'https://login.example.com/'&lt;br /&gt;
&lt;br /&gt;
in '''/opt/open-xchange/etc/as-config.yml'''. This setting takes effect for example if an autologin session is expired. as-config.yml itself defines settings in dependence of the hostname configured for the Open-Xchange access.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Xing&amp;diff=20906</id>
		<title>AppSuite:Xing</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Xing&amp;diff=20906"/>
		<updated>2015-11-23T08:09:50Z</updated>

		<summary type="html">&lt;p&gt;Malasa: new xing workflow, new screenshot&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Using Xing with OX App Suite =&lt;br /&gt;
&lt;br /&gt;
This page describes how to get an API-key needed for the XING integration features available starting with App Suite version 7.6.&lt;br /&gt;
&lt;br /&gt;
== Preparation ==&lt;br /&gt;
&lt;br /&gt;
* go to https://dev.xing.com/login&lt;br /&gt;
* log in with a valid xing account. (Please note that upon entering production status the app and the personal account used to create it will be decoupled. So there is no need to use a company account here.)&lt;br /&gt;
* click &amp;quot;+ Create App&amp;quot; in the upper right&lt;br /&gt;
&lt;br /&gt;
=== 1 App details ===&lt;br /&gt;
* enter reasonable app and developer details &lt;br /&gt;
* the app information (including logo) is what will be shown to the enduser when he decides whether to allow the app access to his xing-data&lt;br /&gt;
* set the domain of your App Suite server as &amp;quot;Callback domain&amp;quot; (e.g. &amp;quot;https://beta.ox.io/&amp;quot;)&lt;br /&gt;
* enter a text for &amp;quot;Description (English)&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
Use this connector to synchronize your XING contacts with Open-Xchange App Suite, see the public XING-profile of people sending you email, synchronize your personal information with your XING-profile, see and write XING messages and connect via XING to your contacts from within Open-Xchange App Suite. For this we humbly require the access rights to your profile and connection information you see above.&amp;lt;br&amp;gt;&lt;br /&gt;
The XING activity stream will be shown in a widget of the OX App Suite portal. With this widget you can also manually update your XING status.&amp;lt;br&amp;gt;&lt;br /&gt;
You will be able to post updates from the OX App Suite portal that contain links.&amp;lt;br&amp;gt;&lt;br /&gt;
The personal data of your XING-profile can be updated with your data in the OX App Suite addressbook with the press of one button whenever you want.&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
* (This text is provided as an example for you to adapt or translate as required.)&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2 Access rights ===&lt;br /&gt;
* select access rights so they match those in this screenshot&lt;br /&gt;
[[Image:xing-screenshot2.png|400px|Screenshot 1, showing the rights to request]]&lt;br /&gt;
&lt;br /&gt;
=== 3 User data ===&lt;br /&gt;
Select &amp;quot;Basic Data&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== 4 Developer Details ===&lt;br /&gt;
Enter your address where the production key should be send to. &lt;br /&gt;
&lt;br /&gt;
=== 5 OAuth ===&lt;br /&gt;
enter the URL of your server.&lt;br /&gt;
&lt;br /&gt;
* You should received an email from Xing after finishing the process.&lt;br /&gt;
* The production key will be send by mail.(sent via _regular_ mail to the postal address given under &amp;quot;Company Profile&amp;quot;. Please note that this may take up to a week.)&lt;br /&gt;
&lt;br /&gt;
* you will see 2 API-keys: &amp;quot;Consumer key&amp;quot; and &amp;quot;Consumer secret&amp;quot;. &lt;br /&gt;
* enter those keys in /opt/open-xchange/etc/xingoauth.properties&lt;br /&gt;
* If your OX server is reachable only via one host name, you won't have to do anything else. &lt;br /&gt;
* If your OX server is reachable by more than one host name, create or open the file &amp;quot;/opt/openexchange/etc/deferrer.properties&amp;quot; and set the properties therein as such:&lt;br /&gt;
com.openexchange.http.deferrer.url=https://mymaindomain.invalid&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=File:Xing-screenshot2.png&amp;diff=20905</id>
		<title>File:Xing-screenshot2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=File:Xing-screenshot2.png&amp;diff=20905"/>
		<updated>2015-11-23T08:06:04Z</updated>

		<summary type="html">&lt;p&gt;Malasa: xing permissions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;xing permissions&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=User:Malasa&amp;diff=20365</id>
		<title>User:Malasa</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=User:Malasa&amp;diff=20365"/>
		<updated>2015-09-10T07:46:53Z</updated>

		<summary type="html">&lt;p&gt;Malasa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hello world - justatest&lt;br /&gt;
&lt;br /&gt;
---- everthing below is wip ----&lt;br /&gt;
&lt;br /&gt;
==POC installation==&lt;br /&gt;
&lt;br /&gt;
This document shows the requirements of some typical proof of concept installations.&lt;br /&gt;
&lt;br /&gt;
A POC can be make with different setups, depending on the goal of the installation.&lt;br /&gt;
&lt;br /&gt;
The goals could be:&lt;br /&gt;
* test Open-Xchange in general&lt;br /&gt;
* test with existing environment&lt;br /&gt;
* test a clustered setup&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
It should be defined what the customer wants to test:&lt;br /&gt;
* webmail/groupware/infostore&lt;br /&gt;
* Outlook oxtender&lt;br /&gt;
* Business mobility (EAS)&lt;br /&gt;
* mobile gui&lt;br /&gt;
* everything&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here are some examples of the sizing of a POC installation. Usually 'small' should do it, if the customer wants to test with a lot of accounts (especially also EAS/Outlook) 'medium' is recommended.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;poc size&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
! small&lt;br /&gt;
! medium&lt;br /&gt;
! cluster&lt;br /&gt;
|-&lt;br /&gt;
| Hardware&lt;br /&gt;
| VM, 2GB memory&lt;br /&gt;
| VM, 8GB memory&lt;br /&gt;
| 2x OX 8GB, 2x DB, external IMAP/SMTP, NFS, loadbalancer&lt;br /&gt;
|-&lt;br /&gt;
| Storage&lt;br /&gt;
| 20GB local&lt;br /&gt;
| 40GB local&lt;br /&gt;
| OX 40GB local, DB 20GB local, NFS 20GB&lt;br /&gt;
|-&lt;br /&gt;
| DB&lt;br /&gt;
| local&lt;br /&gt;
| local&lt;br /&gt;
| 2x DB VM/Server&lt;br /&gt;
|-&lt;br /&gt;
| SMTP/IMAP&lt;br /&gt;
| local/external&lt;br /&gt;
| local/external&lt;br /&gt;
| external&lt;br /&gt;
|-&lt;br /&gt;
|OS&lt;br /&gt;
|colspan=&amp;quot;3&amp;quot; style=&amp;quot;text-align: center;&amp;quot; |one of the supported (Debian6, RHEL5/6, CentOS5, SLES11)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
These are the minimum requirements. The used storage depends on the amount of users want to test the POC. A VM can be replaced with real hardware if wanted or run at a service provider in the cloud.&lt;br /&gt;
&lt;br /&gt;
===1st mail to customer===&lt;br /&gt;
&lt;br /&gt;
This is usually done during some calls, if not use this template. The second part, what we need, is always needed:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dear Customer,&lt;br /&gt;
&lt;br /&gt;
The proof of concept installation  can be make with different setups, depending on the goal&lt;br /&gt;
you have.&lt;br /&gt;
&lt;br /&gt;
please identify the goals:&lt;br /&gt;
* test Open-Xchange in general&lt;br /&gt;
* test with existing environment&lt;br /&gt;
* test a clustered setup&lt;br /&gt;
&lt;br /&gt;
please identify what you want to test:&lt;br /&gt;
* webmail/groupware/infostore&lt;br /&gt;
* Outlook oxtender&lt;br /&gt;
* Business mobility (EAS)&lt;br /&gt;
* mobile gui&lt;br /&gt;
* webdav access (for the infostore)&lt;br /&gt;
* Mac OS X access&lt;br /&gt;
* everything&lt;br /&gt;
&lt;br /&gt;
The smallest needed setup would be:&lt;br /&gt;
VM/real hardware with 2GB of memory, 20GB of local storage, an installed supported OS (Debian6, RHEL5/6, CentOS5, SLES11). If you want to test the system with https (which is recommended) we need a valid certificate for the server installed.&lt;br /&gt;
&lt;br /&gt;
We need:&lt;br /&gt;
&lt;br /&gt;
- server address/name&lt;br /&gt;
- ssh root access to the server from &amp;lt;our external ip's&amp;gt;, ssh keys attached &lt;br /&gt;
- http access  to the server from &amp;lt;our external ip's&amp;gt; on port 80 and/or 443 (if https is used)&lt;br /&gt;
- access to a working smtp and imap server if you want to send and receive mails. &lt;br /&gt;
- imap account of the testuser with password if applicable.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===POC license key===&lt;br /&gt;
Order the license key from our sales department.&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
&lt;br /&gt;
After getting back the needed information the system can be installed. Update the system first if necessary. &lt;br /&gt;
&lt;br /&gt;
Adding the needed repositories (ox, updates!, oxtenders, mobile etc. if needed). &lt;br /&gt;
&lt;br /&gt;
The Open-Xchange installation itself should be done as described in the [[Main_Page_HESE#quickinstall|installtion guide]].&lt;br /&gt;
&lt;br /&gt;
The simplest thing is to use imap authentication.&lt;br /&gt;
&lt;br /&gt;
2do:&lt;br /&gt;
push config&lt;br /&gt;
mobile config&lt;br /&gt;
webdav config&lt;br /&gt;
caldav/varddav &lt;br /&gt;
&lt;br /&gt;
Custom plugins should be defined in a SOW.&lt;br /&gt;
&lt;br /&gt;
====Branding====&lt;br /&gt;
A very small and quick branding would be the change of the [[Gui_Plugin_Development|window title]], this will help you too, and maybe a change of the logo. Extended branding should be defined in a SOW.&lt;br /&gt;
&lt;br /&gt;
====Testing====&lt;br /&gt;
&lt;br /&gt;
All installed plugins have to be tested.&lt;br /&gt;
&lt;br /&gt;
2do: a list of tests&lt;br /&gt;
&lt;br /&gt;
===2nd mail to customer===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dear customer,&lt;br /&gt;
&lt;br /&gt;
the setup of the server is ready. &lt;br /&gt;
&lt;br /&gt;
url:&amp;lt;pocurl&amp;gt;&lt;br /&gt;
user:&amp;lt;testuser/password&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can create new accounts as user root on the comandline on the server. Keep in mind that you first have to create the needed imap accounts as well.&lt;br /&gt;
&lt;br /&gt;
2do: &amp;lt;insert an example cmdline createuser with prefilled data&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can find more information about the groupware handling if you click on the question mark in the upper right corner and select help.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;use the sections if applicable&amp;gt;&lt;br /&gt;
If you want to test Outlook, please look at the [http://software.open-xchange.com/OX6/doc/Outlook-OXtender/OX6-OXtender2-for-Microsoft-Outlook-English.pdf documentation]&lt;br /&gt;
&lt;br /&gt;
2do: more documentation sections for other plugins.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=ChangePasswordExternal&amp;diff=19136</id>
		<title>ChangePasswordExternal</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=ChangePasswordExternal&amp;diff=19136"/>
		<updated>2015-03-03T07:14:45Z</updated>

		<summary type="html">&lt;p&gt;Malasa: changed path to stable/backend&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
The package &amp;lt;tt&amp;gt;open-xchange-passwordchange-script&amp;lt;/tt&amp;gt; allows you to run a command to change a password in an external subsystem like e.g. LDAP. &lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-passwordchange-script|sopath=stable/backend}}&lt;br /&gt;
&lt;br /&gt;
== Enable the password change dialog within the AppSuite Frontend ==&lt;br /&gt;
&lt;br /&gt;
After the installation of the package, you must explicitly enable the password change dialog for each AppSuite user. The simplest option to do this, is executing the following command:&lt;br /&gt;
&lt;br /&gt;
 /opt/open-xchange/sbin/changeuser -c &amp;lt;_context_id_&amp;gt; -u &amp;lt;_user_name_&amp;gt; --access-edit-password on&lt;br /&gt;
&lt;br /&gt;
You can also use all other AppSuite provisioning interfaces like JAVA RMI or SOAP. Please review the corresponding documentation for each interface for details. &lt;br /&gt;
&lt;br /&gt;
Screenshot of the password change dialog within AppSuite -&amp;gt; Settings -&amp;gt; Basic Settings -&amp;gt; Password &lt;br /&gt;
&lt;br /&gt;
[[File:Passwordchange_installation_dialog_view_appsuite.png]]&lt;br /&gt;
&lt;br /&gt;
== Configuration Options == &lt;br /&gt;
&lt;br /&gt;
As you see in the screenshot, there are different password options like the min. length etc. Those options can be configured within the following properties file. After you have modified this file, you must restart the open-xchange process. &lt;br /&gt;
&lt;br /&gt;
 /opt/open-xchange/etc/passwordchange.properties&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To configure the actual script, which gets executed after the user uses the AppSuite password change dialog, you have to edit the following properties file:&lt;br /&gt;
&lt;br /&gt;
 /opt/open-xchange/etc/change_pwd_script.properties&lt;br /&gt;
&lt;br /&gt;
And for example add the path to an existing script: &lt;br /&gt;
&lt;br /&gt;
 com.openexchange.passwordchange.script.shellscript=/bin/pwchange.pl &lt;br /&gt;
&lt;br /&gt;
INFO: If you implement a custom script, you have to implement pre-defined exit codes for your script, which then get translated to user friendly error messages. The list of pre-defined exit codes are documented within the above mentioned properies file. &lt;br /&gt;
&lt;br /&gt;
IMPORTANT: AppSuite does not ship with any readymade password change scripts. For examples, please see below. &lt;br /&gt;
&lt;br /&gt;
=== Example Script 1 ===&lt;br /&gt;
&lt;br /&gt;
This example script calls &amp;lt;tt&amp;gt;saslpasswd&amp;lt;/tt&amp;gt; to change the password in the sasldb:&lt;br /&gt;
&lt;br /&gt;
 #! /usr/bin/perl -w -T&lt;br /&gt;
 #&lt;br /&gt;
 # perlsec(1) for security related perl programming&lt;br /&gt;
 #&lt;br /&gt;
 use Getopt::Long;&lt;br /&gt;
 use strict;&lt;br /&gt;
 &lt;br /&gt;
 my $user;&lt;br /&gt;
 my $pw;&lt;br /&gt;
 my $result;&lt;br /&gt;
 my $cid;&lt;br /&gt;
 my $oldpassword;&lt;br /&gt;
 my $userid;&lt;br /&gt;
 &lt;br /&gt;
 open(LOG, '&amp;gt;&amp;gt;/var/log/pw.log'); &lt;br /&gt;
 &lt;br /&gt;
 sub log_error {&lt;br /&gt;
        my $errorstring=$_[0];&lt;br /&gt;
        print LOG &amp;quot;Error: $errorstring\n&amp;quot;;&lt;br /&gt;
        die &amp;quot;$errorstring&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
 # secure env&lt;br /&gt;
 $ENV{'PATH'} = &amp;quot;&amp;quot;;&lt;br /&gt;
 $ENV{'ENV'} = &amp;quot;&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 $result = GetOptions (&amp;quot;username=s&amp;quot; =&amp;gt; \$user,&lt;br /&gt;
                      &amp;quot;cid&amp;quot; =&amp;gt; \$cid,&lt;br /&gt;
                      &amp;quot;userid&amp;quot; =&amp;gt; \$userid,&lt;br /&gt;
                      &amp;quot;oldpassword&amp;quot; =&amp;gt; \$oldpassword,&lt;br /&gt;
                      &amp;quot;newpassword=s&amp;quot; =&amp;gt; \$pw);&lt;br /&gt;
 &lt;br /&gt;
 $user || &amp;amp;log_error(&amp;quot;missing parameter username&amp;quot;);&lt;br /&gt;
 print LOG &amp;quot;changing password for user $user\n&amp;quot;;&lt;br /&gt;
 $pw || &amp;amp;log_error(&amp;quot;missing parameter newpassword&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 my $usersav = $user;&lt;br /&gt;
 &lt;br /&gt;
 # add a taint check&lt;br /&gt;
 if ($user =~ /^([-\@\w.]+)$/) {&lt;br /&gt;
  $user = $1;                     # $data now untainted&lt;br /&gt;
 } else {&lt;br /&gt;
  &amp;amp;log_error(&amp;quot;Bad data in '$user'&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 die &amp;quot;Can't fork: $!&amp;quot; unless defined(my $pid = open(KID, &amp;quot;|-&amp;quot;));&lt;br /&gt;
 if ($pid) {           # parent&lt;br /&gt;
  print KID $pw;&lt;br /&gt;
  close KID;&lt;br /&gt;
 } else {&lt;br /&gt;
  exec '/usr/bin/sudo', '/usr/sbin/saslpasswd2', '-p', &amp;quot;$user&amp;quot;&lt;br /&gt;
    or &amp;amp;log_error(&amp;quot;can't exec myprog: $!&amp;quot;);&lt;br /&gt;
 }&lt;br /&gt;
 close(LOG);&lt;br /&gt;
&lt;br /&gt;
=== Example Script 2 ===&lt;br /&gt;
&lt;br /&gt;
The following script uses ldappasswd to change the password in an LDAP server.&lt;br /&gt;
&lt;br /&gt;
 #!/bin/bash&lt;br /&gt;
 ldappasswd -h my_ldap_server -D &amp;quot;uid=$4,ou=people,dc=example,dc=com&amp;quot; -w $8 \&lt;br /&gt;
    -s ${10} &amp;quot;uid=$4,ou=people,dc=example,dc=com&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== Example Script 3 ===&lt;br /&gt;
&lt;br /&gt;
The following script uses open-xchange-passwordchange-script data to change the password within LDAP&lt;br /&gt;
&lt;br /&gt;
 #!/usr/bin/perl -w     &lt;br /&gt;
 # Begin LDAP Stuff&lt;br /&gt;
        use Net::LDAP;&lt;br /&gt;
        use Net::LDAP::Extension::SetPassword;&lt;br /&gt;
 my $cid = $ARGV[1];&lt;br /&gt;
 my $userid = $ARGV[5];&lt;br /&gt;
 my $oldpw = $ARGV[7];&lt;br /&gt;
 my $hostname= 'localhost';&lt;br /&gt;
 my $rootdn= 'cn=Administrator,dc=example,dc=com';&lt;br /&gt;
 my $userbind= 'ou=People,dc=example,dc=com';&lt;br /&gt;
 my $adminpasswd='system';&lt;br /&gt;
 my $name= $ARGV[3];&lt;br /&gt;
 my $newpasswd= $ARGV[9];&lt;br /&gt;
 my $ldap = Net::LDAP-&amp;gt;new(&amp;quot;$hostname&amp;quot;)&lt;br /&gt;
 or die &amp;quot;Host not found: $!&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 open(LOG, '&amp;gt;&amp;gt;/var/log/open-xchange/pw.log');  &lt;br /&gt;
  &lt;br /&gt;
 sub log_error {&lt;br /&gt;
       my $errorstring=$_[0];&lt;br /&gt;
       print LOG &amp;quot;Error: $errorstring\n&amp;quot;;&lt;br /&gt;
       die &amp;quot;$errorstring&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
 $name || &amp;amp;log_error(&amp;quot;missing parameter username&amp;quot;);&lt;br /&gt;
 print LOG &amp;quot;changing password for $ARGV[2]: $name with $ARGV[0]: $cid and $ARGV[4]: $userid\n&amp;quot;;&lt;br /&gt;
 $newpasswd || &amp;amp;log_error(&amp;quot;missing parameter newpassword&amp;quot;);&lt;br /&gt;
  &lt;br /&gt;
  $ldap-&amp;gt;bind( &amp;quot;$rootdn&amp;quot;, password =&amp;gt; &amp;quot;$adminpasswd&amp;quot; );&lt;br /&gt;
 &lt;br /&gt;
 my $mesg = $ldap-&amp;gt;set_password(&lt;br /&gt;
    newpasswd =&amp;gt; &amp;quot;$newpasswd&amp;quot;,&lt;br /&gt;
    user      =&amp;gt; &amp;quot;uid=$name,$userbind&amp;quot;&lt;br /&gt;
    );&lt;br /&gt;
  &lt;br /&gt;
   die &amp;quot;error: &amp;quot;, $mesg-&amp;gt;code(), &amp;quot;: &amp;quot;, $mesg-&amp;gt;error() if ( $mesg-&amp;gt;code() );&lt;br /&gt;
   close(LOG);&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:OX_Guard&amp;diff=18970</id>
		<title>AppSuite:OX Guard</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:OX_Guard&amp;diff=18970"/>
		<updated>2014-12-16T15:10:14Z</updated>

		<summary type="html">&lt;p&gt;Malasa: /* Debian GNU/Linux 7.0 */ password for update dir needed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OX Guard =&lt;br /&gt;
&lt;br /&gt;
OX Guard is a security solution that provides protection for email communications and files. Fully integrated with both OX as a Service and standard OX App Suite installations, it allows users to send and read encrypted messages and store and share encrypted files – and requires no additional setup or knowledge. OX Guard offers a simple way to increase security by limiting the opportunity for unauthorized access while data is en-route or in-storage, creating extra peace of mind.&lt;br /&gt;
&lt;br /&gt;
This article will guide you through the installation of Guard and describes the basic configuration and software requirements. As it is intended as a quick walk-through it assumes an existing installation of the operating system including a single server App Suite setup as well as average system administration skills. This guide will also show you how to setup a basic installation with none of the typically used distributed environment settings. The objective of this guide is:&lt;br /&gt;
&lt;br /&gt;
* To setup a single server installation&lt;br /&gt;
* To setup a single Guard instance on an existing Open-Xchange installation, no cluster&lt;br /&gt;
* To use the database service on the existing Open-Xchange installation for Guard, no replication&lt;br /&gt;
* To provide a basic configuration setup, no mailserver configuration&lt;br /&gt;
&lt;br /&gt;
== Key features ==&lt;br /&gt;
&lt;br /&gt;
* Simple security at the touch of a button&lt;br /&gt;
* Provides user based security - Separate from provider&lt;br /&gt;
* Supplementary security to Provider based security - Layered&lt;br /&gt;
* Powerful features yet simple to use and understand&lt;br /&gt;
* Security - Inside and outside of the OX environment&lt;br /&gt;
* Email and Drive integration&lt;br /&gt;
* Uses proven PGP security&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
&lt;br /&gt;
If an OX App Suite customer would like to evaluate OX Guard integration, the first step is to contact OX Sales. OX Sales will then work on the request and send prices and license/API (for the hosted infrastructure) key details to the customer.&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Please review following URL for remaining requirements  &lt;br /&gt;
&lt;br /&gt;
Please review [[AppSuite:OX_System_Requirements#OX_Guard|OX Guard Requirements]] for a full list of requirements.&lt;br /&gt;
&lt;br /&gt;
Since OX Guard is a Microservice it can either be added to an existing Open-Xchange installation or it can be deployed on a dedicated environment without having any of the other Open-Xchange App Suite core services installed. OX App Suite v7.6.0 or later is required to operate this extension both in a single or multi server environments.&lt;br /&gt;
&lt;br /&gt;
Prerequisites:&lt;br /&gt;
* Open-Xchange REST API&lt;br /&gt;
* Grizzly HTTP connector (open-xchange-grizzly)&lt;br /&gt;
* A supported Java Virtual Machine (Java 7)&lt;br /&gt;
* An Open-Xchange App Suite installation v7.6.0 or later&lt;br /&gt;
* Please Note: To get access to the latest minor features and bug fixes, you need to have a valid license. The article [[AppSuite:UpdatingOXPackages|Updating OX-Packages]] explains how that can be done.&lt;br /&gt;
&lt;br /&gt;
== Please Note ==&lt;br /&gt;
&lt;br /&gt;
OX Guard version 1.0 supports branding / theming using the configuration cascade, defining a templateID for a user or context.  Additional details will be provided in customization documentation&lt;br /&gt;
&lt;br /&gt;
= Download and Installation =&lt;br /&gt;
&lt;br /&gt;
=== General ===&lt;br /&gt;
The installation of the open-xchange-rest package which is required for Guard will eventually execute database update tasks if installed and activated. Please take this into account.&lt;br /&gt;
&lt;br /&gt;
=== Redhat Enterprise Linux 6 or CentOS 6 ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange yum configuration:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products|pc2n=rhelname|pc2v=RHEL6|appsuite/stable/guard-backend}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products|pc2n=rhelname|pc2v=RHEL6|appsuite/stable/guard-ui}}&lt;br /&gt;
&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ yum update&lt;br /&gt;
 $ yum install open-xchange-rest open-xchange-guard open-xchange-guard-ui open-xchange-guard-ui-static&lt;br /&gt;
&lt;br /&gt;
=== Debian GNU/Linux 7.0 ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange apt configuration:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products|pc2n=debianname|pc2v=DebianWheezy|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|appsuite/stable/guard-backend}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products|pc2n=debianname|pc2v=DebianWheezy|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|appsuite/stable/guard-ui}}&lt;br /&gt;
&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ apt-get update&lt;br /&gt;
 $ apt-get install open-xchange-rest open-xchange-guard open-xchange-guard-ui open-xchange-guard-ui-static&lt;br /&gt;
&lt;br /&gt;
=== SUSE Linux Enterprise Server 11 ===&lt;br /&gt;
&lt;br /&gt;
Add the package repository using zypper if not already present:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products|pc2n=susename|pc2v=SLES11|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|appsuite/stable/guard-backend}}&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products|pc2n=susename|pc2v=SLES11|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|appsuite/stable/guard-ui}}&lt;br /&gt;
&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ zypper ref&lt;br /&gt;
 $ zypper in open-xchange-rest open-xchange-guard open-xchange-guard-ui open-xchange-guard-ui-static&lt;br /&gt;
&lt;br /&gt;
Guard requires Java 1.7, which will be installed through the Guard packages, still SUSE Linux Enterprise Server 11 will not use Java 1.7 by default. Therefor we have to set Java 1.7 as the default instead of Java 1.6:&lt;br /&gt;
&lt;br /&gt;
 $ update-alternatives --config java&lt;br /&gt;
&lt;br /&gt;
Now select the Java 1.7 JRE, example:&lt;br /&gt;
&lt;br /&gt;
 There are 2 alternatives which provide `java'.&lt;br /&gt;
&lt;br /&gt;
   Selection    Alternative&lt;br /&gt;
 -----------------------------------------------&lt;br /&gt;
 *         1    /usr/lib64/jvm/jre-1.6.0-ibm/bin/java&lt;br /&gt;
  +        2    /usr/lib64/jvm/jre-1.7.0-ibm/bin/java&lt;br /&gt;
 &lt;br /&gt;
 Press enter to keep the default[*], or type selection number: 2&lt;br /&gt;
 Using '/usr/lib64/jvm/jre-1.7.0-ibm/bin/java' to provide 'java'.&lt;br /&gt;
&lt;br /&gt;
= Update OX Guard =&lt;br /&gt;
&lt;br /&gt;
=== Redhat Enterprise Linux 6 or CentOS 6 ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange yum configuration:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products|pc2n=rhelname|pc2v=RHEL6|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|appsuite/7.6.0/guard-backend/updates}}&lt;br /&gt;
 {{for loop||call=YUMRepo|pv=reponame|pc1n=path|pc1v=products|pc2n=rhelname|pc2v=RHEL6|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|appsuite/7.6.0/guard-ui/updates}}&lt;br /&gt;
&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ yum update&lt;br /&gt;
 $ yum upgrade&lt;br /&gt;
&lt;br /&gt;
After the new packages are installed, the guard process needs a restart:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;$ /etc/init.d/open-xchange-guard restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Debian GNU/Linux 7.0 ===&lt;br /&gt;
&lt;br /&gt;
If not already done, add the following repositories to your Open-Xchange apt configuration:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products|pc2n=debianname|pc2v=DebianWheezy|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|appsuite/stable/guard-backend/updates}}&lt;br /&gt;
 {{for loop||call=APTRepo|pv=reponame|pc1n=path|pc1v=products|pc2n=debianname|pc2v=DebianWheezy|pc3n=ldbaccount|pc3v=LDBUSER:LDBPASSWORD|appsuite/stable/guard-ui/updates}}&lt;br /&gt;
http://software.open-xchange.com/products/appsuite/stable/guard-backend/updates/DebianWheezy/&lt;br /&gt;
Then run&lt;br /&gt;
&lt;br /&gt;
 $ apt-get update&lt;br /&gt;
 $ apt-get dist-upgrade&lt;br /&gt;
&lt;br /&gt;
If you want to see, what apt-get is going to do without actually doing it, you can run:&lt;br /&gt;
&lt;br /&gt;
 $ apt-get dist-upgrade -s&lt;br /&gt;
&lt;br /&gt;
After the new packages are installed, the guard process needs a restart:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;$ /etc/init.d/open-xchange-guard restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SUSE Linux Enterprise Server 11 ===&lt;br /&gt;
&lt;br /&gt;
Add the package repository using zypper if not already present:&lt;br /&gt;
&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products|pc2n=susename|pc2v=SLES11|appsuite/7.6.0/guard-backend/updates}}&lt;br /&gt;
 {{for loop||call=SUSERepo|pv=reponame|pc1n=path|pc1v=products|pc2n=susename|pc2v=SLES11|appsuite/7.6.0/guard-ui/updates}}&lt;br /&gt;
&lt;br /&gt;
and run&lt;br /&gt;
&lt;br /&gt;
 $ zypper dup -r appsuite-7.6.0-guard-backend-updates&lt;br /&gt;
 $ zypper dup -r appsuite-7.6.0-guard-ui-updates&lt;br /&gt;
&lt;br /&gt;
You might need to run&lt;br /&gt;
&lt;br /&gt;
 $ zypper ref&lt;br /&gt;
&lt;br /&gt;
to update the repository metadata before running ''zypper up''.&lt;br /&gt;
&lt;br /&gt;
After the new packages are installed, the guard process needs a restart:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;pre&amp;gt;$ open-xchange-guard restart&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
The following gives an overview of the most important settings to enable Guard for users on the Open-Xchange installation. Some of those settings have to be modified in order to establish the database and REST API access from the Guard service. All settings relating to the Guard backend component are located in the configuration file guard.properties located in /opt/open-xchange/guard/etc. The default configuration should be sufficient for a basic &amp;quot;up-and-running&amp;quot; setup (with the exception of defining the database username and password). Please refer to the inline documentation of the configuration file for more advanced options.&lt;br /&gt;
&lt;br /&gt;
 $ vim /opt/open-xchange/guard/etc/guard.properties&lt;br /&gt;
&lt;br /&gt;
Open-Xchange config_db host - Guard will establish a connection to the config_db&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.guard.configdbHostname=localhost&lt;br /&gt;
&lt;br /&gt;
Guard database for storing user keys&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.guard.oxguardDatabaseHostname=localhost&lt;br /&gt;
&lt;br /&gt;
Username and Password for the two databases above&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.guard.databaseUsername=openexchange&lt;br /&gt;
 com.openexchange.guard.databasePassword=db_password&lt;br /&gt;
&lt;br /&gt;
Open-Xchange REST API host&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.guard.restApiHostname=localhost&lt;br /&gt;
&lt;br /&gt;
Open-Xchange REST API username and password (need to be defined in the OX backend in the &amp;quot;Configure services&amp;quot; below)&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.guard.restApiUsername=apiusername&lt;br /&gt;
 com.openexchange.guard.restApiPassword=apipassword&lt;br /&gt;
&lt;br /&gt;
External URL for this Open-Xchange installation. This setting will be used to generate the link to the secure content for external recipients&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.guard.externalEmailURL=URL_TO_OX&lt;br /&gt;
&lt;br /&gt;
== Configure services ==&lt;br /&gt;
&lt;br /&gt;
=== Apache ===&lt;br /&gt;
&lt;br /&gt;
Configure the mod_proxy_http module by adding the Guard API.&lt;br /&gt;
&lt;br /&gt;
'''Redhat Enterprise Linux 6 or CentOS 6'''&lt;br /&gt;
 $ vim /etc/httpd/conf.d/proxy_http.conf&lt;br /&gt;
&lt;br /&gt;
'''Debian GNU/Linux 7.0 and SUSE Linux Enterprise Server 11'''&lt;br /&gt;
 $ vim /etc/apache2/conf.d/proxy_http.conf&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Proxy balancer://oxguard&amp;gt;&lt;br /&gt;
        Order deny,allow&lt;br /&gt;
        Allow from all&amp;lt;br&amp;gt;&lt;br /&gt;
        BalancerMember http://localhost:8080/oxguard timeout=1800 smax=0 ttl=60 retry=60 loadfactor=100 route=OX1&lt;br /&gt;
        ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=ON&lt;br /&gt;
        SetEnv proxy-initial-not-pooled&lt;br /&gt;
        SetEnv proxy-sendchunked&lt;br /&gt;
 &amp;lt;/Proxy&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 ProxyPass /appsuite/api/oxguard balancer://oxguard&lt;br /&gt;
&lt;br /&gt;
'''Please Note:''' The Guard API settings must be inserted before the existing “&amp;lt;Proxy /appsuite/api&amp;gt;” parameter.&lt;br /&gt;
&lt;br /&gt;
After the configuration is done, restart the Apache webserver&lt;br /&gt;
&lt;br /&gt;
 $ apachectl restart&lt;br /&gt;
&lt;br /&gt;
=== Open-Xchange ===&lt;br /&gt;
&lt;br /&gt;
Please remove comments in front of the following settings to the configuration file guard.properties on the Open-Xchange backend servers:&lt;br /&gt;
&lt;br /&gt;
 $ vim /opt/open-xchange/etc/guard.properties&lt;br /&gt;
&lt;br /&gt;
 # OX GUard general permission, required to activate Guard in the AppSuite UI.&lt;br /&gt;
 com.openexchange.capability.guard=true&lt;br /&gt;
 &lt;br /&gt;
 # Default theme template id for all users that have no custom template id configured.&lt;br /&gt;
 com.openexchange.guard.templateID=0&lt;br /&gt;
&lt;br /&gt;
Configure the API username and password that you assigned to Guard in the server.properties file&lt;br /&gt;
&lt;br /&gt;
 $ vim /opt/open-xchange/etc/server.properties&lt;br /&gt;
&lt;br /&gt;
 # Specify the user name used for HTTP basic auth by internal REST servlet&lt;br /&gt;
 com.openexchange.rest.services.basic-auth.login=apiusername&lt;br /&gt;
 &lt;br /&gt;
 # Specify the password used for HTTP basic auth by internal REST servlet&lt;br /&gt;
 com.openexchange.rest.services.basic-auth.password=apipassword&lt;br /&gt;
&lt;br /&gt;
Restart the OX backend&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange restart&lt;br /&gt;
&lt;br /&gt;
=== SELinux ===&lt;br /&gt;
&lt;br /&gt;
Running SELinux prohibits your local Open-Xchange backend service to connect to localhost:8080, which is where the Guard backend service listens to. In order to allow localhost connections to 8080 execute the following:&lt;br /&gt;
&lt;br /&gt;
 $ setsebool -P httpd_can_network_connect 1&lt;br /&gt;
&lt;br /&gt;
== Initiating the Guard database and key store ==&lt;br /&gt;
&lt;br /&gt;
Once the Guard configuration (database and backend configuration) and the service configuration has been applied, the Guard administration script needs to be executed in order to create the Guard databases. The administration script also takes care of the creation of the master keys and the master password file in /opt/open-xchange/guard. The initiation only needs to be done once for a multi server setup, for details please see “Optional / Clustering”.&lt;br /&gt;
&lt;br /&gt;
 /opt/open-xchange/guard/sbin/guard init&lt;br /&gt;
&lt;br /&gt;
'''Please Note:''' It is important to understand that the master password file located at /opt/open-xchange/guard/oxguardpass is required to reset user passwords, without them the administrator will not be able to reset user passwords anymore in the future. The file contains the passwords used to encrypt the master database key, as well as passwords used to encrypt protected data in the users table.&lt;br /&gt;
&lt;br /&gt;
== Start Guard ==&lt;br /&gt;
&lt;br /&gt;
The services have been configured and the database has been initiated, it's time to start Guard&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange-guard start&lt;br /&gt;
&lt;br /&gt;
== Enabling Guard for Users ==&lt;br /&gt;
&lt;br /&gt;
Guard provides two capabilities for users in the environment:&lt;br /&gt;
&lt;br /&gt;
* '''Guard Mail:''' com.openexchange.capability.guard-mail&lt;br /&gt;
* '''Guard Drive:''' com.openexchange.capability.guard-drive&lt;br /&gt;
&lt;br /&gt;
Each of those two Guard components is enabled for all users that have the according capability configured. Please note that users need to have the Drive permission set to use Guard Drive. So the users that have Guard Drive enabled must be a subset of those users with OX Drive permission. Since v7.6.0 we enforce this via the default configuration. Those capabilities can be activated for specific user by using the Open-Xchange provisioning scripts:&lt;br /&gt;
&lt;br /&gt;
'''Guard Mail:'''&lt;br /&gt;
 $ /opt/open-xchange/sbin/changeuser -c 1 -A oxadmin -P admin_password -u testuser --config/com.openexchange.capability.guard-mail=true&lt;br /&gt;
&lt;br /&gt;
'''Guard Drive:'''&lt;br /&gt;
 $ /opt/open-xchange/sbin/changeuser -c 1 -A oxadmin -P admin_password -u testuser --config/com.openexchange.capability.guard-drive=true&lt;br /&gt;
&lt;br /&gt;
'''Please Note:''' Guard Drive requires Guard Mail to be configured for the user as well.  In addition, these capabilities may be configured globally by editing the guard.properties file on the OX bakend&lt;br /&gt;
&lt;br /&gt;
== Optional ==&lt;br /&gt;
&lt;br /&gt;
=== SSL Configuration ===&lt;br /&gt;
&lt;br /&gt;
Per default the connection between the Guard backend and the configured Open-Xchange REST API host is unencrypted. Even though that Guard will never transmit unencrypted emails to or from the REST API you can optionally encrypt the whole communication between those two components by using SSL. To enforce Guard to use SSL in the communication between those two components enable the follwing configuration in Guard configuration file. &lt;br /&gt;
&lt;br /&gt;
  $ vim /opt/open-xchange/guard/etc/guard.properties&lt;br /&gt;
&lt;br /&gt;
  com.openexchange.guard.backend_ssl=true&lt;br /&gt;
&lt;br /&gt;
The Guard backend is most commonly placed behind a load balancer (APACHE or other) and defaults to HTTP for incoming and outgoing traffic, using the load balancer to do SSL with the users.  If you want Guard to use SSL for all communications, you need to set up the SSL key to use.&lt;br /&gt;
&lt;br /&gt;
Please note that you have to provide access to the certificates.&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.guard.useSSL: true&lt;br /&gt;
 com.openexchange.guard.SSLPort: 8443&lt;br /&gt;
 com.openexchange.guard.SSLKeyStore: //keystore location//&lt;br /&gt;
 com.openexchange.guard.SSLKeyName: //alias name here//&lt;br /&gt;
 com.openexchange.guard.SSLKeyPass: //ssl password//&lt;br /&gt;
&lt;br /&gt;
'''Please Note:''' Enabling SSL might decrease performance and/or create more system load due to additional encoding of the HTTP streams.&lt;br /&gt;
&lt;br /&gt;
For details on SSL installation and configuration, please see [[AppSuite:GuardSSL|OX Guard SSL Installation]]&lt;br /&gt;
&lt;br /&gt;
== Recipient key detection ==&lt;br /&gt;
&lt;br /&gt;
=== Local ===&lt;br /&gt;
&lt;br /&gt;
Guard needs to determine if an email recipients email address is an internal or external (non-ox) user.  &lt;br /&gt;
&lt;br /&gt;
To detect if the recipient is an account on the same OX Guard system there is a mechanism needed to map a recipient mail address to the correct local OX context. The default implementation delivered in the product achieves that by looking up the mail domain (@example.com) within the list of context mappings. That is at least not possible in case of ISPs where different users/contexts use the same mail domain. In case your OX system does not use mail domains in context mappings it is required to deploy an OX OSGi bundle implementing the com.openexchange.mailmapping.MailResolver class or by interfacing Guard with your mail resolver system.&lt;br /&gt;
Please see [[Appsuite:GuardMailResolver|OX Guard Mail Resolver]] for details&lt;br /&gt;
&lt;br /&gt;
=== External ===&lt;br /&gt;
&lt;br /&gt;
OX Guard can also detect if the external recipient's account is also supported by its own Guard system in case the feature is publically announced via DNS.&lt;br /&gt;
&lt;br /&gt;
The required DNS entry to allow external senders to get the public key has to look like:&lt;br /&gt;
&lt;br /&gt;
 _oxguard.example.com      TXT   &amp;quot;https://ox.hoster.com/appsuite/api/oxguard&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Such an entry needs to exist for all mail domains (not only the OX host domain obviously).&lt;br /&gt;
&lt;br /&gt;
== Clustering ==&lt;br /&gt;
&lt;br /&gt;
You can run multiple OX Guard servers in your environment to ensure high availability or enhance scalability. OX Guard integrates seamlessly into the existing Open-Xchange infrastructure by using the existing interface standards and is therefor transparent to the environment. A couple of things have to be prepared in order to loosely couple OX Guard servers with Open-Xchange servers in a cluster.&lt;br /&gt;
&lt;br /&gt;
=== MySQL ===&lt;br /&gt;
&lt;br /&gt;
The MySQL servers need to be configured in order to allow access to the configdb of Open-Xchange. To do so you need to set the following configuration in the MySQL my.cnf:&lt;br /&gt;
&lt;br /&gt;
 bind = 0.0.0.0&lt;br /&gt;
&lt;br /&gt;
This allows the Guard backend to bind to the MySQL host which is configured in the guard.properties file with com.openexchange.guard.configdbHostname. After the bind for the MySQL instance is configured and the OX Guard backend would be able to connect to the configured host, you have to grant access for the OX Guard service on the MySQL instance to manage the databases. Do so by connecting to the MySQL server via the mysql client. Authenticate if necessary and execute the following, please note that you have to modify the hostname / IP address of the client who should be able to connect to this database, it should include all possible OX Guard servers:&lt;br /&gt;
&lt;br /&gt;
 GRANT ALL PRIVILEGES ON *.* TO 'openexchange'@'oxguard.example.com' IDENTIFIED BY ‘secret’;&lt;br /&gt;
&lt;br /&gt;
=== Apache ===&lt;br /&gt;
&lt;br /&gt;
OX Guard uses the Open-Xchange REST API to store and fetch data from the Open-Xchange databases. The REST API is a servlet running in the Grizzly container. By default it is not exposed as a servlet through Apache and is only accessibly via port 8009. In order to use Apache's load balancing via mod_proxy we need to add a servlet called &amp;quot;preliminary&amp;quot; to proxy_http.conf, example based on a clustered mod_proxy configuration:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Location /preliminary&amp;gt;&lt;br /&gt;
      Order Deny,Allow&lt;br /&gt;
      Deny from all&lt;br /&gt;
      # Only allow access from Guard servers within the network. Do not expose this&lt;br /&gt;
      # location outside of your network. In case you use a load balancing service in front&lt;br /&gt;
      # of your Apache infrastructure you should make sure that access to /preliminary will&lt;br /&gt;
      # be blocked from the internet / outside clients. Examples:&lt;br /&gt;
      # Allow from 192.168.0.1&lt;br /&gt;
      # Allow from 192.168.1.1 192.168.1.2&lt;br /&gt;
      # Allow from 192.168.0.&lt;br /&gt;
      ProxyPass /preliminary balancer://oxcluster/preliminary&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make sure that the balancer is properly configured in the mod_proxy configuration. Examples on how to do so can be found in our clustering configuration for Open-Xchange AppSuite. Like explained in the example above, please make sure that this location is only available in your internal network, there is no need to expose /preliminary to the public, it is only used by Guard servers to connect to the OX backend. If you have a load balancer in front of the Apache cluster you should consider blocking access to /preliminary from WAN to restrict access to the servlet to internal network services only.&lt;br /&gt;
&lt;br /&gt;
Now add the OX Guard BalancerMembers to the oxguard balancer configuration (also in proxy_http.conf) to address all your OX Guard nodes in the cluster in this balancer configuration. The configuration has to be applied to all Apache nodes within the cluster.&lt;br /&gt;
&lt;br /&gt;
If the Apache server is a dedicated server / instance you also have to install the OX Guard UI-Static package on all Apache nodes in the cluster in order to provide static files like images or CSS to the OX Guard client. Example for Debian (the OX Guard repository has to be configured in the package management prior):&lt;br /&gt;
&lt;br /&gt;
 $ apt-get install open-xchange-guard-ui-static&lt;br /&gt;
&lt;br /&gt;
=== Open-Xchange ===&lt;br /&gt;
&lt;br /&gt;
Disable the Open-Xchange IPCheck for session verification. This is required because OX Guard will use the users session cookie to connect to the Open-Xchange REST API, but as a different IP address than the OX Guard server has been used during authentication the request would fail if you don't disable the IPCheck:&lt;br /&gt;
&lt;br /&gt;
 $ vim /opt/open-xchange/etc/server.properties&lt;br /&gt;
&lt;br /&gt;
and set:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.IPCheck=false&lt;br /&gt;
&lt;br /&gt;
The OX Guard UI package has to be installed on all Open-Xchange backend nodes as well, example for Debian (the OX Guard repository has to be configured in the package management prior):&lt;br /&gt;
&lt;br /&gt;
 $ apt-get install open-xchange-guard-ui&lt;br /&gt;
&lt;br /&gt;
Restart the Open-Xchange service afterwards.&lt;br /&gt;
&lt;br /&gt;
=== OX Guard ===&lt;br /&gt;
&lt;br /&gt;
After all the services like MySQL, Apache and Open-Xchange have been configured you need to update the OX Guard backend configuration to point to the correct API endpoints. Set the REST API endpoint to an Apache server by setting the following value in /opt/open-xchange/guard/etc/guard.properties:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.guard.restApiHostname=apache.example.com&lt;br /&gt;
&lt;br /&gt;
Per default Guard will try to connect to port 8009 to this host, but as we configured the REST API to be proxies thorugh the serblet /preliminary on every Apache we now also need to change the target port for the REST API. You can do so by adding the following line into /opt/open-xchange/guard/etc/guard.properties:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.guard.oxBackendPort=80&lt;br /&gt;
&lt;br /&gt;
Please also change all settings in regards to MySQL like com.openexchange.guard.configdbHostname, com.openexchange.guard.oxguardDatabaseHostname, com.openexchange.guard.databaseUsername or com.openexchange.guard.databasePassword. Afterwards restart the OX Guard service and check the logfile if the OX Guard backend is able to connect to the configured REST API.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:ExternalLoginPage&amp;diff=18597</id>
		<title>AppSuite:ExternalLoginPage</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:ExternalLoginPage&amp;diff=18597"/>
		<updated>2014-09-25T06:50:45Z</updated>

		<summary type="html">&lt;p&gt;Malasa: /* HTML */ typo formlogin, not fromlogin&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= How to set up an external login page for App Suite =&lt;br /&gt;
&lt;br /&gt;
== Who should read this document ==&lt;br /&gt;
&lt;br /&gt;
This document is written for web developers who would like to create a custom login mask for the OX App Suite. The login mask can reside on an external server i. e., not directly located in the domain of the Open-Xchange machines. It is also intended for administrators who install and maintain Open-Xchange services.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== HTML ==&lt;br /&gt;
&lt;br /&gt;
The Open-Xchange [[HTTP_API#Form_Login_.28since_6.20.29|HTTP API]] has a function to&lt;br /&gt;
create a session from external.&lt;br /&gt;
&lt;br /&gt;
The full detailed explanation how the HTML form is used and errors can be handled can be found here:&lt;br /&gt;
&lt;br /&gt;
[[OXSessionFormLogin|OX Session Formlogin]]&lt;br /&gt;
&lt;br /&gt;
== Redirect to custom login ==&lt;br /&gt;
&lt;br /&gt;
Users can still access the original product login site. If this is not wanted the following Apache &lt;br /&gt;
configuration for your VirtualHost can be used to redirect all requests to your custom login page:&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteRule ^/appsuite/signin /custom-login.html [R]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setting custom login as logout location ==&lt;br /&gt;
&lt;br /&gt;
If users should be directed to the custom login form after logout from App Suite the following property can be set globally somewhere in /opt/open-xchange/etc/settings/. Either create a new properties file or add the option in any existing one. For more complex setups e.g. with different brands please check out how to set this property in context or user scope which is explained [[ConfigCascade|here]].&lt;br /&gt;
&lt;br /&gt;
 io.ox/core//customLocations/logout=https://login.example.com&lt;br /&gt;
&lt;br /&gt;
For cases where only one custom login page exists for all users it's also recommended to set&lt;br /&gt;
&lt;br /&gt;
 logoutLocation: 'https://login.example.com/'&lt;br /&gt;
&lt;br /&gt;
in '''/opt/open-xchange/etc/as-config.yml'''. This setting takes effect for example if an autologin session is expired. as-config.yml itself defines settings in dependence of the hostname configured for the Open-Xchange access.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=OX_Outlook_Uploader&amp;diff=18279</id>
		<title>OX Outlook Uploader</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=OX_Outlook_Uploader&amp;diff=18279"/>
		<updated>2014-08-14T02:54:00Z</updated>

		<summary type="html">&lt;p&gt;Malasa: license link broken&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Open-Xchange Microsoft Outlook® Uploader=&lt;br /&gt;
&lt;br /&gt;
Open-Xchange provides Open-Xchange Microsoft Outlook® Uploader (short: ''OXUploader''), a migration tool to export data from Microsoft Outlook® or from a Microsoft Exchange Server® to the Open-Xchange Server.&lt;br /&gt;
&lt;br /&gt;
=Features=&lt;br /&gt;
* Migration of E-Mails, appointments, contacts, distribution lists, tasks and sticky notes&lt;br /&gt;
* Folder structure is preserved, subfolders are created as necessary&lt;br /&gt;
* Attachments of E-Mails and other objects are migrated&lt;br /&gt;
* Support for recurring appointments and participants&lt;br /&gt;
* Migration of .pst-files&lt;br /&gt;
* Migration of data files from installed mail profiles&lt;br /&gt;
* Migration of Microsoft Exchange mailboxes&lt;br /&gt;
* Migration of Microsoft Exchange Public Stores&lt;br /&gt;
* Easy to use 3-step interactive wizard to configure the migration&lt;br /&gt;
* Unattended mode to perform migrations without user interaction&lt;br /&gt;
* Commandline interface to automate batch migrations&lt;br /&gt;
&lt;br /&gt;
=Prerequisites=&lt;br /&gt;
The OXUploader migration tool is installed on a windows system having access to the data that should be migrated. The data is then migrated from there to the Open-Xchange server. Please ensure that the following requirements are met before installing the tool:&lt;br /&gt;
&lt;br /&gt;
==Windows System==&lt;br /&gt;
You will finde the client requirements under [[AppSuite:OX_System_Requirements#MS_Windows_.2F_MS_Outlook.C2.AE_.2F_OX_Notifier_.2F_OX_Updater|Connector for Microsoft Outlook Requirements]]&lt;br /&gt;
&lt;br /&gt;
==Open-Xchange Server==&lt;br /&gt;
* Latest Version of the Open-Xchange Server&lt;br /&gt;
* The user account(s) for which the data should be migrated should already have been created&lt;br /&gt;
&lt;br /&gt;
=Download and installation=&lt;br /&gt;
&lt;br /&gt;
To download the Open-Xchange Microsoft Outlook® Uploader installation packages and Release Notes, follow this [http://software.open-xchange.com/components/outlookuploader/6.20.5/ link]&lt;br /&gt;
&lt;br /&gt;
After the download of the package, you can start the installation by double-clicking on the package. Please follow the installation steps in the wizard. The installation does not require administrative rights.&lt;br /&gt;
&lt;br /&gt;
=Usage (interactive mode)=&lt;br /&gt;
&lt;br /&gt;
{| &lt;br /&gt;
| [[image:OXUploader_Wizard_1.png|thumb]] || &lt;br /&gt;
==1. Choose the migration source==&lt;br /&gt;
* First, either choose to migrate a personal storage file (.pst file), a data store from the local mail profiles, or an Exchange server mailbox.&lt;br /&gt;
* Depending on your choice, you can specify the migration source in the next step.&lt;br /&gt;
|-&lt;br /&gt;
| [[image:OXUploader_Wizard_2a.png|thumb]] || &lt;br /&gt;
==2a. Select a personal storage file to migrate==&lt;br /&gt;
* When clicking on Browse the standard folder for saving .pst files opens.&lt;br /&gt;
* As some .pst files are password protected the password can be entered in the second field.&lt;br /&gt;
* When having chosen a file, click on Next.&lt;br /&gt;
|-&lt;br /&gt;
| [[image:OXUploader_Wizard_2b.png|thumb]] || &lt;br /&gt;
==2b. Select a data file from a profile to migrate==&lt;br /&gt;
* Select one of the existing profiles from the drop-down menu.&lt;br /&gt;
* Select a store from the profile.&lt;br /&gt;
* Finally, enter a password if needed.&lt;br /&gt;
* To proceed, click Next.&lt;br /&gt;
|-&lt;br /&gt;
| [[image:OXUploader_Wizard_2c.png|thumb]] || &lt;br /&gt;
==2c. Select an Exchange Server mailbox to migrate==&lt;br /&gt;
* Enter the URL of the Microsoft Exchange server.&lt;br /&gt;
* Select the username of the the account on the Exchange server.&lt;br /&gt;
* Click on &amp;quot;Logon...&amp;quot; to connect to the Exchange server and fetch the available mailboxes.&lt;br /&gt;
* When being asked, enter your password to logon to the Exchange server&lt;br /&gt;
* Select one of the existing mailboxes from the drop-down menu.&lt;br /&gt;
* To proceed, click Next.&lt;br /&gt;
|-&lt;br /&gt;
| [[image:OXUploader_Wizard_3.png|thumb]] || &lt;br /&gt;
==3. Please enter information about the server==&lt;br /&gt;
* In the Server URL field, enter the Open-Xchange Server address.&lt;br /&gt;
* Enter your username in the second field.&lt;br /&gt;
* Enter your password in the third field.&lt;br /&gt;
* In order to make further settings, activate the &amp;quot;Configure advanced settings&amp;quot; checkbox.&lt;br /&gt;
* To proceed, click on Next.&lt;br /&gt;
|-&lt;br /&gt;
| [[image:OXUploader_Wizard_4a.png|thumb]] || &lt;br /&gt;
==4a. Configure advanced options==&lt;br /&gt;
* If the folders should be migrated into a subfolder, enter it's name in the first field.&lt;br /&gt;
* In case not all mail folders are to be exported, the folders can be selected by clicking on the &amp;quot;Select...&amp;quot; button.&lt;br /&gt;
* Select the type of items to be migrated by marking the apporpiate checkboxes, and optionally define a minimum date for the items.&lt;br /&gt;
|-&lt;br /&gt;
| [[image:OXUploader_Wizard_4b.png|thumb]] || &lt;br /&gt;
==4b. Configure advanced options==&lt;br /&gt;
* If no notification mails for appointments and tasks should be generated activate the respective checkbox.&lt;br /&gt;
* If mails with non resolved recipients should be skipped activate the respective checkbox.&lt;br /&gt;
* In order to ignore the &amp;quot;Trash&amp;quot;, &amp;quot;Junk&amp;quot; or &amp;quot;Sync Issues&amp;quot; folders for the migration, activate the respective checkbox.&lt;br /&gt;
* If empty folders should be skipped, activate the respective checkbox.&lt;br /&gt;
* If the target folders should be emptied before items are migrated into them, activate the respective checkbox.&lt;br /&gt;
|-&lt;br /&gt;
| [[image:OXUploader_Wizard_5.png|thumb]] ||&lt;br /&gt;
&lt;br /&gt;
==5. Migration in process==&lt;br /&gt;
* This window displays the status and a log protocol of the migration.&lt;br /&gt;
* When the process is finished, click on Next.&lt;br /&gt;
|-&lt;br /&gt;
| [[image:OXUploader_Wizard_6.png|thumb]] || &lt;br /&gt;
==6. Migration completed==&lt;br /&gt;
* This window displays an overview of the migration and you can view the log file by clickin on the respective button.&lt;br /&gt;
* To close the wizard, click on Finish.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=Usage (unattended mode)=&lt;br /&gt;
&lt;br /&gt;
The migration tool can be started in a special &amp;quot;batch mode&amp;quot;, where no user interaction is necessary. The options for the migration can be set in the configuration files, or passed via the commandline when starting the tool, see (3). When the parameter &amp;quot;batchmode&amp;quot; is &amp;quot;true&amp;quot;, the migration starts automatically. In this case, at least the following settings have to be available, either supplied via the commandline or defined in the configuration file:&lt;br /&gt;
* Username&lt;br /&gt;
* ServerURL&lt;br /&gt;
* (PSTFile ''or'' ProfileName) and (StoreName ''or'' ExchangeServerURL)&lt;br /&gt;
* Password ''or'' AdminUser and AdminPassword&lt;br /&gt;
 &lt;br /&gt;
For example, to migrate the .pst-file &amp;quot;c:\test.pst&amp;quot;, a command could look &lt;br /&gt;
like:&lt;br /&gt;
&amp;lt;pre&amp;gt;OXUploaderC.exe -batchmode true -pstfile &amp;quot;c:\test.pst&amp;quot; -serverurl &amp;quot;http://ox.example.invalid&amp;quot; -username test -password secret&amp;lt;/pre&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Multiple instances of the tool can be run simultaneously from one or multiple client machines, more information can be found in (6).&lt;br /&gt;
&lt;br /&gt;
=Configuration=&lt;br /&gt;
&lt;br /&gt;
==Configuration files==&lt;br /&gt;
&lt;br /&gt;
The application's configuration settings can be adjusted in config files, both for the OXUploader.exe main application for interactive mode and for the commandline version of the tool OXUploaderC.exe (see below). The files are named as the corresponding executable, with the file extension &amp;quot;.config&amp;quot;: OXUploader.exe.config and OXUploaderC.exe.config respectively. A description of each parameter can be found in [[#Configuration parameters|Configuration parameters]]&lt;br /&gt;
&lt;br /&gt;
==Commandline parameters==&lt;br /&gt;
&lt;br /&gt;
Furthermore, the application can be started with commandline parameters. All supplied options overwrite the default settings from the configuration file, which are assumed if an option is missing. The following parameters are recognized:&lt;br /&gt;
&amp;lt;pre&amp;gt;-adminuser &amp;lt;Admin username on the OX server (for admin migration)&amp;gt;&lt;br /&gt;
-adminpassword &amp;lt;Admin password on the OX server (for admin migration)&amp;gt;&lt;br /&gt;
-appointmentsmindate &amp;lt;Minimum date of appointments to be migrated&amp;gt;&lt;br /&gt;
-batchmode &amp;lt;true/false&amp;gt;&lt;br /&gt;
-clearfolders &amp;lt;true/false&amp;gt;&lt;br /&gt;
-emailssmindate &amp;lt;Minimum date of e-mails to be migrated&amp;gt;&lt;br /&gt;
-exchangemailboxname &amp;lt;Name of the Exchange mailbox to migrate&amp;gt;&lt;br /&gt;
-exchangeserverurl &amp;lt;URL of the Exchange server&amp;gt;&lt;br /&gt;
-exchangeserverusername &amp;lt;Username on the Exchange server&amp;gt;&lt;br /&gt;
-exportappointmentparticipants &amp;lt;true/false&amp;gt;&lt;br /&gt;
-exportappointmentuids &amp;lt;true/false&amp;gt;&lt;br /&gt;
-ignorejunkfolder &amp;lt;true/false&amp;gt;&lt;br /&gt;
-ignoresyncissuesfolder &amp;lt;true/false&amp;gt;&lt;br /&gt;
-ignoretrashfolder &amp;lt;true/false&amp;gt;&lt;br /&gt;
-importfoldername &amp;lt;Name of the migration target subfolder&amp;gt;&lt;br /&gt;
-logautoflush &amp;lt;true/false&amp;gt;&lt;br /&gt;
-logconsole &amp;lt;true/false&amp;gt;&lt;br /&gt;
-loglevel &amp;lt;off/error/warning/info/verbose&amp;gt;&lt;br /&gt;
-logonexchangemailbox &amp;lt;true/false&amp;gt;&lt;br /&gt;
-logpostdata &amp;lt;true/false&amp;gt;&lt;br /&gt;
-logtextfile &amp;lt;Path to logfile&amp;gt;&lt;br /&gt;
-migrateappointments &amp;lt;true/false&amp;gt;&lt;br /&gt;
-migratecontacts &amp;lt;true/false&amp;gt;&lt;br /&gt;
-migrateemails &amp;lt;true/false&amp;gt;&lt;br /&gt;
-migratenotes &amp;lt;true/false&amp;gt;&lt;br /&gt;
-migratetasks &amp;lt;true/false&amp;gt;&lt;br /&gt;
-password &amp;lt;Password on the OX server&amp;gt;&lt;br /&gt;
-profilename &amp;lt;Name of the profile&amp;gt;&lt;br /&gt;
-pstfile &amp;lt;Path to PST file&amp;gt;&lt;br /&gt;
-pstpassword &amp;lt;Password for the PST file&amp;gt;&lt;br /&gt;
-serverurl &amp;lt;URL of the OX server&amp;gt;&lt;br /&gt;
-skipemptyfolders &amp;lt;true/false&amp;gt;&lt;br /&gt;
-storename &amp;lt;Name of the store inside the profile&amp;gt;&lt;br /&gt;
-tasksmindate &amp;lt;Minimum date of tasks to be migrated&amp;gt;&lt;br /&gt;
-uploadchunksize &amp;lt;Number of uploaded mails per request&amp;gt;&lt;br /&gt;
-uploadthresholdbytes &amp;lt;Threshold of bytes for sending forced&amp;gt;&lt;br /&gt;
-username &amp;lt;Username on the OX server&amp;gt;&lt;br /&gt;
-recoverableexceptionmaxretries &amp;lt;max. retries after recoverable error&amp;gt;&lt;br /&gt;
-suppressnotificationmails &amp;lt;true/false&amp;gt;&lt;br /&gt;
-skipmailswithnonresolvedrecipients &amp;lt;true/false&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Misc=&lt;br /&gt;
&lt;br /&gt;
The following chapters contain some advanced information and configration options for the OXUploader migration tool.&lt;br /&gt;
&lt;br /&gt;
==Performance considerations==&lt;br /&gt;
&lt;br /&gt;
The time needed to perform a migration correspondends with the size of the .pst file, of course. So, for large mailboxes, this could be a quite time intensive task, and may be improved in knowledge of the following observations, especially when performing multiple simultaneous batch migrations. &lt;br /&gt;
The I/O-ratio is about the following: Per each byte read from disk, about 0.65 bytes are written to disk, and 0.12 bytes are sent to the server. This is caused by the fact that the messages read out from the .pst-file are exported to RFC822 .eml files first, then those files are loaded again before finally sending them to the server. Therefore, the throughput of the local file system should be as fast as possible. Since the temporary created RFC822 e-mail files are created in the user's temp folder, it would be best to move the location to a separate location as the .pst-file - another hdd, maybe even a ramdisk for the temp directory would make sense for heavy batch migrations. It's also recommended to temporarily disable virus protection and indexing services during the migration, and Outlook 2007 should be preferred against Outlook 2003.&lt;br /&gt;
&lt;br /&gt;
==Limitations when running multiple instances==&lt;br /&gt;
&lt;br /&gt;
When executing multiple migrations simulataneously from one machine, each instance of the tool must have exclusive access to the .pst-file it is migrating. Furthermore, each instance must use a different logfile. The tool relies on Outlook, and so it also can't work around Outlooks own limitations, especially as Outlook is designed as client application. More details can be found at the knowledge base article here: http://support.microsoft.com/kb/257757/en-us .&lt;br /&gt;
&lt;br /&gt;
==Admin migration==&lt;br /&gt;
&lt;br /&gt;
When the server is configured appropiate, the migration tool can also be used to import .pst-files into the OX account of the specified user, without the need to supply the user's password. Therefore, the username and password of a special admin user is needed for authentication against the OX server. &lt;br /&gt;
For example, to migrate the .pst-file &amp;quot;c:\test.pst&amp;quot; into the account &amp;quot;test&amp;quot;, a command could look like:&lt;br /&gt;
&amp;lt;pre&amp;gt;OXUploaderC.exe -batchmode true -pstfile &amp;quot;c:\test.pst&amp;quot; -serverurl &amp;quot;http://ox.example.invalid&amp;quot; -username test -adminuser admin -adminpassword secret&amp;lt;/pre&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
==Personal storage files==&lt;br /&gt;
&lt;br /&gt;
Sometimes .pst-files are broken our corrupted, and the migration tool may not be able to open them correctly, or opening them takes a very long time when the internal repair operations take place. &lt;br /&gt;
To reduce the impact of broken .pst-files, it's recommended to check the integrity of the files using Microsofts SCANPST.exe tool, see http://support.microsoft.com/kb/287497 . Sadly this utility is designed to run interactively, but there are some utilities out there that automate the SCANPST.exe tool to be run from the commandline, pointing to the .pst-file to scan, for example cmdscan.exe from http://www.olfolders.de/Lang/English/OLfix/download.htm . Doing so, one would be able to incorporate a SCANPST.exe launch prior a batch call to the migration tool, e.g. the following command could be invoked to scan and repair the .pst file &amp;quot;c:\test.pst&amp;quot;, passing the path to the SCANPST.exe location:&lt;br /&gt;
&amp;lt;pre&amp;gt;cmdscan.exe -rename &amp;quot;c:\Program Files (x86)\Microsoft Office\Office12\SCANPST.EXE&amp;quot; &amp;quot;c:\test.pst&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Duplicated items==&lt;br /&gt;
&lt;br /&gt;
Migrating the same items into the same target folder multiple times usually results in the items getting duplicated on the server. &lt;br /&gt;
An exception to this rule are appointments with unique identifiers (UIDs), see http://www.ietf.org/rfc/rfc2445.txt, chapter 4.8.4.7, for details. To avoid importing an appointment with the same identifier multiple times, the server rejects an appointment when the UID already exists on the server. To force the migration of appointments regardless of their UIDs, the tool optionally removes the UIDs from the appointment. The relevant setting is named &amp;quot;ExportAppointmentUIDs&amp;quot;, when set to &amp;quot;False&amp;quot;, existing UIDs are removed before sending them to the server.&lt;br /&gt;
Furthermore, the migration tool has an option to clear the folder contents before triggering the export. When &amp;quot;ClearFolders&amp;quot; is set to &amp;quot;True&amp;quot;, the target folder is emptied prior to the items being exported. Note that any existing data in these folders will be permanently lost. &lt;br /&gt;
&lt;br /&gt;
==Exchange mailboxes==&lt;br /&gt;
&lt;br /&gt;
Instead of using a local mail profile or a .pst file for migration, it's also possible to logon to and migrate an Exchange mailbox directly. It's recommeded that the migration tool is executed inside the exchange domain by the owner of the mailbox.&lt;br /&gt;
To perform an administrative migration for other user's mailboxes, the following preconditions must be met:&lt;br /&gt;
* Ensure the target account already has been created on the OX server&lt;br /&gt;
* Grant the administrating user &amp;quot;Receive As&amp;quot; permissions to the mailbox store of all accounts that should be migrated, details can be found at http://support.microsoft.com/default.aspx?scid=kb;EN-US;821897 and http://msexchangeteam.com/archive/2006/01/25/418099.aspx&lt;br /&gt;
* The migration tool is ececuted by the administrative user, who already should be logged on to the exchange domain&lt;br /&gt;
The administrative migration can only be executed from the commandline in &amp;quot;batch mode&amp;quot;, see (5) for details. The mailbox or the name of the user that is going to be migrated needs to be specified inside the commandline parameter &amp;quot;exchangemailboxname&amp;quot;. For example, to migrate the mailbox of exchange user &amp;quot;test&amp;quot; to the Open-Xchange account with username &amp;quot;test&amp;quot;, combined with admin migration at the OX server (see (6c) for details), one could execute the migration tool in the following way:&lt;br /&gt;
&amp;lt;pre&amp;gt;OXUploaderC.exe -batchmode true -exchangeserverurl 192.168.0.4 -exchangemailboxname test -serverurl &amp;quot;http://ox.example.invalid&amp;quot; -username test -adminuser admin -adminpassword secret&amp;lt;/pre&amp;gt;&lt;br /&gt;
Or, if the password of the OX user is available:&lt;br /&gt;
&amp;lt;pre&amp;gt;OXUploaderC.exe -batchmode true -exchangeserverurl 192.168.0.4 -exchangemailboxname test -serverurl &amp;quot;http://ox.example.invalid&amp;quot; -username test -password secret&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Administrative installation==&lt;br /&gt;
&lt;br /&gt;
The OXUploader migration tool itself can be installed without the need for elevated access rights by the end user, as the installer only accesses the local non-roaming application data directory and the HKCU hive in the registry. It can't be installed 'per machine', which means that it is not allowed to set the value of the ALLUSERS msi property to &amp;quot;1&amp;quot;. &lt;br /&gt;
The tool can be pre-configured for the end-users by setting public properties at the commandline for the installation process. These are processed by the installer and then written into the tool's config-file. The following parameters can be adjusted (the values in square brackets that are listed below indicate the default values of the properties when not overridden by the msi commandline - so that would be the default pre-configuration):&lt;br /&gt;
&amp;lt;pre&amp;gt;ADMINUSER []&lt;br /&gt;
ADMINPASSWORD []&lt;br /&gt;
BATCHMODE [False]&lt;br /&gt;
CLEARFOLDERS [False]&lt;br /&gt;
EXPORTAPPOINTMENTPARTICIPANTS [True]&lt;br /&gt;
EXPORTAPPOINTMENTUIDS [True]&lt;br /&gt;
IGNOREJUNKFOLDER [True]&lt;br /&gt;
IGNORETRASHFOLDER [True]&lt;br /&gt;
IMPORTFOLDERNAME []&lt;br /&gt;
LOGAUTOFLUSH [True]&lt;br /&gt;
LOGCONSOLE [False]&lt;br /&gt;
LOGLEVEL [Info]&lt;br /&gt;
LOGTEXTFILE [.\pst2ox.log]&lt;br /&gt;
MIGRATEAPPOINTMENTS [True]&lt;br /&gt;
MIGRATECONTACTS [True]&lt;br /&gt;
MIGRATEEMAILS [True]&lt;br /&gt;
MIGRATENOTES [True]&lt;br /&gt;
MIGRATETASK [True]&lt;br /&gt;
PASSWORD []&lt;br /&gt;
PROFILENAME []&lt;br /&gt;
PSTFILE []&lt;br /&gt;
PSTPASSWORD []&lt;br /&gt;
SERVERURL [http://]&lt;br /&gt;
SKIPEMPTYFOLDERS [True]&lt;br /&gt;
STORENAME []&lt;br /&gt;
UPLOADCHUNKSIZE [25]&lt;br /&gt;
UPLOADTHRESHOLDBYTES [2097152]&lt;br /&gt;
OXUSERNAME []&lt;br /&gt;
RECOVERABLEEXCEPTIONMAXRETRIES [3]&lt;br /&gt;
SUPPRESSNOTIFICATIONMAILS [True]&lt;br /&gt;
SKIPMAILSWITHNONRESOLVEDRECIPIENTS [False]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example, to predefine a Server URL that should be used for the&lt;br /&gt;
migration afterwards, one would execute e.g.:&lt;br /&gt;
&amp;lt;pre&amp;gt; &amp;quot;Open-Xchange Outlook Uploader.msi&amp;quot; SERVERURL=&amp;quot;http://ox.example.invalid&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Address Resolution==&lt;br /&gt;
&lt;br /&gt;
While the Open-Xchange server uses SMTP as the only recipient address type, data from Microsoft Exchange might contain several additional address types. To migrate such Exchange data to the Open-Xchange server, each e-mail recipient or particpiant of an appointment or task needs a valid SMTP address. While the migration tool tries to retrieve the SMTP address of message recipients in different ways, sometimes there might be recipients that can't be resolved without a connection to the Microsoft Exchange server / Active Directory and it's global address lists. Especially, this may happen with .pst-files that were created using Microsofts EXMERGE tool. &lt;br /&gt;
In order to resolve that issue, the OXUploader migration tool can establish a connection to the exchange server and to it's global address list prior migrating a .pst-file to the Open-Xchange server, so that the recipient's SMTP addresses can be resolved. To do so, there are two parameters that can be set to logon to the exchange server prior migrating the .pst-file: [[#ExchangeServerURL|ExchangeServerURL]] and [[#ExchangeServerUsername|ExchangeServerUsername]]. The username parameter is optional (if not defined, the identity of the current windows user is used) and normally should not need to be set in batch-mode to prevent a windows logon prompt. &lt;br /&gt;
For example, to logon to the exchange server at &amp;quot;192.168.0.4&amp;quot; and perform an admin migration for the username &amp;quot;test&amp;quot; in unattended mode, a command could look like:&lt;br /&gt;
&amp;lt;pre&amp;gt;OXUploaderC.exe -batchmode true -exchangeserverurl 192.168.0.4 -serverurl &amp;quot;http://ox.example.invalid&amp;quot; -username test -adminuser admin -adminpassword secret -pstfile &amp;quot;.\test.pst&amp;quot; -logtextfile &amp;quot;.\test.log&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Public Folders==&lt;br /&gt;
&lt;br /&gt;
When migrating an Exchange Public Folders store, the folders are migrated below the root Public Folders folder on the Open-Xchange server. To do so, the user performing the migration must have appropiate permissions to create public folders on the server. Since access rights of the folders are not migrated, custom permissions on the folders should be applied manually afterwards.&lt;br /&gt;
&lt;br /&gt;
=Configuration parameters=&lt;br /&gt;
This chapter describes all possible configuration parameters that can be found in the OXUploader.exe.config / OXUploaderC.exe.config configuration files or can be passed to the migration tool from the commandline.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;span id=&amp;quot;AdminPassword&amp;quot;&amp;gt;AdminPassword&amp;lt;/span&amp;gt;: The password associated with the administrator user ([[#AdminUser|AdminUser]]) on the Open-Xchange server. Only used when performing [[#Admin_migration|admin migration]].&lt;br /&gt;
; &amp;lt;span id=&amp;quot;AdminUser&amp;quot;&amp;gt;AdminUser&amp;lt;/span&amp;gt;: The username of the administrator user on the Open-Xchange server. Only used when performing [[#Admin_migration|admin migration]].&lt;br /&gt;
; &amp;lt;span id=&amp;quot;AppointmentsMinDate&amp;quot;&amp;gt;AppointmentsMinDate&amp;lt;/span&amp;gt;: If defined, only appointments that end after this date are migrated. Recurring appointments are migrated, if the end date of the series has not been set, or if the end date of the series is not after this defined value. Date format should be ''yyy-MM-dd''.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;BatchMode&amp;quot;&amp;gt;BatchMode&amp;lt;/span&amp;gt;: Specifies whether the tool should be run in a special batchmode without user interaction or not, see [[#Usage_(unattended_mode)|unattended mode]] for details.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;ClearFolders&amp;quot;&amp;gt;ClearFolders&amp;lt;/span&amp;gt;: When set to 'True', the migration tool clears the target folder contents before exporting items to that folders. Existing subfolders are not affected by this setting, only the folder's contents. Also, the folder clear-command is only executed for folders that are actually migrated, not for ignored or skipped folders.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;EMailsMinDate&amp;quot;&amp;gt;EMailsMinDate&amp;lt;/span&amp;gt;: If defined, only e-mails that were sent or received after this date are migrated. Date format should be ''yyyy-MM-dd''.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;ExchangeMailboxName&amp;quot;&amp;gt;ExchangeMailboxName&amp;lt;/span&amp;gt;: Specifies the mailbox name on the Microsoft Exchange server that should be used for migration. Used in combination with the [[#ExchangeServerURL|ExchangeServerURL]] and [[#ExchangeServerUsername|ExchangeServerUsername]] parameters. If not defined, the default mailbox for the Exchange user is used. This parameter is also used to define a shared Exchange mailbox, see [[#Exchange mailboxes|Exchange mailboxes]] for details.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;ExchangeServerURL&amp;quot;&amp;gt;ExchangeServerURL&amp;lt;/span&amp;gt;: The URL of the Microsoft Exchange server that hosts the mailbox to be migrated. Only used, when [[#PSTFile|PSTFile]] and [[#ProfileName|ProfileName]] are not defined.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;ExchangeServerUsername&amp;quot;&amp;gt;ExchangeServerUsername&amp;lt;/span&amp;gt;: The username of the Exchange account to migrate. Used in combination with the [[#ExchangeServerURL|ExchangeServerURL]] and [[#ExchangeMailboxName|ExchangeMailboxName]] parameters. If not defined, the current windows identity is used. &lt;br /&gt;
; &amp;lt;span id=&amp;quot;ExportAppointmentParticipants&amp;quot;&amp;gt;ExportAppointmentParticipants&amp;lt;/span&amp;gt;: Specifies whether the participants (recipients) of appointments should be migrated or not. If set to 'False', only the Open-Xchange user ([[#Username|Username]]) will participate the exported appointments, otherwise all original participants will be added to the migrated appointment, too.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;ExportAppointmentUIDs&amp;quot;&amp;gt;ExportAppointmentUIDs&amp;lt;/span&amp;gt;: Specifies whether the unique identifiers (UIDs) of appointments should be migrated or not. Details can be found in the chapter [[#Duplicated items|Duplicated items]].&lt;br /&gt;
; &amp;lt;span id=&amp;quot;HistoryFile&amp;quot;&amp;gt;HistoryFile&amp;lt;/span&amp;gt;: The path to the file where the migration tool stores the migration results internally to keep track of which folders already have been migrated successfully.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;IgnoreJunkFolder&amp;quot;&amp;gt;IgnoreJunkFolder&amp;lt;/span&amp;gt;: Whether to ignore the ''Junk'' folder during the migration or not.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;IgnoreSyncIssuesFolder&amp;quot;&amp;gt;IgnoreSyncIssuesFolder&amp;lt;/span&amp;gt;: Whether to ignore the ''Sync Issues'' folder during the migration or not.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;IgnoreTrashFolder&amp;quot;&amp;gt;IgnoreTrashFolder&amp;lt;/span&amp;gt;: Whether to ignore the ''Trash'' folder during the migration or not.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;ImportFolderName&amp;quot;&amp;gt;ImportFolderName&amp;lt;/span&amp;gt;: Specifies the name of an additional subfolder below the OX default folders that is used as target for the migrated folders. If left blank, the OX default folders are used as target directly.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;LogAutoFlush&amp;quot;&amp;gt;LogAutoFlush&amp;lt;/span&amp;gt;: Specifies whether the log should be flushed to disk automatically after each entry.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;LogConsole&amp;quot;&amp;gt;LogConsole&amp;lt;/span&amp;gt;: Whether to output the log to the console or not.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;LogLevel&amp;quot;&amp;gt;LogLevel&amp;lt;/span&amp;gt;: Specifies the verbosity of the generated log, possible values are ''Error'', ''Warning'', ''Info'' and ''Verbose''.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;LogonExchangeMailbox&amp;quot;&amp;gt;LogonExchangeMailbox&amp;lt;/span&amp;gt;: It's possible to establish a connection to the an MS Exchange server and to it's global address list prior migrating .pst-files, so that the recipient's SMTP addresses can be resolved. When set to ''True'', the URL of the Exchange server has to be defined in [[#ExchangeServerURL|ExchangeServerURL]].&lt;br /&gt;
; &amp;lt;span id=&amp;quot;LogPOSTData&amp;quot;&amp;gt;LogPOSTData&amp;lt;/span&amp;gt;: For debugging reasons, this option enables or disables logging of the complete POST data that is sent to the Open-Xchange server during migration.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;LogTextFile&amp;quot;&amp;gt;LogTextFile&amp;lt;/span&amp;gt;: Specifies the path to the logfile. &lt;br /&gt;
; &amp;lt;span id=&amp;quot;MigrateAppointments&amp;quot;&amp;gt;MigrateAppointments&amp;lt;/span&amp;gt;: Whether to migrate appointments or not.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;MigrateContacts&amp;quot;&amp;gt;MigrateContacts&amp;lt;/span&amp;gt;: Whether to migrate contacts and distribution lists or not.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;MigrateEMails&amp;quot;&amp;gt;MigrateEMails&amp;lt;/span&amp;gt;: Whether to migrate e-mail or not.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;MigrateNotes&amp;quot;&amp;gt;MigrateNotes&amp;lt;/span&amp;gt;: Whether to migrate sticky notes or not.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;MigrateTasks&amp;quot;&amp;gt;MigrateTasks&amp;lt;/span&amp;gt;: Whether to migrate tasks or not.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;Password&amp;quot;&amp;gt;Password&amp;lt;/span&amp;gt;: The password for the target account ([[#UserName|UserName]]) on the Open-Xchange server.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;ProfileName&amp;quot;&amp;gt;ProfileName&amp;lt;/span&amp;gt;: The name of the local mail profile to be migrated. Used in combination with the [[#StoreName|StoreName]] parameter.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;PSTFile&amp;quot;&amp;gt;PSTFile&amp;lt;/span&amp;gt;: The path to the .pst-file to be migrated.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;PSTPassword&amp;quot;&amp;gt;PSTPassword&amp;lt;/span&amp;gt;: The password to access the .pst-file, only needed if the .pst has been protected with a password.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;RecoverableExceptionMaxRetries&amp;quot;&amp;gt;RecoverableExceptionMaxRetries&amp;lt;/span&amp;gt;: Specifies how often a request is repeated in case of possibly recoverable errors.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;ServerURL&amp;quot;&amp;gt;ServerURL&amp;lt;/span&amp;gt;: The URL of the Open-Xchange server.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;SkipEmptyFolders&amp;quot;&amp;gt;SkipEmptyFolders&amp;lt;/span&amp;gt;: Whether to include folders that don't contain any items or not. Subfolders in empty folders are not affected by this setting.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;StoreName&amp;quot;&amp;gt;StoreName&amp;lt;/span&amp;gt;: The name of the message store inside the local mail profile. Used in combination with the [[#ProfileName|ProfileName]] parameter.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;TasksMinDate&amp;quot;&amp;gt;TasksMinDate&amp;lt;/span&amp;gt;: If defined, only tasks with a due date after this date are migrated. Date format should be ''yyyy-MM-dd''.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;UploadChunkSize&amp;quot;&amp;gt;UploadChunkSize&amp;lt;/span&amp;gt;: Specifies the number of e-mail items that are sent to the Open-Xchange server during the migration per each request.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;UploadThresholdBytes&amp;quot;&amp;gt;UploadThresholdBytes&amp;lt;/span&amp;gt;: Specifies a value in bytes after which an e-mail message chunk is sent to the server, even if when the [[#UploadChunkSize|UploadChunkSize]] is not yet exceeded.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;Username&amp;quot;&amp;gt;Username&amp;lt;/span&amp;gt;: The user name of the target account on the Open-Xchange server.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;SuppressNotificationMails&amp;quot;&amp;gt;SuppressNotificationMails&amp;lt;/span&amp;gt;: Whether to suppress server generated notification mails for new appointments/tasks or not.&lt;br /&gt;
; &amp;lt;span id=&amp;quot;SkipMailsWithNonResolvedRecipients&amp;quot;&amp;gt;SkipMailsWithNonResolvedRecipients&amp;lt;/span&amp;gt;: Whether the OXUploader skips migrating mails with at least one non resolved recipient or not.&lt;br /&gt;
&lt;br /&gt;
=Functional limitations=&lt;br /&gt;
* Due to differences in handling recurring tasks between the Open-Xchange server and Microsoft Exchange, recurring tasks are not supported.&lt;br /&gt;
* Folder permissions are not transferred to the Open-Xchange server; each new subfolder that is created during the migration gets a set of default permissions (target user has admin permissions).&lt;br /&gt;
&lt;br /&gt;
=Reporting of Bugs=&lt;br /&gt;
Please report bugs and missing features via [https://bugzilla.open-xchange.com/enter_bug.cgi?product=Open-Xchange%20MS%20Outlook%20Uploader Open-Xchange Bugzilla]. Many thanks in advance for your support.&lt;br /&gt;
&lt;br /&gt;
Product: Open-Xchange MS Outlook Uploader&lt;br /&gt;
&lt;br /&gt;
=Open-Xchange Microsoft Outlook® Uploader (Open Source via SVN)=&lt;br /&gt;
&lt;br /&gt;
Portions of the Software may use, include third party software, other copyrighted material or Open Source Software. Acknowledgements, licensing terms and disclaimers for such material are contained in separate agreements.  Licensee’s use of such material is governed by the terms of the applicable agreements and can be found on the OX web site, are listed under: [http://www.open-xchange.com/licenses-for-open-xchange-ms-outlook-uploader http://www.open-xchange.com/licenses-for-open-xchange-ms-outlook-uploader]&lt;br /&gt;
&lt;br /&gt;
==Compile from sources==&lt;br /&gt;
&lt;br /&gt;
=== Download and install Outlook Redemption ===&lt;br /&gt;
 &lt;br /&gt;
The Open-Xchange Microsoft Outlook Uploader requires the Outlook Redemption library® by Dmitry Streblechenko. As the distributable version of Redemption cannot be used in open source projects, it is not included in the repository. However, for development purposes only, you can download a copy of the library at [http://www.dimastr.com/redemption/ http://www.dimastr.com/redemption/] and install it on your development PC.&lt;br /&gt;
&lt;br /&gt;
=== Checkout the sources from Subversion ===&lt;br /&gt;
 &lt;br /&gt;
The source code for the Open-Xchange Microsoft Outlook® Uploader is available in a public Subversion repository. To checkout the latest sources, use the following command:&lt;br /&gt;
&lt;br /&gt;
 svn --username anonymous checkout https://svn.open-xchange.com/migration/OXUploader&lt;br /&gt;
&lt;br /&gt;
=== Build using Visual Studio® === &lt;br /&gt;
 &lt;br /&gt;
The Open-Xchange Microsoft Outlook® Uploader can be compiled easily using Visual Studio 2008®. For both the interactive and the commandline version of the migration tool, there are C# project files (.csproj) in the PST2OX and the PST2OXc subdirectories (PST2OX is the 'codename' of the migration tool). Just open the project file in Visual Studio and build the project.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Writing_a_contacts_plugin&amp;diff=17476</id>
		<title>AppSuite:Writing a contacts plugin</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Writing_a_contacts_plugin&amp;diff=17476"/>
		<updated>2014-04-28T02:55:03Z</updated>

		<summary type="html">&lt;p&gt;Malasa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Where and how to start ==&lt;br /&gt;
Plugins are collected in the folder ui/apps/plugins. Start your new plugin there: Create a folder and in this folder, create two files: &amp;lt;tt&amp;gt;register.js&amp;lt;/tt&amp;gt; (where everything happens) and &amp;lt;tt&amp;gt;manifest.json&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== What are you going to do ==&lt;br /&gt;
Your plugin code can interact with the app suite is by way of extension points and extensions. Stated briefly an extension point is an invitation to contributing an implementation to a part of the UI. For example the contact detail view consists of an extension point that receives contributions in the form of renderers, that render different parts of the contact. Say, one for rendering the display name, one for the mail addresses, one for the postal addresses and so on. All these, in turn then, make up the contacts detail view. It is easy for plugins to affect this set of extensions. A plugin can contribute its own extension to an extension point, thereby rendering a different part of a contact or contributing a new button to work on a contact. A plugin can also disable existing extensions, thereby removing parts of the UI.&lt;br /&gt;
&lt;br /&gt;
== Hans-On ==&lt;br /&gt;
=== Register ===&lt;br /&gt;
As an example, let's add a new renderer to the contact detail view. Let's create a new file myplugin/apps/com.example/contacts/register.js:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;language-javacript&amp;quot;&amp;gt;&lt;br /&gt;
        define('com.example/contacts/register', ['io.ox/core/extensions'], function (ext) {&lt;br /&gt;
            'use strict';&lt;br /&gt;
&lt;br /&gt;
            ext.point('io.ox/contacts/detail').extend({&lt;br /&gt;
                id: 'com-example-contact-reversename',&lt;br /&gt;
                after: 'contact-details',&lt;br /&gt;
                draw: function (baton) {&lt;br /&gt;
&lt;br /&gt;
                    var name = baton.data.display_name;&lt;br /&gt;
                    var rev = name.split(&amp;quot;&amp;quot;).reverse().join(&amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                    this.append(&lt;br /&gt;
                        $(&amp;quot;&amp;lt;h1&amp;gt;&amp;quot;).text(rev)&lt;br /&gt;
                    ));&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manifest ===&lt;br /&gt;
Next we have to make sure our code is actually loaded by the UI at the right moment. The right moment in our case is right before it loads the file apps/io.ox/contacts/view-detail, where the extension point is processed. For this, we need another [[AppSuite:UI_manifests_explained | manifest]] file at myplugin/apps/com.example/contacts/manifest.json:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;language-javacript&amp;quot;&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        namespace: &amp;quot;io.ox/contacts/view-detail&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After writing your code, always [[AppSuite:GettingStarted#Building | build]] your javascript code to make apply.&lt;br /&gt;
See the [[AppSuite:GettingStarted#Development_cycle | development cycle]] to keep easy steps in mind you need while developing.&lt;br /&gt;
&lt;br /&gt;
=== Running a local backend? ===&lt;br /&gt;
&lt;br /&gt;
If using a local backend, restart it to pick up on the changed manifest, or, for a remote backend, edit myplugin/src/manifests.js again so it reads:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;language-javacript&amp;quot;&amp;gt;&lt;br /&gt;
    define(function () {&lt;br /&gt;
        return [&lt;br /&gt;
            {&lt;br /&gt;
                path: &amp;quot;com.example/main&amp;quot;,&lt;br /&gt;
                title: 'Hello World App'&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                path: &amp;quot;com.example/contacts/register&amp;quot;,&lt;br /&gt;
                namespace: &amp;quot;io.ox/contacts/view-detail&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ];&lt;br /&gt;
    });&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
reload the UI and navigate to a contact. It should contain the new section with the display name in reverse.&lt;br /&gt;
&lt;br /&gt;
== Extension Points ==&lt;br /&gt;
Trouble [[AppSuite:Extending_the_UI_(Hands-on_introduction)#Trouble_finding_the_right_extension_point.3F | finding the right extension point]]?&lt;br /&gt;
Learn more about Extension points regarding [[AppSuite:Extension_points | these articles]].&lt;br /&gt;
== Stuck somewhere? ==&lt;br /&gt;
You got stuck with a problem while developing? OXpedia might help you out with the article about [[AppSuite:Debugging_the_UI | debugging the UI]].&lt;br /&gt;
&lt;br /&gt;
[[Category:AppSuite]]&lt;br /&gt;
[[Category:UI]]&lt;br /&gt;
[[Category:Developer]]&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=Template:OXLoadBalancingClustering_Database&amp;diff=17048</id>
		<title>Template:OXLoadBalancingClustering Database</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=Template:OXLoadBalancingClustering_Database&amp;diff=17048"/>
		<updated>2014-02-08T09:25:23Z</updated>

		<summary type="html">&lt;p&gt;Malasa: /* wsrep.cnf configuration file */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Overview ==&lt;br /&gt;
&lt;br /&gt;
You can choose between Galera or two-sided Master/Slave (&amp;quot;Master/Master&amp;quot;) replication.&lt;br /&gt;
&lt;br /&gt;
== Galera database setup ==&lt;br /&gt;
&lt;br /&gt;
OX only supports the &amp;quot;Percona XtraDB Cluster&amp;quot; flavor of the Galera database.&lt;br /&gt;
&lt;br /&gt;
=== Installation ===&lt;br /&gt;
&lt;br /&gt;
==== Debian systems ====&lt;br /&gt;
&lt;br /&gt;
The following has been tested with Squeeze, but the Wheezy procedure should not be different, besides the repo paths need adjustments.&lt;br /&gt;
&lt;br /&gt;
To install the software, we first need to configure the repository and its build key, update our sources lists and install the packages:&lt;br /&gt;
&lt;br /&gt;
 gpg --keyserver  hkp://keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A&lt;br /&gt;
 gpg -a --export CD2EFD2A | apt-key add -&lt;br /&gt;
 &lt;br /&gt;
 cat &amp;gt;/etc/apt/sources.list.d/percona.list &amp;lt;&amp;lt;EOF&lt;br /&gt;
 deb http://repo.percona.com/apt squeeze main&lt;br /&gt;
 deb-src http://repo.percona.com/apt squeeze main&lt;br /&gt;
 EOF&lt;br /&gt;
 &lt;br /&gt;
 apt-get update&lt;br /&gt;
 apt-get install percona-xtradb-cluster-client-5.5 percona-xtradb-cluster-server-5.5 percona-xtrabackup&lt;br /&gt;
&lt;br /&gt;
==== RHEL 6 systems ====&lt;br /&gt;
&lt;br /&gt;
Should also apply to CentOS 6.&lt;br /&gt;
&lt;br /&gt;
First, disable ''selinux'', ''iptables'', ''ip6tables''. (Galera does not run with selinux. Using iptables and ip6tables should work if you configure it correctly, but documentation thereof is out of scope of this document.) Reboot.&lt;br /&gt;
&lt;br /&gt;
Percona XtraDB Cluster relies on ''socat'' which is not shipped by RHEL. We need to install from a different source. It is convenient to use the rpmforge repo. (''epel'' works not since its socat expects readline libraries version 5, while RHEL 6 (at leat 6.4) provides version 6.)&lt;br /&gt;
&lt;br /&gt;
The installation command itself needs to be a composite ''remove'', ''install'' command since yum is not clever enough to resolve the conflicts itself, so we need to tell it how.&lt;br /&gt;
&lt;br /&gt;
 wget wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm&lt;br /&gt;
 yum localinstall rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm&lt;br /&gt;
 &lt;br /&gt;
 wget http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm&lt;br /&gt;
 yum localinstall percona-release-0.0-1.x86_64.rpm&lt;br /&gt;
 &lt;br /&gt;
 yum shell&lt;br /&gt;
 remove mysql-libs&lt;br /&gt;
 install Percona-XtraDB-Cluster-server Percona-XtraDB-Cluster-client&lt;br /&gt;
 run&lt;br /&gt;
 quit&lt;br /&gt;
&lt;br /&gt;
=== Configuration ===&lt;br /&gt;
&lt;br /&gt;
==== ''my.cnf'' configuration file ====&lt;br /&gt;
&lt;br /&gt;
Galera needs also a ''my.cnf'' configuration file. Usually MySQL expects this file to be located at ''/etc/mysql/my.cnf''. But the Percona packages don't ship any; on purpose: https://bugs.launchpad.net/percona-server/+bug/673844&lt;br /&gt;
&lt;br /&gt;
Thus, you need to obtain / install / create one on your own. Make sure it has no settings which are forbidden for Galera. This includes the ''query_cache'' (it must not be enabled with Galera) and probably other settings which would contradict the settings explained in the next section.&lt;br /&gt;
&lt;br /&gt;
Make sure you apply standard tunings for your memory size, number of allowed connections, and stuff.&lt;br /&gt;
&lt;br /&gt;
We assume in the following that the ''my.cnf'' file has a directive like ''!includedir /etc/mysql/conf.d'', such that you can put additional config files ending with ''.cnf'' there.&lt;br /&gt;
&lt;br /&gt;
A sample ''my.cnf'' file serving as a starting point is provided here: [[My.cnf]]. Make sure you read the whole article and adjust that file to suit your needs before actually using it.&lt;br /&gt;
&lt;br /&gt;
Caveat: we found out that Galera performs suboptimal when using ''innodb_flush_log_at_trx_commit=1''. We leave up to you to assess whether this is a no-go for your environment or not. For Galera reasonable values for this parameter are ''innodb_flush_log_at_trx_commit=2'' or ''...=0''. Make sure to read the documentataion of this parameter and that you understand its implication before using it.&lt;br /&gt;
&lt;br /&gt;
==== ''wsrep.cnf'' configuration file ====&lt;br /&gt;
&lt;br /&gt;
The Galera configuration then happens in a section called &amp;quot;wsrep&amp;quot;, &amp;quot;write set replication&amp;quot;, which is the internal name for the replication mechanism Galera is based on. A sample ''/etc/mysql/conf.d/wsrep.cnf'' file looks like:&lt;br /&gt;
&lt;br /&gt;
 [mysqld]&lt;br /&gt;
 # the following lines are required for galera:&lt;br /&gt;
 binlog_format=ROW&lt;br /&gt;
 default-storage-engine=innodb&lt;br /&gt;
 innodb_autoinc_lock_mode=2&lt;br /&gt;
 innodb_locks_unsafe_for_binlog=1&lt;br /&gt;
 query_cache_size=0&lt;br /&gt;
 query_cache_type=0&lt;br /&gt;
 bind-address=0.0.0.0&lt;br /&gt;
 wsrep_provider=/usr/lib64/libgalera_smm.so&lt;br /&gt;
 # the following lines need to be adjusted to your environment ... CHANGE THE PASSWORD! :-)&lt;br /&gt;
 wsrep_cluster_name=&amp;quot;my_wsrep_cluster&amp;quot;&lt;br /&gt;
 wsrep_cluster_address=&amp;quot;gcomm://&amp;lt;GALERA_NODE1_IP&amp;gt;,&amp;lt;GALERA_NODE2_IP&amp;gt;,&amp;lt;GALERA_NODE3_IP&amp;gt;&amp;quot;&lt;br /&gt;
 wsrep_sst_method=xtrabackup&lt;br /&gt;
 wsrep_sst_auth=wsrep:5ojijmedUg8&lt;br /&gt;
 # It is recommended to run Galera in synchronous mode, which makes it possible&lt;br /&gt;
 # to disable the OX builtin database replication monitor.&lt;br /&gt;
 # Default is semi-synchronous mode. To enable synchronous mode, use&lt;br /&gt;
 wsrep_causal_reads=1&lt;br /&gt;
&lt;br /&gt;
When you adjusted those files, make sure they are identical on all nodes.&lt;br /&gt;
&lt;br /&gt;
The replication user will be created later when the DB is running on the first node.&lt;br /&gt;
&lt;br /&gt;
=== Cluster startup ===&lt;br /&gt;
&lt;br /&gt;
Whenever all nodes of a Galera cluster are not running (like before starting the cluster for the very first time), the first Galera node needs to get started with the ''wsrep_cluster_address'' parameter overridden to the value &amp;quot;gcomm://&amp;quot; in order to denote that the node shall not try to join an existing cluster (which would inevitably fail now, because no other cluster nodes are running yet), but to bootstrap the cluster instead. This override can most conveniently done on the command line, instead of editing to wsrep.cnf file to and fro.&lt;br /&gt;
&lt;br /&gt;
So, for the first node, the startup command is&lt;br /&gt;
&lt;br /&gt;
 mysqld_safe --wsrep_cluster_address=gcomm:// &amp;amp;&lt;br /&gt;
&lt;br /&gt;
You should then verify the Galera module is loaded properly using&lt;br /&gt;
&lt;br /&gt;
 mysql -e &amp;quot;show status like 'wsrep%';&amp;quot;&lt;br /&gt;
&lt;br /&gt;
You should verify some settings like&lt;br /&gt;
&lt;br /&gt;
 | wsrep_local_state_comment  | Synced                               |&lt;br /&gt;
 | wsrep_cluster_size         | 1                                    |&lt;br /&gt;
 | wsrep_cluster_status       | Primary                              |&lt;br /&gt;
 | wsrep_connected            | ON                                   |&lt;br /&gt;
 | wsrep_provider_name        | Galera                               |&lt;br /&gt;
 | wsrep_provider_vendor      | Codership Oy &amp;lt;info@codership.com&amp;gt;    |&lt;br /&gt;
 | wsrep_provider_version     | 2.8(r162)                            |&lt;br /&gt;
 | wsrep_ready                | ON                                   |&lt;br /&gt;
&lt;br /&gt;
Now you need to create the database user for the replication on this first node:&lt;br /&gt;
&lt;br /&gt;
 # create wsrep user: in mysql shell:&lt;br /&gt;
 CREATE USER 'wsrep'@'localhost' IDENTIFIED BY '5ojijmedUg8';&lt;br /&gt;
 GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'wsrep'@'localhost';&lt;br /&gt;
 FLUSH PRIVILEGES;&lt;br /&gt;
&lt;br /&gt;
The Galera peers can then be started on the nodes 2 and 3 using&lt;br /&gt;
&lt;br /&gt;
 mysqld_safe &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Since the standard service startup scripts cannot account for this special treatment, we recomment not to use them.&lt;br /&gt;
&lt;br /&gt;
You can check the status of the Galera cluster using&lt;br /&gt;
&lt;br /&gt;
 mysql -e &amp;quot;show status like 'wsrep%';&amp;quot;&lt;br /&gt;
&lt;br /&gt;
The output is lengthy. The most relevant fields are given as follows:&lt;br /&gt;
&lt;br /&gt;
 +----------------------------+----------------------------------------------------------------------+&lt;br /&gt;
 | Variable_name              | Value                                                                |&lt;br /&gt;
 +----------------------------+----------------------------------------------------------------------+&lt;br /&gt;
 | wsrep_local_state_comment  | Synced                                                               |&lt;br /&gt;
 | wsrep_incoming_addresses   | &amp;lt;GALERA_NODE1_IP&amp;gt;:3306,&amp;lt;GALERA_NODE2_IP&amp;gt;:3306,&amp;lt;GALERA_NODE3_IP&amp;gt;:3306 |&lt;br /&gt;
 | wsrep_cluster_size         | 3                                                                    |&lt;br /&gt;
 | wsrep_cluster_status       | Primary                                                              |&lt;br /&gt;
 | wsrep_connected            | ON                                                                   |&lt;br /&gt;
 | wsrep_ready                | ON                                                                   |&lt;br /&gt;
 +----------------------------+----------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
==== Troubleshooting ====&lt;br /&gt;
&lt;br /&gt;
The logs are helpful. Always.&lt;br /&gt;
&lt;br /&gt;
Common mistakes are listed below.&lt;br /&gt;
&lt;br /&gt;
If the Galera module does not get loaded at all:&lt;br /&gt;
* Configuration settings in ''my.cnf'' which are incompatible to Galera&lt;br /&gt;
* Wrong path of the shared object providing the Galera plugin in wsrep.cnf (wsrep_provider)&lt;br /&gt;
&lt;br /&gt;
If the first node starts, but the second / third nodes can not be added to the cluster:&lt;br /&gt;
* User for the replication not created correctly on the first Galera node&lt;br /&gt;
&lt;br /&gt;
=== Notes about configuring OX for use with Galera ===&lt;br /&gt;
&lt;br /&gt;
==== Write requests ====&lt;br /&gt;
&lt;br /&gt;
Open-Xchange supports Galera as database backend only in the configuration where all writes are directed to one Galera node. For availability, it makes sense to configure a floating IP as write IP for OX, which can be transferred from one Galera to another Galera node if needed. We recommend putting the control of such a floating IP under the control of some HA cluster software like pacemaker/corosync.&lt;br /&gt;
&lt;br /&gt;
==== Read requests ====&lt;br /&gt;
&lt;br /&gt;
You can chose between using a load balancer, using a floating IP for the read requests, or use the write requests floating IP.&lt;br /&gt;
&lt;br /&gt;
* Load balancer based setup: Read requests get distributed aribtrarily between the Galera nodes. You require a load balancer for this. See next section. Then, in this configuration, you have two alternatives: &lt;br /&gt;
** The Galera option wsrep_causal_reads=1 option enables you to configure OX with its replication monitor disabled (com.openexchange.database.replicationMonitor=false in configdb.properties).&lt;br /&gt;
** Alternatively, you can run Galera with wsrep_causal_reads=0 when switching on OX builtin replication monitor. This setup however seems to be inferior from the performance point of view.&lt;br /&gt;
* Use a designated floating IP for the read requests: This eliminates the need of a load balancer. Since read requests do not seem to be performance-limiting, we expect to perform this option on par with the loadbalancer option.&lt;br /&gt;
* Use the floating IP for the writes also for the reads: In this scenario, you direct all database queries only to one Galera node, and the other two nodes are only getting queries in case of a failure of that node. In this case, you can even use wsrep_causal_reads=0 wile still having OX builtin replication monitor switched off.&lt;br /&gt;
&lt;br /&gt;
=== Loadbalancer options ===&lt;br /&gt;
&lt;br /&gt;
While the JDBC driver has some round-robin load balancing capabilities built-in, we don't recommend it for production use since it lacks possibilities to check the Galera nodes health states.&lt;br /&gt;
&lt;br /&gt;
For most productions setup customers use enterprise-grade loadbalancing appliances. Those should get configured to check node availability not only on the TCP level, but to query the Galera sync status periodically. For an example of such an health check, see the our documentation for setting up a software loadbalancer using keepalived (next paragraph).&lt;br /&gt;
&lt;br /&gt;
For testing purposes it is possible to use Keepalived to create a software loadbalancer on a therefore dedicated linux node. Documentation is available [[Keepalived|here]].&lt;br /&gt;
&lt;br /&gt;
== Master/Master database setup ==&lt;br /&gt;
This section describes the setup process &amp;quot;Master/Master replication&amp;quot; for new Open-Xchange  database cluster. During configuration and initialization, other database operations must be prohibited.&lt;br /&gt;
&lt;br /&gt;
The Master/Master replication is a vice versa setup of Master/Slave configurations. This means each server is afterwards the slave of the other. &lt;br /&gt;
&lt;br /&gt;
Server IPs in the example are 1.1.1.1 and 9.9.9.9&lt;br /&gt;
&lt;br /&gt;
Startup both database machines and install the mysql server packages&lt;br /&gt;
 $ apt-get install mysql-server&lt;br /&gt;
&lt;br /&gt;
During the installation, a dialog will show up to set a password for the MySQL 'root' user.&lt;br /&gt;
&lt;br /&gt;
Open the MySQL configuration file on both servers:&lt;br /&gt;
 $ vim /etc/mysql/my.cnf&lt;br /&gt;
&lt;br /&gt;
Modify or enable the following configuration options in the mysqld-section, use 1 as ${unique Number} on the server 1.1.1.1 and 2 for 9.9.9.9: &lt;br /&gt;
 bind-address            = 0.0.0.0&lt;br /&gt;
 server-id               = ${unique Number}&lt;br /&gt;
 log_bin                 = /var/log/mysql/mysql-bin.log&lt;br /&gt;
 binlog_format           = statement&lt;br /&gt;
 max_allowed_packet      = 16M&lt;br /&gt;
&lt;br /&gt;
* ''bindaddress'' specifies the network address where MySQL is listening for network connections. Since the MySQL slave and both Open-Xchange Servers are dedicated machines it is required to have the master accessible through the network.&lt;br /&gt;
* ''server-id'' is just a unique number within a environment with multiple MySQL servers. It needs to be unique for each server in a replication cluster.&lt;br /&gt;
* ''log-bin'' enables the MySQL binary log which is required for Master/Master replication. In general every statement triggered at the database is stored there to get distributed through the database cluster.&lt;br /&gt;
&lt;br /&gt;
To apply the configuration changes, restart the MySQL servers.&lt;br /&gt;
 $ /etc/init.d/mysql restart&lt;br /&gt;
&lt;br /&gt;
Then login to MySQL with the credentials given at the MySQL installation process&lt;br /&gt;
 $ mysql -u root -p&lt;br /&gt;
 Enter password:&lt;br /&gt;
&lt;br /&gt;
=== First Master configuration ===&lt;br /&gt;
Choose one server to start with as the first Master (here we use 1.1.1.1).&lt;br /&gt;
&lt;br /&gt;
Create a MySQL user with rights &amp;quot;REPLICATION&amp;quot;. This account is used by the MySQL slave to fetch database updates. In this example, the username is &amp;quot;replication&amp;quot;:&lt;br /&gt;
&lt;br /&gt;
  mysql&amp;gt; GRANT REPLICATION SLAVE ON *.* TO 'replication'@'9.9.9.9' IDENTIFIED BY 'secret';&lt;br /&gt;
&lt;br /&gt;
Verify that the MySQL daemon writes a binary log and note the log Position and File name:&lt;br /&gt;
 mysql&amp;gt; SHOW MASTER STATUS;&lt;br /&gt;
 +------------------+----------+--------------+------------------+&lt;br /&gt;
 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |&lt;br /&gt;
 +------------------+----------+--------------+------------------+&lt;br /&gt;
 | mysql-bin.000001 |     1111 |              |                  |&lt;br /&gt;
 +------------------+----------+--------------+------------------+&lt;br /&gt;
&lt;br /&gt;
=== First Slave configuration ===&lt;br /&gt;
&lt;br /&gt;
On 9.9.9.9, set the MySQL system user as owner of the binary log that has just been copied to the slave.&lt;br /&gt;
 $ chown mysql:adm /var/log/mysql/*&lt;br /&gt;
&lt;br /&gt;
Configure MySQL on 9.9.9.9 to use 1.1.1.1 as Master Server. (Use the actual log File name and Position which you just obtained with the command SHOW MASTER STATUS  on 1.1.1.1. as explained above.)&lt;br /&gt;
 mysql&amp;gt; CHANGE MASTER TO MASTER_HOST='1.1.1.1', MASTER_USER='replication', MASTER_PASSWORD='secret', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=1111;&lt;br /&gt;
&lt;br /&gt;
Start the MySQL slave replication&lt;br /&gt;
 mysql&amp;gt; START SLAVE;&lt;br /&gt;
&lt;br /&gt;
And check the status&lt;br /&gt;
 mysql&amp;gt; SHOW SLAVE STATUS\G;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Slave_IO_Running&amp;quot; and &amp;quot;Slave_SQL_Running&amp;quot; should be set to &amp;quot;yes&amp;quot;. Furthermore &amp;quot;Read_Master_Log_Pos&amp;quot; should be counting and &amp;quot;Seconds_Behind_Master&amp;quot; should be approaching the 0 mark.&lt;br /&gt;
&lt;br /&gt;
=== Second Master configuration ===&lt;br /&gt;
&lt;br /&gt;
This means, the first Master/Slave Replication is working and the &amp;quot;reverse&amp;quot; replication needs to be prepared. Please now create the replication user on 9.9.9.9:&lt;br /&gt;
&lt;br /&gt;
  mysql&amp;gt; GRANT REPLICATION SLAVE ON *.* TO 'replication'@'1.1.1.1' IDENTIFIED BY 'secret';&lt;br /&gt;
&lt;br /&gt;
Verify that the MySQL daemon writes a binary log and remember the log Position:&lt;br /&gt;
 mysql&amp;gt; SHOW MASTER STATUS;&lt;br /&gt;
 +------------------+----------+--------------+------------------+&lt;br /&gt;
 | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |&lt;br /&gt;
 +------------------+----------+--------------+------------------+&lt;br /&gt;
 | mysql-bin.000009 |      9999|              |                  |&lt;br /&gt;
 +------------------+----------+--------------+------------------+&lt;br /&gt;
&lt;br /&gt;
=== Second Slave configuration ===&lt;br /&gt;
&lt;br /&gt;
1.1.1.1 is now the slave in this context and 9.9.9.9 is the master. Log in to 1.1.1.1&lt;br /&gt;
&lt;br /&gt;
Configure MySQL on 1.1.1.1 to use 9.9.9.9 as Master Server. Use the remembered log and file position from 1.1.1.1.&lt;br /&gt;
 mysql&amp;gt; CHANGE MASTER TO MASTER_HOST='9.9.9.9', MASTER_USER='replication', MASTER_PASSWORD='secret', MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=9999;&lt;br /&gt;
&lt;br /&gt;
start the MySQL slave replication&lt;br /&gt;
 mysql&amp;gt; START SLAVE;&lt;br /&gt;
&lt;br /&gt;
and check the status&lt;br /&gt;
 mysql&amp;gt; SHOW SLAVE STATUS\G;&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Slave_IO_Running&amp;quot; and &amp;quot;Slave_SQL_Running&amp;quot; should be set to &amp;quot;yes&amp;quot;. Furthermore  &amp;quot;Read_Master_Log_Pos&amp;quot; should be counting and &amp;quot;Seconds_Behind_Master&amp;quot; should be approaching the 0 mark.&lt;br /&gt;
&lt;br /&gt;
Also check the syslog if the replication has been sucessfully started&lt;br /&gt;
 $ tail -fn20 /var/log/syslog&lt;br /&gt;
 Jul 26 19:03:45 dbslave mysqld[4718]: 090726 19:03:45 [Note] Slave I/O thread: connected to master 'replication@1.1.1.17:3306',  replication started in log 'mysql-bin.000001' at position 10000&lt;br /&gt;
&lt;br /&gt;
=== Testing Master/Master ===&lt;br /&gt;
&lt;br /&gt;
On 1.1.1.1, create a new database in MySQL:&lt;br /&gt;
 mysql&amp;gt; CREATE DATABASE foo;&lt;br /&gt;
&lt;br /&gt;
Verify the database to als be available on 9.9.9.9 afterwards:&lt;br /&gt;
 mysql&amp;gt; SHOW DATABASES;&lt;br /&gt;
 +--------------------+&lt;br /&gt;
 | Database           |&lt;br /&gt;
 +--------------------+&lt;br /&gt;
 | information_schema |&lt;br /&gt;
 | foo                |&lt;br /&gt;
 | mysql              |&lt;br /&gt;
 +--------------------+&lt;br /&gt;
&lt;br /&gt;
Delete the new database on 9.9.9.9:&lt;br /&gt;
 mysql&amp;gt; DROP DATABASE foo;&lt;br /&gt;
&lt;br /&gt;
Check if the database has also been removed on 1.1.1.1&lt;br /&gt;
 mysql&amp;gt; SHOW DATABASES;&lt;br /&gt;
 +--------------------+&lt;br /&gt;
 | Database           |&lt;br /&gt;
 +--------------------+&lt;br /&gt;
 | information_schema |&lt;br /&gt;
 | mysql              |&lt;br /&gt;
 +--------------------+&lt;br /&gt;
&lt;br /&gt;
== Creating Open-Xchange user ==&lt;br /&gt;
&lt;br /&gt;
Now setup access for the Open-Xchange Server database user 'openexchange' to configdb and the oxdb for both groupware server addresses. These databases do not exist yet, but will be created during the Open-Xchange Server installation.&lt;br /&gt;
&lt;br /&gt;
Note: The IPs in this example belong to the two different Open-Xchange Servers, please adjust them accordingly.&lt;br /&gt;
 mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'openexchange'@'10.20.30.213' IDENTIFIED BY 'secret';&lt;br /&gt;
 mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'openexchange'@'10.20.30.215' IDENTIFIED BY 'secret';&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:GettingStarted_7.4.2&amp;diff=16402</id>
		<title>AppSuite:GettingStarted 7.4.2</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:GettingStarted_7.4.2&amp;diff=16402"/>
		<updated>2013-11-13T04:21:48Z</updated>

		<summary type="html">&lt;p&gt;Malasa: /* Writing */ typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Getting Started&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float:right; padding: 10px;&amp;quot;&amp;gt;[[File:OX_AppSuite_UI_Development_Workflow.png]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
Hello and welcome to OX App Suite development. This document will get you started to develop your first own app for OX App Suite with a minimal setup. We will look at the steps necessary but will also tempt you to learn more by linking you to some more in-depth documentation about these topics. Depending on how you wound up reading this page, you will probably have already completed some of the steps below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installing ==&lt;br /&gt;
&lt;br /&gt;
First, you need to install some tools which are necessary for UI development. For now, the simplest way is to download the source of the OX App Suite UI. Since the source code is kept in a [http://git-scm.com/ Git] repository, you will need &amp;lt;tt&amp;gt;git&amp;lt;/tt&amp;gt; to download it:&lt;br /&gt;
&lt;br /&gt;
 $ git clone --depth 1 -b release-7.4.1 https://code.open-xchange.com/git/wd/frontend/web&lt;br /&gt;
&lt;br /&gt;
This downloads the latest version and unpacks it into a subdirectory &amp;lt;tt&amp;gt;web&amp;lt;/tt&amp;gt; in the current directory.&lt;br /&gt;
&lt;br /&gt;
The option &amp;lt;tt&amp;gt;--depth 1&amp;lt;/tt&amp;gt; prevents the download of the entire history, and reduces the download size from hundreds of MB to less than 20MB. The option &amp;lt;tt&amp;gt;-b release-7.4.1&amp;lt;/tt&amp;gt; specifies a git branch. The full functionality described in this article is only available in the branch &amp;lt;tt&amp;gt;release-7.4.1&amp;lt;/tt&amp;gt; until 7.4.1 is released.&lt;br /&gt;
&lt;br /&gt;
The tools which you will need are contained in the directory &amp;lt;tt&amp;gt;ui/bin&amp;lt;/tt&amp;gt;. To simplify their use, you should add this directory to your &amp;lt;tt&amp;gt;$PATH&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ export PATH=&amp;quot;$PATH:$(pwd)/web/ui/bin&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Create Workspace ==&lt;br /&gt;
&lt;br /&gt;
Your entire work on an app can take place inside a working directory. The examples will assume you have created a directory named &amp;lt;tt&amp;gt;myapp&amp;lt;/tt&amp;gt; inside your home directory:&lt;br /&gt;
&lt;br /&gt;
 $ mkdir ~/myapp&lt;br /&gt;
 $ cd ~/myapp&lt;br /&gt;
&lt;br /&gt;
It doesn't need to be in your home directory, and the actual name should reflect the name of your app. The main point is that all commands will be executed in this directory and all relative paths will be relative to this directory from now on.&lt;br /&gt;
&lt;br /&gt;
The source code of your app will reside in the subfolder named &amp;lt;tt&amp;gt;apps&amp;lt;/tt&amp;gt;. To avoid name collisions, pick a unique subfolder inside that. The easiest and recommended way is to use a domain name that you own. Typically, the domain element are reversed, like in Java. &amp;lt;tt&amp;gt;example.com&amp;lt;/tt&amp;gt; becomes &amp;lt;tt&amp;gt;com.example&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 $ mkdir -p apps/com.example&lt;br /&gt;
&lt;br /&gt;
== Writing ==&lt;br /&gt;
&lt;br /&gt;
As an example, let's create the smallest possible app and test it. It requires only two files: &amp;lt;tt&amp;gt;apps/com.example/register.js&amp;lt;/tt&amp;gt; for the source code of the app:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;language-javascript&amp;quot;&amp;gt;&lt;br /&gt;
define('com.example/register', function () {&lt;br /&gt;
    'use strict';&lt;br /&gt;
    alert('Hello, World!');&lt;br /&gt;
});&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and &amp;lt;tt&amp;gt;apps/com.example/manifest.json&amp;lt;/tt&amp;gt; for the [[AppSuite:UI_manifests_explained | manifest]] which tells the UI that your app exists and what to do with it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre class=&amp;quot;language-javascript&amp;quot;&amp;gt;{ &amp;quot;namespace&amp;quot;: &amp;quot;core&amp;quot; }&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building ==&lt;br /&gt;
&lt;br /&gt;
The source code of your app can't be used by OX App Suite as it. It has to be first processed by the [[AppSuite:UI_build_system | build system]]. This step will check the source code for syntax errors, compress it, and depending on the structure of your code, many other things. The processed code is then written to a directory named &amp;lt;tt&amp;gt;build&amp;lt;/tt&amp;gt; by default. Start the build with this command:&lt;br /&gt;
&lt;br /&gt;
 $ build-appsuite app&lt;br /&gt;
&lt;br /&gt;
If your editor supports it, you can configure it to call the build system after every file save. Take care to call it from the top directory of your app's workspace, not from the directory of the saved file.&lt;br /&gt;
&lt;br /&gt;
== Testing ==&lt;br /&gt;
&lt;br /&gt;
The freshly built code can now be tested. Instead of uploading your code to an OX App Suite server, you can use the [[AppSuite:Appserver|appserver]] proxy to inject your code into the UI code of any existing OX App Suite installation. For example, start &amp;lt;tt&amp;gt;appserver&amp;lt;/tt&amp;gt; using [http://ox.io/ ox.io] as server:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;$ appserver --server=https://www.ox.io/appsuite/ build&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This command will serve your app from the local directory &amp;lt;tt&amp;gt;build&amp;lt;/tt&amp;gt;, and get everything else from the URL specified by the &amp;lt;tt&amp;gt;--server&amp;lt;/tt&amp;gt; parameter. To serve multiple apps, you can specify multiple local directories separated by spaces.&lt;br /&gt;
&lt;br /&gt;
You should start &amp;lt;tt&amp;gt;appserver&amp;lt;/tt&amp;gt; in a separate terminal, since it needs to run in the background. To stop &amp;lt;tt&amp;gt;appserver&amp;lt;/tt&amp;gt;, press &amp;lt;tt&amp;gt;Ctrl+C&amp;lt;/tt&amp;gt; in its terminal.&lt;br /&gt;
&lt;br /&gt;
Once appserver is running, you can access OX App Suite opening your browser with this address:&lt;br /&gt;
&lt;br /&gt;
 http://localhost:8337/appsuite&lt;br /&gt;
&lt;br /&gt;
After logging in, the app should be loaded and display the &amp;lt;tt&amp;gt;alert&amp;lt;/tt&amp;gt; message.&lt;br /&gt;
&lt;br /&gt;
If you later add images or other files, which are not JavaScript, CSS or LessCSS, then you need to [[AppSuite:Appserver#Use_with_Apache | use a web server]] to serve them.&lt;br /&gt;
&lt;br /&gt;
=== Development cycle ===&lt;br /&gt;
&lt;br /&gt;
Once you are sure that your setup works, you can extend the example and write the actual code of your app. Keep in mind that after [[#Writing | writing your code]], you will always need to [[#Building | build the app]] and have your [[#Hosting the app | Appserver]] running in the background, but don't need to restart it after every build.&lt;br /&gt;
&lt;br /&gt;
While developing always keep in mind, that there is an [[AppSuite:Debugging_the_UI | article about debugging the user interface]] which helps you avoiding and fixing typical errors.&lt;br /&gt;
&lt;br /&gt;
== Packaging ==&lt;br /&gt;
&lt;br /&gt;
When your app is done, you probably want to test it on a staging system, and later install it on a production system. To keep track of which installed files belong to which version of which app, you should use the native package manager of the Linux distribution of the target system. The packages can be easily created using the build system.&lt;br /&gt;
&lt;br /&gt;
=== Initialization ===&lt;br /&gt;
First, you need to create several files describing how to package you app. Use the &amp;lt;tt&amp;gt;init-packaging&amp;lt;/tt&amp;gt; task of the build system:&lt;br /&gt;
&lt;br /&gt;
 $ build-appsuite init-packaging&lt;br /&gt;
 Node version: v0.10.21&lt;br /&gt;
 Build path: build&lt;br /&gt;
 Build version: 0.0.1-1.20131025.133931&lt;br /&gt;
 Package name: example-app&lt;br /&gt;
 Version [0.0.1]: &lt;br /&gt;
 Maintainer (Name &amp;lt;e-mail&amp;gt;): Maintainer &amp;lt;maintainer@example.com&amp;gt;&lt;br /&gt;
 Copyright line [2013 Open-Xchange, Inc]: &lt;br /&gt;
 &lt;br /&gt;
 Known licenses for which you don't need to specify a file:&lt;br /&gt;
 APACHE-2, BSD-2-CLAUSE, BSD-3-CLAUSE, CC-BY-3, CC-BY-NC-3, CC-BY-NC-ND-3,&lt;br /&gt;
 CC-BY-NC-SA-3, CC-BY-ND-3, CC-BY-SA-3, CC0-1, EXPAT, GPL-2, GPL-3, LGPL-3&lt;br /&gt;
 &lt;br /&gt;
 License name [CC-BY-NC-SA-3.0]: BSD-3-Clause&lt;br /&gt;
 Short description: Example app&lt;br /&gt;
&lt;br /&gt;
The task presents a number of interactive prompts to get the necessary information about the generated packages. The default values are presented in square brackets ([...]) and can be selected by just pressing Enter. Otherwise, the entered values should follow the Debian Maintainer's Guide. Debian tools are especially picky about the syntax of the maintainer name and email address.&lt;br /&gt;
&lt;br /&gt;
If none of the known licenses suit you, you can enter any other license name. Then you will be asked to enter the file name of your license text. It should be a plain text file using the UTF-8 encoding.&lt;br /&gt;
&lt;br /&gt;
Some or even all prompts can be skipped by explicitly specifying the information as a build variable. The list of variable names is available in the reference of the &amp;lt;tt&amp;gt;[[AppSuite:UI_build_system#init-packaging|init-packaging]]&amp;lt;/tt&amp;gt; task.&lt;br /&gt;
&lt;br /&gt;
After answering all the questions, you can customize the generated files to account for any additional packaging requirements.&lt;br /&gt;
&lt;br /&gt;
=== Static Files ===&lt;br /&gt;
If your app includes images (e.g. themes do this most of the time), then you should check the generated packaging files for sections marked&lt;br /&gt;
&lt;br /&gt;
 ## Uncomment for multiple packages&lt;br /&gt;
 #...&lt;br /&gt;
&lt;br /&gt;
and remove the '#' at the start of each line in each block. This enables the creation of a second package, with a name ending in &amp;quot;&amp;lt;tt&amp;gt;-static&amp;lt;/tt&amp;gt;&amp;quot;. The images and any other files which are not JavaScript or CSS are served by the Apache web server, instead of the OX App Suite application server. These files are copied to a separate package for the case that the web server is on a dedicated system or maybe even has its own cluster. The default package is installed on the OX application server, and the second, &amp;quot;&amp;lt;tt&amp;gt;-static&amp;lt;/tt&amp;gt;&amp;quot; package is installed on the web server.&lt;br /&gt;
&lt;br /&gt;
=== Building Packages ===&lt;br /&gt;
Since the actual package format depends on the distribution it is built for, and there already exist tools to create packages from suitably arranged source code archives, the OX App Suite build system merely prepares such source archives. Using the &amp;lt;tt&amp;gt;dist&amp;lt;/tt&amp;gt; task to create the archives:&lt;br /&gt;
&lt;br /&gt;
 $ build-appsuite dist&lt;br /&gt;
 Node version: v0.10.21&lt;br /&gt;
 Build path: build&lt;br /&gt;
 Build version: 0.0.1-1.20131025.150034&lt;br /&gt;
 dpkg-source: info: using source format `3.0 (quilt)'&lt;br /&gt;
 dpkg-source: info: building example-app using existing ./example-app_0.0.1.orig.tar.bz2&lt;br /&gt;
 dpkg-source: info: building example-app in example-app_0.0.1-1.debian.tar.bz2&lt;br /&gt;
 dpkg-source: info: building example-app in example-app_0.0.1-1.dsc&lt;br /&gt;
 &lt;br /&gt;
 $ ls tmp/packaging/&lt;br /&gt;
 example-app-0.0.1                   example-app_0.0.1-1.dsc&lt;br /&gt;
 example-app.spec                    example-app_0.0.1.orig.tar.bz2&lt;br /&gt;
 example-app_0.0.1-1.debian.tar.bz2&lt;br /&gt;
&lt;br /&gt;
The task creates a temporary directory and four files. The archive with the extension &amp;lt;tt&amp;gt;.orig.tar.bz2&amp;lt;/tt&amp;gt; contains the source of your app. It is required to build both Debian and RPM packages. The files with extensions &amp;lt;tt&amp;gt;.debian.tar.bz2&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;.dsc&amp;lt;/tt&amp;gt; are used together with the &amp;lt;tt&amp;gt;.orig.tar.bz2&amp;lt;/tt&amp;gt; archive to build Debian packages. The file with the extension &amp;lt;tt&amp;gt;.spec&amp;lt;/tt&amp;gt; is used together with the &amp;lt;tt&amp;gt;.orig.tar.bz2&amp;lt;/tt&amp;gt; archive to build RPM packages.&lt;br /&gt;
&lt;br /&gt;
==== Building Debian Packages ====&lt;br /&gt;
The Debian package can be built directly in the temporary directory created by the &amp;lt;tt&amp;gt;dist&amp;lt;/tt&amp;gt; task:&lt;br /&gt;
&lt;br /&gt;
 $ cd tmp/packaging/example-app-0.0.1/&lt;br /&gt;
 $ dpkg-buildpackage -b&lt;br /&gt;
&lt;br /&gt;
The package will be placed in &amp;lt;tt&amp;gt;tmp/packaging/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
==== Building RPM Packages ====&lt;br /&gt;
The RPM package build tool &amp;lt;tt&amp;gt;rpmbuild&amp;lt;/tt&amp;gt; requires the files to be in a specific directory layout before building:&lt;br /&gt;
&lt;br /&gt;
 $ mkdir -p ~/rpmbuild/{SOURCES,SPECS,BUILD,RPMS}&lt;br /&gt;
 $ cp tmp/packaging/*.orig.tar.bz2 ~/rpmbuild/SOURCES/&lt;br /&gt;
 $ cp tmp/packaging/*.spec ~/rpmbuild/SPECS/&lt;br /&gt;
 $ rpmbuild --define &amp;quot;_topdir $HOME/rpmbuild&amp;quot; -bb ~/rpmbuild/SPECS/*.spec&lt;br /&gt;
&lt;br /&gt;
The package will be placed in &amp;lt;tt&amp;gt;~/rpmbuild/RPMS/noarch/&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The parameter &amp;lt;tt&amp;gt;--define &amp;quot;_topdir $HOME/rpmbuild&amp;quot;&amp;lt;/tt&amp;gt; can also be specified in the file &amp;lt;tt&amp;gt;~/.rpmmacros&amp;lt;/tt&amp;gt; or, on some distributions, is even unnecessary.&lt;br /&gt;
&lt;br /&gt;
== Further Reading ==&lt;br /&gt;
* You just build your first app for OX App Suite, keep in mind that there [[AppSuite:Developing for the UI#What_can_i_build.3F | quite a few options]] how you can develop for OX App Suite.&lt;br /&gt;
* It's highly recommended to gain more knowledge about all the benefits [[AppSuite:UI_build_system | the UI build system]] and  [[AppSuite:Appserver|the Appserver]] are providing you for developing OX App Suite.&lt;br /&gt;
* If you're stuck somewhere, the article about [[AppSuite:Debugging_the_UI | debugging the UI]] might help you.&lt;br /&gt;
* Get a better overview about [[AppSuite:Developing for the UI | developing the user inferface]].&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=Caldav_carddav_Bundles&amp;diff=15147</id>
		<title>Caldav carddav Bundles</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=Caldav_carddav_Bundles&amp;diff=15147"/>
		<updated>2013-07-30T02:49:01Z</updated>

		<summary type="html">&lt;p&gt;Malasa: /* Alternative 2: Apache useragent detection */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Installation and Configuration of the CalDAV- and CardDAV-bundles =&lt;br /&gt;
&lt;br /&gt;
The Open-Xchange server can be accessed via it's CalDAV- and CardDAV-interfaces to allow the synchronization of Calendar- and Contact-data with external applications like the Mac OS X iCal and Address Book clients. The synchronization protocols are available starting with Version 6.20.1 Rev5.&lt;br /&gt;
&lt;br /&gt;
CalDAV and CardDAV are standard protocols for the exchange of calendar data and address data respectively. The CalDAV interface publishes all the user's calendar folders via CalDAV so the user can subscribe to them in a client application. Similarly, the CardDAV interface publishes the user's contact folders. Depending on the used client, the user can either subscribe one or more folders, or access all available data in an aggregated way. &lt;br /&gt;
&lt;br /&gt;
== User Guide and Client Configuration ==&lt;br /&gt;
Please find further information regarding the client configuration at [[CalDAVClients]] and [[CardDAVClients]].&lt;br /&gt;
&lt;br /&gt;
== Webserver Configuration ==&lt;br /&gt;
In order to redirect DAV requests to the appropiate servlets, the webserver's configuration may need to be adjusted using one of the following alternatives.&lt;br /&gt;
&lt;br /&gt;
=== Alternative 1: Apache vhost (recommended) ===&lt;br /&gt;
Please edit your file /etc/apache2/ox6.conf so that ''' the existing OX configuration as well as the CalDAV/CardDav configuration are placed inside their own virtual hosts sections.'''.&lt;br /&gt;
&lt;br /&gt;
This is an &amp;lt;b&amp;gt;example&amp;lt;/b&amp;gt; where MYSERVER.TLD is the domain-name of the ox-server:&lt;br /&gt;
&lt;br /&gt;
   $ vi /etc/apache2/ox6.conf &lt;br /&gt;
&lt;br /&gt;
 NameVirtualHost *:80&lt;br /&gt;
 &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
        ServerName dav.MYSERVER.TLD&lt;br /&gt;
        ErrorLog /tmp/dav.err.log&lt;br /&gt;
        TransferLog /tmp/dav.access.log&lt;br /&gt;
        &amp;lt;Proxy /&amp;gt;&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                Allow from all&lt;br /&gt;
        &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
        # for ajp http service&lt;br /&gt;
        ProxyPass / ajp://localhost:8009/servlet/dav/ smax=0 ttl=60 retry=5&lt;br /&gt;
        # for grizzly http service&lt;br /&gt;
        #ProxyPass / http://localhost:8009/servlet/dav/ smax=0 ttl=60 retry=5&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
        ServerName MYSERVER.TLD&lt;br /&gt;
        ServerAdmin webmaster@localhost&lt;br /&gt;
        DocumentRoot /var/www/&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;Directory /var/www/&amp;gt;&lt;br /&gt;
                AllowOverride None&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                allow from all&lt;br /&gt;
                RedirectMatch ^/$ /ox6/&lt;br /&gt;
                Options +FollowSymLinks +SymLinksIfOwnerMatch&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
        # deflate&lt;br /&gt;
       AddOutputFilterByType DEFLATE text/html text/plain text/javascript application/javascript text/css text/xml application/xml text/x-js application/x-javascript&lt;br /&gt;
 &lt;br /&gt;
        # pre-compressed files&lt;br /&gt;
        AddType text/javascript .jsz&lt;br /&gt;
        AddType text/css .cssz&lt;br /&gt;
        AddType text/xml .xmlz&lt;br /&gt;
         AddType text/plain .po&lt;br /&gt;
 &lt;br /&gt;
        AddEncoding gzip .jsz .cssz .xmlz&lt;br /&gt;
        SetEnvIf Request_URI &amp;quot;\.(jsz|cssz|xmlz)$&amp;quot; no-gzip&lt;br /&gt;
 &lt;br /&gt;
        ExpiresActive On&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;Location /ox6&amp;gt;&lt;br /&gt;
                # Expires (via ExpiresByType to override global settings)&lt;br /&gt;
                ExpiresByType image/gif &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
                ExpiresByType image/png &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
                ExpiresByType image/jpg &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
                ExpiresByType image/jpeg &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
                ExpiresByType text/css &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
                ExpiresByType text/html &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
                ExpiresByType text/xml &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
                ExpiresByType text/javascript &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
                ExpiresByType text/x-js &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
                ExpiresByType application/x-javascript &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
                ExpiresDefault &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
                Header append Cache-Control &amp;quot;private&amp;quot;&lt;br /&gt;
                Header unset Last-Modified&lt;br /&gt;
                Header unset Vary&lt;br /&gt;
                # Strip version&lt;br /&gt;
                RewriteEngine On&lt;br /&gt;
                RewriteRule v=\w+/(.+) $1 [L]&lt;br /&gt;
                # Turn off ETag&lt;br /&gt;
                Header unset ETag&lt;br /&gt;
                FileETag None&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;Location /ox6/ox.html&amp;gt;&lt;br /&gt;
                ExpiresByType text/html &amp;quot;now&amp;quot;&lt;br /&gt;
                ExpiresDefault &amp;quot;now&amp;quot;&lt;br /&gt;
                Header unset Last-Modified&lt;br /&gt;
                Header set Cache-Control &amp;quot;no-store, no-cache, must-revalidate, post-check=0, pre-check=0&amp;quot;&lt;br /&gt;
                # Turn off ETag&lt;br /&gt;
                Header unset ETag&lt;br /&gt;
                FileETag None&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;Location /ox6/index.html&amp;gt;&lt;br /&gt;
                ExpiresByType text/html &amp;quot;now&amp;quot;&lt;br /&gt;
                ExpiresDefault &amp;quot;now&amp;quot;&lt;br /&gt;
                Header unset Last-Modified&lt;br /&gt;
                Header set Cache-Control &amp;quot;no-store, no-cache, must-revalidate, post-check=0, pre-check=0&amp;quot;&lt;br /&gt;
                # Turn off ETag&lt;br /&gt;
                Header unset ETag&lt;br /&gt;
                FileETag None&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you use this method, you have to make sure that dav.MYSERVER.TLD is reachable, your dns configuration need an entry for this name. Take care of the the dav.* logfiles, the example writes them without logrotation to /tmp.&lt;br /&gt;
&lt;br /&gt;
=== Alternative 2: Apache useragent detection ===&lt;br /&gt;
For environments where it is inconvenient to setup a vhost there is the possibility to redirect to relevant servlets another way: Via useragent detection. This is not recommended for the following reason: Per definition this is a whitelist-approach and any client sending a useragent-string not explicitly listed in the configuration will not be able to connect . Useragent-strings may also change between different versions of an application or may even be actively changed into something non-standard.&lt;br /&gt;
&lt;br /&gt;
   $ vi /etc/apache2/ox6.conf&lt;br /&gt;
&lt;br /&gt;
  RewriteEngine On&lt;br /&gt;
  RewriteCond %{HTTP_USER_AGENT}      Calendar           [OR]&lt;br /&gt;
  RewriteCond %{HTTP_USER_AGENT}      DataAccess         [OR]&lt;br /&gt;
  RewriteCond %{HTTP_USER_AGENT}      DAVKit             [OR]&lt;br /&gt;
  RewriteCond %{HTTP_USER_AGENT}      Lightning          [OR]&lt;br /&gt;
  RewriteCond %{HTTP_USER_AGENT}      Adresboek          [OR]&lt;br /&gt;
  RewriteCond %{HTTP_USER_AGENT}      dataaccessd        [OR]&lt;br /&gt;
  RewriteCond %{HTTP_USER_AGENT}      Preferences        [OR]&lt;br /&gt;
  RewriteCond %{HTTP_USER_AGENT}      Adressbuch         [OR]&lt;br /&gt;
  RewriteCond %{HTTP_USER_AGENT}      AddressBook        [OR]&lt;br /&gt;
  RewriteCond %{HTTP_USER_AGENT}      Address%20Book     [OR]&lt;br /&gt;
  RewriteCond %{HTTP_USER_AGENT}      CalendarStore      [OR]&lt;br /&gt;
  RewriteCond %{HTTP_USER_AGENT}      CoreDAV&lt;br /&gt;
  # select if you run ajp (proxy_ajp.conf) or grizzly (proxy_http.conf), here ajp is used:&lt;br /&gt;
  RewriteRule (.*)                  ajp://localhost:8009/servlet/dav$1     [P] # for ajp http service&lt;br /&gt;
  #RewriteRule (.*)                  http://localhost:8009/servlet/dav$1     [P] # for grizzly http service&lt;br /&gt;
&lt;br /&gt;
'''Note:''' The address book app on OSX 10.6 uses a localized user-agent string. If you're expecting clients with non-english language settings, you need to add the translated user-agent string to these rewrite rules. For example: &amp;quot;Adressbuch&amp;quot; for german OSX clients.&lt;br /&gt;
&lt;br /&gt;
== Autodiscovery ==&lt;br /&gt;
&lt;br /&gt;
By providing some DNS service name registrations for your domain and adding an additional rewrite-rule to the webserver's configuration, it's possible for some clients to automatically discover the account settings by just providing the user's e-mail address and password. The procedure is specified in [http://tools.ietf.org/html/rfc6764 RFC 6764]. &lt;br /&gt;
&lt;br /&gt;
The following example illustrates the DNS entries where MYSERVER.TLD would be the domain name of the ox-server, both for CalDAV and CardDAV via HTTP and HTTPS on the virtual host dav.MYSERVER.TLD:&lt;br /&gt;
&lt;br /&gt;
 _caldavs._tcp.MYSERVER.TLD.      10800 IN SRV      10 1 443 dav.MYSERVER.TLD.&lt;br /&gt;
 _caldav._tcp.MYSERVER.TLD.       10800 IN SRV      10 1  80 dav.MYSERVER.TLD.&lt;br /&gt;
 _carddavs._tcp.MYSERVER.TLD.     10800 IN SRV      10 1 443 dav.MYSERVER.TLD.&lt;br /&gt;
 _carddav._tcp.MYSERVER.TLD.      10800 IN SRV      10 1  80 dav.MYSERVER.TLD.&lt;br /&gt;
&lt;br /&gt;
Additionally, a rewrite-rule similar to the following example should be added to the webserver configuration of the virtual host to enable the bootstrapping process:&lt;br /&gt;
&lt;br /&gt;
 RewriteEngine On&lt;br /&gt;
 RewriteCond %{REQUEST_URI} ^/\.well-known/caldav   [OR]&lt;br /&gt;
 RewriteCond %{REQUEST_URI} ^/\.well-known/carddav&lt;br /&gt;
 RewriteRule (.*) / [L,R]&lt;br /&gt;
&lt;br /&gt;
== Which packages do I need? ==&lt;br /&gt;
To get CalDAV and CardDAV up and running you need the following packages:&lt;br /&gt;
&lt;br /&gt;
In v6.20 and earlier:&lt;br /&gt;
* open-xchange-webdav-directory - Assembles the *DAV interfaces into a common tree. This is needed for publishing certain properties so clients accept the OX is a WebDAV Server.&lt;br /&gt;
* open-xchange-webdav-acl - The WebDAV equivalent of the /ajax/user interface. Allows clients to discover the current and other users and their addressbooks and calendars.&lt;br /&gt;
* open-xchange-carddav - The CardDAV interface exposing the users addressbook via carddav&lt;br /&gt;
* open-xchange-caldav - The CalDAV inteface exposing the users calendars via caldav&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With v6.22 we have significantly reduced the number of packages necessary to install Open-Xchange Server.&lt;br /&gt;
In v6.22 and later only one package is needed:&lt;br /&gt;
* open-xchange-dav &lt;br /&gt;
&lt;br /&gt;
== Installation on OX App Suite ==&lt;br /&gt;
The download and installation information for Open-Xchange App Suite product family (Open-Xchange Server Edition and Hosting Edition) is available at: http://oxpedia.org/wiki/index.php?title=AppSuite:Caldav_carddav_Bundles&lt;br /&gt;
  &lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-caldav open-xchange-carddav open-xchange-webdav-acl open-xchange-webdav-directory |sopath=updates}}&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-dav|sopath=6.22/updates/backend|version=v6.22.x}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CalDAV Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following configuration options are available in the configuration files caldav.properties and caldav.yml:&lt;br /&gt;
&lt;br /&gt;
===com.openexchange.caldav.enabled===&lt;br /&gt;
The property '''com.openexchange.caldav.enabled''' governs whether a user has access to the CalDAV interface. This can be configured along the config cascade, in the default setting, everyone that has access to the infostore also has access to caldav. This is achieved in the following way:&lt;br /&gt;
&lt;br /&gt;
In v6.20 and earlier:&lt;br /&gt;
&lt;br /&gt;
/opt/open-xchange/etc/groupware/caldav.properties:&lt;br /&gt;
  com.openexchange.caldav.enabled=false&lt;br /&gt;
&lt;br /&gt;
/opt/open-xchange/etc/groupware/contextSets/caldav.yml&lt;br /&gt;
  premium:&lt;br /&gt;
      com.openexchange.caldav.enabled: true&lt;br /&gt;
      withTags: ucInfostore&lt;br /&gt;
&lt;br /&gt;
With v6.22 and up:&lt;br /&gt;
&lt;br /&gt;
/opt/open-xchange/etc/caldav.properties:&lt;br /&gt;
  com.openexchange.caldav.enabled=false&lt;br /&gt;
&lt;br /&gt;
/opt/open-xchange/etc/contextSets/caldav.yml&lt;br /&gt;
  premium:&lt;br /&gt;
      com.openexchange.caldav.enabled: true&lt;br /&gt;
      withTags: ucInfostore&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This means: In general CalDAV is turned off, but using the contextSets feature of the config cascade it is turned on for everyone that has infostore access.&lt;br /&gt;
&lt;br /&gt;
===com.openexchange.caldav.tree===&lt;br /&gt;
Configures the ID of the folder tree used by the CalDAV interface. Currently, this should be set to the default value of '0'.&lt;br /&gt;
&lt;br /&gt;
===com.openexchange.caldav.interval.start===&lt;br /&gt;
Defines the minimum end time of appointments to be synchronized via the CalDAV interface, relative to the current date. Possible values are &amp;quot;one_month&amp;quot; (default), &amp;quot;one_year&amp;quot; and &amp;quot;six_months&amp;quot;.  &lt;br /&gt;
&lt;br /&gt;
===com.openexchange.caldav.interval.end===&lt;br /&gt;
Defines the maximum start time of appointments to be synchronized via the CalDAV interface, relative to the current date. Possible values are &amp;quot;one_year&amp;quot; (default) and &amp;quot;two_years&amp;quot;.  &lt;br /&gt;
&lt;br /&gt;
===com.openexchange.caldav.url===&lt;br /&gt;
Tells users where to find a caldav folder. This can be displayed in frontends. You can use the variables [hostname] and [folderId]. If you chose to deploy caldav as a virtual host (say 'dav.open-xchange.com') use https://dav.open-xchange.com/caldav/[folderId] as the value. If you are using user-agent sniffing use https://[hostname]/caldav/[folderId].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== CardDAV Configuration ==&lt;br /&gt;
&lt;br /&gt;
The following configuration options are available in the configuration files carddav.properties and carddav.yml:&lt;br /&gt;
&lt;br /&gt;
===com.openexchange.carddav.enabled===&lt;br /&gt;
Similarly to CalDAV, the property '''com.openexchange.carddav.enabled''' governs whether CardDAV is available for a certain user. This is configured exactly like CalDAV with the config cascade only enabling this for users that have access to the infostore:&lt;br /&gt;
&lt;br /&gt;
/opt/open-xchange/etc/groupware/carddav.properties:&lt;br /&gt;
  com.openexchange.carddav.enabled=false&lt;br /&gt;
&lt;br /&gt;
/opt/open-xchange/etc/groupware/contextSets/carddav.yml&lt;br /&gt;
  premium:&lt;br /&gt;
      com.openexchange.carddav.enabled: true&lt;br /&gt;
      withTags: ucInfostore&lt;br /&gt;
&lt;br /&gt;
===com.openexchange.carddav.ignoreFolders===&lt;br /&gt;
A comma-separated list of folder IDs to exclude from the synchronization. Use this to disable syncing of very large folders (e.g. the global address list in large contexts, which always has ID 6). By default, no folders are excluded.&lt;br /&gt;
&lt;br /&gt;
===com.openexchange.carddav.tree===&lt;br /&gt;
Configures the ID of the folder tree used by the CardDAV interface. Currently, this should be set to the default value of '0'.&lt;br /&gt;
&lt;br /&gt;
===com.openexchange.carddav.exposedCollections===&lt;br /&gt;
Controls which collections are exposed via the CardDAV interface. Possible values are '0', '1' and '2'. A value of '1' makes each visible folder available as a resource collection, while '2' only exposes an aggregated collection containing  all contact resources from all visible folders. The default value '0' exposes either an aggregated collection or individual collections for each folder, depending on the client's user-agent that is matched against the pattern in 'userAgentForAggregatedCollection'. &lt;br /&gt;
&lt;br /&gt;
===com.openexchange.carddav.userAgentForAggregatedCollection===&lt;br /&gt;
Regular expression to match against the client's user-agent to decide whether the aggregated collection is exposed or not. The default pattern matches all known varieties of the Mac OS Addressbook client, that doesn't support multiple collections. Only used if 'exposedCollections' is set to '0'. The pattern is used case insensitive. &lt;br /&gt;
&lt;br /&gt;
===com.openexchange.carddav.reducedAggregatedCollection===&lt;br /&gt;
Specifies if all visible folders are used to create the aggregated collection, or if a reduced set of folders only containing the global addressbook and the personal contacts folders should be used. This setting only influences the aggregated collection that is used for clients that don't support multiple collections. Possible values are 'true' and 'false.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Connector_for_Business_Mobility_Installation_Guide&amp;diff=14866</id>
		<title>AppSuite:Connector for Business Mobility Installation Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Connector_for_Business_Mobility_Installation_Guide&amp;diff=14866"/>
		<updated>2013-06-28T09:01:06Z</updated>

		<summary type="html">&lt;p&gt;Malasa: appsuite, no groupware dir ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Open-Xchange Connector for Business Mobility =&lt;br /&gt;
&lt;br /&gt;
== Components ==&lt;br /&gt;
&lt;br /&gt;
With the Connector for Business Mobility, Open-Xchange also introduces the Universal Synchronization Module (USM). This module provides a framework for synchronization protocols such as Microsoft Exchange ActiveSync (EAS) or other services building on this foundation. USM acts as a layer between the Open-Xchange HTTP API and the synchronization protocol. It handles synchronization specific tasks like conflict management.&lt;br /&gt;
The synchronization stack (USM) and protocol implementation (EAS) are shipped as OSGi bundles and run as a plug-in of an Open-Xchange instance.&lt;br /&gt;
&lt;br /&gt;
=== Component Overview ===&lt;br /&gt;
USM, EAS and OX work together as components. This is a general outline about how these components interact.&lt;br /&gt;
&lt;br /&gt;
When the device initiates a synchronization through ActiveSync, it contacts the webserver using the URL /Microsoft-Server-ActiveSync via HTTP/s. This URL is forwarded to the Open-Xchange application server where the corresponding servlet is offered by the EAS component. The EAS component then uses USM to initiate a connection to the OX HTTP API and exchanges groupware data. In all cases, USM works as an client to the Open-Xchange HTTP API. It also uses some database tables which are accessed through the Open-Xchange SQL interface to store metadata like synchronization status. The same component stack is used to transport groupware data back to the device.&lt;br /&gt;
&lt;br /&gt;
=== Requirements ===&lt;br /&gt;
&lt;br /&gt;
Since the Connector for Business Mobility is a server plug-in based on the OSGi Framework it can be added to an existing Open-Xchange installation very easily. '''OX App Suite v7.0 or later is required to operate this extension.''' The Connector for Business Mobility uses the resources and services offered by the Open-Xchange server, no additional software or configuration is required.&lt;br /&gt;
&lt;br /&gt;
* [[AppSuite:Open-Xchange_Installation_Guide_for_Debian_6.0 | Debian 6.0 (Squeeze)]]&lt;br /&gt;
* [[AppSuite:Open-Xchange_Installation_Guide_for_SLES11 | SLES11]]&lt;br /&gt;
* [[AppSuite:Open-Xchange_Installation_Guide_for_RHEL6 | RHEL6]]&lt;br /&gt;
&lt;br /&gt;
'''Please Note:''' To get in favor of the latest minor features and bugfixes, you need to have a valid license.  The article [[AppSuite:UpdatingOXPackages | Updating OX-Packages]] explains how that can be done.&lt;br /&gt;
&lt;br /&gt;
== Installation on OX 6.x ==&lt;br /&gt;
The download and installation information for Open-Xchange 6 product family (Open-Xchange Server Edition and Hosting Edition) is available at: http://oxpedia.org/wiki/index.php?title=OXtender_for_Business_Mobility_Installation_Guide&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-meta-mobility|toplevel=products|sopath=appsuite/stable/mobilityconnector|ldbaccount=LDBACCOUNT:LDBPASSWD|reponame=oxmobility|version=App Suite}}&lt;br /&gt;
&lt;br /&gt;
Now the Open-Xchange service needs to be restarted:&lt;br /&gt;
&lt;br /&gt;
 /etc/init.d/open-xchange restart&lt;br /&gt;
&lt;br /&gt;
On the first login after the restart, all required database tables will be created.&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Mail Push ===&lt;br /&gt;
&lt;br /&gt;
In order to get mail push, either install and configure the package open-xchange-push-malpoll, which is not recommended on large deployments or if you're using cyrus-imap, read the [[MailNotify Bundle‎‎]] instructions on how to set up real mail push with cyrus.&lt;br /&gt;
&lt;br /&gt;
=== Open-Xchange configuration ===&lt;br /&gt;
The configuration for USM and the EAS protocol can be found in these two configuration files:&lt;br /&gt;
 /opt/open-xchange/etc/usm.properties&lt;br /&gt;
 /opt/open-xchange/etc/eas.properties&lt;br /&gt;
&lt;br /&gt;
Make sure that the Open-Xchange Server URL is set properly in usm.properties. This needs to be the machine which provides the web interface. Usually, this is localhost, as the webserver and Open-Xchange run on the same machine.&lt;br /&gt;
 com.openexchange.usm.ox.url=http://localhost/ajax/&lt;br /&gt;
&lt;br /&gt;
in case webserver and Open-Xchange aren't running on the same machine:&lt;br /&gt;
 com.openexchange.usm.ox.url=http://$FQDN/ajax/&lt;br /&gt;
(Where $FQDN is the fully qualified domain name of your frontend system)&lt;br /&gt;
&lt;br /&gt;
On clustered setups, adjust the file&lt;br /&gt;
/opt/open-xchange/etc/groupware/noipcheck.cnf&lt;br /&gt;
to include the range of IP addresses of the servers on which USM is running.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Documentation about the configuration parameters can be found inside the configuration files. If you change any attribute at the configuration files, the Open-Xchange groupware service needs to be restarted.&lt;br /&gt;
&lt;br /&gt;
=== Apache Configuration ===&lt;br /&gt;
Mobile devices supporting ActiveSync use a special URL to communicate with an ActiveSync enabled Open-Xchange Server. This URL needs to be forwarded to the Open-Xchange ActiveSync servlet. When using Apache 2 and mod_proxy_ajp, this servlet can simply be added to the webservers proxy_ajp configuration:&lt;br /&gt;
 ProxyPass /Microsoft-Server-ActiveSync ajp://127.0.0.1:8009/Microsoft-Server-ActiveSync smax=0 ttl=60 retry=5&lt;br /&gt;
&lt;br /&gt;
The example assumes that Open-Xchange Server is running on the same machine like the webserver. Please refer the Open-Xchange administration documentation for more information about Apache configuration. Please restart apache after performing the configuration change.&lt;br /&gt;
 /etc/init.d/apache2 restart&lt;br /&gt;
&lt;br /&gt;
=== Enabling ActiveSync for user accounts ===&lt;br /&gt;
In order to use synchronization through ActiveSync, this feature needs to be activated for user accounts. You can either activate it for specific users or a whole context.&lt;br /&gt;
&lt;br /&gt;
Activating ActiveSync for specific users:&lt;br /&gt;
 /opt/open-xchange/sbin/changeuser -c 1 -A oxadmin -P admin_password -u testuser --access-usm on --access-active-sync on&lt;br /&gt;
&lt;br /&gt;
Activating ActiveSync for a whole context:&lt;br /&gt;
 /opt/open-xchange/sbin/changecontext -c 1 -A oxadminmaster -P admin_master_password --access-usm on --access-active-sync on&lt;br /&gt;
&lt;br /&gt;
== Log files and issue tracking ==&lt;br /&gt;
When facing problems with synchronization, there are several ways to get more information than provided via device or platform specific error codes.&lt;br /&gt;
&lt;br /&gt;
=== Open-Xchange Server logfile ===&lt;br /&gt;
By default, the log output is non verbose. Only severe errors will be logged. To enable a more detailed log output, the logging mechanism needs to be configured. This depends on the used mechanism.&lt;br /&gt;
&lt;br /&gt;
=== Commons Logging ===&lt;br /&gt;
This is the default logging mechanism. If the Open-Xchange Server log output is written to ''var/log/open-xchange/open-xchange.log'' it's an indicator that this mechanism is in use. To make the log output more verbose, add the following parameter:&lt;br /&gt;
&lt;br /&gt;
 vim /opt/open-xchange/etc/groupware/file-logging.properties&lt;br /&gt;
 [...]&lt;br /&gt;
 com.openexchange.usm.level=FINE&lt;br /&gt;
&lt;br /&gt;
This will enable a software debug log for all components using USM, including EAS after restarting Open-Xchange Server.&lt;br /&gt;
&lt;br /&gt;
=== Log4j ===&lt;br /&gt;
If the package ''open-xchange-log4j'' is installed, Open-Xchange Server will log via a UDP network socket. In most cases a syslog daemon is listening to this socket and will write the log data to a platform specif file like ''/var/log/syslog''. To make the log output more verbose, add the following parameter:&lt;br /&gt;
&lt;br /&gt;
 vim /opt/open-xchange/etc/groupware/log4j.xml&lt;br /&gt;
 [...]&lt;br /&gt;
    &amp;lt;category name=&amp;quot;com.openexchange.usm&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;level value=&amp;quot;DEBUG&amp;quot;/&amp;gt;&lt;br /&gt;
        &amp;lt;appender-ref ref=&amp;quot;SERVER_LOG&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/category&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please note that the XML syntax must be correct. This will enable a software debug log for all components using USM, including EAS after restarting Open-Xchange Server.&lt;br /&gt;
&lt;br /&gt;
=== EAS debug logfile ===&lt;br /&gt;
While the generic Open-Xchange Server log file will keep track on errors reported by the software components, the EAS debug log file will print all data transfered to the device as XML. Please note: this log file may contain confidential data about the users personal groupware objects. Make sure that no unauthorized access to those log files is possible in order to maintain privacy. Change the configuration file accordingly and set a output path which can only accessed by authorized persons.&lt;br /&gt;
&lt;br /&gt;
 vim /opt/open-xchange/etc/groupware/eas.properties&lt;br /&gt;
 [...]&lt;br /&gt;
 com.openexchange.usm.eas.debug_log=/tmp/EAS-debug.log&lt;br /&gt;
&lt;br /&gt;
This will enable a XML based debug log for all EAS connections, after restarting Open-Xchange Server.&lt;br /&gt;
&lt;br /&gt;
=== Network traffic ===&lt;br /&gt;
When using unencrypted connections between the device and USM and USM and Open-Xchange Server (not recommended), it's possible to analyze the network traffic with tools like ngrep or wireshark. When using encrypted data connections using SSL, the transfered data can be decrypted using the corresponding private key. Please note that there are two network streams, one from the device to USM (external) and one from USM to OX (internal).&lt;br /&gt;
&lt;br /&gt;
== Bug-Reporting == &lt;br /&gt;
Please report bugs via the Open-Xchange Bugzilla:&lt;br /&gt;
&lt;br /&gt;
[https://bugs.open-xchange.com/ Direct link to Open-Xchange Bugzilla]&lt;br /&gt;
&lt;br /&gt;
* Product: Connector for Business Mobility&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Client configuration =&lt;br /&gt;
* [[OXtender_for_Business_Mobility_WinPhone7 | Windows Phone 7]]&lt;br /&gt;
* [[OXtender_for_Business_Mobility_WinMob | Windows Mobile]]&lt;br /&gt;
* [[OXtender_for_Business_Mobility_iPhone | iPhone]]&lt;br /&gt;
* [[OXtender_for_Business_Mobility_BlackBerry | BlackBerry]]&lt;br /&gt;
* [[OXtender_for_Business_Mobility_Nokia | Nokia S60]]&lt;br /&gt;
* [[OXtender_for_Business_Mobility_Android | Android ]]&lt;br /&gt;
&lt;br /&gt;
[[Category: OX7]]&lt;br /&gt;
[[Category: AppSuite]]&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Parallel_UISupport_OX6_AppSuite_RHEL_6_CentOS_6&amp;diff=14656</id>
		<title>AppSuite:Parallel UISupport OX6 AppSuite RHEL 6 CentOS 6</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Parallel_UISupport_OX6_AppSuite_RHEL_6_CentOS_6&amp;diff=14656"/>
		<updated>2013-05-23T08:40:02Z</updated>

		<summary type="html">&lt;p&gt;Malasa: /* Configure services */ changed logfile path&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Add OX6 UI to an OX App Suite Installation =&lt;br /&gt;
This document outlines the steps required to add an OX6 UI to an OX App Suite installation.&lt;br /&gt;
&lt;br /&gt;
= Supported OX Versions =&lt;br /&gt;
Running parallel UIs (OX6 and OX App Suite) is supported beginning with OX6 version 6.22.2 (backend version 7.0.2) and OX App Suite version 7.0.1.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
* An OX App Suite installation v7.0.2 or later. This update guide is valid for a system installed through our [[AppSuite:Open-Xchange_Installation_Guide_for_RHEL6|OX App Suite Download and Installation Guide for RedHat Enterprise Linux 6]]. It applies also to installations on 100% compatible RHEL clones such as CentOS.&lt;br /&gt;
* If you have custom plugins written by yourself which depends on an specific Open-Xchange Server, Open-Xchange can't guarantee that the plugins will work with the parallel setup.&lt;br /&gt;
* As for every modification of the installation we strongly recommend that you make a backup of your system(s) before you proceed.&lt;br /&gt;
&lt;br /&gt;
= Add Open-Xchange Repository =&lt;br /&gt;
We start by adding some OX6 frontend repos to our yum repos. Note: the &amp;lt;code&amp;gt;.../RHEL6&amp;lt;/code&amp;gt; repo also is valid for CentOS 6.&lt;br /&gt;
&lt;br /&gt;
 # /etc/yum.repos.d/ox.repo&lt;br /&gt;
 [ox-frontend]&lt;br /&gt;
 name=Open-Xchange-frontend&lt;br /&gt;
 baseurl=http://software.open-xchange.com/OX6/6.22/frontend/RHEL6/&lt;br /&gt;
 gpgkey=http://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
&lt;br /&gt;
= Updating repositories and install packages =&lt;br /&gt;
&lt;br /&gt;
Install the OX6 frontend packages.&lt;br /&gt;
&lt;br /&gt;
 $ yum install open-xchange-gui&lt;br /&gt;
&lt;br /&gt;
This will install the OX6 fronted packages. (OX App Suite frontend package names start with &amp;lt;code&amp;gt;open-xchange-appsuite&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
= Configure services =&lt;br /&gt;
&lt;br /&gt;
Since we are only adding a frontend, there is nothing to change in the configuration of the backend servers, the database, mail, or such. It is only required to adjust the apache web server configuration in the file &amp;lt;code&amp;gt;/etc/httpd/conf.d/ox.conf&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Basically we need to merge the  [[AppSuite:Open-Xchange_Installation_Guide_for_RHEL6#Configure_services|OX App Suite]] and [[Open-Xchange_Installation_Guide_for_RHEL6_622#Configure_services|OX6]] versions of this file. A sample is given in the following.&lt;br /&gt;
&lt;br /&gt;
 # /etc/httpd/conf.d/ox.conf&lt;br /&gt;
 &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
 	ServerAdmin webmaster@localhost&lt;br /&gt;
 &lt;br /&gt;
 	DocumentRoot /var/www/html&lt;br /&gt;
 &lt;br /&gt;
         &amp;lt;Directory /var/www/html&amp;gt;&lt;br /&gt;
                 Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
                 AllowOverride None&lt;br /&gt;
                 Order allow,deny&lt;br /&gt;
                 allow from all&lt;br /&gt;
                 RedirectMatch ^/$ /appsuite/&lt;br /&gt;
         &amp;lt;/Directory&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
         &amp;lt;Directory /var/www/html/appsuite&amp;gt;&lt;br /&gt;
                 Options None +SymLinksIfOwnerMatch&lt;br /&gt;
                 AllowOverride Indexes FileInfo&lt;br /&gt;
         &amp;lt;/Directory&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
         ErrorLog /var/log/httpd/error.log&lt;br /&gt;
 &lt;br /&gt;
         # Possible values include: debug, info, notice, warn, error, crit,&lt;br /&gt;
         # alert, emerg.&lt;br /&gt;
         LogLevel warn&lt;br /&gt;
 &lt;br /&gt;
         CustomLog /var/log/httpd/access.log combined&lt;br /&gt;
 &lt;br /&gt;
         # deflate&lt;br /&gt;
         AddOutputFilterByType DEFLATE text/html text/plain text/javascript application/javascript text/css text/xml application/xml text/x-js application/x-javascript&lt;br /&gt;
 &lt;br /&gt;
 	# pre-compressed files&lt;br /&gt;
 	AddType text/javascript .jsz&lt;br /&gt;
 	AddType text/css .cssz&lt;br /&gt;
 	AddType text/xml .xmlz&lt;br /&gt;
         AddType text/plain .po&lt;br /&gt;
 	&lt;br /&gt;
 	AddEncoding gzip .jsz .cssz .xmlz&lt;br /&gt;
 	SetEnvIf Request_URI &amp;quot;\.(jsz|cssz|xmlz)$&amp;quot; no-gzip&lt;br /&gt;
 	&lt;br /&gt;
 	ExpiresActive On&lt;br /&gt;
 	&lt;br /&gt;
 	&amp;lt;Location /ox6&amp;gt;&lt;br /&gt;
 	        # Expires (via ExpiresByType to override global settings)&lt;br /&gt;
 	        ExpiresByType image/gif &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType image/png &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType image/jpg &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType image/jpeg &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/css &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/html &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/xml &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/javascript &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/x-js &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType application/x-javascript &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresDefault &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        Header append Cache-Control &amp;quot;private&amp;quot;&lt;br /&gt;
 	        Header unset Last-Modified&lt;br /&gt;
 	        Header unset Vary&lt;br /&gt;
 	        # Strip version&lt;br /&gt;
 	        RewriteEngine On&lt;br /&gt;
 	        RewriteRule v=\w+/(.+) $1 [L]&lt;br /&gt;
 	        # Turn off ETag&lt;br /&gt;
 	        Header unset ETag&lt;br /&gt;
 	        FileETag None&lt;br /&gt;
 	&amp;lt;/Location&amp;gt;&lt;br /&gt;
 	&lt;br /&gt;
 	&amp;lt;Location /ox6/ox.html&amp;gt;&lt;br /&gt;
 	        ExpiresByType text/html &amp;quot;now&amp;quot;&lt;br /&gt;
 	        ExpiresDefault &amp;quot;now&amp;quot;&lt;br /&gt;
 	        Header unset Last-Modified&lt;br /&gt;
 	        Header set Cache-Control &amp;quot;no-store, no-cache, must-revalidate, post-check=0, pre-check=0&amp;quot;&lt;br /&gt;
 	        # Turn off ETag&lt;br /&gt;
 	        Header unset ETag&lt;br /&gt;
 	        FileETag None&lt;br /&gt;
 	&amp;lt;/Location&amp;gt;&lt;br /&gt;
 	&lt;br /&gt;
 	&amp;lt;Location /ox6/index.html&amp;gt;&lt;br /&gt;
 	        ExpiresByType text/html &amp;quot;now&amp;quot;&lt;br /&gt;
 	        ExpiresDefault &amp;quot;now&amp;quot;&lt;br /&gt;
 	        Header unset Last-Modified&lt;br /&gt;
 	        Header set Cache-Control &amp;quot;no-store, no-cache, must-revalidate, post-check=0, pre-check=0&amp;quot;&lt;br /&gt;
 	        # Turn off ETag&lt;br /&gt;
 	        Header unset ETag&lt;br /&gt;
 	        FileETag None&lt;br /&gt;
 	&amp;lt;/Location&amp;gt;&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Restart the web server:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/httpd restart&lt;br /&gt;
&lt;br /&gt;
That's it. It should now be able to access the OX6 frontend using the location &amp;lt;code&amp;gt;/ox6/&amp;lt;/code&amp;gt; in the request.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Grizzly&amp;diff=13897</id>
		<title>AppSuite:Grizzly</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Grizzly&amp;diff=13897"/>
		<updated>2013-04-17T14:44:56Z</updated>

		<summary type="html">&lt;p&gt;Malasa: /* Apache configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Grizzly based backend=&lt;br /&gt;
Up to OX App Suite we were limited to AJP based communication between the HTTP server and the OX backend server. Starting with the release 7.0.1 of OX App Suite, we offer a second HTTP based connector for the communication between the HTTP server and the backend. This new connector is based on Oracle's '''[http://grizzly.java.net Project Grizzly]''' - a [http://en.wikipedia.org/wiki/New_I/O NIO] and Web framework.&lt;br /&gt;
&lt;br /&gt;
=Packages=&lt;br /&gt;
Next, we'll show some information on the packages needed to install a Grizzly based backend, give you some in depth information about the package dependencies of '''open-xchange''' on '''open-xchange-ajp''' and '''open-xchange-grizzly''' and cover possible conflicts between those packages. &lt;br /&gt;
&lt;br /&gt;
==HttpService as packaging dependency==&lt;br /&gt;
[[File:HttpServiceDependency.png|thumb|left|alt=The HttpService dependency.]]&lt;br /&gt;
The open-xchange package depends on a virtual package called '''open-xchange-httpservice'''. This service is provided by both, the old '''open-xchange-ajp''' and the new '''open-xchange-grizzly''' packages. Only one of these two packages can be installed at a time because they block each other.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-grizzly| toplevel=products | sopath=appsuite/stable/backend|version=App Suite}}&lt;br /&gt;
&lt;br /&gt;
=Cluster setup=&lt;br /&gt;
[[File:GrizzlOXClusterSetup.png|left|alt=The default cluster setup.]]&lt;br /&gt;
This picture shows our default cluster setup. It consists of a proxying balancer (in our case Apache) and a cluster of multiple OX App Suite backends. The balancer receives HTTP and/or HTTPS requests. It then decides which requests should be handled by itself and which should be forwarded, so they can be handled by one of the OX App Suite backends. That's where the AJP or HTTP connector is used. &lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
As requests pass the balancer first, we'll start with a look at how to configure the balancer before configuring the Grizzly-based OX App Suite backends.&lt;br /&gt;
&lt;br /&gt;
===Apache configuration===&lt;br /&gt;
{{Template:ApacheOXModsDebian|connector=http}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you used AJP before, you have to delete /etc/apache2/conf.d/proxy_ajp.conf.&lt;br /&gt;
&lt;br /&gt;
{{Template:ApacheAppSuiteConf/sandbox|connector=http|connectorConf=/etc/apache2/conf.d/proxy_http.conf|apacheconf=/etc/apache2/sites-enabled/000-default|docroot=/var/www/|loadmodule=|easProxyName=eas_oxcluster}}&lt;br /&gt;
&lt;br /&gt;
====X-FORWARDED-PROTO Header====&lt;br /&gt;
&lt;br /&gt;
[[Appsuite:Grizzly#Cluster_setup]] shows that HTTPS communication is terminated by the Apache balancer in front of the OX backends. To let the backends know about the protocol that is used to communicate with the Apache server we have to set a special header in the ssl virtual hosts configurations in Apache to forward this information. The de facto standard for this is the X-Forwarded-Proto header.&lt;br /&gt;
&lt;br /&gt;
To add it to your Apache configuration you have to open the default ssl vhost configuration via:&lt;br /&gt;
&lt;br /&gt;
  $ vim /etc/apache2/sites-enabled/default-ssl&lt;br /&gt;
&lt;br /&gt;
and add &lt;br /&gt;
&lt;br /&gt;
  RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
&lt;br /&gt;
to each of the virtual hosts used to communicate with the OX App Suite backends.&lt;br /&gt;
&lt;br /&gt;
===Grizzly configuration===&lt;br /&gt;
&lt;br /&gt;
====Available configuration files====&lt;br /&gt;
&lt;br /&gt;
====/opt/open-xchange/etc/server.conf====&lt;br /&gt;
This extract of the server.properties shows the properties that can be applied to the grizzly and ajp backend.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
# DEFAULT ENCODING FOR INCOMING HTTP REQUESTS&lt;br /&gt;
# This value MUST be equal to web server's default encoding&lt;br /&gt;
DefaultEncoding=UTF-8&lt;br /&gt;
...&lt;br /&gt;
# The host for the connector's (ajp, http) network listener. Set to &amp;quot;*&amp;quot; if you&lt;br /&gt;
# want to listen on all available interfaces.&lt;br /&gt;
#Default value: 127.0.0.1, bind to localhost only.&lt;br /&gt;
com.openexchange.connector.networkListenerHost=*&lt;br /&gt;
&lt;br /&gt;
# The default port for the connector's (ajp, http) network listener.&lt;br /&gt;
# Default value: 8009.&lt;br /&gt;
com.openexchange.connector.networkListenerPort=8009&lt;br /&gt;
&lt;br /&gt;
# Specify the max. number of allowed request parameters for the connector (ajp, http)&lt;br /&gt;
# Default value: 30&lt;br /&gt;
com.openexchange.connector.maxRequestParameters: 30&lt;br /&gt;
&lt;br /&gt;
# To enable proper load balancing and request routing from {client1, client2 ..&lt;br /&gt;
# .} --&amp;gt; balancer --&amp;gt; {backend1, backend2 ...} we have to append a backend route&lt;br /&gt;
# to the JSESSIONID cookies separated by a '.'. It's important that this backend&lt;br /&gt;
# route is unique for every single backend behind the load balancer.&lt;br /&gt;
# The string has to be a sequence of characters excluding semi-colon, comma and&lt;br /&gt;
# white space so the JSESSIONID cookie stays in accordance with the cookie&lt;br /&gt;
# specification after we append the backendroute to it.&lt;br /&gt;
# Default value: OX0 &lt;br /&gt;
com.openexchange.server.backendRoute=OX1&lt;br /&gt;
&lt;br /&gt;
# Decides if we should consider X-Forward-Headers that reach the backend.&lt;br /&gt;
# Those can be spoofed by clients so we have to make sure to consider the headers only if the proxy/proxies reliably override those&lt;br /&gt;
# headers for incoming requests.&lt;br /&gt;
# Default value: false&lt;br /&gt;
com.openexchange.server.considerXForwards = false&lt;br /&gt;
&lt;br /&gt;
# The name of the protocolHeader used to identify the originating IP address of&lt;br /&gt;
# a client connecting to a web server through an HTTP proxy or load balancer.&lt;br /&gt;
# This is needed for grizzly based setups that make use of http proxying.&lt;br /&gt;
# If the header isn't found the first proxy in front of grizzly will be used&lt;br /&gt;
# as originating IP/remote address.&lt;br /&gt;
# Default value: X-Forwarded-For&lt;br /&gt;
com.openexchange.server.forHeader=X-Forwarded-For&lt;br /&gt;
&lt;br /&gt;
# A list of know proxies in front of our httpserver/balancer as comma separated IPs e.g: 192.168.1.50, 192.168.1.51&lt;br /&gt;
com.openexchange.server.knownProxies = &lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====/opt/open-xchange/etc/grizzly.conf====&lt;br /&gt;
Next we'll look at the parts of the grizzly.properties that configure only the grizzly backend but not the ajp backend.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Grizzly.properties&lt;br /&gt;
#&lt;br /&gt;
# This file configures the grizzly server contained in the package&lt;br /&gt;
# open-xchange-grizzly. In your OX setup grizzly is located behind the&lt;br /&gt;
# load-balancer and accepts incoming client requests. Communication with the&lt;br /&gt;
# load balancer is done via http, e.g via Apache's mod_proxy_http.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Push technology&lt;br /&gt;
################################################################################&lt;br /&gt;
&lt;br /&gt;
# Comet is an umbrella term used to describe a technique allowing web browser to&lt;br /&gt;
# receive almost real time updates from the server. The two most common&lt;br /&gt;
# approaches are long polling and streaming. Long polling differs from streaming&lt;br /&gt;
# in that each update from the server ultimately results in another follow up&lt;br /&gt;
# request from the client.&lt;br /&gt;
# Default value: true&lt;br /&gt;
com.openexchange.http.grizzly.hasCometEnabled=true&lt;br /&gt;
&lt;br /&gt;
# Bi-directional, full-duplex communications channels over a single TCP&lt;br /&gt;
# connection.&lt;br /&gt;
# Default value: false&lt;br /&gt;
com.openexchange.http.grizzly.hasWebSocketsEnabled=true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### JMX&lt;br /&gt;
################################################################################&lt;br /&gt;
&lt;br /&gt;
# Do you want to enable grizzly monitoring via JMX? Default value: true.&lt;br /&gt;
com.openexchange.http.grizzly.hasJMXEnabled=true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Protocol&lt;br /&gt;
################################################################################&lt;br /&gt;
&lt;br /&gt;
# Grizzly is able to communicate via AJP besides its default prototcol HTTP.&lt;br /&gt;
# Do you want to use AJP instead of HTTP?&lt;br /&gt;
# Default value: false&lt;br /&gt;
com.openexchange.http.grizzly.hasAJPEnabled=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====/opt/open-xchange/etc/requestwatcher.conf====&lt;br /&gt;
And finally the properties to configure the requestwatchers of the http and ajp backends&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Requestwatcher.properties&lt;br /&gt;
#&lt;br /&gt;
# This file configures the requestwatchers contained in the packages&lt;br /&gt;
# open-xchange-grizzly and open-xchange-ajp. The requestwatcher keeps track of&lt;br /&gt;
# incoming requests and periodically checks the age of the currently processing&lt;br /&gt;
# requests. If a request exceeds the configured maximum age, infos about the&lt;br /&gt;
# request and its processing thread are logged either into the configured&lt;br /&gt;
# logfiles or syslog depending on your configuration. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Enable/disable the requestwatcher.&lt;br /&gt;
# Default value: true (enabled).&lt;br /&gt;
com.openexchange.requestwatcher.isEnabled: true&lt;br /&gt;
&lt;br /&gt;
# Define the requestwatcher's frequency in milliseconds.&lt;br /&gt;
# Default value: 30000.&lt;br /&gt;
com.openexchange.requestwatcher.frequency: 30000&lt;br /&gt;
&lt;br /&gt;
# Define the maximum allowed age of requests in milliseconds.&lt;br /&gt;
# Default value: 60000. &lt;br /&gt;
com.openexchange.requestwatcher.maxRequestAge: 60000&lt;br /&gt;
&lt;br /&gt;
# Permission to stop &amp;amp; re-init system (works only for the ajp connector)&lt;br /&gt;
com.openexchange.requestwatcher.restartPermission: false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Multiple Proxies in front of the cluster==&lt;br /&gt;
[[File:GrizzlOXClusterMultipleProxySetup.png|left|935px|alt=The default cluster with multiple proxies setup.]]&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===X-FORWARDED-FOR Header===&lt;br /&gt;
&lt;br /&gt;
Wikipedia[http://en.wikipedia.org/wiki/X-Forwarded-For] describes the X-Forwarded-For Header as: &lt;br /&gt;
&lt;br /&gt;
The '''X-Forwarded-For''' ('''XFF''') HTTP header field is a ''de facto'' standard for identifying the originating IP address of a client connecting to a web server through an HTTP proxy or load balancer. This is an HTTP request header which was introduced by the [[Squid (software)|Squid]] caching proxy server's developers. An effort has been started at IETF for standardizing the '''Forwarded''' HTTP header.&lt;br /&gt;
&lt;br /&gt;
In this context, the caching servers are most often those of large ISPs who either encourage or force their users to use proxy servers for access to the World Wide Web, something which is often done to reduce external bandwidth through caching. In some cases, these proxy servers are transparent proxies, and the user may be unaware that they are using them.&lt;br /&gt;
&lt;br /&gt;
Without the use of XFF or another similar technique, any connection through the proxy would reveal only the originating IP address of the proxy server, effectively turning the proxy server into an anonymizing service, thus making the detection and prevention of abusive accesses significantly harder than if the originating IP address was available. The usefulness of XFF depends on the proxy server truthfully reporting the original host's IP address; for this reason, effective use of XFF requires knowledge of which proxies are trustworthy, for instance by looking them up in a whitelist of servers whose maintainers can be trusted.&lt;br /&gt;
&lt;br /&gt;
====Format====&lt;br /&gt;
The general format of the field is:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;X-Forwarded-For: client, proxy1, proxy2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where the value is a comma+space separated list of IP addresses, the left-most being the original client, and each successive proxy that passed the request adding the IP address where it received the request from. In this example, the request passed through proxy1, proxy2, and then proxy3 (not shown in the header). proxy3 appears as remote address of the request.&lt;br /&gt;
&lt;br /&gt;
The given information should be used with care since it is easy to forge an X-Forwarded-For field. The last IP address is always the IP address that connects to the last proxy, which means it is the most reliable source of information. X-Forwarded-For data can be used in a forward or reverse proxy scenario.&lt;br /&gt;
&lt;br /&gt;
Just logging the X-Forwarded-For field is not always enough: The last proxy IP address in a chain is not contained within the X-Forwarded-For field, it is in the actual IP header. A web server should log BOTH the request's source IP address and the X-Forwarded-For field information for completeness.&lt;br /&gt;
&lt;br /&gt;
===Getting the remote IP===&lt;br /&gt;
If you want the backends in the GrizzlOX-Cluster to use '''Client''''s(95.223.182.44) instead of '''Balancer''''s IP as remote address for e.g reporting the LogProperty '''com.openexchange.grizzly.remoteAddress''' for faulty requests in the Open-Xchange logs, you have to change these parameters from their default values seen in /opt/open-xchange/etc/server.properties to:&lt;br /&gt;
&lt;br /&gt;
 # Decides if we should consider X-Forward-Headers that reach the backend.&lt;br /&gt;
 # Those can be spoofed by clients so we have to make sure to consider the headers only if the proxy/proxies reliably override those&lt;br /&gt;
 # headers for incoming requests.&lt;br /&gt;
 # Default value: false&lt;br /&gt;
 com.openexchange.server.considerXForwards = '''true'''&lt;br /&gt;
&lt;br /&gt;
 # The name of the protocolHeader used to identify the originating IP address of&lt;br /&gt;
 # a client connecting to a web server through an HTTP proxy or load balancer.&lt;br /&gt;
 # This is needed for grizzly based setups that make use of http proxying.&lt;br /&gt;
 # If the header isn't found the first proxy in front of grizzly will be used&lt;br /&gt;
 # as originating IP/remote address.&lt;br /&gt;
 # Default value: X-Forwarded-For&lt;br /&gt;
 com.openexchange.server.forHeader='''X-Forwarded-For'''&lt;br /&gt;
&lt;br /&gt;
 # A list of know proxies in front of our httpserver/balancer as comma separated IPs e.g: 192.168.1.50, 192.168.1.51&lt;br /&gt;
 com.openexchange.server.knownProxies = '''192.168.1.50, 192.168.1.51'''&lt;br /&gt;
&lt;br /&gt;
After you have changed the the configuration you have to restart the backend server via&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange restart&lt;br /&gt;
&lt;br /&gt;
The remote IP is detected in the following way: All configured known proxies are removed from the list of IPs listed in the X-FORWARDED-FOR header, beginning frome the right side of the list. The rightmost leftover IP is then seen as our new remote address as it represents the first IP not known to us.&lt;br /&gt;
&lt;br /&gt;
==Make Grizzly speak AJP instead of HTTP==&lt;br /&gt;
Grizzly normally acts as an HTTP server and demands that the balancing proxy in front of it communicates via HTTP. This behaviour can be changed to Grizzly accepting the Apache JServ Protocol by simply adjusting the Grizzly and Apache configurations and restarting both servers.&lt;br /&gt;
&lt;br /&gt;
===Grizzly.properties===&lt;br /&gt;
&lt;br /&gt;
Change this parameter from the value seen in [[#Grizzly configuration|Grizzly configuration]] to:&lt;br /&gt;
&lt;br /&gt;
 ### Protocol&lt;br /&gt;
 ################################################################################&lt;br /&gt;
 &lt;br /&gt;
 # Grizzly is able to communicate via AJP besides its default prototcol HTTP.&lt;br /&gt;
 # Do you want to use AJP instead of HTTP?&lt;br /&gt;
 # Default value: false&lt;br /&gt;
 com.openexchange.http.grizzly.hasAJPEnabled='''true'''&lt;br /&gt;
&lt;br /&gt;
===Apache configuration===&lt;br /&gt;
&lt;br /&gt;
Change the HTTP related parameters from the values seen in [[#Apache configuration|Apache configuration]] to AJP. This involves the IfModule directive and the BalancerMember declarations.&lt;br /&gt;
&lt;br /&gt;
To make Apach communicate via AJP instead of HTTP you have to replace the proxy_http with the proxy_ajp module.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;IfModule mod_proxy_'''ajp'''.c&amp;gt;&lt;br /&gt;
   ProxyRequests Off&lt;br /&gt;
   # When enabled, this option will pass the Host: line from the incoming request to the proxied host.&lt;br /&gt;
   ProxyPreserveHost On&lt;br /&gt;
 &amp;lt;Proxy balancer://oxcluster&amp;gt;&lt;br /&gt;
     Order deny,allow&lt;br /&gt;
     Allow from all&lt;br /&gt;
     # multiple server setups need to have the hostname inserted instead localhost&lt;br /&gt;
     BalancerMember '''ajp'''://localhost:8009 timeout=100 smax=0 ttl=60 retry=60 loadfactor=50 route=OX1&lt;br /&gt;
     # Enable and maybe add additional hosts running OX here&lt;br /&gt;
     # BalancerMember '''ajp'''://oxhost2:8009 timeout=100  smax=0 ttl=60 retry=60 loadfactor=50 route=OX2&lt;br /&gt;
     ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&lt;br /&gt;
 &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
 # Microsoft recommends a minimum timeout value of 15 minutes for eas connections&lt;br /&gt;
 &amp;lt;Proxy balancer://eas_oxcluster&amp;gt;&lt;br /&gt;
    Order deny,allow&lt;br /&gt;
    Allow from all&lt;br /&gt;
    # multiple server setups need to have the hostname inserted instead localhost&lt;br /&gt;
    BalancerMember '''ajp'''://localhost:8009 timeout=1800 smax=0 ttl=60 retry=60 loadfactor=50 route=OX1&lt;br /&gt;
    # Enable and maybe add additional hosts running OX here&lt;br /&gt;
    # BalancerMember '''ajp'''://oxhost2:8009 timeout=1800  smax=0 ttl=60 retry=60 loadfactor=50 route=OX2&lt;br /&gt;
    ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&lt;br /&gt;
 &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 $ a2dismod proxy_http &amp;amp;&amp;amp; a2enmod proxy_ajp&lt;br /&gt;
&lt;br /&gt;
===Restart the servers===&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange restart&lt;br /&gt;
 $ /etc/init.d/apache2 restart&lt;br /&gt;
&lt;br /&gt;
=Switching from open-xchange-grizzly to open-xchange-ajp=&lt;br /&gt;
It's possible to switch the '''open-xchange-grizzly''' based setup to a setup based on the alternative '''open-xchange-ajp''' if you don't depend on certian realtime features like websockets, comet based communication or the already mentioned WEBDAV MKCALENDAR command.&lt;br /&gt;
&lt;br /&gt;
==1. Install the ajp backend==&lt;br /&gt;
Install the '''open-xchange-ajp''' package via your package manager. This will inform you about a conflict between the currently installed '''open-xchange-grizzly''' and the package you want to install. To solve the conflict you either have to manually remove '''open-xchange-grizzly''' before installing '''open-xchange-ajp''' or let the package manager handle this conflict automatically for you.&lt;br /&gt;
&lt;br /&gt;
;Debian:&lt;br /&gt;
 $ aptitude install open-xchange-ajp&lt;br /&gt;
;Suse:&lt;br /&gt;
 $ zypper in open-xchange-ajp&lt;br /&gt;
;RedHat:&lt;br /&gt;
 $ yum install open-xchange-ajp&lt;br /&gt;
&lt;br /&gt;
==2. Adapt the module configuration of apache==&lt;br /&gt;
Adapt the installed apache modules to switch the proxy connector in use from http to ajp&lt;br /&gt;
&lt;br /&gt;
 $ a2dismod proxy_http &amp;amp;&amp;amp; a2enmod proxy_ajp&lt;br /&gt;
&lt;br /&gt;
==3. Adapt the apache configuration to use the new connector==&lt;br /&gt;
To make use of apaches new ajp connector for communication with '''open-xchange-ajp''' whe have to change it's configuration&lt;br /&gt;
&lt;br /&gt;
{{Template:ApacheAppSuiteConf/sandbox|connector=ajp|connectorConf=/etc/apache2/conf.d/proxy_ajp.conf|apacheconf=/etc/apache2/sites-enabled/000-default|docroot=/var/www/|loadmodule=}}&lt;br /&gt;
&lt;br /&gt;
==4.Restart services==&lt;br /&gt;
 $ /etc/init.d/apache2 restart&lt;br /&gt;
 $ /etc/init.d/open-xchange restart&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]]&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Grizzly&amp;diff=13896</id>
		<title>AppSuite:Grizzly</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Grizzly&amp;diff=13896"/>
		<updated>2013-04-17T14:44:09Z</updated>

		<summary type="html">&lt;p&gt;Malasa: /* Apache configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Grizzly based backend=&lt;br /&gt;
Up to OX App Suite we were limited to AJP based communication between the HTTP server and the OX backend server. Starting with the release 7.0.1 of OX App Suite, we offer a second HTTP based connector for the communication between the HTTP server and the backend. This new connector is based on Oracle's '''[http://grizzly.java.net Project Grizzly]''' - a [http://en.wikipedia.org/wiki/New_I/O NIO] and Web framework.&lt;br /&gt;
&lt;br /&gt;
=Packages=&lt;br /&gt;
Next, we'll show some information on the packages needed to install a Grizzly based backend, give you some in depth information about the package dependencies of '''open-xchange''' on '''open-xchange-ajp''' and '''open-xchange-grizzly''' and cover possible conflicts between those packages. &lt;br /&gt;
&lt;br /&gt;
==HttpService as packaging dependency==&lt;br /&gt;
[[File:HttpServiceDependency.png|thumb|left|alt=The HttpService dependency.]]&lt;br /&gt;
The open-xchange package depends on a virtual package called '''open-xchange-httpservice'''. This service is provided by both, the old '''open-xchange-ajp''' and the new '''open-xchange-grizzly''' packages. Only one of these two packages can be installed at a time because they block each other.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-grizzly| toplevel=products | sopath=appsuite/stable/backend|version=App Suite}}&lt;br /&gt;
&lt;br /&gt;
=Cluster setup=&lt;br /&gt;
[[File:GrizzlOXClusterSetup.png|left|alt=The default cluster setup.]]&lt;br /&gt;
This picture shows our default cluster setup. It consists of a proxying balancer (in our case Apache) and a cluster of multiple OX App Suite backends. The balancer receives HTTP and/or HTTPS requests. It then decides which requests should be handled by itself and which should be forwarded, so they can be handled by one of the OX App Suite backends. That's where the AJP or HTTP connector is used. &lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
As requests pass the balancer first, we'll start with a look at how to configure the balancer before configuring the Grizzly-based OX App Suite backends.&lt;br /&gt;
&lt;br /&gt;
===Apache configuration===&lt;br /&gt;
{{Template:ApacheOXModsDebian|connector=http}}&lt;br /&gt;
&lt;br /&gt;
{{Template:ApacheAppSuiteConf/sandbox|connector=http|connectorConf=/etc/apache2/conf.d/proxy_http.conf|apacheconf=/etc/apache2/sites-enabled/000-default|docroot=/var/www/|loadmodule=|easProxyName=eas_oxcluster}}&lt;br /&gt;
&lt;br /&gt;
====X-FORWARDED-PROTO Header====&lt;br /&gt;
&lt;br /&gt;
[[Appsuite:Grizzly#Cluster_setup]] shows that HTTPS communication is terminated by the Apache balancer in front of the OX backends. To let the backends know about the protocol that is used to communicate with the Apache server we have to set a special header in the ssl virtual hosts configurations in Apache to forward this information. The de facto standard for this is the X-Forwarded-Proto header.&lt;br /&gt;
&lt;br /&gt;
To add it to your Apache configuration you have to open the default ssl vhost configuration via:&lt;br /&gt;
&lt;br /&gt;
  $ vim /etc/apache2/sites-enabled/default-ssl&lt;br /&gt;
&lt;br /&gt;
and add &lt;br /&gt;
&lt;br /&gt;
  RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
&lt;br /&gt;
to each of the virtual hosts used to communicate with the OX App Suite backends.&lt;br /&gt;
&lt;br /&gt;
===Grizzly configuration===&lt;br /&gt;
&lt;br /&gt;
====Available configuration files====&lt;br /&gt;
&lt;br /&gt;
====/opt/open-xchange/etc/server.conf====&lt;br /&gt;
This extract of the server.properties shows the properties that can be applied to the grizzly and ajp backend.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
# DEFAULT ENCODING FOR INCOMING HTTP REQUESTS&lt;br /&gt;
# This value MUST be equal to web server's default encoding&lt;br /&gt;
DefaultEncoding=UTF-8&lt;br /&gt;
...&lt;br /&gt;
# The host for the connector's (ajp, http) network listener. Set to &amp;quot;*&amp;quot; if you&lt;br /&gt;
# want to listen on all available interfaces.&lt;br /&gt;
#Default value: 127.0.0.1, bind to localhost only.&lt;br /&gt;
com.openexchange.connector.networkListenerHost=*&lt;br /&gt;
&lt;br /&gt;
# The default port for the connector's (ajp, http) network listener.&lt;br /&gt;
# Default value: 8009.&lt;br /&gt;
com.openexchange.connector.networkListenerPort=8009&lt;br /&gt;
&lt;br /&gt;
# Specify the max. number of allowed request parameters for the connector (ajp, http)&lt;br /&gt;
# Default value: 30&lt;br /&gt;
com.openexchange.connector.maxRequestParameters: 30&lt;br /&gt;
&lt;br /&gt;
# To enable proper load balancing and request routing from {client1, client2 ..&lt;br /&gt;
# .} --&amp;gt; balancer --&amp;gt; {backend1, backend2 ...} we have to append a backend route&lt;br /&gt;
# to the JSESSIONID cookies separated by a '.'. It's important that this backend&lt;br /&gt;
# route is unique for every single backend behind the load balancer.&lt;br /&gt;
# The string has to be a sequence of characters excluding semi-colon, comma and&lt;br /&gt;
# white space so the JSESSIONID cookie stays in accordance with the cookie&lt;br /&gt;
# specification after we append the backendroute to it.&lt;br /&gt;
# Default value: OX0 &lt;br /&gt;
com.openexchange.server.backendRoute=OX1&lt;br /&gt;
&lt;br /&gt;
# Decides if we should consider X-Forward-Headers that reach the backend.&lt;br /&gt;
# Those can be spoofed by clients so we have to make sure to consider the headers only if the proxy/proxies reliably override those&lt;br /&gt;
# headers for incoming requests.&lt;br /&gt;
# Default value: false&lt;br /&gt;
com.openexchange.server.considerXForwards = false&lt;br /&gt;
&lt;br /&gt;
# The name of the protocolHeader used to identify the originating IP address of&lt;br /&gt;
# a client connecting to a web server through an HTTP proxy or load balancer.&lt;br /&gt;
# This is needed for grizzly based setups that make use of http proxying.&lt;br /&gt;
# If the header isn't found the first proxy in front of grizzly will be used&lt;br /&gt;
# as originating IP/remote address.&lt;br /&gt;
# Default value: X-Forwarded-For&lt;br /&gt;
com.openexchange.server.forHeader=X-Forwarded-For&lt;br /&gt;
&lt;br /&gt;
# A list of know proxies in front of our httpserver/balancer as comma separated IPs e.g: 192.168.1.50, 192.168.1.51&lt;br /&gt;
com.openexchange.server.knownProxies = &lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====/opt/open-xchange/etc/grizzly.conf====&lt;br /&gt;
Next we'll look at the parts of the grizzly.properties that configure only the grizzly backend but not the ajp backend.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Grizzly.properties&lt;br /&gt;
#&lt;br /&gt;
# This file configures the grizzly server contained in the package&lt;br /&gt;
# open-xchange-grizzly. In your OX setup grizzly is located behind the&lt;br /&gt;
# load-balancer and accepts incoming client requests. Communication with the&lt;br /&gt;
# load balancer is done via http, e.g via Apache's mod_proxy_http.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Push technology&lt;br /&gt;
################################################################################&lt;br /&gt;
&lt;br /&gt;
# Comet is an umbrella term used to describe a technique allowing web browser to&lt;br /&gt;
# receive almost real time updates from the server. The two most common&lt;br /&gt;
# approaches are long polling and streaming. Long polling differs from streaming&lt;br /&gt;
# in that each update from the server ultimately results in another follow up&lt;br /&gt;
# request from the client.&lt;br /&gt;
# Default value: true&lt;br /&gt;
com.openexchange.http.grizzly.hasCometEnabled=true&lt;br /&gt;
&lt;br /&gt;
# Bi-directional, full-duplex communications channels over a single TCP&lt;br /&gt;
# connection.&lt;br /&gt;
# Default value: false&lt;br /&gt;
com.openexchange.http.grizzly.hasWebSocketsEnabled=true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### JMX&lt;br /&gt;
################################################################################&lt;br /&gt;
&lt;br /&gt;
# Do you want to enable grizzly monitoring via JMX? Default value: true.&lt;br /&gt;
com.openexchange.http.grizzly.hasJMXEnabled=true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Protocol&lt;br /&gt;
################################################################################&lt;br /&gt;
&lt;br /&gt;
# Grizzly is able to communicate via AJP besides its default prototcol HTTP.&lt;br /&gt;
# Do you want to use AJP instead of HTTP?&lt;br /&gt;
# Default value: false&lt;br /&gt;
com.openexchange.http.grizzly.hasAJPEnabled=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====/opt/open-xchange/etc/requestwatcher.conf====&lt;br /&gt;
And finally the properties to configure the requestwatchers of the http and ajp backends&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Requestwatcher.properties&lt;br /&gt;
#&lt;br /&gt;
# This file configures the requestwatchers contained in the packages&lt;br /&gt;
# open-xchange-grizzly and open-xchange-ajp. The requestwatcher keeps track of&lt;br /&gt;
# incoming requests and periodically checks the age of the currently processing&lt;br /&gt;
# requests. If a request exceeds the configured maximum age, infos about the&lt;br /&gt;
# request and its processing thread are logged either into the configured&lt;br /&gt;
# logfiles or syslog depending on your configuration. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Enable/disable the requestwatcher.&lt;br /&gt;
# Default value: true (enabled).&lt;br /&gt;
com.openexchange.requestwatcher.isEnabled: true&lt;br /&gt;
&lt;br /&gt;
# Define the requestwatcher's frequency in milliseconds.&lt;br /&gt;
# Default value: 30000.&lt;br /&gt;
com.openexchange.requestwatcher.frequency: 30000&lt;br /&gt;
&lt;br /&gt;
# Define the maximum allowed age of requests in milliseconds.&lt;br /&gt;
# Default value: 60000. &lt;br /&gt;
com.openexchange.requestwatcher.maxRequestAge: 60000&lt;br /&gt;
&lt;br /&gt;
# Permission to stop &amp;amp; re-init system (works only for the ajp connector)&lt;br /&gt;
com.openexchange.requestwatcher.restartPermission: false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Multiple Proxies in front of the cluster==&lt;br /&gt;
[[File:GrizzlOXClusterMultipleProxySetup.png|left|935px|alt=The default cluster with multiple proxies setup.]]&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===X-FORWARDED-FOR Header===&lt;br /&gt;
&lt;br /&gt;
Wikipedia[http://en.wikipedia.org/wiki/X-Forwarded-For] describes the X-Forwarded-For Header as: &lt;br /&gt;
&lt;br /&gt;
The '''X-Forwarded-For''' ('''XFF''') HTTP header field is a ''de facto'' standard for identifying the originating IP address of a client connecting to a web server through an HTTP proxy or load balancer. This is an HTTP request header which was introduced by the [[Squid (software)|Squid]] caching proxy server's developers. An effort has been started at IETF for standardizing the '''Forwarded''' HTTP header.&lt;br /&gt;
&lt;br /&gt;
In this context, the caching servers are most often those of large ISPs who either encourage or force their users to use proxy servers for access to the World Wide Web, something which is often done to reduce external bandwidth through caching. In some cases, these proxy servers are transparent proxies, and the user may be unaware that they are using them.&lt;br /&gt;
&lt;br /&gt;
Without the use of XFF or another similar technique, any connection through the proxy would reveal only the originating IP address of the proxy server, effectively turning the proxy server into an anonymizing service, thus making the detection and prevention of abusive accesses significantly harder than if the originating IP address was available. The usefulness of XFF depends on the proxy server truthfully reporting the original host's IP address; for this reason, effective use of XFF requires knowledge of which proxies are trustworthy, for instance by looking them up in a whitelist of servers whose maintainers can be trusted.&lt;br /&gt;
&lt;br /&gt;
====Format====&lt;br /&gt;
The general format of the field is:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;X-Forwarded-For: client, proxy1, proxy2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where the value is a comma+space separated list of IP addresses, the left-most being the original client, and each successive proxy that passed the request adding the IP address where it received the request from. In this example, the request passed through proxy1, proxy2, and then proxy3 (not shown in the header). proxy3 appears as remote address of the request.&lt;br /&gt;
&lt;br /&gt;
The given information should be used with care since it is easy to forge an X-Forwarded-For field. The last IP address is always the IP address that connects to the last proxy, which means it is the most reliable source of information. X-Forwarded-For data can be used in a forward or reverse proxy scenario.&lt;br /&gt;
&lt;br /&gt;
Just logging the X-Forwarded-For field is not always enough: The last proxy IP address in a chain is not contained within the X-Forwarded-For field, it is in the actual IP header. A web server should log BOTH the request's source IP address and the X-Forwarded-For field information for completeness.&lt;br /&gt;
&lt;br /&gt;
===Getting the remote IP===&lt;br /&gt;
If you want the backends in the GrizzlOX-Cluster to use '''Client''''s(95.223.182.44) instead of '''Balancer''''s IP as remote address for e.g reporting the LogProperty '''com.openexchange.grizzly.remoteAddress''' for faulty requests in the Open-Xchange logs, you have to change these parameters from their default values seen in /opt/open-xchange/etc/server.properties to:&lt;br /&gt;
&lt;br /&gt;
 # Decides if we should consider X-Forward-Headers that reach the backend.&lt;br /&gt;
 # Those can be spoofed by clients so we have to make sure to consider the headers only if the proxy/proxies reliably override those&lt;br /&gt;
 # headers for incoming requests.&lt;br /&gt;
 # Default value: false&lt;br /&gt;
 com.openexchange.server.considerXForwards = '''true'''&lt;br /&gt;
&lt;br /&gt;
 # The name of the protocolHeader used to identify the originating IP address of&lt;br /&gt;
 # a client connecting to a web server through an HTTP proxy or load balancer.&lt;br /&gt;
 # This is needed for grizzly based setups that make use of http proxying.&lt;br /&gt;
 # If the header isn't found the first proxy in front of grizzly will be used&lt;br /&gt;
 # as originating IP/remote address.&lt;br /&gt;
 # Default value: X-Forwarded-For&lt;br /&gt;
 com.openexchange.server.forHeader='''X-Forwarded-For'''&lt;br /&gt;
&lt;br /&gt;
 # A list of know proxies in front of our httpserver/balancer as comma separated IPs e.g: 192.168.1.50, 192.168.1.51&lt;br /&gt;
 com.openexchange.server.knownProxies = '''192.168.1.50, 192.168.1.51'''&lt;br /&gt;
&lt;br /&gt;
After you have changed the the configuration you have to restart the backend server via&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange restart&lt;br /&gt;
&lt;br /&gt;
The remote IP is detected in the following way: All configured known proxies are removed from the list of IPs listed in the X-FORWARDED-FOR header, beginning frome the right side of the list. The rightmost leftover IP is then seen as our new remote address as it represents the first IP not known to us.&lt;br /&gt;
&lt;br /&gt;
==Make Grizzly speak AJP instead of HTTP==&lt;br /&gt;
Grizzly normally acts as an HTTP server and demands that the balancing proxy in front of it communicates via HTTP. This behaviour can be changed to Grizzly accepting the Apache JServ Protocol by simply adjusting the Grizzly and Apache configurations and restarting both servers.&lt;br /&gt;
&lt;br /&gt;
===Grizzly.properties===&lt;br /&gt;
&lt;br /&gt;
Change this parameter from the value seen in [[#Grizzly configuration|Grizzly configuration]] to:&lt;br /&gt;
&lt;br /&gt;
 ### Protocol&lt;br /&gt;
 ################################################################################&lt;br /&gt;
 &lt;br /&gt;
 # Grizzly is able to communicate via AJP besides its default prototcol HTTP.&lt;br /&gt;
 # Do you want to use AJP instead of HTTP?&lt;br /&gt;
 # Default value: false&lt;br /&gt;
 com.openexchange.http.grizzly.hasAJPEnabled='''true'''&lt;br /&gt;
&lt;br /&gt;
===Apache configuration===&lt;br /&gt;
&lt;br /&gt;
Change the HTTP related parameters from the values seen in [[#Apache configuration|Apache configuration]] to AJP. This involves the IfModule directive and the BalancerMember declarations.&lt;br /&gt;
&lt;br /&gt;
To make Apach communicate via AJP instead of HTTP you have to replace the proxy_http with the proxy_ajp module.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;IfModule mod_proxy_'''ajp'''.c&amp;gt;&lt;br /&gt;
   ProxyRequests Off&lt;br /&gt;
   # When enabled, this option will pass the Host: line from the incoming request to the proxied host.&lt;br /&gt;
   ProxyPreserveHost On&lt;br /&gt;
 &amp;lt;Proxy balancer://oxcluster&amp;gt;&lt;br /&gt;
     Order deny,allow&lt;br /&gt;
     Allow from all&lt;br /&gt;
     # multiple server setups need to have the hostname inserted instead localhost&lt;br /&gt;
     BalancerMember '''ajp'''://localhost:8009 timeout=100 smax=0 ttl=60 retry=60 loadfactor=50 route=OX1&lt;br /&gt;
     # Enable and maybe add additional hosts running OX here&lt;br /&gt;
     # BalancerMember '''ajp'''://oxhost2:8009 timeout=100  smax=0 ttl=60 retry=60 loadfactor=50 route=OX2&lt;br /&gt;
     ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&lt;br /&gt;
 &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
 # Microsoft recommends a minimum timeout value of 15 minutes for eas connections&lt;br /&gt;
 &amp;lt;Proxy balancer://eas_oxcluster&amp;gt;&lt;br /&gt;
    Order deny,allow&lt;br /&gt;
    Allow from all&lt;br /&gt;
    # multiple server setups need to have the hostname inserted instead localhost&lt;br /&gt;
    BalancerMember '''ajp'''://localhost:8009 timeout=1800 smax=0 ttl=60 retry=60 loadfactor=50 route=OX1&lt;br /&gt;
    # Enable and maybe add additional hosts running OX here&lt;br /&gt;
    # BalancerMember '''ajp'''://oxhost2:8009 timeout=1800  smax=0 ttl=60 retry=60 loadfactor=50 route=OX2&lt;br /&gt;
    ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&lt;br /&gt;
 &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 $ a2dismod proxy_http &amp;amp;&amp;amp; a2enmod proxy_ajp&lt;br /&gt;
&lt;br /&gt;
===Restart the servers===&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange restart&lt;br /&gt;
 $ /etc/init.d/apache2 restart&lt;br /&gt;
&lt;br /&gt;
=Switching from open-xchange-grizzly to open-xchange-ajp=&lt;br /&gt;
It's possible to switch the '''open-xchange-grizzly''' based setup to a setup based on the alternative '''open-xchange-ajp''' if you don't depend on certian realtime features like websockets, comet based communication or the already mentioned WEBDAV MKCALENDAR command.&lt;br /&gt;
&lt;br /&gt;
==1. Install the ajp backend==&lt;br /&gt;
Install the '''open-xchange-ajp''' package via your package manager. This will inform you about a conflict between the currently installed '''open-xchange-grizzly''' and the package you want to install. To solve the conflict you either have to manually remove '''open-xchange-grizzly''' before installing '''open-xchange-ajp''' or let the package manager handle this conflict automatically for you.&lt;br /&gt;
&lt;br /&gt;
;Debian:&lt;br /&gt;
 $ aptitude install open-xchange-ajp&lt;br /&gt;
;Suse:&lt;br /&gt;
 $ zypper in open-xchange-ajp&lt;br /&gt;
;RedHat:&lt;br /&gt;
 $ yum install open-xchange-ajp&lt;br /&gt;
&lt;br /&gt;
==2. Adapt the module configuration of apache==&lt;br /&gt;
Adapt the installed apache modules to switch the proxy connector in use from http to ajp&lt;br /&gt;
&lt;br /&gt;
 $ a2dismod proxy_http &amp;amp;&amp;amp; a2enmod proxy_ajp&lt;br /&gt;
&lt;br /&gt;
==3. Adapt the apache configuration to use the new connector==&lt;br /&gt;
To make use of apaches new ajp connector for communication with '''open-xchange-ajp''' whe have to change it's configuration&lt;br /&gt;
&lt;br /&gt;
{{Template:ApacheAppSuiteConf/sandbox|connector=ajp|connectorConf=/etc/apache2/conf.d/proxy_ajp.conf|apacheconf=/etc/apache2/sites-enabled/000-default|docroot=/var/www/|loadmodule=}}&lt;br /&gt;
&lt;br /&gt;
==4.Restart services==&lt;br /&gt;
 $ /etc/init.d/apache2 restart&lt;br /&gt;
 $ /etc/init.d/open-xchange restart&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]]&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Grizzly&amp;diff=13895</id>
		<title>AppSuite:Grizzly</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Grizzly&amp;diff=13895"/>
		<updated>2013-04-17T14:42:27Z</updated>

		<summary type="html">&lt;p&gt;Malasa: /* Apache configuration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Grizzly based backend=&lt;br /&gt;
Up to OX App Suite we were limited to AJP based communication between the HTTP server and the OX backend server. Starting with the release 7.0.1 of OX App Suite, we offer a second HTTP based connector for the communication between the HTTP server and the backend. This new connector is based on Oracle's '''[http://grizzly.java.net Project Grizzly]''' - a [http://en.wikipedia.org/wiki/New_I/O NIO] and Web framework.&lt;br /&gt;
&lt;br /&gt;
=Packages=&lt;br /&gt;
Next, we'll show some information on the packages needed to install a Grizzly based backend, give you some in depth information about the package dependencies of '''open-xchange''' on '''open-xchange-ajp''' and '''open-xchange-grizzly''' and cover possible conflicts between those packages. &lt;br /&gt;
&lt;br /&gt;
==HttpService as packaging dependency==&lt;br /&gt;
[[File:HttpServiceDependency.png|thumb|left|alt=The HttpService dependency.]]&lt;br /&gt;
The open-xchange package depends on a virtual package called '''open-xchange-httpservice'''. This service is provided by both, the old '''open-xchange-ajp''' and the new '''open-xchange-grizzly''' packages. Only one of these two packages can be installed at a time because they block each other.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{InstallPlugin|pluginname=open-xchange-grizzly| toplevel=products | sopath=appsuite/stable/backend|version=App Suite}}&lt;br /&gt;
&lt;br /&gt;
=Cluster setup=&lt;br /&gt;
[[File:GrizzlOXClusterSetup.png|left|alt=The default cluster setup.]]&lt;br /&gt;
This picture shows our default cluster setup. It consists of a proxying balancer (in our case Apache) and a cluster of multiple OX App Suite backends. The balancer receives HTTP and/or HTTPS requests. It then decides which requests should be handled by itself and which should be forwarded, so they can be handled by one of the OX App Suite backends. That's where the AJP or HTTP connector is used. &lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Configuration==&lt;br /&gt;
As requests pass the balancer first, we'll start with a look at how to configure the balancer before configuring the Grizzly-based OX App Suite backends.&lt;br /&gt;
&lt;br /&gt;
===Apache configuration===&lt;br /&gt;
{{Template:ApacheOXModsDebian|connector=http}}&lt;br /&gt;
&lt;br /&gt;
{{Template:ApacheAppSuiteConf/sandbox|connector=http|connectorConf=/etc/apache2/conf.d/proxy_http.conf|apacheconf=/etc/apache2/sites-enabled/000-default|docroot=/var/www/|loadmodule=|easProxyName=eas_oxcluster}}&lt;br /&gt;
&lt;br /&gt;
====X-FORWARDED-PROTO Header====&lt;br /&gt;
&lt;br /&gt;
[[Appsuite:Grizzly#Cluster_setup]] shows that HTTPS communication is terminated by the Apache balancer in front of the OX backends. To let the backends know about the protocol that is used to communicate with the Apache server we have to set a special header in the ssl virtual hosts configurations in Apache to forward this information. The de facto standard for this is the X-Forwarded-Proto header.&lt;br /&gt;
&lt;br /&gt;
To add it to your Apache configuration you have to open the default ssl vhost configuration via:&lt;br /&gt;
&lt;br /&gt;
  $ vim /etc/apache2/sites-enabled/default-ssl&lt;br /&gt;
&lt;br /&gt;
and add &lt;br /&gt;
&lt;br /&gt;
  RequestHeader set X-Forwarded-Proto &amp;quot;https&amp;quot;&lt;br /&gt;
&lt;br /&gt;
to each of the virtual hosts used to communicate with the OX App Suite backends.&lt;br /&gt;
&lt;br /&gt;
===Grizzly configuration===&lt;br /&gt;
&lt;br /&gt;
====Available configuration files====&lt;br /&gt;
&lt;br /&gt;
====/opt/open-xchange/etc/server.conf====&lt;br /&gt;
This extract of the server.properties shows the properties that can be applied to the grizzly and ajp backend.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
# DEFAULT ENCODING FOR INCOMING HTTP REQUESTS&lt;br /&gt;
# This value MUST be equal to web server's default encoding&lt;br /&gt;
DefaultEncoding=UTF-8&lt;br /&gt;
...&lt;br /&gt;
# The host for the connector's (ajp, http) network listener. Set to &amp;quot;*&amp;quot; if you&lt;br /&gt;
# want to listen on all available interfaces.&lt;br /&gt;
#Default value: 127.0.0.1, bind to localhost only.&lt;br /&gt;
com.openexchange.connector.networkListenerHost=*&lt;br /&gt;
&lt;br /&gt;
# The default port for the connector's (ajp, http) network listener.&lt;br /&gt;
# Default value: 8009.&lt;br /&gt;
com.openexchange.connector.networkListenerPort=8009&lt;br /&gt;
&lt;br /&gt;
# Specify the max. number of allowed request parameters for the connector (ajp, http)&lt;br /&gt;
# Default value: 30&lt;br /&gt;
com.openexchange.connector.maxRequestParameters: 30&lt;br /&gt;
&lt;br /&gt;
# To enable proper load balancing and request routing from {client1, client2 ..&lt;br /&gt;
# .} --&amp;gt; balancer --&amp;gt; {backend1, backend2 ...} we have to append a backend route&lt;br /&gt;
# to the JSESSIONID cookies separated by a '.'. It's important that this backend&lt;br /&gt;
# route is unique for every single backend behind the load balancer.&lt;br /&gt;
# The string has to be a sequence of characters excluding semi-colon, comma and&lt;br /&gt;
# white space so the JSESSIONID cookie stays in accordance with the cookie&lt;br /&gt;
# specification after we append the backendroute to it.&lt;br /&gt;
# Default value: OX0 &lt;br /&gt;
com.openexchange.server.backendRoute=OX1&lt;br /&gt;
&lt;br /&gt;
# Decides if we should consider X-Forward-Headers that reach the backend.&lt;br /&gt;
# Those can be spoofed by clients so we have to make sure to consider the headers only if the proxy/proxies reliably override those&lt;br /&gt;
# headers for incoming requests.&lt;br /&gt;
# Default value: false&lt;br /&gt;
com.openexchange.server.considerXForwards = false&lt;br /&gt;
&lt;br /&gt;
# The name of the protocolHeader used to identify the originating IP address of&lt;br /&gt;
# a client connecting to a web server through an HTTP proxy or load balancer.&lt;br /&gt;
# This is needed for grizzly based setups that make use of http proxying.&lt;br /&gt;
# If the header isn't found the first proxy in front of grizzly will be used&lt;br /&gt;
# as originating IP/remote address.&lt;br /&gt;
# Default value: X-Forwarded-For&lt;br /&gt;
com.openexchange.server.forHeader=X-Forwarded-For&lt;br /&gt;
&lt;br /&gt;
# A list of know proxies in front of our httpserver/balancer as comma separated IPs e.g: 192.168.1.50, 192.168.1.51&lt;br /&gt;
com.openexchange.server.knownProxies = &lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====/opt/open-xchange/etc/grizzly.conf====&lt;br /&gt;
Next we'll look at the parts of the grizzly.properties that configure only the grizzly backend but not the ajp backend.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Grizzly.properties&lt;br /&gt;
#&lt;br /&gt;
# This file configures the grizzly server contained in the package&lt;br /&gt;
# open-xchange-grizzly. In your OX setup grizzly is located behind the&lt;br /&gt;
# load-balancer and accepts incoming client requests. Communication with the&lt;br /&gt;
# load balancer is done via http, e.g via Apache's mod_proxy_http.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Push technology&lt;br /&gt;
################################################################################&lt;br /&gt;
&lt;br /&gt;
# Comet is an umbrella term used to describe a technique allowing web browser to&lt;br /&gt;
# receive almost real time updates from the server. The two most common&lt;br /&gt;
# approaches are long polling and streaming. Long polling differs from streaming&lt;br /&gt;
# in that each update from the server ultimately results in another follow up&lt;br /&gt;
# request from the client.&lt;br /&gt;
# Default value: true&lt;br /&gt;
com.openexchange.http.grizzly.hasCometEnabled=true&lt;br /&gt;
&lt;br /&gt;
# Bi-directional, full-duplex communications channels over a single TCP&lt;br /&gt;
# connection.&lt;br /&gt;
# Default value: false&lt;br /&gt;
com.openexchange.http.grizzly.hasWebSocketsEnabled=true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### JMX&lt;br /&gt;
################################################################################&lt;br /&gt;
&lt;br /&gt;
# Do you want to enable grizzly monitoring via JMX? Default value: true.&lt;br /&gt;
com.openexchange.http.grizzly.hasJMXEnabled=true&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
### Protocol&lt;br /&gt;
################################################################################&lt;br /&gt;
&lt;br /&gt;
# Grizzly is able to communicate via AJP besides its default prototcol HTTP.&lt;br /&gt;
# Do you want to use AJP instead of HTTP?&lt;br /&gt;
# Default value: false&lt;br /&gt;
com.openexchange.http.grizzly.hasAJPEnabled=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====/opt/open-xchange/etc/requestwatcher.conf====&lt;br /&gt;
And finally the properties to configure the requestwatchers of the http and ajp backends&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Requestwatcher.properties&lt;br /&gt;
#&lt;br /&gt;
# This file configures the requestwatchers contained in the packages&lt;br /&gt;
# open-xchange-grizzly and open-xchange-ajp. The requestwatcher keeps track of&lt;br /&gt;
# incoming requests and periodically checks the age of the currently processing&lt;br /&gt;
# requests. If a request exceeds the configured maximum age, infos about the&lt;br /&gt;
# request and its processing thread are logged either into the configured&lt;br /&gt;
# logfiles or syslog depending on your configuration. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# Enable/disable the requestwatcher.&lt;br /&gt;
# Default value: true (enabled).&lt;br /&gt;
com.openexchange.requestwatcher.isEnabled: true&lt;br /&gt;
&lt;br /&gt;
# Define the requestwatcher's frequency in milliseconds.&lt;br /&gt;
# Default value: 30000.&lt;br /&gt;
com.openexchange.requestwatcher.frequency: 30000&lt;br /&gt;
&lt;br /&gt;
# Define the maximum allowed age of requests in milliseconds.&lt;br /&gt;
# Default value: 60000. &lt;br /&gt;
com.openexchange.requestwatcher.maxRequestAge: 60000&lt;br /&gt;
&lt;br /&gt;
# Permission to stop &amp;amp; re-init system (works only for the ajp connector)&lt;br /&gt;
com.openexchange.requestwatcher.restartPermission: false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Multiple Proxies in front of the cluster==&lt;br /&gt;
[[File:GrizzlOXClusterMultipleProxySetup.png|left|935px|alt=The default cluster with multiple proxies setup.]]&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===X-FORWARDED-FOR Header===&lt;br /&gt;
&lt;br /&gt;
Wikipedia[http://en.wikipedia.org/wiki/X-Forwarded-For] describes the X-Forwarded-For Header as: &lt;br /&gt;
&lt;br /&gt;
The '''X-Forwarded-For''' ('''XFF''') HTTP header field is a ''de facto'' standard for identifying the originating IP address of a client connecting to a web server through an HTTP proxy or load balancer. This is an HTTP request header which was introduced by the [[Squid (software)|Squid]] caching proxy server's developers. An effort has been started at IETF for standardizing the '''Forwarded''' HTTP header.&lt;br /&gt;
&lt;br /&gt;
In this context, the caching servers are most often those of large ISPs who either encourage or force their users to use proxy servers for access to the World Wide Web, something which is often done to reduce external bandwidth through caching. In some cases, these proxy servers are transparent proxies, and the user may be unaware that they are using them.&lt;br /&gt;
&lt;br /&gt;
Without the use of XFF or another similar technique, any connection through the proxy would reveal only the originating IP address of the proxy server, effectively turning the proxy server into an anonymizing service, thus making the detection and prevention of abusive accesses significantly harder than if the originating IP address was available. The usefulness of XFF depends on the proxy server truthfully reporting the original host's IP address; for this reason, effective use of XFF requires knowledge of which proxies are trustworthy, for instance by looking them up in a whitelist of servers whose maintainers can be trusted.&lt;br /&gt;
&lt;br /&gt;
====Format====&lt;br /&gt;
The general format of the field is:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;tt&amp;gt;X-Forwarded-For: client, proxy1, proxy2&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
where the value is a comma+space separated list of IP addresses, the left-most being the original client, and each successive proxy that passed the request adding the IP address where it received the request from. In this example, the request passed through proxy1, proxy2, and then proxy3 (not shown in the header). proxy3 appears as remote address of the request.&lt;br /&gt;
&lt;br /&gt;
The given information should be used with care since it is easy to forge an X-Forwarded-For field. The last IP address is always the IP address that connects to the last proxy, which means it is the most reliable source of information. X-Forwarded-For data can be used in a forward or reverse proxy scenario.&lt;br /&gt;
&lt;br /&gt;
Just logging the X-Forwarded-For field is not always enough: The last proxy IP address in a chain is not contained within the X-Forwarded-For field, it is in the actual IP header. A web server should log BOTH the request's source IP address and the X-Forwarded-For field information for completeness.&lt;br /&gt;
&lt;br /&gt;
===Getting the remote IP===&lt;br /&gt;
If you want the backends in the GrizzlOX-Cluster to use '''Client''''s(95.223.182.44) instead of '''Balancer''''s IP as remote address for e.g reporting the LogProperty '''com.openexchange.grizzly.remoteAddress''' for faulty requests in the Open-Xchange logs, you have to change these parameters from their default values seen in /opt/open-xchange/etc/server.properties to:&lt;br /&gt;
&lt;br /&gt;
 # Decides if we should consider X-Forward-Headers that reach the backend.&lt;br /&gt;
 # Those can be spoofed by clients so we have to make sure to consider the headers only if the proxy/proxies reliably override those&lt;br /&gt;
 # headers for incoming requests.&lt;br /&gt;
 # Default value: false&lt;br /&gt;
 com.openexchange.server.considerXForwards = '''true'''&lt;br /&gt;
&lt;br /&gt;
 # The name of the protocolHeader used to identify the originating IP address of&lt;br /&gt;
 # a client connecting to a web server through an HTTP proxy or load balancer.&lt;br /&gt;
 # This is needed for grizzly based setups that make use of http proxying.&lt;br /&gt;
 # If the header isn't found the first proxy in front of grizzly will be used&lt;br /&gt;
 # as originating IP/remote address.&lt;br /&gt;
 # Default value: X-Forwarded-For&lt;br /&gt;
 com.openexchange.server.forHeader='''X-Forwarded-For'''&lt;br /&gt;
&lt;br /&gt;
 # A list of know proxies in front of our httpserver/balancer as comma separated IPs e.g: 192.168.1.50, 192.168.1.51&lt;br /&gt;
 com.openexchange.server.knownProxies = '''192.168.1.50, 192.168.1.51'''&lt;br /&gt;
&lt;br /&gt;
After you have changed the the configuration you have to restart the backend server via&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange restart&lt;br /&gt;
&lt;br /&gt;
The remote IP is detected in the following way: All configured known proxies are removed from the list of IPs listed in the X-FORWARDED-FOR header, beginning frome the right side of the list. The rightmost leftover IP is then seen as our new remote address as it represents the first IP not known to us.&lt;br /&gt;
&lt;br /&gt;
==Make Grizzly speak AJP instead of HTTP==&lt;br /&gt;
Grizzly normally acts as an HTTP server and demands that the balancing proxy in front of it communicates via HTTP. This behaviour can be changed to Grizzly accepting the Apache JServ Protocol by simply adjusting the Grizzly and Apache configurations and restarting both servers.&lt;br /&gt;
&lt;br /&gt;
===Grizzly.properties===&lt;br /&gt;
&lt;br /&gt;
Change this parameter from the value seen in [[#Grizzly configuration|Grizzly configuration]] to:&lt;br /&gt;
&lt;br /&gt;
 ### Protocol&lt;br /&gt;
 ################################################################################&lt;br /&gt;
 &lt;br /&gt;
 # Grizzly is able to communicate via AJP besides its default prototcol HTTP.&lt;br /&gt;
 # Do you want to use AJP instead of HTTP?&lt;br /&gt;
 # Default value: false&lt;br /&gt;
 com.openexchange.http.grizzly.hasAJPEnabled='''true'''&lt;br /&gt;
&lt;br /&gt;
===Apache configuration===&lt;br /&gt;
&lt;br /&gt;
Change the HTTP related parameters from the values seen in [[#Apache configuration|Apache configuration]] to AJP. This involves the IfModule directive and the BalancerMember declarations.&lt;br /&gt;
&lt;br /&gt;
To make Apach communicate via AJP instead of HTTP you have to replace the proxy_http with the proxy_ajp module. If you used AJP before, you have to delete /etc/apache2/conf.d/proxy_ajp.conf.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;IfModule mod_proxy_'''ajp'''.c&amp;gt;&lt;br /&gt;
   ProxyRequests Off&lt;br /&gt;
   # When enabled, this option will pass the Host: line from the incoming request to the proxied host.&lt;br /&gt;
   ProxyPreserveHost On&lt;br /&gt;
 &amp;lt;Proxy balancer://oxcluster&amp;gt;&lt;br /&gt;
     Order deny,allow&lt;br /&gt;
     Allow from all&lt;br /&gt;
     # multiple server setups need to have the hostname inserted instead localhost&lt;br /&gt;
     BalancerMember '''ajp'''://localhost:8009 timeout=100 smax=0 ttl=60 retry=60 loadfactor=50 route=OX1&lt;br /&gt;
     # Enable and maybe add additional hosts running OX here&lt;br /&gt;
     # BalancerMember '''ajp'''://oxhost2:8009 timeout=100  smax=0 ttl=60 retry=60 loadfactor=50 route=OX2&lt;br /&gt;
     ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&lt;br /&gt;
 &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
 # Microsoft recommends a minimum timeout value of 15 minutes for eas connections&lt;br /&gt;
 &amp;lt;Proxy balancer://eas_oxcluster&amp;gt;&lt;br /&gt;
    Order deny,allow&lt;br /&gt;
    Allow from all&lt;br /&gt;
    # multiple server setups need to have the hostname inserted instead localhost&lt;br /&gt;
    BalancerMember '''ajp'''://localhost:8009 timeout=1800 smax=0 ttl=60 retry=60 loadfactor=50 route=OX1&lt;br /&gt;
    # Enable and maybe add additional hosts running OX here&lt;br /&gt;
    # BalancerMember '''ajp'''://oxhost2:8009 timeout=1800  smax=0 ttl=60 retry=60 loadfactor=50 route=OX2&lt;br /&gt;
    ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&lt;br /&gt;
 &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 $ a2dismod proxy_http &amp;amp;&amp;amp; a2enmod proxy_ajp&lt;br /&gt;
&lt;br /&gt;
===Restart the servers===&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange restart&lt;br /&gt;
 $ /etc/init.d/apache2 restart&lt;br /&gt;
&lt;br /&gt;
=Switching from open-xchange-grizzly to open-xchange-ajp=&lt;br /&gt;
It's possible to switch the '''open-xchange-grizzly''' based setup to a setup based on the alternative '''open-xchange-ajp''' if you don't depend on certian realtime features like websockets, comet based communication or the already mentioned WEBDAV MKCALENDAR command.&lt;br /&gt;
&lt;br /&gt;
==1. Install the ajp backend==&lt;br /&gt;
Install the '''open-xchange-ajp''' package via your package manager. This will inform you about a conflict between the currently installed '''open-xchange-grizzly''' and the package you want to install. To solve the conflict you either have to manually remove '''open-xchange-grizzly''' before installing '''open-xchange-ajp''' or let the package manager handle this conflict automatically for you.&lt;br /&gt;
&lt;br /&gt;
;Debian:&lt;br /&gt;
 $ aptitude install open-xchange-ajp&lt;br /&gt;
;Suse:&lt;br /&gt;
 $ zypper in open-xchange-ajp&lt;br /&gt;
;RedHat:&lt;br /&gt;
 $ yum install open-xchange-ajp&lt;br /&gt;
&lt;br /&gt;
==2. Adapt the module configuration of apache==&lt;br /&gt;
Adapt the installed apache modules to switch the proxy connector in use from http to ajp&lt;br /&gt;
&lt;br /&gt;
 $ a2dismod proxy_http &amp;amp;&amp;amp; a2enmod proxy_ajp&lt;br /&gt;
&lt;br /&gt;
==3. Adapt the apache configuration to use the new connector==&lt;br /&gt;
To make use of apaches new ajp connector for communication with '''open-xchange-ajp''' whe have to change it's configuration&lt;br /&gt;
&lt;br /&gt;
{{Template:ApacheAppSuiteConf/sandbox|connector=ajp|connectorConf=/etc/apache2/conf.d/proxy_ajp.conf|apacheconf=/etc/apache2/sites-enabled/000-default|docroot=/var/www/|loadmodule=}}&lt;br /&gt;
&lt;br /&gt;
==4.Restart services==&lt;br /&gt;
 $ /etc/init.d/apache2 restart&lt;br /&gt;
 $ /etc/init.d/open-xchange restart&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]]&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Upgrade_from_6.22_for_CentOS6&amp;diff=13203</id>
		<title>AppSuite:Upgrade from 6.22 for CentOS6</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Upgrade_from_6.22_for_CentOS6&amp;diff=13203"/>
		<updated>2013-03-25T14:15:56Z</updated>

		<summary type="html">&lt;p&gt;Malasa: /* Update Open-Xchange Repositories */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Update of Open-Xchange Server v6.22 to OX App Suite 7.0 on CentOS 6. =&lt;br /&gt;
This example describes updating an OX 6 Server installation to OX App Suite 7.&lt;br /&gt;
&lt;br /&gt;
= Supported update path =&lt;br /&gt;
Updates from an OX6 installation to App Suite are only possible from 6.22 to 7.0. If you have an earlier version of Open-Xchange Server 6 installed, please update to the latest release of v6.22 before attempting an update to OX App Suite 7. See [[Open-Xchange_620_622_Update_Guide_for_CentOS6|Open-Xchange 6.20 to 6.22 Update Guide for CentOS 6]] for instructions regarding that update.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
* An Open-Xchange Server installation v6.22.0 or later. This update guide is valid for a system installed through our [[Open-Xchange_Installation_Guide_for_CentOS_6_622|Download and Installation Guide for CentOS 6]]&lt;br /&gt;
* If you have custom packages done by Open-Xchange, please discuss with your Open-Xchange contact when these packages are available for OX App Suite 7. Do not attempt the update earlier.&lt;br /&gt;
* Custom packages built for 6.22.1 or earlier might not work with OX App Suite 7.0.&lt;br /&gt;
* As for every update we strongly recommend that you make a backup of your system(s) before you proceed.&lt;br /&gt;
&lt;br /&gt;
= Update Open-Xchange Repositories =&lt;br /&gt;
We start by adding the App Suite repos to our yum repos. Edit the file &amp;lt;code&amp;gt;/etc/yum.repos.d/ox.repo&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 [appsuite-frontend]&lt;br /&gt;
 name=Appsuite-frontend&lt;br /&gt;
 baseurl=http://software.open-xchange.com/products/appsuite/stable/appsuiteui/RHEL6/&lt;br /&gt;
 gpgkey=http://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
 &lt;br /&gt;
 [appsuite-backend]&lt;br /&gt;
 name=Appsuite-backend&lt;br /&gt;
 baseurl=http://software.open-xchange.com/products/appsuite/stable/backend/RHEL6/&lt;br /&gt;
 gpgkey=http://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
 &lt;br /&gt;
 [appsuite-usm]&lt;br /&gt;
 name=Appsuite-usm&lt;br /&gt;
 baseurl=http://software.open-xchange.com/products/appsuite/stable/usm/RHEL6/&lt;br /&gt;
 gpgkey=http://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
 &lt;br /&gt;
 [appsuite-eas]&lt;br /&gt;
 name=Appsuite-eas&lt;br /&gt;
 baseurl=http://LDBUSERNAME:LDBPASSWORD@software.open-xchange.com/products/appsuite/stable/mobilityconnector/RHEL6/&lt;br /&gt;
 gpgkey=http://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
&lt;br /&gt;
Verify the repos:&lt;br /&gt;
&lt;br /&gt;
 # yum repolist&lt;br /&gt;
&lt;br /&gt;
It may be necessary to&lt;br /&gt;
&lt;br /&gt;
 # yum clean all&lt;br /&gt;
&lt;br /&gt;
to make your new repos appear.&lt;br /&gt;
&lt;br /&gt;
= Updating repositories and update packages =&lt;br /&gt;
&lt;br /&gt;
Download and update all installed packages: &lt;br /&gt;
&lt;br /&gt;
 $ yum update&lt;br /&gt;
&lt;br /&gt;
This will install new config files of some packages as &amp;lt;code&amp;gt;.rpmnew&amp;lt;/code&amp;gt; files. Check those files to identlfy files where you want to keep the existing version, put the new version in place, or merge them.&lt;br /&gt;
&lt;br /&gt;
One configuration setting is to be made manually:&lt;br /&gt;
&lt;br /&gt;
 # vi /opt/open-xchange/etc/cluster.properties&lt;br /&gt;
 com.openexchange.cluster.name=oxcluster&lt;br /&gt;
&lt;br /&gt;
= Restart Open-Xchange =&lt;br /&gt;
&lt;br /&gt;
To restart Open-Xchange Server after the update, run&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange restart&lt;br /&gt;
&lt;br /&gt;
You might  want to check with&lt;br /&gt;
&lt;br /&gt;
 $ ps aux | grep open-xchange&lt;br /&gt;
&lt;br /&gt;
that there is exactly one newly spawned process running Open-Xchange Server.&lt;br /&gt;
&lt;br /&gt;
Now the backend has been upgraded to 7.0.x. The v6.22 frontend might still work with this new backend but is *NOT*' supported up to version 6.22.1. Upon the first connection after the backend update, you will ge tthe message &amp;lt;code&amp;gt;Error: updating database, try later&amp;lt;/code&amp;gt;. The second try should succeed.&lt;br /&gt;
&lt;br /&gt;
= Add the OX App Suite UI =&lt;br /&gt;
&lt;br /&gt;
 # yum install open-xchange-appsuite open-xchange-appsuite-backend open-xchange-appsuite-manifest&lt;br /&gt;
&lt;br /&gt;
It them remains to adjust Apache's &amp;lt;code&amp;gt;ox.conf&amp;lt;/code&amp;gt; as well as &amp;lt;code&amp;gt;proxy_ajp.conf&amp;lt;/code&amp;gt;. Full sample versions of those files are given in the following.&lt;br /&gt;
&lt;br /&gt;
 # /etc/httpd/conf.d/ox.conf&lt;br /&gt;
 &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
 	ServerAdmin webmaster@localhost&lt;br /&gt;
 &lt;br /&gt;
 	DocumentRoot /var/www/html&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;Directory /var/www/html&amp;gt;&lt;br /&gt;
                Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
                AllowOverride None&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                allow from all&lt;br /&gt;
                RedirectMatch ^/$ /appsuite/&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;Directory /var/www/html/appsuite&amp;gt;&lt;br /&gt;
                Options None +SymLinksIfOwnerMatch&lt;br /&gt;
                AllowOverride Indexes FileInfo&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        ErrorLog ${APACHE_LOG_DIR}/error.log&lt;br /&gt;
 &lt;br /&gt;
        # Possible values include: debug, info, notice, warn, error, crit,&lt;br /&gt;
        # alert, emerg.&lt;br /&gt;
        LogLevel warn&lt;br /&gt;
 &lt;br /&gt;
        CustomLog ${APACHE_LOG_DIR}/access.log combined&lt;br /&gt;
 &lt;br /&gt;
        # deflate&lt;br /&gt;
       AddOutputFilterByType DEFLATE text/html text/plain text/javascript application/javascript text/css text/xml application/xml text/x-js application/x-javascript&lt;br /&gt;
 &lt;br /&gt;
 	# pre-compressed files&lt;br /&gt;
 	AddType text/javascript .jsz&lt;br /&gt;
 	AddType text/css .cssz&lt;br /&gt;
 	AddType text/xml .xmlz&lt;br /&gt;
         AddType text/plain .po&lt;br /&gt;
 	&lt;br /&gt;
 	AddEncoding gzip .jsz .cssz .xmlz&lt;br /&gt;
 	SetEnvIf Request_URI &amp;quot;\.(jsz|cssz|xmlz)$&amp;quot; no-gzip&lt;br /&gt;
 	&lt;br /&gt;
 	ExpiresActive On&lt;br /&gt;
 	&lt;br /&gt;
 	&amp;lt;Location /ox6&amp;gt;&lt;br /&gt;
 	        # Expires (via ExpiresByType to override global settings)&lt;br /&gt;
 	        ExpiresByType image/gif &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType image/png &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType image/jpg &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType image/jpeg &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/css &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/html &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/xml &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/javascript &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/x-js &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType application/x-javascript &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresDefault &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        Header append Cache-Control &amp;quot;private&amp;quot;&lt;br /&gt;
 	        Header unset Last-Modified&lt;br /&gt;
 	        Header unset Vary&lt;br /&gt;
 	        # Strip version&lt;br /&gt;
 	        RewriteEngine On&lt;br /&gt;
 	        RewriteRule v=\w+/(.+) $1 [L]&lt;br /&gt;
 	        # Turn off ETag&lt;br /&gt;
 	        Header unset ETag&lt;br /&gt;
 	        FileETag None&lt;br /&gt;
 	&amp;lt;/Location&amp;gt;&lt;br /&gt;
 	&lt;br /&gt;
 	&amp;lt;Location /ox6/ox.html&amp;gt;&lt;br /&gt;
 	        ExpiresByType text/html &amp;quot;now&amp;quot;&lt;br /&gt;
 	        ExpiresDefault &amp;quot;now&amp;quot;&lt;br /&gt;
 	        Header unset Last-Modified&lt;br /&gt;
 	        Header set Cache-Control &amp;quot;no-store, no-cache, must-revalidate, post-check=0, pre-check=0&amp;quot;&lt;br /&gt;
 	        # Turn off ETag&lt;br /&gt;
 	        Header unset ETag&lt;br /&gt;
 	        FileETag None&lt;br /&gt;
 	&amp;lt;/Location&amp;gt;&lt;br /&gt;
 	&lt;br /&gt;
 	&amp;lt;Location /ox6/index.html&amp;gt;&lt;br /&gt;
 	        ExpiresByType text/html &amp;quot;now&amp;quot;&lt;br /&gt;
 	        ExpiresDefault &amp;quot;now&amp;quot;&lt;br /&gt;
 	        Header unset Last-Modified&lt;br /&gt;
 	        Header set Cache-Control &amp;quot;no-store, no-cache, must-revalidate, post-check=0, pre-check=0&amp;quot;&lt;br /&gt;
 	        # Turn off ETag&lt;br /&gt;
 	        Header unset ETag&lt;br /&gt;
 	        FileETag None&lt;br /&gt;
 	&amp;lt;/Location&amp;gt;&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # /etc/httpd/conf.d/proxy_ajp.conf&lt;br /&gt;
 # Please note that the servlet path to the soap API has changed:&lt;br /&gt;
  &amp;lt;Location /webservices&amp;gt;&lt;br /&gt;
      # restrict access to the soap provisioning API&lt;br /&gt;
      Order Deny,Allow&lt;br /&gt;
      Deny from all&lt;br /&gt;
      Allow from 127.0.0.1&lt;br /&gt;
      # you might add more ip addresses / networks here&lt;br /&gt;
      # Allow from 192.168 10 172.16&lt;br /&gt;
  &amp;lt;/Location&amp;gt;&lt;br /&gt;
  # the old path is kept for compatibility reasons&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /servlet/axis2/services&amp;gt;&lt;br /&gt;
     # restrict access to the soap provisioning API&lt;br /&gt;
     Order Deny,Allow&lt;br /&gt;
     Deny from all&lt;br /&gt;
     Allow from 127.0.0.1&lt;br /&gt;
     # you might add more ip addresses / networks here&lt;br /&gt;
     # Allow from 192.168 10 172.16&lt;br /&gt;
 &amp;lt;/Location&amp;gt; &lt;br /&gt;
 LoadModule proxy_ajp_module modules/mod_proxy_ajp.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mod_proxy_ajp.c&amp;gt;&lt;br /&gt;
    ProxyRequests Off&lt;br /&gt;
    &amp;lt;Proxy balancer://oxcluster&amp;gt;&lt;br /&gt;
        Order deny,allow&lt;br /&gt;
        Allow from all&lt;br /&gt;
        # multiple server setups need to have the hostname inserted instead localhost&lt;br /&gt;
        BalancerMember ajp://localhost:8009 timeout=100 smax=0 ttl=60 retry=60 loadfactor=50 route=OX1&lt;br /&gt;
        # Enable and maybe add additional hosts running OX here&lt;br /&gt;
        # BalancerMember ajp://oxhost2:8009 timeout=100  smax=0 ttl=60 retry=60 loadfactor=50 route=OX2&lt;br /&gt;
        ProxySet stickysession=JSESSIONID&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    # OX AppSuite frontend&lt;br /&gt;
    &amp;lt;Proxy /appsuite/api&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/ajax&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;Proxy /ajax&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/ajax&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /servlet&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/servlet&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /infostore&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/infostore&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /publications&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/publications&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /Microsoft-Server-ActiveSync&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/Microsoft-Server-ActiveSync&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /usm-json&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/usm-json&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /webservices&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/webservices&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, stop and start the httpd and open-xchange services. Then you should be able to use the App Suite UI.&lt;br /&gt;
&lt;br /&gt;
= Remove the OX6 GUI =&lt;br /&gt;
&lt;br /&gt;
This step is optional. You may just skip it and offer both GUIs, the OX6 GUI and the OX App Suite UI. This will only be supported after the 6.22.2 release! &lt;br /&gt;
&lt;br /&gt;
If you want to uninstall the OX6 GUI, this step consists of removing the OX6 GUI packages and and adjusting Apache's configuration.&lt;br /&gt;
&lt;br /&gt;
The packages to be removed can be identified by their version number in the output of &amp;lt;code&amp;gt;rpm -qa | grep open-x&amp;lt;/code&amp;gt;. It will probably boil down to uninstall everything which starts with &amp;lt;code&amp;gt;open-xchange-gui&amp;lt;/code&amp;gt;, as the names of the OX App Suite UI packages start with &amp;lt;code&amp;gt;open-xchange-appsuite&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 # yum remove open-xchange-gui*&lt;br /&gt;
&lt;br /&gt;
Then adjust the &amp;lt;code&amp;gt;/etc/httpd/conf.d/ox.conf&amp;lt;/code&amp;gt; file to remove obsolete stuff which was required for the OX6 GUI, but is not required by the OX App Suite. To do so, you may consult the [[AppSuite:Open-Xchange_Installation_Guide_for_CentOS_6|Installation Guide for OX App Suite]] to learn which sections of the file are required for an OX App Suite UI.&lt;br /&gt;
&lt;br /&gt;
The file &amp;lt;code&amp;gt;/etc/httpd/conf.d/proxy_ajp.conf&amp;lt;/code&amp;gt; will not require adjustments; the settings for OX App Suite are a superset of the settings of the OX6 GUI.&lt;br /&gt;
&lt;br /&gt;
= Leftover configuration files and runtime data =&lt;br /&gt;
&lt;br /&gt;
After the update you may see leftover configuration files and runtime data below &amp;lt;code&amp;gt;/opt/open-xchange/etc&amp;lt;/code&amp;gt; It is safe to remove all files ending in .rpmsave or .rpmnew once you are confident that your configuration is working after the update.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=Open-Xchange_cPanel_Installation&amp;diff=13111</id>
		<title>Open-Xchange cPanel Installation</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=Open-Xchange_cPanel_Installation&amp;diff=13111"/>
		<updated>2013-03-08T05:47:15Z</updated>

		<summary type="html">&lt;p&gt;Malasa: /* Preparation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Install Open-Xchange on WHM/cPanel =&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
OXtender for cPanel requires to have WHM 11.30 and newer installed running on RHEL 5 or CentOS 5.&lt;br /&gt;
It supports Open-Xchange versions 6.20 and newer. This guide, however, describes how to setup Open-Xchange&lt;br /&gt;
Server 6.22 and above.&lt;br /&gt;
&lt;br /&gt;
== Mode of operation ==&lt;br /&gt;
&lt;br /&gt;
It is recommended to run Open-Xchange on one or more separate machines. See the &amp;quot;''Hosting Edition deployment tutorials''&amp;quot; at [[Main_Page_HESE#quickinstall]].&lt;br /&gt;
The connection between cPanel and Open-Xchange is done via some cPanel/WHM hooks and UI plugins using SOAP as communication channel. That means that SOAP must be enabled on Open-Xchange.&lt;br /&gt;
&lt;br /&gt;
[[Image:CPOX.png]]&lt;br /&gt;
&lt;br /&gt;
Once the package open-xchange-cpanel is installed on the cPanel/WHM system, every cPanel user created within WHM will be created as an admin account and context in Open-Xchange.&lt;br /&gt;
In addition, there's a single program to create all existing cPanel Accounts in Open-Xchange.&lt;br /&gt;
&lt;br /&gt;
== Availability ==&lt;br /&gt;
&lt;br /&gt;
OXtender for cPanel is available with a valid Open-Xchange Hosting Edition license. To get pricing information that meets your individual requirements, please contact Open-Xchange at [http://www.open-xchange.com/en/solutions/cpanel/shop.html http://www.open-xchange.com/en/solutions/cpanel/shop.html]&lt;br /&gt;
&lt;br /&gt;
== Known issues ==&lt;br /&gt;
&lt;br /&gt;
* If you have existing cpanel plugins that use &amp;lt;tt&amp;gt;/script&amp;lt;/tt&amp;gt; hooks (or &amp;lt;tt&amp;gt;/usr/local/cpanel/script&amp;lt;/tt&amp;gt;), as well as /usr/local/cpanel/hooks, take care to make a backup of these files because they will be replaced by the &amp;lt;tt&amp;gt;open-xchange-cpanel&amp;lt;/tt&amp;gt; rpm&lt;br /&gt;
* Users with the same email localpart from different domains in a single cPanel account and a single context do not work because user names as well as display names must be unique&lt;br /&gt;
* cPanel account names cannot be renamed when using the ox integration&lt;br /&gt;
* Error handling needs to be improved.&lt;br /&gt;
* Add-on domain handling needs to be improved&lt;br /&gt;
* Unable to indicate errors in open-xchange account creation when adding users in WHM/cPanel because the WHM/cPanel hooks have no possibility&lt;br /&gt;
* transferring cpanel users from one cpanel server to another is not supported&lt;br /&gt;
&lt;br /&gt;
==Release Notes==&lt;br /&gt;
&lt;br /&gt;
To download the Release Notes, follow this:&lt;br /&gt;
[http://software.open-xchange.com/OX6/OXtender-stable/cPanel/ Download] &lt;br /&gt;
&lt;br /&gt;
== Install and prepare Open-Xchange ==&lt;br /&gt;
&lt;br /&gt;
Follow one of the [http://oxpedia.org/index.php?title=Main_Page_HESE Open-Xchange installation guides] to install Open-Xchange and either just install the packages&lt;br /&gt;
&lt;br /&gt;
'''On OX6 with backend versions &amp;lt; 7.0.1''':&lt;br /&gt;
 open-xchange-meta-cpanel&lt;br /&gt;
&lt;br /&gt;
'''On OX6 with backend versions &amp;gt;= 7.0.1''':&lt;br /&gt;
 open-xchange-meta-cpanel open-xchange-meta-backend-ox6 open-xchange-meta-ui-ox6&lt;br /&gt;
&lt;br /&gt;
'''On OX App Suite version &amp;gt;= 7.0.1 (older versions not supported):'''&lt;br /&gt;
 open-xchange-meta-cpanel open-xchange-meta-backend-appsuite open-xchange-meta-ui-appsuite&lt;br /&gt;
&lt;br /&gt;
or take care of '''the following exceptions''':&lt;br /&gt;
&lt;br /&gt;
* Do not install the package &amp;lt;tt&amp;gt;open-xchange-mailfilter&amp;lt;/tt&amp;gt;. cPanel does not support SIEVE at the moment.&lt;br /&gt;
* Install the package &amp;lt;tt&amp;gt;open-xchange-admin-soap-reseller&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Instead of &amp;lt;tt&amp;gt;open-xchange-authentication-database&amp;lt;/tt&amp;gt;, install the package &amp;lt;tt&amp;gt;open-xchange-authentication-imap&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Important:'''&lt;br /&gt;
&lt;br /&gt;
* Do '''NOT''' create a context, just follow the installation guide up to the database registration&lt;br /&gt;
* Add the following argument to initconfigdb: &amp;lt;tt&amp;gt;--addon-sql &amp;quot;reseller.sql autocid.sql&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Preparation ==&lt;br /&gt;
&lt;br /&gt;
* run the command&lt;br /&gt;
 $ /opt/open-xchange/sbin/initrestrictions -A oxadminmaster -P secret&lt;br /&gt;
once you've finished the open-xchange installation&lt;br /&gt;
* On OX6 take care to install the packages &amp;lt;tt&amp;gt;open-xchange-gui-wizard-plugin&amp;lt;/tt&amp;gt; &amp;lt;tt&amp;gt;open-xchange-gui-wizard-plugin-gui&amp;lt;/tt&amp;gt;. The wizard must be used to enforce the user to provide a real valid displayname.&lt;br /&gt;
* On OX6 edit file &amp;lt;tt&amp;gt;/opt/open-xchange/etc/settings/open-xchange-gui-wizard-plugin.properties&amp;lt;/tt&amp;gt; and set&lt;br /&gt;
 ui/wizard/firstrunmode=true&lt;br /&gt;
* edit file &amp;lt;tt&amp;gt;/opt/open-xchange/etc/imapauth.properties&amp;lt;/tt&amp;gt; and set&lt;br /&gt;
 USE_MULTIPLE=true&lt;br /&gt;
&lt;br /&gt;
you also have to set IMAP_SERVER=&amp;lt;ip or hostname&amp;gt; to the cpanel server in the same file.&lt;br /&gt;
* edit file &amp;lt;tt&amp;gt;/opt/open-xchange/etc/mail.properties&amp;lt;/tt&amp;gt; and set&lt;br /&gt;
 com.openexchange.mail.adminMailLoginEnabled=true&lt;br /&gt;
* edit file &amp;lt;tt&amp;gt;/opt/open-xchange/etc/sessiond.properties&amp;lt;/tt&amp;gt; and set&lt;br /&gt;
 com.openexchange.sessiond.autologin=true&lt;br /&gt;
* edit file &amp;lt;tt&amp;gt;/opt/open-xchange/etc/AdminUser.properties&amp;lt;/tt&amp;gt; and set&lt;br /&gt;
 PRIMARY_MAIL_UNCHANGEABLE=false&lt;br /&gt;
* allow access from the cPanel server, edit &amp;lt;tt&amp;gt;/etc/httpd/conf.d/proxy_ajp.conf&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;Location /servlet/axis2/services&amp;gt;&lt;br /&gt;
    # restrict access to the soap provisioning API&lt;br /&gt;
    Order Deny,Allow&lt;br /&gt;
    Deny from all&lt;br /&gt;
    Allow from 127.0.0.1&lt;br /&gt;
    Allow from &amp;lt;your cpanel server ip&amp;gt;&lt;br /&gt;
    # you might add more ip addresses / networks here&lt;br /&gt;
    # Allow from 192.168 10 172.16&lt;br /&gt;
 &amp;lt;/Location&amp;gt;&lt;br /&gt;
 [...]&lt;br /&gt;
&lt;br /&gt;
== Install and prepare WHM/cPanel on CentOS5 ==&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Choose either CentOS5 or RHEL5. Nothing else is supported to integrate Open-Xchange with cPanel.&lt;br /&gt;
&lt;br /&gt;
'''Important: If you have existing cpanel plugins that use &amp;lt;tt&amp;gt;/script&amp;lt;/tt&amp;gt; hooks (or &amp;lt;tt&amp;gt;/usr/local/cpanel/script&amp;lt;/tt&amp;gt;), as well as /usr/local/cpanel/hooks, take care to make a backup of these files because they will be replaced by the &amp;lt;tt&amp;gt;open-xchange-cpanel&amp;lt;/tt&amp;gt; rpm'''&lt;br /&gt;
&lt;br /&gt;
* Follow the installation guide http://docs.cpanel.net/twiki/bin/view/AllDocumentation/InstallationGuide/Quick-StartInstallationGuide&lt;br /&gt;
* run &amp;lt;tt&amp;gt;/scripts/upcp&amp;lt;/tt&amp;gt;&lt;br /&gt;
* run &amp;lt;tt&amp;gt;/scripts/perlinstaller SOAP::Lite&amp;lt;/tt&amp;gt;&lt;br /&gt;
'''NOTE: This can take very long and it might look like it is hanging at'''&lt;br /&gt;
 We are about to install SOAP::Lite and for your convenience will provide&lt;br /&gt;
 you with list of modules and prerequisites, so you'll be able to choose&lt;br /&gt;
 only modules you need for your configuration.&lt;br /&gt;
 &lt;br /&gt;
 XMLRPC::Lite, UDDI::Lite, and XML::Parser::Lite are included by default.&lt;br /&gt;
 Installed transports can be used for both SOAP::Lite and XMLRPC::Lite.&lt;br /&gt;
 &lt;br /&gt;
 Press &amp;lt;enter&amp;gt; to see the detailed list.  &lt;br /&gt;
&lt;br /&gt;
Just be patient and wait for it to finish.&lt;br /&gt;
* add the repository http://software.open-xchange.com/OX6/OXtender-stable/cPanel/RHEL5 to your yum configuration&lt;br /&gt;
&lt;br /&gt;
'''VERY IMPORTANT:'''&lt;br /&gt;
Due to the inability of yum to correctly handle the x86_64 architecture, it is important to add the line&lt;br /&gt;
&lt;br /&gt;
 exclude=*.i386&lt;br /&gt;
&lt;br /&gt;
to your yum repo configuration (see below).&lt;br /&gt;
Check http://wiki.centos.org/FAQ/General#head-357346ff0bf7c14b0849c3bcce39677aaca528e9 for details.&lt;br /&gt;
&lt;br /&gt;
=== yum repo config on i386 ===&lt;br /&gt;
&lt;br /&gt;
 $ vi /etc/yum.repos.d/oxintegration.repo&lt;br /&gt;
 [oxcpintegration]&lt;br /&gt;
 name=Open-Xchange cPanel&lt;br /&gt;
 baseurl=http://LDBACCOUNT:LDBPASSWORD@software.open-xchange.com/OX6/OXtender-stable/cPanel/RHEL5&lt;br /&gt;
 gpgkey=http://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
&lt;br /&gt;
=== yum repo config on x86_64 ===&lt;br /&gt;
&lt;br /&gt;
 $ vi /etc/yum.repos.d/oxintegration.repo&lt;br /&gt;
 [oxcpintegration]&lt;br /&gt;
 name=Open-Xchange cPanel&lt;br /&gt;
 baseurl=http://LDBACCOUNT:LDBPASSWORD@software.open-xchange.com/OX6/OXtender-stable/cPanel/RHEL5&lt;br /&gt;
 gpgkey=http://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
 #IMPORTANT!!!!!&lt;br /&gt;
 exclude=*.i386&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* install the package &amp;lt;tt&amp;gt;open-xchange-cpanel&amp;lt;/tt&amp;gt;&lt;br /&gt;
 $ yum install open-xchange-cpanel&lt;br /&gt;
* run the installer (-h for help):&lt;br /&gt;
 $ /usr/local/cpanel/bin/oxcpanelinstall --oxurl http://ox.example.com --oxadmin-password oxadminmasterpassword&lt;br /&gt;
&lt;br /&gt;
Now your Open-Xchange server is integrated with your cPanel installation.&lt;br /&gt;
&lt;br /&gt;
To check the connection, run&lt;br /&gt;
&lt;br /&gt;
 $ /usr/local/cpanel/bin/oxcpanelenable -c&lt;br /&gt;
&lt;br /&gt;
This program can also be used to enable all existing cPanel users in OX.&lt;br /&gt;
Run&lt;br /&gt;
 $ /usr/local/cpanel/bin/oxcpanelenable -h&lt;br /&gt;
for more information.&lt;br /&gt;
&lt;br /&gt;
== Create all cPanel Accounts in Open-Xchange ==&lt;br /&gt;
&lt;br /&gt;
Like mentioned before, you must now create accounts in Open-Xchange for all your&lt;br /&gt;
existing cPanel accounts. This will not happen automatically. New accounts created in WHM, however, will automatically created in Open-Xchange.&lt;br /&gt;
&lt;br /&gt;
To create an ox account per cPanel account you can either run&lt;br /&gt;
&lt;br /&gt;
 $ /usr/local/cpanel/bin/oxcpanelenable -e&lt;br /&gt;
&lt;br /&gt;
or in the Open-Xchange WHM plugin click on every single cPanel Account and enable it.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
&lt;br /&gt;
* run the command &lt;br /&gt;
 $ sudo /usr/local/cpanel/bin/oxcpanelenable -c&lt;br /&gt;
to check Open-Xchange connection before doing anything else. It must output&lt;br /&gt;
'''connection check successfull'''&lt;br /&gt;
* All errors happening during cPanel account creation and mail account creation are logged into the files &amp;lt;tt&amp;gt;/usr/local/cpanel/logs/open-xchange_log&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/usr/local/cpanel/logs/error_log&amp;lt;/tt&amp;gt;. If something does not work, check these logs first!&lt;br /&gt;
* &amp;lt;tt&amp;gt;/usr/local/cpanel/bin/oxcpanelinstall&amp;lt;/tt&amp;gt; creates a debug output file with every execution, check its output, e.g.:&lt;br /&gt;
 $ /usr/local/cpanel/bin/oxcpanelinstall --oxurl http://myox.example.com --oxadmin-password secret&lt;br /&gt;
 running installer, please wait. Debugoutput is placed into file /tmp/cpoxinst3542.out&lt;br /&gt;
&lt;br /&gt;
= WHM OX Plugin Usage =&lt;br /&gt;
&lt;br /&gt;
To create Open-Xchange accounts, nothing else is required than to create cPanel accounts&lt;br /&gt;
as usual. Due to the design of the WHM plugin mechanism, however, it is not possible to&lt;br /&gt;
indicate any errors that might happen when creating the account in Open-Xchange fails.&lt;br /&gt;
&lt;br /&gt;
You can easily check, however, if the Open-Xchange account creation failed when you open&lt;br /&gt;
the Open-Xchange plugin which can be found in the left menu in WHM almost on the bottom.&lt;br /&gt;
&lt;br /&gt;
[[File:whm-ox-failed.png]]&lt;br /&gt;
&lt;br /&gt;
Failed attempts to create an ox accounts can be seen there because in that case, the account&lt;br /&gt;
is not enabled.&lt;br /&gt;
In such a case you need to Terminate that account and create it again after you fixed the reason for the failed attempt. Check the logs for errors.&lt;br /&gt;
&lt;br /&gt;
[[File:whm-ox-enable.png]]&lt;br /&gt;
&lt;br /&gt;
In addition you will find all relevant error messages in &amp;lt;tt&amp;gt;/usr/local/cpanel/logs/open-xchange_log&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/usr/local/cpanel/logs/error_log&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= cPanel OX Plugin Usage =&lt;br /&gt;
&lt;br /&gt;
To create email accounts in Open-Xchange, nothing else is required than to create email accounts&lt;br /&gt;
in cPanel. Due to the design of the cPanel plugin mechanism, however, it is not possible to&lt;br /&gt;
indicate any errors that might happen when creating the account in Open-Xchange fails.&lt;br /&gt;
&lt;br /&gt;
To check whether the email account creation fails, just open the Open-Xchange plugin and check&lt;br /&gt;
if the recently created email account(s) appear in the list. If not, contact your hosting provider or, if you are the owner of the machine, you will find all relevant error messages in &amp;lt;tt&amp;gt;/usr/local/cpanel/logs/open-xchange_log&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;/usr/local/cpanel/logs/error_log&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[File:cpanel-account-list.png]]&lt;br /&gt;
&lt;br /&gt;
= Running multiple WHM/cPanel instances with a single Open-Xchange instance (cluster) =&lt;br /&gt;
&lt;br /&gt;
'''Starting with version 1.0.0 Rev2''' it is possible to run multiple WHM/cPanel instances with a single Open-Xchange (cluster) installation. This, however, requires some extra management which is not part of the &amp;lt;tt&amp;gt;open-xchange-cpanel&amp;lt;/tt&amp;gt; package nor is there any other ready to use ui for that.&lt;br /&gt;
&lt;br /&gt;
The setup of the cPanel server and OXtender is the same as described in the [[Open-Xchange_cPanel_Installation#Install_and_prepare_WHM.2FcPanel_on_CentOS5|installation section]].&lt;br /&gt;
The same applies to the installation of the Open-Xchange server. Once the Open-Xchange server is installed, however, you need to create a subadmin account per WHM/cPanel server. These subadmins must be able to create further subadmin accounts (one per cPanel account).&lt;br /&gt;
&lt;br /&gt;
 $ /opt/open-xchange/sbin/createadmin -A oxadminmaster -P secret -u cpanelmaster1 -d &amp;quot;cPanel Superadmin 1&amp;quot; -p secret -a Subadmin.CanCreateSubadmin=true&lt;br /&gt;
&lt;br /&gt;
 $ /opt/open-xchange/sbin/createadmin -A oxadminmaster -P secret -u cpanelmaster2 -d &amp;quot;cPanel Superadmin 2&amp;quot; -p secret -a Subadmin.CanCreateSubadmin=true&lt;br /&gt;
&lt;br /&gt;
and so on.&lt;br /&gt;
You can also restrict the maximum number of subadmins a subadmin can create, see [[Reseller_Bundle#Open-Xchange_Reseller_package|Reseller Bundle]] description for further details.&lt;br /&gt;
&lt;br /&gt;
 $ /opt/open-xchange/sbin/listadmin -A oxadminmaster -P secret&lt;br /&gt;
 Id Name          Displayname         Parent Restrictions&lt;br /&gt;
 96 cpanelmaster1 cPanel Superadmin 1 0      Subadmin.CanCreateSubadmin=true&lt;br /&gt;
 97 cpanelmaster2 cPanel Superadmin 2 0      Subadmin.CanCreateSubadmin=true&lt;br /&gt;
&lt;br /&gt;
Now on each WHM/cPanel installation, instead of using the oxadminmaster account when running the &amp;lt;tt&amp;gt;oxcpanelinstaller&amp;lt;/tt&amp;gt;, specify the corresponding cpanel supadmin, e.g.&lt;br /&gt;
&lt;br /&gt;
 $ /usr/local/cpanel/bin/oxcpanelinstall --oxurl http://ox.example.com --oxadmin-name cpanelmaster1 --oxadmin-password secret&lt;br /&gt;
&lt;br /&gt;
and so on.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Upgrade_from_6.22_for_RHEL6&amp;diff=13039</id>
		<title>AppSuite:Upgrade from 6.22 for RHEL6</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Upgrade_from_6.22_for_RHEL6&amp;diff=13039"/>
		<updated>2013-02-27T14:36:31Z</updated>

		<summary type="html">&lt;p&gt;Malasa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Update of Open-Xchange Server v6.22 to OX App Suite 7.0 on RHEL 6. =&lt;br /&gt;
This example describes updating an OX 6 Server installation to OX App Suite 7.&lt;br /&gt;
&lt;br /&gt;
= Supported update path =&lt;br /&gt;
Updates from an OX6 installation to App Suite are only possible from 6.22 to 7.0. If you have an earlier version of Open-Xchange Server 6 installed, please update to the latest release of v6.22 before attempting an update to OX App Suite 7. See [[Open-Xchange_620_622_Update_Guide_for_RHEL6|Open-Xchange 6.20 to 6.22 Update Guide for RHEL 6]] for instructions regarding that update.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
* An Open-Xchange Server installation v6.22.0 or later. This update guide is valid for a system installed through our [[Open-Xchange_Installation_Guide_for_RHEL6_622|Download and Installation Guide for RHEL 6]]&lt;br /&gt;
* If you have custom packages done by Open-Xchange, please discuss with your Open-Xchange contact when these packages are available for OX App Suite 7. Do not attempt the update earlier.&lt;br /&gt;
* Custom packages built for 6.22.1 or earlier might not work with OX App Suite 7.0.&lt;br /&gt;
* As for every update we strongly recommend that you make a backup of your system(s) before you proceed.&lt;br /&gt;
&lt;br /&gt;
= Update Open-Xchange Repositories =&lt;br /&gt;
We start by adding the App Suite repos to our yum repos. Edit the file &amp;lt;code&amp;gt;/etc/yum.repos.d/ox.repo&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 [appsuite-frontend]&lt;br /&gt;
 name=Appsuite-frontend&lt;br /&gt;
 baseurl=http://software.open-xchange.com/products/appsuite/stable/appsuiteui/RHEL6/&lt;br /&gt;
 gpgkey=http://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
 &lt;br /&gt;
 [appsuite-backend]&lt;br /&gt;
 name=Appsuite-backend&lt;br /&gt;
 baseurl=http://software.open-xchange.com/products/appsuite/stable/backend/RHEL6/&lt;br /&gt;
 gpgkey=http://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
 &lt;br /&gt;
 [appsuite-usm]&lt;br /&gt;
 name=Appsuite-usm&lt;br /&gt;
 baseurl=http://software.open-xchange.com/products/appsuite/stable/usm/RHEL6/&lt;br /&gt;
 gpgkey=http://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
 &lt;br /&gt;
 [appsuite-eas]&lt;br /&gt;
 name=Appsuite-eas&lt;br /&gt;
 baseurl=http://software.open-xchange.com/products/appsuite/stable/mobilityconnector/RHEL6/&lt;br /&gt;
 gpgkey=http://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
&lt;br /&gt;
Verify the repos:&lt;br /&gt;
&lt;br /&gt;
 # yum repolist&lt;br /&gt;
&lt;br /&gt;
It may be necessary to&lt;br /&gt;
&lt;br /&gt;
 # yum clean all&lt;br /&gt;
&lt;br /&gt;
to make your new repos appear.&lt;br /&gt;
&lt;br /&gt;
= Updating repositories and update packages =&lt;br /&gt;
&lt;br /&gt;
Download and update all installed packages: &lt;br /&gt;
&lt;br /&gt;
 $ yum update&lt;br /&gt;
&lt;br /&gt;
This will install new config files of some packages as &amp;lt;code&amp;gt;.rpmnew&amp;lt;/code&amp;gt; files. Check those files to identlfy files where you want to keep the existing version, put the new version in place, or merge them.&lt;br /&gt;
&lt;br /&gt;
One configuration setting is to be made manually:&lt;br /&gt;
&lt;br /&gt;
 # vi /opt/open-xchange/etc/cluster.properties&lt;br /&gt;
 com.openexchange.cluster.name=oxcluster&lt;br /&gt;
&lt;br /&gt;
= Restart Open-Xchange =&lt;br /&gt;
&lt;br /&gt;
To restart Open-Xchange Server after the update, run&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange restart&lt;br /&gt;
&lt;br /&gt;
You might  want to check with&lt;br /&gt;
&lt;br /&gt;
 $ ps aux | grep open-xchange&lt;br /&gt;
&lt;br /&gt;
that there is exactly one newly spawned process running Open-Xchange Server.&lt;br /&gt;
&lt;br /&gt;
Now the backend has been upgraded to 7.0.x.  The v6.22 frontend might still work with this new backend but is *NOT*' supported up to version 6.22.1. The next version 6.22.2 is planned to be fully compatible with the 7.0.2 backend. Upon the first connection after the backend update, you will ge the message &amp;lt;code&amp;gt;Error: updating database, try later&amp;lt;/code&amp;gt;. The second try should succeed.&lt;br /&gt;
&lt;br /&gt;
= Add the App Suite UI =&lt;br /&gt;
&lt;br /&gt;
 # yum install open-xchange-appsuite open-xchange-appsuite-backend open-xchange-appsuite-manifest&lt;br /&gt;
&lt;br /&gt;
It them remains to adjust Apache's &amp;lt;code&amp;gt;ox.conf&amp;lt;/code&amp;gt; as well as &amp;lt;code&amp;gt;proxy_ajp.conf&amp;lt;/code&amp;gt;. Full sample versions of those files are given in the following.&lt;br /&gt;
&lt;br /&gt;
 # /etc/httpd/conf.d/ox.conf&lt;br /&gt;
 &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
 	ServerAdmin webmaster@localhost&lt;br /&gt;
 &lt;br /&gt;
 	DocumentRoot /var/www/html&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;Directory /var/www/html&amp;gt;&lt;br /&gt;
                Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
                AllowOverride None&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                allow from all&lt;br /&gt;
                RedirectMatch ^/$ /appsuite/&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;Directory /var/www/html/appsuite&amp;gt;&lt;br /&gt;
                Options None +SymLinksIfOwnerMatch&lt;br /&gt;
                AllowOverride Indexes FileInfo&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        ErrorLog ${APACHE_LOG_DIR}/error.log&lt;br /&gt;
 &lt;br /&gt;
        # Possible values include: debug, info, notice, warn, error, crit,&lt;br /&gt;
        # alert, emerg.&lt;br /&gt;
        LogLevel warn&lt;br /&gt;
 &lt;br /&gt;
        CustomLog ${APACHE_LOG_DIR}/access.log combined&lt;br /&gt;
 &lt;br /&gt;
        # deflate&lt;br /&gt;
       AddOutputFilterByType DEFLATE text/html text/plain text/javascript application/javascript text/css text/xml application/xml text/x-js application/x-javascript&lt;br /&gt;
 &lt;br /&gt;
 	# pre-compressed files&lt;br /&gt;
 	AddType text/javascript .jsz&lt;br /&gt;
 	AddType text/css .cssz&lt;br /&gt;
 	AddType text/xml .xmlz&lt;br /&gt;
         AddType text/plain .po&lt;br /&gt;
 	&lt;br /&gt;
 	AddEncoding gzip .jsz .cssz .xmlz&lt;br /&gt;
 	SetEnvIf Request_URI &amp;quot;\.(jsz|cssz|xmlz)$&amp;quot; no-gzip&lt;br /&gt;
 	&lt;br /&gt;
 	ExpiresActive On&lt;br /&gt;
 	&lt;br /&gt;
 	&amp;lt;Location /ox6&amp;gt;&lt;br /&gt;
 	        # Expires (via ExpiresByType to override global settings)&lt;br /&gt;
 	        ExpiresByType image/gif &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType image/png &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType image/jpg &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType image/jpeg &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/css &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/html &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/xml &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/javascript &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/x-js &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType application/x-javascript &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresDefault &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        Header append Cache-Control &amp;quot;private&amp;quot;&lt;br /&gt;
 	        Header unset Last-Modified&lt;br /&gt;
 	        Header unset Vary&lt;br /&gt;
 	        # Strip version&lt;br /&gt;
 	        RewriteEngine On&lt;br /&gt;
 	        RewriteRule v=\w+/(.+) $1 [L]&lt;br /&gt;
 	        # Turn off ETag&lt;br /&gt;
 	        Header unset ETag&lt;br /&gt;
 	        FileETag None&lt;br /&gt;
 	&amp;lt;/Location&amp;gt;&lt;br /&gt;
 	&lt;br /&gt;
 	&amp;lt;Location /ox6/ox.html&amp;gt;&lt;br /&gt;
 	        ExpiresByType text/html &amp;quot;now&amp;quot;&lt;br /&gt;
 	        ExpiresDefault &amp;quot;now&amp;quot;&lt;br /&gt;
 	        Header unset Last-Modified&lt;br /&gt;
 	        Header set Cache-Control &amp;quot;no-store, no-cache, must-revalidate, post-check=0, pre-check=0&amp;quot;&lt;br /&gt;
 	        # Turn off ETag&lt;br /&gt;
 	        Header unset ETag&lt;br /&gt;
 	        FileETag None&lt;br /&gt;
 	&amp;lt;/Location&amp;gt;&lt;br /&gt;
 	&lt;br /&gt;
 	&amp;lt;Location /ox6/index.html&amp;gt;&lt;br /&gt;
 	        ExpiresByType text/html &amp;quot;now&amp;quot;&lt;br /&gt;
 	        ExpiresDefault &amp;quot;now&amp;quot;&lt;br /&gt;
 	        Header unset Last-Modified&lt;br /&gt;
 	        Header set Cache-Control &amp;quot;no-store, no-cache, must-revalidate, post-check=0, pre-check=0&amp;quot;&lt;br /&gt;
 	        # Turn off ETag&lt;br /&gt;
 	        Header unset ETag&lt;br /&gt;
 	        FileETag None&lt;br /&gt;
 	&amp;lt;/Location&amp;gt;&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # /etc/httpd/conf.d/proxy_ajp.conf&lt;br /&gt;
 # Please note that the servlet path to the soap API has changed:&lt;br /&gt;
  &amp;lt;Location /webservices&amp;gt;&lt;br /&gt;
      # restrict access to the soap provisioning API&lt;br /&gt;
      Order Deny,Allow&lt;br /&gt;
      Deny from all&lt;br /&gt;
      Allow from 127.0.0.1&lt;br /&gt;
      # you might add more ip addresses / networks here&lt;br /&gt;
      # Allow from 192.168 10 172.16&lt;br /&gt;
  &amp;lt;/Location&amp;gt;&lt;br /&gt;
  # the old path is kept for compatibility reasons&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /servlet/axis2/services&amp;gt;&lt;br /&gt;
     # restrict access to the soap provisioning API&lt;br /&gt;
     Order Deny,Allow&lt;br /&gt;
     Deny from all&lt;br /&gt;
     Allow from 127.0.0.1&lt;br /&gt;
     # you might add more ip addresses / networks here&lt;br /&gt;
     # Allow from 192.168 10 172.16&lt;br /&gt;
 &amp;lt;/Location&amp;gt; &lt;br /&gt;
 LoadModule proxy_ajp_module modules/mod_proxy_ajp.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mod_proxy_ajp.c&amp;gt;&lt;br /&gt;
    ProxyRequests Off&lt;br /&gt;
    &amp;lt;Proxy balancer://oxcluster&amp;gt;&lt;br /&gt;
        Order deny,allow&lt;br /&gt;
        Allow from all&lt;br /&gt;
        # multiple server setups need to have the hostname inserted instead localhost&lt;br /&gt;
        BalancerMember ajp://localhost:8009 timeout=100 smax=0 ttl=60 retry=60 loadfactor=50 route=OX1&lt;br /&gt;
        # Enable and maybe add additional hosts running OX here&lt;br /&gt;
        # BalancerMember ajp://oxhost2:8009 timeout=100  smax=0 ttl=60 retry=60 loadfactor=50 route=OX2&lt;br /&gt;
        ProxySet stickysession=JSESSIONID&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    # OX AppSuite frontend&lt;br /&gt;
    &amp;lt;Proxy /appsuite/api&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/ajax&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;Proxy /ajax&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/ajax&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /servlet&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/servlet&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /infostore&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/infostore&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /publications&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/publications&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /Microsoft-Server-ActiveSync&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/Microsoft-Server-ActiveSync&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /usm-json&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/usm-json&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /webservices&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/webservices&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, stop and start the httpd and open-xchange services. Then you should be able to use the App Suite UI.&lt;br /&gt;
&lt;br /&gt;
= Remove the OX6 GUI =&lt;br /&gt;
&lt;br /&gt;
This step is optional. You may just skip it and offer both GUIs, the OX6 GUI and the App Suite UI. This will only be supported after the 6.22.2 release! &lt;br /&gt;
&lt;br /&gt;
If you want to uninstall the OX6 GUI, this step consists of removing the OX6 GUI packages and and adjusting Apache's configuration.&lt;br /&gt;
&lt;br /&gt;
The packages to be removed can be identified by their version number in the output of &amp;lt;code&amp;gt;rpm -qa | grep open-x&amp;lt;/code&amp;gt;. It will probably boil down to uninstall everything which starts with &amp;lt;code&amp;gt;open-xchange-gui&amp;lt;/code&amp;gt;, as the names of the App Suite UI packages start with &amp;lt;code&amp;gt;open-xchange-appsuite&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 # yum remove open-xchange-gui*&lt;br /&gt;
&lt;br /&gt;
Then adjust the &amp;lt;code&amp;gt;/etc/httpd/conf.d/ox.conf&amp;lt;/code&amp;gt; file to remove obsolete stuff which was required for the OX6 GUI, but is not required by the App Suite. To do so, you may consult the [[AppSuite:Open-Xchange_Installation_Guide_for_RHEL6|Installation Guide for OX App Suite]] to learn which sections of the file are required for an App Suite UI.&lt;br /&gt;
&lt;br /&gt;
The file &amp;lt;code&amp;gt;/etc/httpd/conf.d/proxy_ajp.conf&amp;lt;/code&amp;gt; will not require adjustments; the settings for App Suite are a superset of the settings of the OX6 GUI.&lt;br /&gt;
&lt;br /&gt;
= Leftover configuration files and runtime data =&lt;br /&gt;
&lt;br /&gt;
After the update you may see leftover configuration files and runtime data below &amp;lt;code&amp;gt;/opt/open-xchange/etc&amp;lt;/code&amp;gt; It is safe to remove all files ending in .rpmsave or .rpmnew once you are confident that your configuration is working after the update.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Upgrade_from_6.22_for_CentOS6&amp;diff=13038</id>
		<title>AppSuite:Upgrade from 6.22 for CentOS6</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Upgrade_from_6.22_for_CentOS6&amp;diff=13038"/>
		<updated>2013-02-27T14:35:22Z</updated>

		<summary type="html">&lt;p&gt;Malasa: wrong link for eas repo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Update of Open-Xchange Server v6.22 to OX App Suite 7.0 on CentOS 6. =&lt;br /&gt;
This example describes updating an OX 6 Server installation to OX App Suite 7.&lt;br /&gt;
&lt;br /&gt;
= Supported update path =&lt;br /&gt;
Updates from an OX6 installation to App Suite are only possible from 6.22 to 7.0. If you have an earlier version of Open-Xchange Server 6 installed, please update to the latest release of v6.22 before attempting an update to OX App Suite 7. See [[Open-Xchange_620_622_Update_Guide_for_CentOS6|Open-Xchange 6.20 to 6.22 Update Guide for CentOS 6]] for instructions regarding that update.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
* An Open-Xchange Server installation v6.22.0 or later. This update guide is valid for a system installed through our [[Open-Xchange_Installation_Guide_for_CentOS_6_622|Download and Installation Guide for CentOS 6]]&lt;br /&gt;
* If you have custom packages done by Open-Xchange, please discuss with your Open-Xchange contact when these packages are available for OX App Suite 7. Do not attempt the update earlier.&lt;br /&gt;
* Custom packages built for 6.22.1 or earlier might not work with OX App Suite 7.0.&lt;br /&gt;
* As for every update we strongly recommend that you make a backup of your system(s) before you proceed.&lt;br /&gt;
&lt;br /&gt;
= Update Open-Xchange Repositories =&lt;br /&gt;
We start by adding the App Suite repos to our yum repos. Edit the file &amp;lt;code&amp;gt;/etc/yum.repos.d/ox.repo&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 [appsuite-frontend]&lt;br /&gt;
 name=Appsuite-frontend&lt;br /&gt;
 baseurl=http://software.open-xchange.com/products/appsuite/stable/appsuiteui/RHEL6/&lt;br /&gt;
 gpgkey=http://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
 &lt;br /&gt;
 [appsuite-backend]&lt;br /&gt;
 name=Appsuite-backend&lt;br /&gt;
 baseurl=http://software.open-xchange.com/products/appsuite/stable/backend/RHEL6/&lt;br /&gt;
 gpgkey=http://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
 &lt;br /&gt;
 [appsuite-usm]&lt;br /&gt;
 name=Appsuite-usm&lt;br /&gt;
 baseurl=http://software.open-xchange.com/products/appsuite/stable/usm/RHEL6/&lt;br /&gt;
 gpgkey=http://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
 &lt;br /&gt;
 [appsuite-eas]&lt;br /&gt;
 name=Appsuite-eas&lt;br /&gt;
 baseurl=http://software.open-xchange.com/products/appsuite/stable/mobilityconnector/RHEL6/&lt;br /&gt;
 gpgkey=http://software.open-xchange.com/oxbuildkey.pub&lt;br /&gt;
 enabled=1&lt;br /&gt;
 gpgcheck=1&lt;br /&gt;
 metadata_expire=0m&lt;br /&gt;
&lt;br /&gt;
Verify the repos:&lt;br /&gt;
&lt;br /&gt;
 # yum repolist&lt;br /&gt;
&lt;br /&gt;
It may be necessary to&lt;br /&gt;
&lt;br /&gt;
 # yum clean all&lt;br /&gt;
&lt;br /&gt;
to make your new repos appear.&lt;br /&gt;
&lt;br /&gt;
= Updating repositories and update packages =&lt;br /&gt;
&lt;br /&gt;
Download and update all installed packages: &lt;br /&gt;
&lt;br /&gt;
 $ yum update&lt;br /&gt;
&lt;br /&gt;
This will install new config files of some packages as &amp;lt;code&amp;gt;.rpmnew&amp;lt;/code&amp;gt; files. Check those files to identlfy files where you want to keep the existing version, put the new version in place, or merge them.&lt;br /&gt;
&lt;br /&gt;
One configuration setting is to be made manually:&lt;br /&gt;
&lt;br /&gt;
 # vi /opt/open-xchange/etc/cluster.properties&lt;br /&gt;
 com.openexchange.cluster.name=oxcluster&lt;br /&gt;
&lt;br /&gt;
= Restart Open-Xchange =&lt;br /&gt;
&lt;br /&gt;
To restart Open-Xchange Server after the update, run&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange restart&lt;br /&gt;
&lt;br /&gt;
You might  want to check with&lt;br /&gt;
&lt;br /&gt;
 $ ps aux | grep open-xchange&lt;br /&gt;
&lt;br /&gt;
that there is exactly one newly spawned process running Open-Xchange Server.&lt;br /&gt;
&lt;br /&gt;
Now the backend has been upgraded to 7.0.x. The v6.22 frontend might still work with this new backend but is *NOT*' supported up to version 6.22.1. Upon the first connection after the backend update, you will ge tthe message &amp;lt;code&amp;gt;Error: updating database, try later&amp;lt;/code&amp;gt;. The second try should succeed.&lt;br /&gt;
&lt;br /&gt;
= Add the OX App Suite UI =&lt;br /&gt;
&lt;br /&gt;
 # yum install open-xchange-appsuite open-xchange-appsuite-backend open-xchange-appsuite-manifest&lt;br /&gt;
&lt;br /&gt;
It them remains to adjust Apache's &amp;lt;code&amp;gt;ox.conf&amp;lt;/code&amp;gt; as well as &amp;lt;code&amp;gt;proxy_ajp.conf&amp;lt;/code&amp;gt;. Full sample versions of those files are given in the following.&lt;br /&gt;
&lt;br /&gt;
 # /etc/httpd/conf.d/ox.conf&lt;br /&gt;
 &amp;lt;VirtualHost *:80&amp;gt;&lt;br /&gt;
 	ServerAdmin webmaster@localhost&lt;br /&gt;
 &lt;br /&gt;
 	DocumentRoot /var/www/html&lt;br /&gt;
 &lt;br /&gt;
        &amp;lt;Directory /var/www/html&amp;gt;&lt;br /&gt;
                Options Indexes FollowSymLinks MultiViews&lt;br /&gt;
                AllowOverride None&lt;br /&gt;
                Order allow,deny&lt;br /&gt;
                allow from all&lt;br /&gt;
                RedirectMatch ^/$ /appsuite/&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
  &lt;br /&gt;
        &amp;lt;Directory /var/www/html/appsuite&amp;gt;&lt;br /&gt;
                Options None +SymLinksIfOwnerMatch&lt;br /&gt;
                AllowOverride Indexes FileInfo&lt;br /&gt;
        &amp;lt;/Directory&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
        ErrorLog ${APACHE_LOG_DIR}/error.log&lt;br /&gt;
 &lt;br /&gt;
        # Possible values include: debug, info, notice, warn, error, crit,&lt;br /&gt;
        # alert, emerg.&lt;br /&gt;
        LogLevel warn&lt;br /&gt;
 &lt;br /&gt;
        CustomLog ${APACHE_LOG_DIR}/access.log combined&lt;br /&gt;
 &lt;br /&gt;
        # deflate&lt;br /&gt;
       AddOutputFilterByType DEFLATE text/html text/plain text/javascript application/javascript text/css text/xml application/xml text/x-js application/x-javascript&lt;br /&gt;
 &lt;br /&gt;
 	# pre-compressed files&lt;br /&gt;
 	AddType text/javascript .jsz&lt;br /&gt;
 	AddType text/css .cssz&lt;br /&gt;
 	AddType text/xml .xmlz&lt;br /&gt;
         AddType text/plain .po&lt;br /&gt;
 	&lt;br /&gt;
 	AddEncoding gzip .jsz .cssz .xmlz&lt;br /&gt;
 	SetEnvIf Request_URI &amp;quot;\.(jsz|cssz|xmlz)$&amp;quot; no-gzip&lt;br /&gt;
 	&lt;br /&gt;
 	ExpiresActive On&lt;br /&gt;
 	&lt;br /&gt;
 	&amp;lt;Location /ox6&amp;gt;&lt;br /&gt;
 	        # Expires (via ExpiresByType to override global settings)&lt;br /&gt;
 	        ExpiresByType image/gif &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType image/png &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType image/jpg &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType image/jpeg &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/css &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/html &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/xml &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/javascript &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType text/x-js &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresByType application/x-javascript &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        ExpiresDefault &amp;quot;access plus 6 months&amp;quot;&lt;br /&gt;
 	        Header append Cache-Control &amp;quot;private&amp;quot;&lt;br /&gt;
 	        Header unset Last-Modified&lt;br /&gt;
 	        Header unset Vary&lt;br /&gt;
 	        # Strip version&lt;br /&gt;
 	        RewriteEngine On&lt;br /&gt;
 	        RewriteRule v=\w+/(.+) $1 [L]&lt;br /&gt;
 	        # Turn off ETag&lt;br /&gt;
 	        Header unset ETag&lt;br /&gt;
 	        FileETag None&lt;br /&gt;
 	&amp;lt;/Location&amp;gt;&lt;br /&gt;
 	&lt;br /&gt;
 	&amp;lt;Location /ox6/ox.html&amp;gt;&lt;br /&gt;
 	        ExpiresByType text/html &amp;quot;now&amp;quot;&lt;br /&gt;
 	        ExpiresDefault &amp;quot;now&amp;quot;&lt;br /&gt;
 	        Header unset Last-Modified&lt;br /&gt;
 	        Header set Cache-Control &amp;quot;no-store, no-cache, must-revalidate, post-check=0, pre-check=0&amp;quot;&lt;br /&gt;
 	        # Turn off ETag&lt;br /&gt;
 	        Header unset ETag&lt;br /&gt;
 	        FileETag None&lt;br /&gt;
 	&amp;lt;/Location&amp;gt;&lt;br /&gt;
 	&lt;br /&gt;
 	&amp;lt;Location /ox6/index.html&amp;gt;&lt;br /&gt;
 	        ExpiresByType text/html &amp;quot;now&amp;quot;&lt;br /&gt;
 	        ExpiresDefault &amp;quot;now&amp;quot;&lt;br /&gt;
 	        Header unset Last-Modified&lt;br /&gt;
 	        Header set Cache-Control &amp;quot;no-store, no-cache, must-revalidate, post-check=0, pre-check=0&amp;quot;&lt;br /&gt;
 	        # Turn off ETag&lt;br /&gt;
 	        Header unset ETag&lt;br /&gt;
 	        FileETag None&lt;br /&gt;
 	&amp;lt;/Location&amp;gt;&lt;br /&gt;
 &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 # /etc/httpd/conf.d/proxy_ajp.conf&lt;br /&gt;
 # Please note that the servlet path to the soap API has changed:&lt;br /&gt;
  &amp;lt;Location /webservices&amp;gt;&lt;br /&gt;
      # restrict access to the soap provisioning API&lt;br /&gt;
      Order Deny,Allow&lt;br /&gt;
      Deny from all&lt;br /&gt;
      Allow from 127.0.0.1&lt;br /&gt;
      # you might add more ip addresses / networks here&lt;br /&gt;
      # Allow from 192.168 10 172.16&lt;br /&gt;
  &amp;lt;/Location&amp;gt;&lt;br /&gt;
  # the old path is kept for compatibility reasons&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;Location /servlet/axis2/services&amp;gt;&lt;br /&gt;
     # restrict access to the soap provisioning API&lt;br /&gt;
     Order Deny,Allow&lt;br /&gt;
     Deny from all&lt;br /&gt;
     Allow from 127.0.0.1&lt;br /&gt;
     # you might add more ip addresses / networks here&lt;br /&gt;
     # Allow from 192.168 10 172.16&lt;br /&gt;
 &amp;lt;/Location&amp;gt; &lt;br /&gt;
 LoadModule proxy_ajp_module modules/mod_proxy_ajp.so&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;IfModule mod_proxy_ajp.c&amp;gt;&lt;br /&gt;
    ProxyRequests Off&lt;br /&gt;
    &amp;lt;Proxy balancer://oxcluster&amp;gt;&lt;br /&gt;
        Order deny,allow&lt;br /&gt;
        Allow from all&lt;br /&gt;
        # multiple server setups need to have the hostname inserted instead localhost&lt;br /&gt;
        BalancerMember ajp://localhost:8009 timeout=100 smax=0 ttl=60 retry=60 loadfactor=50 route=OX1&lt;br /&gt;
        # Enable and maybe add additional hosts running OX here&lt;br /&gt;
        # BalancerMember ajp://oxhost2:8009 timeout=100  smax=0 ttl=60 retry=60 loadfactor=50 route=OX2&lt;br /&gt;
        ProxySet stickysession=JSESSIONID&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    # OX AppSuite frontend&lt;br /&gt;
    &amp;lt;Proxy /appsuite/api&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/ajax&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
    &amp;lt;Proxy /ajax&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/ajax&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /servlet&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/servlet&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /infostore&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/infostore&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /publications&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/publications&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /Microsoft-Server-ActiveSync&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/Microsoft-Server-ActiveSync&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /usm-json&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/usm-json&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
    &amp;lt;Proxy /webservices&amp;gt;&lt;br /&gt;
        ProxyPass balancer://oxcluster/webservices&lt;br /&gt;
    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;
 &amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, stop and start the httpd and open-xchange services. Then you should be able to use the App Suite UI.&lt;br /&gt;
&lt;br /&gt;
= Remove the OX6 GUI =&lt;br /&gt;
&lt;br /&gt;
This step is optional. You may just skip it and offer both GUIs, the OX6 GUI and the OX App Suite UI. This will only be supported after the 6.22.2 release! &lt;br /&gt;
&lt;br /&gt;
If you want to uninstall the OX6 GUI, this step consists of removing the OX6 GUI packages and and adjusting Apache's configuration.&lt;br /&gt;
&lt;br /&gt;
The packages to be removed can be identified by their version number in the output of &amp;lt;code&amp;gt;rpm -qa | grep open-x&amp;lt;/code&amp;gt;. It will probably boil down to uninstall everything which starts with &amp;lt;code&amp;gt;open-xchange-gui&amp;lt;/code&amp;gt;, as the names of the OX App Suite UI packages start with &amp;lt;code&amp;gt;open-xchange-appsuite&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
 # yum remove open-xchange-gui*&lt;br /&gt;
&lt;br /&gt;
Then adjust the &amp;lt;code&amp;gt;/etc/httpd/conf.d/ox.conf&amp;lt;/code&amp;gt; file to remove obsolete stuff which was required for the OX6 GUI, but is not required by the OX App Suite. To do so, you may consult the [[AppSuite:Open-Xchange_Installation_Guide_for_CentOS_6|Installation Guide for OX App Suite]] to learn which sections of the file are required for an OX App Suite UI.&lt;br /&gt;
&lt;br /&gt;
The file &amp;lt;code&amp;gt;/etc/httpd/conf.d/proxy_ajp.conf&amp;lt;/code&amp;gt; will not require adjustments; the settings for OX App Suite are a superset of the settings of the OX6 GUI.&lt;br /&gt;
&lt;br /&gt;
= Leftover configuration files and runtime data =&lt;br /&gt;
&lt;br /&gt;
After the update you may see leftover configuration files and runtime data below &amp;lt;code&amp;gt;/opt/open-xchange/etc&amp;lt;/code&amp;gt; It is safe to remove all files ending in .rpmsave or .rpmnew once you are confident that your configuration is working after the update.&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:DocumentConverterAPIInstall&amp;diff=13025</id>
		<title>AppSuite:DocumentConverterAPIInstall</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:DocumentConverterAPIInstall&amp;diff=13025"/>
		<updated>2013-02-26T10:58:02Z</updated>

		<summary type="html">&lt;p&gt;Malasa: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{InstallPlugin|pluginname=open-xchange-documentconverter-api|toplevel=products|sopath=appsuite/stable/documentconverter-api|version=App Suite|reponame=documentconverter-api}}&lt;/div&gt;</summary>
		<author><name>Malasa</name></author>
	</entry>
</feed>