<?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=Thorben</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=Thorben"/>
	<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=Special:Contributions/Thorben"/>
	<updated>2026-06-30T21:44:30Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=25238</id>
		<title>AppSuite:Running a cluster</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=25238"/>
		<updated>2020-01-30T14:04:57Z</updated>

		<summary type="html">&lt;p&gt;Thorben: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Running a cluster&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please refer to https://documentation.open-xchange.com/latest/middleware/administration/running_a_cluster.html for an up-to-date version of this article&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Concepts =&lt;br /&gt;
&lt;br /&gt;
For inter-OX-communication over the network, multiple Open-Xchange servers can form a cluster. This brings different advantages regarding distribution and caching of volatile data, load balancing, scalability, fail-safety and robustness. Additionally, it provides the infrastructure for upcoming features of the Open-Xchange server. &lt;br /&gt;
The clustering capabilities of the Open-Xchange server are mainly built up on [http://hazelcast.com Hazelcast], an open source clustering and highly scalable data distribution platform for Java. The following article provides an overview about the current featureset and configuration options.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
&lt;br /&gt;
== Synchronized system clock times ==&lt;br /&gt;
It is crucial that all involved members in a cluster do have their system clock times in sync with each other; e.g. by using an NTP service.&lt;br /&gt;
&lt;br /&gt;
== HTTP routing ==&lt;br /&gt;
An OX cluster is always part of a larger picture. Usually there is front level loadbalancer as central HTTPS entry point to the platform. This loadbalancer optionally performs HTTPS termination and forwards HTTP(S) requests to webservers (the usual and only supported choice as of now is Apache). These webservers are performing HTTPS termination (if this is not happening on the loadbalancer) and serve static content, and (which is what is relevant for our discussion here) they forward dynamic requests to the OX backends.&lt;br /&gt;
&lt;br /&gt;
A central requirement for the interaction of these components (loadbalancer, webservers, OX nodes) is that we have session stability based on the JSESSIONID cookie / jsessionid path component suffix. This means that our application sets a cookie named JSESSIONID which has a value like &amp;lt;large decimal number&amp;gt;.&amp;lt;route identifier&amp;gt;, e.g. &amp;quot;5661584529655240315.OX1&amp;quot;. The route identifier here (&amp;quot;OX1&amp;quot; in this example) is taken by the OX node from a configuration setting from a config file and is specific to one OX node. HTTP routing must happen such that HTTP requests with a cookie with such a suffix always end up the corresponding OX node. There are furthermore specific circumstances when passing this information via cookie is not possible. Then the JSESSIONID is transferred in a path component as &amp;quot;jsessionid=...&amp;quot; in the HTTP request. The routing mechanism needs to take that into account also.&lt;br /&gt;
&lt;br /&gt;
There are mainly two options to implement this. If the Apache processes are running co-located on the same machines running the OX groupware processes, it is often desired to have the front level loadbalancer perform HTTP routing to the correct machines. If dedicated Apache nodes are employed, is is usually sufficient to have the front-level loadbalancer do HTTP routing to the Apache nodes in a round-robin fashion and perform routing to the correct OX nodes in the Apache nodes.&lt;br /&gt;
&lt;br /&gt;
We provide sample configuration files to configure Apache (with mod_proxy_http) to perform HTTP routing correctly in our guides on OXpedia, e.g. [[AppSuite:Main_Page_AppSuite#quickinstall]]. Central elements are the directives &amp;quot;ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&amp;quot; in conjunction with the &amp;quot;route=OX1&amp;quot; parameters to the BalancerMember lines in the Proxy definition. This is valid for Apache 2.2 as of Sep-2014.&lt;br /&gt;
&lt;br /&gt;
How to configure a front level loadbalancer to perform HTTP equivalent HTTP routing is dependent on the specific loadbalancer implementation. If Apache is used as front level loadbalancer, the same configuration as discussed in the previous section can be employed. As of time of writing this text (Sep 2014), the alternative choices are thin. F5 BigIP is reported to be able to implement &amp;quot;jsessionid based persistence using iRules&amp;quot;. nginx has the functionality in their commercial &amp;quot;nginx plus&amp;quot; product. (Both of these options have not been tested by OX.) Other loadbalancers with this functionality are not known to us.&lt;br /&gt;
&lt;br /&gt;
If the front level loadbalancer is not capable of performing correct HTTP routing, is is required to configure correct HTTP routing on Apache level, even if Apache runs co-located on the OX nodes and thus cross-routing happens.&lt;br /&gt;
&lt;br /&gt;
There are several reasons why we require session stability in exactly this way. We require session stability for horizontal scale-out; while we support transparent resuming / migration of user sessions in the OX cluster without need for users to re-authenticate, sessions wandering around randomly will consume a fixed amount resources corresponding to a running session on each OX node in the cluster, while a session sticky to one OX node will consume this fixed amount of resources only on one OX node. Furthermore there are mechanisms in OX like TokenLogin which work only of all requests belonging to one sequence get routed to the same OX node even if they stem from different machines with different IPs. Only the JSESSIONID (which in this case is transferred as jsessionid path component, as cookies do not work during a 302 redirect, which is part of this sequence) carries the required information where the request must be routed to.&lt;br /&gt;
&lt;br /&gt;
Usual &amp;quot;routing based on cookie hash&amp;quot; is not sufficient here since it disregards the information which machine originally issued the cookie. It only ensures that the session will be sticky to any target, which statistically will not be the same machine that issued the cookie. OX will then set a new JSESSIONID cookie, assuming the session had been migrated. The loadbalancer will then route the session to a different target, as the hash of the cookie will differ. This procedure then happens iteratively until by chance the routing based on cookie hash will route the session to the correct target. By then, a lot of resources will have been wasted, by creating full (short-term) sessions on all OX nodes. Furthermore, processes like TokenLogin will not work this way.&lt;br /&gt;
&lt;br /&gt;
== Same Packages ==&lt;br /&gt;
&lt;br /&gt;
All middleware nodes participating in the Hazelcast cluster need to have the same ''open-xchange-*'' packages installed, so that all dynamically injected class definitions are available during (de-)erialization on all nodes. So for example, even if a node does not serve requests from the web client, it still requires the realtime packages for collaborative document editing or the packages for the distributed session storage being installed.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
All settings regarding cluster setup are located in the configuration file ''hazelcast.properties''. The former used additional files ''cluster.properties'', ''mdns.properties'' and ''static-cluster-discovery.properties'' are no longer needed. The following gives an overview about the most important settings - please refer to the inline documentation of the configuration file for more advanced options.&lt;br /&gt;
&lt;br /&gt;
Note: The configuration guide targets v7.4.0 of the OX server (and above). For older versions, please consult the history of this page. A full list of Hazelcast-related properties is available at https://documentation.open-xchange.com/components/middleware/config/7.8.4/#mode=features&amp;amp;feature=Hazelcast .&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
To restrict access to the cluster and to separate the cluster from others in the local network, a group name needs to be defined. Up to v7.10.2, an additional group password, configurable via ''com.openexchange.hazelcast.group.password'' was used. Only backend nodes having the same values for those properties are able to join and form a cluster. &lt;br /&gt;
&lt;br /&gt;
 # Configures the name of the cluster. Only nodes using the same group name &lt;br /&gt;
 # will join each other and form the cluster. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is not &amp;quot;empty&amp;quot; (see below).&lt;br /&gt;
 com.openexchange.hazelcast.group.name=&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Network ==&lt;br /&gt;
&lt;br /&gt;
It's required to define the network interface that is used for cluster communication via ''com.openexchange.hazelcast.network.interfaces''. By default, the interface is restricted to the local loopback address only. To allow the same configuration amongst all nodes in the cluster, it's recommended to define the value using a wildcard matching the IP addresses of all nodes participating in the cluster, e.g. ''192.168.0.*''&lt;br /&gt;
&lt;br /&gt;
 # Comma-separated list of interface addresses hazelcast should use. Wildcards &lt;br /&gt;
 # (*) and ranges (-) can be used. Leave blank to listen on all interfaces&lt;br /&gt;
 # Especially in server environments with multiple network interfaces, it's &lt;br /&gt;
 # recommended to specify the IP-address of the network interface to bind to &lt;br /&gt;
 # explicitly. Defaults to &amp;quot;127.0.0.1&amp;quot; (local loopback only), needs to be &lt;br /&gt;
 # adjusted when building a cluster of multiple backend nodes.&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=127.0.0.1&lt;br /&gt;
&lt;br /&gt;
To form a cluster of multiple OX server nodes, different discovery mechanisms can be used. The discovery mechanism is specified via the property ''com.openexchange.hazelcast.network.join'':&lt;br /&gt;
&lt;br /&gt;
 # Specifies which mechanism is used to discover other backend nodes in the&lt;br /&gt;
 # cluster. Possible values are &amp;quot;empty&amp;quot; (no discovery for single-node setups),&lt;br /&gt;
 # &amp;quot;static&amp;quot; (fixed set of cluster member nodes), &amp;quot;multicast&amp;quot; (automatic discovery&lt;br /&gt;
 # of other nodes via multicast) or &amp;quot;dns&amp;quot; to consult a DNS server to resolve the&lt;br /&gt;
 # domain names to the most recent set of IP addresses of all service nodes.&lt;br /&gt;
 # Defaults to &amp;quot;empty&amp;quot;. Depending on the specified value, further configuration&lt;br /&gt;
 # might be needed; see &amp;quot;Networking&amp;quot; section below.&lt;br /&gt;
 com.openexchange.hazelcast.network.join=empty&lt;br /&gt;
&lt;br /&gt;
Generally, it's advised to use the same network join mechanism for all nodes in the cluster, and, in most cases, it's strongly recommended to use a ''static'' network join configuration. This will allow the nodes to join the cluster directly upon startup. With a ''multicast'' based setup, nodes will merge to an existing cluster possibly at some later time, thus not being able to access the distributed data until they've joined.&lt;br /&gt;
&lt;br /&gt;
Depending on the network join setting, further configuration may be necessary, as described in the following paragraphs.&lt;br /&gt;
&lt;br /&gt;
=== empty ===&lt;br /&gt;
&lt;br /&gt;
When using the default value ''empty'', no other nodes are discovered in the cluster. This value is suitable for single-node installations. Note that other nodes that are configured to use other network join mechanisms may be still able to still to connect to this node, e.g. using a ''static'' network join, having the IP address of this host in the list of potential cluster members (see below).&lt;br /&gt;
&lt;br /&gt;
=== static ===&lt;br /&gt;
&lt;br /&gt;
The most common setting for ''com.openexchange.hazelcast.network.join'' is ''static''. A static cluster discovery uses a fixed list of IP addresses of the nodes in the cluster. During startup and after a specific interval, the underlying Hazelcast library probes for not yet joined nodes from this list and adds them to the cluster automatically. The address list is configured via ''com.openexchange.hazelcast.network.join.static.nodes'':&lt;br /&gt;
&lt;br /&gt;
 # Configures a comma-separated list of IP addresses / hostnames of possible &lt;br /&gt;
 # nodes in the cluster, e.g. &amp;quot;10.20.30.12, 10.20.30.13:5701, 192.178.168.110&amp;quot;.&lt;br /&gt;
 # Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;static&amp;quot;. &lt;br /&gt;
 # It doesn't hurt if the address of the local host appears in the list, so &lt;br /&gt;
 # that it's still possible to use the same list throughout all nodes in the &lt;br /&gt;
 # cluster.&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=&lt;br /&gt;
&lt;br /&gt;
For a fixed set of backend nodes, it's recommended to simply include the IP addresses of all nodes in the list, and use the same configuration for each node. However, it's only required to add the address of at least one other node in the cluster to allow the node to join the cluster. Also, when adding a new node to the cluster and this list is extended accordingly, existing nodes don't need to be shut down to recognize the new node, as long as the new node's address list contains at least one of the already running nodes. &lt;br /&gt;
&lt;br /&gt;
=== multicast ===&lt;br /&gt;
&lt;br /&gt;
For highly dynamic setups where nodes are added and removed from the cluster quite often and/or the host's IP addresses are not fixed, it's also possible to configure the network join via multicast. During startup and after a specific interval, the backend nodes initiate the multicast join process automatically, and discovered nodes form or join the cluster afterwards. The multicast group and port can be configured as follows:&lt;br /&gt;
&lt;br /&gt;
 # Configures the multicast address used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. If the nodes reside in different subnets, please ensure that &lt;br /&gt;
 # multicast is enabled between the subnets. Defaults to &amp;quot;224.2.2.3&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.group=224.2.2.3&lt;br /&gt;
 &lt;br /&gt;
 # Configures the multicast port used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. Defaults to &amp;quot;54327&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.port=54327&lt;br /&gt;
&lt;br /&gt;
=== dns ===&lt;br /&gt;
&lt;br /&gt;
A very common approach for service discovery in cloud environments is to use plain old DNS. Any service, consisting of a varying number of elastic nodes, would get its own domain name. Against a certain DNS server, this name always resolves to the most recent set of IP addresses of all service nodes.&lt;br /&gt;
&lt;br /&gt;
 # The comma-separated list of domain names that are supposed to be resolved to a&lt;br /&gt;
 # (super-)set of host addresses through a DNS look-up.&lt;br /&gt;
 # Only effective if property &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;dns&amp;quot;&lt;br /&gt;
 com.openexchange.hazelcast.network.join.dns.domainNames=&lt;br /&gt;
&lt;br /&gt;
 # The optional host name for the DNS server. If not specified system's default DNS service is used.&lt;br /&gt;
 # Only effective if property &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;dns&amp;quot;&lt;br /&gt;
 com.openexchange.hazelcast.network.join.dns.resolverHost=&lt;br /&gt;
&lt;br /&gt;
 # The optional port number for the DNS server. If not specified default port (53 UDP) is used.&lt;br /&gt;
 # Only effective if property &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;dns&amp;quot;&lt;br /&gt;
 com.openexchange.hazelcast.network.join.dns.resolverPort=53&lt;br /&gt;
&lt;br /&gt;
 # The refrsh rate in milliseconds when a new DNS look-up is supported to be performed to&lt;br /&gt;
 # apply possibly changed members to Hazelcast network configuration.&lt;br /&gt;
 # Only effective if property &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;dns&amp;quot;&lt;br /&gt;
 com.openexchange.hazelcast.network.join.dns.refreshMillis=60000&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The following example shows how a simple cluster named ''MyCluster'' consisting of 4 backend nodes can be configured using ''static'' cluster discovery. The node's IP addresses are 10.0.0.15, 10.0.0.16, 10.0.0.17 and 10.0.0.18. Note that the same ''hazelcast.properties'' is used by all nodes.&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.group.name=MyCluster&lt;br /&gt;
 com.openexchange.hazelcast.network.join=static&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=10.0.0.15,10.0.0.16,10.0.0.17,10.0.0.18&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=10.0.0.*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Advanced Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Lite Members (available since v7.8.4) ===&lt;br /&gt;
&lt;br /&gt;
Lite members in a Hazelcast cluster are members that do not hold any data partitions, i.e. all read- and write operations to distributed maps are delegated to non-lite (&amp;quot;full&amp;quot;) members. Apart from not having data partitions, lite members participate in the same way as other members: they can register listeners for distributed topics (e.g. cache invalidation events) or can be addressed for task execution (e.g. during realtime communication). &lt;br /&gt;
&lt;br /&gt;
Similar to using a custom partitioning scheme, separating the nodes of a large cluster into few &amp;quot;full&amp;quot; members and many &amp;quot;lite&amp;quot; members helps to minimize the impact of JVM activities from a single node (mainly the garbage collector) on the whole cluster communication. Additionally, when starting or stopping lite members, no repartitioning of the distributed cluster data needs to be performed, which significantly decreases the node's startup- and shutdown time and reduces the necessary network communication to a minimum. &lt;br /&gt;
&lt;br /&gt;
In medium or larger sized clusters, it is sufficient to have roughly 10 to 20 percent of the nodes configured as &amp;quot;full&amp;quot; members, while all other ones can be started as &amp;quot;lite&amp;quot; member nodes. Additionally, please note that the configured backup count in the map configurations should always be smaller than the total number of &amp;quot;full&amp;quot; members, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of &amp;quot;full&amp;quot; members is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
The configured &amp;quot;full&amp;quot; members should preferably not be used to serve client requests (by not adding them as endpoint in the loadbalancer), to ensure they are always responsive. Also, shutdown and startups of those &amp;quot;full&amp;quot; members should be reduced to a minimum to avoid repartitioning operations. &lt;br /&gt;
&lt;br /&gt;
More general information regarding lite members is available at http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#enabling-lite-members .&lt;br /&gt;
&lt;br /&gt;
To configure a node as &amp;quot;lite&amp;quot; member, the following configuration should be applied in the node's ''hazelcast.properties'' file:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.liteMember=true&lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list all &amp;quot;full&amp;quot; member nodes here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
=== Custom Partitioning ===&lt;br /&gt;
&lt;br /&gt;
Note: Starting with v7.8.4, &amp;quot;Lite Members&amp;quot; should be used in favor of applying a custom partitioning scheme.&lt;br /&gt;
&lt;br /&gt;
While originally being designed to separate the nodes holding distributed data into different risk groups for increased fail safety, a custom partitioning strategy may also be used to distinguish between nodes holding distributed data from those who should not. &lt;br /&gt;
&lt;br /&gt;
This approach of custom partitioning may be used in a OX cluster, where usually different backend nodes serve different purposes. A common scenario is that there are nodes handling requests from the web interfaces, and others being responsible for USM/EAS traffic. Due to their nature of processing large chunks of synchronization data in memory, the USM/EAS nodes may encounter small delays when the Java garbage collector kicks in and suspends the Java Virtual Machine. Since those delays may also have an influence on hazelcast-based communication in the cluster, the idea is to instruct hazelcast to not store distributed data on that nodes. This is where a custom partitioning scheme comes into play.&lt;br /&gt;
&lt;br /&gt;
To setup a custom partitioning scheme in the cluster, an additional ''hazelcast.xml'' configuration file is used, which should be placed into the ''hazelcast'' subdirectory of the OX configuration folder, usually at ''/opt/openexchange/etc/hazelcast''. Please note that it's vital that each node in the cluster is configured equally here, so the same ''hazelcast.xml'' file should be copied to each server. The configuration read from there is used as basis for all further settings that are taken from the ordinary ''hazelcast.properties'' config file. &lt;br /&gt;
&lt;br /&gt;
To setup a custom partitioning scheme, the partition groups must be defined in the ''hazelcast.xml'' file. See the following file for an example configuration, where the three nodes ''10.10.10.60'', ''10.10.10.61'' and ''10.10.10.62'' are defined to form an own partitioning group each. Doing so, all distributed data will be stored at one of those nodes physically, while the corresponding backup data (if configured) at one of the other two nodes. All other nodes in the cluster will not be used to store distributed data, but will still be &amp;quot;full&amp;quot; hazelcast members, which is necessary for other cluster-wide operations the OX backends use. &lt;br /&gt;
&lt;br /&gt;
Please note that the configured backup count in the map configurations should be smaller than the number of nodes here, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of nodes to define in the partition group sections is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!--&lt;br /&gt;
   ~ Copyright (c) 2008-2013, Hazelcast, Inc. All Rights Reserved.&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
   ~ you may not use this file except in compliance with the License.&lt;br /&gt;
   ~ You may obtain a copy of the License at&lt;br /&gt;
   ~&lt;br /&gt;
   ~ http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
   ~ distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
   ~ See the License for the specific language governing permissions and&lt;br /&gt;
   ~ limitations under the License.&lt;br /&gt;
   --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;hazelcast xsi:schemaLocation=&amp;quot;http://www.hazelcast.com/schema/config hazelcast-config-3.1.xsd&amp;quot;&lt;br /&gt;
            xmlns=&amp;quot;http://www.hazelcast.com/schema/config&amp;quot;&lt;br /&gt;
            xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;partition-group enabled=&amp;quot;true&amp;quot; group-type=&amp;quot;CUSTOM&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.60&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.61&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.62&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
     &amp;lt;/partition-group&amp;gt;&lt;br /&gt;
 &amp;lt;/hazelcast&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More general information regarding custom partioning is available at http://hazelcast.org/docs/latest/manual/html/partitiongroupconfig.html . &lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list same the nodes that are also configured in the parition groups here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
After configuring a custom partitioning scheme, the data distribution may be verified, e.g. by inspecting the MBeans of the distributed maps via JMX.&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about different features that were implemented using the new cluster capabilities.&lt;br /&gt;
&lt;br /&gt;
== Distributed Session Storage ==&lt;br /&gt;
&lt;br /&gt;
Previously, when an Open-Xchange server was shutdown for maintenance, all user sessions that were bound to that machine were lost, i.e. the users needed to login again. With the distributed session storage, all sessions are backed by a distributed map in the cluster, so that they are no longer bound to a specific node in the cluster. When a node is shut down, the session data is still available in the cluster and can be accessed from the remaining nodes. The load-balancing techniques of the webserver then seamlessly routes the user session to another node, with no ''session expired'' errors. The distributed session storage comes with the package ''open-xchange-sessionstorage-hazelcast''. It's recommended to install this optional package in all clustered environments with multiple groupware server nodes.&lt;br /&gt;
&lt;br /&gt;
'''Notes:''' &lt;br /&gt;
* While there's some kind of built-in session distribution among the nodes in the cluster, this should not be seen as a replacement for session-stickiness between the loadbalancer and groupware nodes, i.e. one should still configure the webserver to use sticky sessions for performance reasons.&lt;br /&gt;
* The distributed session storage is still an in-memory storage. While the session data is distributed and backed up on multiple nodes in the cluster, shutting down multiple or all nodes at the same time will lead to loss of the the distributed data. To avoid such data loss when shutting down a node, please follow the guidelines at [[ Updating_a_Cluster ]].&lt;br /&gt;
&lt;br /&gt;
Depending on the cluster infrastructure, different backup-count configuration options might be set for the distributed session storage in the map configuration file ''sessions.properties'' in the ''hazelcast'' subdirectory:&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.backupCount=1&lt;br /&gt;
&lt;br /&gt;
The ''backupcount'' property configures the number of nodes with synchronized backups. Synchronized backups block operations until backups are successfully copied and acknowledgements are received. If 1 is set as the backup-count for example, then all entries of the map will be copied to another JVM for fail-safety. 0 means no backup. Any integer between 0 and 6. Default is 1, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.asyncBackupCount=0&lt;br /&gt;
&lt;br /&gt;
The ''asyncbackup'' property configures the number of nodes with async backups. Async backups do not block operations and do not require acknowledgements. 0 means no backup. Any integer between 0 and 6. Default is 0, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
Since session data is backed up by default continuously by multiple nodes in the cluster, the steps described in [[ Session_Migration ]] to trigger session migration to other nodes explicitly is obsolete and no longer needed with the distributed session storage.&lt;br /&gt;
&lt;br /&gt;
Normally, sessions in the distributed storages are not evicted automatically, but are only removed when they're also removed from the session handler, either due to a logout operation or when exceeding the long-term session lifetime as configured by ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''. Under certain circumstances, i.e. the session is no longer accessed by the client and the OX node hosting the session in it's long-life container being shutdown, the remove operation from the distributed storage might not be triggered. Therefore, additionally a maximum idle time of map-entries can be configured for the distributed sessions map via &lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.configuration.map.maxIdleSeconds=640000&lt;br /&gt;
&lt;br /&gt;
To avoid unnecessary eviction, the value should be higher than the configured ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''.&lt;br /&gt;
&lt;br /&gt;
== Remote Cache Invalidation ==&lt;br /&gt;
&lt;br /&gt;
For faster access, groupware data is held in different caches by the server. Formerly, the caches utilized the TCP Lateral Auxiliary Cache plug in (LTCP) for the underlying JCS caches to broadcast updates and removals to caches on other OX nodes in the cluster. This could potentially lead to problems when remote invalidation was not working reliably due to network discovery problems. As an alternative, remote cache invalidation can also be performed using reliable publish/subscribe events built up on Hazelcast topics. This can be configured in the ''cache.properties'' configuration file, where the 'eventInvalidation' property can either be set to 'false' for the legacy behavior or 'true' for the new mechanism:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.caching.jcs.eventInvalidation=true&lt;br /&gt;
&lt;br /&gt;
All nodes participating in the cluster should be configured equally.&lt;br /&gt;
&lt;br /&gt;
Internally, if ''com.openexchange.caching.jcs.eventInvalidation'' is set to ''true'', LTCP is disabled in JCS caches. Instead, an internal mechanism based on distributed Hazelcast event topics is used to invalidate data throughout all nodes in the cluster after local update- and remove-operations. Put-operations aren't propagated (and haven't been with LTCP either), since all data put into caches can be locally loaded/evaluated at each node from the persistent storage layer.&lt;br /&gt;
&lt;br /&gt;
Using Hazelcast-based cache invalidation also makes further configuration of the JCS auxiliaries obsolete in the ''cache.ccf'' configuration file. In that case, all ''jcs.auxiliary.LTCP.*'' configuration settings are virtually ignored. However, it's still required to mark caches that require cluster-wide invalidation via ''jcs.region.&amp;lt;cache_name&amp;gt;=LTCP'', just as before. So basically, when using the new default setting ''com.openexchange.caching.jcs.eventInvalidation=true'', it's recommended to just use the stock ''cache.ccf'' file, since no further LTCP configuration is required.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
= Adminstration / Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Configuration ==&lt;br /&gt;
&lt;br /&gt;
The underlying Hazelcast library can be configured using the file ''hazelcast.properties''.&lt;br /&gt;
&lt;br /&gt;
'''Important''':&amp;lt;br&amp;gt;&lt;br /&gt;
By default property ''com.openexchange.hazelcast.network.interfaces'' is set to ''127.0.0.1''; meaning Hazelcast listens only to loop-back device. To build a cluster among remote nodes the appropriate network interface needs to be configured there. Leaving that property empty lets Hazelcast listen to all available network interfaces.&lt;br /&gt;
&lt;br /&gt;
The Hazelcast JMX MBean can be enabled or disabled with the property ''com.openexchange.hazelcast.jmx''. The properties ''com.openexchange.hazelcast.mergeFirstRunDelay'' and ''com.openexchange.hazelcast.mergeRunDelay'' control the run intervals of the so-called ''Split Brain Handler'' of Hazelcast that initiates the cluster join process when a new node is started. More details can be found at http://www.hazelcast.com/docs/2.5/manual/single_html/#NetworkPartitioning. &lt;br /&gt;
&lt;br /&gt;
The port ranges used by Hazelcast for incoming and outgoing connections can be controlled via the configuration parameters ''com.openexchange.hazelcast.networkConfig.port'', ''com.openexchange.hazelcast.networkConfig.portAutoIncrement'' and ''com.openexchange.hazelcast.networkConfig.outboundPortDefinitions''.&lt;br /&gt;
&lt;br /&gt;
== Commandline Tool ==&lt;br /&gt;
&lt;br /&gt;
To print out statistics about the cluster and the distributed data, the ''showruntimestats'' commandline tool can be executed with the ''clusterstats'' ('c') argument. This provides an overview about the runtime cluster configuration of the node, other members in the cluster and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== JMX ==&lt;br /&gt;
&lt;br /&gt;
In the Open-Xchange server Java process, the MBean ''com.hazelcast'' can be used to monitor and manage different aspects of the underlying Hazelcast cluster. The ''com.hazelcast'' MBean provides detailed information about the cluster configuration and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Errors ==&lt;br /&gt;
&lt;br /&gt;
When experiencing hazelcast related errors in the logfiles, most likely different versions of the packages are installed, leading to different message formats that can't be understood by nodes using another version. Examples for such errors are exceptions in hazelcast components regarding (de)serialization or other message processing.&lt;br /&gt;
This may happen when performing a consecutive update of all nodes in the cluster, where temporarily nodes with a heterogeneous setup try to communicate with each other. If the errors don't disappear after all nodes in the cluster have been update to the same package versions, it might be necessary to shutdown the cluster completely, so that all distributed data is cleared.&lt;br /&gt;
&lt;br /&gt;
== Cluster Discovery Errors ==&lt;br /&gt;
&lt;br /&gt;
* If the started OX nodes don't form a cluster, please double-check your configuration in ''hazelcast.properties''&lt;br /&gt;
* It's important to have the same cluster name defined in ''hazelcast.properties'' throughout all nodes in the cluster&lt;br /&gt;
* Especially when using multicast cluster discovery, it might take some time until the cluster is formed&lt;br /&gt;
* When using ''static'' cluster discovery, at least one other node in the cluster has to be configured in ''com.openexchange.hazelcast.network.join.static.nodes'' to allow joining, however, it's recommended to list all nodes in the cluster here&lt;br /&gt;
&lt;br /&gt;
== Disable Cluster Features ==&lt;br /&gt;
&lt;br /&gt;
The Hazelcast based clustering features can be disabled with the following property changes:&lt;br /&gt;
* Disable cluster discovery by setting ''com.openexchange.hazelcast.network.join'' to ''empty'' in ''hazelcast.properties''&lt;br /&gt;
* Disable Hazelcast by setting ''com.openexchange.hazelcast.enabled'' to false in ''hazelcast.properties''&lt;br /&gt;
* Disable message based cache event invalidation by setting ''com.openexchange.caching.jcs.eventInvalidation'' to ''false'' in ''cache.properties''&lt;br /&gt;
&lt;br /&gt;
== Update from 6.22.1 to version 6.22.2 and above ==&lt;br /&gt;
&lt;br /&gt;
As hazelcast will be used by default for the distribution of sessions starting 6.22.2 you have to adjust hazelcast according to our old cache configuration. First of all it's important that you install the open-xchange-sessionstorage-hazelcast package. This package will add the binding between hazelcast and the internal session management. Next you have to set a cluster name to the cluster.properties file (see [[#Cluster Discovery Errors]]). Furthermore you will have to add one of the two discovery modes mentioned in [[#Cluster Discovery]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Updating a Cluster =&lt;br /&gt;
&lt;br /&gt;
Running a cluster means built-in failover on the one hand, but might require some attention when it comes to the point of upgrading the services on all nodes in the cluster. This chapter gives an overview about general concepts and hints for silent updates of the cluster.&lt;br /&gt;
&lt;br /&gt;
== The Big Picture ==&lt;br /&gt;
&lt;br /&gt;
Updating an OX App Suite cluster is possible in several ways. The involved steps always include&lt;br /&gt;
&lt;br /&gt;
* Update the software by updating the packages through the distro's repository / software update tool&lt;br /&gt;
* Update the database schemas (so-called update tasks)&lt;br /&gt;
&lt;br /&gt;
There are some precautions required, though.&lt;br /&gt;
&lt;br /&gt;
=== Update Tasks Management ===&lt;br /&gt;
&lt;br /&gt;
It is a feature of the OX App Suite middleware to automatically start update tasks on a database schema when a user tries to login whose context lives on that schema. For installations beyond a certain size, if you just update the OX App Suite software without special handling of the update tasks, user logins will trigger an uncontrolled storm of update tasks on the databases, potentially leading to resource contention, unnecessary long update tasks runtimes, excessive load on the database server, maybe even service outages.&lt;br /&gt;
&lt;br /&gt;
So one key element of every update strategy is to avoid user logins on nodes which have already been updated to the new software version, while the database schemas are still on the old version. There are two fundamentally different approaches to this goal: use either a full downtime, or use a rolling update strategy.&lt;br /&gt;
&lt;br /&gt;
We describe the update strategy in more detail in the next section. Note that these are still high-level outlines of the actual procedure, which requires additional details with regards to Hazelcast, given further down below.&lt;br /&gt;
&lt;br /&gt;
==== Full downtime approach ====&lt;br /&gt;
&lt;br /&gt;
The full downtime approach is quite straightforward and involves&lt;br /&gt;
&lt;br /&gt;
* shutdown of all OX middleware nodes&lt;br /&gt;
* update the software on all OX App Suite (middleware and frontend) nodes&lt;br /&gt;
* execute the update tasks in a controlled way from one OX node&lt;br /&gt;
* restore the service&lt;br /&gt;
&lt;br /&gt;
This is the most general approach and always available, even if the rolling approach is not available due to Hazelcast constraints.&lt;br /&gt;
&lt;br /&gt;
==== Rolling strategy ====&lt;br /&gt;
&lt;br /&gt;
It is possible to execute the update tasks decoupled from the real update of the rest from the cluster, days or even weeks ahead of time, with the following approach:&lt;br /&gt;
&lt;br /&gt;
* If the load situation allows for it, take one node out of the loadbalancer (we call it the upgrade node). Otherwise, add a dedicated upgrade node to your cluster, identically configured to the other middleware nodes.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node&lt;br /&gt;
* update the software on the upgrade node&lt;br /&gt;
* execute all update tasks from the update node.&lt;br /&gt;
&lt;br /&gt;
In the last step, users from affected schemas will be logged out and denied service while the update tasks are running on their database schema. This is typically a short unavailability (some minutes) for a small part (1000...7000 depending on the installation) of the user base. This unavailability is of much lower impact than the unavailability of a full downtime, but you still might want to do this in the off-business hours.&lt;br /&gt;
&lt;br /&gt;
This way you end up with the production cluster running on the old version of OX App Suite, with the database already being upgraded to the next version. This is explicitly a valid and supported configuration. This approach offers the advantage that update tasks can be executed in advance, instead of doing them while the whole system is in a full maintenance downtime. Since update tasks can take some time, this is a considerable advantage.&lt;br /&gt;
&lt;br /&gt;
For the actual upgrade of the production cluster, the remaining steps are:&lt;br /&gt;
&lt;br /&gt;
* Upgrade and restart the OX App Suite software on one middleware node after another, one by one&lt;br /&gt;
* Upgrade the software on the OX App Suite frontend nodes (if these are separate nodes from the middleware nodes)&lt;br /&gt;
&lt;br /&gt;
Hazelcast will ensure that sessions from nodes which you restart are taken over by other nodes in the cluster, so ideally this step works without losing user sessions.&lt;br /&gt;
&lt;br /&gt;
For the rolling strategy to work as described, it is required that the old and new version of OX App Suite use compatible versions of the Hazelcast library. This is the case for most upgrades. However some upgrades must handle the situation that the new version of OX App Suite ships with a new version of Hazelcast incompatible to the version of Hazelcast shipped with the old version of OX App Suite. It will be stated in the release notes if this is the case for a given release. If so, then some additional steps are required during a rolling update to ensure session handling / invalidating during update tasks works properly. See below.&lt;br /&gt;
&lt;br /&gt;
== HOWTO / step-by-step instructions ==&lt;br /&gt;
&lt;br /&gt;
* Take backups of as much as possible (databases, OX config files, etc).&lt;br /&gt;
* Announce the maintenance to the users. The communication depends on which approach you chose: the full downtime approach will come with a full downtime for all users, while the rolling upgrade approach will result in some users will have a short loss of service while their schema upgrades.&lt;br /&gt;
&lt;br /&gt;
=== Full downtime approach ===&lt;br /&gt;
&lt;br /&gt;
* Initiate maintenance: Block HTTP sessions to the service. Put a reasonable maintenance page in place, probably some HTTP error 503 with a reasonable Retry-After header.&lt;br /&gt;
* Shutdown the service on all middleware nodes. Upgrade the software on all middleware and frontend nodes using the disto's package manager. See [[AppSuite:UpdatingOXPackages]] for details on how to do that. Don't forget the &amp;lt;code&amp;gt;touch-appsuite&amp;lt;/code&amp;gt; step if required (&amp;quot;If you update only UI plugins without simultaneously upgrading the core UI packages to a new version&amp;quot;).&lt;br /&gt;
* Start the &amp;lt;code&amp;gt;open-xchange&amp;lt;/code&amp;gt; service on one node&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that, in particular the [[UpdateTasks#How_to_see_all_schemas.3F|section]] about limited parallel execution.&lt;br /&gt;
* Start the &amp;lt;code&amp;gt;open-xchange&amp;lt;/code&amp;gt; services on the middleware nodes.&lt;br /&gt;
* Perform some crosschecks like&lt;br /&gt;
** all middleware nodes joined the Hazelcast cluster&lt;br /&gt;
** all OSGI bundles (which are expected to be running) are running&lt;br /&gt;
** WebUI login is possible&lt;br /&gt;
** Some central functionality tests like sending mails, accessing drive, etc&lt;br /&gt;
* Restore service: allow HTTP sessions, remove the maintenance page.&lt;br /&gt;
&lt;br /&gt;
=== Rolling Upgrade without breaking Hazelcast upgrade ===&lt;br /&gt;
&lt;br /&gt;
Remember: as stated above, this is viable only if the release notes for the new version do not state that there are breaking Hazelcast changes. For example, with v7.8.4 there were breaking Hazelcast changes and in the Release Notes it was stated as follows.&lt;br /&gt;
&lt;br /&gt;
https://software.open-xchange.com/products/appsuite/doc/Release_Notes_for_Release_7.8.4_2017-05-23.pdf&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Important - Please Note&lt;br /&gt;
&lt;br /&gt;
There is a major Hazelcast library update to OX App Suite v7.8.4. This means that when updating from an earlier backend version, due to the upgraded library, it is not possible to form a cluster of nodes that run previous version of Hazelcast (i.e. exiting volatile data in the cluster will be lost during the update). A consistent Hazelcast cluster is needed for cluster-wide cache invalidation. To circumvent problems with database update tasks that need to perform cache invalidation, please follow the steps described here: http://oxpedia.org/wiki/index.php?title=AppSuite:Running_a_cluster#Upgrades_of_the_Hazelcast_library. Please also note that session migration is not possible between versions. This usually affects all user sessions that are stored in a distributed map, and will require the users to re-login after the update. Running incompatible versions of Hazelcast within a cluster will result in logentries showing the conflicting node and version information.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you find you are upgrading to a version with breaking Hazelcast changes, please consult the next section [[#Rolling_Upgrade_with_breaking_Hazelcast_upgrade]].&lt;br /&gt;
&lt;br /&gt;
==== Description of the upgrade process ====&lt;br /&gt;
&lt;br /&gt;
The procedure consists of a '''pre-update''' where one update node will be taken out of the HTTP traffic, to execute database update tasks from that node, and a '''real update''', where all of the cluster nodes will get updated to the new version of the software.&lt;br /&gt;
&lt;br /&gt;
The pre-update will not make the new version of the software available to the users. It will run as kind of &amp;quot;background task&amp;quot;, mostly invisible for the users (but see below for a description of the impact of the update tasks on user experience).&lt;br /&gt;
&lt;br /&gt;
==== Pre-update ====&lt;br /&gt;
&lt;br /&gt;
The following steps all refer to one special middleware node, the so-called ''upgrade node''. The other cluster nodes are not affected by this step.&lt;br /&gt;
&lt;br /&gt;
* Take one middleware node (the upgrade node) out of the HTTP traffic by adjusting the apache mod_proxy tables. We propose a combination of the balancer_manager to do this during runtime without restart, but also update the config files to prevent service restarts of apache to accidentally route sessions to the upgrade node.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node &lt;br /&gt;
* Update packages on the upgrade node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that.&lt;br /&gt;
** Note that executing update tasks on database schemas will result in users from the given database schema to be logged out and locked out during the update tasks.&lt;br /&gt;
** You might want to keep the load low on the DBs, to affect production operations as low as possible, and because with this decoupled update tasks approach there is no immediate time pressure. If you want to follow the [[UpdateTasks#How_to_see_all_schemas.3F|limited parallel]] approach, use a small, mild parallelity factor (e.g. 2 or maybe 4 if you know this by far does not saturate your DB platform).&lt;br /&gt;
&lt;br /&gt;
==== Real Update ====&lt;br /&gt;
&lt;br /&gt;
The following steps refer to all cluster nodes (but the upgrade node, which had been updated before).&lt;br /&gt;
&lt;br /&gt;
* For one middleware cluster node after each nother:&lt;br /&gt;
** Update packages on that middleware node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
** Verify the node starts its bundles, joins the Hazelcast cluster, log files are clean, the node handles sessions&lt;br /&gt;
* For one frontend node after each other (if you've got separate frontend nodes):&lt;br /&gt;
** Update packages on that frontend node. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Finally, if required (&amp;quot;If you update only UI plugins without simultaneously upgrading the core UI packages to a new version&amp;quot;), execute &amp;lt;code&amp;gt;touch-appsuite&amp;lt;/code&amp;gt; with a &amp;lt;code&amp;gt;--timestamp&amp;lt;/code&amp;gt; argument as described on the page [[AppSuite:UpdatingOXPackages]]&lt;br /&gt;
* Perform final crosschecks like&lt;br /&gt;
** all middleware nodes joined the Hazelcast cluster&lt;br /&gt;
** all OSGI bundles (which are expected to be running) are running&lt;br /&gt;
** WebUI login is possible&lt;br /&gt;
** Some central functionality tests like sending mails, accessing drive, etc&lt;br /&gt;
&lt;br /&gt;
=== Rolling Upgrade with breaking Hazelcast upgrade ===&lt;br /&gt;
&lt;br /&gt;
Cf [[#Upgrades_of_the_Hazelcast_library]] below.&lt;br /&gt;
&lt;br /&gt;
In principle the steps given in the previous section apply. However the upgrade needs to get the special Hazelcast Upgrade Package installed (e.g. one from &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-76x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-780-782&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-783&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-784&amp;lt;/code&amp;gt;, ...) during execution of the update tasks.&lt;br /&gt;
&lt;br /&gt;
So the pre-update steps look like:&lt;br /&gt;
&lt;br /&gt;
* Take one middleware node (the upgrade node) out of the HTTP traffic by adjusting the apache mod_proxy tables. We propose a combination of the balancer_manager to do this during runtime without restart, but also update the config files to prevent service restarts of apache to accidentally route sessions to the upgrade node.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node &lt;br /&gt;
* Update packages on the upgrade node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Install the special Hazelcast Upgrade Package on the upgrade node (e.g. one from &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-76x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-780-782&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-783&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-784&amp;lt;/code&amp;gt;, ...). Restart the service again.&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that. You might want to keep the load low on the DBs, to affect production operations as low as possible, and because with this decoupled update tasks approach there is no immediate time pressure. If you want to follow the [[UpdateTasks#How_to_see_all_schemas.3F|limited parallel]] approach, use a small, mild parallelity factor (e.g. 2 or maybe 4 if you know this by far does not saturate your DB platform).&lt;br /&gt;
&lt;br /&gt;
Note: don't worry if you don't see the upgrade node joining the legacy cluster: the upgrade node will not join the legacy cluster / not be visible there since the upgrade node will be a so-called &amp;quot;native client&amp;quot; to the legacy cluster, and it will be created on the fly (and subsequently disposed again) for propagating an event. So also on &amp;lt;code&amp;gt;netstat&amp;lt;/code&amp;gt; level the upgrade node will not have visible connections to the legacy cluster (unless for the very short timeframe when an actual even is sent). You can verify the functionality of that package by log lines like&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; Successfully initialzed Hazelcast client: &amp;lt;client-id&amp;gt;&lt;br /&gt;
 Successfully got reference to cache event topic: cacheEvents-3&lt;br /&gt;
 Publishing legacy cache event: &amp;lt;cache-event&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Successfully published legacy cache event, shutting down client after 546ms...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the overly prudent it might be an idea to prepare a special test context with a test user living in its dedicated (test) schema, so you can test the functionality of this mechanism during upgrade first.&lt;br /&gt;
&lt;br /&gt;
After the DB update tasks you can remove the special upgrade package again from the upgrade node.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Real Upgrade&amp;quot; procedure then looks like [[#Rolling_Upgrade_without_breaking_Hazelcast_upgrade|above]].&lt;br /&gt;
&lt;br /&gt;
== Reference Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== Limitations ===&lt;br /&gt;
&lt;br /&gt;
While in most cases a seamless, rolling upgrade of all nodes in the cluster is possible, there may be situations where nodes running a newer version of the Open-Xchange Server are not able to communicate with older nodes in the cluster, i.e. can't access distributed data or consume incompatible event notifications - especially, when the underlying Hazelcast library is part of the update, which does not support this scenario at the moment. In such cases, the release notes will contain corresponding information, so please have a look there before applying an update.&lt;br /&gt;
&lt;br /&gt;
Additionally, there may always be some kind of race conditions during an update, i.e. client requests that can't be completed successfully or internal events not being deliverd to all nodes in the cluster. That's why the following information should only serve as a best-practices guide to minimize the impact of upgrades to the user experience.&lt;br /&gt;
&lt;br /&gt;
=== Upgrading a single Node ===&lt;br /&gt;
&lt;br /&gt;
Upgrading all nodes in the cluster should usually be done sequentially, i.o.w. one node after the other. This means that during the upgrade of one node, the node is temporarily disconnected from the other nodes in the cluster, and will join the cluster again after the update is completed. From the backend perspective, this is as easy as stopping the open-xchange service. other nodes in the cluster will recognize the disconnected node and start to repartition the shared cluster data automatically. But wait a minute - doing so would potentially lead to the webserver not registering the node being stopped immediately, resulting in temporary errors for currently logged in users until they are routed to another machine in the cluster. That's why it's good practice to tell the webserver's load balancer that the node should no longer fulfill incoming requests. The Apache Balancer Manager is an excellent tool for this ([http://httpd.apache.org/docs/2.2/mod/mod_status.html module ''mod_status'']). Look at the screen shot. Every node can be put into a disabled mode. Further requests will the redirected to other nodes in the cluster:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:balancer_manager.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afterwards, the open-xchange service on the disabled node can be stopped by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange stop&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange stop&lt;br /&gt;
&lt;br /&gt;
Now, the node is effectively in maintenance mode and any updates can take place. One could now verify the changed cluster infrastructure by accessing the Hazelcast MBeans either via JMX or the ''showruntimestats -c'' commandline tool (see above for details). There, the shut down node should no longer appear in the 'Member' section (com.hazelcast:type=Member).&lt;br /&gt;
&lt;br /&gt;
When all upgrades are processed, the node open-xchange service can be started again by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange start&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange start&lt;br /&gt;
&lt;br /&gt;
As stated above, depending on the chosen cluster discovery mechanism, it might take some time until the node joins the cluster again. When using static cluster discovery, it will join the existing cluster usually directly during serivce startup, i.o.w. before other depending OSGi services are started. Otherwise, there might also be situations where the node cannot join the cluster directly, for example when there were no mDNS advertisments for other nodes in the cluster received yet. Then, it can take some additional time until the node finally joins the cluster. During startup of the node, you can observe the JMX console or the output of ''showruntimestats -c'' (com.hazelcast:type=Member) of another node in the cluster to verify when the node has joined. &lt;br /&gt;
&lt;br /&gt;
After the node has joined, distributed data is re-partioned automatically, and the node is ready to server incoming requests again - so now the node can finally be enabled again in the load balancer configuration of the webserver. Afterwards, the next node in the cluster can be upgraded using the same procedure, until all nodes were processed.&lt;br /&gt;
&lt;br /&gt;
=== Upgrades of the Hazelcast library ===&lt;br /&gt;
&lt;br /&gt;
In case an upgrade includes a major update of the Hazelcast library, a newly upgraded node will usually not be able to connect to the nodes running the previous version. In this case, volatile cluster data is lost after all nodes in the cluster have been updated, including sessions held in the distributed session storage. As outlined above, the release notes will contain a corresponding warning in such cases. Starting with v7.10.3, separation of the clusters during rolling upgrades is enforced using by appending a version suffix to the cluster group name.&lt;br /&gt;
&lt;br /&gt;
Besides upgraded nodes not being able to access distributed data of the legacy cluster, this also affects new data not being available in the legacy cluster, which may cause troubles if the updated backend version needs to perform database update tasks. Database update tasks usually operate in a &amp;quot;blocking&amp;quot; way and all contexts associated with the schema being upgraded are disabled temporarily. Since context data itself is being held in caches on potentially each node in the cluster, the affected cache entries are invalidated during the database update. And, since cluster-wide cache invalidations again utilize Hazelcast functionality ([[#Remote Cache Invalidation]]), such invalidations normally won't be propagated to nodes running a previous version of the Hazelcast library.&lt;br /&gt;
&lt;br /&gt;
To work around this specific scenario where an incompatible upgrade of the Hazelcast library needs to be performed along with blocking database update tasks, starting with v7.8.0, a supplementary package is available that explicitly enables the context cache invalidation of nodes running the previous Hazelcast library. This package follows the naming scheme ''open-xchange-cluster-upgrade-from-XXX'' (where XXX representing the version of the legacy version of the Open-Xchange server), and is available in the repositories for the updated server packages. This package should only be installed on the first node of the cluster that is going to be upgraded to the new version, and can be deactivated once the database upgrade tasks were executed successfully. &lt;br /&gt;
&lt;br /&gt;
Once installed, a legacy cluster is discovered based on the available information in the ''hazelcast.properties'' configuration file in case cluster discovery is set to ''static''. If a different join mechanism like ''multicast'' is used, there's an alternative option to configure at least one of the addresses of the legacy cluster via ''com.openexchange.hazelcast.network.client.nodes''. &lt;br /&gt;
&lt;br /&gt;
As an example, along with the server v7.8.0, a new package named ''open-xchange-cluster-upgrade-from-76x'' can be installed that aids in invalidating cluster server nodes running v7.6.x (which includes the Hazelcast library in version 3.2.4). Using this package, the recommended steps to update an OX cluster from version 7.6.x to version 7.8.0 would be:&lt;br /&gt;
# Pick a node from your cluster that you want to use for executing the database update tasks shipped with the new release&lt;br /&gt;
# Disable this node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Update the OX packages on this node, additionally install the package ''open-xchange-cluster-upgrade-from-76x''&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Trigger the update task executions using the ''runUpdate'' commandline utility as described at [[UpdateTasks]]&lt;br /&gt;
# Once they are finished, uninstall the package ''open-xchange-cluster-upgrade-from-76x'' again&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Re-enable the node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Upgrade all other nodes in the cluster as described at [[#Upgrading a single Node]]&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.0 through v7.8.2 (incl.) to v7.8.3 using the package named ''open-xchange-cluster-upgrade-from-780-782'', since v7.8.0 through v7.8.2 (incl.) utilize Hazelcast v3.5.x, while v7.8.3 uses Hazelcast v3.6.4&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.3 to v7.8.4 using the package named ''open-xchange-cluster-upgrade-from-783'', since v7.8.3 utilizes Hazelcast v3.7.1&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.4 to v7.10.0 using the package named ''open-xchange-cluster-upgrade-from-784'', since v7.8.4 utilizes Hazelcast v3.8.1&lt;br /&gt;
&lt;br /&gt;
... and so on.&lt;br /&gt;
&lt;br /&gt;
'''Operations Note:''' The upgraded node will connect temporary as so-called [http://docs.hazelcast.org/docs/2.3/manual/html/ch15.html Native Client] to the legacy Hazelcast Cluster.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Native Client enables you to do all Hazelcast operations without being a member of the cluster.&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
However Native client is not member and relies on one of the cluster members.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means, the upgraded node will not be visible in the members list of the legacy Hazelcast cluster (&amp;lt;code&amp;gt;showruntimestats -c&amp;lt;/code&amp;gt;). Furthermore, the native client will created and destructed on single context events, with the effect that connections will only be visible in the very moment of such an event. This means effectively that verification of the invalidation mechanism is only possible by actually executing the &amp;lt;code&amp;gt;runupdate&amp;lt;/code&amp;gt; CLT. This should produce log lines like&lt;br /&gt;
&lt;br /&gt;
 Successfully initialized Hazelcast client: &amp;lt;client-id&amp;gt;&lt;br /&gt;
 Successfully got reference to cache event topic: cacheEvents-3&lt;br /&gt;
 Publishing legacy cache event: &amp;lt;cache-event&amp;gt;&lt;br /&gt;
 Successfully published legacy cache event, shutting down client after 546ms...&lt;br /&gt;
&lt;br /&gt;
Most importantly, you should be able to observe correct functionality (users of affected contexts being logged out). It may be handy to prepare a dedicated schema with just test contexts inside. (How to create this is out of scope here, but hint: use &amp;lt;code&amp;gt;createschema&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;createcontext --schema-name&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
=== Other Considerations ===&lt;br /&gt;
&lt;br /&gt;
* It's always recommended to only upgrade one node after the other, always ensuring that the cluster has formed correctly between each shutdown/startup of a node.&lt;br /&gt;
* Do not stop a node while running the runUpdate script or the associated update task.&lt;br /&gt;
* During the time of such a rolling upgrade of all nodes, we have effectively heterogeneous software versions in the cluster, which potentially might lead to temporary inconsistencies. Therefore, all nodes in the cluster should be updated in one cycle (but still one after the other).&lt;br /&gt;
* Following the above guideline, it's also possible to add or remove nodes dynamically to the cluster, not only when disconnecting a node temporary for updates.&lt;br /&gt;
* In case of trouble, i.e. a node refuses to join the cluster again after restart, consult the logfiles first for any hints about what is causing the problem - both on the disconnected node, and also on other nodes in the network&lt;br /&gt;
* If there are general incompatibilities between two revisions of the Open-Xchange Server that prevent an operation in a cluster (release notes), it's recommended to choose another name for the cluster in ''cluster.properties'' for the nodes with the new version. This will temporary lead to two separate clusters during the rolling upgrade, and finally the old cluster being shut down completely after the last node was updated to the new version. While distributed data can't be migrated from one server version to another in this scenario due to incompatibilities, the uptime of the system itself is not affected, since the nodes in the new cluster are able to serve new incoming requests directly.&lt;br /&gt;
* When updating only UI plugins without also updating to a new version of the core UI, you also need to perform the additional step from [[AppSuite:UpdatingOXPackages#Updating_UI_plugins|Updating UI plugins]].&lt;br /&gt;
* When performing a rolling upgrade of the middleware nodes in the cluster to 7.10.2 from a previous version (7.10.1 and earlier), the upgraded nodes will not join the Hazelcast cluster and fail to startup properly due to a change in the join process of the underlying Hazelcast library. Therefore, a new configuration switch is introduced that takes care to dynamically append the Hazelcast version to the cluster name so that a new cluster group is created automatically for the upgraded nodes: &amp;lt;code&amp;gt;com.openexchange.hazelcast.group.name.appendVersion&amp;lt;/code&amp;gt;. Please mind that this configuration property is only applicable for 7.10.2; later versions starting with 7.10.3 will always append the version identifier to the group name. The default value is &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, so that there are no surprises when patching an existing 7.10.2 installation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]] [[Category: Administration]] [[Category: Cluster]]&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=25237</id>
		<title>AppSuite:Running a cluster</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=25237"/>
		<updated>2020-01-30T14:04:38Z</updated>

		<summary type="html">&lt;p&gt;Thorben: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Running a cluster&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
Please refer to https://documentation.open-xchange.com/latest/middleware/administration/running_a_cluster.html for an up-to-date version of this article&lt;br /&gt;
&lt;br /&gt;
= Concepts =&lt;br /&gt;
&lt;br /&gt;
For inter-OX-communication over the network, multiple Open-Xchange servers can form a cluster. This brings different advantages regarding distribution and caching of volatile data, load balancing, scalability, fail-safety and robustness. Additionally, it provides the infrastructure for upcoming features of the Open-Xchange server. &lt;br /&gt;
The clustering capabilities of the Open-Xchange server are mainly built up on [http://hazelcast.com Hazelcast], an open source clustering and highly scalable data distribution platform for Java. The following article provides an overview about the current featureset and configuration options.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
&lt;br /&gt;
== Synchronized system clock times ==&lt;br /&gt;
It is crucial that all involved members in a cluster do have their system clock times in sync with each other; e.g. by using an NTP service.&lt;br /&gt;
&lt;br /&gt;
== HTTP routing ==&lt;br /&gt;
An OX cluster is always part of a larger picture. Usually there is front level loadbalancer as central HTTPS entry point to the platform. This loadbalancer optionally performs HTTPS termination and forwards HTTP(S) requests to webservers (the usual and only supported choice as of now is Apache). These webservers are performing HTTPS termination (if this is not happening on the loadbalancer) and serve static content, and (which is what is relevant for our discussion here) they forward dynamic requests to the OX backends.&lt;br /&gt;
&lt;br /&gt;
A central requirement for the interaction of these components (loadbalancer, webservers, OX nodes) is that we have session stability based on the JSESSIONID cookie / jsessionid path component suffix. This means that our application sets a cookie named JSESSIONID which has a value like &amp;lt;large decimal number&amp;gt;.&amp;lt;route identifier&amp;gt;, e.g. &amp;quot;5661584529655240315.OX1&amp;quot;. The route identifier here (&amp;quot;OX1&amp;quot; in this example) is taken by the OX node from a configuration setting from a config file and is specific to one OX node. HTTP routing must happen such that HTTP requests with a cookie with such a suffix always end up the corresponding OX node. There are furthermore specific circumstances when passing this information via cookie is not possible. Then the JSESSIONID is transferred in a path component as &amp;quot;jsessionid=...&amp;quot; in the HTTP request. The routing mechanism needs to take that into account also.&lt;br /&gt;
&lt;br /&gt;
There are mainly two options to implement this. If the Apache processes are running co-located on the same machines running the OX groupware processes, it is often desired to have the front level loadbalancer perform HTTP routing to the correct machines. If dedicated Apache nodes are employed, is is usually sufficient to have the front-level loadbalancer do HTTP routing to the Apache nodes in a round-robin fashion and perform routing to the correct OX nodes in the Apache nodes.&lt;br /&gt;
&lt;br /&gt;
We provide sample configuration files to configure Apache (with mod_proxy_http) to perform HTTP routing correctly in our guides on OXpedia, e.g. [[AppSuite:Main_Page_AppSuite#quickinstall]]. Central elements are the directives &amp;quot;ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&amp;quot; in conjunction with the &amp;quot;route=OX1&amp;quot; parameters to the BalancerMember lines in the Proxy definition. This is valid for Apache 2.2 as of Sep-2014.&lt;br /&gt;
&lt;br /&gt;
How to configure a front level loadbalancer to perform HTTP equivalent HTTP routing is dependent on the specific loadbalancer implementation. If Apache is used as front level loadbalancer, the same configuration as discussed in the previous section can be employed. As of time of writing this text (Sep 2014), the alternative choices are thin. F5 BigIP is reported to be able to implement &amp;quot;jsessionid based persistence using iRules&amp;quot;. nginx has the functionality in their commercial &amp;quot;nginx plus&amp;quot; product. (Both of these options have not been tested by OX.) Other loadbalancers with this functionality are not known to us.&lt;br /&gt;
&lt;br /&gt;
If the front level loadbalancer is not capable of performing correct HTTP routing, is is required to configure correct HTTP routing on Apache level, even if Apache runs co-located on the OX nodes and thus cross-routing happens.&lt;br /&gt;
&lt;br /&gt;
There are several reasons why we require session stability in exactly this way. We require session stability for horizontal scale-out; while we support transparent resuming / migration of user sessions in the OX cluster without need for users to re-authenticate, sessions wandering around randomly will consume a fixed amount resources corresponding to a running session on each OX node in the cluster, while a session sticky to one OX node will consume this fixed amount of resources only on one OX node. Furthermore there are mechanisms in OX like TokenLogin which work only of all requests belonging to one sequence get routed to the same OX node even if they stem from different machines with different IPs. Only the JSESSIONID (which in this case is transferred as jsessionid path component, as cookies do not work during a 302 redirect, which is part of this sequence) carries the required information where the request must be routed to.&lt;br /&gt;
&lt;br /&gt;
Usual &amp;quot;routing based on cookie hash&amp;quot; is not sufficient here since it disregards the information which machine originally issued the cookie. It only ensures that the session will be sticky to any target, which statistically will not be the same machine that issued the cookie. OX will then set a new JSESSIONID cookie, assuming the session had been migrated. The loadbalancer will then route the session to a different target, as the hash of the cookie will differ. This procedure then happens iteratively until by chance the routing based on cookie hash will route the session to the correct target. By then, a lot of resources will have been wasted, by creating full (short-term) sessions on all OX nodes. Furthermore, processes like TokenLogin will not work this way.&lt;br /&gt;
&lt;br /&gt;
== Same Packages ==&lt;br /&gt;
&lt;br /&gt;
All middleware nodes participating in the Hazelcast cluster need to have the same ''open-xchange-*'' packages installed, so that all dynamically injected class definitions are available during (de-)erialization on all nodes. So for example, even if a node does not serve requests from the web client, it still requires the realtime packages for collaborative document editing or the packages for the distributed session storage being installed.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
All settings regarding cluster setup are located in the configuration file ''hazelcast.properties''. The former used additional files ''cluster.properties'', ''mdns.properties'' and ''static-cluster-discovery.properties'' are no longer needed. The following gives an overview about the most important settings - please refer to the inline documentation of the configuration file for more advanced options.&lt;br /&gt;
&lt;br /&gt;
Note: The configuration guide targets v7.4.0 of the OX server (and above). For older versions, please consult the history of this page. A full list of Hazelcast-related properties is available at https://documentation.open-xchange.com/components/middleware/config/7.8.4/#mode=features&amp;amp;feature=Hazelcast .&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
To restrict access to the cluster and to separate the cluster from others in the local network, a group name needs to be defined. Up to v7.10.2, an additional group password, configurable via ''com.openexchange.hazelcast.group.password'' was used. Only backend nodes having the same values for those properties are able to join and form a cluster. &lt;br /&gt;
&lt;br /&gt;
 # Configures the name of the cluster. Only nodes using the same group name &lt;br /&gt;
 # will join each other and form the cluster. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is not &amp;quot;empty&amp;quot; (see below).&lt;br /&gt;
 com.openexchange.hazelcast.group.name=&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Network ==&lt;br /&gt;
&lt;br /&gt;
It's required to define the network interface that is used for cluster communication via ''com.openexchange.hazelcast.network.interfaces''. By default, the interface is restricted to the local loopback address only. To allow the same configuration amongst all nodes in the cluster, it's recommended to define the value using a wildcard matching the IP addresses of all nodes participating in the cluster, e.g. ''192.168.0.*''&lt;br /&gt;
&lt;br /&gt;
 # Comma-separated list of interface addresses hazelcast should use. Wildcards &lt;br /&gt;
 # (*) and ranges (-) can be used. Leave blank to listen on all interfaces&lt;br /&gt;
 # Especially in server environments with multiple network interfaces, it's &lt;br /&gt;
 # recommended to specify the IP-address of the network interface to bind to &lt;br /&gt;
 # explicitly. Defaults to &amp;quot;127.0.0.1&amp;quot; (local loopback only), needs to be &lt;br /&gt;
 # adjusted when building a cluster of multiple backend nodes.&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=127.0.0.1&lt;br /&gt;
&lt;br /&gt;
To form a cluster of multiple OX server nodes, different discovery mechanisms can be used. The discovery mechanism is specified via the property ''com.openexchange.hazelcast.network.join'':&lt;br /&gt;
&lt;br /&gt;
 # Specifies which mechanism is used to discover other backend nodes in the&lt;br /&gt;
 # cluster. Possible values are &amp;quot;empty&amp;quot; (no discovery for single-node setups),&lt;br /&gt;
 # &amp;quot;static&amp;quot; (fixed set of cluster member nodes), &amp;quot;multicast&amp;quot; (automatic discovery&lt;br /&gt;
 # of other nodes via multicast) or &amp;quot;dns&amp;quot; to consult a DNS server to resolve the&lt;br /&gt;
 # domain names to the most recent set of IP addresses of all service nodes.&lt;br /&gt;
 # Defaults to &amp;quot;empty&amp;quot;. Depending on the specified value, further configuration&lt;br /&gt;
 # might be needed; see &amp;quot;Networking&amp;quot; section below.&lt;br /&gt;
 com.openexchange.hazelcast.network.join=empty&lt;br /&gt;
&lt;br /&gt;
Generally, it's advised to use the same network join mechanism for all nodes in the cluster, and, in most cases, it's strongly recommended to use a ''static'' network join configuration. This will allow the nodes to join the cluster directly upon startup. With a ''multicast'' based setup, nodes will merge to an existing cluster possibly at some later time, thus not being able to access the distributed data until they've joined.&lt;br /&gt;
&lt;br /&gt;
Depending on the network join setting, further configuration may be necessary, as described in the following paragraphs.&lt;br /&gt;
&lt;br /&gt;
=== empty ===&lt;br /&gt;
&lt;br /&gt;
When using the default value ''empty'', no other nodes are discovered in the cluster. This value is suitable for single-node installations. Note that other nodes that are configured to use other network join mechanisms may be still able to still to connect to this node, e.g. using a ''static'' network join, having the IP address of this host in the list of potential cluster members (see below).&lt;br /&gt;
&lt;br /&gt;
=== static ===&lt;br /&gt;
&lt;br /&gt;
The most common setting for ''com.openexchange.hazelcast.network.join'' is ''static''. A static cluster discovery uses a fixed list of IP addresses of the nodes in the cluster. During startup and after a specific interval, the underlying Hazelcast library probes for not yet joined nodes from this list and adds them to the cluster automatically. The address list is configured via ''com.openexchange.hazelcast.network.join.static.nodes'':&lt;br /&gt;
&lt;br /&gt;
 # Configures a comma-separated list of IP addresses / hostnames of possible &lt;br /&gt;
 # nodes in the cluster, e.g. &amp;quot;10.20.30.12, 10.20.30.13:5701, 192.178.168.110&amp;quot;.&lt;br /&gt;
 # Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;static&amp;quot;. &lt;br /&gt;
 # It doesn't hurt if the address of the local host appears in the list, so &lt;br /&gt;
 # that it's still possible to use the same list throughout all nodes in the &lt;br /&gt;
 # cluster.&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=&lt;br /&gt;
&lt;br /&gt;
For a fixed set of backend nodes, it's recommended to simply include the IP addresses of all nodes in the list, and use the same configuration for each node. However, it's only required to add the address of at least one other node in the cluster to allow the node to join the cluster. Also, when adding a new node to the cluster and this list is extended accordingly, existing nodes don't need to be shut down to recognize the new node, as long as the new node's address list contains at least one of the already running nodes. &lt;br /&gt;
&lt;br /&gt;
=== multicast ===&lt;br /&gt;
&lt;br /&gt;
For highly dynamic setups where nodes are added and removed from the cluster quite often and/or the host's IP addresses are not fixed, it's also possible to configure the network join via multicast. During startup and after a specific interval, the backend nodes initiate the multicast join process automatically, and discovered nodes form or join the cluster afterwards. The multicast group and port can be configured as follows:&lt;br /&gt;
&lt;br /&gt;
 # Configures the multicast address used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. If the nodes reside in different subnets, please ensure that &lt;br /&gt;
 # multicast is enabled between the subnets. Defaults to &amp;quot;224.2.2.3&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.group=224.2.2.3&lt;br /&gt;
 &lt;br /&gt;
 # Configures the multicast port used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. Defaults to &amp;quot;54327&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.port=54327&lt;br /&gt;
&lt;br /&gt;
=== dns ===&lt;br /&gt;
&lt;br /&gt;
A very common approach for service discovery in cloud environments is to use plain old DNS. Any service, consisting of a varying number of elastic nodes, would get its own domain name. Against a certain DNS server, this name always resolves to the most recent set of IP addresses of all service nodes.&lt;br /&gt;
&lt;br /&gt;
 # The comma-separated list of domain names that are supposed to be resolved to a&lt;br /&gt;
 # (super-)set of host addresses through a DNS look-up.&lt;br /&gt;
 # Only effective if property &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;dns&amp;quot;&lt;br /&gt;
 com.openexchange.hazelcast.network.join.dns.domainNames=&lt;br /&gt;
&lt;br /&gt;
 # The optional host name for the DNS server. If not specified system's default DNS service is used.&lt;br /&gt;
 # Only effective if property &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;dns&amp;quot;&lt;br /&gt;
 com.openexchange.hazelcast.network.join.dns.resolverHost=&lt;br /&gt;
&lt;br /&gt;
 # The optional port number for the DNS server. If not specified default port (53 UDP) is used.&lt;br /&gt;
 # Only effective if property &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;dns&amp;quot;&lt;br /&gt;
 com.openexchange.hazelcast.network.join.dns.resolverPort=53&lt;br /&gt;
&lt;br /&gt;
 # The refrsh rate in milliseconds when a new DNS look-up is supported to be performed to&lt;br /&gt;
 # apply possibly changed members to Hazelcast network configuration.&lt;br /&gt;
 # Only effective if property &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;dns&amp;quot;&lt;br /&gt;
 com.openexchange.hazelcast.network.join.dns.refreshMillis=60000&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The following example shows how a simple cluster named ''MyCluster'' consisting of 4 backend nodes can be configured using ''static'' cluster discovery. The node's IP addresses are 10.0.0.15, 10.0.0.16, 10.0.0.17 and 10.0.0.18. Note that the same ''hazelcast.properties'' is used by all nodes.&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.group.name=MyCluster&lt;br /&gt;
 com.openexchange.hazelcast.network.join=static&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=10.0.0.15,10.0.0.16,10.0.0.17,10.0.0.18&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=10.0.0.*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Advanced Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Lite Members (available since v7.8.4) ===&lt;br /&gt;
&lt;br /&gt;
Lite members in a Hazelcast cluster are members that do not hold any data partitions, i.e. all read- and write operations to distributed maps are delegated to non-lite (&amp;quot;full&amp;quot;) members. Apart from not having data partitions, lite members participate in the same way as other members: they can register listeners for distributed topics (e.g. cache invalidation events) or can be addressed for task execution (e.g. during realtime communication). &lt;br /&gt;
&lt;br /&gt;
Similar to using a custom partitioning scheme, separating the nodes of a large cluster into few &amp;quot;full&amp;quot; members and many &amp;quot;lite&amp;quot; members helps to minimize the impact of JVM activities from a single node (mainly the garbage collector) on the whole cluster communication. Additionally, when starting or stopping lite members, no repartitioning of the distributed cluster data needs to be performed, which significantly decreases the node's startup- and shutdown time and reduces the necessary network communication to a minimum. &lt;br /&gt;
&lt;br /&gt;
In medium or larger sized clusters, it is sufficient to have roughly 10 to 20 percent of the nodes configured as &amp;quot;full&amp;quot; members, while all other ones can be started as &amp;quot;lite&amp;quot; member nodes. Additionally, please note that the configured backup count in the map configurations should always be smaller than the total number of &amp;quot;full&amp;quot; members, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of &amp;quot;full&amp;quot; members is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
The configured &amp;quot;full&amp;quot; members should preferably not be used to serve client requests (by not adding them as endpoint in the loadbalancer), to ensure they are always responsive. Also, shutdown and startups of those &amp;quot;full&amp;quot; members should be reduced to a minimum to avoid repartitioning operations. &lt;br /&gt;
&lt;br /&gt;
More general information regarding lite members is available at http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#enabling-lite-members .&lt;br /&gt;
&lt;br /&gt;
To configure a node as &amp;quot;lite&amp;quot; member, the following configuration should be applied in the node's ''hazelcast.properties'' file:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.liteMember=true&lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list all &amp;quot;full&amp;quot; member nodes here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
=== Custom Partitioning ===&lt;br /&gt;
&lt;br /&gt;
Note: Starting with v7.8.4, &amp;quot;Lite Members&amp;quot; should be used in favor of applying a custom partitioning scheme.&lt;br /&gt;
&lt;br /&gt;
While originally being designed to separate the nodes holding distributed data into different risk groups for increased fail safety, a custom partitioning strategy may also be used to distinguish between nodes holding distributed data from those who should not. &lt;br /&gt;
&lt;br /&gt;
This approach of custom partitioning may be used in a OX cluster, where usually different backend nodes serve different purposes. A common scenario is that there are nodes handling requests from the web interfaces, and others being responsible for USM/EAS traffic. Due to their nature of processing large chunks of synchronization data in memory, the USM/EAS nodes may encounter small delays when the Java garbage collector kicks in and suspends the Java Virtual Machine. Since those delays may also have an influence on hazelcast-based communication in the cluster, the idea is to instruct hazelcast to not store distributed data on that nodes. This is where a custom partitioning scheme comes into play.&lt;br /&gt;
&lt;br /&gt;
To setup a custom partitioning scheme in the cluster, an additional ''hazelcast.xml'' configuration file is used, which should be placed into the ''hazelcast'' subdirectory of the OX configuration folder, usually at ''/opt/openexchange/etc/hazelcast''. Please note that it's vital that each node in the cluster is configured equally here, so the same ''hazelcast.xml'' file should be copied to each server. The configuration read from there is used as basis for all further settings that are taken from the ordinary ''hazelcast.properties'' config file. &lt;br /&gt;
&lt;br /&gt;
To setup a custom partitioning scheme, the partition groups must be defined in the ''hazelcast.xml'' file. See the following file for an example configuration, where the three nodes ''10.10.10.60'', ''10.10.10.61'' and ''10.10.10.62'' are defined to form an own partitioning group each. Doing so, all distributed data will be stored at one of those nodes physically, while the corresponding backup data (if configured) at one of the other two nodes. All other nodes in the cluster will not be used to store distributed data, but will still be &amp;quot;full&amp;quot; hazelcast members, which is necessary for other cluster-wide operations the OX backends use. &lt;br /&gt;
&lt;br /&gt;
Please note that the configured backup count in the map configurations should be smaller than the number of nodes here, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of nodes to define in the partition group sections is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!--&lt;br /&gt;
   ~ Copyright (c) 2008-2013, Hazelcast, Inc. All Rights Reserved.&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
   ~ you may not use this file except in compliance with the License.&lt;br /&gt;
   ~ You may obtain a copy of the License at&lt;br /&gt;
   ~&lt;br /&gt;
   ~ http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
   ~ distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
   ~ See the License for the specific language governing permissions and&lt;br /&gt;
   ~ limitations under the License.&lt;br /&gt;
   --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;hazelcast xsi:schemaLocation=&amp;quot;http://www.hazelcast.com/schema/config hazelcast-config-3.1.xsd&amp;quot;&lt;br /&gt;
            xmlns=&amp;quot;http://www.hazelcast.com/schema/config&amp;quot;&lt;br /&gt;
            xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;partition-group enabled=&amp;quot;true&amp;quot; group-type=&amp;quot;CUSTOM&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.60&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.61&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.62&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
     &amp;lt;/partition-group&amp;gt;&lt;br /&gt;
 &amp;lt;/hazelcast&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More general information regarding custom partioning is available at http://hazelcast.org/docs/latest/manual/html/partitiongroupconfig.html . &lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list same the nodes that are also configured in the parition groups here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
After configuring a custom partitioning scheme, the data distribution may be verified, e.g. by inspecting the MBeans of the distributed maps via JMX.&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about different features that were implemented using the new cluster capabilities.&lt;br /&gt;
&lt;br /&gt;
== Distributed Session Storage ==&lt;br /&gt;
&lt;br /&gt;
Previously, when an Open-Xchange server was shutdown for maintenance, all user sessions that were bound to that machine were lost, i.e. the users needed to login again. With the distributed session storage, all sessions are backed by a distributed map in the cluster, so that they are no longer bound to a specific node in the cluster. When a node is shut down, the session data is still available in the cluster and can be accessed from the remaining nodes. The load-balancing techniques of the webserver then seamlessly routes the user session to another node, with no ''session expired'' errors. The distributed session storage comes with the package ''open-xchange-sessionstorage-hazelcast''. It's recommended to install this optional package in all clustered environments with multiple groupware server nodes.&lt;br /&gt;
&lt;br /&gt;
'''Notes:''' &lt;br /&gt;
* While there's some kind of built-in session distribution among the nodes in the cluster, this should not be seen as a replacement for session-stickiness between the loadbalancer and groupware nodes, i.e. one should still configure the webserver to use sticky sessions for performance reasons.&lt;br /&gt;
* The distributed session storage is still an in-memory storage. While the session data is distributed and backed up on multiple nodes in the cluster, shutting down multiple or all nodes at the same time will lead to loss of the the distributed data. To avoid such data loss when shutting down a node, please follow the guidelines at [[ Updating_a_Cluster ]].&lt;br /&gt;
&lt;br /&gt;
Depending on the cluster infrastructure, different backup-count configuration options might be set for the distributed session storage in the map configuration file ''sessions.properties'' in the ''hazelcast'' subdirectory:&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.backupCount=1&lt;br /&gt;
&lt;br /&gt;
The ''backupcount'' property configures the number of nodes with synchronized backups. Synchronized backups block operations until backups are successfully copied and acknowledgements are received. If 1 is set as the backup-count for example, then all entries of the map will be copied to another JVM for fail-safety. 0 means no backup. Any integer between 0 and 6. Default is 1, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.asyncBackupCount=0&lt;br /&gt;
&lt;br /&gt;
The ''asyncbackup'' property configures the number of nodes with async backups. Async backups do not block operations and do not require acknowledgements. 0 means no backup. Any integer between 0 and 6. Default is 0, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
Since session data is backed up by default continuously by multiple nodes in the cluster, the steps described in [[ Session_Migration ]] to trigger session migration to other nodes explicitly is obsolete and no longer needed with the distributed session storage.&lt;br /&gt;
&lt;br /&gt;
Normally, sessions in the distributed storages are not evicted automatically, but are only removed when they're also removed from the session handler, either due to a logout operation or when exceeding the long-term session lifetime as configured by ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''. Under certain circumstances, i.e. the session is no longer accessed by the client and the OX node hosting the session in it's long-life container being shutdown, the remove operation from the distributed storage might not be triggered. Therefore, additionally a maximum idle time of map-entries can be configured for the distributed sessions map via &lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.configuration.map.maxIdleSeconds=640000&lt;br /&gt;
&lt;br /&gt;
To avoid unnecessary eviction, the value should be higher than the configured ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''.&lt;br /&gt;
&lt;br /&gt;
== Remote Cache Invalidation ==&lt;br /&gt;
&lt;br /&gt;
For faster access, groupware data is held in different caches by the server. Formerly, the caches utilized the TCP Lateral Auxiliary Cache plug in (LTCP) for the underlying JCS caches to broadcast updates and removals to caches on other OX nodes in the cluster. This could potentially lead to problems when remote invalidation was not working reliably due to network discovery problems. As an alternative, remote cache invalidation can also be performed using reliable publish/subscribe events built up on Hazelcast topics. This can be configured in the ''cache.properties'' configuration file, where the 'eventInvalidation' property can either be set to 'false' for the legacy behavior or 'true' for the new mechanism:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.caching.jcs.eventInvalidation=true&lt;br /&gt;
&lt;br /&gt;
All nodes participating in the cluster should be configured equally.&lt;br /&gt;
&lt;br /&gt;
Internally, if ''com.openexchange.caching.jcs.eventInvalidation'' is set to ''true'', LTCP is disabled in JCS caches. Instead, an internal mechanism based on distributed Hazelcast event topics is used to invalidate data throughout all nodes in the cluster after local update- and remove-operations. Put-operations aren't propagated (and haven't been with LTCP either), since all data put into caches can be locally loaded/evaluated at each node from the persistent storage layer.&lt;br /&gt;
&lt;br /&gt;
Using Hazelcast-based cache invalidation also makes further configuration of the JCS auxiliaries obsolete in the ''cache.ccf'' configuration file. In that case, all ''jcs.auxiliary.LTCP.*'' configuration settings are virtually ignored. However, it's still required to mark caches that require cluster-wide invalidation via ''jcs.region.&amp;lt;cache_name&amp;gt;=LTCP'', just as before. So basically, when using the new default setting ''com.openexchange.caching.jcs.eventInvalidation=true'', it's recommended to just use the stock ''cache.ccf'' file, since no further LTCP configuration is required.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
= Adminstration / Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Configuration ==&lt;br /&gt;
&lt;br /&gt;
The underlying Hazelcast library can be configured using the file ''hazelcast.properties''.&lt;br /&gt;
&lt;br /&gt;
'''Important''':&amp;lt;br&amp;gt;&lt;br /&gt;
By default property ''com.openexchange.hazelcast.network.interfaces'' is set to ''127.0.0.1''; meaning Hazelcast listens only to loop-back device. To build a cluster among remote nodes the appropriate network interface needs to be configured there. Leaving that property empty lets Hazelcast listen to all available network interfaces.&lt;br /&gt;
&lt;br /&gt;
The Hazelcast JMX MBean can be enabled or disabled with the property ''com.openexchange.hazelcast.jmx''. The properties ''com.openexchange.hazelcast.mergeFirstRunDelay'' and ''com.openexchange.hazelcast.mergeRunDelay'' control the run intervals of the so-called ''Split Brain Handler'' of Hazelcast that initiates the cluster join process when a new node is started. More details can be found at http://www.hazelcast.com/docs/2.5/manual/single_html/#NetworkPartitioning. &lt;br /&gt;
&lt;br /&gt;
The port ranges used by Hazelcast for incoming and outgoing connections can be controlled via the configuration parameters ''com.openexchange.hazelcast.networkConfig.port'', ''com.openexchange.hazelcast.networkConfig.portAutoIncrement'' and ''com.openexchange.hazelcast.networkConfig.outboundPortDefinitions''.&lt;br /&gt;
&lt;br /&gt;
== Commandline Tool ==&lt;br /&gt;
&lt;br /&gt;
To print out statistics about the cluster and the distributed data, the ''showruntimestats'' commandline tool can be executed with the ''clusterstats'' ('c') argument. This provides an overview about the runtime cluster configuration of the node, other members in the cluster and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== JMX ==&lt;br /&gt;
&lt;br /&gt;
In the Open-Xchange server Java process, the MBean ''com.hazelcast'' can be used to monitor and manage different aspects of the underlying Hazelcast cluster. The ''com.hazelcast'' MBean provides detailed information about the cluster configuration and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Errors ==&lt;br /&gt;
&lt;br /&gt;
When experiencing hazelcast related errors in the logfiles, most likely different versions of the packages are installed, leading to different message formats that can't be understood by nodes using another version. Examples for such errors are exceptions in hazelcast components regarding (de)serialization or other message processing.&lt;br /&gt;
This may happen when performing a consecutive update of all nodes in the cluster, where temporarily nodes with a heterogeneous setup try to communicate with each other. If the errors don't disappear after all nodes in the cluster have been update to the same package versions, it might be necessary to shutdown the cluster completely, so that all distributed data is cleared.&lt;br /&gt;
&lt;br /&gt;
== Cluster Discovery Errors ==&lt;br /&gt;
&lt;br /&gt;
* If the started OX nodes don't form a cluster, please double-check your configuration in ''hazelcast.properties''&lt;br /&gt;
* It's important to have the same cluster name defined in ''hazelcast.properties'' throughout all nodes in the cluster&lt;br /&gt;
* Especially when using multicast cluster discovery, it might take some time until the cluster is formed&lt;br /&gt;
* When using ''static'' cluster discovery, at least one other node in the cluster has to be configured in ''com.openexchange.hazelcast.network.join.static.nodes'' to allow joining, however, it's recommended to list all nodes in the cluster here&lt;br /&gt;
&lt;br /&gt;
== Disable Cluster Features ==&lt;br /&gt;
&lt;br /&gt;
The Hazelcast based clustering features can be disabled with the following property changes:&lt;br /&gt;
* Disable cluster discovery by setting ''com.openexchange.hazelcast.network.join'' to ''empty'' in ''hazelcast.properties''&lt;br /&gt;
* Disable Hazelcast by setting ''com.openexchange.hazelcast.enabled'' to false in ''hazelcast.properties''&lt;br /&gt;
* Disable message based cache event invalidation by setting ''com.openexchange.caching.jcs.eventInvalidation'' to ''false'' in ''cache.properties''&lt;br /&gt;
&lt;br /&gt;
== Update from 6.22.1 to version 6.22.2 and above ==&lt;br /&gt;
&lt;br /&gt;
As hazelcast will be used by default for the distribution of sessions starting 6.22.2 you have to adjust hazelcast according to our old cache configuration. First of all it's important that you install the open-xchange-sessionstorage-hazelcast package. This package will add the binding between hazelcast and the internal session management. Next you have to set a cluster name to the cluster.properties file (see [[#Cluster Discovery Errors]]). Furthermore you will have to add one of the two discovery modes mentioned in [[#Cluster Discovery]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Updating a Cluster =&lt;br /&gt;
&lt;br /&gt;
Running a cluster means built-in failover on the one hand, but might require some attention when it comes to the point of upgrading the services on all nodes in the cluster. This chapter gives an overview about general concepts and hints for silent updates of the cluster.&lt;br /&gt;
&lt;br /&gt;
== The Big Picture ==&lt;br /&gt;
&lt;br /&gt;
Updating an OX App Suite cluster is possible in several ways. The involved steps always include&lt;br /&gt;
&lt;br /&gt;
* Update the software by updating the packages through the distro's repository / software update tool&lt;br /&gt;
* Update the database schemas (so-called update tasks)&lt;br /&gt;
&lt;br /&gt;
There are some precautions required, though.&lt;br /&gt;
&lt;br /&gt;
=== Update Tasks Management ===&lt;br /&gt;
&lt;br /&gt;
It is a feature of the OX App Suite middleware to automatically start update tasks on a database schema when a user tries to login whose context lives on that schema. For installations beyond a certain size, if you just update the OX App Suite software without special handling of the update tasks, user logins will trigger an uncontrolled storm of update tasks on the databases, potentially leading to resource contention, unnecessary long update tasks runtimes, excessive load on the database server, maybe even service outages.&lt;br /&gt;
&lt;br /&gt;
So one key element of every update strategy is to avoid user logins on nodes which have already been updated to the new software version, while the database schemas are still on the old version. There are two fundamentally different approaches to this goal: use either a full downtime, or use a rolling update strategy.&lt;br /&gt;
&lt;br /&gt;
We describe the update strategy in more detail in the next section. Note that these are still high-level outlines of the actual procedure, which requires additional details with regards to Hazelcast, given further down below.&lt;br /&gt;
&lt;br /&gt;
==== Full downtime approach ====&lt;br /&gt;
&lt;br /&gt;
The full downtime approach is quite straightforward and involves&lt;br /&gt;
&lt;br /&gt;
* shutdown of all OX middleware nodes&lt;br /&gt;
* update the software on all OX App Suite (middleware and frontend) nodes&lt;br /&gt;
* execute the update tasks in a controlled way from one OX node&lt;br /&gt;
* restore the service&lt;br /&gt;
&lt;br /&gt;
This is the most general approach and always available, even if the rolling approach is not available due to Hazelcast constraints.&lt;br /&gt;
&lt;br /&gt;
==== Rolling strategy ====&lt;br /&gt;
&lt;br /&gt;
It is possible to execute the update tasks decoupled from the real update of the rest from the cluster, days or even weeks ahead of time, with the following approach:&lt;br /&gt;
&lt;br /&gt;
* If the load situation allows for it, take one node out of the loadbalancer (we call it the upgrade node). Otherwise, add a dedicated upgrade node to your cluster, identically configured to the other middleware nodes.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node&lt;br /&gt;
* update the software on the upgrade node&lt;br /&gt;
* execute all update tasks from the update node.&lt;br /&gt;
&lt;br /&gt;
In the last step, users from affected schemas will be logged out and denied service while the update tasks are running on their database schema. This is typically a short unavailability (some minutes) for a small part (1000...7000 depending on the installation) of the user base. This unavailability is of much lower impact than the unavailability of a full downtime, but you still might want to do this in the off-business hours.&lt;br /&gt;
&lt;br /&gt;
This way you end up with the production cluster running on the old version of OX App Suite, with the database already being upgraded to the next version. This is explicitly a valid and supported configuration. This approach offers the advantage that update tasks can be executed in advance, instead of doing them while the whole system is in a full maintenance downtime. Since update tasks can take some time, this is a considerable advantage.&lt;br /&gt;
&lt;br /&gt;
For the actual upgrade of the production cluster, the remaining steps are:&lt;br /&gt;
&lt;br /&gt;
* Upgrade and restart the OX App Suite software on one middleware node after another, one by one&lt;br /&gt;
* Upgrade the software on the OX App Suite frontend nodes (if these are separate nodes from the middleware nodes)&lt;br /&gt;
&lt;br /&gt;
Hazelcast will ensure that sessions from nodes which you restart are taken over by other nodes in the cluster, so ideally this step works without losing user sessions.&lt;br /&gt;
&lt;br /&gt;
For the rolling strategy to work as described, it is required that the old and new version of OX App Suite use compatible versions of the Hazelcast library. This is the case for most upgrades. However some upgrades must handle the situation that the new version of OX App Suite ships with a new version of Hazelcast incompatible to the version of Hazelcast shipped with the old version of OX App Suite. It will be stated in the release notes if this is the case for a given release. If so, then some additional steps are required during a rolling update to ensure session handling / invalidating during update tasks works properly. See below.&lt;br /&gt;
&lt;br /&gt;
== HOWTO / step-by-step instructions ==&lt;br /&gt;
&lt;br /&gt;
* Take backups of as much as possible (databases, OX config files, etc).&lt;br /&gt;
* Announce the maintenance to the users. The communication depends on which approach you chose: the full downtime approach will come with a full downtime for all users, while the rolling upgrade approach will result in some users will have a short loss of service while their schema upgrades.&lt;br /&gt;
&lt;br /&gt;
=== Full downtime approach ===&lt;br /&gt;
&lt;br /&gt;
* Initiate maintenance: Block HTTP sessions to the service. Put a reasonable maintenance page in place, probably some HTTP error 503 with a reasonable Retry-After header.&lt;br /&gt;
* Shutdown the service on all middleware nodes. Upgrade the software on all middleware and frontend nodes using the disto's package manager. See [[AppSuite:UpdatingOXPackages]] for details on how to do that. Don't forget the &amp;lt;code&amp;gt;touch-appsuite&amp;lt;/code&amp;gt; step if required (&amp;quot;If you update only UI plugins without simultaneously upgrading the core UI packages to a new version&amp;quot;).&lt;br /&gt;
* Start the &amp;lt;code&amp;gt;open-xchange&amp;lt;/code&amp;gt; service on one node&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that, in particular the [[UpdateTasks#How_to_see_all_schemas.3F|section]] about limited parallel execution.&lt;br /&gt;
* Start the &amp;lt;code&amp;gt;open-xchange&amp;lt;/code&amp;gt; services on the middleware nodes.&lt;br /&gt;
* Perform some crosschecks like&lt;br /&gt;
** all middleware nodes joined the Hazelcast cluster&lt;br /&gt;
** all OSGI bundles (which are expected to be running) are running&lt;br /&gt;
** WebUI login is possible&lt;br /&gt;
** Some central functionality tests like sending mails, accessing drive, etc&lt;br /&gt;
* Restore service: allow HTTP sessions, remove the maintenance page.&lt;br /&gt;
&lt;br /&gt;
=== Rolling Upgrade without breaking Hazelcast upgrade ===&lt;br /&gt;
&lt;br /&gt;
Remember: as stated above, this is viable only if the release notes for the new version do not state that there are breaking Hazelcast changes. For example, with v7.8.4 there were breaking Hazelcast changes and in the Release Notes it was stated as follows.&lt;br /&gt;
&lt;br /&gt;
https://software.open-xchange.com/products/appsuite/doc/Release_Notes_for_Release_7.8.4_2017-05-23.pdf&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Important - Please Note&lt;br /&gt;
&lt;br /&gt;
There is a major Hazelcast library update to OX App Suite v7.8.4. This means that when updating from an earlier backend version, due to the upgraded library, it is not possible to form a cluster of nodes that run previous version of Hazelcast (i.e. exiting volatile data in the cluster will be lost during the update). A consistent Hazelcast cluster is needed for cluster-wide cache invalidation. To circumvent problems with database update tasks that need to perform cache invalidation, please follow the steps described here: http://oxpedia.org/wiki/index.php?title=AppSuite:Running_a_cluster#Upgrades_of_the_Hazelcast_library. Please also note that session migration is not possible between versions. This usually affects all user sessions that are stored in a distributed map, and will require the users to re-login after the update. Running incompatible versions of Hazelcast within a cluster will result in logentries showing the conflicting node and version information.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you find you are upgrading to a version with breaking Hazelcast changes, please consult the next section [[#Rolling_Upgrade_with_breaking_Hazelcast_upgrade]].&lt;br /&gt;
&lt;br /&gt;
==== Description of the upgrade process ====&lt;br /&gt;
&lt;br /&gt;
The procedure consists of a '''pre-update''' where one update node will be taken out of the HTTP traffic, to execute database update tasks from that node, and a '''real update''', where all of the cluster nodes will get updated to the new version of the software.&lt;br /&gt;
&lt;br /&gt;
The pre-update will not make the new version of the software available to the users. It will run as kind of &amp;quot;background task&amp;quot;, mostly invisible for the users (but see below for a description of the impact of the update tasks on user experience).&lt;br /&gt;
&lt;br /&gt;
==== Pre-update ====&lt;br /&gt;
&lt;br /&gt;
The following steps all refer to one special middleware node, the so-called ''upgrade node''. The other cluster nodes are not affected by this step.&lt;br /&gt;
&lt;br /&gt;
* Take one middleware node (the upgrade node) out of the HTTP traffic by adjusting the apache mod_proxy tables. We propose a combination of the balancer_manager to do this during runtime without restart, but also update the config files to prevent service restarts of apache to accidentally route sessions to the upgrade node.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node &lt;br /&gt;
* Update packages on the upgrade node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that.&lt;br /&gt;
** Note that executing update tasks on database schemas will result in users from the given database schema to be logged out and locked out during the update tasks.&lt;br /&gt;
** You might want to keep the load low on the DBs, to affect production operations as low as possible, and because with this decoupled update tasks approach there is no immediate time pressure. If you want to follow the [[UpdateTasks#How_to_see_all_schemas.3F|limited parallel]] approach, use a small, mild parallelity factor (e.g. 2 or maybe 4 if you know this by far does not saturate your DB platform).&lt;br /&gt;
&lt;br /&gt;
==== Real Update ====&lt;br /&gt;
&lt;br /&gt;
The following steps refer to all cluster nodes (but the upgrade node, which had been updated before).&lt;br /&gt;
&lt;br /&gt;
* For one middleware cluster node after each nother:&lt;br /&gt;
** Update packages on that middleware node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
** Verify the node starts its bundles, joins the Hazelcast cluster, log files are clean, the node handles sessions&lt;br /&gt;
* For one frontend node after each other (if you've got separate frontend nodes):&lt;br /&gt;
** Update packages on that frontend node. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Finally, if required (&amp;quot;If you update only UI plugins without simultaneously upgrading the core UI packages to a new version&amp;quot;), execute &amp;lt;code&amp;gt;touch-appsuite&amp;lt;/code&amp;gt; with a &amp;lt;code&amp;gt;--timestamp&amp;lt;/code&amp;gt; argument as described on the page [[AppSuite:UpdatingOXPackages]]&lt;br /&gt;
* Perform final crosschecks like&lt;br /&gt;
** all middleware nodes joined the Hazelcast cluster&lt;br /&gt;
** all OSGI bundles (which are expected to be running) are running&lt;br /&gt;
** WebUI login is possible&lt;br /&gt;
** Some central functionality tests like sending mails, accessing drive, etc&lt;br /&gt;
&lt;br /&gt;
=== Rolling Upgrade with breaking Hazelcast upgrade ===&lt;br /&gt;
&lt;br /&gt;
Cf [[#Upgrades_of_the_Hazelcast_library]] below.&lt;br /&gt;
&lt;br /&gt;
In principle the steps given in the previous section apply. However the upgrade needs to get the special Hazelcast Upgrade Package installed (e.g. one from &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-76x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-780-782&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-783&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-784&amp;lt;/code&amp;gt;, ...) during execution of the update tasks.&lt;br /&gt;
&lt;br /&gt;
So the pre-update steps look like:&lt;br /&gt;
&lt;br /&gt;
* Take one middleware node (the upgrade node) out of the HTTP traffic by adjusting the apache mod_proxy tables. We propose a combination of the balancer_manager to do this during runtime without restart, but also update the config files to prevent service restarts of apache to accidentally route sessions to the upgrade node.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node &lt;br /&gt;
* Update packages on the upgrade node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Install the special Hazelcast Upgrade Package on the upgrade node (e.g. one from &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-76x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-780-782&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-783&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-784&amp;lt;/code&amp;gt;, ...). Restart the service again.&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that. You might want to keep the load low on the DBs, to affect production operations as low as possible, and because with this decoupled update tasks approach there is no immediate time pressure. If you want to follow the [[UpdateTasks#How_to_see_all_schemas.3F|limited parallel]] approach, use a small, mild parallelity factor (e.g. 2 or maybe 4 if you know this by far does not saturate your DB platform).&lt;br /&gt;
&lt;br /&gt;
Note: don't worry if you don't see the upgrade node joining the legacy cluster: the upgrade node will not join the legacy cluster / not be visible there since the upgrade node will be a so-called &amp;quot;native client&amp;quot; to the legacy cluster, and it will be created on the fly (and subsequently disposed again) for propagating an event. So also on &amp;lt;code&amp;gt;netstat&amp;lt;/code&amp;gt; level the upgrade node will not have visible connections to the legacy cluster (unless for the very short timeframe when an actual even is sent). You can verify the functionality of that package by log lines like&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; Successfully initialzed Hazelcast client: &amp;lt;client-id&amp;gt;&lt;br /&gt;
 Successfully got reference to cache event topic: cacheEvents-3&lt;br /&gt;
 Publishing legacy cache event: &amp;lt;cache-event&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Successfully published legacy cache event, shutting down client after 546ms...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the overly prudent it might be an idea to prepare a special test context with a test user living in its dedicated (test) schema, so you can test the functionality of this mechanism during upgrade first.&lt;br /&gt;
&lt;br /&gt;
After the DB update tasks you can remove the special upgrade package again from the upgrade node.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Real Upgrade&amp;quot; procedure then looks like [[#Rolling_Upgrade_without_breaking_Hazelcast_upgrade|above]].&lt;br /&gt;
&lt;br /&gt;
== Reference Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== Limitations ===&lt;br /&gt;
&lt;br /&gt;
While in most cases a seamless, rolling upgrade of all nodes in the cluster is possible, there may be situations where nodes running a newer version of the Open-Xchange Server are not able to communicate with older nodes in the cluster, i.e. can't access distributed data or consume incompatible event notifications - especially, when the underlying Hazelcast library is part of the update, which does not support this scenario at the moment. In such cases, the release notes will contain corresponding information, so please have a look there before applying an update.&lt;br /&gt;
&lt;br /&gt;
Additionally, there may always be some kind of race conditions during an update, i.e. client requests that can't be completed successfully or internal events not being deliverd to all nodes in the cluster. That's why the following information should only serve as a best-practices guide to minimize the impact of upgrades to the user experience.&lt;br /&gt;
&lt;br /&gt;
=== Upgrading a single Node ===&lt;br /&gt;
&lt;br /&gt;
Upgrading all nodes in the cluster should usually be done sequentially, i.o.w. one node after the other. This means that during the upgrade of one node, the node is temporarily disconnected from the other nodes in the cluster, and will join the cluster again after the update is completed. From the backend perspective, this is as easy as stopping the open-xchange service. other nodes in the cluster will recognize the disconnected node and start to repartition the shared cluster data automatically. But wait a minute - doing so would potentially lead to the webserver not registering the node being stopped immediately, resulting in temporary errors for currently logged in users until they are routed to another machine in the cluster. That's why it's good practice to tell the webserver's load balancer that the node should no longer fulfill incoming requests. The Apache Balancer Manager is an excellent tool for this ([http://httpd.apache.org/docs/2.2/mod/mod_status.html module ''mod_status'']). Look at the screen shot. Every node can be put into a disabled mode. Further requests will the redirected to other nodes in the cluster:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:balancer_manager.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afterwards, the open-xchange service on the disabled node can be stopped by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange stop&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange stop&lt;br /&gt;
&lt;br /&gt;
Now, the node is effectively in maintenance mode and any updates can take place. One could now verify the changed cluster infrastructure by accessing the Hazelcast MBeans either via JMX or the ''showruntimestats -c'' commandline tool (see above for details). There, the shut down node should no longer appear in the 'Member' section (com.hazelcast:type=Member).&lt;br /&gt;
&lt;br /&gt;
When all upgrades are processed, the node open-xchange service can be started again by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange start&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange start&lt;br /&gt;
&lt;br /&gt;
As stated above, depending on the chosen cluster discovery mechanism, it might take some time until the node joins the cluster again. When using static cluster discovery, it will join the existing cluster usually directly during serivce startup, i.o.w. before other depending OSGi services are started. Otherwise, there might also be situations where the node cannot join the cluster directly, for example when there were no mDNS advertisments for other nodes in the cluster received yet. Then, it can take some additional time until the node finally joins the cluster. During startup of the node, you can observe the JMX console or the output of ''showruntimestats -c'' (com.hazelcast:type=Member) of another node in the cluster to verify when the node has joined. &lt;br /&gt;
&lt;br /&gt;
After the node has joined, distributed data is re-partioned automatically, and the node is ready to server incoming requests again - so now the node can finally be enabled again in the load balancer configuration of the webserver. Afterwards, the next node in the cluster can be upgraded using the same procedure, until all nodes were processed.&lt;br /&gt;
&lt;br /&gt;
=== Upgrades of the Hazelcast library ===&lt;br /&gt;
&lt;br /&gt;
In case an upgrade includes a major update of the Hazelcast library, a newly upgraded node will usually not be able to connect to the nodes running the previous version. In this case, volatile cluster data is lost after all nodes in the cluster have been updated, including sessions held in the distributed session storage. As outlined above, the release notes will contain a corresponding warning in such cases. Starting with v7.10.3, separation of the clusters during rolling upgrades is enforced using by appending a version suffix to the cluster group name.&lt;br /&gt;
&lt;br /&gt;
Besides upgraded nodes not being able to access distributed data of the legacy cluster, this also affects new data not being available in the legacy cluster, which may cause troubles if the updated backend version needs to perform database update tasks. Database update tasks usually operate in a &amp;quot;blocking&amp;quot; way and all contexts associated with the schema being upgraded are disabled temporarily. Since context data itself is being held in caches on potentially each node in the cluster, the affected cache entries are invalidated during the database update. And, since cluster-wide cache invalidations again utilize Hazelcast functionality ([[#Remote Cache Invalidation]]), such invalidations normally won't be propagated to nodes running a previous version of the Hazelcast library.&lt;br /&gt;
&lt;br /&gt;
To work around this specific scenario where an incompatible upgrade of the Hazelcast library needs to be performed along with blocking database update tasks, starting with v7.8.0, a supplementary package is available that explicitly enables the context cache invalidation of nodes running the previous Hazelcast library. This package follows the naming scheme ''open-xchange-cluster-upgrade-from-XXX'' (where XXX representing the version of the legacy version of the Open-Xchange server), and is available in the repositories for the updated server packages. This package should only be installed on the first node of the cluster that is going to be upgraded to the new version, and can be deactivated once the database upgrade tasks were executed successfully. &lt;br /&gt;
&lt;br /&gt;
Once installed, a legacy cluster is discovered based on the available information in the ''hazelcast.properties'' configuration file in case cluster discovery is set to ''static''. If a different join mechanism like ''multicast'' is used, there's an alternative option to configure at least one of the addresses of the legacy cluster via ''com.openexchange.hazelcast.network.client.nodes''. &lt;br /&gt;
&lt;br /&gt;
As an example, along with the server v7.8.0, a new package named ''open-xchange-cluster-upgrade-from-76x'' can be installed that aids in invalidating cluster server nodes running v7.6.x (which includes the Hazelcast library in version 3.2.4). Using this package, the recommended steps to update an OX cluster from version 7.6.x to version 7.8.0 would be:&lt;br /&gt;
# Pick a node from your cluster that you want to use for executing the database update tasks shipped with the new release&lt;br /&gt;
# Disable this node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Update the OX packages on this node, additionally install the package ''open-xchange-cluster-upgrade-from-76x''&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Trigger the update task executions using the ''runUpdate'' commandline utility as described at [[UpdateTasks]]&lt;br /&gt;
# Once they are finished, uninstall the package ''open-xchange-cluster-upgrade-from-76x'' again&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Re-enable the node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Upgrade all other nodes in the cluster as described at [[#Upgrading a single Node]]&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.0 through v7.8.2 (incl.) to v7.8.3 using the package named ''open-xchange-cluster-upgrade-from-780-782'', since v7.8.0 through v7.8.2 (incl.) utilize Hazelcast v3.5.x, while v7.8.3 uses Hazelcast v3.6.4&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.3 to v7.8.4 using the package named ''open-xchange-cluster-upgrade-from-783'', since v7.8.3 utilizes Hazelcast v3.7.1&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.4 to v7.10.0 using the package named ''open-xchange-cluster-upgrade-from-784'', since v7.8.4 utilizes Hazelcast v3.8.1&lt;br /&gt;
&lt;br /&gt;
... and so on.&lt;br /&gt;
&lt;br /&gt;
'''Operations Note:''' The upgraded node will connect temporary as so-called [http://docs.hazelcast.org/docs/2.3/manual/html/ch15.html Native Client] to the legacy Hazelcast Cluster.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Native Client enables you to do all Hazelcast operations without being a member of the cluster.&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
However Native client is not member and relies on one of the cluster members.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means, the upgraded node will not be visible in the members list of the legacy Hazelcast cluster (&amp;lt;code&amp;gt;showruntimestats -c&amp;lt;/code&amp;gt;). Furthermore, the native client will created and destructed on single context events, with the effect that connections will only be visible in the very moment of such an event. This means effectively that verification of the invalidation mechanism is only possible by actually executing the &amp;lt;code&amp;gt;runupdate&amp;lt;/code&amp;gt; CLT. This should produce log lines like&lt;br /&gt;
&lt;br /&gt;
 Successfully initialized Hazelcast client: &amp;lt;client-id&amp;gt;&lt;br /&gt;
 Successfully got reference to cache event topic: cacheEvents-3&lt;br /&gt;
 Publishing legacy cache event: &amp;lt;cache-event&amp;gt;&lt;br /&gt;
 Successfully published legacy cache event, shutting down client after 546ms...&lt;br /&gt;
&lt;br /&gt;
Most importantly, you should be able to observe correct functionality (users of affected contexts being logged out). It may be handy to prepare a dedicated schema with just test contexts inside. (How to create this is out of scope here, but hint: use &amp;lt;code&amp;gt;createschema&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;createcontext --schema-name&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
=== Other Considerations ===&lt;br /&gt;
&lt;br /&gt;
* It's always recommended to only upgrade one node after the other, always ensuring that the cluster has formed correctly between each shutdown/startup of a node.&lt;br /&gt;
* Do not stop a node while running the runUpdate script or the associated update task.&lt;br /&gt;
* During the time of such a rolling upgrade of all nodes, we have effectively heterogeneous software versions in the cluster, which potentially might lead to temporary inconsistencies. Therefore, all nodes in the cluster should be updated in one cycle (but still one after the other).&lt;br /&gt;
* Following the above guideline, it's also possible to add or remove nodes dynamically to the cluster, not only when disconnecting a node temporary for updates.&lt;br /&gt;
* In case of trouble, i.e. a node refuses to join the cluster again after restart, consult the logfiles first for any hints about what is causing the problem - both on the disconnected node, and also on other nodes in the network&lt;br /&gt;
* If there are general incompatibilities between two revisions of the Open-Xchange Server that prevent an operation in a cluster (release notes), it's recommended to choose another name for the cluster in ''cluster.properties'' for the nodes with the new version. This will temporary lead to two separate clusters during the rolling upgrade, and finally the old cluster being shut down completely after the last node was updated to the new version. While distributed data can't be migrated from one server version to another in this scenario due to incompatibilities, the uptime of the system itself is not affected, since the nodes in the new cluster are able to serve new incoming requests directly.&lt;br /&gt;
* When updating only UI plugins without also updating to a new version of the core UI, you also need to perform the additional step from [[AppSuite:UpdatingOXPackages#Updating_UI_plugins|Updating UI plugins]].&lt;br /&gt;
* When performing a rolling upgrade of the middleware nodes in the cluster to 7.10.2 from a previous version (7.10.1 and earlier), the upgraded nodes will not join the Hazelcast cluster and fail to startup properly due to a change in the join process of the underlying Hazelcast library. Therefore, a new configuration switch is introduced that takes care to dynamically append the Hazelcast version to the cluster name so that a new cluster group is created automatically for the upgraded nodes: &amp;lt;code&amp;gt;com.openexchange.hazelcast.group.name.appendVersion&amp;lt;/code&amp;gt;. Please mind that this configuration property is only applicable for 7.10.2; later versions starting with 7.10.3 will always append the version identifier to the group name. The default value is &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, so that there are no surprises when patching an existing 7.10.2 installation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]] [[Category: Administration]] [[Category: Cluster]]&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=25236</id>
		<title>AppSuite:Running a cluster</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=25236"/>
		<updated>2020-01-30T12:27:26Z</updated>

		<summary type="html">&lt;p&gt;Thorben: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Running a cluster&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Concepts =&lt;br /&gt;
&lt;br /&gt;
For inter-OX-communication over the network, multiple Open-Xchange servers can form a cluster. This brings different advantages regarding distribution and caching of volatile data, load balancing, scalability, fail-safety and robustness. Additionally, it provides the infrastructure for upcoming features of the Open-Xchange server. &lt;br /&gt;
The clustering capabilities of the Open-Xchange server are mainly built up on [http://hazelcast.com Hazelcast], an open source clustering and highly scalable data distribution platform for Java. The following article provides an overview about the current featureset and configuration options.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
&lt;br /&gt;
== Synchronized system clock times ==&lt;br /&gt;
It is crucial that all involved members in a cluster do have their system clock times in sync with each other; e.g. by using an NTP service.&lt;br /&gt;
&lt;br /&gt;
== HTTP routing ==&lt;br /&gt;
An OX cluster is always part of a larger picture. Usually there is front level loadbalancer as central HTTPS entry point to the platform. This loadbalancer optionally performs HTTPS termination and forwards HTTP(S) requests to webservers (the usual and only supported choice as of now is Apache). These webservers are performing HTTPS termination (if this is not happening on the loadbalancer) and serve static content, and (which is what is relevant for our discussion here) they forward dynamic requests to the OX backends.&lt;br /&gt;
&lt;br /&gt;
A central requirement for the interaction of these components (loadbalancer, webservers, OX nodes) is that we have session stability based on the JSESSIONID cookie / jsessionid path component suffix. This means that our application sets a cookie named JSESSIONID which has a value like &amp;lt;large decimal number&amp;gt;.&amp;lt;route identifier&amp;gt;, e.g. &amp;quot;5661584529655240315.OX1&amp;quot;. The route identifier here (&amp;quot;OX1&amp;quot; in this example) is taken by the OX node from a configuration setting from a config file and is specific to one OX node. HTTP routing must happen such that HTTP requests with a cookie with such a suffix always end up the corresponding OX node. There are furthermore specific circumstances when passing this information via cookie is not possible. Then the JSESSIONID is transferred in a path component as &amp;quot;jsessionid=...&amp;quot; in the HTTP request. The routing mechanism needs to take that into account also.&lt;br /&gt;
&lt;br /&gt;
There are mainly two options to implement this. If the Apache processes are running co-located on the same machines running the OX groupware processes, it is often desired to have the front level loadbalancer perform HTTP routing to the correct machines. If dedicated Apache nodes are employed, is is usually sufficient to have the front-level loadbalancer do HTTP routing to the Apache nodes in a round-robin fashion and perform routing to the correct OX nodes in the Apache nodes.&lt;br /&gt;
&lt;br /&gt;
We provide sample configuration files to configure Apache (with mod_proxy_http) to perform HTTP routing correctly in our guides on OXpedia, e.g. [[AppSuite:Main_Page_AppSuite#quickinstall]]. Central elements are the directives &amp;quot;ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&amp;quot; in conjunction with the &amp;quot;route=OX1&amp;quot; parameters to the BalancerMember lines in the Proxy definition. This is valid for Apache 2.2 as of Sep-2014.&lt;br /&gt;
&lt;br /&gt;
How to configure a front level loadbalancer to perform HTTP equivalent HTTP routing is dependent on the specific loadbalancer implementation. If Apache is used as front level loadbalancer, the same configuration as discussed in the previous section can be employed. As of time of writing this text (Sep 2014), the alternative choices are thin. F5 BigIP is reported to be able to implement &amp;quot;jsessionid based persistence using iRules&amp;quot;. nginx has the functionality in their commercial &amp;quot;nginx plus&amp;quot; product. (Both of these options have not been tested by OX.) Other loadbalancers with this functionality are not known to us.&lt;br /&gt;
&lt;br /&gt;
If the front level loadbalancer is not capable of performing correct HTTP routing, is is required to configure correct HTTP routing on Apache level, even if Apache runs co-located on the OX nodes and thus cross-routing happens.&lt;br /&gt;
&lt;br /&gt;
There are several reasons why we require session stability in exactly this way. We require session stability for horizontal scale-out; while we support transparent resuming / migration of user sessions in the OX cluster without need for users to re-authenticate, sessions wandering around randomly will consume a fixed amount resources corresponding to a running session on each OX node in the cluster, while a session sticky to one OX node will consume this fixed amount of resources only on one OX node. Furthermore there are mechanisms in OX like TokenLogin which work only of all requests belonging to one sequence get routed to the same OX node even if they stem from different machines with different IPs. Only the JSESSIONID (which in this case is transferred as jsessionid path component, as cookies do not work during a 302 redirect, which is part of this sequence) carries the required information where the request must be routed to.&lt;br /&gt;
&lt;br /&gt;
Usual &amp;quot;routing based on cookie hash&amp;quot; is not sufficient here since it disregards the information which machine originally issued the cookie. It only ensures that the session will be sticky to any target, which statistically will not be the same machine that issued the cookie. OX will then set a new JSESSIONID cookie, assuming the session had been migrated. The loadbalancer will then route the session to a different target, as the hash of the cookie will differ. This procedure then happens iteratively until by chance the routing based on cookie hash will route the session to the correct target. By then, a lot of resources will have been wasted, by creating full (short-term) sessions on all OX nodes. Furthermore, processes like TokenLogin will not work this way.&lt;br /&gt;
&lt;br /&gt;
== Same Packages ==&lt;br /&gt;
&lt;br /&gt;
All middleware nodes participating in the Hazelcast cluster need to have the same ''open-xchange-*'' packages installed, so that all dynamically injected class definitions are available during (de-)erialization on all nodes. So for example, even if a node does not serve requests from the web client, it still requires the realtime packages for collaborative document editing or the packages for the distributed session storage being installed.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
All settings regarding cluster setup are located in the configuration file ''hazelcast.properties''. The former used additional files ''cluster.properties'', ''mdns.properties'' and ''static-cluster-discovery.properties'' are no longer needed. The following gives an overview about the most important settings - please refer to the inline documentation of the configuration file for more advanced options.&lt;br /&gt;
&lt;br /&gt;
Note: The configuration guide targets v7.4.0 of the OX server (and above). For older versions, please consult the history of this page. A full list of Hazelcast-related properties is available at https://documentation.open-xchange.com/components/middleware/config/7.8.4/#mode=features&amp;amp;feature=Hazelcast .&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
To restrict access to the cluster and to separate the cluster from others in the local network, a group name needs to be defined. Up to v7.10.2, an additional group password, configurable via ''com.openexchange.hazelcast.group.password'' was used. Only backend nodes having the same values for those properties are able to join and form a cluster. &lt;br /&gt;
&lt;br /&gt;
 # Configures the name of the cluster. Only nodes using the same group name &lt;br /&gt;
 # will join each other and form the cluster. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is not &amp;quot;empty&amp;quot; (see below).&lt;br /&gt;
 com.openexchange.hazelcast.group.name=&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
== Network ==&lt;br /&gt;
&lt;br /&gt;
It's required to define the network interface that is used for cluster communication via ''com.openexchange.hazelcast.network.interfaces''. By default, the interface is restricted to the local loopback address only. To allow the same configuration amongst all nodes in the cluster, it's recommended to define the value using a wildcard matching the IP addresses of all nodes participating in the cluster, e.g. ''192.168.0.*''&lt;br /&gt;
&lt;br /&gt;
 # Comma-separated list of interface addresses hazelcast should use. Wildcards &lt;br /&gt;
 # (*) and ranges (-) can be used. Leave blank to listen on all interfaces&lt;br /&gt;
 # Especially in server environments with multiple network interfaces, it's &lt;br /&gt;
 # recommended to specify the IP-address of the network interface to bind to &lt;br /&gt;
 # explicitly. Defaults to &amp;quot;127.0.0.1&amp;quot; (local loopback only), needs to be &lt;br /&gt;
 # adjusted when building a cluster of multiple backend nodes.&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=127.0.0.1&lt;br /&gt;
&lt;br /&gt;
To form a cluster of multiple OX server nodes, different discovery mechanisms can be used. The discovery mechanism is specified via the property ''com.openexchange.hazelcast.network.join'':&lt;br /&gt;
&lt;br /&gt;
 # Specifies which mechanism is used to discover other backend nodes in the&lt;br /&gt;
 # cluster. Possible values are &amp;quot;empty&amp;quot; (no discovery for single-node setups),&lt;br /&gt;
 # &amp;quot;static&amp;quot; (fixed set of cluster member nodes), &amp;quot;multicast&amp;quot; (automatic discovery&lt;br /&gt;
 # of other nodes via multicast) or &amp;quot;dns&amp;quot; to consult a DNS server to resolve the&lt;br /&gt;
 # domain names to the most recent set of IP addresses of all service nodes.&lt;br /&gt;
 # Defaults to &amp;quot;empty&amp;quot;. Depending on the specified value, further configuration&lt;br /&gt;
 # might be needed; see &amp;quot;Networking&amp;quot; section below.&lt;br /&gt;
 com.openexchange.hazelcast.network.join=empty&lt;br /&gt;
&lt;br /&gt;
Generally, it's advised to use the same network join mechanism for all nodes in the cluster, and, in most cases, it's strongly recommended to use a ''static'' network join configuration. This will allow the nodes to join the cluster directly upon startup. With a ''multicast'' based setup, nodes will merge to an existing cluster possibly at some later time, thus not being able to access the distributed data until they've joined.&lt;br /&gt;
&lt;br /&gt;
Depending on the network join setting, further configuration may be necessary, as described in the following paragraphs.&lt;br /&gt;
&lt;br /&gt;
=== empty ===&lt;br /&gt;
&lt;br /&gt;
When using the default value ''empty'', no other nodes are discovered in the cluster. This value is suitable for single-node installations. Note that other nodes that are configured to use other network join mechanisms may be still able to still to connect to this node, e.g. using a ''static'' network join, having the IP address of this host in the list of potential cluster members (see below).&lt;br /&gt;
&lt;br /&gt;
=== static ===&lt;br /&gt;
&lt;br /&gt;
The most common setting for ''com.openexchange.hazelcast.network.join'' is ''static''. A static cluster discovery uses a fixed list of IP addresses of the nodes in the cluster. During startup and after a specific interval, the underlying Hazelcast library probes for not yet joined nodes from this list and adds them to the cluster automatically. The address list is configured via ''com.openexchange.hazelcast.network.join.static.nodes'':&lt;br /&gt;
&lt;br /&gt;
 # Configures a comma-separated list of IP addresses / hostnames of possible &lt;br /&gt;
 # nodes in the cluster, e.g. &amp;quot;10.20.30.12, 10.20.30.13:5701, 192.178.168.110&amp;quot;.&lt;br /&gt;
 # Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;static&amp;quot;. &lt;br /&gt;
 # It doesn't hurt if the address of the local host appears in the list, so &lt;br /&gt;
 # that it's still possible to use the same list throughout all nodes in the &lt;br /&gt;
 # cluster.&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=&lt;br /&gt;
&lt;br /&gt;
For a fixed set of backend nodes, it's recommended to simply include the IP addresses of all nodes in the list, and use the same configuration for each node. However, it's only required to add the address of at least one other node in the cluster to allow the node to join the cluster. Also, when adding a new node to the cluster and this list is extended accordingly, existing nodes don't need to be shut down to recognize the new node, as long as the new node's address list contains at least one of the already running nodes. &lt;br /&gt;
&lt;br /&gt;
=== multicast ===&lt;br /&gt;
&lt;br /&gt;
For highly dynamic setups where nodes are added and removed from the cluster quite often and/or the host's IP addresses are not fixed, it's also possible to configure the network join via multicast. During startup and after a specific interval, the backend nodes initiate the multicast join process automatically, and discovered nodes form or join the cluster afterwards. The multicast group and port can be configured as follows:&lt;br /&gt;
&lt;br /&gt;
 # Configures the multicast address used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. If the nodes reside in different subnets, please ensure that &lt;br /&gt;
 # multicast is enabled between the subnets. Defaults to &amp;quot;224.2.2.3&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.group=224.2.2.3&lt;br /&gt;
 &lt;br /&gt;
 # Configures the multicast port used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. Defaults to &amp;quot;54327&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.port=54327&lt;br /&gt;
&lt;br /&gt;
=== dns ===&lt;br /&gt;
&lt;br /&gt;
A very common approach for service discovery in cloud environments is to use plain old DNS. Any service, consisting of a varying number of elastic nodes, would get its own domain name. Against a certain DNS server, this name always resolves to the most recent set of IP addresses of all service nodes.&lt;br /&gt;
&lt;br /&gt;
 # The comma-separated list of domain names that are supposed to be resolved to a&lt;br /&gt;
 # (super-)set of host addresses through a DNS look-up.&lt;br /&gt;
 # Only effective if property &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;dns&amp;quot;&lt;br /&gt;
 com.openexchange.hazelcast.network.join.dns.domainNames=&lt;br /&gt;
&lt;br /&gt;
 # The optional host name for the DNS server. If not specified system's default DNS service is used.&lt;br /&gt;
 # Only effective if property &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;dns&amp;quot;&lt;br /&gt;
 com.openexchange.hazelcast.network.join.dns.resolverHost=&lt;br /&gt;
&lt;br /&gt;
 # The optional port number for the DNS server. If not specified default port (53 UDP) is used.&lt;br /&gt;
 # Only effective if property &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;dns&amp;quot;&lt;br /&gt;
 com.openexchange.hazelcast.network.join.dns.resolverPort=53&lt;br /&gt;
&lt;br /&gt;
 # The refrsh rate in milliseconds when a new DNS look-up is supported to be performed to&lt;br /&gt;
 # apply possibly changed members to Hazelcast network configuration.&lt;br /&gt;
 # Only effective if property &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;dns&amp;quot;&lt;br /&gt;
 com.openexchange.hazelcast.network.join.dns.refreshMillis=60000&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The following example shows how a simple cluster named ''MyCluster'' consisting of 4 backend nodes can be configured using ''static'' cluster discovery. The node's IP addresses are 10.0.0.15, 10.0.0.16, 10.0.0.17 and 10.0.0.18. Note that the same ''hazelcast.properties'' is used by all nodes.&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.group.name=MyCluster&lt;br /&gt;
 com.openexchange.hazelcast.network.join=static&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=10.0.0.15,10.0.0.16,10.0.0.17,10.0.0.18&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=10.0.0.*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Advanced Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Lite Members (available since v7.8.4) ===&lt;br /&gt;
&lt;br /&gt;
Lite members in a Hazelcast cluster are members that do not hold any data partitions, i.e. all read- and write operations to distributed maps are delegated to non-lite (&amp;quot;full&amp;quot;) members. Apart from not having data partitions, lite members participate in the same way as other members: they can register listeners for distributed topics (e.g. cache invalidation events) or can be addressed for task execution (e.g. during realtime communication). &lt;br /&gt;
&lt;br /&gt;
Similar to using a custom partitioning scheme, separating the nodes of a large cluster into few &amp;quot;full&amp;quot; members and many &amp;quot;lite&amp;quot; members helps to minimize the impact of JVM activities from a single node (mainly the garbage collector) on the whole cluster communication. Additionally, when starting or stopping lite members, no repartitioning of the distributed cluster data needs to be performed, which significantly decreases the node's startup- and shutdown time and reduces the necessary network communication to a minimum. &lt;br /&gt;
&lt;br /&gt;
In medium or larger sized clusters, it is sufficient to have roughly 10 to 20 percent of the nodes configured as &amp;quot;full&amp;quot; members, while all other ones can be started as &amp;quot;lite&amp;quot; member nodes. Additionally, please note that the configured backup count in the map configurations should always be smaller than the total number of &amp;quot;full&amp;quot; members, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of &amp;quot;full&amp;quot; members is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
The configured &amp;quot;full&amp;quot; members should preferably not be used to serve client requests (by not adding them as endpoint in the loadbalancer), to ensure they are always responsive. Also, shutdown and startups of those &amp;quot;full&amp;quot; members should be reduced to a minimum to avoid repartitioning operations. &lt;br /&gt;
&lt;br /&gt;
More general information regarding lite members is available at http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#enabling-lite-members .&lt;br /&gt;
&lt;br /&gt;
To configure a node as &amp;quot;lite&amp;quot; member, the following configuration should be applied in the node's ''hazelcast.properties'' file:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.liteMember=true&lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list all &amp;quot;full&amp;quot; member nodes here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
=== Custom Partitioning ===&lt;br /&gt;
&lt;br /&gt;
Note: Starting with v7.8.4, &amp;quot;Lite Members&amp;quot; should be used in favor of applying a custom partitioning scheme.&lt;br /&gt;
&lt;br /&gt;
While originally being designed to separate the nodes holding distributed data into different risk groups for increased fail safety, a custom partitioning strategy may also be used to distinguish between nodes holding distributed data from those who should not. &lt;br /&gt;
&lt;br /&gt;
This approach of custom partitioning may be used in a OX cluster, where usually different backend nodes serve different purposes. A common scenario is that there are nodes handling requests from the web interfaces, and others being responsible for USM/EAS traffic. Due to their nature of processing large chunks of synchronization data in memory, the USM/EAS nodes may encounter small delays when the Java garbage collector kicks in and suspends the Java Virtual Machine. Since those delays may also have an influence on hazelcast-based communication in the cluster, the idea is to instruct hazelcast to not store distributed data on that nodes. This is where a custom partitioning scheme comes into play.&lt;br /&gt;
&lt;br /&gt;
To setup a custom partitioning scheme in the cluster, an additional ''hazelcast.xml'' configuration file is used, which should be placed into the ''hazelcast'' subdirectory of the OX configuration folder, usually at ''/opt/openexchange/etc/hazelcast''. Please note that it's vital that each node in the cluster is configured equally here, so the same ''hazelcast.xml'' file should be copied to each server. The configuration read from there is used as basis for all further settings that are taken from the ordinary ''hazelcast.properties'' config file. &lt;br /&gt;
&lt;br /&gt;
To setup a custom partitioning scheme, the partition groups must be defined in the ''hazelcast.xml'' file. See the following file for an example configuration, where the three nodes ''10.10.10.60'', ''10.10.10.61'' and ''10.10.10.62'' are defined to form an own partitioning group each. Doing so, all distributed data will be stored at one of those nodes physically, while the corresponding backup data (if configured) at one of the other two nodes. All other nodes in the cluster will not be used to store distributed data, but will still be &amp;quot;full&amp;quot; hazelcast members, which is necessary for other cluster-wide operations the OX backends use. &lt;br /&gt;
&lt;br /&gt;
Please note that the configured backup count in the map configurations should be smaller than the number of nodes here, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of nodes to define in the partition group sections is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!--&lt;br /&gt;
   ~ Copyright (c) 2008-2013, Hazelcast, Inc. All Rights Reserved.&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
   ~ you may not use this file except in compliance with the License.&lt;br /&gt;
   ~ You may obtain a copy of the License at&lt;br /&gt;
   ~&lt;br /&gt;
   ~ http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
   ~ distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
   ~ See the License for the specific language governing permissions and&lt;br /&gt;
   ~ limitations under the License.&lt;br /&gt;
   --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;hazelcast xsi:schemaLocation=&amp;quot;http://www.hazelcast.com/schema/config hazelcast-config-3.1.xsd&amp;quot;&lt;br /&gt;
            xmlns=&amp;quot;http://www.hazelcast.com/schema/config&amp;quot;&lt;br /&gt;
            xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;partition-group enabled=&amp;quot;true&amp;quot; group-type=&amp;quot;CUSTOM&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.60&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.61&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.62&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
     &amp;lt;/partition-group&amp;gt;&lt;br /&gt;
 &amp;lt;/hazelcast&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More general information regarding custom partioning is available at http://hazelcast.org/docs/latest/manual/html/partitiongroupconfig.html . &lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list same the nodes that are also configured in the parition groups here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
After configuring a custom partitioning scheme, the data distribution may be verified, e.g. by inspecting the MBeans of the distributed maps via JMX.&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about different features that were implemented using the new cluster capabilities.&lt;br /&gt;
&lt;br /&gt;
== Distributed Session Storage ==&lt;br /&gt;
&lt;br /&gt;
Previously, when an Open-Xchange server was shutdown for maintenance, all user sessions that were bound to that machine were lost, i.e. the users needed to login again. With the distributed session storage, all sessions are backed by a distributed map in the cluster, so that they are no longer bound to a specific node in the cluster. When a node is shut down, the session data is still available in the cluster and can be accessed from the remaining nodes. The load-balancing techniques of the webserver then seamlessly routes the user session to another node, with no ''session expired'' errors. The distributed session storage comes with the package ''open-xchange-sessionstorage-hazelcast''. It's recommended to install this optional package in all clustered environments with multiple groupware server nodes.&lt;br /&gt;
&lt;br /&gt;
'''Notes:''' &lt;br /&gt;
* While there's some kind of built-in session distribution among the nodes in the cluster, this should not be seen as a replacement for session-stickiness between the loadbalancer and groupware nodes, i.e. one should still configure the webserver to use sticky sessions for performance reasons.&lt;br /&gt;
* The distributed session storage is still an in-memory storage. While the session data is distributed and backed up on multiple nodes in the cluster, shutting down multiple or all nodes at the same time will lead to loss of the the distributed data. To avoid such data loss when shutting down a node, please follow the guidelines at [[ Updating_a_Cluster ]].&lt;br /&gt;
&lt;br /&gt;
Depending on the cluster infrastructure, different backup-count configuration options might be set for the distributed session storage in the map configuration file ''sessions.properties'' in the ''hazelcast'' subdirectory:&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.backupCount=1&lt;br /&gt;
&lt;br /&gt;
The ''backupcount'' property configures the number of nodes with synchronized backups. Synchronized backups block operations until backups are successfully copied and acknowledgements are received. If 1 is set as the backup-count for example, then all entries of the map will be copied to another JVM for fail-safety. 0 means no backup. Any integer between 0 and 6. Default is 1, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.asyncBackupCount=0&lt;br /&gt;
&lt;br /&gt;
The ''asyncbackup'' property configures the number of nodes with async backups. Async backups do not block operations and do not require acknowledgements. 0 means no backup. Any integer between 0 and 6. Default is 0, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
Since session data is backed up by default continuously by multiple nodes in the cluster, the steps described in [[ Session_Migration ]] to trigger session migration to other nodes explicitly is obsolete and no longer needed with the distributed session storage.&lt;br /&gt;
&lt;br /&gt;
Normally, sessions in the distributed storages are not evicted automatically, but are only removed when they're also removed from the session handler, either due to a logout operation or when exceeding the long-term session lifetime as configured by ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''. Under certain circumstances, i.e. the session is no longer accessed by the client and the OX node hosting the session in it's long-life container being shutdown, the remove operation from the distributed storage might not be triggered. Therefore, additionally a maximum idle time of map-entries can be configured for the distributed sessions map via &lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.configuration.map.maxIdleSeconds=640000&lt;br /&gt;
&lt;br /&gt;
To avoid unnecessary eviction, the value should be higher than the configured ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''.&lt;br /&gt;
&lt;br /&gt;
== Remote Cache Invalidation ==&lt;br /&gt;
&lt;br /&gt;
For faster access, groupware data is held in different caches by the server. Formerly, the caches utilized the TCP Lateral Auxiliary Cache plug in (LTCP) for the underlying JCS caches to broadcast updates and removals to caches on other OX nodes in the cluster. This could potentially lead to problems when remote invalidation was not working reliably due to network discovery problems. As an alternative, remote cache invalidation can also be performed using reliable publish/subscribe events built up on Hazelcast topics. This can be configured in the ''cache.properties'' configuration file, where the 'eventInvalidation' property can either be set to 'false' for the legacy behavior or 'true' for the new mechanism:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.caching.jcs.eventInvalidation=true&lt;br /&gt;
&lt;br /&gt;
All nodes participating in the cluster should be configured equally.&lt;br /&gt;
&lt;br /&gt;
Internally, if ''com.openexchange.caching.jcs.eventInvalidation'' is set to ''true'', LTCP is disabled in JCS caches. Instead, an internal mechanism based on distributed Hazelcast event topics is used to invalidate data throughout all nodes in the cluster after local update- and remove-operations. Put-operations aren't propagated (and haven't been with LTCP either), since all data put into caches can be locally loaded/evaluated at each node from the persistent storage layer.&lt;br /&gt;
&lt;br /&gt;
Using Hazelcast-based cache invalidation also makes further configuration of the JCS auxiliaries obsolete in the ''cache.ccf'' configuration file. In that case, all ''jcs.auxiliary.LTCP.*'' configuration settings are virtually ignored. However, it's still required to mark caches that require cluster-wide invalidation via ''jcs.region.&amp;lt;cache_name&amp;gt;=LTCP'', just as before. So basically, when using the new default setting ''com.openexchange.caching.jcs.eventInvalidation=true'', it's recommended to just use the stock ''cache.ccf'' file, since no further LTCP configuration is required.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
= Adminstration / Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Configuration ==&lt;br /&gt;
&lt;br /&gt;
The underlying Hazelcast library can be configured using the file ''hazelcast.properties''.&lt;br /&gt;
&lt;br /&gt;
'''Important''':&amp;lt;br&amp;gt;&lt;br /&gt;
By default property ''com.openexchange.hazelcast.network.interfaces'' is set to ''127.0.0.1''; meaning Hazelcast listens only to loop-back device. To build a cluster among remote nodes the appropriate network interface needs to be configured there. Leaving that property empty lets Hazelcast listen to all available network interfaces.&lt;br /&gt;
&lt;br /&gt;
The Hazelcast JMX MBean can be enabled or disabled with the property ''com.openexchange.hazelcast.jmx''. The properties ''com.openexchange.hazelcast.mergeFirstRunDelay'' and ''com.openexchange.hazelcast.mergeRunDelay'' control the run intervals of the so-called ''Split Brain Handler'' of Hazelcast that initiates the cluster join process when a new node is started. More details can be found at http://www.hazelcast.com/docs/2.5/manual/single_html/#NetworkPartitioning. &lt;br /&gt;
&lt;br /&gt;
The port ranges used by Hazelcast for incoming and outgoing connections can be controlled via the configuration parameters ''com.openexchange.hazelcast.networkConfig.port'', ''com.openexchange.hazelcast.networkConfig.portAutoIncrement'' and ''com.openexchange.hazelcast.networkConfig.outboundPortDefinitions''.&lt;br /&gt;
&lt;br /&gt;
== Commandline Tool ==&lt;br /&gt;
&lt;br /&gt;
To print out statistics about the cluster and the distributed data, the ''showruntimestats'' commandline tool can be executed with the ''clusterstats'' ('c') argument. This provides an overview about the runtime cluster configuration of the node, other members in the cluster and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== JMX ==&lt;br /&gt;
&lt;br /&gt;
In the Open-Xchange server Java process, the MBean ''com.hazelcast'' can be used to monitor and manage different aspects of the underlying Hazelcast cluster. The ''com.hazelcast'' MBean provides detailed information about the cluster configuration and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Errors ==&lt;br /&gt;
&lt;br /&gt;
When experiencing hazelcast related errors in the logfiles, most likely different versions of the packages are installed, leading to different message formats that can't be understood by nodes using another version. Examples for such errors are exceptions in hazelcast components regarding (de)serialization or other message processing.&lt;br /&gt;
This may happen when performing a consecutive update of all nodes in the cluster, where temporarily nodes with a heterogeneous setup try to communicate with each other. If the errors don't disappear after all nodes in the cluster have been update to the same package versions, it might be necessary to shutdown the cluster completely, so that all distributed data is cleared.&lt;br /&gt;
&lt;br /&gt;
== Cluster Discovery Errors ==&lt;br /&gt;
&lt;br /&gt;
* If the started OX nodes don't form a cluster, please double-check your configuration in ''hazelcast.properties''&lt;br /&gt;
* It's important to have the same cluster name defined in ''hazelcast.properties'' throughout all nodes in the cluster&lt;br /&gt;
* Especially when using multicast cluster discovery, it might take some time until the cluster is formed&lt;br /&gt;
* When using ''static'' cluster discovery, at least one other node in the cluster has to be configured in ''com.openexchange.hazelcast.network.join.static.nodes'' to allow joining, however, it's recommended to list all nodes in the cluster here&lt;br /&gt;
&lt;br /&gt;
== Disable Cluster Features ==&lt;br /&gt;
&lt;br /&gt;
The Hazelcast based clustering features can be disabled with the following property changes:&lt;br /&gt;
* Disable cluster discovery by setting ''com.openexchange.hazelcast.network.join'' to ''empty'' in ''hazelcast.properties''&lt;br /&gt;
* Disable Hazelcast by setting ''com.openexchange.hazelcast.enabled'' to false in ''hazelcast.properties''&lt;br /&gt;
* Disable message based cache event invalidation by setting ''com.openexchange.caching.jcs.eventInvalidation'' to ''false'' in ''cache.properties''&lt;br /&gt;
&lt;br /&gt;
== Update from 6.22.1 to version 6.22.2 and above ==&lt;br /&gt;
&lt;br /&gt;
As hazelcast will be used by default for the distribution of sessions starting 6.22.2 you have to adjust hazelcast according to our old cache configuration. First of all it's important that you install the open-xchange-sessionstorage-hazelcast package. This package will add the binding between hazelcast and the internal session management. Next you have to set a cluster name to the cluster.properties file (see [[#Cluster Discovery Errors]]). Furthermore you will have to add one of the two discovery modes mentioned in [[#Cluster Discovery]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Updating a Cluster =&lt;br /&gt;
&lt;br /&gt;
Running a cluster means built-in failover on the one hand, but might require some attention when it comes to the point of upgrading the services on all nodes in the cluster. This chapter gives an overview about general concepts and hints for silent updates of the cluster.&lt;br /&gt;
&lt;br /&gt;
== The Big Picture ==&lt;br /&gt;
&lt;br /&gt;
Updating an OX App Suite cluster is possible in several ways. The involved steps always include&lt;br /&gt;
&lt;br /&gt;
* Update the software by updating the packages through the distro's repository / software update tool&lt;br /&gt;
* Update the database schemas (so-called update tasks)&lt;br /&gt;
&lt;br /&gt;
There are some precautions required, though.&lt;br /&gt;
&lt;br /&gt;
=== Update Tasks Management ===&lt;br /&gt;
&lt;br /&gt;
It is a feature of the OX App Suite middleware to automatically start update tasks on a database schema when a user tries to login whose context lives on that schema. For installations beyond a certain size, if you just update the OX App Suite software without special handling of the update tasks, user logins will trigger an uncontrolled storm of update tasks on the databases, potentially leading to resource contention, unnecessary long update tasks runtimes, excessive load on the database server, maybe even service outages.&lt;br /&gt;
&lt;br /&gt;
So one key element of every update strategy is to avoid user logins on nodes which have already been updated to the new software version, while the database schemas are still on the old version. There are two fundamentally different approaches to this goal: use either a full downtime, or use a rolling update strategy.&lt;br /&gt;
&lt;br /&gt;
We describe the update strategy in more detail in the next section. Note that these are still high-level outlines of the actual procedure, which requires additional details with regards to Hazelcast, given further down below.&lt;br /&gt;
&lt;br /&gt;
==== Full downtime approach ====&lt;br /&gt;
&lt;br /&gt;
The full downtime approach is quite straightforward and involves&lt;br /&gt;
&lt;br /&gt;
* shutdown of all OX middleware nodes&lt;br /&gt;
* update the software on all OX App Suite (middleware and frontend) nodes&lt;br /&gt;
* execute the update tasks in a controlled way from one OX node&lt;br /&gt;
* restore the service&lt;br /&gt;
&lt;br /&gt;
This is the most general approach and always available, even if the rolling approach is not available due to Hazelcast constraints.&lt;br /&gt;
&lt;br /&gt;
==== Rolling strategy ====&lt;br /&gt;
&lt;br /&gt;
It is possible to execute the update tasks decoupled from the real update of the rest from the cluster, days or even weeks ahead of time, with the following approach:&lt;br /&gt;
&lt;br /&gt;
* If the load situation allows for it, take one node out of the loadbalancer (we call it the upgrade node). Otherwise, add a dedicated upgrade node to your cluster, identically configured to the other middleware nodes.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node&lt;br /&gt;
* update the software on the upgrade node&lt;br /&gt;
* execute all update tasks from the update node.&lt;br /&gt;
&lt;br /&gt;
In the last step, users from affected schemas will be logged out and denied service while the update tasks are running on their database schema. This is typically a short unavailability (some minutes) for a small part (1000...7000 depending on the installation) of the user base. This unavailability is of much lower impact than the unavailability of a full downtime, but you still might want to do this in the off-business hours.&lt;br /&gt;
&lt;br /&gt;
This way you end up with the production cluster running on the old version of OX App Suite, with the database already being upgraded to the next version. This is explicitly a valid and supported configuration. This approach offers the advantage that update tasks can be executed in advance, instead of doing them while the whole system is in a full maintenance downtime. Since update tasks can take some time, this is a considerable advantage.&lt;br /&gt;
&lt;br /&gt;
For the actual upgrade of the production cluster, the remaining steps are:&lt;br /&gt;
&lt;br /&gt;
* Upgrade and restart the OX App Suite software on one middleware node after another, one by one&lt;br /&gt;
* Upgrade the software on the OX App Suite frontend nodes (if these are separate nodes from the middleware nodes)&lt;br /&gt;
&lt;br /&gt;
Hazelcast will ensure that sessions from nodes which you restart are taken over by other nodes in the cluster, so ideally this step works without losing user sessions.&lt;br /&gt;
&lt;br /&gt;
For the rolling strategy to work as described, it is required that the old and new version of OX App Suite use compatible versions of the Hazelcast library. This is the case for most upgrades. However some upgrades must handle the situation that the new version of OX App Suite ships with a new version of Hazelcast incompatible to the version of Hazelcast shipped with the old version of OX App Suite. It will be stated in the release notes if this is the case for a given release. If so, then some additional steps are required during a rolling update to ensure session handling / invalidating during update tasks works properly. See below.&lt;br /&gt;
&lt;br /&gt;
== HOWTO / step-by-step instructions ==&lt;br /&gt;
&lt;br /&gt;
* Take backups of as much as possible (databases, OX config files, etc).&lt;br /&gt;
* Announce the maintenance to the users. The communication depends on which approach you chose: the full downtime approach will come with a full downtime for all users, while the rolling upgrade approach will result in some users will have a short loss of service while their schema upgrades.&lt;br /&gt;
&lt;br /&gt;
=== Full downtime approach ===&lt;br /&gt;
&lt;br /&gt;
* Initiate maintenance: Block HTTP sessions to the service. Put a reasonable maintenance page in place, probably some HTTP error 503 with a reasonable Retry-After header.&lt;br /&gt;
* Shutdown the service on all middleware nodes. Upgrade the software on all middleware and frontend nodes using the disto's package manager. See [[AppSuite:UpdatingOXPackages]] for details on how to do that. Don't forget the &amp;lt;code&amp;gt;touch-appsuite&amp;lt;/code&amp;gt; step if required (&amp;quot;If you update only UI plugins without simultaneously upgrading the core UI packages to a new version&amp;quot;).&lt;br /&gt;
* Start the &amp;lt;code&amp;gt;open-xchange&amp;lt;/code&amp;gt; service on one node&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that, in particular the [[UpdateTasks#How_to_see_all_schemas.3F|section]] about limited parallel execution.&lt;br /&gt;
* Start the &amp;lt;code&amp;gt;open-xchange&amp;lt;/code&amp;gt; services on the middleware nodes.&lt;br /&gt;
* Perform some crosschecks like&lt;br /&gt;
** all middleware nodes joined the Hazelcast cluster&lt;br /&gt;
** all OSGI bundles (which are expected to be running) are running&lt;br /&gt;
** WebUI login is possible&lt;br /&gt;
** Some central functionality tests like sending mails, accessing drive, etc&lt;br /&gt;
* Restore service: allow HTTP sessions, remove the maintenance page.&lt;br /&gt;
&lt;br /&gt;
=== Rolling Upgrade without breaking Hazelcast upgrade ===&lt;br /&gt;
&lt;br /&gt;
Remember: as stated above, this is viable only if the release notes for the new version do not state that there are breaking Hazelcast changes. For example, with v7.8.4 there were breaking Hazelcast changes and in the Release Notes it was stated as follows.&lt;br /&gt;
&lt;br /&gt;
https://software.open-xchange.com/products/appsuite/doc/Release_Notes_for_Release_7.8.4_2017-05-23.pdf&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Important - Please Note&lt;br /&gt;
&lt;br /&gt;
There is a major Hazelcast library update to OX App Suite v7.8.4. This means that when updating from an earlier backend version, due to the upgraded library, it is not possible to form a cluster of nodes that run previous version of Hazelcast (i.e. exiting volatile data in the cluster will be lost during the update). A consistent Hazelcast cluster is needed for cluster-wide cache invalidation. To circumvent problems with database update tasks that need to perform cache invalidation, please follow the steps described here: http://oxpedia.org/wiki/index.php?title=AppSuite:Running_a_cluster#Upgrades_of_the_Hazelcast_library. Please also note that session migration is not possible between versions. This usually affects all user sessions that are stored in a distributed map, and will require the users to re-login after the update. Running incompatible versions of Hazelcast within a cluster will result in logentries showing the conflicting node and version information.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you find you are upgrading to a version with breaking Hazelcast changes, please consult the next section [[#Rolling_Upgrade_with_breaking_Hazelcast_upgrade]].&lt;br /&gt;
&lt;br /&gt;
==== Description of the upgrade process ====&lt;br /&gt;
&lt;br /&gt;
The procedure consists of a '''pre-update''' where one update node will be taken out of the HTTP traffic, to execute database update tasks from that node, and a '''real update''', where all of the cluster nodes will get updated to the new version of the software.&lt;br /&gt;
&lt;br /&gt;
The pre-update will not make the new version of the software available to the users. It will run as kind of &amp;quot;background task&amp;quot;, mostly invisible for the users (but see below for a description of the impact of the update tasks on user experience).&lt;br /&gt;
&lt;br /&gt;
==== Pre-update ====&lt;br /&gt;
&lt;br /&gt;
The following steps all refer to one special middleware node, the so-called ''upgrade node''. The other cluster nodes are not affected by this step.&lt;br /&gt;
&lt;br /&gt;
* Take one middleware node (the upgrade node) out of the HTTP traffic by adjusting the apache mod_proxy tables. We propose a combination of the balancer_manager to do this during runtime without restart, but also update the config files to prevent service restarts of apache to accidentally route sessions to the upgrade node.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node &lt;br /&gt;
* Update packages on the upgrade node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that.&lt;br /&gt;
** Note that executing update tasks on database schemas will result in users from the given database schema to be logged out and locked out during the update tasks.&lt;br /&gt;
** You might want to keep the load low on the DBs, to affect production operations as low as possible, and because with this decoupled update tasks approach there is no immediate time pressure. If you want to follow the [[UpdateTasks#How_to_see_all_schemas.3F|limited parallel]] approach, use a small, mild parallelity factor (e.g. 2 or maybe 4 if you know this by far does not saturate your DB platform).&lt;br /&gt;
&lt;br /&gt;
==== Real Update ====&lt;br /&gt;
&lt;br /&gt;
The following steps refer to all cluster nodes (but the upgrade node, which had been updated before).&lt;br /&gt;
&lt;br /&gt;
* For one middleware cluster node after each nother:&lt;br /&gt;
** Update packages on that middleware node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
** Verify the node starts its bundles, joins the Hazelcast cluster, log files are clean, the node handles sessions&lt;br /&gt;
* For one frontend node after each other (if you've got separate frontend nodes):&lt;br /&gt;
** Update packages on that frontend node. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Finally, if required (&amp;quot;If you update only UI plugins without simultaneously upgrading the core UI packages to a new version&amp;quot;), execute &amp;lt;code&amp;gt;touch-appsuite&amp;lt;/code&amp;gt; with a &amp;lt;code&amp;gt;--timestamp&amp;lt;/code&amp;gt; argument as described on the page [[AppSuite:UpdatingOXPackages]]&lt;br /&gt;
* Perform final crosschecks like&lt;br /&gt;
** all middleware nodes joined the Hazelcast cluster&lt;br /&gt;
** all OSGI bundles (which are expected to be running) are running&lt;br /&gt;
** WebUI login is possible&lt;br /&gt;
** Some central functionality tests like sending mails, accessing drive, etc&lt;br /&gt;
&lt;br /&gt;
=== Rolling Upgrade with breaking Hazelcast upgrade ===&lt;br /&gt;
&lt;br /&gt;
Cf [[#Upgrades_of_the_Hazelcast_library]] below.&lt;br /&gt;
&lt;br /&gt;
In principle the steps given in the previous section apply. However the upgrade needs to get the special Hazelcast Upgrade Package installed (e.g. one from &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-76x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-780-782&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-783&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-784&amp;lt;/code&amp;gt;, ...) during execution of the update tasks.&lt;br /&gt;
&lt;br /&gt;
So the pre-update steps look like:&lt;br /&gt;
&lt;br /&gt;
* Take one middleware node (the upgrade node) out of the HTTP traffic by adjusting the apache mod_proxy tables. We propose a combination of the balancer_manager to do this during runtime without restart, but also update the config files to prevent service restarts of apache to accidentally route sessions to the upgrade node.&lt;br /&gt;
* Make sure there are no user sessions left on the upgrade node, and that no new sessions will be routed to that node &lt;br /&gt;
* Update packages on the upgrade node and restart the middleware service there. See [[AppSuite:UpdatingOXPackages]] for details on how to do that.&lt;br /&gt;
* Install the special Hazelcast Upgrade Package on the upgrade node (e.g. one from &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-76x&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-780-782&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-783&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;open-xchange-cluster-upgrade-from-784&amp;lt;/code&amp;gt;, ...). Restart the service again.&lt;br /&gt;
* Execute update tasks from that node. See [[UpdateTasks]] for an explanation how to do that. You might want to keep the load low on the DBs, to affect production operations as low as possible, and because with this decoupled update tasks approach there is no immediate time pressure. If you want to follow the [[UpdateTasks#How_to_see_all_schemas.3F|limited parallel]] approach, use a small, mild parallelity factor (e.g. 2 or maybe 4 if you know this by far does not saturate your DB platform).&lt;br /&gt;
&lt;br /&gt;
Note: don't worry if you don't see the upgrade node joining the legacy cluster: the upgrade node will not join the legacy cluster / not be visible there since the upgrade node will be a so-called &amp;quot;native client&amp;quot; to the legacy cluster, and it will be created on the fly (and subsequently disposed again) for propagating an event. So also on &amp;lt;code&amp;gt;netstat&amp;lt;/code&amp;gt; level the upgrade node will not have visible connections to the legacy cluster (unless for the very short timeframe when an actual even is sent). You can verify the functionality of that package by log lines like&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt; Successfully initialzed Hazelcast client: &amp;lt;client-id&amp;gt;&lt;br /&gt;
 Successfully got reference to cache event topic: cacheEvents-3&lt;br /&gt;
 Publishing legacy cache event: &amp;lt;cache-event&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 Successfully published legacy cache event, shutting down client after 546ms...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For the overly prudent it might be an idea to prepare a special test context with a test user living in its dedicated (test) schema, so you can test the functionality of this mechanism during upgrade first.&lt;br /&gt;
&lt;br /&gt;
After the DB update tasks you can remove the special upgrade package again from the upgrade node.&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;Real Upgrade&amp;quot; procedure then looks like [[#Rolling_Upgrade_without_breaking_Hazelcast_upgrade|above]].&lt;br /&gt;
&lt;br /&gt;
== Reference Documentation ==&lt;br /&gt;
&lt;br /&gt;
=== Limitations ===&lt;br /&gt;
&lt;br /&gt;
While in most cases a seamless, rolling upgrade of all nodes in the cluster is possible, there may be situations where nodes running a newer version of the Open-Xchange Server are not able to communicate with older nodes in the cluster, i.e. can't access distributed data or consume incompatible event notifications - especially, when the underlying Hazelcast library is part of the update, which does not support this scenario at the moment. In such cases, the release notes will contain corresponding information, so please have a look there before applying an update.&lt;br /&gt;
&lt;br /&gt;
Additionally, there may always be some kind of race conditions during an update, i.e. client requests that can't be completed successfully or internal events not being deliverd to all nodes in the cluster. That's why the following information should only serve as a best-practices guide to minimize the impact of upgrades to the user experience.&lt;br /&gt;
&lt;br /&gt;
=== Upgrading a single Node ===&lt;br /&gt;
&lt;br /&gt;
Upgrading all nodes in the cluster should usually be done sequentially, i.o.w. one node after the other. This means that during the upgrade of one node, the node is temporarily disconnected from the other nodes in the cluster, and will join the cluster again after the update is completed. From the backend perspective, this is as easy as stopping the open-xchange service. other nodes in the cluster will recognize the disconnected node and start to repartition the shared cluster data automatically. But wait a minute - doing so would potentially lead to the webserver not registering the node being stopped immediately, resulting in temporary errors for currently logged in users until they are routed to another machine in the cluster. That's why it's good practice to tell the webserver's load balancer that the node should no longer fulfill incoming requests. The Apache Balancer Manager is an excellent tool for this ([http://httpd.apache.org/docs/2.2/mod/mod_status.html module ''mod_status'']). Look at the screen shot. Every node can be put into a disabled mode. Further requests will the redirected to other nodes in the cluster:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:balancer_manager.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afterwards, the open-xchange service on the disabled node can be stopped by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange stop&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange stop&lt;br /&gt;
&lt;br /&gt;
Now, the node is effectively in maintenance mode and any updates can take place. One could now verify the changed cluster infrastructure by accessing the Hazelcast MBeans either via JMX or the ''showruntimestats -c'' commandline tool (see above for details). There, the shut down node should no longer appear in the 'Member' section (com.hazelcast:type=Member).&lt;br /&gt;
&lt;br /&gt;
When all upgrades are processed, the node open-xchange service can be started again by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange start&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange start&lt;br /&gt;
&lt;br /&gt;
As stated above, depending on the chosen cluster discovery mechanism, it might take some time until the node joins the cluster again. When using static cluster discovery, it will join the existing cluster usually directly during serivce startup, i.o.w. before other depending OSGi services are started. Otherwise, there might also be situations where the node cannot join the cluster directly, for example when there were no mDNS advertisments for other nodes in the cluster received yet. Then, it can take some additional time until the node finally joins the cluster. During startup of the node, you can observe the JMX console or the output of ''showruntimestats -c'' (com.hazelcast:type=Member) of another node in the cluster to verify when the node has joined. &lt;br /&gt;
&lt;br /&gt;
After the node has joined, distributed data is re-partioned automatically, and the node is ready to server incoming requests again - so now the node can finally be enabled again in the load balancer configuration of the webserver. Afterwards, the next node in the cluster can be upgraded using the same procedure, until all nodes were processed.&lt;br /&gt;
&lt;br /&gt;
=== Upgrades of the Hazelcast library ===&lt;br /&gt;
&lt;br /&gt;
In case an upgrade includes a major update of the Hazelcast library, a newly upgraded node will usually not be able to connect to the nodes running the previous version. In this case, volatile cluster data is lost after all nodes in the cluster have been updated, including sessions held in the distributed session storage. As outlined above, the release notes will contain a corresponding warning in such cases. Starting with v7.10.3, separation of the clusters during rolling upgrades is enforced using by appending a version suffix to the cluster group name.&lt;br /&gt;
&lt;br /&gt;
Besides upgraded nodes not being able to access distributed data of the legacy cluster, this also affects new data not being available in the legacy cluster, which may cause troubles if the updated backend version needs to perform database update tasks. Database update tasks usually operate in a &amp;quot;blocking&amp;quot; way and all contexts associated with the schema being upgraded are disabled temporarily. Since context data itself is being held in caches on potentially each node in the cluster, the affected cache entries are invalidated during the database update. And, since cluster-wide cache invalidations again utilize Hazelcast functionality ([[#Remote Cache Invalidation]]), such invalidations normally won't be propagated to nodes running a previous version of the Hazelcast library.&lt;br /&gt;
&lt;br /&gt;
To work around this specific scenario where an incompatible upgrade of the Hazelcast library needs to be performed along with blocking database update tasks, starting with v7.8.0, a supplementary package is available that explicitly enables the context cache invalidation of nodes running the previous Hazelcast library. This package follows the naming scheme ''open-xchange-cluster-upgrade-from-XXX'' (where XXX representing the version of the legacy version of the Open-Xchange server), and is available in the repositories for the updated server packages. This package should only be installed on the first node of the cluster that is going to be upgraded to the new version, and can be deactivated once the database upgrade tasks were executed successfully. &lt;br /&gt;
&lt;br /&gt;
Once installed, a legacy cluster is discovered based on the available information in the ''hazelcast.properties'' configuration file in case cluster discovery is set to ''static''. If a different join mechanism like ''multicast'' is used, there's an alternative option to configure at least one of the addresses of the legacy cluster via ''com.openexchange.hazelcast.network.client.nodes''. &lt;br /&gt;
&lt;br /&gt;
As an example, along with the server v7.8.0, a new package named ''open-xchange-cluster-upgrade-from-76x'' can be installed that aids in invalidating cluster server nodes running v7.6.x (which includes the Hazelcast library in version 3.2.4). Using this package, the recommended steps to update an OX cluster from version 7.6.x to version 7.8.0 would be:&lt;br /&gt;
# Pick a node from your cluster that you want to use for executing the database update tasks shipped with the new release&lt;br /&gt;
# Disable this node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Update the OX packages on this node, additionally install the package ''open-xchange-cluster-upgrade-from-76x''&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Trigger the update task executions using the ''runUpdate'' commandline utility as described at [[UpdateTasks]]&lt;br /&gt;
# Once they are finished, uninstall the package ''open-xchange-cluster-upgrade-from-76x'' again&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Re-enable the node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Upgrade all other nodes in the cluster as described at [[#Upgrading a single Node]]&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.0 through v7.8.2 (incl.) to v7.8.3 using the package named ''open-xchange-cluster-upgrade-from-780-782'', since v7.8.0 through v7.8.2 (incl.) utilize Hazelcast v3.5.x, while v7.8.3 uses Hazelcast v3.6.4&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.3 to v7.8.4 using the package named ''open-xchange-cluster-upgrade-from-783'', since v7.8.3 utilizes Hazelcast v3.7.1&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.4 to v7.10.0 using the package named ''open-xchange-cluster-upgrade-from-784'', since v7.8.4 utilizes Hazelcast v3.8.1&lt;br /&gt;
&lt;br /&gt;
... and so on.&lt;br /&gt;
&lt;br /&gt;
'''Operations Note:''' The upgraded node will connect temporary as so-called [http://docs.hazelcast.org/docs/2.3/manual/html/ch15.html Native Client] to the legacy Hazelcast Cluster.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Native Client enables you to do all Hazelcast operations without being a member of the cluster.&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
However Native client is not member and relies on one of the cluster members.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means, the upgraded node will not be visible in the members list of the legacy Hazelcast cluster (&amp;lt;code&amp;gt;showruntimestats -c&amp;lt;/code&amp;gt;). Furthermore, the native client will created and destructed on single context events, with the effect that connections will only be visible in the very moment of such an event. This means effectively that verification of the invalidation mechanism is only possible by actually executing the &amp;lt;code&amp;gt;runupdate&amp;lt;/code&amp;gt; CLT. This should produce log lines like&lt;br /&gt;
&lt;br /&gt;
 Successfully initialized Hazelcast client: &amp;lt;client-id&amp;gt;&lt;br /&gt;
 Successfully got reference to cache event topic: cacheEvents-3&lt;br /&gt;
 Publishing legacy cache event: &amp;lt;cache-event&amp;gt;&lt;br /&gt;
 Successfully published legacy cache event, shutting down client after 546ms...&lt;br /&gt;
&lt;br /&gt;
Most importantly, you should be able to observe correct functionality (users of affected contexts being logged out). It may be handy to prepare a dedicated schema with just test contexts inside. (How to create this is out of scope here, but hint: use &amp;lt;code&amp;gt;createschema&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;createcontext --schema-name&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
=== Other Considerations ===&lt;br /&gt;
&lt;br /&gt;
* It's always recommended to only upgrade one node after the other, always ensuring that the cluster has formed correctly between each shutdown/startup of a node.&lt;br /&gt;
* Do not stop a node while running the runUpdate script or the associated update task.&lt;br /&gt;
* During the time of such a rolling upgrade of all nodes, we have effectively heterogeneous software versions in the cluster, which potentially might lead to temporary inconsistencies. Therefore, all nodes in the cluster should be updated in one cycle (but still one after the other).&lt;br /&gt;
* Following the above guideline, it's also possible to add or remove nodes dynamically to the cluster, not only when disconnecting a node temporary for updates.&lt;br /&gt;
* In case of trouble, i.e. a node refuses to join the cluster again after restart, consult the logfiles first for any hints about what is causing the problem - both on the disconnected node, and also on other nodes in the network&lt;br /&gt;
* If there are general incompatibilities between two revisions of the Open-Xchange Server that prevent an operation in a cluster (release notes), it's recommended to choose another name for the cluster in ''cluster.properties'' for the nodes with the new version. This will temporary lead to two separate clusters during the rolling upgrade, and finally the old cluster being shut down completely after the last node was updated to the new version. While distributed data can't be migrated from one server version to another in this scenario due to incompatibilities, the uptime of the system itself is not affected, since the nodes in the new cluster are able to serve new incoming requests directly.&lt;br /&gt;
* When updating only UI plugins without also updating to a new version of the core UI, you also need to perform the additional step from [[AppSuite:UpdatingOXPackages#Updating_UI_plugins|Updating UI plugins]].&lt;br /&gt;
* When performing a rolling upgrade of the middleware nodes in the cluster to 7.10.2 from a previous version (7.10.1 and earlier), the upgraded nodes will not join the Hazelcast cluster and fail to startup properly due to a change in the join process of the underlying Hazelcast library. Therefore, a new configuration switch is introduced that takes care to dynamically append the Hazelcast version to the cluster name so that a new cluster group is created automatically for the upgraded nodes: &amp;lt;code&amp;gt;com.openexchange.hazelcast.group.name.appendVersion&amp;lt;/code&amp;gt;. Please mind that this configuration property is only applicable for 7.10.2; later versions starting with 7.10.3 will always append the version identifier to the group name. The default value is &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;, so that there are no surprises when patching an existing 7.10.2 installation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]] [[Category: Administration]] [[Category: Cluster]]&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=Dovecot_Mailpush&amp;diff=24607</id>
		<title>Dovecot Mailpush</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=Dovecot_Mailpush&amp;diff=24607"/>
		<updated>2019-04-03T08:49:55Z</updated>

		<summary type="html">&lt;p&gt;Thorben: Replaced content with &amp;quot;'''Please find the up-to-date version of this article [https://documentation.open-xchange.com/latest/middleware/dovecot/push/Dovecot%20Push.html here]'''&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Please find the up-to-date version of this article [https://documentation.open-xchange.com/latest/middleware/dovecot/push/Dovecot%20Push.html here]'''&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=Dovecot_Mailpush&amp;diff=24383</id>
		<title>Dovecot Mailpush</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=Dovecot_Mailpush&amp;diff=24383"/>
		<updated>2018-11-15T13:58:01Z</updated>

		<summary type="html">&lt;p&gt;Thorben: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Setup of the Dovecot Push =&lt;br /&gt;
&lt;br /&gt;
'''Please find the up-to-date version of this article [https://documentation.open-xchange.com/latest/middleware/dovecot/push.html| here]'''&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
Dovecot customers can use the special PUSH plugin without any additional costs. The plugin will be provided via the Dovecot software repository for Dovecot Pro and community edition. '''Please Note, the installation of the latest Dovecot v2.2.19 release is required'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== IMAP METADATA ==&lt;br /&gt;
&lt;br /&gt;
Dovecot Push plug-in requires METADATA support on Dovecot side, but it should only be enabled for OX IMAP sessions and not for any other IMAP clients directly. Enabling can be done with e.g. the remote directive &amp;quot;remote 1.2.3.0/24 { imap_metadata = yes }&amp;quot; and specifying the IP ranges of OX.&lt;br /&gt;
&lt;br /&gt;
Dovecot supports the [[https://tools.ietf.org/html/rfc5464|IMAP METADATA extension (RFC 5464)]], which allows per-mailbox, per-user data to be stored and accessed via IMAP commands.&lt;br /&gt;
&lt;br /&gt;
To activate metadata storage, a [[Dictionary|dictionary]] needs to be configured in the Dovecot configuration using the mail_attribute_dict option.&lt;br /&gt;
&lt;br /&gt;
To activate the IMAP METADATA commands, the imap_metadata and mail_attribute_dict options need to be activated.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 # Store METADATA information within user's Maildir directory&lt;br /&gt;
 mail_attribute_dict = file:%h/Maildir/dovecot-attributes&lt;br /&gt;
 &lt;br /&gt;
 remote 1.2.3.0/24  {&lt;br /&gt;
   protocol imap {&lt;br /&gt;
     imap_metadata = yes&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following picture should demonstrate how the overall communication flow between Mail App, Open-Xchange Middleware, and the Dovecot Push plug-in takes place. That communication flow requires the &amp;quot;open-xchange-push-dovecot&amp;quot; and &amp;quot;open-xchange-rest&amp;quot; packages to be installed on the Open-Xchange Middleware nodes and the Dovecot &amp;quot;http-notify&amp;quot; plug-in.&lt;br /&gt;
&lt;br /&gt;
[[Image:ox_mail_push_configuration_4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Once the Open-Xchange Mail App is installed on the user’s mobile device and it is allowed to show notifications about a new message delivery, the Mail App performs a subscription call to the Open-Xchange Middleware Servers using a fully authenticated session.&lt;br /&gt;
&lt;br /&gt;
When the &amp;quot;open-xchange-push-dovecot&amp;quot; package is installed, the previous subscribe call requests it to spawn a permanent listener. Such a listener simply tells the Dovecot server to notify about new message delivery events for the associated user by executing a special SETMETADATA command. Hence, it does not open or use any resources other than firing a single IMAP command to the Dovecot IMAP Server.&lt;br /&gt;
&lt;br /&gt;
Whenever a &amp;quot;new message delivery&amp;quot; event occurs, the Dovecot Server performs a HTTP callback against a configurable HTTP end-point of the Open-Xchange Middleware providing crucial information about the newly delivered message with a simple JSON body. That incoming HTTP callback is then turned into an appropriate OSGi event with topic &amp;quot;com/openexchange/push&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
That event is in turn handled by the Mobile Push event handler, which uses the event’s information to request an APN/GCM push to the mobile device.&lt;br /&gt;
&lt;br /&gt;
== Configuration of Dovecot &amp;quot;http-notify&amp;quot; plug-in ==&lt;br /&gt;
&lt;br /&gt;
To use push notifications, both the &amp;quot;notify&amp;quot; and the &amp;quot;push_notification&amp;quot; plugins need to be activated. For LMTP delivery, this is required:&lt;br /&gt;
&lt;br /&gt;
 protocol lmtp {&lt;br /&gt;
   mail_plugins = $mail_plugins notify push_notification&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If you also want push notifications to work for LDA-based delivery, you would need additional configuration:&lt;br /&gt;
&lt;br /&gt;
 protocol lda {&lt;br /&gt;
   mail_plugins = $mail_plugins notify push_notification&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The HTTP end-point (URL + authentication information) to use is configured in the Dovecot configuration file. The appropriate configuration options will contain the HTTP URL denoting the end-point to connect to as well as the authentication information for Basic Authentication as configured by properties &amp;quot;com.openexchange.rest.services.basic-auth.login&amp;quot; and &amp;quot;com.openexchange.rest.services.basic-auth.password&amp;quot;.&lt;br /&gt;
The URL to configure in Dovecot configuration follows this pattern.&lt;br /&gt;
 &amp;lt;http|https&amp;gt; + &amp;quot;://&amp;quot; + &amp;lt;login&amp;gt; + &amp;quot;:&amp;quot; + &amp;lt;password&amp;gt; + &amp;quot;@&amp;quot; + &amp;lt;host&amp;gt; + &amp;quot;:&amp;quot; + &amp;lt;port&amp;gt; + &amp;quot;/preliminary/http-notify/v1/notify&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Please note that SSL endpoints are only supported from Dovecot &amp;gt;= 2.3.&lt;br /&gt;
&lt;br /&gt;
E.g.&lt;br /&gt;
 plugin {&lt;br /&gt;
  push_notification_driver = ox:url=http://login:pass@node1.domain.tld:8009/preliminary/http-notify/v1/notify&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Furthermore, it is also possible to specify more than one HTTP end-point to connect to if a new message delivery occurs. Thus the configuration section mentioned above may be extended by additional &amp;quot;push_notification_driver&amp;quot; entries; e.g. push_notification_driver2, push_notification_driver3, etc.&lt;br /&gt;
&lt;br /&gt;
Please note that the path &amp;quot;/preliminary/http-notify/v1/notify&amp;quot; denotes the internal REST API of the Open-Xchange Middleware, which must not be publicly accessible. The administrator can decide whether to add that path to the Apache configuration (see also [[AppSuite:Apache_Configuration]] and [[AppSuite:Grizzly]]) through a Location/ProxyPass directive:&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 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;
In a scenario where Dovecot Push is also supposed to be used for websockets based browser notifications the OX property '''com.openexchange.push.allowedClients''' needs to be extended with &amp;quot;open-xchange-appsuite&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In case the &amp;quot;user=&amp;quot; sent by OX in the push_notification_driver url data does not match the IMAP login of a user, Dovecot ignores it. This can be overridden by defining  &amp;quot;user_from_metadata&amp;quot; in the push_notification_driver url, e.g. &lt;br /&gt;
&lt;br /&gt;
  push_notification_driver = ox:url=http://example.com/ user_from_metadata&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=Dovecot_Mailpush&amp;diff=24382</id>
		<title>Dovecot Mailpush</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=Dovecot_Mailpush&amp;diff=24382"/>
		<updated>2018-11-15T13:57:42Z</updated>

		<summary type="html">&lt;p&gt;Thorben: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Setup of the Dovecot Push =&lt;br /&gt;
&lt;br /&gt;
Please find the up-to-date version of this article [https://documentation.open-xchange.com/latest/middleware/dovecot/push.html| here]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
Dovecot customers can use the special PUSH plugin without any additional costs. The plugin will be provided via the Dovecot software repository for Dovecot Pro and community edition. '''Please Note, the installation of the latest Dovecot v2.2.19 release is required'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== IMAP METADATA ==&lt;br /&gt;
&lt;br /&gt;
Dovecot Push plug-in requires METADATA support on Dovecot side, but it should only be enabled for OX IMAP sessions and not for any other IMAP clients directly. Enabling can be done with e.g. the remote directive &amp;quot;remote 1.2.3.0/24 { imap_metadata = yes }&amp;quot; and specifying the IP ranges of OX.&lt;br /&gt;
&lt;br /&gt;
Dovecot supports the [[https://tools.ietf.org/html/rfc5464|IMAP METADATA extension (RFC 5464)]], which allows per-mailbox, per-user data to be stored and accessed via IMAP commands.&lt;br /&gt;
&lt;br /&gt;
To activate metadata storage, a [[Dictionary|dictionary]] needs to be configured in the Dovecot configuration using the mail_attribute_dict option.&lt;br /&gt;
&lt;br /&gt;
To activate the IMAP METADATA commands, the imap_metadata and mail_attribute_dict options need to be activated.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 # Store METADATA information within user's Maildir directory&lt;br /&gt;
 mail_attribute_dict = file:%h/Maildir/dovecot-attributes&lt;br /&gt;
 &lt;br /&gt;
 remote 1.2.3.0/24  {&lt;br /&gt;
   protocol imap {&lt;br /&gt;
     imap_metadata = yes&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following picture should demonstrate how the overall communication flow between Mail App, Open-Xchange Middleware, and the Dovecot Push plug-in takes place. That communication flow requires the &amp;quot;open-xchange-push-dovecot&amp;quot; and &amp;quot;open-xchange-rest&amp;quot; packages to be installed on the Open-Xchange Middleware nodes and the Dovecot &amp;quot;http-notify&amp;quot; plug-in.&lt;br /&gt;
&lt;br /&gt;
[[Image:ox_mail_push_configuration_4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Once the Open-Xchange Mail App is installed on the user’s mobile device and it is allowed to show notifications about a new message delivery, the Mail App performs a subscription call to the Open-Xchange Middleware Servers using a fully authenticated session.&lt;br /&gt;
&lt;br /&gt;
When the &amp;quot;open-xchange-push-dovecot&amp;quot; package is installed, the previous subscribe call requests it to spawn a permanent listener. Such a listener simply tells the Dovecot server to notify about new message delivery events for the associated user by executing a special SETMETADATA command. Hence, it does not open or use any resources other than firing a single IMAP command to the Dovecot IMAP Server.&lt;br /&gt;
&lt;br /&gt;
Whenever a &amp;quot;new message delivery&amp;quot; event occurs, the Dovecot Server performs a HTTP callback against a configurable HTTP end-point of the Open-Xchange Middleware providing crucial information about the newly delivered message with a simple JSON body. That incoming HTTP callback is then turned into an appropriate OSGi event with topic &amp;quot;com/openexchange/push&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
That event is in turn handled by the Mobile Push event handler, which uses the event’s information to request an APN/GCM push to the mobile device.&lt;br /&gt;
&lt;br /&gt;
== Configuration of Dovecot &amp;quot;http-notify&amp;quot; plug-in ==&lt;br /&gt;
&lt;br /&gt;
To use push notifications, both the &amp;quot;notify&amp;quot; and the &amp;quot;push_notification&amp;quot; plugins need to be activated. For LMTP delivery, this is required:&lt;br /&gt;
&lt;br /&gt;
 protocol lmtp {&lt;br /&gt;
   mail_plugins = $mail_plugins notify push_notification&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If you also want push notifications to work for LDA-based delivery, you would need additional configuration:&lt;br /&gt;
&lt;br /&gt;
 protocol lda {&lt;br /&gt;
   mail_plugins = $mail_plugins notify push_notification&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The HTTP end-point (URL + authentication information) to use is configured in the Dovecot configuration file. The appropriate configuration options will contain the HTTP URL denoting the end-point to connect to as well as the authentication information for Basic Authentication as configured by properties &amp;quot;com.openexchange.rest.services.basic-auth.login&amp;quot; and &amp;quot;com.openexchange.rest.services.basic-auth.password&amp;quot;.&lt;br /&gt;
The URL to configure in Dovecot configuration follows this pattern.&lt;br /&gt;
 &amp;lt;http|https&amp;gt; + &amp;quot;://&amp;quot; + &amp;lt;login&amp;gt; + &amp;quot;:&amp;quot; + &amp;lt;password&amp;gt; + &amp;quot;@&amp;quot; + &amp;lt;host&amp;gt; + &amp;quot;:&amp;quot; + &amp;lt;port&amp;gt; + &amp;quot;/preliminary/http-notify/v1/notify&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Please note that SSL endpoints are only supported from Dovecot &amp;gt;= 2.3.&lt;br /&gt;
&lt;br /&gt;
E.g.&lt;br /&gt;
 plugin {&lt;br /&gt;
  push_notification_driver = ox:url=http://login:pass@node1.domain.tld:8009/preliminary/http-notify/v1/notify&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Furthermore, it is also possible to specify more than one HTTP end-point to connect to if a new message delivery occurs. Thus the configuration section mentioned above may be extended by additional &amp;quot;push_notification_driver&amp;quot; entries; e.g. push_notification_driver2, push_notification_driver3, etc.&lt;br /&gt;
&lt;br /&gt;
Please note that the path &amp;quot;/preliminary/http-notify/v1/notify&amp;quot; denotes the internal REST API of the Open-Xchange Middleware, which must not be publicly accessible. The administrator can decide whether to add that path to the Apache configuration (see also [[AppSuite:Apache_Configuration]] and [[AppSuite:Grizzly]]) through a Location/ProxyPass directive:&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 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;
In a scenario where Dovecot Push is also supposed to be used for websockets based browser notifications the OX property '''com.openexchange.push.allowedClients''' needs to be extended with &amp;quot;open-xchange-appsuite&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In case the &amp;quot;user=&amp;quot; sent by OX in the push_notification_driver url data does not match the IMAP login of a user, Dovecot ignores it. This can be overridden by defining  &amp;quot;user_from_metadata&amp;quot; in the push_notification_driver url, e.g. &lt;br /&gt;
&lt;br /&gt;
  push_notification_driver = ox:url=http://example.com/ user_from_metadata&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=Dovecot_Mailpush&amp;diff=24381</id>
		<title>Dovecot Mailpush</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=Dovecot_Mailpush&amp;diff=24381"/>
		<updated>2018-11-15T13:57:04Z</updated>

		<summary type="html">&lt;p&gt;Thorben: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Setup of the Dovecot Push =&lt;br /&gt;
&lt;br /&gt;
Please find the up-to-date version of this article [https://documentation.open-xchange.com/latest/middleware/dovecot/push.html|here]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
Dovecot customers can use the special PUSH plugin without any additional costs. The plugin will be provided via the Dovecot software repository for Dovecot Pro and community edition. '''Please Note, the installation of the latest Dovecot v2.2.19 release is required'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== IMAP METADATA ==&lt;br /&gt;
&lt;br /&gt;
Dovecot Push plug-in requires METADATA support on Dovecot side, but it should only be enabled for OX IMAP sessions and not for any other IMAP clients directly. Enabling can be done with e.g. the remote directive &amp;quot;remote 1.2.3.0/24 { imap_metadata = yes }&amp;quot; and specifying the IP ranges of OX.&lt;br /&gt;
&lt;br /&gt;
Dovecot supports the [[https://tools.ietf.org/html/rfc5464|IMAP METADATA extension (RFC 5464)]], which allows per-mailbox, per-user data to be stored and accessed via IMAP commands.&lt;br /&gt;
&lt;br /&gt;
To activate metadata storage, a [[Dictionary|dictionary]] needs to be configured in the Dovecot configuration using the mail_attribute_dict option.&lt;br /&gt;
&lt;br /&gt;
To activate the IMAP METADATA commands, the imap_metadata and mail_attribute_dict options need to be activated.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 # Store METADATA information within user's Maildir directory&lt;br /&gt;
 mail_attribute_dict = file:%h/Maildir/dovecot-attributes&lt;br /&gt;
 &lt;br /&gt;
 remote 1.2.3.0/24  {&lt;br /&gt;
   protocol imap {&lt;br /&gt;
     imap_metadata = yes&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following picture should demonstrate how the overall communication flow between Mail App, Open-Xchange Middleware, and the Dovecot Push plug-in takes place. That communication flow requires the &amp;quot;open-xchange-push-dovecot&amp;quot; and &amp;quot;open-xchange-rest&amp;quot; packages to be installed on the Open-Xchange Middleware nodes and the Dovecot &amp;quot;http-notify&amp;quot; plug-in.&lt;br /&gt;
&lt;br /&gt;
[[Image:ox_mail_push_configuration_4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Once the Open-Xchange Mail App is installed on the user’s mobile device and it is allowed to show notifications about a new message delivery, the Mail App performs a subscription call to the Open-Xchange Middleware Servers using a fully authenticated session.&lt;br /&gt;
&lt;br /&gt;
When the &amp;quot;open-xchange-push-dovecot&amp;quot; package is installed, the previous subscribe call requests it to spawn a permanent listener. Such a listener simply tells the Dovecot server to notify about new message delivery events for the associated user by executing a special SETMETADATA command. Hence, it does not open or use any resources other than firing a single IMAP command to the Dovecot IMAP Server.&lt;br /&gt;
&lt;br /&gt;
Whenever a &amp;quot;new message delivery&amp;quot; event occurs, the Dovecot Server performs a HTTP callback against a configurable HTTP end-point of the Open-Xchange Middleware providing crucial information about the newly delivered message with a simple JSON body. That incoming HTTP callback is then turned into an appropriate OSGi event with topic &amp;quot;com/openexchange/push&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
That event is in turn handled by the Mobile Push event handler, which uses the event’s information to request an APN/GCM push to the mobile device.&lt;br /&gt;
&lt;br /&gt;
== Configuration of Dovecot &amp;quot;http-notify&amp;quot; plug-in ==&lt;br /&gt;
&lt;br /&gt;
To use push notifications, both the &amp;quot;notify&amp;quot; and the &amp;quot;push_notification&amp;quot; plugins need to be activated. For LMTP delivery, this is required:&lt;br /&gt;
&lt;br /&gt;
 protocol lmtp {&lt;br /&gt;
   mail_plugins = $mail_plugins notify push_notification&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If you also want push notifications to work for LDA-based delivery, you would need additional configuration:&lt;br /&gt;
&lt;br /&gt;
 protocol lda {&lt;br /&gt;
   mail_plugins = $mail_plugins notify push_notification&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The HTTP end-point (URL + authentication information) to use is configured in the Dovecot configuration file. The appropriate configuration options will contain the HTTP URL denoting the end-point to connect to as well as the authentication information for Basic Authentication as configured by properties &amp;quot;com.openexchange.rest.services.basic-auth.login&amp;quot; and &amp;quot;com.openexchange.rest.services.basic-auth.password&amp;quot;.&lt;br /&gt;
The URL to configure in Dovecot configuration follows this pattern.&lt;br /&gt;
 &amp;lt;http|https&amp;gt; + &amp;quot;://&amp;quot; + &amp;lt;login&amp;gt; + &amp;quot;:&amp;quot; + &amp;lt;password&amp;gt; + &amp;quot;@&amp;quot; + &amp;lt;host&amp;gt; + &amp;quot;:&amp;quot; + &amp;lt;port&amp;gt; + &amp;quot;/preliminary/http-notify/v1/notify&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Please note that SSL endpoints are only supported from Dovecot &amp;gt;= 2.3.&lt;br /&gt;
&lt;br /&gt;
E.g.&lt;br /&gt;
 plugin {&lt;br /&gt;
  push_notification_driver = ox:url=http://login:pass@node1.domain.tld:8009/preliminary/http-notify/v1/notify&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Furthermore, it is also possible to specify more than one HTTP end-point to connect to if a new message delivery occurs. Thus the configuration section mentioned above may be extended by additional &amp;quot;push_notification_driver&amp;quot; entries; e.g. push_notification_driver2, push_notification_driver3, etc.&lt;br /&gt;
&lt;br /&gt;
Please note that the path &amp;quot;/preliminary/http-notify/v1/notify&amp;quot; denotes the internal REST API of the Open-Xchange Middleware, which must not be publicly accessible. The administrator can decide whether to add that path to the Apache configuration (see also [[AppSuite:Apache_Configuration]] and [[AppSuite:Grizzly]]) through a Location/ProxyPass directive:&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 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;
In a scenario where Dovecot Push is also supposed to be used for websockets based browser notifications the OX property '''com.openexchange.push.allowedClients''' needs to be extended with &amp;quot;open-xchange-appsuite&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In case the &amp;quot;user=&amp;quot; sent by OX in the push_notification_driver url data does not match the IMAP login of a user, Dovecot ignores it. This can be overridden by defining  &amp;quot;user_from_metadata&amp;quot; in the push_notification_driver url, e.g. &lt;br /&gt;
&lt;br /&gt;
  push_notification_driver = ox:url=http://example.com/ user_from_metadata&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=Dovecot_Mailpush&amp;diff=24380</id>
		<title>Dovecot Mailpush</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=Dovecot_Mailpush&amp;diff=24380"/>
		<updated>2018-11-15T13:55:38Z</updated>

		<summary type="html">&lt;p&gt;Thorben: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Setup of the Dovecot Push =&lt;br /&gt;
&lt;br /&gt;
Please find the up-to-date version of this article [[https://documentation.open-xchange.com/latest/middleware/dovecot/push.html|here]]&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
Dovecot customers can use the special PUSH plugin without any additional costs. The plugin will be provided via the Dovecot software repository for Dovecot Pro and community edition. '''Please Note, the installation of the latest Dovecot v2.2.19 release is required'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== IMAP METADATA ==&lt;br /&gt;
&lt;br /&gt;
Dovecot Push plug-in requires METADATA support on Dovecot side, but it should only be enabled for OX IMAP sessions and not for any other IMAP clients directly. Enabling can be done with e.g. the remote directive &amp;quot;remote 1.2.3.0/24 { imap_metadata = yes }&amp;quot; and specifying the IP ranges of OX.&lt;br /&gt;
&lt;br /&gt;
Dovecot supports the [[https://tools.ietf.org/html/rfc5464|IMAP METADATA extension (RFC 5464)]], which allows per-mailbox, per-user data to be stored and accessed via IMAP commands.&lt;br /&gt;
&lt;br /&gt;
To activate metadata storage, a [[Dictionary|dictionary]] needs to be configured in the Dovecot configuration using the mail_attribute_dict option.&lt;br /&gt;
&lt;br /&gt;
To activate the IMAP METADATA commands, the imap_metadata and mail_attribute_dict options need to be activated.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
 # Store METADATA information within user's Maildir directory&lt;br /&gt;
 mail_attribute_dict = file:%h/Maildir/dovecot-attributes&lt;br /&gt;
 &lt;br /&gt;
 remote 1.2.3.0/24  {&lt;br /&gt;
   protocol imap {&lt;br /&gt;
     imap_metadata = yes&lt;br /&gt;
   }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The following picture should demonstrate how the overall communication flow between Mail App, Open-Xchange Middleware, and the Dovecot Push plug-in takes place. That communication flow requires the &amp;quot;open-xchange-push-dovecot&amp;quot; and &amp;quot;open-xchange-rest&amp;quot; packages to be installed on the Open-Xchange Middleware nodes and the Dovecot &amp;quot;http-notify&amp;quot; plug-in.&lt;br /&gt;
&lt;br /&gt;
[[Image:ox_mail_push_configuration_4.png|500px]]&lt;br /&gt;
&lt;br /&gt;
Once the Open-Xchange Mail App is installed on the user’s mobile device and it is allowed to show notifications about a new message delivery, the Mail App performs a subscription call to the Open-Xchange Middleware Servers using a fully authenticated session.&lt;br /&gt;
&lt;br /&gt;
When the &amp;quot;open-xchange-push-dovecot&amp;quot; package is installed, the previous subscribe call requests it to spawn a permanent listener. Such a listener simply tells the Dovecot server to notify about new message delivery events for the associated user by executing a special SETMETADATA command. Hence, it does not open or use any resources other than firing a single IMAP command to the Dovecot IMAP Server.&lt;br /&gt;
&lt;br /&gt;
Whenever a &amp;quot;new message delivery&amp;quot; event occurs, the Dovecot Server performs a HTTP callback against a configurable HTTP end-point of the Open-Xchange Middleware providing crucial information about the newly delivered message with a simple JSON body. That incoming HTTP callback is then turned into an appropriate OSGi event with topic &amp;quot;com/openexchange/push&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
That event is in turn handled by the Mobile Push event handler, which uses the event’s information to request an APN/GCM push to the mobile device.&lt;br /&gt;
&lt;br /&gt;
== Configuration of Dovecot &amp;quot;http-notify&amp;quot; plug-in ==&lt;br /&gt;
&lt;br /&gt;
To use push notifications, both the &amp;quot;notify&amp;quot; and the &amp;quot;push_notification&amp;quot; plugins need to be activated. For LMTP delivery, this is required:&lt;br /&gt;
&lt;br /&gt;
 protocol lmtp {&lt;br /&gt;
   mail_plugins = $mail_plugins notify push_notification&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
If you also want push notifications to work for LDA-based delivery, you would need additional configuration:&lt;br /&gt;
&lt;br /&gt;
 protocol lda {&lt;br /&gt;
   mail_plugins = $mail_plugins notify push_notification&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
The HTTP end-point (URL + authentication information) to use is configured in the Dovecot configuration file. The appropriate configuration options will contain the HTTP URL denoting the end-point to connect to as well as the authentication information for Basic Authentication as configured by properties &amp;quot;com.openexchange.rest.services.basic-auth.login&amp;quot; and &amp;quot;com.openexchange.rest.services.basic-auth.password&amp;quot;.&lt;br /&gt;
The URL to configure in Dovecot configuration follows this pattern.&lt;br /&gt;
 &amp;lt;http|https&amp;gt; + &amp;quot;://&amp;quot; + &amp;lt;login&amp;gt; + &amp;quot;:&amp;quot; + &amp;lt;password&amp;gt; + &amp;quot;@&amp;quot; + &amp;lt;host&amp;gt; + &amp;quot;:&amp;quot; + &amp;lt;port&amp;gt; + &amp;quot;/preliminary/http-notify/v1/notify&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Please note that SSL endpoints are only supported from Dovecot &amp;gt;= 2.3.&lt;br /&gt;
&lt;br /&gt;
E.g.&lt;br /&gt;
 plugin {&lt;br /&gt;
  push_notification_driver = ox:url=http://login:pass@node1.domain.tld:8009/preliminary/http-notify/v1/notify&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Furthermore, it is also possible to specify more than one HTTP end-point to connect to if a new message delivery occurs. Thus the configuration section mentioned above may be extended by additional &amp;quot;push_notification_driver&amp;quot; entries; e.g. push_notification_driver2, push_notification_driver3, etc.&lt;br /&gt;
&lt;br /&gt;
Please note that the path &amp;quot;/preliminary/http-notify/v1/notify&amp;quot; denotes the internal REST API of the Open-Xchange Middleware, which must not be publicly accessible. The administrator can decide whether to add that path to the Apache configuration (see also [[AppSuite:Apache_Configuration]] and [[AppSuite:Grizzly]]) through a Location/ProxyPass directive:&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 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;
In a scenario where Dovecot Push is also supposed to be used for websockets based browser notifications the OX property '''com.openexchange.push.allowedClients''' needs to be extended with &amp;quot;open-xchange-appsuite&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
In case the &amp;quot;user=&amp;quot; sent by OX in the push_notification_driver url data does not match the IMAP login of a user, Dovecot ignores it. This can be overridden by defining  &amp;quot;user_from_metadata&amp;quot; in the push_notification_driver url, e.g. &lt;br /&gt;
&lt;br /&gt;
  push_notification_driver = ox:url=http://example.com/ user_from_metadata&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=23642</id>
		<title>AppSuite:Running a cluster</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=23642"/>
		<updated>2017-09-17T09:48:07Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Upgrades of the Hazelcast library */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Running a cluster&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Concepts =&lt;br /&gt;
&lt;br /&gt;
For inter-OX-communication over the network, multiple Open-Xchange servers can form a cluster. This brings different advantages regarding distribution and caching of volatile data, load balancing, scalability, fail-safety and robustness. Additionally, it provides the infrastructure for upcoming features of the Open-Xchange server. &lt;br /&gt;
The clustering capabilities of the Open-Xchange server are mainly built up on [http://hazelcast.com Hazelcast], an open source clustering and highly scalable data distribution platform for Java. The following article provides an overview about the current featureset and configuration options.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
&lt;br /&gt;
== Synchronized system clock times ==&lt;br /&gt;
It is crucial that all involved members in a cluster do have their system clock times in sync with each other; e.g. by using an NTP service.&lt;br /&gt;
&lt;br /&gt;
== HTTP routing ==&lt;br /&gt;
An OX cluster is always part of a larger picture. Usually there is front level loadbalancer as central HTTPS entry point to the platform. This loadbalancer optionally performs HTTPS termination and forwards HTTP(S) requests to webservers (the usual and only supported choice as of now is Apache). These webservers are performing HTTPS termination (if this is not happening on the loadbalancer) and serve static content, and (which is what is relevant for our discussion here) they forward dynamic requests to the OX backends.&lt;br /&gt;
&lt;br /&gt;
A central requirement for the interaction of these components (loadbalancer, webservers, OX nodes) is that we have session stability based on the JSESSIONID cookie / jsessionid path component suffix. This means that our application sets a cookie named JSESSIONID which has a value like &amp;lt;large decimal number&amp;gt;.&amp;lt;route identifier&amp;gt;, e.g. &amp;quot;5661584529655240315.OX1&amp;quot;. The route identifier here (&amp;quot;OX1&amp;quot; in this example) is taken by the OX node from a configuration setting from a config file and is specific to one OX node. HTTP routing must happen such that HTTP requests with a cookie with such a suffix always end up the corresponding OX node. There are furthermore specific cirumstances when passing this information via cookie is not possible. Then the JSESSIONID is transferred in a path component as &amp;quot;jsessionid=...&amp;quot; in the HTTP request. The routing mechanism needs to take that into account also.&lt;br /&gt;
&lt;br /&gt;
There are mainly two options to implement this. If the Apache processes are running co-located on the same machines running the OX groupware processes, it is often desired to have the front level loadbalancer perform HTTP routing to the correct machines. If dedicated Apache nodes are employed, is is usually sufficient to have the front-level loadbalancer do HTTP routing to the Apache nodes in a round-robin fashion and perform routing to the correct OX nodes in the Apache nodes.&lt;br /&gt;
&lt;br /&gt;
We provide sample configuration files to configure Apache (with mod_proxy_http) to perform HTTP routing correctly in our guides on OXpedia, e.g. [[AppSuite:Main_Page_AppSuite#quickinstall]]. Central elements are the directives &amp;quot;ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&amp;quot; in conjunction with the &amp;quot;route=OX1&amp;quot; parameters to the BalancerMember lines in the Proxy definition. This is valid for Apache 2.2 as of Sep-2014.&lt;br /&gt;
&lt;br /&gt;
How to configure a front level loadbalancer to perform HTTP equivalent HTTP routing is dependent on the specific loadbalancer implementation. If Apache is used as front level loadbalancer, the same configuration as discussed in the previous section can be employed. As of time of writing this text (Sep 2014), the alternative choices are thin. F5 BigIP is reported to be able to implement &amp;quot;jsessionid based persistence using iRules&amp;quot;. nginx has the functionality in their commercial &amp;quot;nginx plus&amp;quot; product. (Both of these options have not been tested by OX.) Other loadbalancers with this functionality are not known to us.&lt;br /&gt;
&lt;br /&gt;
If the front level loadbalancer is not capable of performing correct HTTP routing, is is required to configure correct HTTP routing on Apache level, even if Apache runs co-located on the OX nodes and thus cross-routing happens.&lt;br /&gt;
&lt;br /&gt;
There are several reasons why we require session stability in exactly this way. We require session stabilty for horizontal scale-out; while we support transparent resuming / migration of user sessions in the OX cluster without need for users to re-authenticate, sessions wandering around randomly will consume a fixed amount resources corresponding to a running session on each OX node in the cluster, while a session sticky to one OX node will consume this fixed amount of resources only on one OX node. Furthermore there are mechanisms in OX like TokenLogin which work only of all requests beloning to one sequence get routed to the same OX node even if they stem from different machines with different IPs. Only the JSESSIONID (which in this case is transferred as jsessionid path component, as cookies do not work during a 302 redirect, which is part of this sequence) carries the required information where the request must be routed to.&lt;br /&gt;
&lt;br /&gt;
Usual &amp;quot;routing based on cookie hash&amp;quot; is not sufficient here since it disregards the information which machine originally issued the cookie. It only ensures that the session will be sticky to any target, which statistically will not be the same machine that issued the cookie. OX will then set a new JSESSIONID cookie, assuming the session had been migrated. The loadbalancer will then route the session to a different target, as the hash of the cookie will differ. This procedure then happens iteratively until by chance the routing based on cookie hash will route the session to the correct target. By then, a lot of resources will have been wasted, by creating full (short-term) sessions on all OX nodes. Furthermore, processes like TokenLogin will not work this way.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
All settings regarding cluster setup are located in the configuration file ''hazelcast.properties''. The former used additional files ''cluster.properties'', ''mdns.properties'' and ''static-cluster-discovery.properties'' are no longer needed. The following gives an overview about the most important settings - please refer to the inline documentation of the configuration file for more advanced options.&lt;br /&gt;
&lt;br /&gt;
Note: The configuration guide targets v7.4.0 of the OX server (and above). For older versions, please consult the history of this page. A full list of Hazelcast-related properties is available at https://documentation.open-xchange.com/components/middleware/config/7.8.4/#mode=features&amp;amp;feature=Hazelcast .&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
To restrict access to the cluster and to separate the cluster from others in the local network, a name and password needs to be defined. Only backend nodes having the same values for those properties are able to join and form a cluster. &lt;br /&gt;
&lt;br /&gt;
 # Configures the name of the cluster. Only nodes using the same group name &lt;br /&gt;
 # will join each other and form the cluster. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is not &amp;quot;empty&amp;quot; (see below).&lt;br /&gt;
 com.openexchange.hazelcast.group.name=&lt;br /&gt;
 &lt;br /&gt;
 # The password used when joining the cluster. Defaults to &amp;quot;wtV6$VQk8#+3ds!a&amp;quot;. &lt;br /&gt;
 # Please change this value, and ensure it's equal on all nodes in the cluster.&lt;br /&gt;
 com.openexchange.hazelcast.group.password=wtV6$VQk8#+3ds!a&lt;br /&gt;
&lt;br /&gt;
== Network ==&lt;br /&gt;
&lt;br /&gt;
It's required to define the network interface that is used for cluster communication via ''com.openexchange.hazelcast.network.interfaces''. By default, the interface is restricted to the local loopback address only. To allow the same configuration amongst all nodes in the cluster, it's recommended to define the value using a wildcard matching the IP addresses of all nodes participating in the cluster, e.g. ''192.168.0.*''&lt;br /&gt;
&lt;br /&gt;
 # Comma-separated list of interface addresses hazelcast should use. Wildcards &lt;br /&gt;
 # (*) and ranges (-) can be used. Leave blank to listen on all interfaces&lt;br /&gt;
 # Especially in server environments with multiple network interfaces, it's &lt;br /&gt;
 # recommended to specify the IP-address of the network interface to bind to &lt;br /&gt;
 # explicitly. Defaults to &amp;quot;127.0.0.1&amp;quot; (local loopback only), needs to be &lt;br /&gt;
 # adjusted when building a cluster of multiple backend nodes.&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=127.0.0.1&lt;br /&gt;
&lt;br /&gt;
To form a cluster of multiple OX server nodes, different discovery mechanisms can be used. The discovery mechanism is specified via the property ''com.openexchange.hazelcast.network.join'':&lt;br /&gt;
&lt;br /&gt;
 # Specifies which mechanism is used to discover other backend nodes in the &lt;br /&gt;
 # cluster. Possible values are &amp;quot;empty&amp;quot; (no discovery for single-node setups),&lt;br /&gt;
 # &amp;quot;static&amp;quot; (fixed set of cluster member nodes) or &amp;quot;multicast&amp;quot; (automatic &lt;br /&gt;
 # discovery of other nodes via multicast). Defaults to &amp;quot;empty&amp;quot;. Depending on &lt;br /&gt;
 # the specified value, further configuration might be needed, see &amp;quot;Networking&amp;quot;&lt;br /&gt;
 # section below. &lt;br /&gt;
 com.openexchange.hazelcast.network.join=empty&lt;br /&gt;
&lt;br /&gt;
Generally, it's advised to use the same network join mechanism for all nodes in the cluster, and, in most cases, it's strongly recommended to use a ''static'' network join configuration. This will allow the nodes to join the cluster directly upon startup. With a ''multicast'' based setup, nodes will merge to an existing cluster possibly at some later time, thus not being able to access the distributed data until they've joined.&lt;br /&gt;
&lt;br /&gt;
Depending on the network join setting, further configuration may be necessary, as decribed in the following paragraphs.&lt;br /&gt;
&lt;br /&gt;
=== empty ===&lt;br /&gt;
&lt;br /&gt;
When using the default value ''empty'', no other nodes are discovered in the cluster. This value is suitable for single-node installations. Note that other nodes that are configured to use other network join mechanisms may be still able to still to connect to this node, e.g. using a ''static'' network join, having the IP address of this host in the list of potential cluster members (see below).&lt;br /&gt;
&lt;br /&gt;
=== static ===&lt;br /&gt;
&lt;br /&gt;
The most common setting for ''com.openexchange.hazelcast.network.join'' is ''static''. A static cluster discovery uses a fixed list of IP addresses of the nodes in the cluster. During startup and after a specific interval, the underlying Hazelcast library probes for not yet joined nodes from this list and adds them to the cluster automatically. The address list is configured via ''com.openexchange.hazelcast.network.join.static.nodes'':&lt;br /&gt;
&lt;br /&gt;
 # Configures a comma-separated list of IP addresses / hostnames of possible &lt;br /&gt;
 # nodes in the cluster, e.g. &amp;quot;10.20.30.12, 10.20.30.13:5701, 192.178.168.110&amp;quot;.&lt;br /&gt;
 # Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;static&amp;quot;. &lt;br /&gt;
 # It doesn't hurt if the address of the local host appears in the list, so &lt;br /&gt;
 # that it's still possible to use the same list throughout all nodes in the &lt;br /&gt;
 # cluster.&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=&lt;br /&gt;
&lt;br /&gt;
For a fixed set of backend nodes, it's recommended to simply include the IP addresses of all nodes in the list, and use the same configuration for each node. However, it's only required to add the address of at least one other node in the cluster to allow the node to join the cluster. Also, when adding a new node to the cluster and this list is extended accordingly, existing nodes don't need to be shut down to recognize the new node, as long as the new node's address list contains at least one of the already running nodes. &lt;br /&gt;
&lt;br /&gt;
=== multicast ===&lt;br /&gt;
&lt;br /&gt;
For highly dynamic setups where nodes are added and removed from the cluster quite often and/or the host's IP addresses are not fixed, it's also possible to configure the network join via multicast. During startup and after a specific interval, the backend nodes initiate the multicast join process automatically, and discovered nodes form or join the cluster afterwards. The multicast group and port can be configured as follows:&lt;br /&gt;
&lt;br /&gt;
 # Configures the multicast address used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. If the nodes reside in different subnets, please ensure that &lt;br /&gt;
 # multicast is enabled between the subnets. Defaults to &amp;quot;224.2.2.3&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.group=224.2.2.3&lt;br /&gt;
 &lt;br /&gt;
 # Configures the multicast port used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. Defaults to &amp;quot;54327&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.port=54327&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The following example shows how a simple cluster named ''MyCluster'' consisting of 4 backend nodes can be configured using ''static'' cluster discovery. The node's IP addresses are 10.0.0.15, 10.0.0.16, 10.0.0.17 and 10.0.0.18. Note that the same ''hazelcast.properties'' is used by all nodes.&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.group.name=MyCluster&lt;br /&gt;
 com.openexchange.hazelcast.group.password=secret&lt;br /&gt;
 com.openexchange.hazelcast.network.join=static&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=10.0.0.15,10.0.0.16,10.0.0.17,10.0.0.18&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=10.0.0.*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Advanced Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Lite Members (available since v7.8.4) ===&lt;br /&gt;
&lt;br /&gt;
Lite members in a Hazelcast cluster are members that do not hold any data partitions, i.e. all read- and write operations to distributed maps are delegated to non-lite (&amp;quot;full&amp;quot;) members. Apart from not having data partitions, lite members participate in the same way as other members: they can register listeners for distributed topics (e.g. cache invalidation events) or can be addressed for task execution (e.g. during realtime communication). &lt;br /&gt;
&lt;br /&gt;
Similar to using a custom partitioning scheme, separating the nodes of a large cluster into few &amp;quot;full&amp;quot; members and many &amp;quot;lite&amp;quot; members helps to minimize the impact of JVM activities from a single node (mainly the garbage collector) on the whole cluster communication. Additionally, when starting or stopping lite members, no repartitioning of the distributed cluster data needs to be performed, which significantly decreases the node's startup- and shutdown time and reduces the necessary network communication to a minimum. &lt;br /&gt;
&lt;br /&gt;
In medium or larger sized clusters, it is sufficient to have roughly 10 to 20 percent of the nodes configured as &amp;quot;full&amp;quot; members, while all other ones can be started as &amp;quot;lite&amp;quot; member nodes. Additionally, please note that the configured backup count in the map configurations should always be smaller than the total number of &amp;quot;full&amp;quot; members, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of &amp;quot;full&amp;quot; members is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
The configured &amp;quot;full&amp;quot; members should preferrably not be used to serve client requests (by not adding them as endpoint in the loadbalancer), to ensure they are always responsive. Also, shutdown and startups of those &amp;quot;full&amp;quot; members should be reduced to a minimum to avoid repartitioning operations. &lt;br /&gt;
&lt;br /&gt;
More general information regarding lite members is available at http://docs.hazelcast.org/docs/latest/manual/html-single/index.html#enabling-lite-members .&lt;br /&gt;
&lt;br /&gt;
To configure a node as &amp;quot;lite&amp;quot; member, the following configuration should be applied in the node's ''hazelcast.properties'' file:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.liteMember=true&lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list all &amp;quot;full&amp;quot; member nodes here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
=== Custom Partitioning ===&lt;br /&gt;
&lt;br /&gt;
Note: Starting with v7.8.4, &amp;quot;Lite Members&amp;quot; should be used in favor of applying a custom partitioning scheme.&lt;br /&gt;
&lt;br /&gt;
While originally being designed to separate the nodes holding distributed data into different risk groups for increased fail safety, a custom partitioning strategy may also be used to distinguish between nodes holding distributed data from those who should not. &lt;br /&gt;
&lt;br /&gt;
This approach of custom partitioning may be used in a OX cluster, where usually different backend nodes serve different purposes. A common scenario is that there are nodes handling requests from the web interfaces, and others being responsible for USM/EAS traffic. Due to their nature of processing large chunks of synchronization data in memory, the USM/EAS nodes may encounter small delays when the Java garbage collector kicks in and suspends the Java Virtual Machine. Since those delays may also have an influence on hazelcast-based communication in the cluster, the idea is to instruct hazelcast to not store distributed data on that nodes. This is where a custom partitioning scheme comes into play.&lt;br /&gt;
&lt;br /&gt;
To setup a custom partitioning scheme in the cluster, an additional ''hazelcast.xml'' configuration file is used, which should be placed into the ''hazelcast'' subdirectory of the OX configuration folder, usually at ''/opt/openexchange/etc/hazelcast''. Please note that it's vital that each node in the cluster is configured equally here, so the same ''hazelcast.xml'' file should be copied to each server. The configuration read from there is used as basis for all further settings that are taken from the ordinary ''hazelcast.properties'' config file. &lt;br /&gt;
&lt;br /&gt;
To setup a custom partitioning scheme, the partition groups must be defined in the ''hazelcast.xml'' file. See the following file for an example configuration, where the three nodes ''10.10.10.60'', ''10.10.10.61'' and ''10.10.10.62'' are defined to form an own partitioning group each. Doing so, all distributed data will be stored at one of those nodes physically, while the corresponding backup data (if configured) at one of the other two nodes. All other nodes in the cluster will not be used to store distributed data, but will still be &amp;quot;full&amp;quot; hazelcast members, which is necessary for other cluster-wide operations the OX backends use. &lt;br /&gt;
&lt;br /&gt;
Please note that the configured backup count in the map configurations should be smaller than the number of nodes here, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of nodes to define in the partition group sections is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!--&lt;br /&gt;
   ~ Copyright (c) 2008-2013, Hazelcast, Inc. All Rights Reserved.&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
   ~ you may not use this file except in compliance with the License.&lt;br /&gt;
   ~ You may obtain a copy of the License at&lt;br /&gt;
   ~&lt;br /&gt;
   ~ http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
   ~ distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
   ~ See the License for the specific language governing permissions and&lt;br /&gt;
   ~ limitations under the License.&lt;br /&gt;
   --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;hazelcast xsi:schemaLocation=&amp;quot;http://www.hazelcast.com/schema/config hazelcast-config-3.1.xsd&amp;quot;&lt;br /&gt;
            xmlns=&amp;quot;http://www.hazelcast.com/schema/config&amp;quot;&lt;br /&gt;
            xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;partition-group enabled=&amp;quot;true&amp;quot; group-type=&amp;quot;CUSTOM&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.60&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.61&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.62&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
     &amp;lt;/partition-group&amp;gt;&lt;br /&gt;
 &amp;lt;/hazelcast&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More general information regarding custom partioning is available at http://hazelcast.org/docs/latest/manual/html/partitiongroupconfig.html . &lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list same the nodes that are also configured in the parition groups here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
After configuring a custom partitioning scheme, the data distribution may be verified, e.g. by inspecting the MBeans of the distributed maps via JMX.&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about different features that were implemented using the new cluster capabilities.&lt;br /&gt;
&lt;br /&gt;
== Distributed Session Storage ==&lt;br /&gt;
&lt;br /&gt;
Previously, when an Open-Xchange server was shutdown for maintenance, all user sessions that were bound to that machine were lost, i.e. the users needed to login again. With the distributed session storage, all sessions are backed by a distributed map in the cluster, so that they are no longer bound to a specific node in the cluster. When a node is shut down, the session data is still available in the cluster and can be accessed from the remaining nodes. The load-balancing techniques of the webserver then seamlessly routes the user session to another node, with no ''session expired'' errors. The distributed session storage comes with the package ''open-xchange-sessionstorage-hazelcast''. It's recommended to install this optional package in all clustered environments with multiple groupware server nodes.&lt;br /&gt;
&lt;br /&gt;
'''Notes:''' &lt;br /&gt;
* While there's some kind of built-in session distribution among the nodes in the cluster, this should not be seen as a replacement for session-stickiness between the loadbalancer and groupware nodes, i.e. one should still configure the webserver to use sticky sessions for performance reasons.&lt;br /&gt;
* The distributed session storage is still an in-memory storage. While the session data is distributed and backed up on multiple nodes in the cluster, shutting down multiple or all nodes at the same time will lead to loss of the the distributed data. To avoid such data loss when shutting down a node, please follow the guidelines at [[ Updating_a_Cluster ]].&lt;br /&gt;
&lt;br /&gt;
Depending on the cluster infrastructure, different backup-count configuration options might be set for the distributed session storage in the map configuration file ''sessions.properties'' in the ''hazelcast'' subdirectory:&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.backupCount=1&lt;br /&gt;
&lt;br /&gt;
The ''backupcount'' property configures the number of nodes with synchronized backups. Synchronized backups block operations until backups are successfully copied and acknowledgements are received. If 1 is set as the backup-count for example, then all entries of the map will be copied to another JVM for fail-safety. 0 means no backup. Any integer between 0 and 6. Default is 1, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.asyncBackupCount=0&lt;br /&gt;
&lt;br /&gt;
The ''asyncbackup'' property configures the number of nodes with async backups. Async backups do not block operations and do not require acknowledgements. 0 means no backup. Any integer between 0 and 6. Default is 0, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
Since session data is backed up by default continuously by multiple nodes in the cluster, the steps described in [[ Session_Migration ]] to trigger session migration to other nodes explicitly is obsolete and no longer needed with the distributed session storage.&lt;br /&gt;
&lt;br /&gt;
Normally, sessions in the distributed storages are not evicted automatically, but are only removed when they're also removed from the session handler, either due to a logout operation or when exceeding the long-term session lifetime as configured by ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''. Under certain circumstances, i.e. the session is no longer accessed by the client and the OX node hosting the session in it's long-life container being shutdown, the remove operation from the distributed storage might not be triggered. Therefore, additionaly a maximum idle time of map-entries can be configured for the distributed sessions map via &lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.configuration.map.maxIdleSeconds=640000&lt;br /&gt;
&lt;br /&gt;
To avoid unnecessary eviction, the value should be higher than the configured ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''.&lt;br /&gt;
&lt;br /&gt;
== Remote Cache Invalidation ==&lt;br /&gt;
&lt;br /&gt;
For faster access, groupware data is held in different caches by the server. Formerly, the caches utilized the TCP Lateral Auxiliary Cache plug in (LTCP) for the underlying JCS caches to broadcast updates and removals to caches on other OX nodes in the cluster. This could potentially lead to problems when remote invalidation was not working reliably due to network discovery problems. As an alternative, remote cache invalidation can also be performed using reliable publish/subscribe events built up on Hazelcast topics. This can be configured in the ''cache.properties'' configuration file, where the 'eventInvalidation' property can either be set to 'false' for the legacy behavior or 'true' for the new mechanism:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.caching.jcs.eventInvalidation=true&lt;br /&gt;
&lt;br /&gt;
All nodes participating in the cluster should be configured equally.&lt;br /&gt;
&lt;br /&gt;
Internally, if ''com.openexchange.caching.jcs.eventInvalidation'' is set to ''true'', LTCP is disabled in JCS caches. Instead, an internal mechanism based on distributed Hazelcast event topics is used to invalidate data throughout all nodes in the cluster after local update- and remove-operations. Put-operations aren't propagated (and haven't been with LTCP either), since all data put into caches can be locally loaded/evaluated at each node from the persistent storage layer.&lt;br /&gt;
&lt;br /&gt;
Using Hazelcast-based cache invalidation also makes further configuration of the JCS auxiliaries obsolete in the ''cache.ccf'' configuration file. In that case, all ''jcs.auxiliary.LTCP.*'' configuration settings are virtually ignored. However, it's still required to mark caches that require cluster-wide invalidation via ''jcs.region.&amp;lt;cache_name&amp;gt;=LTCP'', just as before. So basically, when using the new default setting ''com.openexchange.caching.jcs.eventInvalidation=true'', it's recommended to just use the stock ''cache.ccf'' file, since no further LTCP configuration is required.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
= Adminstration / Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Configuration ==&lt;br /&gt;
&lt;br /&gt;
The underlying Hazelcast library can be configured using the file ''hazelcast.properties''.&lt;br /&gt;
&lt;br /&gt;
'''Important''':&amp;lt;br&amp;gt;&lt;br /&gt;
By default property ''com.openexchange.hazelcast.network.interfaces'' is set to ''127.0.0.1''; meaning Hazelcast listens only to loop-back device. To build a cluster among remote nodes the appropriate network interface needs to be configured there. Leaving that property empty lets Hazelcast listen to all available network interfaces.&lt;br /&gt;
&lt;br /&gt;
The Hazelcast JMX MBean can be enabled or disabled with the property ''com.openexchange.hazelcast.jmx''. The properties ''com.openexchange.hazelcast.mergeFirstRunDelay'' and ''com.openexchange.hazelcast.mergeRunDelay'' control the run intervals of the so-called ''Split Brain Handler'' of Hazelcast that initiates the cluster join process when a new node is started. More details can be found at http://www.hazelcast.com/docs/2.5/manual/single_html/#NetworkPartitioning. &lt;br /&gt;
&lt;br /&gt;
The port ranges used by Hazelcast for incoming and outgoing connections can be controlled via the configuration parameters ''com.openexchange.hazelcast.networkConfig.port'', ''com.openexchange.hazelcast.networkConfig.portAutoIncrement'' and ''com.openexchange.hazelcast.networkConfig.outboundPortDefinitions''.&lt;br /&gt;
&lt;br /&gt;
== Commandline Tool ==&lt;br /&gt;
&lt;br /&gt;
To print out statistics about the cluster and the distributed data, the ''showruntimestats'' commandline tool can be executed witht the ''clusterstats'' ('c') argument. This provides an overview about the runtime cluster configuration of the node, other members in the cluster and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== JMX ==&lt;br /&gt;
&lt;br /&gt;
In the Open-Xchange server Java process, the MBean ''com.hazelcast'' can be used to monitor and manage different aspects of the underlying Hazelcast cluster. The ''com.hazelcast'' MBean provides detailed information about the cluster configuration and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Errors ==&lt;br /&gt;
&lt;br /&gt;
When experiencing hazelcast related errors in the logfiles, most likely different versions of the packages are installed, leading to different message formats that can't be understood by nodes using another version. Examples for such errors are exceptions in hazelcast components regarding (de)serialization or other message processing.&lt;br /&gt;
This may happen when performing a consecutive update of all nodes in the cluster, where temporarily nodes with a heterogeneous setup try to communicate with each other. If the errors don't disappear after all nodes in the cluster have been update to the same package versions, it might be necessary to shutdown the cluster completely, so that all distributed data is cleared.&lt;br /&gt;
&lt;br /&gt;
== Cluster Discovery Errors ==&lt;br /&gt;
&lt;br /&gt;
* If the started OX nodes don't form a cluster, please double-check your configuration in ''hazelcast.properties''&lt;br /&gt;
* It's important to have the same cluster name defined in ''hazelcast.properties'' throughout all nodes in the cluster&lt;br /&gt;
* Especially when using multicast cluster discovery, it might take some time until the cluster is formed&lt;br /&gt;
* When using ''static'' cluster discovery, at least one other node in the cluster has to be configured in ''com.openexchange.hazelcast.network.join.static.nodes'' to allow joining, however, it's recommended to list all nodes in the cluster here&lt;br /&gt;
&lt;br /&gt;
== Disable Cluster Features ==&lt;br /&gt;
&lt;br /&gt;
The Hazelcast based clustering features can be disabled with the following property changes:&lt;br /&gt;
* Disable cluster discovery by setting ''com.openexchange.hazelcast.network.join'' to ''empty'' in ''hazelcast.properties''&lt;br /&gt;
* Disable Hazelcast by setting ''com.openexchange.hazelcast.enabled'' to false in ''hazelcast.properties''&lt;br /&gt;
* Disable message based cache event invalidation by setting ''com.openexchange.caching.jcs.eventInvalidation'' to ''false'' in ''cache.properties''&lt;br /&gt;
&lt;br /&gt;
== Update from 6.22.1 to version 6.22.2 and above ==&lt;br /&gt;
&lt;br /&gt;
As hazelcast will be used by default for the distribution of sessions starting 6.22.2 you have to adjust hazelcast according to our old cache configuration. First of all it's important that you install the open-xchange-sessionstorage-hazelcast package. This package will add the binding between hazelcast and the internal session management. Next you have to set a cluster name to the cluster.properties file (see [[#Cluster Discovery Errors]]). Furthermore you will have to add one of the two discovery modes mentioned in [[#Cluster Discovery]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Updating a Cluster =&lt;br /&gt;
&lt;br /&gt;
Running a cluster means built-in failover on the one hand, but might require some attention when it comes to the point of upgrading the services on all nodes in the cluster. This chapter gives an overview about general concepts and hints for silent updates of the cluster.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
While in most cases a seamless, rolling upgrade of all nodes in the cluster is possible, there may be situations where nodes running a newer version of the Open-Xchange Server are not able to communicate with older nodes in the cluster, i.e. can't access distributed data or consume incompatible event notifications - especially, when the underlying Hazelcast library is part of the update, which does not support this scenario at the moment. In such cases, the release notes will contain corresponding information, so please have a look there before applying an update.&lt;br /&gt;
&lt;br /&gt;
Additionally, there may always be some kind of race conditions during an update, i.e. client requests that can't be completed successfully or internal events not being deliverd to all nodes in the cluster. That's why the following information should only serve as a best-practices guide to minimize the impact of upgrades to the user experience.&lt;br /&gt;
&lt;br /&gt;
== Upgrading a single Node ==&lt;br /&gt;
&lt;br /&gt;
Upgrading all nodes in the cluster should usually be done sequentially, i.o.w. one node after the other. This means that during the upgrade of one node, the node is temporarily disconnected from the other nodes in the cluster, and will join the cluster again after the update is completed. From the backend perspective, this is as easy as stopping the open-xchange service. other nodes in the cluster will recognize the disconnected node and start to repartition the shared cluster data automatically. But wait a minute - doing so would potentially lead to the webserver not registering the node being stopped immediately, resulting in temporary errors for currently logged in users until they are routed to another machine in the cluster. That's why it's good practice to tell the webserver's load balancer that the node should no longer fulfill incoming requests. The Apache Balancer Manager is an excellent tool for this ([http://httpd.apache.org/docs/2.2/mod/mod_status.html module ''mod_status'']). Look at the screen shot. Every node can be put into a disabled mode. Further requests will the redirected to other nodes in the cluster:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:balancer_manager.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afterwards, the open-xchange service on the disabled node can be stopped by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange stop&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange stop&lt;br /&gt;
&lt;br /&gt;
Now, the node is effectively in maintenance mode and any updates can take place. One could now verify the changed cluster infrastructure by accessing the Hazelcast MBeans either via JMX or the ''showruntimestats -c'' commandline tool (see above for details). There, the shut down node should no longer appear in the 'Member' section (com.hazelcast:type=Member).&lt;br /&gt;
&lt;br /&gt;
When all upgrades are processed, the node open-xchange service can be started again by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange start&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange start&lt;br /&gt;
&lt;br /&gt;
As stated above, depending on the chosen cluster discovery mechanism, it might take some time until the node joins the cluster again. When using static cluster discovery, it will join the existing cluster usually directly during serivce startup, i.o.w. before other depending OSGi services are started. Otherwise, there might also be situations where the node cannot join the cluster directly, for example when there were no mDNS advertisments for other nodes in the cluster received yet. Then, it can take some additional time until the node finally joins the cluster. During startup of the node, you can observe the JMX console or the output of ''showruntimestats -c'' (com.hazelcast:type=Member) of another node in the cluster to verify when the node has joined. &lt;br /&gt;
&lt;br /&gt;
After the node has joined, distributed data is re-partioned automatically, and the node is ready to server incoming requests again - so now the node can finally be enabled again in the load balancer configuration of the webserver. Afterwards, the next node in the cluster can be upgraded using the same procedure, until all nodes were processed.&lt;br /&gt;
&lt;br /&gt;
== Upgrades of the Hazelcast library ==&lt;br /&gt;
&lt;br /&gt;
In case an upgrade includes a major update of the Hazelcast library, a newly upgraded node will usually not be able to connect to the nodes running the previous version. In this case, volatile cluster data is lost after all nodes in the cluster have been updated, including sessions held in the distributed session storage. As outlined above, the release notes will contain a corresponding warning in such cases.&lt;br /&gt;
&lt;br /&gt;
Besides upgraded nodes not being able to access distributed data of the legacy cluster, this also affects new data not being available in the legacy cluster, which may cause troubles if the updated backend version needs to perform database update tasks. Database update tasks usually operate in a &amp;quot;blocking&amp;quot; way and all contexts associated with the schema being upgraded are disabled temporarily. Since context data itself is being held in caches on potentially each node in the cluster, the affected cache entries are invalidated during the database update. And, since cluster-wide cache invalidations again utilize Hazelcast functionality ([[#Remote Cache Invalidation]]), such invalidations normally won't be propagated to nodes running a previous version of the Hazelcast library.&lt;br /&gt;
&lt;br /&gt;
To work around this specific scenario where an incompatible upgrade of the Hazelcast library needs to be performed along with blocking database update tasks, starting with v7.8.0, a supplementary package is available that explicitly enables the context cache invalidation of nodes running the previous Hazelcast library. This package follows the naming scheme ''open-xchange-cluster-upgrade-from-XXX'' (where XXX representing the version of the legacy version of the Open-Xchange server), and is available in the repositories for the updated server packages. This package should only be installed on the first node of the cluster that is going to be upgraded to the new version, and can be deactivated once the database upgrade tasks were executed successfully. &lt;br /&gt;
&lt;br /&gt;
Once installed, a legacy cluster is discovered based on the available information in the ''hazelcast.properties'' configuration file in case cluster discovery is set to ''static''. If ''multicast'' is used, there's an alternative option to configure at least one of the addresses of the legacy cluster via ''com.openexchange.hazelcast.network.client.nodes''.&lt;br /&gt;
&lt;br /&gt;
As an example, along with the server v7.8.0, a new package named ''open-xchange-cluster-upgrade-from-76x'' can be installed that aids in invalidating cluster server nodes running v7.6.x (which includes the Hazelcast library in version 3.2.4). Using this package, the recommended steps to update an OX cluster from version 7.6.x to version 7.8.0 would be:&lt;br /&gt;
# Pick a node from your cluster that you want to use for executing the database update tasks shipped with the new release&lt;br /&gt;
# Disable this node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Update the OX packages on this node, additionally install the package ''open-xchange-cluster-upgrade-from-76x''&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Trigger the update task executions using the ''runUpdate'' commandline utitlty as described at [[UpdateTasks]]&lt;br /&gt;
# Once they are finished, uninstall the package ''open-xchange-cluster-upgrade-from-76x'' again&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Re-enable the node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Upgrade all other nodes in the cluster as described at [[#Upgrading a single Node]]&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.0 through v7.8.2 (incl.) to v7.8.3 using the package named ''open-xchange-cluster-upgrade-from-780-782'', since v7.8.0 through v7.8.2 (incl.) utilize Hazelcast v3.5.x, while v7.8.3 uses Hazelcast v3.6.4&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.3 to v7.8.4 using the package named ''open-xchange-cluster-upgrade-from-783'', since v7.8.3 utilizes Hazelcast v3.7.1&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.4 to v7.10.0 using the package named ''open-xchange-cluster-upgrade-from-784'', since v7.8.4 utilizes Hazelcast v3.8.1&lt;br /&gt;
&lt;br /&gt;
'''Operations Note:''' The upgraded node will be added as so-called [http://docs.hazelcast.org/docs/2.3/manual/html/ch15.html Native Client] to the legacy Hazelcast Cluster.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
Native Client enables you to do all Hazelcast operations without being a member of the cluster.&lt;br /&gt;
[...]&lt;br /&gt;
&lt;br /&gt;
However Native client is not member and relies on one of the cluster members.&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This means, the upgraded node will not be visible in the members list of the legacy Hazelcast cluster (&amp;lt;code&amp;gt;showruntimestats -c&amp;lt;/code&amp;gt;). Furthermore, the native client will created and destructed on single context events, with the effect that connections will only be visible in the very moment of such an event. This means effectively that verification of the invalidation mechanis is only possible by actually executing the &amp;lt;code&amp;gt;runupdate&amp;lt;/code&amp;gt; CLT. This should produce log lines like&lt;br /&gt;
&lt;br /&gt;
 Successfully initialzed Hazelcast client: &amp;lt;client-id&amp;gt;&lt;br /&gt;
 Successfully got reference to cache event topic: cacheEvents-3&lt;br /&gt;
 Publishing legacy cache event: &amp;lt;cache-event&amp;gt;&lt;br /&gt;
 Successfully published legacy cache event, shutting down client after 546ms...&lt;br /&gt;
&lt;br /&gt;
Most importantly, you should be able to observe correct functionality (users of affected contexts being logged out). It may be handy to prepare a dedicated schema with just test contexts inside. (How to create this is out of scope here, but hint: use &amp;lt;code&amp;gt;createschema&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;createcontext --schema-name&amp;lt;/code&amp;gt;.)&lt;br /&gt;
&lt;br /&gt;
== Other Considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's always recommended to only upgrade one node after the other, always ensuring that the cluster has formed correctly between each shutdown/startup of a node.&lt;br /&gt;
* Do not stop a node while running the runUpdate script or the associated update task.&lt;br /&gt;
* During the time of such a rolling upgrade of all nodes, we have effectively heterogeneous software versions in the cluster, which potentially might lead to temporary inconsistencies. Therefore, all nodes in the cluster should be updated in one cycle (but still one after the other).&lt;br /&gt;
* Following the above guideline, it's also possible to add or remove nodes dynamically to the cluster, not only when disconnecting a node temporary for updates.&lt;br /&gt;
* In case of trouble, i.e. a node refuses to join the cluster again after restart, consult the logfiles first for any hints about what is causing the problem - both on the disconnected node, and also on other nodes in the network&lt;br /&gt;
* If there are general incompatibilities between two revisions of the Open-Xchange Server that prevent an operation in a cluster (release notes), it's recommended to choose another name for the cluster in ''cluster.properties'' for the nodes with the new version. This will temporary lead to two separate clusters during the rolling upgrade, and finally the old cluster being shut down completely after the last node was updated to the new version. While distributed data can't be migrated from one server version to another in this scenario due to incompatibilities, the uptime of the system itself is not affected, since the nodes in the new cluster are able to serve new incoming requests directly.&lt;br /&gt;
* When updating only UI plugins without also updating to a new version of the core UI, you also need to perform the additional step from [[AppSuite:UpdatingOXPackages#Updating_UI_plugins|Updating UI plugins]].&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]] [[Category: Administration]] [[Category: Cluster]]&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:User_management&amp;diff=23505</id>
		<title>AppSuite:User management</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:User_management&amp;diff=23505"/>
		<updated>2017-06-28T08:20:46Z</updated>

		<summary type="html">&lt;p&gt;Thorben: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== createuser ==&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;createuser&amp;lt;/code&amp;gt;''' is the tool to create new users in a given context. The displayname must be unique in one 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 infoabout 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;
| --extendedoptions &lt;br /&gt;
|Set this if you want to see all options, use this instead of help option&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;
| -c,--contextid &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|The id of the context&lt;br /&gt;
|-&lt;br /&gt;
| -u,--username &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Username of the user&lt;br /&gt;
|-&lt;br /&gt;
| -d,--displayname &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Display name of the user&lt;br /&gt;
|-&lt;br /&gt;
| -g,--givenname &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Given name for the user&lt;br /&gt;
|-&lt;br /&gt;
| -s,--surname &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Surname of the user&lt;br /&gt;
|-&lt;br /&gt;
| -p,--password &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Password for the user &lt;br /&gt;
|-&lt;br /&gt;
| -e,--email &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Primary mail address &lt;br /&gt;
|-&lt;br /&gt;
| -l,--language &amp;amp;lt;lang&amp;amp;gt;&lt;br /&gt;
|Language for the user (de_DE,en_US,fr_FR)&lt;br /&gt;
|-&lt;br /&gt;
| -t,--timezone &amp;amp;lt;timezone&amp;amp;gt;&lt;br /&gt;
|Timezone of the user (Europe/Berlin)&lt;br /&gt;
|-&lt;br /&gt;
| -x,--department &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Department of the user &lt;br /&gt;
|-&lt;br /&gt;
| -z,--company &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Company of the user &lt;br /&gt;
|-&lt;br /&gt;
| -a,--aliases &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|E-Mail aliases of the user, separated by &amp;quot;,&amp;quot;&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;
| --addguipreferences &amp;amp;lt;addguipreferences&amp;amp;gt;&lt;br /&gt;
|Add a GUI setting (key=value)&lt;br /&gt;
|}&lt;br /&gt;
For the GUI preferences please also see [http://oxpedia.org/wiki/index.php?title=Gui_path]&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&lt;br /&gt;
import. This option makes mandatory command line options obsolete, except credential options (if needed). But they have to be set in the CSV file.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
With this option you can specify a csv file&lt;br /&gt;
(a full pathname must be given) with the data which should be imported. The columnnames in the CSV file must be the same as the long-options of the command line tools, without the prefix&lt;br /&gt;
&amp;quot;--&amp;quot;.&lt;br /&gt;
&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 the command line tools in a shell script every time, just a csv file needs to&lt;br /&gt;
be created, containing the whole data.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note that the credentials of the masteradmin in the createcontext call must be given on the command line with the -A and -P options nevertheless - if&lt;br /&gt;
authentication is enabled. If the createuser command line tool is used, the credentials are part of the csv file, and cannot be set as options on the command line itself. The reason for this&lt;br /&gt;
different behavior is that different contexts have different credentials for the admin user, so they must be set in every line of the csv file. Opposed to this the credentials of the masteradmin&lt;br /&gt;
are always the same.&lt;br /&gt;
&lt;br /&gt;
=== Extended options ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| --email1 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Email1&lt;br /&gt;
|-&lt;br /&gt;
| --birthday &amp;amp;lt;datevalue&amp;amp;gt;&lt;br /&gt;
|Birthday&lt;br /&gt;
|-&lt;br /&gt;
| --anniversary &amp;amp;lt;datevalue&amp;amp;gt;&lt;br /&gt;
|Anniversary&lt;br /&gt;
|-&lt;br /&gt;
| --branches &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Branches&lt;br /&gt;
|-&lt;br /&gt;
| --business_category &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Business_category&lt;br /&gt;
|-&lt;br /&gt;
| --postal_code_business &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Postal_code_business&lt;br /&gt;
|-&lt;br /&gt;
| --state_business &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|State_business&lt;br /&gt;
|-&lt;br /&gt;
| --street_business &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Street_business&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_callback &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_callback&lt;br /&gt;
|-&lt;br /&gt;
| --city_home &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|City_home&lt;br /&gt;
|-&lt;br /&gt;
| --commercial_register &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Commercial_register&lt;br /&gt;
|-&lt;br /&gt;
| --country_home &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Country_home&lt;br /&gt;
|-&lt;br /&gt;
| --email2 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Email2&lt;br /&gt;
|-&lt;br /&gt;
| --email3 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Email3&lt;br /&gt;
|-&lt;br /&gt;
| --employeetype &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|EmployeeType&lt;br /&gt;
|-&lt;br /&gt;
| --fax_business &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Fax_business&lt;br /&gt;
|-&lt;br /&gt;
| --fax_home &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Fax_home&lt;br /&gt;
|-&lt;br /&gt;
| --fax_other &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Fax_other&lt;br /&gt;
|-&lt;br /&gt;
| --imapserver &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|ImapServer&lt;br /&gt;
|-&lt;br /&gt;
| --imaplogin &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|ImapLogin&lt;br /&gt;
|-&lt;br /&gt;
| --smtpserver &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|SmtpServer&lt;br /&gt;
|-&lt;br /&gt;
| --instant_messenger1 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Instant_messenger1&lt;br /&gt;
|-&lt;br /&gt;
| --instant_messenger2 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Instant_messenger2&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_ip &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_ip&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_isdn &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_isdn&lt;br /&gt;
|-&lt;br /&gt;
| --mail_folder_drafts_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Mail_folder_drafts_name&lt;br /&gt;
|-&lt;br /&gt;
| --mail_folder_sent_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Mail_folder_sent_name&lt;br /&gt;
|-&lt;br /&gt;
| --mail_folder_spam_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Mail_folder_spam_name&lt;br /&gt;
|-&lt;br /&gt;
| --mail_folder_trash_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Mail_folder_trash_name&lt;br /&gt;
|-&lt;br /&gt;
| --mail_folder_archive_full_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Mail_folder_archive_full_name&lt;br /&gt;
|-&lt;br /&gt;
| --manager_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Manager_name&lt;br /&gt;
|-&lt;br /&gt;
| --marital_status &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Marital_status&lt;br /&gt;
|-&lt;br /&gt;
| --cellular_telephone1 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Cellular_telephone1&lt;br /&gt;
|-&lt;br /&gt;
| --cellular_telephone2 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Cellular_telephone2&lt;br /&gt;
|-&lt;br /&gt;
| --info &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Info&lt;br /&gt;
|-&lt;br /&gt;
| --nickname &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Nickname&lt;br /&gt;
|-&lt;br /&gt;
| --number_of_children &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Number_of_children&lt;br /&gt;
|-&lt;br /&gt;
| --note &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Note&lt;br /&gt;
|-&lt;br /&gt;
| --number_of_employee &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Number_of_employee&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_pager &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_pager&lt;br /&gt;
|-&lt;br /&gt;
| --password_expired &amp;amp;lt;booleanvalue&amp;amp;gt;&lt;br /&gt;
|Password_expired&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_assistant &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_assistant&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_business1 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_business1&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_business2 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_business2&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_car &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_car&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_company &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_company&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_home1 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_home1&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_home2 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_home2&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_other &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_other&lt;br /&gt;
|-&lt;br /&gt;
| --postal_code_home &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Postal_code_home&lt;br /&gt;
|-&lt;br /&gt;
| --profession &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Profession&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_radio &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_radio&lt;br /&gt;
|-&lt;br /&gt;
| --room_number &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Room_number&lt;br /&gt;
|-&lt;br /&gt;
| --sales_volume &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Sales_volume&lt;br /&gt;
|-&lt;br /&gt;
| --city_other &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|City_other&lt;br /&gt;
|-&lt;br /&gt;
| --country_other &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Country_other&lt;br /&gt;
|-&lt;br /&gt;
| --middle_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Middle_name&lt;br /&gt;
|-&lt;br /&gt;
| --postal_code_other &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Postal_code_other&lt;br /&gt;
|-&lt;br /&gt;
| --state_other &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|State_other&lt;br /&gt;
|-&lt;br /&gt;
| --street_other &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Street_other&lt;br /&gt;
|-&lt;br /&gt;
| --spouse_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Spouse_name&lt;br /&gt;
|-&lt;br /&gt;
| --state_home &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|State_home&lt;br /&gt;
|-&lt;br /&gt;
| --street_home &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Street_home&lt;br /&gt;
|-&lt;br /&gt;
| --suffix &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Suffix&lt;br /&gt;
|-&lt;br /&gt;
| --tax_id &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Tax_id&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_telex &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_telex&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_ttytdd &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_ttytdd&lt;br /&gt;
|-&lt;br /&gt;
| --uploadfilesizelimitperfile &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Upload file size limit per file for mail attachments&lt;br /&gt;
|-&lt;br /&gt;
| --uploadfilesizelimit &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Total upload file size limit for mail attachments&lt;br /&gt;
|-&lt;br /&gt;
| --url &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Url&lt;br /&gt;
|-&lt;br /&gt;
| --userfield01 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield01&lt;br /&gt;
|-&lt;br /&gt;
| --userfield02 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield02&lt;br /&gt;
|-&lt;br /&gt;
| --userfield03 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield03&lt;br /&gt;
|-&lt;br /&gt;
| --userfield04 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield04&lt;br /&gt;
|-&lt;br /&gt;
| --userfield05 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield05&lt;br /&gt;
|-&lt;br /&gt;
| --userfield06 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield06&lt;br /&gt;
|-&lt;br /&gt;
| --userfield07 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield07&lt;br /&gt;
|-&lt;br /&gt;
| --userfield08 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield08&lt;br /&gt;
|-&lt;br /&gt;
| --userfield09 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield09&lt;br /&gt;
|-&lt;br /&gt;
| --userfield10 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield10&lt;br /&gt;
|-&lt;br /&gt;
| --userfield11 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield11&lt;br /&gt;
|-&lt;br /&gt;
| --userfield12 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield12&lt;br /&gt;
|-&lt;br /&gt;
| --userfield13 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield13&lt;br /&gt;
|-&lt;br /&gt;
| --userfield14 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield14&lt;br /&gt;
|-&lt;br /&gt;
| --userfield15 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield15&lt;br /&gt;
|-&lt;br /&gt;
| --userfield16 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield16&lt;br /&gt;
|-&lt;br /&gt;
| --userfield17 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield17&lt;br /&gt;
|-&lt;br /&gt;
| --userfield18 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield18&lt;br /&gt;
|-&lt;br /&gt;
| --userfield19 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield19&lt;br /&gt;
|-&lt;br /&gt;
| --userfield20 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield20&lt;br /&gt;
|-&lt;br /&gt;
| --city_business &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|City_business&lt;br /&gt;
|-&lt;br /&gt;
| --country_business &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Country_business&lt;br /&gt;
|-&lt;br /&gt;
| --assistant_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Assistant_name&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_primary &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_primary&lt;br /&gt;
|-&lt;br /&gt;
| --categories &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Categories&lt;br /&gt;
|-&lt;br /&gt;
| --mail_folder_confirmed_ham_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Mail_folder_confirmed_ham_name&lt;br /&gt;
|-&lt;br /&gt;
| --mail_folder_confirmed_spam_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Mail_folder_confirmed_spam_name&lt;br /&gt;
|-&lt;br /&gt;
| --gui_spam_filter_capabilities_enabled &amp;amp;lt;booleanvalue&amp;amp;gt;&lt;br /&gt;
|GUI_spam_filter_capabilities_enabled&lt;br /&gt;
|-&lt;br /&gt;
| --mailenabled &amp;amp;lt;true/false&amp;amp;gt;&lt;br /&gt;
|Mailenabled&lt;br /&gt;
|-&lt;br /&gt;
| --defaultsenderaddress &amp;amp;lt;stringvalue&amp;amp;gt;&lt;br /&gt;
|DefaultSenderAddress&lt;br /&gt;
|-&lt;br /&gt;
| --title &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Title&lt;br /&gt;
|-&lt;br /&gt;
| --position &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Position&lt;br /&gt;
|-&lt;br /&gt;
| --access-calendar &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Calendar module (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-contacts &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Contact module access (Default is on)&lt;br /&gt;
|-&lt;br /&gt;
| --access-delegate-tasks &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Delegate tasks access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-edit-public-folder &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Edit public folder access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-ical &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Ical module access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-infostore &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Infostore module access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-read-create-shared-Folders &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Read create shared folder access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-syncml &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Syncml access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-active-sync &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Exchange Active Sync access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-usm &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Universal Sync Module access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-tasks &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Tasks access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-vcard &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Vcard access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
--access-webmail &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Webmail access (Default is on)&lt;br /&gt;
|-&lt;br /&gt;
| --access-publication &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Publication permission (Default is on). Note: access-publication needs access-infostore and is optional for Groupware+ and premium&lt;br /&gt;
|-&lt;br /&gt;
| --access-subscription &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Subscription permission (Default is on)&lt;br /&gt;
|-&lt;br /&gt;
| --access-edit-group &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Edit group access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-edit-resource &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Edit resource access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-edit-password &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Edit password access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-collect-email-addresses &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Edit collect email addresses (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-multiple-mail-accounts &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Use multiple mail account feature (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-global-address-book-disabled &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Access to global address book (Default is off). Note: Setting this option to true is only allowed in combination with PIM and Webmail rights. Note: There is a 'restoregaddefaults' script to restore the default permissions of the global address book folder. &lt;br /&gt;
|-&lt;br /&gt;
| --access--voipnow &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Access to VoiceOverIP feature.&lt;br /&gt;
|-&lt;br /&gt;
| --access-public-folder-editable &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Access to public folders. Allows or denies to see public folders. &lt;br /&gt;
|-&lt;br /&gt;
| --foldertree &amp;amp;lt;0/1&amp;amp;gt;&lt;br /&gt;
|0 sets the OX standard folder tree and 1 sets the Outlook-like folder tree.&lt;br /&gt;
|-&lt;br /&gt;
| --access-olox20 &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
| Access to Olox2.0&lt;br /&gt;
|-&lt;br /&gt;
| --default-folder-mode&lt;br /&gt;
| The mode how the default folders should be created. 'default', 'default-deletable', 'no-default-folders'. If not selected, 'default' is applied.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Open-Xchange module access ===&lt;br /&gt;
&lt;br /&gt;
With Open-Xchange it is&lt;br /&gt;
possible to limit the access to the available modules per context i. e., all users in one context per default get the same access rights. The rights though can be changed per user. Currently,&lt;br /&gt;
following modules are implemented: access-calendar, access-contacts, access-delegate-tasks, access-edit-public-folder, access-ical, access-infostore, access-read-create-shared-Folders,&lt;br /&gt;
access-tasks, access-vcard, access-webdav, access-syncml and access-webmail. There are several combinations possible and four are supported (not mentioned modules need to be&lt;br /&gt;
disabled). This limitation is needed because some modules depend on access to others. There are different Open-Xchange packages available for the customer: Webmail+, PIM+, Groupware+, Premium.&lt;br /&gt;
These packages have to be configured per context i. e., all users in a context need to use the same package. Each package consists of a combination of modules that has to be set up appropriately.&lt;br /&gt;
The following sections quickly introduce the packages and their module configuration. Open-Xchange also provides the possibility to use &amp;quot;access combination names&amp;quot; when creating and changing&lt;br /&gt;
contexts/users. If you want to change the package acess rights for a context, you can simply add the &amp;quot;access-combination-name&amp;quot; switch to the appropriate tool&lt;br /&gt;
(createcontext,createuser,changecontext etc.).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== Webmail+ ====&lt;br /&gt;
&lt;br /&gt;
If there are no access rights specified when creating a new user Webmail+ is used as default. Webmail+ is a base package that allows access to the&lt;br /&gt;
webmail interface and a personal address book. To grant access to this package, the following modules have to be set to &amp;quot;on&amp;quot; for all users in a context:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|access-contacts&lt;br /&gt;
|Access combination name: webmail_plus&lt;br /&gt;
|-&lt;br /&gt;
|access-webmail&lt;br /&gt;
|Access combinationname: webmail_plus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== PIM+ ====&lt;br /&gt;
&lt;br /&gt;
PIM+&lt;br /&gt;
is another base package that gives access to the webmailer, personal address book, calendar and tasks. Group appointments and delegating tasks are not supported. To grant access to this package,&lt;br /&gt;
the following modules have to be set to &amp;quot;on&amp;quot; for all users in a context:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|access-contacts&lt;br /&gt;
|Access combination name: pim_plus&lt;br /&gt;
|-&lt;br /&gt;
|access-webmail&lt;br /&gt;
|Access combination name: pim_plus&lt;br /&gt;
|-&lt;br /&gt;
|access-calendar&lt;br /&gt;
|Access combination name: pim_plus&lt;br /&gt;
|-&lt;br /&gt;
|access-delegate-tasks&lt;br /&gt;
|Access combination name: pim_plus&lt;br /&gt;
|-&lt;br /&gt;
|access-tasks&lt;br /&gt;
|Access combination name: pim_plus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Groupware+ ====&lt;br /&gt;
&lt;br /&gt;
Groupware+ is an upsell package that provides full groupware functionality: private, shared and public folders, conflict handling for appointments, team view. Furthermore, the InfoStore is&lt;br /&gt;
available. To grant access to this package, the following modules have to be set to &amp;quot;on&amp;quot; for all users in a context:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|access-contacts&lt;br /&gt;
|Access combination name: groupware_plus&lt;br /&gt;
|-&lt;br /&gt;
|access-webmail&lt;br /&gt;
|Access combination name: groupware_plus&lt;br /&gt;
|-&lt;br /&gt;
|access-calendar&lt;br /&gt;
|Access combination name: groupware_plus&lt;br /&gt;
|-&lt;br /&gt;
|access-delegate-tasks&lt;br /&gt;
|Access combination name: groupware_plus&lt;br /&gt;
|-&lt;br /&gt;
|access-tasks&lt;br /&gt;
|Access combination name: groupware_plus&lt;br /&gt;
|-&lt;br /&gt;
|access-edit-public-folder&lt;br /&gt;
|Access combination name: groupware_plus&lt;br /&gt;
|-&lt;br /&gt;
|access-infostore&lt;br /&gt;
|Access combination name: groupware_plus&lt;br /&gt;
|-&lt;br /&gt;
|access-read-create-shared-Folders&lt;br /&gt;
|Access combination name: groupware_plus&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Premium ====&lt;br /&gt;
&lt;br /&gt;
Premium is a desktop integration package. It provides the functionality of the &amp;quot;Groupware+&amp;quot; package and comes with interfaces to integrate with other software: The OXtender for MS Outlook and the&lt;br /&gt;
WebDAV interface to integrate the InfoStore with desktops. To grant access to this package, the following modules have to be set to &amp;quot;on&amp;quot; for all users in a context:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|access-contacts&lt;br /&gt;
|Access combination name: premium&lt;br /&gt;
|-&lt;br /&gt;
|access-webmail&lt;br /&gt;
|Access combination name: premium&lt;br /&gt;
|-&lt;br /&gt;
|access-calendar&lt;br /&gt;
|Access combination name: premium&lt;br /&gt;
|-&lt;br /&gt;
|access-delegate-tasks&lt;br /&gt;
|Access combination name: premium&lt;br /&gt;
|-&lt;br /&gt;
|access-tasks&lt;br /&gt;
|Access combination name: premium&lt;br /&gt;
|-&lt;br /&gt;
|access-edit-public-folder&lt;br /&gt;
|Access combination name: premium&lt;br /&gt;
|-&lt;br /&gt;
|access-infostore&lt;br /&gt;
|Access combination name: premium&lt;br /&gt;
|-&lt;br /&gt;
|access-read-create-shared-Folders&lt;br /&gt;
|Access combination name: premium&lt;br /&gt;
|-&lt;br /&gt;
|access-ical&lt;br /&gt;
|Access combination name: premium&lt;br /&gt;
|-&lt;br /&gt;
|access-vcard&lt;br /&gt;
|Access combination name: premium&lt;br /&gt;
|-&lt;br /&gt;
|access-webdav&lt;br /&gt;
|Access combination name: premium&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== All ====&lt;br /&gt;
The setting &amp;lt;code&amp;gt;all&amp;lt;/code&amp;gt; is equivalent to &amp;lt;code&amp;gt;premium&amp;lt;/code&amp;gt; for ordinary users. For context administrators, it adds the right &amp;lt;code&amp;gt;publicfoldereditable&amp;lt;/code&amp;gt;, which allows the admin to change the access rights to public folders for groups.&lt;br /&gt;
&lt;br /&gt;
==== Package access configuration ====&lt;br /&gt;
&lt;br /&gt;
This section provides a quick overview about the different packages that can be configured per context and the&lt;br /&gt;
required access configuration:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|Module&lt;br /&gt;
|Webmail+&lt;br /&gt;
|PIM+&lt;br /&gt;
|Groupware+&lt;br /&gt;
|Premium&lt;br /&gt;
|-&lt;br /&gt;
| -access-calendar&lt;br /&gt;
|off&lt;br /&gt;
|on&lt;br /&gt;
|on&lt;br /&gt;
|on&lt;br /&gt;
|-&lt;br /&gt;
| -access-contacts&lt;br /&gt;
|on&lt;br /&gt;
|on&lt;br /&gt;
|on&lt;br /&gt;
|on&lt;br /&gt;
|-&lt;br /&gt;
| -access-delegate-tasks&lt;br /&gt;
|off&lt;br /&gt;
|on&lt;br /&gt;
|on&lt;br /&gt;
|on&lt;br /&gt;
|-&lt;br /&gt;
| -access-edit-public-folder&lt;br /&gt;
|off&lt;br /&gt;
|off&lt;br /&gt;
|on&lt;br /&gt;
|on&lt;br /&gt;
|-&lt;br /&gt;
| -access-ical&lt;br /&gt;
|off&lt;br /&gt;
|off&lt;br /&gt;
|off&lt;br /&gt;
|on&lt;br /&gt;
|-&lt;br /&gt;
| -access-infostore&lt;br /&gt;
|off&lt;br /&gt;
|off&lt;br /&gt;
|on&lt;br /&gt;
|on&lt;br /&gt;
|-&lt;br /&gt;
| -access-read-create-shared-Folders&lt;br /&gt;
|off&lt;br /&gt;
|off&lt;br /&gt;
|on&lt;br /&gt;
|on&lt;br /&gt;
|-&lt;br /&gt;
| -access-syncml&lt;br /&gt;
|off&lt;br /&gt;
|off&lt;br /&gt;
|off&lt;br /&gt;
|off&lt;br /&gt;
|-&lt;br /&gt;
|–access-tasks&lt;br /&gt;
|off&lt;br /&gt;
|on&lt;br /&gt;
|on&lt;br /&gt;
|on&lt;br /&gt;
|-&lt;br /&gt;
| -access-vcard&lt;br /&gt;
|off&lt;br /&gt;
|off&lt;br /&gt;
|off&lt;br /&gt;
|on&lt;br /&gt;
|-&lt;br /&gt;
| -access-webdav&lt;br /&gt;
|off&lt;br /&gt;
|off&lt;br /&gt;
|off&lt;br /&gt;
|on&lt;br /&gt;
|-&lt;br /&gt;
| -access-webmail&lt;br /&gt;
|on&lt;br /&gt;
|on&lt;br /&gt;
|on&lt;br /&gt;
|on&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;
&lt;br /&gt;
=== Mandatory parameters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;contextid {adminuser adminpass} 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;user &amp;amp;lt;userid&amp;amp;gt; in context &amp;amp;lt;contextid&amp;amp;gt; created&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On failure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;user in 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;
&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/createuser -c 123 -u jd -d &amp;quot;john doe&amp;quot;&lt;br /&gt;
-g John -s Doe -p userpw -e jd@example.com&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;user 3 in context 123 created&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== deleteuser ==&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;deleteuser&amp;lt;/code&amp;gt;''' is the tool to delete a user in a given context. If you delete a user the public folder entries of this user are&lt;br /&gt;
transferred to the admin user. All other data are deleted.&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 them context&lt;br /&gt;
|-&lt;br /&gt;
| -i,--userid &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|Id of the user&lt;br /&gt;
|-&lt;br /&gt;
| -u,--username &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Username ofthe user&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;
&lt;br /&gt;
=== Mandatory parameters ===&lt;br /&gt;
&amp;lt;code&amp;gt;contextid {adminuser adminpass} (userid or username)&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;user &amp;amp;lt;userid&amp;amp;gt; in context &amp;amp;lt;contextid&amp;amp;gt; deleted&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On failure:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;user &amp;amp;lt;userid&amp;amp;gt; in context &amp;amp;lt;contextid&amp;amp;gt; could not be deleted: &amp;amp;lt;reason from&lt;br /&gt;
server&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&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/deleteuser -c 123 -i 3&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;user 3 in context 123 deleted&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== listuser ==&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;listuser&amp;lt;/code&amp;gt;''' is the tool to list and search for users.&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;
| -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;
| -i,--ignorecase &lt;br /&gt;
|Do a case-insensitive search with the given search pattern&lt;br /&gt;
|-&lt;br /&gt;
| --includeguests&lt;br /&gt;
|Add guest users to listing '''Available with v7.8.0'''&lt;br /&gt;
|-&lt;br /&gt;
| --excludeusers&lt;br /&gt;
|Exclude usual users from listing '''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;
|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;
Standard output (only a subset of available attributes are printed also only disabled&lt;br /&gt;
modules):&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|id&lt;br /&gt;
|enabled&lt;br /&gt;
|imapServer&lt;br /&gt;
|smtpserver&lt;br /&gt;
|language&lt;br /&gt;
|Webdav&lt;br /&gt;
|-&lt;br /&gt;
|3&lt;br /&gt;
|true&lt;br /&gt;
|localhost&lt;br /&gt;
|localhost&lt;br /&gt;
|en_US&lt;br /&gt;
|false&lt;br /&gt;
|false&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
csv output: &lt;br /&gt;
Name,Language,Id,Display_name,PrimaryEmail,MaxQuota,UsedQuota,Email1,Mailenabled,Password,Sur_name,Given_name,&lt;br /&gt;
FilestoreId,FilestoreOwner,Filestore_name,Birthday,Anniversary,Branches,Business_category,Postal_code_business,&lt;br /&gt;
State_business,Street_business,Telephone_callback,City_home,Commercial_register,Country_home,Company,Department,&lt;br /&gt;
Email2,Email3,EmployeeType,Fax_business,Fax_home,Fax_other,ImapServer,ImapLogin,SmtpServer,Instant_messenger1,&lt;br /&gt;
Instant_messenger2,Telephone_ip,Telephone_isdn,Mail_folder_drafts_name,Mail_folder_sent_name,&lt;br /&gt;
Mail_folder_spam_name,Mail_folder_trash_name,Mail_folder_archive_full_name,Manager_name,Marital_status,Cellular_telephone1,Cellular_telephone2,&lt;br /&gt;
Info,Nickname,Number_of_children,Note,Number_of_employee,Telephone_pager,Password_expired,Telephone_assistant,&lt;br /&gt;
Telephone_business1,Telephone_business2,Telephone_car,Telephone_company,Telephone_home1,Telephone_home2,&lt;br /&gt;
Telephone_other,Position,Postal_code_home,Profession,Telephone_radio,Room_number,Sales_volume,City_other,&lt;br /&gt;
Country_other,Middle_name,Postal_code_other,State_other,Street_other,Spouse_name,State_home,Street_home,Suffix,&lt;br /&gt;
Tax_id,Telephone_telex,Timezone,Title,Telephone_ttytdd,UploadFileSizeLimit,UploadFileSizeLimitPerFile,Url,&lt;br /&gt;
Userfield01,Userfield02,Userfield03,Userfield04,Userfield05,Userfield06,Userfield07,Userfield08,Userfield09,&lt;br /&gt;
Userfield10,Userfield11,Userfield12,Userfield13,Userfield14,Userfield15,Userfield16,Userfield17,Userfield18,&lt;br /&gt;
Userfield19,Userfield20,Aliases,City_business,Country_business,Assistant_name,Telephone_primary,Categories,&lt;br /&gt;
PasswordMech,Mail_folder_confirmed_ham_name,Mail_folder_confirmed_spam_name,GUI_Spam_filter_capabilities_enabled,&lt;br /&gt;
DefaultSenderAddress,FolderTree,UserAttributes,GuiPreferences,access-calendar,access-contacts,&lt;br /&gt;
access-delegate-tasks,access-edit-public-folder,access-ical,access-infostore,&lt;br /&gt;
access-read-create-shared-Folders,access-syncml,access-tasks,access-vcard,access-webdav,&lt;br /&gt;
access-webmail,access-edit-group,access-edit-resource,access-edit-password,access-collect-email-addresses,&lt;br /&gt;
access-multiple-mail-accounts,access-subscription,access-publication,access-active-sync,access-usm,&lt;br /&gt;
access-olox20,access-denied-portal,access-global-address-book-disabled,access-public-folder-editable&lt;br /&gt;
&lt;br /&gt;
=== Example ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt; root@oxhe:~# /opt/open-xchange/sbin/listuser -c 6 Id Name Displayname Email 2 admin admin admin@example.com 3 holger Holger&lt;br /&gt;
holger@example.com &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== getusercapabilities ==&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;getusercapabilities&amp;lt;/code&amp;gt;''' is the tool to list available capabilities for a certain user.&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;
| -i,--userid &amp;amp;lt;userid&amp;amp;gt;&lt;br /&gt;
|Id of the user&lt;br /&gt;
|-&lt;br /&gt;
| -u,--username &amp;amp;lt;username&amp;amp;gt;&lt;br /&gt;
|Username of the user&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 userid 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 user &amp;amp;lt;user-id&amp;amp;gt; in 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/getusercapabilities -c 6 -i 345&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== changeuser ==&lt;br /&gt;
&lt;br /&gt;
The '''&amp;lt;code&amp;gt;changeuser&amp;lt;/code&amp;gt;''' tool allows to modify attributes of an existing user in a given context. The displayname must be unique in&lt;br /&gt;
one 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;
| --extendedoptions &lt;br /&gt;
|Set this if you want to see all options, use this instead of help option&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;
| -i,--userid &amp;amp;lt;integer&amp;amp;gt;&lt;br /&gt;
|Id of the user&lt;br /&gt;
|-&lt;br /&gt;
| -u,--username &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Username of the user &lt;br /&gt;
|-&lt;br /&gt;
| -d,--displayname &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Display name of the user &lt;br /&gt;
|-&lt;br /&gt;
| -g,--givenname &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Given name for the user &lt;br /&gt;
|-&lt;br /&gt;
| -s,--surname &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Surname of the user&lt;br /&gt;
|-&lt;br /&gt;
| -p,--password &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Password for the user &lt;br /&gt;
|-&lt;br /&gt;
| -e,--email &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Primary mail address &lt;br /&gt;
|-&lt;br /&gt;
| -l,--language &amp;amp;lt;lang&amp;amp;gt;&lt;br /&gt;
|Language for the user (de_DE,en_US, fr_FR)&lt;br /&gt;
|-&lt;br /&gt;
| -t,--timezone &amp;amp;lt;timezone&amp;amp;gt;&lt;br /&gt;
|Timezone of the user (Europe/Berlin)&lt;br /&gt;
|-&lt;br /&gt;
| -x,--department &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Department of the user&lt;br /&gt;
|-&lt;br /&gt;
| -z,--company &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Company of the user &lt;br /&gt;
|-&lt;br /&gt;
| -a,--aliases &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|E-Mail aliases of the user, separated by &amp;quot;,&amp;quot;&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;
| --addguipreferences &amp;amp;lt;addguipreferences&amp;amp;gt;&lt;br /&gt;
|Add a GUI setting (key=value)&lt;br /&gt;
|-&lt;br /&gt;
| --removeguipreferences &amp;amp;lt;removeguipreferences&amp;amp;gt;&lt;br /&gt;
|Remove a GUI setting &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;
| --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;
For the GUI preferences please also see http://www.open-xchange.com/wiki/index.php?title=Gui_path&lt;br /&gt;
&lt;br /&gt;
=== Extended options ===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| --email1 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Email1&lt;br /&gt;
|-&lt;br /&gt;
| --mailenabled &amp;amp;lt;booleanvalue &amp;amp;gt;&lt;br /&gt;
|Mailenabled&lt;br /&gt;
|-&lt;br /&gt;
| --birthday &amp;amp;lt;datevalue&amp;amp;gt;&lt;br /&gt;
|Birthday&lt;br /&gt;
|-&lt;br /&gt;
| --anniversary &amp;amp;lt;datevalue&amp;amp;gt;&lt;br /&gt;
|Anniversary&lt;br /&gt;
|-&lt;br /&gt;
| --branches &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Branches&lt;br /&gt;
|-&lt;br /&gt;
| --business_category &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Business_category&lt;br /&gt;
|-&lt;br /&gt;
| --postal_code_business &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Postal_code_business&lt;br /&gt;
|-&lt;br /&gt;
| --state_business &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|State_business&lt;br /&gt;
|-&lt;br /&gt;
| --street_business &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Street_business&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_callback &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_callback&lt;br /&gt;
|-&lt;br /&gt;
| --city_home &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|City_home&lt;br /&gt;
|-&lt;br /&gt;
| --commercial_register &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Commercial_register&lt;br /&gt;
|-&lt;br /&gt;
| --country_home &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Country_home&lt;br /&gt;
|-&lt;br /&gt;
| --email2 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Email2&lt;br /&gt;
|-&lt;br /&gt;
| --email3 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Email3&lt;br /&gt;
|-&lt;br /&gt;
| --employeetype &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|EmployeeType&lt;br /&gt;
|-&lt;br /&gt;
| --fax_business &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Fax_business&lt;br /&gt;
|-&lt;br /&gt;
| --fax_home &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Fax_home&lt;br /&gt;
|-&lt;br /&gt;
| --fax_other &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Fax_other&lt;br /&gt;
|-&lt;br /&gt;
| --imapserver &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|ImapServer&lt;br /&gt;
|-&lt;br /&gt;
| --imaplogin &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|ImapLogin&lt;br /&gt;
|-&lt;br /&gt;
| --smtpserver &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|SmtpServer&lt;br /&gt;
|-&lt;br /&gt;
| --instant_messenger1 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Instant_messenger1&lt;br /&gt;
|-&lt;br /&gt;
| --instant_messenger2 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Instant_messenger2&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_ip &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_ip&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_isdn &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_isdn&lt;br /&gt;
|-&lt;br /&gt;
| --mail_folder_drafts_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Mail_folder_drafts_name&lt;br /&gt;
|-&lt;br /&gt;
| --mail_folder_sent_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Mail_folder_sent_name&lt;br /&gt;
|-&lt;br /&gt;
| --mail_folder_spam_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Mail_folder_spam_name&lt;br /&gt;
|-&lt;br /&gt;
| --mail_folder_trash_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Mail_folder_trash_name&lt;br /&gt;
|-&lt;br /&gt;
| --mail_folder_archive_full_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Mail_folder_archive_full_name&lt;br /&gt;
|-&lt;br /&gt;
| --manager_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Manager_name&lt;br /&gt;
|-&lt;br /&gt;
| --marital_status &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Marital_status&lt;br /&gt;
|-&lt;br /&gt;
| --cellular_telephone1 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Cellular_telephone1&lt;br /&gt;
|-&lt;br /&gt;
| --cellular_telephone2 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Cellular_telephone2&lt;br /&gt;
|-&lt;br /&gt;
| --info &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Info&lt;br /&gt;
|-&lt;br /&gt;
| --nickname &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Nickname&lt;br /&gt;
|-&lt;br /&gt;
| --number_of_children &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Number_of_children&lt;br /&gt;
|-&lt;br /&gt;
| --note &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Note&lt;br /&gt;
|-&lt;br /&gt;
| --number_of_employee &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Number_of_employee&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_pager &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_pager&lt;br /&gt;
|-&lt;br /&gt;
| --password_expired &amp;amp;lt;booleanvalue&amp;amp;gt;&lt;br /&gt;
|Password_expired&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_assistant &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_assistant&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_business1 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_business1&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_business2 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_business2&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_car &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_car&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_company &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_company&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_home1 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_home1&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_home2 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_home2&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_other &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_other&lt;br /&gt;
|-&lt;br /&gt;
| --postal_code_home &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Postal_code_home&lt;br /&gt;
|-&lt;br /&gt;
| --profession &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Profession&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_radio &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_radio&lt;br /&gt;
|-&lt;br /&gt;
| --room_number &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Room_number&lt;br /&gt;
|-&lt;br /&gt;
| --sales_volume &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Sales_volume&lt;br /&gt;
|-&lt;br /&gt;
| --city_other &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|City_other&lt;br /&gt;
|-&lt;br /&gt;
| --country_other &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Country_other&lt;br /&gt;
|-&lt;br /&gt;
| --middle_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Middle_name&lt;br /&gt;
|-&lt;br /&gt;
| --postal_code_other &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Postal_code_other&lt;br /&gt;
|-&lt;br /&gt;
| --state_other &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|State_other&lt;br /&gt;
|-&lt;br /&gt;
| --street_other &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Street_other&lt;br /&gt;
|-&lt;br /&gt;
| --spouse_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Spouse_name&lt;br /&gt;
|-&lt;br /&gt;
| --state_home &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|State_home&lt;br /&gt;
|-&lt;br /&gt;
| --street_home &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Street_home&lt;br /&gt;
|-&lt;br /&gt;
| --suffix &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Suffix&lt;br /&gt;
|-&lt;br /&gt;
| --tax_id &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Tax_id&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_telex &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_telex&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_ttytdd &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_ttytdd&lt;br /&gt;
|-&lt;br /&gt;
| --url &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Url&lt;br /&gt;
|-&lt;br /&gt;
| --userfield01 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield01&lt;br /&gt;
|-&lt;br /&gt;
| --userfield02 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield02&lt;br /&gt;
|-&lt;br /&gt;
| --userfield03 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield03&lt;br /&gt;
|-&lt;br /&gt;
| --userfield04 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield04&lt;br /&gt;
|-&lt;br /&gt;
| --userfield05 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield05&lt;br /&gt;
|-&lt;br /&gt;
| --userfield06 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield06&lt;br /&gt;
|-&lt;br /&gt;
| --userfield07 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield07&lt;br /&gt;
|-&lt;br /&gt;
| --userfield08 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield08&lt;br /&gt;
|-&lt;br /&gt;
| --userfield09 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield09&lt;br /&gt;
|-&lt;br /&gt;
| --userfield10 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield10&lt;br /&gt;
|-&lt;br /&gt;
| --userfield11 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield11&lt;br /&gt;
|-&lt;br /&gt;
| --userfield12 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield12&lt;br /&gt;
|-&lt;br /&gt;
| --userfield13 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield13&lt;br /&gt;
|-&lt;br /&gt;
| --userfield14 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield14&lt;br /&gt;
|-&lt;br /&gt;
| --userfield15 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield15&lt;br /&gt;
|-&lt;br /&gt;
| --userfield16 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield16&lt;br /&gt;
|-&lt;br /&gt;
| --userfield17 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield17&lt;br /&gt;
|-&lt;br /&gt;
| --userfield18 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield18&lt;br /&gt;
|-&lt;br /&gt;
| --userfield19 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield19&lt;br /&gt;
|-&lt;br /&gt;
| --userfield20 &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Userfield20&lt;br /&gt;
|-&lt;br /&gt;
| --city_business &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|City_business&lt;br /&gt;
|-&lt;br /&gt;
| --country_business &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Country_business&lt;br /&gt;
|-&lt;br /&gt;
| --assistant_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Assistant_name&lt;br /&gt;
|-&lt;br /&gt;
| --telephone_primary &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Telephone_primary&lt;br /&gt;
|-&lt;br /&gt;
| --categories &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Categories&lt;br /&gt;
|-&lt;br /&gt;
| --mail_folder_confirmed_ham_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Mail_folder_confirmed_ham_name&lt;br /&gt;
|-&lt;br /&gt;
| --mail_folder_confirmed_spam_name &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Mail_folder_confirmed_spam_name&lt;br /&gt;
|-&lt;br /&gt;
| --gui_spam_filter_capabilities_enabled &amp;amp;lt;booleanvalue&amp;amp;gt;&lt;br /&gt;
|GUI_Spam_filter_capabilities_enabled&lt;br /&gt;
|-&lt;br /&gt;
| --defaultsenderaddress&amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|DefaultSenderAddress&lt;br /&gt;
|-&lt;br /&gt;
| --title &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Title&lt;br /&gt;
|-&lt;br /&gt;
| --position &amp;amp;lt;string&amp;amp;gt;&lt;br /&gt;
|Position&lt;br /&gt;
|-&lt;br /&gt;
| --access-calendar&lt;br /&gt;
&amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Calendar module (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-contacts &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Contact module access (Default is on)&lt;br /&gt;
|-&lt;br /&gt;
| --access-delegate-tasks &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Delegate tasks access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-edit-public-folder &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Edit public folder access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-ical &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Ical module access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-infostore &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Infostore module access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-read-create-shared-Folders &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Read create shared folder access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-syncml &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Syncml access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-active-sync &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Exchange Active Sync access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-usm &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Universal Sync Module access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-tasks &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Tasks access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-vcard &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Vcard access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-webdav &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Webdav access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-webmail &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Webmail access (Default is on)&lt;br /&gt;
|-&lt;br /&gt;
| --access-publication &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Publication permission (Default is on). Note: access-publication needs access-infostore and is optional for Groupware+ and premium&lt;br /&gt;
|-&lt;br /&gt;
| --access-subscription &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Subscription permission (Default is on)&lt;br /&gt;
|-&lt;br /&gt;
| --access-edit-group &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Edit group access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-edit-resource &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Edit resource access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-edit-password &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Edit password access (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-collect-email-addresses &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Edit collect email addresses (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-multiple-mail-accounts &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Use multiple mail account feature (Default is off)&lt;br /&gt;
|-&lt;br /&gt;
| --access-global-address-book-disabled &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Access to global address book (Default is off). Note: Setting this option to true is only allowed in combination with PIM and Webmail rights. Note: There is a 'restoregaddefaults' script to restore the default permissions of the global address book folder. &lt;br /&gt;
|-&lt;br /&gt;
| --access--voipnow &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Access to VoiceOverIP feature.&lt;br /&gt;
|-&lt;br /&gt;
| --access-public-folder-editable &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
|Access to public folders. Allows or denies to see public folders. &lt;br /&gt;
|-&lt;br /&gt;
| --foldertree &amp;amp;lt;0/1&amp;amp;gt;&lt;br /&gt;
|0 sets the OX standard folder tree and 1 sets the Outlook-like folder tree. &lt;br /&gt;
|-&lt;br /&gt;
| --access-olox20 &amp;amp;lt;on/off&amp;amp;gt;&lt;br /&gt;
| Access to Olox2.0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Access changes for existing users ===&lt;br /&gt;
&lt;br /&gt;
Changes to module access must be done for all users in a given context. On downgrade i. e., to revoke former given access, the data for objects will still be present in the database and on the filestore but is not visible to the customer any more. Please note that only the specified modules are changed. That is why it is required to explicitly turn modules off. A list of packages and the required module configuration is provided in [[the section called “Package access configuration”]].&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;
&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;
&lt;br /&gt;
=== Mandatory parameters ===&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;contextid {adminuser adminpass} (userid or username) and at minimum one attribute to change&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
primaryMail, Email1 and defaultSenderAddress must be present in set of aliases i. e., whenever you want to change one of&lt;br /&gt;
* --email&lt;br /&gt;
* --email1&lt;br /&gt;
* --defaultsenderaddress&lt;br /&gt;
you MUST take care, that the address you want to set is already contained in the aliases of the user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
So when user has aliases: foo, bar and you want to change email to anotheraddr, you&lt;br /&gt;
must add anotheraddr to the aliases, first.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If needed, this can be done with one commandline call, e.g.:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''&amp;lt;code&amp;gt;/changeuser -A oxadmin -P secret -c 666 -i 4 -e&lt;br /&gt;
anotheraddr -a foo,bar,anotheraddr&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;
&lt;br /&gt;
&amp;lt;code&amp;gt;user &amp;amp;lt;userid&amp;amp;gt; in &amp;amp;lt;contextid&amp;amp;gt; changed&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On failure:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;user&lt;br /&gt;
&amp;amp;lt;userid&amp;amp;gt; in &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;
&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; changeuser -c 123 -i 3 -p newpwd&amp;lt;/code&amp;gt;'''&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;user 3 in context 123 changed&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&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>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23116</id>
		<title>AppSuite:Client Onboarding</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23116"/>
		<updated>2017-03-15T09:17:42Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* How can I add my own App? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Client Onboarding&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.1}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Configuration guide for Open-Xchange Client Onboarding =&lt;br /&gt;
&lt;br /&gt;
With Open-Xchange Server v7.8.1 a new module is added allowing users to integrate several different clients and devices with Open-Xchange; such as providing a link to a commercial App Store to install certain apps on mobile devices.&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with several built-in providers; thereof&lt;br /&gt;
&lt;br /&gt;
* CalDAV&lt;br /&gt;
* CardDAV&lt;br /&gt;
* OX Mail App&lt;br /&gt;
* OX Drive App&lt;br /&gt;
* Connector for Microsoft Outlook®&lt;br /&gt;
* Sync App for Android&lt;br /&gt;
* Microsoft ActiveSync&lt;br /&gt;
* eM Client&lt;br /&gt;
* Mail (IMAP/SMTP)&lt;br /&gt;
* Generic Mobile App provider&lt;br /&gt;
&lt;br /&gt;
Those providers allow accessing and/or synchronizing with certain data held by Open-Xchange on a supported device.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
To install the Client Onboarding module, the package open-xchange-client-onboarding needs to be installed.&lt;br /&gt;
&lt;br /&gt;
Moreover the property &amp;lt;code&amp;gt;&amp;quot;com.openexchange.client.onboarding.enabled&amp;quot;&amp;lt;/code&amp;gt;; in installed file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; needs to be set to &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; (default). So getting rid off the entire client on-boarding module simply requires setting the mentioned property to &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; (and executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool).&lt;br /&gt;
&lt;br /&gt;
== Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
The way to specify what and how a certain device is able to get “on-boarded” is mainly determined by so called scenarios. A scenario describes what gets deployed using which providers that contribute their onboarding possibilities and how it is made accessible to the client’s device.&lt;br /&gt;
&lt;br /&gt;
A scenario consists of the following configuration attributes/options&lt;br /&gt;
&lt;br /&gt;
* A unique scenario identifier&lt;br /&gt;
* A flag determining if scenario is enabled or not. If set to 'false' the scenario will not be available, useful for testing/enabling the scenario later on&lt;br /&gt;
* A scenario type, which is one of &amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, or &amp;amp;quot;link&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;plist&amp;amp;quot; for generating a PLIST configuration file for iOS and OSX devices,&lt;br /&gt;
** &amp;amp;quot;manual&amp;amp;quot; for a description for the user for a manual set-up/configuration&lt;br /&gt;
** &amp;amp;quot;link&amp;amp;quot; for a link/URL to either Apple App Store / Google Play Store or to downloadable executable&lt;br /&gt;
* The &amp;amp;quot;link&amp;amp;quot; attribute, which is only considered it type is set to &amp;amp;quot;link&amp;amp;quot;. That attribute consists of the sub-attributes &amp;amp;quot;url&amp;amp;quot; and &amp;amp;quot;type&amp;amp;quot;.&lt;br /&gt;
** &amp;amp;quot;url&amp;amp;quot; provides the actual link/URL to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. For specifying a property that provides the actual link, please use special &amp;amp;quot;property&amp;amp;quot; scheme; e.g. &amp;amp;quot;property://com.openexchange.client.onboarding.app.mylink&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;type&amp;amp;quot; indicates if &amp;amp;quot;url&amp;amp;quot; holds a link for either Apple App Store, Apple Mac Store or Google Play Store. Must only be specified in case &amp;amp;quot;url&amp;amp;quot; points either of those commercial stores. Supported values are &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macstore&amp;amp;quot; and &amp;amp;quot;playstore&amp;amp;quot;&lt;br /&gt;
* The identifiers for the providers, which contribute to the scenario;&amp;lt;br /&amp;gt;&lt;br /&gt;
please check command-line tool &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; to check, which ones are available&lt;br /&gt;
* The identifiers for alternative scenarios. This is typically used to provide alternative manual setup possibility.&lt;br /&gt;
* The comma-separated names of Font Awesome icons that are supposed to be displayed for the scenario&amp;lt;br /&amp;gt;&lt;br /&gt;
(only the ones from v4.4.0 are currently supported)&lt;br /&gt;
* The translatable display name; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
* The translatable description; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
&lt;br /&gt;
== Onboarding providers ==&lt;br /&gt;
&lt;br /&gt;
As described in the previous section, a scenario specifies what providers contribute to it. A provider represents a certain App or (synchronization) protocol that a device can install, download and/or communicate with.&lt;br /&gt;
&lt;br /&gt;
Moreover a provider specifies what Onboarding types are supported (&amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, and/or &amp;amp;quot;link&amp;amp;quot;). Hence, once a provider is chosen to contribute to a certain scenario, the supported on-boarding type needs to match the one of the scenario itself. E.g. a scenario, which indicates to be of type &amp;amp;quot;link&amp;amp;quot;, will always fail if the associated provider signals to support types &amp;amp;quot;plist&amp;amp;quot; and &amp;amp;quot;manual&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To check what providers are available on your system, please execute the &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; command-line tool, which outputs something like:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_1.png]]&lt;br /&gt;
&lt;br /&gt;
Each provider might require one or more capabilities/permissions to be available for the requesting user. If capabilities/permissions are not satisfied, the associated scenario cannot be applied, but will be displayed to the user for upsell opportunities.&lt;br /&gt;
&lt;br /&gt;
=== Generic Onboarding provider for Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic onboarding provider for apps allows specifying custom scenarios of type &amp;amp;quot;link&amp;amp;quot; for arbitrary links/URLs pointing to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. The link can be set directly or via a property.&lt;br /&gt;
&lt;br /&gt;
This provider requires no capability/permission.&lt;br /&gt;
&lt;br /&gt;
An exemplary section in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file might look like (check &amp;amp;quot;Configuring Onboarding scenarios&amp;amp;quot; chapter for more details):&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== CalDAV/CardDAV ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;caldav&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;carddav&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order for a scenario (having CalDAV/CardDAV in its provider listing) to be executable by a user, the &amp;amp;quot;caldav&amp;amp;quot; capability and &amp;amp;quot;carddav&amp;amp;quot; capability respectively are required.&lt;br /&gt;
&lt;br /&gt;
Moreover, the appropriate *DAV end-points are supposed to be configured through property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.caldav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; file and property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.carddav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
=== Drive/Mail Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;driveapp&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;mailapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open-Xchange ships with built-in providers for Drive App and Mail App. The Drive-associated providers do require the &amp;amp;quot;drive&amp;amp;quot; capability and the Mail App requires the &amp;amp;quot;mobile_mail_app&amp;amp;quot; one.&lt;br /&gt;
&lt;br /&gt;
The appropriate links to the apps in the corresponding stores are configured in associated .properties files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-driveapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-mailapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default the links to the official apps are set, but may be changed to ones for branded versions.&lt;br /&gt;
&lt;br /&gt;
=== Drive Windows Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;drivewindowsclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the windows Drive Client. Requires the &amp;amp;quot;drive&amp;amp;quot; capability, but has no configuration options. However, this provider requires the &amp;amp;quot;open-xchange-drive-client-windows&amp;amp;quot; and the orderly configured binaries (e.g. through installing appropriate package according to the brand).&lt;br /&gt;
&lt;br /&gt;
Please check [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_Drive#OX_Drive_for_Windows ''this''] documentation for more details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === eM Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;emclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the eM Client needs the &amp;amp;quot;emclient&amp;amp;quot; capability.&lt;br /&gt;
&lt;br /&gt;
Allows to configure the URL pointing to the executable file through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.emclient.url&amp;lt;/code&amp;gt; in file 'client-onboarding-emclient.properties' file.&lt;br /&gt;
&lt;br /&gt;
=== Sync App ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;syncapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the Sync App for Android. Requires &amp;amp;quot;caldav&amp;amp;quot; and &amp;amp;quot;carddav&amp;amp;quot; capabilities.&lt;br /&gt;
&lt;br /&gt;
The link to Google Play Store is specified via property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.syncapp.store.google.playstore&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-syncapp.properties&amp;lt;/code&amp;gt; file. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mail (IMAP/SMTP) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for deploying the IMAP/STMP account on target device using native/stock mail app. All IMAP/SMTP related settings are settable in file 'client-onboarding-mail.properties'.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft ActiveSync (EAS) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configures the ActiveSync account on target device. Allows specifying the EAS end-point through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.eas.url&amp;lt;/code&amp;gt; property in 'client-onboarding-eas.properties'.&lt;br /&gt;
&lt;br /&gt;
=== OX Updater ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider offering the download for the OX Client Updater ([http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''http:''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''//oxpedia''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''org/wiki/index''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''php''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''?''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''title=AppSuite''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater '':''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''Open-Xchange_Updater'']). The provider is available as soon as the according package is installed and at least one product can be installed/updated via it by the user. A pre-configured scenario 'oxupdaterinstall' is already contained in &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuring Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
Onboarding scenarios are configured through the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Each scenario starts with its own &amp;amp;quot;section&amp;amp;quot; in that YAML file by typing its unique identifier. All further attributes as outlined in chapter &amp;amp;quot;Onboarding scenarios&amp;amp;quot; are nested below that identifier.&lt;br /&gt;
&lt;br /&gt;
=== Easily enabling/disabling scenarios ===&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with a set of pre-defined scenarios that might apply to the most common installations. Each scenario can easily be enabled/disabled through its &amp;amp;quot;enabled&amp;amp;quot; Boolean attribute in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool applies the changes without the need for restart.&lt;br /&gt;
&lt;br /&gt;
=== Translatable strings ===&lt;br /&gt;
&lt;br /&gt;
Those attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; refer to localizable strings and are placed into &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file. Once such attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; are changed/customized and/or added, the appropriate &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file needs to be re-created in order to get translated. For generating that &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file, please execute the /opt/open-xchange/sbin/parsei18nyaml command-line tool. That .pot file needs then be turned to the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Thus changing any of the attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; requires (provided that appropriate .po files are available in &amp;lt;code&amp;gt;/opt/open-xchange/i18n&amp;lt;/code&amp;gt; directory) either a restart or executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool together with stop/start of the &amp;amp;quot;com.openexchange.i18n&amp;amp;quot; bundle.&lt;br /&gt;
&lt;br /&gt;
=== Scenarios' scope and order ===&lt;br /&gt;
&lt;br /&gt;
While the previously mentioned &amp;amp;quot;enabled&amp;amp;quot; attribute offers some kind of generic on/off switch, the properties outlined in this section allow defining the device-scope for a scenario and in which order/precedence they are offered to the client. Scope in terms of&lt;br /&gt;
&lt;br /&gt;
* For what devices (from the set of those specified by providers) are what scenarios in which order available and&lt;br /&gt;
* For which users they are available&lt;br /&gt;
&lt;br /&gt;
As explained above, each scenario specifies one or more type-compatible providers associated with it. In turn, each provider determines to which devices the scenario applies. In order to further control, which device and which users are allowed to access a certain scenario, there are appropriate options available in file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt;. Every option is fully [http://oxpedia.org/wiki/index.php?title=ConfigCascade ''config-cascade''] aware and therefore can be controlled on a global, per context set, per context and per user basis.&lt;br /&gt;
&lt;br /&gt;
Thus, to make a scenario available for certain devices (as dictated by scenario’s providers) and for users as well, the scenario identifier needs to be added to the appropriate properties ending with &amp;amp;quot;.scenarios&amp;amp;quot; (for devices) and added to the &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property (for user) as well.&lt;br /&gt;
&lt;br /&gt;
The following properties accept a comma-separated list of scenario identifiers. The order of listed scenarios reflects the order in which they are offered to the client&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.mac.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.ipad.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.windows.desktop.scenarios&lt;br /&gt;
&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios=mailappinstall, driveappinstall, eassync, mailsync, davsync&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This exemplary setting specifies that Mail App, Drive App, EAS, Native Mail (IMAP/SMTP) and CalDAV/CardDAV are available in given order for iPhone devices.&lt;br /&gt;
&lt;br /&gt;
Once a scenario is made accessible through configuration it is visible to users trying to perform a client onboarding using one of associated devices. However, whether a user is effectively allowed to execute that scenario is determined by the required capabilities of the denoted providers; if not allowed it gets displayed as an upsell opportunity.&lt;br /&gt;
&lt;br /&gt;
=== Configuring actions ===&lt;br /&gt;
&lt;br /&gt;
The type for a scenario determines what actions are associated with it to &amp;amp;quot;''transport''&amp;amp;quot; the onboarding information to the client. The types &amp;amp;quot;manual&amp;amp;quot; and &amp;amp;quot;link&amp;amp;quot; only show static information like displaying a link. In contrast the type &amp;amp;quot;plist&amp;amp;quot; allows several actions to transport the configuration profile onto the client. Thereof&lt;br /&gt;
&lt;br /&gt;
* E-Mail&lt;br /&gt;
* SMS&lt;br /&gt;
&lt;br /&gt;
In order to utilize the &amp;amp;quot;E-Mail&amp;amp;quot; action, a special transport must be configured for system-composed E-Mails [http://oxpedia.org/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode#Share_Notifications ''as it is for using the sharing functionality'']. This transport is configured in noreply.properties. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
&lt;br /&gt;
Using the SMS action requires an according implementation being available. OX App Suite comes with an optional sipgate implementation. Please check [http://oxpedia.org/wiki/index.php?title=AppSuite:SMS_Sipgate ''this documentation''] how to setup App Suite accordingly.&lt;br /&gt;
&lt;br /&gt;
==== Implementing your own SMS gateway ====&lt;br /&gt;
&lt;br /&gt;
To use an SMS gateway other than sipgate, you can provide your own implementation. Therefore the Java interface &amp;lt;code&amp;gt;com.openexchange.sms.SMSServiceSPI&amp;lt;/code&amp;gt; needs to be implemented and published as an OSGi service. For parsing phone numbers provided by users &amp;lt;code&amp;gt;com.openexchange.sms.PhoneNumberParserService&amp;lt;/code&amp;gt; can be used. That one is also available as an OSGi service and can be tracked accordingly. You can have a look at bundle &amp;lt;code&amp;gt;com.openexchange.sms.sipgate&amp;lt;/code&amp;gt; as implementation reference.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' You must not install the &amp;lt;code&amp;gt;open-xchange-sms-sipgate&amp;lt;/code&amp;gt; package if you provide your own implementation.&lt;br /&gt;
&lt;br /&gt;
==== PLIST-signing ====&lt;br /&gt;
Scenarios of type &amp;amp;quot;plist&amp;amp;quot; require having PLIST-signing enabled. Otherwise the device will show a warning when importing a received PLIST configuration profile. Please follow the instructions as outlined in [http://oxpedia.org/wiki/index.php?title=AppSuite:PList_signing ''this article''] how to enable and configure signing for PLIST files.&lt;br /&gt;
&lt;br /&gt;
== Adding custom scenarios ==&lt;br /&gt;
&lt;br /&gt;
The first thing to do, is to add an appropriate scenario configuration to the 'client-onboarding-scenarios.yml' file; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;link:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;image: http://my.fine.host/image001.png&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next step is to make that scenario accessible through adapting 'client-onboarding.properties' file. Hence, the scenario identifier needs to be added to the devices, to which it applies (Android devices in this case):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios=..., mygoogleapp&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Furthermore, that scenario needs to be made accessible to users as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
At last, a .pot file is supposed to be generated from the translatable strings using /opt/open-xchange/sbin/parsei18nyaml command-line tool to yield the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Provided that target users do hold appropriate capabilities, they are allowed to execute that scenario. In the example above the &amp;amp;quot;app&amp;amp;quot; provider is specified, which does no require any capabilities. Hence, that scenario is available.&lt;br /&gt;
&lt;br /&gt;
== HowTos ==&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly setup a default/test configuration ? ===&lt;br /&gt;
&lt;br /&gt;
# Install open-xchange-client-onboarding package&lt;br /&gt;
# Edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; and set &amp;lt;code&amp;gt;com.openexchange.client.onboarding.enabled&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Edit &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt; to enable autoconfig sending via email. PS: Have a fully working smtp login available like “noreply@yourdomain.tld”&lt;br /&gt;
# Edit client-onboarding-scenarios.yml and set “enable” for : “driveappinstall” , “davsync” “davmanual” “mailsync” “mailmanual” to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Now set the correct caldav/carddav server FQDNs in the corresponding files for your setup&lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; &lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
# Restart OX process&lt;br /&gt;
# Login to AppSuite. Click on Settings - Connect your device&lt;br /&gt;
# Verify that you have following onboarding options available: &lt;br /&gt;
#* windows -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; drive app &lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; details for dav setup&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; drive app&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; drive app&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly disable a certain scenario ===&lt;br /&gt;
&lt;br /&gt;
Simply enter the 'client-onboarding-scenarios.yml' file and go to the section specifying the target scenario. Switch the 'enabled' flag to &amp;amp;quot;false&amp;amp;quot; and execute /opt/open-xchange/sbin/reloadconfiguration command-line tool.&lt;br /&gt;
&lt;br /&gt;
E.g. to disable the OX Drive App:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_3.png]]&lt;br /&gt;
&lt;br /&gt;
=== How can I disable the outdated ui parts like 'Downloads'? ===&lt;br /&gt;
&lt;br /&gt;
The wizard replaces and extends the functionality of the old Download Section in settings and the corresponding widgets. We recommend to disable these outdated parts:&lt;br /&gt;
# widget: get ox drive&lt;br /&gt;
# widget: update&lt;br /&gt;
# settings entry: downloads&lt;br /&gt;
&lt;br /&gt;
'''Remove settings section 'Downloads' '''&lt;br /&gt;
&lt;br /&gt;
Edit ''/opt/open-xchange/etc/settings/appsuite.properties'' and add or change the value to true:&lt;br /&gt;
* ''io.ox/core//settings/downloadsDisabled''&lt;br /&gt;
&lt;br /&gt;
'''Remove widgets'''&lt;br /&gt;
&lt;br /&gt;
To remove the both related portal widget/tiles please refer to the&lt;br /&gt;
[[AppSuite:Configuring_portal_plugins#Disabling_a_tile_completely | portal plugins wiki page ]]&lt;br /&gt;
&lt;br /&gt;
* ''io.ox/portal/widget/oxdriveclients''&lt;br /&gt;
* ''io.ox/portal/widget/updater''&lt;br /&gt;
&lt;br /&gt;
=== How can I add my own App? ===&lt;br /&gt;
&lt;br /&gt;
Provided that the App is accessible by a link (pointing to a commercial App Store or to a downloadable executable/installer), the generic &amp;amp;quot;app&amp;amp;quot; is the suitable provider to choose.&lt;br /&gt;
&lt;br /&gt;
Hence, an appropriate section is supposed to be added to the 'client-onboarding-scenarios.yml' file having a unique name and &amp;amp;quot;provider&amp;amp;quot; attribute set to &amp;amp;quot;[app]&amp;amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;link:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;image: http://my.fine.host/image001.png&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The attribute &amp;amp;quot;type&amp;amp;quot; needs to be set to &amp;amp;quot;link&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The attribute &amp;amp;quot;link&amp;amp;quot; should be configured with:&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;url&amp;amp;quot; sub-attribute containing the actual link pointing to the URL location&lt;br /&gt;
* &amp;amp;quot;type&amp;amp;quot; sub-attribute specifying of what type that link is: either &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macappstore&amp;amp;quot;, &amp;amp;quot;playstore&amp;amp;quot; or &amp;amp;quot;common&amp;amp;quot;. The type &amp;amp;quot;common&amp;amp;quot; is supposed to be used for links that do not point to a commercial App Store, but to a downloadable executable/installer file.&lt;br /&gt;
* &amp;amp;quot;image&amp;amp;quot; sub-attribute containing the link pointing to the App's image. Supported with v7.8.4&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;quot;icon&amp;amp;quot; attribute is supposed to contain a comma-separated list of Font Awesome icons (only the ones from v4.4.0 are currently supported) that represent the App; e.g.&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;fa-cloud&amp;amp;quot; for Drive/file-related nature&lt;br /&gt;
* &amp;amp;quot;fa-calendar, fa-users&amp;amp;quot; for Calendar and Address Book synchronization&lt;br /&gt;
* &amp;amp;quot;fa-envelope-o&amp;amp;quot; for Mail nature&lt;br /&gt;
&lt;br /&gt;
Next, the translatable display name and description should be set through setting the attributes &amp;amp;quot;displayName_t10e&amp;amp;quot; and &amp;amp;quot;description_t10e&amp;amp;quot;. As described previously, executing the /opt/open-xchange/sbin/parsei18nyaml command-line tool yields an appropriate .pot file, which can then be used for generating the individual .po file for the different translations.&lt;br /&gt;
&lt;br /&gt;
Finally, the 'client-onboarding.properties' file needs to be modified to specify the &amp;amp;quot;scope&amp;amp;quot; for that new scenario. Add the scenario’s unique name to the appropriate device properties and add it to &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property as well.&lt;br /&gt;
&lt;br /&gt;
After executing /opt/open-xchange/sbin/reloadconfiguration command-line tool the new client onboarding scenario is available for the selected users/devices.&lt;br /&gt;
&lt;br /&gt;
=== How can I upsell my own app? ===&lt;br /&gt;
&lt;br /&gt;
Having the same prerequisites/steps as for &amp;amp;quot;How can I add my own App?&amp;amp;quot; the scenario description in the 'client-onboarding-scenarios.yml' file simply needs to be extended by the desired capabilities, which are supposed to be used for managing the upsell.&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;link:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;'''capabilities: &amp;amp;quot;mygoogleapp_capability&amp;amp;quot;'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The special &amp;amp;quot;capabilities&amp;amp;quot; attribute is only supported for scenarios of type &amp;amp;quot;link&amp;amp;quot; with the special &amp;amp;quot;app&amp;amp;quot; provider.&lt;br /&gt;
&lt;br /&gt;
With such a &amp;amp;quot;capabilities&amp;amp;quot; attribute only users, which have the &amp;amp;quot;mygoogleapp_capability&amp;amp;quot; capability are allowed to get the link. For those who don’t, the upsell opportunity will be displayed; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[[File:onboarding_4.png]]&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23115</id>
		<title>AppSuite:Client Onboarding</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23115"/>
		<updated>2017-03-15T09:16:47Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* How can I upsell my own app? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Client Onboarding&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.1}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Configuration guide for Open-Xchange Client Onboarding =&lt;br /&gt;
&lt;br /&gt;
With Open-Xchange Server v7.8.1 a new module is added allowing users to integrate several different clients and devices with Open-Xchange; such as providing a link to a commercial App Store to install certain apps on mobile devices.&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with several built-in providers; thereof&lt;br /&gt;
&lt;br /&gt;
* CalDAV&lt;br /&gt;
* CardDAV&lt;br /&gt;
* OX Mail App&lt;br /&gt;
* OX Drive App&lt;br /&gt;
* Connector for Microsoft Outlook®&lt;br /&gt;
* Sync App for Android&lt;br /&gt;
* Microsoft ActiveSync&lt;br /&gt;
* eM Client&lt;br /&gt;
* Mail (IMAP/SMTP)&lt;br /&gt;
* Generic Mobile App provider&lt;br /&gt;
&lt;br /&gt;
Those providers allow accessing and/or synchronizing with certain data held by Open-Xchange on a supported device.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
To install the Client Onboarding module, the package open-xchange-client-onboarding needs to be installed.&lt;br /&gt;
&lt;br /&gt;
Moreover the property &amp;lt;code&amp;gt;&amp;quot;com.openexchange.client.onboarding.enabled&amp;quot;&amp;lt;/code&amp;gt;; in installed file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; needs to be set to &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; (default). So getting rid off the entire client on-boarding module simply requires setting the mentioned property to &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; (and executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool).&lt;br /&gt;
&lt;br /&gt;
== Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
The way to specify what and how a certain device is able to get “on-boarded” is mainly determined by so called scenarios. A scenario describes what gets deployed using which providers that contribute their onboarding possibilities and how it is made accessible to the client’s device.&lt;br /&gt;
&lt;br /&gt;
A scenario consists of the following configuration attributes/options&lt;br /&gt;
&lt;br /&gt;
* A unique scenario identifier&lt;br /&gt;
* A flag determining if scenario is enabled or not. If set to 'false' the scenario will not be available, useful for testing/enabling the scenario later on&lt;br /&gt;
* A scenario type, which is one of &amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, or &amp;amp;quot;link&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;plist&amp;amp;quot; for generating a PLIST configuration file for iOS and OSX devices,&lt;br /&gt;
** &amp;amp;quot;manual&amp;amp;quot; for a description for the user for a manual set-up/configuration&lt;br /&gt;
** &amp;amp;quot;link&amp;amp;quot; for a link/URL to either Apple App Store / Google Play Store or to downloadable executable&lt;br /&gt;
* The &amp;amp;quot;link&amp;amp;quot; attribute, which is only considered it type is set to &amp;amp;quot;link&amp;amp;quot;. That attribute consists of the sub-attributes &amp;amp;quot;url&amp;amp;quot; and &amp;amp;quot;type&amp;amp;quot;.&lt;br /&gt;
** &amp;amp;quot;url&amp;amp;quot; provides the actual link/URL to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. For specifying a property that provides the actual link, please use special &amp;amp;quot;property&amp;amp;quot; scheme; e.g. &amp;amp;quot;property://com.openexchange.client.onboarding.app.mylink&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;type&amp;amp;quot; indicates if &amp;amp;quot;url&amp;amp;quot; holds a link for either Apple App Store, Apple Mac Store or Google Play Store. Must only be specified in case &amp;amp;quot;url&amp;amp;quot; points either of those commercial stores. Supported values are &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macstore&amp;amp;quot; and &amp;amp;quot;playstore&amp;amp;quot;&lt;br /&gt;
* The identifiers for the providers, which contribute to the scenario;&amp;lt;br /&amp;gt;&lt;br /&gt;
please check command-line tool &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; to check, which ones are available&lt;br /&gt;
* The identifiers for alternative scenarios. This is typically used to provide alternative manual setup possibility.&lt;br /&gt;
* The comma-separated names of Font Awesome icons that are supposed to be displayed for the scenario&amp;lt;br /&amp;gt;&lt;br /&gt;
(only the ones from v4.4.0 are currently supported)&lt;br /&gt;
* The translatable display name; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
* The translatable description; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
&lt;br /&gt;
== Onboarding providers ==&lt;br /&gt;
&lt;br /&gt;
As described in the previous section, a scenario specifies what providers contribute to it. A provider represents a certain App or (synchronization) protocol that a device can install, download and/or communicate with.&lt;br /&gt;
&lt;br /&gt;
Moreover a provider specifies what Onboarding types are supported (&amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, and/or &amp;amp;quot;link&amp;amp;quot;). Hence, once a provider is chosen to contribute to a certain scenario, the supported on-boarding type needs to match the one of the scenario itself. E.g. a scenario, which indicates to be of type &amp;amp;quot;link&amp;amp;quot;, will always fail if the associated provider signals to support types &amp;amp;quot;plist&amp;amp;quot; and &amp;amp;quot;manual&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To check what providers are available on your system, please execute the &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; command-line tool, which outputs something like:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_1.png]]&lt;br /&gt;
&lt;br /&gt;
Each provider might require one or more capabilities/permissions to be available for the requesting user. If capabilities/permissions are not satisfied, the associated scenario cannot be applied, but will be displayed to the user for upsell opportunities.&lt;br /&gt;
&lt;br /&gt;
=== Generic Onboarding provider for Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic onboarding provider for apps allows specifying custom scenarios of type &amp;amp;quot;link&amp;amp;quot; for arbitrary links/URLs pointing to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. The link can be set directly or via a property.&lt;br /&gt;
&lt;br /&gt;
This provider requires no capability/permission.&lt;br /&gt;
&lt;br /&gt;
An exemplary section in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file might look like (check &amp;amp;quot;Configuring Onboarding scenarios&amp;amp;quot; chapter for more details):&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== CalDAV/CardDAV ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;caldav&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;carddav&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order for a scenario (having CalDAV/CardDAV in its provider listing) to be executable by a user, the &amp;amp;quot;caldav&amp;amp;quot; capability and &amp;amp;quot;carddav&amp;amp;quot; capability respectively are required.&lt;br /&gt;
&lt;br /&gt;
Moreover, the appropriate *DAV end-points are supposed to be configured through property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.caldav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; file and property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.carddav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
=== Drive/Mail Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;driveapp&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;mailapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open-Xchange ships with built-in providers for Drive App and Mail App. The Drive-associated providers do require the &amp;amp;quot;drive&amp;amp;quot; capability and the Mail App requires the &amp;amp;quot;mobile_mail_app&amp;amp;quot; one.&lt;br /&gt;
&lt;br /&gt;
The appropriate links to the apps in the corresponding stores are configured in associated .properties files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-driveapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-mailapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default the links to the official apps are set, but may be changed to ones for branded versions.&lt;br /&gt;
&lt;br /&gt;
=== Drive Windows Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;drivewindowsclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the windows Drive Client. Requires the &amp;amp;quot;drive&amp;amp;quot; capability, but has no configuration options. However, this provider requires the &amp;amp;quot;open-xchange-drive-client-windows&amp;amp;quot; and the orderly configured binaries (e.g. through installing appropriate package according to the brand).&lt;br /&gt;
&lt;br /&gt;
Please check [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_Drive#OX_Drive_for_Windows ''this''] documentation for more details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === eM Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;emclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the eM Client needs the &amp;amp;quot;emclient&amp;amp;quot; capability.&lt;br /&gt;
&lt;br /&gt;
Allows to configure the URL pointing to the executable file through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.emclient.url&amp;lt;/code&amp;gt; in file 'client-onboarding-emclient.properties' file.&lt;br /&gt;
&lt;br /&gt;
=== Sync App ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;syncapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the Sync App for Android. Requires &amp;amp;quot;caldav&amp;amp;quot; and &amp;amp;quot;carddav&amp;amp;quot; capabilities.&lt;br /&gt;
&lt;br /&gt;
The link to Google Play Store is specified via property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.syncapp.store.google.playstore&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-syncapp.properties&amp;lt;/code&amp;gt; file. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mail (IMAP/SMTP) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for deploying the IMAP/STMP account on target device using native/stock mail app. All IMAP/SMTP related settings are settable in file 'client-onboarding-mail.properties'.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft ActiveSync (EAS) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configures the ActiveSync account on target device. Allows specifying the EAS end-point through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.eas.url&amp;lt;/code&amp;gt; property in 'client-onboarding-eas.properties'.&lt;br /&gt;
&lt;br /&gt;
=== OX Updater ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider offering the download for the OX Client Updater ([http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''http:''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''//oxpedia''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''org/wiki/index''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''php''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''?''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''title=AppSuite''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater '':''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''Open-Xchange_Updater'']). The provider is available as soon as the according package is installed and at least one product can be installed/updated via it by the user. A pre-configured scenario 'oxupdaterinstall' is already contained in &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuring Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
Onboarding scenarios are configured through the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Each scenario starts with its own &amp;amp;quot;section&amp;amp;quot; in that YAML file by typing its unique identifier. All further attributes as outlined in chapter &amp;amp;quot;Onboarding scenarios&amp;amp;quot; are nested below that identifier.&lt;br /&gt;
&lt;br /&gt;
=== Easily enabling/disabling scenarios ===&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with a set of pre-defined scenarios that might apply to the most common installations. Each scenario can easily be enabled/disabled through its &amp;amp;quot;enabled&amp;amp;quot; Boolean attribute in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool applies the changes without the need for restart.&lt;br /&gt;
&lt;br /&gt;
=== Translatable strings ===&lt;br /&gt;
&lt;br /&gt;
Those attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; refer to localizable strings and are placed into &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file. Once such attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; are changed/customized and/or added, the appropriate &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file needs to be re-created in order to get translated. For generating that &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file, please execute the /opt/open-xchange/sbin/parsei18nyaml command-line tool. That .pot file needs then be turned to the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Thus changing any of the attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; requires (provided that appropriate .po files are available in &amp;lt;code&amp;gt;/opt/open-xchange/i18n&amp;lt;/code&amp;gt; directory) either a restart or executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool together with stop/start of the &amp;amp;quot;com.openexchange.i18n&amp;amp;quot; bundle.&lt;br /&gt;
&lt;br /&gt;
=== Scenarios' scope and order ===&lt;br /&gt;
&lt;br /&gt;
While the previously mentioned &amp;amp;quot;enabled&amp;amp;quot; attribute offers some kind of generic on/off switch, the properties outlined in this section allow defining the device-scope for a scenario and in which order/precedence they are offered to the client. Scope in terms of&lt;br /&gt;
&lt;br /&gt;
* For what devices (from the set of those specified by providers) are what scenarios in which order available and&lt;br /&gt;
* For which users they are available&lt;br /&gt;
&lt;br /&gt;
As explained above, each scenario specifies one or more type-compatible providers associated with it. In turn, each provider determines to which devices the scenario applies. In order to further control, which device and which users are allowed to access a certain scenario, there are appropriate options available in file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt;. Every option is fully [http://oxpedia.org/wiki/index.php?title=ConfigCascade ''config-cascade''] aware and therefore can be controlled on a global, per context set, per context and per user basis.&lt;br /&gt;
&lt;br /&gt;
Thus, to make a scenario available for certain devices (as dictated by scenario’s providers) and for users as well, the scenario identifier needs to be added to the appropriate properties ending with &amp;amp;quot;.scenarios&amp;amp;quot; (for devices) and added to the &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property (for user) as well.&lt;br /&gt;
&lt;br /&gt;
The following properties accept a comma-separated list of scenario identifiers. The order of listed scenarios reflects the order in which they are offered to the client&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.mac.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.ipad.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.windows.desktop.scenarios&lt;br /&gt;
&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios=mailappinstall, driveappinstall, eassync, mailsync, davsync&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This exemplary setting specifies that Mail App, Drive App, EAS, Native Mail (IMAP/SMTP) and CalDAV/CardDAV are available in given order for iPhone devices.&lt;br /&gt;
&lt;br /&gt;
Once a scenario is made accessible through configuration it is visible to users trying to perform a client onboarding using one of associated devices. However, whether a user is effectively allowed to execute that scenario is determined by the required capabilities of the denoted providers; if not allowed it gets displayed as an upsell opportunity.&lt;br /&gt;
&lt;br /&gt;
=== Configuring actions ===&lt;br /&gt;
&lt;br /&gt;
The type for a scenario determines what actions are associated with it to &amp;amp;quot;''transport''&amp;amp;quot; the onboarding information to the client. The types &amp;amp;quot;manual&amp;amp;quot; and &amp;amp;quot;link&amp;amp;quot; only show static information like displaying a link. In contrast the type &amp;amp;quot;plist&amp;amp;quot; allows several actions to transport the configuration profile onto the client. Thereof&lt;br /&gt;
&lt;br /&gt;
* E-Mail&lt;br /&gt;
* SMS&lt;br /&gt;
&lt;br /&gt;
In order to utilize the &amp;amp;quot;E-Mail&amp;amp;quot; action, a special transport must be configured for system-composed E-Mails [http://oxpedia.org/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode#Share_Notifications ''as it is for using the sharing functionality'']. This transport is configured in noreply.properties. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
&lt;br /&gt;
Using the SMS action requires an according implementation being available. OX App Suite comes with an optional sipgate implementation. Please check [http://oxpedia.org/wiki/index.php?title=AppSuite:SMS_Sipgate ''this documentation''] how to setup App Suite accordingly.&lt;br /&gt;
&lt;br /&gt;
==== Implementing your own SMS gateway ====&lt;br /&gt;
&lt;br /&gt;
To use an SMS gateway other than sipgate, you can provide your own implementation. Therefore the Java interface &amp;lt;code&amp;gt;com.openexchange.sms.SMSServiceSPI&amp;lt;/code&amp;gt; needs to be implemented and published as an OSGi service. For parsing phone numbers provided by users &amp;lt;code&amp;gt;com.openexchange.sms.PhoneNumberParserService&amp;lt;/code&amp;gt; can be used. That one is also available as an OSGi service and can be tracked accordingly. You can have a look at bundle &amp;lt;code&amp;gt;com.openexchange.sms.sipgate&amp;lt;/code&amp;gt; as implementation reference.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' You must not install the &amp;lt;code&amp;gt;open-xchange-sms-sipgate&amp;lt;/code&amp;gt; package if you provide your own implementation.&lt;br /&gt;
&lt;br /&gt;
==== PLIST-signing ====&lt;br /&gt;
Scenarios of type &amp;amp;quot;plist&amp;amp;quot; require having PLIST-signing enabled. Otherwise the device will show a warning when importing a received PLIST configuration profile. Please follow the instructions as outlined in [http://oxpedia.org/wiki/index.php?title=AppSuite:PList_signing ''this article''] how to enable and configure signing for PLIST files.&lt;br /&gt;
&lt;br /&gt;
== Adding custom scenarios ==&lt;br /&gt;
&lt;br /&gt;
The first thing to do, is to add an appropriate scenario configuration to the 'client-onboarding-scenarios.yml' file; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;link:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;image: http://my.fine.host/image001.png&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next step is to make that scenario accessible through adapting 'client-onboarding.properties' file. Hence, the scenario identifier needs to be added to the devices, to which it applies (Android devices in this case):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios=..., mygoogleapp&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Furthermore, that scenario needs to be made accessible to users as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
At last, a .pot file is supposed to be generated from the translatable strings using /opt/open-xchange/sbin/parsei18nyaml command-line tool to yield the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Provided that target users do hold appropriate capabilities, they are allowed to execute that scenario. In the example above the &amp;amp;quot;app&amp;amp;quot; provider is specified, which does no require any capabilities. Hence, that scenario is available.&lt;br /&gt;
&lt;br /&gt;
== HowTos ==&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly setup a default/test configuration ? ===&lt;br /&gt;
&lt;br /&gt;
# Install open-xchange-client-onboarding package&lt;br /&gt;
# Edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; and set &amp;lt;code&amp;gt;com.openexchange.client.onboarding.enabled&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Edit &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt; to enable autoconfig sending via email. PS: Have a fully working smtp login available like “noreply@yourdomain.tld”&lt;br /&gt;
# Edit client-onboarding-scenarios.yml and set “enable” for : “driveappinstall” , “davsync” “davmanual” “mailsync” “mailmanual” to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Now set the correct caldav/carddav server FQDNs in the corresponding files for your setup&lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; &lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
# Restart OX process&lt;br /&gt;
# Login to AppSuite. Click on Settings - Connect your device&lt;br /&gt;
# Verify that you have following onboarding options available: &lt;br /&gt;
#* windows -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; drive app &lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; details for dav setup&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; drive app&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; drive app&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly disable a certain scenario ===&lt;br /&gt;
&lt;br /&gt;
Simply enter the 'client-onboarding-scenarios.yml' file and go to the section specifying the target scenario. Switch the 'enabled' flag to &amp;amp;quot;false&amp;amp;quot; and execute /opt/open-xchange/sbin/reloadconfiguration command-line tool.&lt;br /&gt;
&lt;br /&gt;
E.g. to disable the OX Drive App:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_3.png]]&lt;br /&gt;
&lt;br /&gt;
=== How can I disable the outdated ui parts like 'Downloads'? ===&lt;br /&gt;
&lt;br /&gt;
The wizard replaces and extends the functionality of the old Download Section in settings and the corresponding widgets. We recommend to disable these outdated parts:&lt;br /&gt;
# widget: get ox drive&lt;br /&gt;
# widget: update&lt;br /&gt;
# settings entry: downloads&lt;br /&gt;
&lt;br /&gt;
'''Remove settings section 'Downloads' '''&lt;br /&gt;
&lt;br /&gt;
Edit ''/opt/open-xchange/etc/settings/appsuite.properties'' and add or change the value to true:&lt;br /&gt;
* ''io.ox/core//settings/downloadsDisabled''&lt;br /&gt;
&lt;br /&gt;
'''Remove widgets'''&lt;br /&gt;
&lt;br /&gt;
To remove the both related portal widget/tiles please refer to the&lt;br /&gt;
[[AppSuite:Configuring_portal_plugins#Disabling_a_tile_completely | portal plugins wiki page ]]&lt;br /&gt;
&lt;br /&gt;
* ''io.ox/portal/widget/oxdriveclients''&lt;br /&gt;
* ''io.ox/portal/widget/updater''&lt;br /&gt;
&lt;br /&gt;
=== How can I add my own App? ===&lt;br /&gt;
&lt;br /&gt;
Provided that the App is accessible by a link (pointing to a commercial App Store or to a downloadable executable/installer), the generic &amp;amp;quot;app&amp;amp;quot; is the suitable provider to choose.&lt;br /&gt;
&lt;br /&gt;
Hence, an appropriate section is supposed to be added to the 'client-onboarding-scenarios.yml' file having a unique name and &amp;amp;quot;provider&amp;amp;quot; attribute set to &amp;amp;quot;[app]&amp;amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;link:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;image: http://my.fine.host/image001.png&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The attribute &amp;amp;quot;type&amp;amp;quot; needs to be set to &amp;amp;quot;link&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The attribute &amp;amp;quot;link&amp;amp;quot; should be configured with:&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;url&amp;amp;quot; sub-attribute containing the actual link pointing to the URL location&lt;br /&gt;
* &amp;amp;quot;type&amp;amp;quot; sub-attribute specifying of what type that link is: either &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macappstore&amp;amp;quot;, &amp;amp;quot;playstore&amp;amp;quot; or &amp;amp;quot;common&amp;amp;quot;. The type &amp;amp;quot;common&amp;amp;quot; is supposed to be used for links that do not point to a commercial App Store, but to a downloadable executable/installer file.&lt;br /&gt;
* &amp;amp;quot;image&amp;amp;quot; sub-attribute containing the link pointing to the App's image&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;quot;icon&amp;amp;quot; attribute is supposed to contain a comma-separated list of Font Awesome icons (only the ones from v4.4.0 are currently supported) that represent the App; e.g.&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;fa-cloud&amp;amp;quot; for Drive/file-related nature&lt;br /&gt;
* &amp;amp;quot;fa-calendar, fa-users&amp;amp;quot; for Calendar and Address Book synchronization&lt;br /&gt;
* &amp;amp;quot;fa-envelope-o&amp;amp;quot; for Mail nature&lt;br /&gt;
&lt;br /&gt;
Next, the translatable display name and description should be set through setting the attributes &amp;amp;quot;displayName_t10e&amp;amp;quot; and &amp;amp;quot;description_t10e&amp;amp;quot;. As described previously, executing the /opt/open-xchange/sbin/parsei18nyaml command-line tool yields an appropriate .pot file, which can then be used for generating the individual .po file for the different translations.&lt;br /&gt;
&lt;br /&gt;
Finally, the 'client-onboarding.properties' file needs to be modified to specify the &amp;amp;quot;scope&amp;amp;quot; for that new scenario. Add the scenario’s unique name to the appropriate device properties and add it to &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property as well.&lt;br /&gt;
&lt;br /&gt;
After executing /opt/open-xchange/sbin/reloadconfiguration command-line tool the new client onboarding scenario is available for the selected users/devices.&lt;br /&gt;
&lt;br /&gt;
=== How can I upsell my own app? ===&lt;br /&gt;
&lt;br /&gt;
Having the same prerequisites/steps as for &amp;amp;quot;How can I add my own App?&amp;amp;quot; the scenario description in the 'client-onboarding-scenarios.yml' file simply needs to be extended by the desired capabilities, which are supposed to be used for managing the upsell.&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;link:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;'''capabilities: &amp;amp;quot;mygoogleapp_capability&amp;amp;quot;'''&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The special &amp;amp;quot;capabilities&amp;amp;quot; attribute is only supported for scenarios of type &amp;amp;quot;link&amp;amp;quot; with the special &amp;amp;quot;app&amp;amp;quot; provider.&lt;br /&gt;
&lt;br /&gt;
With such a &amp;amp;quot;capabilities&amp;amp;quot; attribute only users, which have the &amp;amp;quot;mygoogleapp_capability&amp;amp;quot; capability are allowed to get the link. For those who don’t, the upsell opportunity will be displayed; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[[File:onboarding_4.png]]&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23114</id>
		<title>AppSuite:Client Onboarding</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23114"/>
		<updated>2017-03-15T09:15:11Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* How can I add my own App? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Client Onboarding&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.1}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Configuration guide for Open-Xchange Client Onboarding =&lt;br /&gt;
&lt;br /&gt;
With Open-Xchange Server v7.8.1 a new module is added allowing users to integrate several different clients and devices with Open-Xchange; such as providing a link to a commercial App Store to install certain apps on mobile devices.&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with several built-in providers; thereof&lt;br /&gt;
&lt;br /&gt;
* CalDAV&lt;br /&gt;
* CardDAV&lt;br /&gt;
* OX Mail App&lt;br /&gt;
* OX Drive App&lt;br /&gt;
* Connector for Microsoft Outlook®&lt;br /&gt;
* Sync App for Android&lt;br /&gt;
* Microsoft ActiveSync&lt;br /&gt;
* eM Client&lt;br /&gt;
* Mail (IMAP/SMTP)&lt;br /&gt;
* Generic Mobile App provider&lt;br /&gt;
&lt;br /&gt;
Those providers allow accessing and/or synchronizing with certain data held by Open-Xchange on a supported device.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
To install the Client Onboarding module, the package open-xchange-client-onboarding needs to be installed.&lt;br /&gt;
&lt;br /&gt;
Moreover the property &amp;lt;code&amp;gt;&amp;quot;com.openexchange.client.onboarding.enabled&amp;quot;&amp;lt;/code&amp;gt;; in installed file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; needs to be set to &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; (default). So getting rid off the entire client on-boarding module simply requires setting the mentioned property to &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; (and executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool).&lt;br /&gt;
&lt;br /&gt;
== Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
The way to specify what and how a certain device is able to get “on-boarded” is mainly determined by so called scenarios. A scenario describes what gets deployed using which providers that contribute their onboarding possibilities and how it is made accessible to the client’s device.&lt;br /&gt;
&lt;br /&gt;
A scenario consists of the following configuration attributes/options&lt;br /&gt;
&lt;br /&gt;
* A unique scenario identifier&lt;br /&gt;
* A flag determining if scenario is enabled or not. If set to 'false' the scenario will not be available, useful for testing/enabling the scenario later on&lt;br /&gt;
* A scenario type, which is one of &amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, or &amp;amp;quot;link&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;plist&amp;amp;quot; for generating a PLIST configuration file for iOS and OSX devices,&lt;br /&gt;
** &amp;amp;quot;manual&amp;amp;quot; for a description for the user for a manual set-up/configuration&lt;br /&gt;
** &amp;amp;quot;link&amp;amp;quot; for a link/URL to either Apple App Store / Google Play Store or to downloadable executable&lt;br /&gt;
* The &amp;amp;quot;link&amp;amp;quot; attribute, which is only considered it type is set to &amp;amp;quot;link&amp;amp;quot;. That attribute consists of the sub-attributes &amp;amp;quot;url&amp;amp;quot; and &amp;amp;quot;type&amp;amp;quot;.&lt;br /&gt;
** &amp;amp;quot;url&amp;amp;quot; provides the actual link/URL to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. For specifying a property that provides the actual link, please use special &amp;amp;quot;property&amp;amp;quot; scheme; e.g. &amp;amp;quot;property://com.openexchange.client.onboarding.app.mylink&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;type&amp;amp;quot; indicates if &amp;amp;quot;url&amp;amp;quot; holds a link for either Apple App Store, Apple Mac Store or Google Play Store. Must only be specified in case &amp;amp;quot;url&amp;amp;quot; points either of those commercial stores. Supported values are &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macstore&amp;amp;quot; and &amp;amp;quot;playstore&amp;amp;quot;&lt;br /&gt;
* The identifiers for the providers, which contribute to the scenario;&amp;lt;br /&amp;gt;&lt;br /&gt;
please check command-line tool &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; to check, which ones are available&lt;br /&gt;
* The identifiers for alternative scenarios. This is typically used to provide alternative manual setup possibility.&lt;br /&gt;
* The comma-separated names of Font Awesome icons that are supposed to be displayed for the scenario&amp;lt;br /&amp;gt;&lt;br /&gt;
(only the ones from v4.4.0 are currently supported)&lt;br /&gt;
* The translatable display name; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
* The translatable description; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
&lt;br /&gt;
== Onboarding providers ==&lt;br /&gt;
&lt;br /&gt;
As described in the previous section, a scenario specifies what providers contribute to it. A provider represents a certain App or (synchronization) protocol that a device can install, download and/or communicate with.&lt;br /&gt;
&lt;br /&gt;
Moreover a provider specifies what Onboarding types are supported (&amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, and/or &amp;amp;quot;link&amp;amp;quot;). Hence, once a provider is chosen to contribute to a certain scenario, the supported on-boarding type needs to match the one of the scenario itself. E.g. a scenario, which indicates to be of type &amp;amp;quot;link&amp;amp;quot;, will always fail if the associated provider signals to support types &amp;amp;quot;plist&amp;amp;quot; and &amp;amp;quot;manual&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To check what providers are available on your system, please execute the &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; command-line tool, which outputs something like:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_1.png]]&lt;br /&gt;
&lt;br /&gt;
Each provider might require one or more capabilities/permissions to be available for the requesting user. If capabilities/permissions are not satisfied, the associated scenario cannot be applied, but will be displayed to the user for upsell opportunities.&lt;br /&gt;
&lt;br /&gt;
=== Generic Onboarding provider for Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic onboarding provider for apps allows specifying custom scenarios of type &amp;amp;quot;link&amp;amp;quot; for arbitrary links/URLs pointing to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. The link can be set directly or via a property.&lt;br /&gt;
&lt;br /&gt;
This provider requires no capability/permission.&lt;br /&gt;
&lt;br /&gt;
An exemplary section in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file might look like (check &amp;amp;quot;Configuring Onboarding scenarios&amp;amp;quot; chapter for more details):&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== CalDAV/CardDAV ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;caldav&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;carddav&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order for a scenario (having CalDAV/CardDAV in its provider listing) to be executable by a user, the &amp;amp;quot;caldav&amp;amp;quot; capability and &amp;amp;quot;carddav&amp;amp;quot; capability respectively are required.&lt;br /&gt;
&lt;br /&gt;
Moreover, the appropriate *DAV end-points are supposed to be configured through property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.caldav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; file and property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.carddav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
=== Drive/Mail Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;driveapp&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;mailapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open-Xchange ships with built-in providers for Drive App and Mail App. The Drive-associated providers do require the &amp;amp;quot;drive&amp;amp;quot; capability and the Mail App requires the &amp;amp;quot;mobile_mail_app&amp;amp;quot; one.&lt;br /&gt;
&lt;br /&gt;
The appropriate links to the apps in the corresponding stores are configured in associated .properties files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-driveapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-mailapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default the links to the official apps are set, but may be changed to ones for branded versions.&lt;br /&gt;
&lt;br /&gt;
=== Drive Windows Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;drivewindowsclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the windows Drive Client. Requires the &amp;amp;quot;drive&amp;amp;quot; capability, but has no configuration options. However, this provider requires the &amp;amp;quot;open-xchange-drive-client-windows&amp;amp;quot; and the orderly configured binaries (e.g. through installing appropriate package according to the brand).&lt;br /&gt;
&lt;br /&gt;
Please check [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_Drive#OX_Drive_for_Windows ''this''] documentation for more details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === eM Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;emclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the eM Client needs the &amp;amp;quot;emclient&amp;amp;quot; capability.&lt;br /&gt;
&lt;br /&gt;
Allows to configure the URL pointing to the executable file through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.emclient.url&amp;lt;/code&amp;gt; in file 'client-onboarding-emclient.properties' file.&lt;br /&gt;
&lt;br /&gt;
=== Sync App ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;syncapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the Sync App for Android. Requires &amp;amp;quot;caldav&amp;amp;quot; and &amp;amp;quot;carddav&amp;amp;quot; capabilities.&lt;br /&gt;
&lt;br /&gt;
The link to Google Play Store is specified via property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.syncapp.store.google.playstore&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-syncapp.properties&amp;lt;/code&amp;gt; file. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mail (IMAP/SMTP) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for deploying the IMAP/STMP account on target device using native/stock mail app. All IMAP/SMTP related settings are settable in file 'client-onboarding-mail.properties'.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft ActiveSync (EAS) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configures the ActiveSync account on target device. Allows specifying the EAS end-point through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.eas.url&amp;lt;/code&amp;gt; property in 'client-onboarding-eas.properties'.&lt;br /&gt;
&lt;br /&gt;
=== OX Updater ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider offering the download for the OX Client Updater ([http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''http:''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''//oxpedia''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''org/wiki/index''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''php''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''?''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''title=AppSuite''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater '':''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''Open-Xchange_Updater'']). The provider is available as soon as the according package is installed and at least one product can be installed/updated via it by the user. A pre-configured scenario 'oxupdaterinstall' is already contained in &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuring Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
Onboarding scenarios are configured through the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Each scenario starts with its own &amp;amp;quot;section&amp;amp;quot; in that YAML file by typing its unique identifier. All further attributes as outlined in chapter &amp;amp;quot;Onboarding scenarios&amp;amp;quot; are nested below that identifier.&lt;br /&gt;
&lt;br /&gt;
=== Easily enabling/disabling scenarios ===&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with a set of pre-defined scenarios that might apply to the most common installations. Each scenario can easily be enabled/disabled through its &amp;amp;quot;enabled&amp;amp;quot; Boolean attribute in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool applies the changes without the need for restart.&lt;br /&gt;
&lt;br /&gt;
=== Translatable strings ===&lt;br /&gt;
&lt;br /&gt;
Those attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; refer to localizable strings and are placed into &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file. Once such attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; are changed/customized and/or added, the appropriate &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file needs to be re-created in order to get translated. For generating that &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file, please execute the /opt/open-xchange/sbin/parsei18nyaml command-line tool. That .pot file needs then be turned to the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Thus changing any of the attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; requires (provided that appropriate .po files are available in &amp;lt;code&amp;gt;/opt/open-xchange/i18n&amp;lt;/code&amp;gt; directory) either a restart or executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool together with stop/start of the &amp;amp;quot;com.openexchange.i18n&amp;amp;quot; bundle.&lt;br /&gt;
&lt;br /&gt;
=== Scenarios' scope and order ===&lt;br /&gt;
&lt;br /&gt;
While the previously mentioned &amp;amp;quot;enabled&amp;amp;quot; attribute offers some kind of generic on/off switch, the properties outlined in this section allow defining the device-scope for a scenario and in which order/precedence they are offered to the client. Scope in terms of&lt;br /&gt;
&lt;br /&gt;
* For what devices (from the set of those specified by providers) are what scenarios in which order available and&lt;br /&gt;
* For which users they are available&lt;br /&gt;
&lt;br /&gt;
As explained above, each scenario specifies one or more type-compatible providers associated with it. In turn, each provider determines to which devices the scenario applies. In order to further control, which device and which users are allowed to access a certain scenario, there are appropriate options available in file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt;. Every option is fully [http://oxpedia.org/wiki/index.php?title=ConfigCascade ''config-cascade''] aware and therefore can be controlled on a global, per context set, per context and per user basis.&lt;br /&gt;
&lt;br /&gt;
Thus, to make a scenario available for certain devices (as dictated by scenario’s providers) and for users as well, the scenario identifier needs to be added to the appropriate properties ending with &amp;amp;quot;.scenarios&amp;amp;quot; (for devices) and added to the &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property (for user) as well.&lt;br /&gt;
&lt;br /&gt;
The following properties accept a comma-separated list of scenario identifiers. The order of listed scenarios reflects the order in which they are offered to the client&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.mac.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.ipad.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.windows.desktop.scenarios&lt;br /&gt;
&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios=mailappinstall, driveappinstall, eassync, mailsync, davsync&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This exemplary setting specifies that Mail App, Drive App, EAS, Native Mail (IMAP/SMTP) and CalDAV/CardDAV are available in given order for iPhone devices.&lt;br /&gt;
&lt;br /&gt;
Once a scenario is made accessible through configuration it is visible to users trying to perform a client onboarding using one of associated devices. However, whether a user is effectively allowed to execute that scenario is determined by the required capabilities of the denoted providers; if not allowed it gets displayed as an upsell opportunity.&lt;br /&gt;
&lt;br /&gt;
=== Configuring actions ===&lt;br /&gt;
&lt;br /&gt;
The type for a scenario determines what actions are associated with it to &amp;amp;quot;''transport''&amp;amp;quot; the onboarding information to the client. The types &amp;amp;quot;manual&amp;amp;quot; and &amp;amp;quot;link&amp;amp;quot; only show static information like displaying a link. In contrast the type &amp;amp;quot;plist&amp;amp;quot; allows several actions to transport the configuration profile onto the client. Thereof&lt;br /&gt;
&lt;br /&gt;
* E-Mail&lt;br /&gt;
* SMS&lt;br /&gt;
&lt;br /&gt;
In order to utilize the &amp;amp;quot;E-Mail&amp;amp;quot; action, a special transport must be configured for system-composed E-Mails [http://oxpedia.org/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode#Share_Notifications ''as it is for using the sharing functionality'']. This transport is configured in noreply.properties. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
&lt;br /&gt;
Using the SMS action requires an according implementation being available. OX App Suite comes with an optional sipgate implementation. Please check [http://oxpedia.org/wiki/index.php?title=AppSuite:SMS_Sipgate ''this documentation''] how to setup App Suite accordingly.&lt;br /&gt;
&lt;br /&gt;
==== Implementing your own SMS gateway ====&lt;br /&gt;
&lt;br /&gt;
To use an SMS gateway other than sipgate, you can provide your own implementation. Therefore the Java interface &amp;lt;code&amp;gt;com.openexchange.sms.SMSServiceSPI&amp;lt;/code&amp;gt; needs to be implemented and published as an OSGi service. For parsing phone numbers provided by users &amp;lt;code&amp;gt;com.openexchange.sms.PhoneNumberParserService&amp;lt;/code&amp;gt; can be used. That one is also available as an OSGi service and can be tracked accordingly. You can have a look at bundle &amp;lt;code&amp;gt;com.openexchange.sms.sipgate&amp;lt;/code&amp;gt; as implementation reference.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' You must not install the &amp;lt;code&amp;gt;open-xchange-sms-sipgate&amp;lt;/code&amp;gt; package if you provide your own implementation.&lt;br /&gt;
&lt;br /&gt;
==== PLIST-signing ====&lt;br /&gt;
Scenarios of type &amp;amp;quot;plist&amp;amp;quot; require having PLIST-signing enabled. Otherwise the device will show a warning when importing a received PLIST configuration profile. Please follow the instructions as outlined in [http://oxpedia.org/wiki/index.php?title=AppSuite:PList_signing ''this article''] how to enable and configure signing for PLIST files.&lt;br /&gt;
&lt;br /&gt;
== Adding custom scenarios ==&lt;br /&gt;
&lt;br /&gt;
The first thing to do, is to add an appropriate scenario configuration to the 'client-onboarding-scenarios.yml' file; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;link:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;image: http://my.fine.host/image001.png&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next step is to make that scenario accessible through adapting 'client-onboarding.properties' file. Hence, the scenario identifier needs to be added to the devices, to which it applies (Android devices in this case):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios=..., mygoogleapp&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Furthermore, that scenario needs to be made accessible to users as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
At last, a .pot file is supposed to be generated from the translatable strings using /opt/open-xchange/sbin/parsei18nyaml command-line tool to yield the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Provided that target users do hold appropriate capabilities, they are allowed to execute that scenario. In the example above the &amp;amp;quot;app&amp;amp;quot; provider is specified, which does no require any capabilities. Hence, that scenario is available.&lt;br /&gt;
&lt;br /&gt;
== HowTos ==&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly setup a default/test configuration ? ===&lt;br /&gt;
&lt;br /&gt;
# Install open-xchange-client-onboarding package&lt;br /&gt;
# Edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; and set &amp;lt;code&amp;gt;com.openexchange.client.onboarding.enabled&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Edit &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt; to enable autoconfig sending via email. PS: Have a fully working smtp login available like “noreply@yourdomain.tld”&lt;br /&gt;
# Edit client-onboarding-scenarios.yml and set “enable” for : “driveappinstall” , “davsync” “davmanual” “mailsync” “mailmanual” to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Now set the correct caldav/carddav server FQDNs in the corresponding files for your setup&lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; &lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
# Restart OX process&lt;br /&gt;
# Login to AppSuite. Click on Settings - Connect your device&lt;br /&gt;
# Verify that you have following onboarding options available: &lt;br /&gt;
#* windows -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; drive app &lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; details for dav setup&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; drive app&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; drive app&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly disable a certain scenario ===&lt;br /&gt;
&lt;br /&gt;
Simply enter the 'client-onboarding-scenarios.yml' file and go to the section specifying the target scenario. Switch the 'enabled' flag to &amp;amp;quot;false&amp;amp;quot; and execute /opt/open-xchange/sbin/reloadconfiguration command-line tool.&lt;br /&gt;
&lt;br /&gt;
E.g. to disable the OX Drive App:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_3.png]]&lt;br /&gt;
&lt;br /&gt;
=== How can I disable the outdated ui parts like 'Downloads'? ===&lt;br /&gt;
&lt;br /&gt;
The wizard replaces and extends the functionality of the old Download Section in settings and the corresponding widgets. We recommend to disable these outdated parts:&lt;br /&gt;
# widget: get ox drive&lt;br /&gt;
# widget: update&lt;br /&gt;
# settings entry: downloads&lt;br /&gt;
&lt;br /&gt;
'''Remove settings section 'Downloads' '''&lt;br /&gt;
&lt;br /&gt;
Edit ''/opt/open-xchange/etc/settings/appsuite.properties'' and add or change the value to true:&lt;br /&gt;
* ''io.ox/core//settings/downloadsDisabled''&lt;br /&gt;
&lt;br /&gt;
'''Remove widgets'''&lt;br /&gt;
&lt;br /&gt;
To remove the both related portal widget/tiles please refer to the&lt;br /&gt;
[[AppSuite:Configuring_portal_plugins#Disabling_a_tile_completely | portal plugins wiki page ]]&lt;br /&gt;
&lt;br /&gt;
* ''io.ox/portal/widget/oxdriveclients''&lt;br /&gt;
* ''io.ox/portal/widget/updater''&lt;br /&gt;
&lt;br /&gt;
=== How can I add my own App? ===&lt;br /&gt;
&lt;br /&gt;
Provided that the App is accessible by a link (pointing to a commercial App Store or to a downloadable executable/installer), the generic &amp;amp;quot;app&amp;amp;quot; is the suitable provider to choose.&lt;br /&gt;
&lt;br /&gt;
Hence, an appropriate section is supposed to be added to the 'client-onboarding-scenarios.yml' file having a unique name and &amp;amp;quot;provider&amp;amp;quot; attribute set to &amp;amp;quot;[app]&amp;amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;link:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;image: http://my.fine.host/image001.png&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The attribute &amp;amp;quot;type&amp;amp;quot; needs to be set to &amp;amp;quot;link&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The attribute &amp;amp;quot;link&amp;amp;quot; should be configured with:&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;url&amp;amp;quot; sub-attribute containing the actual link pointing to the URL location&lt;br /&gt;
* &amp;amp;quot;type&amp;amp;quot; sub-attribute specifying of what type that link is: either &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macappstore&amp;amp;quot;, &amp;amp;quot;playstore&amp;amp;quot; or &amp;amp;quot;common&amp;amp;quot;. The type &amp;amp;quot;common&amp;amp;quot; is supposed to be used for links that do not point to a commercial App Store, but to a downloadable executable/installer file.&lt;br /&gt;
* &amp;amp;quot;image&amp;amp;quot; sub-attribute containing the link pointing to the App's image&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;quot;icon&amp;amp;quot; attribute is supposed to contain a comma-separated list of Font Awesome icons (only the ones from v4.4.0 are currently supported) that represent the App; e.g.&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;fa-cloud&amp;amp;quot; for Drive/file-related nature&lt;br /&gt;
* &amp;amp;quot;fa-calendar, fa-users&amp;amp;quot; for Calendar and Address Book synchronization&lt;br /&gt;
* &amp;amp;quot;fa-envelope-o&amp;amp;quot; for Mail nature&lt;br /&gt;
&lt;br /&gt;
Next, the translatable display name and description should be set through setting the attributes &amp;amp;quot;displayName_t10e&amp;amp;quot; and &amp;amp;quot;description_t10e&amp;amp;quot;. As described previously, executing the /opt/open-xchange/sbin/parsei18nyaml command-line tool yields an appropriate .pot file, which can then be used for generating the individual .po file for the different translations.&lt;br /&gt;
&lt;br /&gt;
Finally, the 'client-onboarding.properties' file needs to be modified to specify the &amp;amp;quot;scope&amp;amp;quot; for that new scenario. Add the scenario’s unique name to the appropriate device properties and add it to &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property as well.&lt;br /&gt;
&lt;br /&gt;
After executing /opt/open-xchange/sbin/reloadconfiguration command-line tool the new client onboarding scenario is available for the selected users/devices.&lt;br /&gt;
&lt;br /&gt;
=== How can I upsell my own app? ===&lt;br /&gt;
&lt;br /&gt;
Having the same prerequisites/steps as for &amp;amp;quot;How can I add my own App?&amp;amp;quot; the scenario description in the 'client-onboarding-scenarios.yml' file simply needs to be extended by the desired capabilities, which are supposed to be used for managing the upsell.&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 '''capabilities: &amp;amp;quot;mygoogleapp_capability&amp;amp;quot;'''&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The special &amp;amp;quot;capabilities&amp;amp;quot; attribute is only supported for scenarios of type &amp;amp;quot;link&amp;amp;quot; with the special &amp;amp;quot;app&amp;amp;quot; provider.&lt;br /&gt;
&lt;br /&gt;
With such a &amp;amp;quot;capabilities&amp;amp;quot; attribute only users, which have the &amp;amp;quot;mygoogleapp_capability&amp;amp;quot; capability are allowed to get the link. For those who don’t, the upsell opportunity will be displayed; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[[File:onboarding_4.png]]&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23113</id>
		<title>AppSuite:Client Onboarding</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23113"/>
		<updated>2017-03-15T09:14:44Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* How can I add my own App? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Client Onboarding&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.1}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Configuration guide for Open-Xchange Client Onboarding =&lt;br /&gt;
&lt;br /&gt;
With Open-Xchange Server v7.8.1 a new module is added allowing users to integrate several different clients and devices with Open-Xchange; such as providing a link to a commercial App Store to install certain apps on mobile devices.&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with several built-in providers; thereof&lt;br /&gt;
&lt;br /&gt;
* CalDAV&lt;br /&gt;
* CardDAV&lt;br /&gt;
* OX Mail App&lt;br /&gt;
* OX Drive App&lt;br /&gt;
* Connector for Microsoft Outlook®&lt;br /&gt;
* Sync App for Android&lt;br /&gt;
* Microsoft ActiveSync&lt;br /&gt;
* eM Client&lt;br /&gt;
* Mail (IMAP/SMTP)&lt;br /&gt;
* Generic Mobile App provider&lt;br /&gt;
&lt;br /&gt;
Those providers allow accessing and/or synchronizing with certain data held by Open-Xchange on a supported device.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
To install the Client Onboarding module, the package open-xchange-client-onboarding needs to be installed.&lt;br /&gt;
&lt;br /&gt;
Moreover the property &amp;lt;code&amp;gt;&amp;quot;com.openexchange.client.onboarding.enabled&amp;quot;&amp;lt;/code&amp;gt;; in installed file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; needs to be set to &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; (default). So getting rid off the entire client on-boarding module simply requires setting the mentioned property to &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; (and executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool).&lt;br /&gt;
&lt;br /&gt;
== Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
The way to specify what and how a certain device is able to get “on-boarded” is mainly determined by so called scenarios. A scenario describes what gets deployed using which providers that contribute their onboarding possibilities and how it is made accessible to the client’s device.&lt;br /&gt;
&lt;br /&gt;
A scenario consists of the following configuration attributes/options&lt;br /&gt;
&lt;br /&gt;
* A unique scenario identifier&lt;br /&gt;
* A flag determining if scenario is enabled or not. If set to 'false' the scenario will not be available, useful for testing/enabling the scenario later on&lt;br /&gt;
* A scenario type, which is one of &amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, or &amp;amp;quot;link&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;plist&amp;amp;quot; for generating a PLIST configuration file for iOS and OSX devices,&lt;br /&gt;
** &amp;amp;quot;manual&amp;amp;quot; for a description for the user for a manual set-up/configuration&lt;br /&gt;
** &amp;amp;quot;link&amp;amp;quot; for a link/URL to either Apple App Store / Google Play Store or to downloadable executable&lt;br /&gt;
* The &amp;amp;quot;link&amp;amp;quot; attribute, which is only considered it type is set to &amp;amp;quot;link&amp;amp;quot;. That attribute consists of the sub-attributes &amp;amp;quot;url&amp;amp;quot; and &amp;amp;quot;type&amp;amp;quot;.&lt;br /&gt;
** &amp;amp;quot;url&amp;amp;quot; provides the actual link/URL to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. For specifying a property that provides the actual link, please use special &amp;amp;quot;property&amp;amp;quot; scheme; e.g. &amp;amp;quot;property://com.openexchange.client.onboarding.app.mylink&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;type&amp;amp;quot; indicates if &amp;amp;quot;url&amp;amp;quot; holds a link for either Apple App Store, Apple Mac Store or Google Play Store. Must only be specified in case &amp;amp;quot;url&amp;amp;quot; points either of those commercial stores. Supported values are &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macstore&amp;amp;quot; and &amp;amp;quot;playstore&amp;amp;quot;&lt;br /&gt;
* The identifiers for the providers, which contribute to the scenario;&amp;lt;br /&amp;gt;&lt;br /&gt;
please check command-line tool &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; to check, which ones are available&lt;br /&gt;
* The identifiers for alternative scenarios. This is typically used to provide alternative manual setup possibility.&lt;br /&gt;
* The comma-separated names of Font Awesome icons that are supposed to be displayed for the scenario&amp;lt;br /&amp;gt;&lt;br /&gt;
(only the ones from v4.4.0 are currently supported)&lt;br /&gt;
* The translatable display name; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
* The translatable description; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
&lt;br /&gt;
== Onboarding providers ==&lt;br /&gt;
&lt;br /&gt;
As described in the previous section, a scenario specifies what providers contribute to it. A provider represents a certain App or (synchronization) protocol that a device can install, download and/or communicate with.&lt;br /&gt;
&lt;br /&gt;
Moreover a provider specifies what Onboarding types are supported (&amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, and/or &amp;amp;quot;link&amp;amp;quot;). Hence, once a provider is chosen to contribute to a certain scenario, the supported on-boarding type needs to match the one of the scenario itself. E.g. a scenario, which indicates to be of type &amp;amp;quot;link&amp;amp;quot;, will always fail if the associated provider signals to support types &amp;amp;quot;plist&amp;amp;quot; and &amp;amp;quot;manual&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To check what providers are available on your system, please execute the &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; command-line tool, which outputs something like:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_1.png]]&lt;br /&gt;
&lt;br /&gt;
Each provider might require one or more capabilities/permissions to be available for the requesting user. If capabilities/permissions are not satisfied, the associated scenario cannot be applied, but will be displayed to the user for upsell opportunities.&lt;br /&gt;
&lt;br /&gt;
=== Generic Onboarding provider for Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic onboarding provider for apps allows specifying custom scenarios of type &amp;amp;quot;link&amp;amp;quot; for arbitrary links/URLs pointing to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. The link can be set directly or via a property.&lt;br /&gt;
&lt;br /&gt;
This provider requires no capability/permission.&lt;br /&gt;
&lt;br /&gt;
An exemplary section in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file might look like (check &amp;amp;quot;Configuring Onboarding scenarios&amp;amp;quot; chapter for more details):&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== CalDAV/CardDAV ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;caldav&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;carddav&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order for a scenario (having CalDAV/CardDAV in its provider listing) to be executable by a user, the &amp;amp;quot;caldav&amp;amp;quot; capability and &amp;amp;quot;carddav&amp;amp;quot; capability respectively are required.&lt;br /&gt;
&lt;br /&gt;
Moreover, the appropriate *DAV end-points are supposed to be configured through property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.caldav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; file and property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.carddav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
=== Drive/Mail Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;driveapp&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;mailapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open-Xchange ships with built-in providers for Drive App and Mail App. The Drive-associated providers do require the &amp;amp;quot;drive&amp;amp;quot; capability and the Mail App requires the &amp;amp;quot;mobile_mail_app&amp;amp;quot; one.&lt;br /&gt;
&lt;br /&gt;
The appropriate links to the apps in the corresponding stores are configured in associated .properties files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-driveapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-mailapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default the links to the official apps are set, but may be changed to ones for branded versions.&lt;br /&gt;
&lt;br /&gt;
=== Drive Windows Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;drivewindowsclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the windows Drive Client. Requires the &amp;amp;quot;drive&amp;amp;quot; capability, but has no configuration options. However, this provider requires the &amp;amp;quot;open-xchange-drive-client-windows&amp;amp;quot; and the orderly configured binaries (e.g. through installing appropriate package according to the brand).&lt;br /&gt;
&lt;br /&gt;
Please check [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_Drive#OX_Drive_for_Windows ''this''] documentation for more details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === eM Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;emclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the eM Client needs the &amp;amp;quot;emclient&amp;amp;quot; capability.&lt;br /&gt;
&lt;br /&gt;
Allows to configure the URL pointing to the executable file through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.emclient.url&amp;lt;/code&amp;gt; in file 'client-onboarding-emclient.properties' file.&lt;br /&gt;
&lt;br /&gt;
=== Sync App ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;syncapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the Sync App for Android. Requires &amp;amp;quot;caldav&amp;amp;quot; and &amp;amp;quot;carddav&amp;amp;quot; capabilities.&lt;br /&gt;
&lt;br /&gt;
The link to Google Play Store is specified via property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.syncapp.store.google.playstore&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-syncapp.properties&amp;lt;/code&amp;gt; file. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mail (IMAP/SMTP) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for deploying the IMAP/STMP account on target device using native/stock mail app. All IMAP/SMTP related settings are settable in file 'client-onboarding-mail.properties'.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft ActiveSync (EAS) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configures the ActiveSync account on target device. Allows specifying the EAS end-point through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.eas.url&amp;lt;/code&amp;gt; property in 'client-onboarding-eas.properties'.&lt;br /&gt;
&lt;br /&gt;
=== OX Updater ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider offering the download for the OX Client Updater ([http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''http:''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''//oxpedia''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''org/wiki/index''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''php''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''?''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''title=AppSuite''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater '':''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''Open-Xchange_Updater'']). The provider is available as soon as the according package is installed and at least one product can be installed/updated via it by the user. A pre-configured scenario 'oxupdaterinstall' is already contained in &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuring Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
Onboarding scenarios are configured through the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Each scenario starts with its own &amp;amp;quot;section&amp;amp;quot; in that YAML file by typing its unique identifier. All further attributes as outlined in chapter &amp;amp;quot;Onboarding scenarios&amp;amp;quot; are nested below that identifier.&lt;br /&gt;
&lt;br /&gt;
=== Easily enabling/disabling scenarios ===&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with a set of pre-defined scenarios that might apply to the most common installations. Each scenario can easily be enabled/disabled through its &amp;amp;quot;enabled&amp;amp;quot; Boolean attribute in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool applies the changes without the need for restart.&lt;br /&gt;
&lt;br /&gt;
=== Translatable strings ===&lt;br /&gt;
&lt;br /&gt;
Those attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; refer to localizable strings and are placed into &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file. Once such attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; are changed/customized and/or added, the appropriate &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file needs to be re-created in order to get translated. For generating that &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file, please execute the /opt/open-xchange/sbin/parsei18nyaml command-line tool. That .pot file needs then be turned to the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Thus changing any of the attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; requires (provided that appropriate .po files are available in &amp;lt;code&amp;gt;/opt/open-xchange/i18n&amp;lt;/code&amp;gt; directory) either a restart or executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool together with stop/start of the &amp;amp;quot;com.openexchange.i18n&amp;amp;quot; bundle.&lt;br /&gt;
&lt;br /&gt;
=== Scenarios' scope and order ===&lt;br /&gt;
&lt;br /&gt;
While the previously mentioned &amp;amp;quot;enabled&amp;amp;quot; attribute offers some kind of generic on/off switch, the properties outlined in this section allow defining the device-scope for a scenario and in which order/precedence they are offered to the client. Scope in terms of&lt;br /&gt;
&lt;br /&gt;
* For what devices (from the set of those specified by providers) are what scenarios in which order available and&lt;br /&gt;
* For which users they are available&lt;br /&gt;
&lt;br /&gt;
As explained above, each scenario specifies one or more type-compatible providers associated with it. In turn, each provider determines to which devices the scenario applies. In order to further control, which device and which users are allowed to access a certain scenario, there are appropriate options available in file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt;. Every option is fully [http://oxpedia.org/wiki/index.php?title=ConfigCascade ''config-cascade''] aware and therefore can be controlled on a global, per context set, per context and per user basis.&lt;br /&gt;
&lt;br /&gt;
Thus, to make a scenario available for certain devices (as dictated by scenario’s providers) and for users as well, the scenario identifier needs to be added to the appropriate properties ending with &amp;amp;quot;.scenarios&amp;amp;quot; (for devices) and added to the &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property (for user) as well.&lt;br /&gt;
&lt;br /&gt;
The following properties accept a comma-separated list of scenario identifiers. The order of listed scenarios reflects the order in which they are offered to the client&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.mac.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.ipad.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.windows.desktop.scenarios&lt;br /&gt;
&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios=mailappinstall, driveappinstall, eassync, mailsync, davsync&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This exemplary setting specifies that Mail App, Drive App, EAS, Native Mail (IMAP/SMTP) and CalDAV/CardDAV are available in given order for iPhone devices.&lt;br /&gt;
&lt;br /&gt;
Once a scenario is made accessible through configuration it is visible to users trying to perform a client onboarding using one of associated devices. However, whether a user is effectively allowed to execute that scenario is determined by the required capabilities of the denoted providers; if not allowed it gets displayed as an upsell opportunity.&lt;br /&gt;
&lt;br /&gt;
=== Configuring actions ===&lt;br /&gt;
&lt;br /&gt;
The type for a scenario determines what actions are associated with it to &amp;amp;quot;''transport''&amp;amp;quot; the onboarding information to the client. The types &amp;amp;quot;manual&amp;amp;quot; and &amp;amp;quot;link&amp;amp;quot; only show static information like displaying a link. In contrast the type &amp;amp;quot;plist&amp;amp;quot; allows several actions to transport the configuration profile onto the client. Thereof&lt;br /&gt;
&lt;br /&gt;
* E-Mail&lt;br /&gt;
* SMS&lt;br /&gt;
&lt;br /&gt;
In order to utilize the &amp;amp;quot;E-Mail&amp;amp;quot; action, a special transport must be configured for system-composed E-Mails [http://oxpedia.org/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode#Share_Notifications ''as it is for using the sharing functionality'']. This transport is configured in noreply.properties. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
&lt;br /&gt;
Using the SMS action requires an according implementation being available. OX App Suite comes with an optional sipgate implementation. Please check [http://oxpedia.org/wiki/index.php?title=AppSuite:SMS_Sipgate ''this documentation''] how to setup App Suite accordingly.&lt;br /&gt;
&lt;br /&gt;
==== Implementing your own SMS gateway ====&lt;br /&gt;
&lt;br /&gt;
To use an SMS gateway other than sipgate, you can provide your own implementation. Therefore the Java interface &amp;lt;code&amp;gt;com.openexchange.sms.SMSServiceSPI&amp;lt;/code&amp;gt; needs to be implemented and published as an OSGi service. For parsing phone numbers provided by users &amp;lt;code&amp;gt;com.openexchange.sms.PhoneNumberParserService&amp;lt;/code&amp;gt; can be used. That one is also available as an OSGi service and can be tracked accordingly. You can have a look at bundle &amp;lt;code&amp;gt;com.openexchange.sms.sipgate&amp;lt;/code&amp;gt; as implementation reference.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' You must not install the &amp;lt;code&amp;gt;open-xchange-sms-sipgate&amp;lt;/code&amp;gt; package if you provide your own implementation.&lt;br /&gt;
&lt;br /&gt;
==== PLIST-signing ====&lt;br /&gt;
Scenarios of type &amp;amp;quot;plist&amp;amp;quot; require having PLIST-signing enabled. Otherwise the device will show a warning when importing a received PLIST configuration profile. Please follow the instructions as outlined in [http://oxpedia.org/wiki/index.php?title=AppSuite:PList_signing ''this article''] how to enable and configure signing for PLIST files.&lt;br /&gt;
&lt;br /&gt;
== Adding custom scenarios ==&lt;br /&gt;
&lt;br /&gt;
The first thing to do, is to add an appropriate scenario configuration to the 'client-onboarding-scenarios.yml' file; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;link:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;image: http://my.fine.host/image001.png&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next step is to make that scenario accessible through adapting 'client-onboarding.properties' file. Hence, the scenario identifier needs to be added to the devices, to which it applies (Android devices in this case):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios=..., mygoogleapp&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Furthermore, that scenario needs to be made accessible to users as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
At last, a .pot file is supposed to be generated from the translatable strings using /opt/open-xchange/sbin/parsei18nyaml command-line tool to yield the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Provided that target users do hold appropriate capabilities, they are allowed to execute that scenario. In the example above the &amp;amp;quot;app&amp;amp;quot; provider is specified, which does no require any capabilities. Hence, that scenario is available.&lt;br /&gt;
&lt;br /&gt;
== HowTos ==&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly setup a default/test configuration ? ===&lt;br /&gt;
&lt;br /&gt;
# Install open-xchange-client-onboarding package&lt;br /&gt;
# Edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; and set &amp;lt;code&amp;gt;com.openexchange.client.onboarding.enabled&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Edit &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt; to enable autoconfig sending via email. PS: Have a fully working smtp login available like “noreply@yourdomain.tld”&lt;br /&gt;
# Edit client-onboarding-scenarios.yml and set “enable” for : “driveappinstall” , “davsync” “davmanual” “mailsync” “mailmanual” to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Now set the correct caldav/carddav server FQDNs in the corresponding files for your setup&lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; &lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
# Restart OX process&lt;br /&gt;
# Login to AppSuite. Click on Settings - Connect your device&lt;br /&gt;
# Verify that you have following onboarding options available: &lt;br /&gt;
#* windows -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; drive app &lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; details for dav setup&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; drive app&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; drive app&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly disable a certain scenario ===&lt;br /&gt;
&lt;br /&gt;
Simply enter the 'client-onboarding-scenarios.yml' file and go to the section specifying the target scenario. Switch the 'enabled' flag to &amp;amp;quot;false&amp;amp;quot; and execute /opt/open-xchange/sbin/reloadconfiguration command-line tool.&lt;br /&gt;
&lt;br /&gt;
E.g. to disable the OX Drive App:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_3.png]]&lt;br /&gt;
&lt;br /&gt;
=== How can I disable the outdated ui parts like 'Downloads'? ===&lt;br /&gt;
&lt;br /&gt;
The wizard replaces and extends the functionality of the old Download Section in settings and the corresponding widgets. We recommend to disable these outdated parts:&lt;br /&gt;
# widget: get ox drive&lt;br /&gt;
# widget: update&lt;br /&gt;
# settings entry: downloads&lt;br /&gt;
&lt;br /&gt;
'''Remove settings section 'Downloads' '''&lt;br /&gt;
&lt;br /&gt;
Edit ''/opt/open-xchange/etc/settings/appsuite.properties'' and add or change the value to true:&lt;br /&gt;
* ''io.ox/core//settings/downloadsDisabled''&lt;br /&gt;
&lt;br /&gt;
'''Remove widgets'''&lt;br /&gt;
&lt;br /&gt;
To remove the both related portal widget/tiles please refer to the&lt;br /&gt;
[[AppSuite:Configuring_portal_plugins#Disabling_a_tile_completely | portal plugins wiki page ]]&lt;br /&gt;
&lt;br /&gt;
* ''io.ox/portal/widget/oxdriveclients''&lt;br /&gt;
* ''io.ox/portal/widget/updater''&lt;br /&gt;
&lt;br /&gt;
=== How can I add my own App? ===&lt;br /&gt;
&lt;br /&gt;
Provided that the App is accessible by a link (pointing to a commercial App Store or to a downloadable executable/installer), the generic &amp;amp;quot;app&amp;amp;quot; is the suitable provider to choose.&lt;br /&gt;
&lt;br /&gt;
Hence, an appropriate section is supposed to be added to the 'client-onboarding-scenarios.yml' file having a unique name and &amp;amp;quot;provider&amp;amp;quot; attribute set to &amp;amp;quot;[app]&amp;amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;link:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;image: http://my.fine.host/image001.png&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The attribute &amp;amp;quot;type&amp;amp;quot; needs to be set to &amp;amp;quot;link&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The attribute &amp;amp;quot;link&amp;amp;quot; should be configured with:&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;url&amp;amp;quot; sub-attribute containing the actual link pointing to the URL location&lt;br /&gt;
* &amp;amp;quot;type&amp;amp;quot; sub-attribute specifying of what type that link is: either &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macappstore&amp;amp;quot;, &amp;amp;quot;playstore&amp;amp;quot; or &amp;amp;quot;common&amp;amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
The type &amp;amp;quot;common&amp;amp;quot; is supposed to be used for links that do not point to a commercial App Store, but to a downloadable executable/installer file.&lt;br /&gt;
* &amp;amp;quot;image&amp;amp;quot; sub-attribute containing the link pointing to the App's image&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;quot;icon&amp;amp;quot; attribute is supposed to contain a comma-separated list of Font Awesome icons (only the ones from v4.4.0 are currently supported) that represent the App; e.g.&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;fa-cloud&amp;amp;quot; for Drive/file-related nature&lt;br /&gt;
* &amp;amp;quot;fa-calendar, fa-users&amp;amp;quot; for Calendar and Address Book synchronization&lt;br /&gt;
* &amp;amp;quot;fa-envelope-o&amp;amp;quot; for Mail nature&lt;br /&gt;
&lt;br /&gt;
Next, the translatable display name and description should be set through setting the attributes &amp;amp;quot;displayName_t10e&amp;amp;quot; and &amp;amp;quot;description_t10e&amp;amp;quot;. As described previously, executing the /opt/open-xchange/sbin/parsei18nyaml command-line tool yields an appropriate .pot file, which can then be used for generating the individual .po file for the different translations.&lt;br /&gt;
&lt;br /&gt;
Finally, the 'client-onboarding.properties' file needs to be modified to specify the &amp;amp;quot;scope&amp;amp;quot; for that new scenario. Add the scenario’s unique name to the appropriate device properties and add it to &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property as well.&lt;br /&gt;
&lt;br /&gt;
After executing /opt/open-xchange/sbin/reloadconfiguration command-line tool the new client onboarding scenario is available for the selected users/devices.&lt;br /&gt;
&lt;br /&gt;
=== How can I upsell my own app? ===&lt;br /&gt;
&lt;br /&gt;
Having the same prerequisites/steps as for &amp;amp;quot;How can I add my own App?&amp;amp;quot; the scenario description in the 'client-onboarding-scenarios.yml' file simply needs to be extended by the desired capabilities, which are supposed to be used for managing the upsell.&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 '''capabilities: &amp;amp;quot;mygoogleapp_capability&amp;amp;quot;'''&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The special &amp;amp;quot;capabilities&amp;amp;quot; attribute is only supported for scenarios of type &amp;amp;quot;link&amp;amp;quot; with the special &amp;amp;quot;app&amp;amp;quot; provider.&lt;br /&gt;
&lt;br /&gt;
With such a &amp;amp;quot;capabilities&amp;amp;quot; attribute only users, which have the &amp;amp;quot;mygoogleapp_capability&amp;amp;quot; capability are allowed to get the link. For those who don’t, the upsell opportunity will be displayed; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[[File:onboarding_4.png]]&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23112</id>
		<title>AppSuite:Client Onboarding</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23112"/>
		<updated>2017-03-15T09:12:03Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Adding custom scenarios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Client Onboarding&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.1}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Configuration guide for Open-Xchange Client Onboarding =&lt;br /&gt;
&lt;br /&gt;
With Open-Xchange Server v7.8.1 a new module is added allowing users to integrate several different clients and devices with Open-Xchange; such as providing a link to a commercial App Store to install certain apps on mobile devices.&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with several built-in providers; thereof&lt;br /&gt;
&lt;br /&gt;
* CalDAV&lt;br /&gt;
* CardDAV&lt;br /&gt;
* OX Mail App&lt;br /&gt;
* OX Drive App&lt;br /&gt;
* Connector for Microsoft Outlook®&lt;br /&gt;
* Sync App for Android&lt;br /&gt;
* Microsoft ActiveSync&lt;br /&gt;
* eM Client&lt;br /&gt;
* Mail (IMAP/SMTP)&lt;br /&gt;
* Generic Mobile App provider&lt;br /&gt;
&lt;br /&gt;
Those providers allow accessing and/or synchronizing with certain data held by Open-Xchange on a supported device.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
To install the Client Onboarding module, the package open-xchange-client-onboarding needs to be installed.&lt;br /&gt;
&lt;br /&gt;
Moreover the property &amp;lt;code&amp;gt;&amp;quot;com.openexchange.client.onboarding.enabled&amp;quot;&amp;lt;/code&amp;gt;; in installed file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; needs to be set to &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; (default). So getting rid off the entire client on-boarding module simply requires setting the mentioned property to &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; (and executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool).&lt;br /&gt;
&lt;br /&gt;
== Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
The way to specify what and how a certain device is able to get “on-boarded” is mainly determined by so called scenarios. A scenario describes what gets deployed using which providers that contribute their onboarding possibilities and how it is made accessible to the client’s device.&lt;br /&gt;
&lt;br /&gt;
A scenario consists of the following configuration attributes/options&lt;br /&gt;
&lt;br /&gt;
* A unique scenario identifier&lt;br /&gt;
* A flag determining if scenario is enabled or not. If set to 'false' the scenario will not be available, useful for testing/enabling the scenario later on&lt;br /&gt;
* A scenario type, which is one of &amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, or &amp;amp;quot;link&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;plist&amp;amp;quot; for generating a PLIST configuration file for iOS and OSX devices,&lt;br /&gt;
** &amp;amp;quot;manual&amp;amp;quot; for a description for the user for a manual set-up/configuration&lt;br /&gt;
** &amp;amp;quot;link&amp;amp;quot; for a link/URL to either Apple App Store / Google Play Store or to downloadable executable&lt;br /&gt;
* The &amp;amp;quot;link&amp;amp;quot; attribute, which is only considered it type is set to &amp;amp;quot;link&amp;amp;quot;. That attribute consists of the sub-attributes &amp;amp;quot;url&amp;amp;quot; and &amp;amp;quot;type&amp;amp;quot;.&lt;br /&gt;
** &amp;amp;quot;url&amp;amp;quot; provides the actual link/URL to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. For specifying a property that provides the actual link, please use special &amp;amp;quot;property&amp;amp;quot; scheme; e.g. &amp;amp;quot;property://com.openexchange.client.onboarding.app.mylink&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;type&amp;amp;quot; indicates if &amp;amp;quot;url&amp;amp;quot; holds a link for either Apple App Store, Apple Mac Store or Google Play Store. Must only be specified in case &amp;amp;quot;url&amp;amp;quot; points either of those commercial stores. Supported values are &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macstore&amp;amp;quot; and &amp;amp;quot;playstore&amp;amp;quot;&lt;br /&gt;
* The identifiers for the providers, which contribute to the scenario;&amp;lt;br /&amp;gt;&lt;br /&gt;
please check command-line tool &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; to check, which ones are available&lt;br /&gt;
* The identifiers for alternative scenarios. This is typically used to provide alternative manual setup possibility.&lt;br /&gt;
* The comma-separated names of Font Awesome icons that are supposed to be displayed for the scenario&amp;lt;br /&amp;gt;&lt;br /&gt;
(only the ones from v4.4.0 are currently supported)&lt;br /&gt;
* The translatable display name; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
* The translatable description; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
&lt;br /&gt;
== Onboarding providers ==&lt;br /&gt;
&lt;br /&gt;
As described in the previous section, a scenario specifies what providers contribute to it. A provider represents a certain App or (synchronization) protocol that a device can install, download and/or communicate with.&lt;br /&gt;
&lt;br /&gt;
Moreover a provider specifies what Onboarding types are supported (&amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, and/or &amp;amp;quot;link&amp;amp;quot;). Hence, once a provider is chosen to contribute to a certain scenario, the supported on-boarding type needs to match the one of the scenario itself. E.g. a scenario, which indicates to be of type &amp;amp;quot;link&amp;amp;quot;, will always fail if the associated provider signals to support types &amp;amp;quot;plist&amp;amp;quot; and &amp;amp;quot;manual&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To check what providers are available on your system, please execute the &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; command-line tool, which outputs something like:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_1.png]]&lt;br /&gt;
&lt;br /&gt;
Each provider might require one or more capabilities/permissions to be available for the requesting user. If capabilities/permissions are not satisfied, the associated scenario cannot be applied, but will be displayed to the user for upsell opportunities.&lt;br /&gt;
&lt;br /&gt;
=== Generic Onboarding provider for Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic onboarding provider for apps allows specifying custom scenarios of type &amp;amp;quot;link&amp;amp;quot; for arbitrary links/URLs pointing to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. The link can be set directly or via a property.&lt;br /&gt;
&lt;br /&gt;
This provider requires no capability/permission.&lt;br /&gt;
&lt;br /&gt;
An exemplary section in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file might look like (check &amp;amp;quot;Configuring Onboarding scenarios&amp;amp;quot; chapter for more details):&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== CalDAV/CardDAV ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;caldav&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;carddav&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order for a scenario (having CalDAV/CardDAV in its provider listing) to be executable by a user, the &amp;amp;quot;caldav&amp;amp;quot; capability and &amp;amp;quot;carddav&amp;amp;quot; capability respectively are required.&lt;br /&gt;
&lt;br /&gt;
Moreover, the appropriate *DAV end-points are supposed to be configured through property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.caldav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; file and property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.carddav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
=== Drive/Mail Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;driveapp&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;mailapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open-Xchange ships with built-in providers for Drive App and Mail App. The Drive-associated providers do require the &amp;amp;quot;drive&amp;amp;quot; capability and the Mail App requires the &amp;amp;quot;mobile_mail_app&amp;amp;quot; one.&lt;br /&gt;
&lt;br /&gt;
The appropriate links to the apps in the corresponding stores are configured in associated .properties files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-driveapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-mailapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default the links to the official apps are set, but may be changed to ones for branded versions.&lt;br /&gt;
&lt;br /&gt;
=== Drive Windows Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;drivewindowsclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the windows Drive Client. Requires the &amp;amp;quot;drive&amp;amp;quot; capability, but has no configuration options. However, this provider requires the &amp;amp;quot;open-xchange-drive-client-windows&amp;amp;quot; and the orderly configured binaries (e.g. through installing appropriate package according to the brand).&lt;br /&gt;
&lt;br /&gt;
Please check [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_Drive#OX_Drive_for_Windows ''this''] documentation for more details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === eM Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;emclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the eM Client needs the &amp;amp;quot;emclient&amp;amp;quot; capability.&lt;br /&gt;
&lt;br /&gt;
Allows to configure the URL pointing to the executable file through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.emclient.url&amp;lt;/code&amp;gt; in file 'client-onboarding-emclient.properties' file.&lt;br /&gt;
&lt;br /&gt;
=== Sync App ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;syncapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the Sync App for Android. Requires &amp;amp;quot;caldav&amp;amp;quot; and &amp;amp;quot;carddav&amp;amp;quot; capabilities.&lt;br /&gt;
&lt;br /&gt;
The link to Google Play Store is specified via property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.syncapp.store.google.playstore&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-syncapp.properties&amp;lt;/code&amp;gt; file. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mail (IMAP/SMTP) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for deploying the IMAP/STMP account on target device using native/stock mail app. All IMAP/SMTP related settings are settable in file 'client-onboarding-mail.properties'.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft ActiveSync (EAS) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configures the ActiveSync account on target device. Allows specifying the EAS end-point through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.eas.url&amp;lt;/code&amp;gt; property in 'client-onboarding-eas.properties'.&lt;br /&gt;
&lt;br /&gt;
=== OX Updater ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider offering the download for the OX Client Updater ([http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''http:''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''//oxpedia''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''org/wiki/index''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''php''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''?''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''title=AppSuite''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater '':''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''Open-Xchange_Updater'']). The provider is available as soon as the according package is installed and at least one product can be installed/updated via it by the user. A pre-configured scenario 'oxupdaterinstall' is already contained in &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuring Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
Onboarding scenarios are configured through the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Each scenario starts with its own &amp;amp;quot;section&amp;amp;quot; in that YAML file by typing its unique identifier. All further attributes as outlined in chapter &amp;amp;quot;Onboarding scenarios&amp;amp;quot; are nested below that identifier.&lt;br /&gt;
&lt;br /&gt;
=== Easily enabling/disabling scenarios ===&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with a set of pre-defined scenarios that might apply to the most common installations. Each scenario can easily be enabled/disabled through its &amp;amp;quot;enabled&amp;amp;quot; Boolean attribute in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool applies the changes without the need for restart.&lt;br /&gt;
&lt;br /&gt;
=== Translatable strings ===&lt;br /&gt;
&lt;br /&gt;
Those attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; refer to localizable strings and are placed into &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file. Once such attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; are changed/customized and/or added, the appropriate &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file needs to be re-created in order to get translated. For generating that &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file, please execute the /opt/open-xchange/sbin/parsei18nyaml command-line tool. That .pot file needs then be turned to the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Thus changing any of the attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; requires (provided that appropriate .po files are available in &amp;lt;code&amp;gt;/opt/open-xchange/i18n&amp;lt;/code&amp;gt; directory) either a restart or executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool together with stop/start of the &amp;amp;quot;com.openexchange.i18n&amp;amp;quot; bundle.&lt;br /&gt;
&lt;br /&gt;
=== Scenarios' scope and order ===&lt;br /&gt;
&lt;br /&gt;
While the previously mentioned &amp;amp;quot;enabled&amp;amp;quot; attribute offers some kind of generic on/off switch, the properties outlined in this section allow defining the device-scope for a scenario and in which order/precedence they are offered to the client. Scope in terms of&lt;br /&gt;
&lt;br /&gt;
* For what devices (from the set of those specified by providers) are what scenarios in which order available and&lt;br /&gt;
* For which users they are available&lt;br /&gt;
&lt;br /&gt;
As explained above, each scenario specifies one or more type-compatible providers associated with it. In turn, each provider determines to which devices the scenario applies. In order to further control, which device and which users are allowed to access a certain scenario, there are appropriate options available in file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt;. Every option is fully [http://oxpedia.org/wiki/index.php?title=ConfigCascade ''config-cascade''] aware and therefore can be controlled on a global, per context set, per context and per user basis.&lt;br /&gt;
&lt;br /&gt;
Thus, to make a scenario available for certain devices (as dictated by scenario’s providers) and for users as well, the scenario identifier needs to be added to the appropriate properties ending with &amp;amp;quot;.scenarios&amp;amp;quot; (for devices) and added to the &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property (for user) as well.&lt;br /&gt;
&lt;br /&gt;
The following properties accept a comma-separated list of scenario identifiers. The order of listed scenarios reflects the order in which they are offered to the client&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.mac.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.ipad.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.windows.desktop.scenarios&lt;br /&gt;
&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios=mailappinstall, driveappinstall, eassync, mailsync, davsync&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This exemplary setting specifies that Mail App, Drive App, EAS, Native Mail (IMAP/SMTP) and CalDAV/CardDAV are available in given order for iPhone devices.&lt;br /&gt;
&lt;br /&gt;
Once a scenario is made accessible through configuration it is visible to users trying to perform a client onboarding using one of associated devices. However, whether a user is effectively allowed to execute that scenario is determined by the required capabilities of the denoted providers; if not allowed it gets displayed as an upsell opportunity.&lt;br /&gt;
&lt;br /&gt;
=== Configuring actions ===&lt;br /&gt;
&lt;br /&gt;
The type for a scenario determines what actions are associated with it to &amp;amp;quot;''transport''&amp;amp;quot; the onboarding information to the client. The types &amp;amp;quot;manual&amp;amp;quot; and &amp;amp;quot;link&amp;amp;quot; only show static information like displaying a link. In contrast the type &amp;amp;quot;plist&amp;amp;quot; allows several actions to transport the configuration profile onto the client. Thereof&lt;br /&gt;
&lt;br /&gt;
* E-Mail&lt;br /&gt;
* SMS&lt;br /&gt;
&lt;br /&gt;
In order to utilize the &amp;amp;quot;E-Mail&amp;amp;quot; action, a special transport must be configured for system-composed E-Mails [http://oxpedia.org/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode#Share_Notifications ''as it is for using the sharing functionality'']. This transport is configured in noreply.properties. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
&lt;br /&gt;
Using the SMS action requires an according implementation being available. OX App Suite comes with an optional sipgate implementation. Please check [http://oxpedia.org/wiki/index.php?title=AppSuite:SMS_Sipgate ''this documentation''] how to setup App Suite accordingly.&lt;br /&gt;
&lt;br /&gt;
==== Implementing your own SMS gateway ====&lt;br /&gt;
&lt;br /&gt;
To use an SMS gateway other than sipgate, you can provide your own implementation. Therefore the Java interface &amp;lt;code&amp;gt;com.openexchange.sms.SMSServiceSPI&amp;lt;/code&amp;gt; needs to be implemented and published as an OSGi service. For parsing phone numbers provided by users &amp;lt;code&amp;gt;com.openexchange.sms.PhoneNumberParserService&amp;lt;/code&amp;gt; can be used. That one is also available as an OSGi service and can be tracked accordingly. You can have a look at bundle &amp;lt;code&amp;gt;com.openexchange.sms.sipgate&amp;lt;/code&amp;gt; as implementation reference.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' You must not install the &amp;lt;code&amp;gt;open-xchange-sms-sipgate&amp;lt;/code&amp;gt; package if you provide your own implementation.&lt;br /&gt;
&lt;br /&gt;
==== PLIST-signing ====&lt;br /&gt;
Scenarios of type &amp;amp;quot;plist&amp;amp;quot; require having PLIST-signing enabled. Otherwise the device will show a warning when importing a received PLIST configuration profile. Please follow the instructions as outlined in [http://oxpedia.org/wiki/index.php?title=AppSuite:PList_signing ''this article''] how to enable and configure signing for PLIST files.&lt;br /&gt;
&lt;br /&gt;
== Adding custom scenarios ==&lt;br /&gt;
&lt;br /&gt;
The first thing to do, is to add an appropriate scenario configuration to the 'client-onboarding-scenarios.yml' file; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;link:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;image: http://my.fine.host/image001.png&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next step is to make that scenario accessible through adapting 'client-onboarding.properties' file. Hence, the scenario identifier needs to be added to the devices, to which it applies (Android devices in this case):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios=..., mygoogleapp&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Furthermore, that scenario needs to be made accessible to users as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
At last, a .pot file is supposed to be generated from the translatable strings using /opt/open-xchange/sbin/parsei18nyaml command-line tool to yield the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Provided that target users do hold appropriate capabilities, they are allowed to execute that scenario. In the example above the &amp;amp;quot;app&amp;amp;quot; provider is specified, which does no require any capabilities. Hence, that scenario is available.&lt;br /&gt;
&lt;br /&gt;
== HowTos ==&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly setup a default/test configuration ? ===&lt;br /&gt;
&lt;br /&gt;
# Install open-xchange-client-onboarding package&lt;br /&gt;
# Edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; and set &amp;lt;code&amp;gt;com.openexchange.client.onboarding.enabled&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Edit &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt; to enable autoconfig sending via email. PS: Have a fully working smtp login available like “noreply@yourdomain.tld”&lt;br /&gt;
# Edit client-onboarding-scenarios.yml and set “enable” for : “driveappinstall” , “davsync” “davmanual” “mailsync” “mailmanual” to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Now set the correct caldav/carddav server FQDNs in the corresponding files for your setup&lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; &lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
# Restart OX process&lt;br /&gt;
# Login to AppSuite. Click on Settings - Connect your device&lt;br /&gt;
# Verify that you have following onboarding options available: &lt;br /&gt;
#* windows -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; drive app &lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; details for dav setup&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; drive app&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; drive app&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly disable a certain scenario ===&lt;br /&gt;
&lt;br /&gt;
Simply enter the 'client-onboarding-scenarios.yml' file and go to the section specifying the target scenario. Switch the 'enabled' flag to &amp;amp;quot;false&amp;amp;quot; and execute /opt/open-xchange/sbin/reloadconfiguration command-line tool.&lt;br /&gt;
&lt;br /&gt;
E.g. to disable the OX Drive App:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_3.png]]&lt;br /&gt;
&lt;br /&gt;
=== How can I disable the outdated ui parts like 'Downloads'? ===&lt;br /&gt;
&lt;br /&gt;
The wizard replaces and extends the functionality of the old Download Section in settings and the corresponding widgets. We recommend to disable these outdated parts:&lt;br /&gt;
# widget: get ox drive&lt;br /&gt;
# widget: update&lt;br /&gt;
# settings entry: downloads&lt;br /&gt;
&lt;br /&gt;
'''Remove settings section 'Downloads' '''&lt;br /&gt;
&lt;br /&gt;
Edit ''/opt/open-xchange/etc/settings/appsuite.properties'' and add or change the value to true:&lt;br /&gt;
* ''io.ox/core//settings/downloadsDisabled''&lt;br /&gt;
&lt;br /&gt;
'''Remove widgets'''&lt;br /&gt;
&lt;br /&gt;
To remove the both related portal widget/tiles please refer to the&lt;br /&gt;
[[AppSuite:Configuring_portal_plugins#Disabling_a_tile_completely | portal plugins wiki page ]]&lt;br /&gt;
&lt;br /&gt;
* ''io.ox/portal/widget/oxdriveclients''&lt;br /&gt;
* ''io.ox/portal/widget/updater''&lt;br /&gt;
&lt;br /&gt;
=== How can I add my own App? ===&lt;br /&gt;
&lt;br /&gt;
Provided that the App is accessible by a link (pointing to a commercial App Store or to a downloadable executable/installer), the generic &amp;amp;quot;app&amp;amp;quot; is the suitable provider to choose.&lt;br /&gt;
&lt;br /&gt;
Hence, an appropriate section is supposed to be added to the 'client-onboarding-scenarios.yml' file having a unique name and &amp;amp;quot;provider&amp;amp;quot; attribute set to &amp;amp;quot;[app]&amp;amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The attribute &amp;amp;quot;type&amp;amp;quot; needs to be set to &amp;amp;quot;link&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The attribute &amp;amp;quot;link&amp;amp;quot; should be configured with:&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;url&amp;amp;quot; sub-attribute containing the actual link pointing to the URL location&lt;br /&gt;
* &amp;amp;quot;type&amp;amp;quot; sub-attribute specifying of what type that link is: either &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macappstore&amp;amp;quot;, &amp;amp;quot;playstore&amp;amp;quot; or &amp;amp;quot;common&amp;amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
The type &amp;amp;quot;common&amp;amp;quot; is supposed to be used for links that do not point to a commercial App Store, but to a downloadable executable/installer file.&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;quot;icon&amp;amp;quot; attribute is supposed to contain a comma-separated list of Font Awesome icons (only the ones from v4.4.0 are currently supported) that represent the App; e.g.&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;fa-cloud&amp;amp;quot; for Drive/file-related nature&lt;br /&gt;
* &amp;amp;quot;fa-calendar, fa-users&amp;amp;quot; for Calendar and Address Book synchronization&lt;br /&gt;
* &amp;amp;quot;fa-envelope-o&amp;amp;quot; for Mail nature&lt;br /&gt;
&lt;br /&gt;
Next, the translatable display name and description should be set through setting the attributes &amp;amp;quot;displayName_t10e&amp;amp;quot; and &amp;amp;quot;description_t10e&amp;amp;quot;. As described previously, executing the /opt/open-xchange/sbin/parsei18nyaml command-line tool yields an appropriate .pot file, which can then be used for generating the individual .po file for the different translations.&lt;br /&gt;
&lt;br /&gt;
Finally, the 'client-onboarding.properties' file needs to be modified to specify the &amp;amp;quot;scope&amp;amp;quot; for that new scenario. Add the scenario’s unique name to the appropriate device properties and add it to &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property as well.&lt;br /&gt;
&lt;br /&gt;
After executing /opt/open-xchange/sbin/reloadconfiguration command-line tool the new client onboarding scenario is available for the selected users/devices.&lt;br /&gt;
&lt;br /&gt;
=== How can I upsell my own app? ===&lt;br /&gt;
&lt;br /&gt;
Having the same prerequisites/steps as for &amp;amp;quot;How can I add my own App?&amp;amp;quot; the scenario description in the 'client-onboarding-scenarios.yml' file simply needs to be extended by the desired capabilities, which are supposed to be used for managing the upsell.&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 '''capabilities: &amp;amp;quot;mygoogleapp_capability&amp;amp;quot;'''&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The special &amp;amp;quot;capabilities&amp;amp;quot; attribute is only supported for scenarios of type &amp;amp;quot;link&amp;amp;quot; with the special &amp;amp;quot;app&amp;amp;quot; provider.&lt;br /&gt;
&lt;br /&gt;
With such a &amp;amp;quot;capabilities&amp;amp;quot; attribute only users, which have the &amp;amp;quot;mygoogleapp_capability&amp;amp;quot; capability are allowed to get the link. For those who don’t, the upsell opportunity will be displayed; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[[File:onboarding_4.png]]&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23111</id>
		<title>AppSuite:Client Onboarding</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23111"/>
		<updated>2017-03-15T09:11:41Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Adding custom scenarios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Client Onboarding&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.1}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Configuration guide for Open-Xchange Client Onboarding =&lt;br /&gt;
&lt;br /&gt;
With Open-Xchange Server v7.8.1 a new module is added allowing users to integrate several different clients and devices with Open-Xchange; such as providing a link to a commercial App Store to install certain apps on mobile devices.&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with several built-in providers; thereof&lt;br /&gt;
&lt;br /&gt;
* CalDAV&lt;br /&gt;
* CardDAV&lt;br /&gt;
* OX Mail App&lt;br /&gt;
* OX Drive App&lt;br /&gt;
* Connector for Microsoft Outlook®&lt;br /&gt;
* Sync App for Android&lt;br /&gt;
* Microsoft ActiveSync&lt;br /&gt;
* eM Client&lt;br /&gt;
* Mail (IMAP/SMTP)&lt;br /&gt;
* Generic Mobile App provider&lt;br /&gt;
&lt;br /&gt;
Those providers allow accessing and/or synchronizing with certain data held by Open-Xchange on a supported device.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
To install the Client Onboarding module, the package open-xchange-client-onboarding needs to be installed.&lt;br /&gt;
&lt;br /&gt;
Moreover the property &amp;lt;code&amp;gt;&amp;quot;com.openexchange.client.onboarding.enabled&amp;quot;&amp;lt;/code&amp;gt;; in installed file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; needs to be set to &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; (default). So getting rid off the entire client on-boarding module simply requires setting the mentioned property to &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; (and executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool).&lt;br /&gt;
&lt;br /&gt;
== Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
The way to specify what and how a certain device is able to get “on-boarded” is mainly determined by so called scenarios. A scenario describes what gets deployed using which providers that contribute their onboarding possibilities and how it is made accessible to the client’s device.&lt;br /&gt;
&lt;br /&gt;
A scenario consists of the following configuration attributes/options&lt;br /&gt;
&lt;br /&gt;
* A unique scenario identifier&lt;br /&gt;
* A flag determining if scenario is enabled or not. If set to 'false' the scenario will not be available, useful for testing/enabling the scenario later on&lt;br /&gt;
* A scenario type, which is one of &amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, or &amp;amp;quot;link&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;plist&amp;amp;quot; for generating a PLIST configuration file for iOS and OSX devices,&lt;br /&gt;
** &amp;amp;quot;manual&amp;amp;quot; for a description for the user for a manual set-up/configuration&lt;br /&gt;
** &amp;amp;quot;link&amp;amp;quot; for a link/URL to either Apple App Store / Google Play Store or to downloadable executable&lt;br /&gt;
* The &amp;amp;quot;link&amp;amp;quot; attribute, which is only considered it type is set to &amp;amp;quot;link&amp;amp;quot;. That attribute consists of the sub-attributes &amp;amp;quot;url&amp;amp;quot; and &amp;amp;quot;type&amp;amp;quot;.&lt;br /&gt;
** &amp;amp;quot;url&amp;amp;quot; provides the actual link/URL to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. For specifying a property that provides the actual link, please use special &amp;amp;quot;property&amp;amp;quot; scheme; e.g. &amp;amp;quot;property://com.openexchange.client.onboarding.app.mylink&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;type&amp;amp;quot; indicates if &amp;amp;quot;url&amp;amp;quot; holds a link for either Apple App Store, Apple Mac Store or Google Play Store. Must only be specified in case &amp;amp;quot;url&amp;amp;quot; points either of those commercial stores. Supported values are &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macstore&amp;amp;quot; and &amp;amp;quot;playstore&amp;amp;quot;&lt;br /&gt;
* The identifiers for the providers, which contribute to the scenario;&amp;lt;br /&amp;gt;&lt;br /&gt;
please check command-line tool &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; to check, which ones are available&lt;br /&gt;
* The identifiers for alternative scenarios. This is typically used to provide alternative manual setup possibility.&lt;br /&gt;
* The comma-separated names of Font Awesome icons that are supposed to be displayed for the scenario&amp;lt;br /&amp;gt;&lt;br /&gt;
(only the ones from v4.4.0 are currently supported)&lt;br /&gt;
* The translatable display name; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
* The translatable description; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
&lt;br /&gt;
== Onboarding providers ==&lt;br /&gt;
&lt;br /&gt;
As described in the previous section, a scenario specifies what providers contribute to it. A provider represents a certain App or (synchronization) protocol that a device can install, download and/or communicate with.&lt;br /&gt;
&lt;br /&gt;
Moreover a provider specifies what Onboarding types are supported (&amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, and/or &amp;amp;quot;link&amp;amp;quot;). Hence, once a provider is chosen to contribute to a certain scenario, the supported on-boarding type needs to match the one of the scenario itself. E.g. a scenario, which indicates to be of type &amp;amp;quot;link&amp;amp;quot;, will always fail if the associated provider signals to support types &amp;amp;quot;plist&amp;amp;quot; and &amp;amp;quot;manual&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To check what providers are available on your system, please execute the &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; command-line tool, which outputs something like:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_1.png]]&lt;br /&gt;
&lt;br /&gt;
Each provider might require one or more capabilities/permissions to be available for the requesting user. If capabilities/permissions are not satisfied, the associated scenario cannot be applied, but will be displayed to the user for upsell opportunities.&lt;br /&gt;
&lt;br /&gt;
=== Generic Onboarding provider for Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic onboarding provider for apps allows specifying custom scenarios of type &amp;amp;quot;link&amp;amp;quot; for arbitrary links/URLs pointing to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. The link can be set directly or via a property.&lt;br /&gt;
&lt;br /&gt;
This provider requires no capability/permission.&lt;br /&gt;
&lt;br /&gt;
An exemplary section in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file might look like (check &amp;amp;quot;Configuring Onboarding scenarios&amp;amp;quot; chapter for more details):&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== CalDAV/CardDAV ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;caldav&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;carddav&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order for a scenario (having CalDAV/CardDAV in its provider listing) to be executable by a user, the &amp;amp;quot;caldav&amp;amp;quot; capability and &amp;amp;quot;carddav&amp;amp;quot; capability respectively are required.&lt;br /&gt;
&lt;br /&gt;
Moreover, the appropriate *DAV end-points are supposed to be configured through property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.caldav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; file and property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.carddav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
=== Drive/Mail Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;driveapp&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;mailapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open-Xchange ships with built-in providers for Drive App and Mail App. The Drive-associated providers do require the &amp;amp;quot;drive&amp;amp;quot; capability and the Mail App requires the &amp;amp;quot;mobile_mail_app&amp;amp;quot; one.&lt;br /&gt;
&lt;br /&gt;
The appropriate links to the apps in the corresponding stores are configured in associated .properties files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-driveapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-mailapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default the links to the official apps are set, but may be changed to ones for branded versions.&lt;br /&gt;
&lt;br /&gt;
=== Drive Windows Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;drivewindowsclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the windows Drive Client. Requires the &amp;amp;quot;drive&amp;amp;quot; capability, but has no configuration options. However, this provider requires the &amp;amp;quot;open-xchange-drive-client-windows&amp;amp;quot; and the orderly configured binaries (e.g. through installing appropriate package according to the brand).&lt;br /&gt;
&lt;br /&gt;
Please check [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_Drive#OX_Drive_for_Windows ''this''] documentation for more details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === eM Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;emclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the eM Client needs the &amp;amp;quot;emclient&amp;amp;quot; capability.&lt;br /&gt;
&lt;br /&gt;
Allows to configure the URL pointing to the executable file through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.emclient.url&amp;lt;/code&amp;gt; in file 'client-onboarding-emclient.properties' file.&lt;br /&gt;
&lt;br /&gt;
=== Sync App ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;syncapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the Sync App for Android. Requires &amp;amp;quot;caldav&amp;amp;quot; and &amp;amp;quot;carddav&amp;amp;quot; capabilities.&lt;br /&gt;
&lt;br /&gt;
The link to Google Play Store is specified via property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.syncapp.store.google.playstore&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-syncapp.properties&amp;lt;/code&amp;gt; file. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mail (IMAP/SMTP) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for deploying the IMAP/STMP account on target device using native/stock mail app. All IMAP/SMTP related settings are settable in file 'client-onboarding-mail.properties'.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft ActiveSync (EAS) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configures the ActiveSync account on target device. Allows specifying the EAS end-point through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.eas.url&amp;lt;/code&amp;gt; property in 'client-onboarding-eas.properties'.&lt;br /&gt;
&lt;br /&gt;
=== OX Updater ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider offering the download for the OX Client Updater ([http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''http:''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''//oxpedia''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''org/wiki/index''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''php''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''?''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''title=AppSuite''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater '':''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''Open-Xchange_Updater'']). The provider is available as soon as the according package is installed and at least one product can be installed/updated via it by the user. A pre-configured scenario 'oxupdaterinstall' is already contained in &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuring Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
Onboarding scenarios are configured through the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Each scenario starts with its own &amp;amp;quot;section&amp;amp;quot; in that YAML file by typing its unique identifier. All further attributes as outlined in chapter &amp;amp;quot;Onboarding scenarios&amp;amp;quot; are nested below that identifier.&lt;br /&gt;
&lt;br /&gt;
=== Easily enabling/disabling scenarios ===&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with a set of pre-defined scenarios that might apply to the most common installations. Each scenario can easily be enabled/disabled through its &amp;amp;quot;enabled&amp;amp;quot; Boolean attribute in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool applies the changes without the need for restart.&lt;br /&gt;
&lt;br /&gt;
=== Translatable strings ===&lt;br /&gt;
&lt;br /&gt;
Those attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; refer to localizable strings and are placed into &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file. Once such attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; are changed/customized and/or added, the appropriate &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file needs to be re-created in order to get translated. For generating that &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file, please execute the /opt/open-xchange/sbin/parsei18nyaml command-line tool. That .pot file needs then be turned to the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Thus changing any of the attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; requires (provided that appropriate .po files are available in &amp;lt;code&amp;gt;/opt/open-xchange/i18n&amp;lt;/code&amp;gt; directory) either a restart or executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool together with stop/start of the &amp;amp;quot;com.openexchange.i18n&amp;amp;quot; bundle.&lt;br /&gt;
&lt;br /&gt;
=== Scenarios' scope and order ===&lt;br /&gt;
&lt;br /&gt;
While the previously mentioned &amp;amp;quot;enabled&amp;amp;quot; attribute offers some kind of generic on/off switch, the properties outlined in this section allow defining the device-scope for a scenario and in which order/precedence they are offered to the client. Scope in terms of&lt;br /&gt;
&lt;br /&gt;
* For what devices (from the set of those specified by providers) are what scenarios in which order available and&lt;br /&gt;
* For which users they are available&lt;br /&gt;
&lt;br /&gt;
As explained above, each scenario specifies one or more type-compatible providers associated with it. In turn, each provider determines to which devices the scenario applies. In order to further control, which device and which users are allowed to access a certain scenario, there are appropriate options available in file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt;. Every option is fully [http://oxpedia.org/wiki/index.php?title=ConfigCascade ''config-cascade''] aware and therefore can be controlled on a global, per context set, per context and per user basis.&lt;br /&gt;
&lt;br /&gt;
Thus, to make a scenario available for certain devices (as dictated by scenario’s providers) and for users as well, the scenario identifier needs to be added to the appropriate properties ending with &amp;amp;quot;.scenarios&amp;amp;quot; (for devices) and added to the &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property (for user) as well.&lt;br /&gt;
&lt;br /&gt;
The following properties accept a comma-separated list of scenario identifiers. The order of listed scenarios reflects the order in which they are offered to the client&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.mac.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.ipad.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.windows.desktop.scenarios&lt;br /&gt;
&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios=mailappinstall, driveappinstall, eassync, mailsync, davsync&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This exemplary setting specifies that Mail App, Drive App, EAS, Native Mail (IMAP/SMTP) and CalDAV/CardDAV are available in given order for iPhone devices.&lt;br /&gt;
&lt;br /&gt;
Once a scenario is made accessible through configuration it is visible to users trying to perform a client onboarding using one of associated devices. However, whether a user is effectively allowed to execute that scenario is determined by the required capabilities of the denoted providers; if not allowed it gets displayed as an upsell opportunity.&lt;br /&gt;
&lt;br /&gt;
=== Configuring actions ===&lt;br /&gt;
&lt;br /&gt;
The type for a scenario determines what actions are associated with it to &amp;amp;quot;''transport''&amp;amp;quot; the onboarding information to the client. The types &amp;amp;quot;manual&amp;amp;quot; and &amp;amp;quot;link&amp;amp;quot; only show static information like displaying a link. In contrast the type &amp;amp;quot;plist&amp;amp;quot; allows several actions to transport the configuration profile onto the client. Thereof&lt;br /&gt;
&lt;br /&gt;
* E-Mail&lt;br /&gt;
* SMS&lt;br /&gt;
&lt;br /&gt;
In order to utilize the &amp;amp;quot;E-Mail&amp;amp;quot; action, a special transport must be configured for system-composed E-Mails [http://oxpedia.org/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode#Share_Notifications ''as it is for using the sharing functionality'']. This transport is configured in noreply.properties. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
&lt;br /&gt;
Using the SMS action requires an according implementation being available. OX App Suite comes with an optional sipgate implementation. Please check [http://oxpedia.org/wiki/index.php?title=AppSuite:SMS_Sipgate ''this documentation''] how to setup App Suite accordingly.&lt;br /&gt;
&lt;br /&gt;
==== Implementing your own SMS gateway ====&lt;br /&gt;
&lt;br /&gt;
To use an SMS gateway other than sipgate, you can provide your own implementation. Therefore the Java interface &amp;lt;code&amp;gt;com.openexchange.sms.SMSServiceSPI&amp;lt;/code&amp;gt; needs to be implemented and published as an OSGi service. For parsing phone numbers provided by users &amp;lt;code&amp;gt;com.openexchange.sms.PhoneNumberParserService&amp;lt;/code&amp;gt; can be used. That one is also available as an OSGi service and can be tracked accordingly. You can have a look at bundle &amp;lt;code&amp;gt;com.openexchange.sms.sipgate&amp;lt;/code&amp;gt; as implementation reference.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' You must not install the &amp;lt;code&amp;gt;open-xchange-sms-sipgate&amp;lt;/code&amp;gt; package if you provide your own implementation.&lt;br /&gt;
&lt;br /&gt;
==== PLIST-signing ====&lt;br /&gt;
Scenarios of type &amp;amp;quot;plist&amp;amp;quot; require having PLIST-signing enabled. Otherwise the device will show a warning when importing a received PLIST configuration profile. Please follow the instructions as outlined in [http://oxpedia.org/wiki/index.php?title=AppSuite:PList_signing ''this article''] how to enable and configure signing for PLIST files.&lt;br /&gt;
&lt;br /&gt;
== Adding custom scenarios ==&lt;br /&gt;
&lt;br /&gt;
The first thing to do, is to add an appropriate scenario configuration to the 'client-onboarding-scenarios.yml' file; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;link:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;image: http://my.fine.host/image001.png&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next step is to make that scenario accessible through adapting 'client-onboarding.properties' file. Hence, the scenario identifier needs to be added to the devices, to which it applies (Android devices in this case):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios=..., mygoogleapp&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Furthermore, that scenario needs to be made accessible to users as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
At last, a .pot file is supposed to be generated from the translatable strings using /opt/open-xchange/sbin/parsei18nyaml command-line tool to yield the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Provided that target users do hold appropriate capabilities, they are allowed to execute that scenario. In the example above the &amp;amp;quot;app&amp;amp;quot; provider is specified, which does no require any capabilities. Hence, that scenario is available.&lt;br /&gt;
&lt;br /&gt;
== HowTos ==&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly setup a default/test configuration ? ===&lt;br /&gt;
&lt;br /&gt;
# Install open-xchange-client-onboarding package&lt;br /&gt;
# Edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; and set &amp;lt;code&amp;gt;com.openexchange.client.onboarding.enabled&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Edit &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt; to enable autoconfig sending via email. PS: Have a fully working smtp login available like “noreply@yourdomain.tld”&lt;br /&gt;
# Edit client-onboarding-scenarios.yml and set “enable” for : “driveappinstall” , “davsync” “davmanual” “mailsync” “mailmanual” to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Now set the correct caldav/carddav server FQDNs in the corresponding files for your setup&lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; &lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
# Restart OX process&lt;br /&gt;
# Login to AppSuite. Click on Settings - Connect your device&lt;br /&gt;
# Verify that you have following onboarding options available: &lt;br /&gt;
#* windows -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; drive app &lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; details for dav setup&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; drive app&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; drive app&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly disable a certain scenario ===&lt;br /&gt;
&lt;br /&gt;
Simply enter the 'client-onboarding-scenarios.yml' file and go to the section specifying the target scenario. Switch the 'enabled' flag to &amp;amp;quot;false&amp;amp;quot; and execute /opt/open-xchange/sbin/reloadconfiguration command-line tool.&lt;br /&gt;
&lt;br /&gt;
E.g. to disable the OX Drive App:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_3.png]]&lt;br /&gt;
&lt;br /&gt;
=== How can I disable the outdated ui parts like 'Downloads'? ===&lt;br /&gt;
&lt;br /&gt;
The wizard replaces and extends the functionality of the old Download Section in settings and the corresponding widgets. We recommend to disable these outdated parts:&lt;br /&gt;
# widget: get ox drive&lt;br /&gt;
# widget: update&lt;br /&gt;
# settings entry: downloads&lt;br /&gt;
&lt;br /&gt;
'''Remove settings section 'Downloads' '''&lt;br /&gt;
&lt;br /&gt;
Edit ''/opt/open-xchange/etc/settings/appsuite.properties'' and add or change the value to true:&lt;br /&gt;
* ''io.ox/core//settings/downloadsDisabled''&lt;br /&gt;
&lt;br /&gt;
'''Remove widgets'''&lt;br /&gt;
&lt;br /&gt;
To remove the both related portal widget/tiles please refer to the&lt;br /&gt;
[[AppSuite:Configuring_portal_plugins#Disabling_a_tile_completely | portal plugins wiki page ]]&lt;br /&gt;
&lt;br /&gt;
* ''io.ox/portal/widget/oxdriveclients''&lt;br /&gt;
* ''io.ox/portal/widget/updater''&lt;br /&gt;
&lt;br /&gt;
=== How can I add my own App? ===&lt;br /&gt;
&lt;br /&gt;
Provided that the App is accessible by a link (pointing to a commercial App Store or to a downloadable executable/installer), the generic &amp;amp;quot;app&amp;amp;quot; is the suitable provider to choose.&lt;br /&gt;
&lt;br /&gt;
Hence, an appropriate section is supposed to be added to the 'client-onboarding-scenarios.yml' file having a unique name and &amp;amp;quot;provider&amp;amp;quot; attribute set to &amp;amp;quot;[app]&amp;amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The attribute &amp;amp;quot;type&amp;amp;quot; needs to be set to &amp;amp;quot;link&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The attribute &amp;amp;quot;link&amp;amp;quot; should be configured with:&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;url&amp;amp;quot; sub-attribute containing the actual link pointing to the URL location&lt;br /&gt;
* &amp;amp;quot;type&amp;amp;quot; sub-attribute specifying of what type that link is: either &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macappstore&amp;amp;quot;, &amp;amp;quot;playstore&amp;amp;quot; or &amp;amp;quot;common&amp;amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
The type &amp;amp;quot;common&amp;amp;quot; is supposed to be used for links that do not point to a commercial App Store, but to a downloadable executable/installer file.&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;quot;icon&amp;amp;quot; attribute is supposed to contain a comma-separated list of Font Awesome icons (only the ones from v4.4.0 are currently supported) that represent the App; e.g.&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;fa-cloud&amp;amp;quot; for Drive/file-related nature&lt;br /&gt;
* &amp;amp;quot;fa-calendar, fa-users&amp;amp;quot; for Calendar and Address Book synchronization&lt;br /&gt;
* &amp;amp;quot;fa-envelope-o&amp;amp;quot; for Mail nature&lt;br /&gt;
&lt;br /&gt;
Next, the translatable display name and description should be set through setting the attributes &amp;amp;quot;displayName_t10e&amp;amp;quot; and &amp;amp;quot;description_t10e&amp;amp;quot;. As described previously, executing the /opt/open-xchange/sbin/parsei18nyaml command-line tool yields an appropriate .pot file, which can then be used for generating the individual .po file for the different translations.&lt;br /&gt;
&lt;br /&gt;
Finally, the 'client-onboarding.properties' file needs to be modified to specify the &amp;amp;quot;scope&amp;amp;quot; for that new scenario. Add the scenario’s unique name to the appropriate device properties and add it to &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property as well.&lt;br /&gt;
&lt;br /&gt;
After executing /opt/open-xchange/sbin/reloadconfiguration command-line tool the new client onboarding scenario is available for the selected users/devices.&lt;br /&gt;
&lt;br /&gt;
=== How can I upsell my own app? ===&lt;br /&gt;
&lt;br /&gt;
Having the same prerequisites/steps as for &amp;amp;quot;How can I add my own App?&amp;amp;quot; the scenario description in the 'client-onboarding-scenarios.yml' file simply needs to be extended by the desired capabilities, which are supposed to be used for managing the upsell.&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 '''capabilities: &amp;amp;quot;mygoogleapp_capability&amp;amp;quot;'''&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The special &amp;amp;quot;capabilities&amp;amp;quot; attribute is only supported for scenarios of type &amp;amp;quot;link&amp;amp;quot; with the special &amp;amp;quot;app&amp;amp;quot; provider.&lt;br /&gt;
&lt;br /&gt;
With such a &amp;amp;quot;capabilities&amp;amp;quot; attribute only users, which have the &amp;amp;quot;mygoogleapp_capability&amp;amp;quot; capability are allowed to get the link. For those who don’t, the upsell opportunity will be displayed; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[[File:onboarding_4.png]]&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23110</id>
		<title>AppSuite:Client Onboarding</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23110"/>
		<updated>2017-03-15T09:11:25Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Adding custom scenarios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Client Onboarding&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.1}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Configuration guide for Open-Xchange Client Onboarding =&lt;br /&gt;
&lt;br /&gt;
With Open-Xchange Server v7.8.1 a new module is added allowing users to integrate several different clients and devices with Open-Xchange; such as providing a link to a commercial App Store to install certain apps on mobile devices.&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with several built-in providers; thereof&lt;br /&gt;
&lt;br /&gt;
* CalDAV&lt;br /&gt;
* CardDAV&lt;br /&gt;
* OX Mail App&lt;br /&gt;
* OX Drive App&lt;br /&gt;
* Connector for Microsoft Outlook®&lt;br /&gt;
* Sync App for Android&lt;br /&gt;
* Microsoft ActiveSync&lt;br /&gt;
* eM Client&lt;br /&gt;
* Mail (IMAP/SMTP)&lt;br /&gt;
* Generic Mobile App provider&lt;br /&gt;
&lt;br /&gt;
Those providers allow accessing and/or synchronizing with certain data held by Open-Xchange on a supported device.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
To install the Client Onboarding module, the package open-xchange-client-onboarding needs to be installed.&lt;br /&gt;
&lt;br /&gt;
Moreover the property &amp;lt;code&amp;gt;&amp;quot;com.openexchange.client.onboarding.enabled&amp;quot;&amp;lt;/code&amp;gt;; in installed file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; needs to be set to &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; (default). So getting rid off the entire client on-boarding module simply requires setting the mentioned property to &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; (and executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool).&lt;br /&gt;
&lt;br /&gt;
== Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
The way to specify what and how a certain device is able to get “on-boarded” is mainly determined by so called scenarios. A scenario describes what gets deployed using which providers that contribute their onboarding possibilities and how it is made accessible to the client’s device.&lt;br /&gt;
&lt;br /&gt;
A scenario consists of the following configuration attributes/options&lt;br /&gt;
&lt;br /&gt;
* A unique scenario identifier&lt;br /&gt;
* A flag determining if scenario is enabled or not. If set to 'false' the scenario will not be available, useful for testing/enabling the scenario later on&lt;br /&gt;
* A scenario type, which is one of &amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, or &amp;amp;quot;link&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;plist&amp;amp;quot; for generating a PLIST configuration file for iOS and OSX devices,&lt;br /&gt;
** &amp;amp;quot;manual&amp;amp;quot; for a description for the user for a manual set-up/configuration&lt;br /&gt;
** &amp;amp;quot;link&amp;amp;quot; for a link/URL to either Apple App Store / Google Play Store or to downloadable executable&lt;br /&gt;
* The &amp;amp;quot;link&amp;amp;quot; attribute, which is only considered it type is set to &amp;amp;quot;link&amp;amp;quot;. That attribute consists of the sub-attributes &amp;amp;quot;url&amp;amp;quot; and &amp;amp;quot;type&amp;amp;quot;.&lt;br /&gt;
** &amp;amp;quot;url&amp;amp;quot; provides the actual link/URL to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. For specifying a property that provides the actual link, please use special &amp;amp;quot;property&amp;amp;quot; scheme; e.g. &amp;amp;quot;property://com.openexchange.client.onboarding.app.mylink&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;type&amp;amp;quot; indicates if &amp;amp;quot;url&amp;amp;quot; holds a link for either Apple App Store, Apple Mac Store or Google Play Store. Must only be specified in case &amp;amp;quot;url&amp;amp;quot; points either of those commercial stores. Supported values are &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macstore&amp;amp;quot; and &amp;amp;quot;playstore&amp;amp;quot;&lt;br /&gt;
* The identifiers for the providers, which contribute to the scenario;&amp;lt;br /&amp;gt;&lt;br /&gt;
please check command-line tool &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; to check, which ones are available&lt;br /&gt;
* The identifiers for alternative scenarios. This is typically used to provide alternative manual setup possibility.&lt;br /&gt;
* The comma-separated names of Font Awesome icons that are supposed to be displayed for the scenario&amp;lt;br /&amp;gt;&lt;br /&gt;
(only the ones from v4.4.0 are currently supported)&lt;br /&gt;
* The translatable display name; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
* The translatable description; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
&lt;br /&gt;
== Onboarding providers ==&lt;br /&gt;
&lt;br /&gt;
As described in the previous section, a scenario specifies what providers contribute to it. A provider represents a certain App or (synchronization) protocol that a device can install, download and/or communicate with.&lt;br /&gt;
&lt;br /&gt;
Moreover a provider specifies what Onboarding types are supported (&amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, and/or &amp;amp;quot;link&amp;amp;quot;). Hence, once a provider is chosen to contribute to a certain scenario, the supported on-boarding type needs to match the one of the scenario itself. E.g. a scenario, which indicates to be of type &amp;amp;quot;link&amp;amp;quot;, will always fail if the associated provider signals to support types &amp;amp;quot;plist&amp;amp;quot; and &amp;amp;quot;manual&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To check what providers are available on your system, please execute the &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; command-line tool, which outputs something like:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_1.png]]&lt;br /&gt;
&lt;br /&gt;
Each provider might require one or more capabilities/permissions to be available for the requesting user. If capabilities/permissions are not satisfied, the associated scenario cannot be applied, but will be displayed to the user for upsell opportunities.&lt;br /&gt;
&lt;br /&gt;
=== Generic Onboarding provider for Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic onboarding provider for apps allows specifying custom scenarios of type &amp;amp;quot;link&amp;amp;quot; for arbitrary links/URLs pointing to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. The link can be set directly or via a property.&lt;br /&gt;
&lt;br /&gt;
This provider requires no capability/permission.&lt;br /&gt;
&lt;br /&gt;
An exemplary section in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file might look like (check &amp;amp;quot;Configuring Onboarding scenarios&amp;amp;quot; chapter for more details):&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== CalDAV/CardDAV ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;caldav&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;carddav&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order for a scenario (having CalDAV/CardDAV in its provider listing) to be executable by a user, the &amp;amp;quot;caldav&amp;amp;quot; capability and &amp;amp;quot;carddav&amp;amp;quot; capability respectively are required.&lt;br /&gt;
&lt;br /&gt;
Moreover, the appropriate *DAV end-points are supposed to be configured through property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.caldav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; file and property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.carddav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
=== Drive/Mail Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;driveapp&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;mailapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open-Xchange ships with built-in providers for Drive App and Mail App. The Drive-associated providers do require the &amp;amp;quot;drive&amp;amp;quot; capability and the Mail App requires the &amp;amp;quot;mobile_mail_app&amp;amp;quot; one.&lt;br /&gt;
&lt;br /&gt;
The appropriate links to the apps in the corresponding stores are configured in associated .properties files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-driveapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-mailapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default the links to the official apps are set, but may be changed to ones for branded versions.&lt;br /&gt;
&lt;br /&gt;
=== Drive Windows Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;drivewindowsclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the windows Drive Client. Requires the &amp;amp;quot;drive&amp;amp;quot; capability, but has no configuration options. However, this provider requires the &amp;amp;quot;open-xchange-drive-client-windows&amp;amp;quot; and the orderly configured binaries (e.g. through installing appropriate package according to the brand).&lt;br /&gt;
&lt;br /&gt;
Please check [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_Drive#OX_Drive_for_Windows ''this''] documentation for more details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === eM Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;emclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the eM Client needs the &amp;amp;quot;emclient&amp;amp;quot; capability.&lt;br /&gt;
&lt;br /&gt;
Allows to configure the URL pointing to the executable file through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.emclient.url&amp;lt;/code&amp;gt; in file 'client-onboarding-emclient.properties' file.&lt;br /&gt;
&lt;br /&gt;
=== Sync App ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;syncapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the Sync App for Android. Requires &amp;amp;quot;caldav&amp;amp;quot; and &amp;amp;quot;carddav&amp;amp;quot; capabilities.&lt;br /&gt;
&lt;br /&gt;
The link to Google Play Store is specified via property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.syncapp.store.google.playstore&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-syncapp.properties&amp;lt;/code&amp;gt; file. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mail (IMAP/SMTP) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for deploying the IMAP/STMP account on target device using native/stock mail app. All IMAP/SMTP related settings are settable in file 'client-onboarding-mail.properties'.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft ActiveSync (EAS) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configures the ActiveSync account on target device. Allows specifying the EAS end-point through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.eas.url&amp;lt;/code&amp;gt; property in 'client-onboarding-eas.properties'.&lt;br /&gt;
&lt;br /&gt;
=== OX Updater ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider offering the download for the OX Client Updater ([http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''http:''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''//oxpedia''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''org/wiki/index''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''php''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''?''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''title=AppSuite''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater '':''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''Open-Xchange_Updater'']). The provider is available as soon as the according package is installed and at least one product can be installed/updated via it by the user. A pre-configured scenario 'oxupdaterinstall' is already contained in &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuring Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
Onboarding scenarios are configured through the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Each scenario starts with its own &amp;amp;quot;section&amp;amp;quot; in that YAML file by typing its unique identifier. All further attributes as outlined in chapter &amp;amp;quot;Onboarding scenarios&amp;amp;quot; are nested below that identifier.&lt;br /&gt;
&lt;br /&gt;
=== Easily enabling/disabling scenarios ===&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with a set of pre-defined scenarios that might apply to the most common installations. Each scenario can easily be enabled/disabled through its &amp;amp;quot;enabled&amp;amp;quot; Boolean attribute in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool applies the changes without the need for restart.&lt;br /&gt;
&lt;br /&gt;
=== Translatable strings ===&lt;br /&gt;
&lt;br /&gt;
Those attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; refer to localizable strings and are placed into &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file. Once such attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; are changed/customized and/or added, the appropriate &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file needs to be re-created in order to get translated. For generating that &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file, please execute the /opt/open-xchange/sbin/parsei18nyaml command-line tool. That .pot file needs then be turned to the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Thus changing any of the attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; requires (provided that appropriate .po files are available in &amp;lt;code&amp;gt;/opt/open-xchange/i18n&amp;lt;/code&amp;gt; directory) either a restart or executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool together with stop/start of the &amp;amp;quot;com.openexchange.i18n&amp;amp;quot; bundle.&lt;br /&gt;
&lt;br /&gt;
=== Scenarios' scope and order ===&lt;br /&gt;
&lt;br /&gt;
While the previously mentioned &amp;amp;quot;enabled&amp;amp;quot; attribute offers some kind of generic on/off switch, the properties outlined in this section allow defining the device-scope for a scenario and in which order/precedence they are offered to the client. Scope in terms of&lt;br /&gt;
&lt;br /&gt;
* For what devices (from the set of those specified by providers) are what scenarios in which order available and&lt;br /&gt;
* For which users they are available&lt;br /&gt;
&lt;br /&gt;
As explained above, each scenario specifies one or more type-compatible providers associated with it. In turn, each provider determines to which devices the scenario applies. In order to further control, which device and which users are allowed to access a certain scenario, there are appropriate options available in file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt;. Every option is fully [http://oxpedia.org/wiki/index.php?title=ConfigCascade ''config-cascade''] aware and therefore can be controlled on a global, per context set, per context and per user basis.&lt;br /&gt;
&lt;br /&gt;
Thus, to make a scenario available for certain devices (as dictated by scenario’s providers) and for users as well, the scenario identifier needs to be added to the appropriate properties ending with &amp;amp;quot;.scenarios&amp;amp;quot; (for devices) and added to the &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property (for user) as well.&lt;br /&gt;
&lt;br /&gt;
The following properties accept a comma-separated list of scenario identifiers. The order of listed scenarios reflects the order in which they are offered to the client&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.mac.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.ipad.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.windows.desktop.scenarios&lt;br /&gt;
&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios=mailappinstall, driveappinstall, eassync, mailsync, davsync&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This exemplary setting specifies that Mail App, Drive App, EAS, Native Mail (IMAP/SMTP) and CalDAV/CardDAV are available in given order for iPhone devices.&lt;br /&gt;
&lt;br /&gt;
Once a scenario is made accessible through configuration it is visible to users trying to perform a client onboarding using one of associated devices. However, whether a user is effectively allowed to execute that scenario is determined by the required capabilities of the denoted providers; if not allowed it gets displayed as an upsell opportunity.&lt;br /&gt;
&lt;br /&gt;
=== Configuring actions ===&lt;br /&gt;
&lt;br /&gt;
The type for a scenario determines what actions are associated with it to &amp;amp;quot;''transport''&amp;amp;quot; the onboarding information to the client. The types &amp;amp;quot;manual&amp;amp;quot; and &amp;amp;quot;link&amp;amp;quot; only show static information like displaying a link. In contrast the type &amp;amp;quot;plist&amp;amp;quot; allows several actions to transport the configuration profile onto the client. Thereof&lt;br /&gt;
&lt;br /&gt;
* E-Mail&lt;br /&gt;
* SMS&lt;br /&gt;
&lt;br /&gt;
In order to utilize the &amp;amp;quot;E-Mail&amp;amp;quot; action, a special transport must be configured for system-composed E-Mails [http://oxpedia.org/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode#Share_Notifications ''as it is for using the sharing functionality'']. This transport is configured in noreply.properties. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
&lt;br /&gt;
Using the SMS action requires an according implementation being available. OX App Suite comes with an optional sipgate implementation. Please check [http://oxpedia.org/wiki/index.php?title=AppSuite:SMS_Sipgate ''this documentation''] how to setup App Suite accordingly.&lt;br /&gt;
&lt;br /&gt;
==== Implementing your own SMS gateway ====&lt;br /&gt;
&lt;br /&gt;
To use an SMS gateway other than sipgate, you can provide your own implementation. Therefore the Java interface &amp;lt;code&amp;gt;com.openexchange.sms.SMSServiceSPI&amp;lt;/code&amp;gt; needs to be implemented and published as an OSGi service. For parsing phone numbers provided by users &amp;lt;code&amp;gt;com.openexchange.sms.PhoneNumberParserService&amp;lt;/code&amp;gt; can be used. That one is also available as an OSGi service and can be tracked accordingly. You can have a look at bundle &amp;lt;code&amp;gt;com.openexchange.sms.sipgate&amp;lt;/code&amp;gt; as implementation reference.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' You must not install the &amp;lt;code&amp;gt;open-xchange-sms-sipgate&amp;lt;/code&amp;gt; package if you provide your own implementation.&lt;br /&gt;
&lt;br /&gt;
==== PLIST-signing ====&lt;br /&gt;
Scenarios of type &amp;amp;quot;plist&amp;amp;quot; require having PLIST-signing enabled. Otherwise the device will show a warning when importing a received PLIST configuration profile. Please follow the instructions as outlined in [http://oxpedia.org/wiki/index.php?title=AppSuite:PList_signing ''this article''] how to enable and configure signing for PLIST files.&lt;br /&gt;
&lt;br /&gt;
== Adding custom scenarios ==&lt;br /&gt;
&lt;br /&gt;
The first thing to do, is to add an appropriate scenario configuration to the 'client-onboarding-scenarios.yml' file; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;link:&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;&amp;amp;nbsp;image: http://my.fine.host/image001.png&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;amp;nbsp;description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next step is to make that scenario accessible through adapting 'client-onboarding.properties' file. Hence, the scenario identifier needs to be added to the devices, to which it applies (Android devices in this case):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios=..., mygoogleapp&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Furthermore, that scenario needs to be made accessible to users as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
At last, a .pot file is supposed to be generated from the translatable strings using /opt/open-xchange/sbin/parsei18nyaml command-line tool to yield the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Provided that target users do hold appropriate capabilities, they are allowed to execute that scenario. In the example above the &amp;amp;quot;app&amp;amp;quot; provider is specified, which does no require any capabilities. Hence, that scenario is available.&lt;br /&gt;
&lt;br /&gt;
== HowTos ==&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly setup a default/test configuration ? ===&lt;br /&gt;
&lt;br /&gt;
# Install open-xchange-client-onboarding package&lt;br /&gt;
# Edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; and set &amp;lt;code&amp;gt;com.openexchange.client.onboarding.enabled&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Edit &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt; to enable autoconfig sending via email. PS: Have a fully working smtp login available like “noreply@yourdomain.tld”&lt;br /&gt;
# Edit client-onboarding-scenarios.yml and set “enable” for : “driveappinstall” , “davsync” “davmanual” “mailsync” “mailmanual” to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Now set the correct caldav/carddav server FQDNs in the corresponding files for your setup&lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; &lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
# Restart OX process&lt;br /&gt;
# Login to AppSuite. Click on Settings - Connect your device&lt;br /&gt;
# Verify that you have following onboarding options available: &lt;br /&gt;
#* windows -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; drive app &lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; details for dav setup&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; drive app&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; drive app&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly disable a certain scenario ===&lt;br /&gt;
&lt;br /&gt;
Simply enter the 'client-onboarding-scenarios.yml' file and go to the section specifying the target scenario. Switch the 'enabled' flag to &amp;amp;quot;false&amp;amp;quot; and execute /opt/open-xchange/sbin/reloadconfiguration command-line tool.&lt;br /&gt;
&lt;br /&gt;
E.g. to disable the OX Drive App:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_3.png]]&lt;br /&gt;
&lt;br /&gt;
=== How can I disable the outdated ui parts like 'Downloads'? ===&lt;br /&gt;
&lt;br /&gt;
The wizard replaces and extends the functionality of the old Download Section in settings and the corresponding widgets. We recommend to disable these outdated parts:&lt;br /&gt;
# widget: get ox drive&lt;br /&gt;
# widget: update&lt;br /&gt;
# settings entry: downloads&lt;br /&gt;
&lt;br /&gt;
'''Remove settings section 'Downloads' '''&lt;br /&gt;
&lt;br /&gt;
Edit ''/opt/open-xchange/etc/settings/appsuite.properties'' and add or change the value to true:&lt;br /&gt;
* ''io.ox/core//settings/downloadsDisabled''&lt;br /&gt;
&lt;br /&gt;
'''Remove widgets'''&lt;br /&gt;
&lt;br /&gt;
To remove the both related portal widget/tiles please refer to the&lt;br /&gt;
[[AppSuite:Configuring_portal_plugins#Disabling_a_tile_completely | portal plugins wiki page ]]&lt;br /&gt;
&lt;br /&gt;
* ''io.ox/portal/widget/oxdriveclients''&lt;br /&gt;
* ''io.ox/portal/widget/updater''&lt;br /&gt;
&lt;br /&gt;
=== How can I add my own App? ===&lt;br /&gt;
&lt;br /&gt;
Provided that the App is accessible by a link (pointing to a commercial App Store or to a downloadable executable/installer), the generic &amp;amp;quot;app&amp;amp;quot; is the suitable provider to choose.&lt;br /&gt;
&lt;br /&gt;
Hence, an appropriate section is supposed to be added to the 'client-onboarding-scenarios.yml' file having a unique name and &amp;amp;quot;provider&amp;amp;quot; attribute set to &amp;amp;quot;[app]&amp;amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The attribute &amp;amp;quot;type&amp;amp;quot; needs to be set to &amp;amp;quot;link&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The attribute &amp;amp;quot;link&amp;amp;quot; should be configured with:&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;url&amp;amp;quot; sub-attribute containing the actual link pointing to the URL location&lt;br /&gt;
* &amp;amp;quot;type&amp;amp;quot; sub-attribute specifying of what type that link is: either &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macappstore&amp;amp;quot;, &amp;amp;quot;playstore&amp;amp;quot; or &amp;amp;quot;common&amp;amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
The type &amp;amp;quot;common&amp;amp;quot; is supposed to be used for links that do not point to a commercial App Store, but to a downloadable executable/installer file.&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;quot;icon&amp;amp;quot; attribute is supposed to contain a comma-separated list of Font Awesome icons (only the ones from v4.4.0 are currently supported) that represent the App; e.g.&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;fa-cloud&amp;amp;quot; for Drive/file-related nature&lt;br /&gt;
* &amp;amp;quot;fa-calendar, fa-users&amp;amp;quot; for Calendar and Address Book synchronization&lt;br /&gt;
* &amp;amp;quot;fa-envelope-o&amp;amp;quot; for Mail nature&lt;br /&gt;
&lt;br /&gt;
Next, the translatable display name and description should be set through setting the attributes &amp;amp;quot;displayName_t10e&amp;amp;quot; and &amp;amp;quot;description_t10e&amp;amp;quot;. As described previously, executing the /opt/open-xchange/sbin/parsei18nyaml command-line tool yields an appropriate .pot file, which can then be used for generating the individual .po file for the different translations.&lt;br /&gt;
&lt;br /&gt;
Finally, the 'client-onboarding.properties' file needs to be modified to specify the &amp;amp;quot;scope&amp;amp;quot; for that new scenario. Add the scenario’s unique name to the appropriate device properties and add it to &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property as well.&lt;br /&gt;
&lt;br /&gt;
After executing /opt/open-xchange/sbin/reloadconfiguration command-line tool the new client onboarding scenario is available for the selected users/devices.&lt;br /&gt;
&lt;br /&gt;
=== How can I upsell my own app? ===&lt;br /&gt;
&lt;br /&gt;
Having the same prerequisites/steps as for &amp;amp;quot;How can I add my own App?&amp;amp;quot; the scenario description in the 'client-onboarding-scenarios.yml' file simply needs to be extended by the desired capabilities, which are supposed to be used for managing the upsell.&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 '''capabilities: &amp;amp;quot;mygoogleapp_capability&amp;amp;quot;'''&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The special &amp;amp;quot;capabilities&amp;amp;quot; attribute is only supported for scenarios of type &amp;amp;quot;link&amp;amp;quot; with the special &amp;amp;quot;app&amp;amp;quot; provider.&lt;br /&gt;
&lt;br /&gt;
With such a &amp;amp;quot;capabilities&amp;amp;quot; attribute only users, which have the &amp;amp;quot;mygoogleapp_capability&amp;amp;quot; capability are allowed to get the link. For those who don’t, the upsell opportunity will be displayed; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[[File:onboarding_4.png]]&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23109</id>
		<title>AppSuite:Client Onboarding</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23109"/>
		<updated>2017-03-15T09:10:43Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Adding custom scenarios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Client Onboarding&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.1}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Configuration guide for Open-Xchange Client Onboarding =&lt;br /&gt;
&lt;br /&gt;
With Open-Xchange Server v7.8.1 a new module is added allowing users to integrate several different clients and devices with Open-Xchange; such as providing a link to a commercial App Store to install certain apps on mobile devices.&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with several built-in providers; thereof&lt;br /&gt;
&lt;br /&gt;
* CalDAV&lt;br /&gt;
* CardDAV&lt;br /&gt;
* OX Mail App&lt;br /&gt;
* OX Drive App&lt;br /&gt;
* Connector for Microsoft Outlook®&lt;br /&gt;
* Sync App for Android&lt;br /&gt;
* Microsoft ActiveSync&lt;br /&gt;
* eM Client&lt;br /&gt;
* Mail (IMAP/SMTP)&lt;br /&gt;
* Generic Mobile App provider&lt;br /&gt;
&lt;br /&gt;
Those providers allow accessing and/or synchronizing with certain data held by Open-Xchange on a supported device.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
To install the Client Onboarding module, the package open-xchange-client-onboarding needs to be installed.&lt;br /&gt;
&lt;br /&gt;
Moreover the property &amp;lt;code&amp;gt;&amp;quot;com.openexchange.client.onboarding.enabled&amp;quot;&amp;lt;/code&amp;gt;; in installed file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; needs to be set to &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; (default). So getting rid off the entire client on-boarding module simply requires setting the mentioned property to &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; (and executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool).&lt;br /&gt;
&lt;br /&gt;
== Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
The way to specify what and how a certain device is able to get “on-boarded” is mainly determined by so called scenarios. A scenario describes what gets deployed using which providers that contribute their onboarding possibilities and how it is made accessible to the client’s device.&lt;br /&gt;
&lt;br /&gt;
A scenario consists of the following configuration attributes/options&lt;br /&gt;
&lt;br /&gt;
* A unique scenario identifier&lt;br /&gt;
* A flag determining if scenario is enabled or not. If set to 'false' the scenario will not be available, useful for testing/enabling the scenario later on&lt;br /&gt;
* A scenario type, which is one of &amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, or &amp;amp;quot;link&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;plist&amp;amp;quot; for generating a PLIST configuration file for iOS and OSX devices,&lt;br /&gt;
** &amp;amp;quot;manual&amp;amp;quot; for a description for the user for a manual set-up/configuration&lt;br /&gt;
** &amp;amp;quot;link&amp;amp;quot; for a link/URL to either Apple App Store / Google Play Store or to downloadable executable&lt;br /&gt;
* The &amp;amp;quot;link&amp;amp;quot; attribute, which is only considered it type is set to &amp;amp;quot;link&amp;amp;quot;. That attribute consists of the sub-attributes &amp;amp;quot;url&amp;amp;quot; and &amp;amp;quot;type&amp;amp;quot;.&lt;br /&gt;
** &amp;amp;quot;url&amp;amp;quot; provides the actual link/URL to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. For specifying a property that provides the actual link, please use special &amp;amp;quot;property&amp;amp;quot; scheme; e.g. &amp;amp;quot;property://com.openexchange.client.onboarding.app.mylink&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;type&amp;amp;quot; indicates if &amp;amp;quot;url&amp;amp;quot; holds a link for either Apple App Store, Apple Mac Store or Google Play Store. Must only be specified in case &amp;amp;quot;url&amp;amp;quot; points either of those commercial stores. Supported values are &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macstore&amp;amp;quot; and &amp;amp;quot;playstore&amp;amp;quot;&lt;br /&gt;
* The identifiers for the providers, which contribute to the scenario;&amp;lt;br /&amp;gt;&lt;br /&gt;
please check command-line tool &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; to check, which ones are available&lt;br /&gt;
* The identifiers for alternative scenarios. This is typically used to provide alternative manual setup possibility.&lt;br /&gt;
* The comma-separated names of Font Awesome icons that are supposed to be displayed for the scenario&amp;lt;br /&amp;gt;&lt;br /&gt;
(only the ones from v4.4.0 are currently supported)&lt;br /&gt;
* The translatable display name; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
* The translatable description; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
&lt;br /&gt;
== Onboarding providers ==&lt;br /&gt;
&lt;br /&gt;
As described in the previous section, a scenario specifies what providers contribute to it. A provider represents a certain App or (synchronization) protocol that a device can install, download and/or communicate with.&lt;br /&gt;
&lt;br /&gt;
Moreover a provider specifies what Onboarding types are supported (&amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, and/or &amp;amp;quot;link&amp;amp;quot;). Hence, once a provider is chosen to contribute to a certain scenario, the supported on-boarding type needs to match the one of the scenario itself. E.g. a scenario, which indicates to be of type &amp;amp;quot;link&amp;amp;quot;, will always fail if the associated provider signals to support types &amp;amp;quot;plist&amp;amp;quot; and &amp;amp;quot;manual&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To check what providers are available on your system, please execute the &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; command-line tool, which outputs something like:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_1.png]]&lt;br /&gt;
&lt;br /&gt;
Each provider might require one or more capabilities/permissions to be available for the requesting user. If capabilities/permissions are not satisfied, the associated scenario cannot be applied, but will be displayed to the user for upsell opportunities.&lt;br /&gt;
&lt;br /&gt;
=== Generic Onboarding provider for Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic onboarding provider for apps allows specifying custom scenarios of type &amp;amp;quot;link&amp;amp;quot; for arbitrary links/URLs pointing to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. The link can be set directly or via a property.&lt;br /&gt;
&lt;br /&gt;
This provider requires no capability/permission.&lt;br /&gt;
&lt;br /&gt;
An exemplary section in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file might look like (check &amp;amp;quot;Configuring Onboarding scenarios&amp;amp;quot; chapter for more details):&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== CalDAV/CardDAV ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;caldav&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;carddav&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order for a scenario (having CalDAV/CardDAV in its provider listing) to be executable by a user, the &amp;amp;quot;caldav&amp;amp;quot; capability and &amp;amp;quot;carddav&amp;amp;quot; capability respectively are required.&lt;br /&gt;
&lt;br /&gt;
Moreover, the appropriate *DAV end-points are supposed to be configured through property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.caldav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; file and property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.carddav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
=== Drive/Mail Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;driveapp&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;mailapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open-Xchange ships with built-in providers for Drive App and Mail App. The Drive-associated providers do require the &amp;amp;quot;drive&amp;amp;quot; capability and the Mail App requires the &amp;amp;quot;mobile_mail_app&amp;amp;quot; one.&lt;br /&gt;
&lt;br /&gt;
The appropriate links to the apps in the corresponding stores are configured in associated .properties files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-driveapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-mailapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default the links to the official apps are set, but may be changed to ones for branded versions.&lt;br /&gt;
&lt;br /&gt;
=== Drive Windows Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;drivewindowsclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the windows Drive Client. Requires the &amp;amp;quot;drive&amp;amp;quot; capability, but has no configuration options. However, this provider requires the &amp;amp;quot;open-xchange-drive-client-windows&amp;amp;quot; and the orderly configured binaries (e.g. through installing appropriate package according to the brand).&lt;br /&gt;
&lt;br /&gt;
Please check [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_Drive#OX_Drive_for_Windows ''this''] documentation for more details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === eM Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;emclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the eM Client needs the &amp;amp;quot;emclient&amp;amp;quot; capability.&lt;br /&gt;
&lt;br /&gt;
Allows to configure the URL pointing to the executable file through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.emclient.url&amp;lt;/code&amp;gt; in file 'client-onboarding-emclient.properties' file.&lt;br /&gt;
&lt;br /&gt;
=== Sync App ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;syncapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the Sync App for Android. Requires &amp;amp;quot;caldav&amp;amp;quot; and &amp;amp;quot;carddav&amp;amp;quot; capabilities.&lt;br /&gt;
&lt;br /&gt;
The link to Google Play Store is specified via property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.syncapp.store.google.playstore&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-syncapp.properties&amp;lt;/code&amp;gt; file. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mail (IMAP/SMTP) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for deploying the IMAP/STMP account on target device using native/stock mail app. All IMAP/SMTP related settings are settable in file 'client-onboarding-mail.properties'.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft ActiveSync (EAS) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configures the ActiveSync account on target device. Allows specifying the EAS end-point through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.eas.url&amp;lt;/code&amp;gt; property in 'client-onboarding-eas.properties'.&lt;br /&gt;
&lt;br /&gt;
=== OX Updater ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider offering the download for the OX Client Updater ([http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''http:''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''//oxpedia''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''org/wiki/index''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''php''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''?''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''title=AppSuite''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater '':''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''Open-Xchange_Updater'']). The provider is available as soon as the according package is installed and at least one product can be installed/updated via it by the user. A pre-configured scenario 'oxupdaterinstall' is already contained in &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuring Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
Onboarding scenarios are configured through the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Each scenario starts with its own &amp;amp;quot;section&amp;amp;quot; in that YAML file by typing its unique identifier. All further attributes as outlined in chapter &amp;amp;quot;Onboarding scenarios&amp;amp;quot; are nested below that identifier.&lt;br /&gt;
&lt;br /&gt;
=== Easily enabling/disabling scenarios ===&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with a set of pre-defined scenarios that might apply to the most common installations. Each scenario can easily be enabled/disabled through its &amp;amp;quot;enabled&amp;amp;quot; Boolean attribute in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool applies the changes without the need for restart.&lt;br /&gt;
&lt;br /&gt;
=== Translatable strings ===&lt;br /&gt;
&lt;br /&gt;
Those attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; refer to localizable strings and are placed into &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file. Once such attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; are changed/customized and/or added, the appropriate &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file needs to be re-created in order to get translated. For generating that &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file, please execute the /opt/open-xchange/sbin/parsei18nyaml command-line tool. That .pot file needs then be turned to the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Thus changing any of the attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; requires (provided that appropriate .po files are available in &amp;lt;code&amp;gt;/opt/open-xchange/i18n&amp;lt;/code&amp;gt; directory) either a restart or executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool together with stop/start of the &amp;amp;quot;com.openexchange.i18n&amp;amp;quot; bundle.&lt;br /&gt;
&lt;br /&gt;
=== Scenarios' scope and order ===&lt;br /&gt;
&lt;br /&gt;
While the previously mentioned &amp;amp;quot;enabled&amp;amp;quot; attribute offers some kind of generic on/off switch, the properties outlined in this section allow defining the device-scope for a scenario and in which order/precedence they are offered to the client. Scope in terms of&lt;br /&gt;
&lt;br /&gt;
* For what devices (from the set of those specified by providers) are what scenarios in which order available and&lt;br /&gt;
* For which users they are available&lt;br /&gt;
&lt;br /&gt;
As explained above, each scenario specifies one or more type-compatible providers associated with it. In turn, each provider determines to which devices the scenario applies. In order to further control, which device and which users are allowed to access a certain scenario, there are appropriate options available in file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt;. Every option is fully [http://oxpedia.org/wiki/index.php?title=ConfigCascade ''config-cascade''] aware and therefore can be controlled on a global, per context set, per context and per user basis.&lt;br /&gt;
&lt;br /&gt;
Thus, to make a scenario available for certain devices (as dictated by scenario’s providers) and for users as well, the scenario identifier needs to be added to the appropriate properties ending with &amp;amp;quot;.scenarios&amp;amp;quot; (for devices) and added to the &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property (for user) as well.&lt;br /&gt;
&lt;br /&gt;
The following properties accept a comma-separated list of scenario identifiers. The order of listed scenarios reflects the order in which they are offered to the client&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.mac.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.ipad.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.windows.desktop.scenarios&lt;br /&gt;
&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios=mailappinstall, driveappinstall, eassync, mailsync, davsync&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This exemplary setting specifies that Mail App, Drive App, EAS, Native Mail (IMAP/SMTP) and CalDAV/CardDAV are available in given order for iPhone devices.&lt;br /&gt;
&lt;br /&gt;
Once a scenario is made accessible through configuration it is visible to users trying to perform a client onboarding using one of associated devices. However, whether a user is effectively allowed to execute that scenario is determined by the required capabilities of the denoted providers; if not allowed it gets displayed as an upsell opportunity.&lt;br /&gt;
&lt;br /&gt;
=== Configuring actions ===&lt;br /&gt;
&lt;br /&gt;
The type for a scenario determines what actions are associated with it to &amp;amp;quot;''transport''&amp;amp;quot; the onboarding information to the client. The types &amp;amp;quot;manual&amp;amp;quot; and &amp;amp;quot;link&amp;amp;quot; only show static information like displaying a link. In contrast the type &amp;amp;quot;plist&amp;amp;quot; allows several actions to transport the configuration profile onto the client. Thereof&lt;br /&gt;
&lt;br /&gt;
* E-Mail&lt;br /&gt;
* SMS&lt;br /&gt;
&lt;br /&gt;
In order to utilize the &amp;amp;quot;E-Mail&amp;amp;quot; action, a special transport must be configured for system-composed E-Mails [http://oxpedia.org/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode#Share_Notifications ''as it is for using the sharing functionality'']. This transport is configured in noreply.properties. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
&lt;br /&gt;
Using the SMS action requires an according implementation being available. OX App Suite comes with an optional sipgate implementation. Please check [http://oxpedia.org/wiki/index.php?title=AppSuite:SMS_Sipgate ''this documentation''] how to setup App Suite accordingly.&lt;br /&gt;
&lt;br /&gt;
==== Implementing your own SMS gateway ====&lt;br /&gt;
&lt;br /&gt;
To use an SMS gateway other than sipgate, you can provide your own implementation. Therefore the Java interface &amp;lt;code&amp;gt;com.openexchange.sms.SMSServiceSPI&amp;lt;/code&amp;gt; needs to be implemented and published as an OSGi service. For parsing phone numbers provided by users &amp;lt;code&amp;gt;com.openexchange.sms.PhoneNumberParserService&amp;lt;/code&amp;gt; can be used. That one is also available as an OSGi service and can be tracked accordingly. You can have a look at bundle &amp;lt;code&amp;gt;com.openexchange.sms.sipgate&amp;lt;/code&amp;gt; as implementation reference.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' You must not install the &amp;lt;code&amp;gt;open-xchange-sms-sipgate&amp;lt;/code&amp;gt; package if you provide your own implementation.&lt;br /&gt;
&lt;br /&gt;
==== PLIST-signing ====&lt;br /&gt;
Scenarios of type &amp;amp;quot;plist&amp;amp;quot; require having PLIST-signing enabled. Otherwise the device will show a warning when importing a received PLIST configuration profile. Please follow the instructions as outlined in [http://oxpedia.org/wiki/index.php?title=AppSuite:PList_signing ''this article''] how to enable and configure signing for PLIST files.&lt;br /&gt;
&lt;br /&gt;
== Adding custom scenarios ==&lt;br /&gt;
&lt;br /&gt;
The first thing to do, is to add an appropriate scenario configuration to the 'client-onboarding-scenarios.yml' file; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
  &amp;amp;nbsp;url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
   type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
   image: http://my.fine.host/image001.png&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next step is to make that scenario accessible through adapting 'client-onboarding.properties' file. Hence, the scenario identifier needs to be added to the devices, to which it applies (Android devices in this case):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios=..., mygoogleapp&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Furthermore, that scenario needs to be made accessible to users as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
At last, a .pot file is supposed to be generated from the translatable strings using /opt/open-xchange/sbin/parsei18nyaml command-line tool to yield the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Provided that target users do hold appropriate capabilities, they are allowed to execute that scenario. In the example above the &amp;amp;quot;app&amp;amp;quot; provider is specified, which does no require any capabilities. Hence, that scenario is available.&lt;br /&gt;
&lt;br /&gt;
== HowTos ==&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly setup a default/test configuration ? ===&lt;br /&gt;
&lt;br /&gt;
# Install open-xchange-client-onboarding package&lt;br /&gt;
# Edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; and set &amp;lt;code&amp;gt;com.openexchange.client.onboarding.enabled&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Edit &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt; to enable autoconfig sending via email. PS: Have a fully working smtp login available like “noreply@yourdomain.tld”&lt;br /&gt;
# Edit client-onboarding-scenarios.yml and set “enable” for : “driveappinstall” , “davsync” “davmanual” “mailsync” “mailmanual” to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Now set the correct caldav/carddav server FQDNs in the corresponding files for your setup&lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; &lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
# Restart OX process&lt;br /&gt;
# Login to AppSuite. Click on Settings - Connect your device&lt;br /&gt;
# Verify that you have following onboarding options available: &lt;br /&gt;
#* windows -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; drive app &lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; details for dav setup&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; drive app&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; drive app&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly disable a certain scenario ===&lt;br /&gt;
&lt;br /&gt;
Simply enter the 'client-onboarding-scenarios.yml' file and go to the section specifying the target scenario. Switch the 'enabled' flag to &amp;amp;quot;false&amp;amp;quot; and execute /opt/open-xchange/sbin/reloadconfiguration command-line tool.&lt;br /&gt;
&lt;br /&gt;
E.g. to disable the OX Drive App:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_3.png]]&lt;br /&gt;
&lt;br /&gt;
=== How can I disable the outdated ui parts like 'Downloads'? ===&lt;br /&gt;
&lt;br /&gt;
The wizard replaces and extends the functionality of the old Download Section in settings and the corresponding widgets. We recommend to disable these outdated parts:&lt;br /&gt;
# widget: get ox drive&lt;br /&gt;
# widget: update&lt;br /&gt;
# settings entry: downloads&lt;br /&gt;
&lt;br /&gt;
'''Remove settings section 'Downloads' '''&lt;br /&gt;
&lt;br /&gt;
Edit ''/opt/open-xchange/etc/settings/appsuite.properties'' and add or change the value to true:&lt;br /&gt;
* ''io.ox/core//settings/downloadsDisabled''&lt;br /&gt;
&lt;br /&gt;
'''Remove widgets'''&lt;br /&gt;
&lt;br /&gt;
To remove the both related portal widget/tiles please refer to the&lt;br /&gt;
[[AppSuite:Configuring_portal_plugins#Disabling_a_tile_completely | portal plugins wiki page ]]&lt;br /&gt;
&lt;br /&gt;
* ''io.ox/portal/widget/oxdriveclients''&lt;br /&gt;
* ''io.ox/portal/widget/updater''&lt;br /&gt;
&lt;br /&gt;
=== How can I add my own App? ===&lt;br /&gt;
&lt;br /&gt;
Provided that the App is accessible by a link (pointing to a commercial App Store or to a downloadable executable/installer), the generic &amp;amp;quot;app&amp;amp;quot; is the suitable provider to choose.&lt;br /&gt;
&lt;br /&gt;
Hence, an appropriate section is supposed to be added to the 'client-onboarding-scenarios.yml' file having a unique name and &amp;amp;quot;provider&amp;amp;quot; attribute set to &amp;amp;quot;[app]&amp;amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The attribute &amp;amp;quot;type&amp;amp;quot; needs to be set to &amp;amp;quot;link&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The attribute &amp;amp;quot;link&amp;amp;quot; should be configured with:&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;url&amp;amp;quot; sub-attribute containing the actual link pointing to the URL location&lt;br /&gt;
* &amp;amp;quot;type&amp;amp;quot; sub-attribute specifying of what type that link is: either &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macappstore&amp;amp;quot;, &amp;amp;quot;playstore&amp;amp;quot; or &amp;amp;quot;common&amp;amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
The type &amp;amp;quot;common&amp;amp;quot; is supposed to be used for links that do not point to a commercial App Store, but to a downloadable executable/installer file.&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;quot;icon&amp;amp;quot; attribute is supposed to contain a comma-separated list of Font Awesome icons (only the ones from v4.4.0 are currently supported) that represent the App; e.g.&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;fa-cloud&amp;amp;quot; for Drive/file-related nature&lt;br /&gt;
* &amp;amp;quot;fa-calendar, fa-users&amp;amp;quot; for Calendar and Address Book synchronization&lt;br /&gt;
* &amp;amp;quot;fa-envelope-o&amp;amp;quot; for Mail nature&lt;br /&gt;
&lt;br /&gt;
Next, the translatable display name and description should be set through setting the attributes &amp;amp;quot;displayName_t10e&amp;amp;quot; and &amp;amp;quot;description_t10e&amp;amp;quot;. As described previously, executing the /opt/open-xchange/sbin/parsei18nyaml command-line tool yields an appropriate .pot file, which can then be used for generating the individual .po file for the different translations.&lt;br /&gt;
&lt;br /&gt;
Finally, the 'client-onboarding.properties' file needs to be modified to specify the &amp;amp;quot;scope&amp;amp;quot; for that new scenario. Add the scenario’s unique name to the appropriate device properties and add it to &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property as well.&lt;br /&gt;
&lt;br /&gt;
After executing /opt/open-xchange/sbin/reloadconfiguration command-line tool the new client onboarding scenario is available for the selected users/devices.&lt;br /&gt;
&lt;br /&gt;
=== How can I upsell my own app? ===&lt;br /&gt;
&lt;br /&gt;
Having the same prerequisites/steps as for &amp;amp;quot;How can I add my own App?&amp;amp;quot; the scenario description in the 'client-onboarding-scenarios.yml' file simply needs to be extended by the desired capabilities, which are supposed to be used for managing the upsell.&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 '''capabilities: &amp;amp;quot;mygoogleapp_capability&amp;amp;quot;'''&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The special &amp;amp;quot;capabilities&amp;amp;quot; attribute is only supported for scenarios of type &amp;amp;quot;link&amp;amp;quot; with the special &amp;amp;quot;app&amp;amp;quot; provider.&lt;br /&gt;
&lt;br /&gt;
With such a &amp;amp;quot;capabilities&amp;amp;quot; attribute only users, which have the &amp;amp;quot;mygoogleapp_capability&amp;amp;quot; capability are allowed to get the link. For those who don’t, the upsell opportunity will be displayed; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[[File:onboarding_4.png]]&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23108</id>
		<title>AppSuite:Client Onboarding</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=23108"/>
		<updated>2017-03-15T09:10:07Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Adding custom scenarios */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Client Onboarding&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.1}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Configuration guide for Open-Xchange Client Onboarding =&lt;br /&gt;
&lt;br /&gt;
With Open-Xchange Server v7.8.1 a new module is added allowing users to integrate several different clients and devices with Open-Xchange; such as providing a link to a commercial App Store to install certain apps on mobile devices.&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with several built-in providers; thereof&lt;br /&gt;
&lt;br /&gt;
* CalDAV&lt;br /&gt;
* CardDAV&lt;br /&gt;
* OX Mail App&lt;br /&gt;
* OX Drive App&lt;br /&gt;
* Connector for Microsoft Outlook®&lt;br /&gt;
* Sync App for Android&lt;br /&gt;
* Microsoft ActiveSync&lt;br /&gt;
* eM Client&lt;br /&gt;
* Mail (IMAP/SMTP)&lt;br /&gt;
* Generic Mobile App provider&lt;br /&gt;
&lt;br /&gt;
Those providers allow accessing and/or synchronizing with certain data held by Open-Xchange on a supported device.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
To install the Client Onboarding module, the package open-xchange-client-onboarding needs to be installed.&lt;br /&gt;
&lt;br /&gt;
Moreover the property &amp;lt;code&amp;gt;&amp;quot;com.openexchange.client.onboarding.enabled&amp;quot;&amp;lt;/code&amp;gt;; in installed file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; needs to be set to &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; (default). So getting rid off the entire client on-boarding module simply requires setting the mentioned property to &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; (and executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool).&lt;br /&gt;
&lt;br /&gt;
== Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
The way to specify what and how a certain device is able to get “on-boarded” is mainly determined by so called scenarios. A scenario describes what gets deployed using which providers that contribute their onboarding possibilities and how it is made accessible to the client’s device.&lt;br /&gt;
&lt;br /&gt;
A scenario consists of the following configuration attributes/options&lt;br /&gt;
&lt;br /&gt;
* A unique scenario identifier&lt;br /&gt;
* A flag determining if scenario is enabled or not. If set to 'false' the scenario will not be available, useful for testing/enabling the scenario later on&lt;br /&gt;
* A scenario type, which is one of &amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, or &amp;amp;quot;link&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;plist&amp;amp;quot; for generating a PLIST configuration file for iOS and OSX devices,&lt;br /&gt;
** &amp;amp;quot;manual&amp;amp;quot; for a description for the user for a manual set-up/configuration&lt;br /&gt;
** &amp;amp;quot;link&amp;amp;quot; for a link/URL to either Apple App Store / Google Play Store or to downloadable executable&lt;br /&gt;
* The &amp;amp;quot;link&amp;amp;quot; attribute, which is only considered it type is set to &amp;amp;quot;link&amp;amp;quot;. That attribute consists of the sub-attributes &amp;amp;quot;url&amp;amp;quot; and &amp;amp;quot;type&amp;amp;quot;.&lt;br /&gt;
** &amp;amp;quot;url&amp;amp;quot; provides the actual link/URL to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. For specifying a property that provides the actual link, please use special &amp;amp;quot;property&amp;amp;quot; scheme; e.g. &amp;amp;quot;property://com.openexchange.client.onboarding.app.mylink&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;type&amp;amp;quot; indicates if &amp;amp;quot;url&amp;amp;quot; holds a link for either Apple App Store, Apple Mac Store or Google Play Store. Must only be specified in case &amp;amp;quot;url&amp;amp;quot; points either of those commercial stores. Supported values are &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macstore&amp;amp;quot; and &amp;amp;quot;playstore&amp;amp;quot;&lt;br /&gt;
* The identifiers for the providers, which contribute to the scenario;&amp;lt;br /&amp;gt;&lt;br /&gt;
please check command-line tool &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; to check, which ones are available&lt;br /&gt;
* The identifiers for alternative scenarios. This is typically used to provide alternative manual setup possibility.&lt;br /&gt;
* The comma-separated names of Font Awesome icons that are supposed to be displayed for the scenario&amp;lt;br /&amp;gt;&lt;br /&gt;
(only the ones from v4.4.0 are currently supported)&lt;br /&gt;
* The translatable display name; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
* The translatable description; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
&lt;br /&gt;
== Onboarding providers ==&lt;br /&gt;
&lt;br /&gt;
As described in the previous section, a scenario specifies what providers contribute to it. A provider represents a certain App or (synchronization) protocol that a device can install, download and/or communicate with.&lt;br /&gt;
&lt;br /&gt;
Moreover a provider specifies what Onboarding types are supported (&amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, and/or &amp;amp;quot;link&amp;amp;quot;). Hence, once a provider is chosen to contribute to a certain scenario, the supported on-boarding type needs to match the one of the scenario itself. E.g. a scenario, which indicates to be of type &amp;amp;quot;link&amp;amp;quot;, will always fail if the associated provider signals to support types &amp;amp;quot;plist&amp;amp;quot; and &amp;amp;quot;manual&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To check what providers are available on your system, please execute the &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; command-line tool, which outputs something like:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_1.png]]&lt;br /&gt;
&lt;br /&gt;
Each provider might require one or more capabilities/permissions to be available for the requesting user. If capabilities/permissions are not satisfied, the associated scenario cannot be applied, but will be displayed to the user for upsell opportunities.&lt;br /&gt;
&lt;br /&gt;
=== Generic Onboarding provider for Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic onboarding provider for apps allows specifying custom scenarios of type &amp;amp;quot;link&amp;amp;quot; for arbitrary links/URLs pointing to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. The link can be set directly or via a property.&lt;br /&gt;
&lt;br /&gt;
This provider requires no capability/permission.&lt;br /&gt;
&lt;br /&gt;
An exemplary section in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file might look like (check &amp;amp;quot;Configuring Onboarding scenarios&amp;amp;quot; chapter for more details):&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== CalDAV/CardDAV ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;caldav&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;carddav&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order for a scenario (having CalDAV/CardDAV in its provider listing) to be executable by a user, the &amp;amp;quot;caldav&amp;amp;quot; capability and &amp;amp;quot;carddav&amp;amp;quot; capability respectively are required.&lt;br /&gt;
&lt;br /&gt;
Moreover, the appropriate *DAV end-points are supposed to be configured through property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.caldav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; file and property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.carddav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
=== Drive/Mail Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;driveapp&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;mailapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open-Xchange ships with built-in providers for Drive App and Mail App. The Drive-associated providers do require the &amp;amp;quot;drive&amp;amp;quot; capability and the Mail App requires the &amp;amp;quot;mobile_mail_app&amp;amp;quot; one.&lt;br /&gt;
&lt;br /&gt;
The appropriate links to the apps in the corresponding stores are configured in associated .properties files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-driveapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-mailapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default the links to the official apps are set, but may be changed to ones for branded versions.&lt;br /&gt;
&lt;br /&gt;
=== Drive Windows Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;drivewindowsclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the windows Drive Client. Requires the &amp;amp;quot;drive&amp;amp;quot; capability, but has no configuration options. However, this provider requires the &amp;amp;quot;open-xchange-drive-client-windows&amp;amp;quot; and the orderly configured binaries (e.g. through installing appropriate package according to the brand).&lt;br /&gt;
&lt;br /&gt;
Please check [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_Drive#OX_Drive_for_Windows ''this''] documentation for more details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === eM Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;emclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the eM Client needs the &amp;amp;quot;emclient&amp;amp;quot; capability.&lt;br /&gt;
&lt;br /&gt;
Allows to configure the URL pointing to the executable file through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.emclient.url&amp;lt;/code&amp;gt; in file 'client-onboarding-emclient.properties' file.&lt;br /&gt;
&lt;br /&gt;
=== Sync App ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;syncapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the Sync App for Android. Requires &amp;amp;quot;caldav&amp;amp;quot; and &amp;amp;quot;carddav&amp;amp;quot; capabilities.&lt;br /&gt;
&lt;br /&gt;
The link to Google Play Store is specified via property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.syncapp.store.google.playstore&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-syncapp.properties&amp;lt;/code&amp;gt; file. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mail (IMAP/SMTP) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for deploying the IMAP/STMP account on target device using native/stock mail app. All IMAP/SMTP related settings are settable in file 'client-onboarding-mail.properties'.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft ActiveSync (EAS) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configures the ActiveSync account on target device. Allows specifying the EAS end-point through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.eas.url&amp;lt;/code&amp;gt; property in 'client-onboarding-eas.properties'.&lt;br /&gt;
&lt;br /&gt;
=== OX Updater ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider offering the download for the OX Client Updater ([http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''http:''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''//oxpedia''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''org/wiki/index''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''php''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''?''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''title=AppSuite''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater '':''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''Open-Xchange_Updater'']). The provider is available as soon as the according package is installed and at least one product can be installed/updated via it by the user. A pre-configured scenario 'oxupdaterinstall' is already contained in &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuring Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
Onboarding scenarios are configured through the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Each scenario starts with its own &amp;amp;quot;section&amp;amp;quot; in that YAML file by typing its unique identifier. All further attributes as outlined in chapter &amp;amp;quot;Onboarding scenarios&amp;amp;quot; are nested below that identifier.&lt;br /&gt;
&lt;br /&gt;
=== Easily enabling/disabling scenarios ===&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with a set of pre-defined scenarios that might apply to the most common installations. Each scenario can easily be enabled/disabled through its &amp;amp;quot;enabled&amp;amp;quot; Boolean attribute in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool applies the changes without the need for restart.&lt;br /&gt;
&lt;br /&gt;
=== Translatable strings ===&lt;br /&gt;
&lt;br /&gt;
Those attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; refer to localizable strings and are placed into &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file. Once such attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; are changed/customized and/or added, the appropriate &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file needs to be re-created in order to get translated. For generating that &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file, please execute the /opt/open-xchange/sbin/parsei18nyaml command-line tool. That .pot file needs then be turned to the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Thus changing any of the attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; requires (provided that appropriate .po files are available in &amp;lt;code&amp;gt;/opt/open-xchange/i18n&amp;lt;/code&amp;gt; directory) either a restart or executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool together with stop/start of the &amp;amp;quot;com.openexchange.i18n&amp;amp;quot; bundle.&lt;br /&gt;
&lt;br /&gt;
=== Scenarios' scope and order ===&lt;br /&gt;
&lt;br /&gt;
While the previously mentioned &amp;amp;quot;enabled&amp;amp;quot; attribute offers some kind of generic on/off switch, the properties outlined in this section allow defining the device-scope for a scenario and in which order/precedence they are offered to the client. Scope in terms of&lt;br /&gt;
&lt;br /&gt;
* For what devices (from the set of those specified by providers) are what scenarios in which order available and&lt;br /&gt;
* For which users they are available&lt;br /&gt;
&lt;br /&gt;
As explained above, each scenario specifies one or more type-compatible providers associated with it. In turn, each provider determines to which devices the scenario applies. In order to further control, which device and which users are allowed to access a certain scenario, there are appropriate options available in file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt;. Every option is fully [http://oxpedia.org/wiki/index.php?title=ConfigCascade ''config-cascade''] aware and therefore can be controlled on a global, per context set, per context and per user basis.&lt;br /&gt;
&lt;br /&gt;
Thus, to make a scenario available for certain devices (as dictated by scenario’s providers) and for users as well, the scenario identifier needs to be added to the appropriate properties ending with &amp;amp;quot;.scenarios&amp;amp;quot; (for devices) and added to the &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property (for user) as well.&lt;br /&gt;
&lt;br /&gt;
The following properties accept a comma-separated list of scenario identifiers. The order of listed scenarios reflects the order in which they are offered to the client&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.mac.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.ipad.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.windows.desktop.scenarios&lt;br /&gt;
&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios=mailappinstall, driveappinstall, eassync, mailsync, davsync&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This exemplary setting specifies that Mail App, Drive App, EAS, Native Mail (IMAP/SMTP) and CalDAV/CardDAV are available in given order for iPhone devices.&lt;br /&gt;
&lt;br /&gt;
Once a scenario is made accessible through configuration it is visible to users trying to perform a client onboarding using one of associated devices. However, whether a user is effectively allowed to execute that scenario is determined by the required capabilities of the denoted providers; if not allowed it gets displayed as an upsell opportunity.&lt;br /&gt;
&lt;br /&gt;
=== Configuring actions ===&lt;br /&gt;
&lt;br /&gt;
The type for a scenario determines what actions are associated with it to &amp;amp;quot;''transport''&amp;amp;quot; the onboarding information to the client. The types &amp;amp;quot;manual&amp;amp;quot; and &amp;amp;quot;link&amp;amp;quot; only show static information like displaying a link. In contrast the type &amp;amp;quot;plist&amp;amp;quot; allows several actions to transport the configuration profile onto the client. Thereof&lt;br /&gt;
&lt;br /&gt;
* E-Mail&lt;br /&gt;
* SMS&lt;br /&gt;
&lt;br /&gt;
In order to utilize the &amp;amp;quot;E-Mail&amp;amp;quot; action, a special transport must be configured for system-composed E-Mails [http://oxpedia.org/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode#Share_Notifications ''as it is for using the sharing functionality'']. This transport is configured in noreply.properties. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
&lt;br /&gt;
Using the SMS action requires an according implementation being available. OX App Suite comes with an optional sipgate implementation. Please check [http://oxpedia.org/wiki/index.php?title=AppSuite:SMS_Sipgate ''this documentation''] how to setup App Suite accordingly.&lt;br /&gt;
&lt;br /&gt;
==== Implementing your own SMS gateway ====&lt;br /&gt;
&lt;br /&gt;
To use an SMS gateway other than sipgate, you can provide your own implementation. Therefore the Java interface &amp;lt;code&amp;gt;com.openexchange.sms.SMSServiceSPI&amp;lt;/code&amp;gt; needs to be implemented and published as an OSGi service. For parsing phone numbers provided by users &amp;lt;code&amp;gt;com.openexchange.sms.PhoneNumberParserService&amp;lt;/code&amp;gt; can be used. That one is also available as an OSGi service and can be tracked accordingly. You can have a look at bundle &amp;lt;code&amp;gt;com.openexchange.sms.sipgate&amp;lt;/code&amp;gt; as implementation reference.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' You must not install the &amp;lt;code&amp;gt;open-xchange-sms-sipgate&amp;lt;/code&amp;gt; package if you provide your own implementation.&lt;br /&gt;
&lt;br /&gt;
==== PLIST-signing ====&lt;br /&gt;
Scenarios of type &amp;amp;quot;plist&amp;amp;quot; require having PLIST-signing enabled. Otherwise the device will show a warning when importing a received PLIST configuration profile. Please follow the instructions as outlined in [http://oxpedia.org/wiki/index.php?title=AppSuite:PList_signing ''this article''] how to enable and configure signing for PLIST files.&lt;br /&gt;
&lt;br /&gt;
== Adding custom scenarios ==&lt;br /&gt;
&lt;br /&gt;
The first thing to do, is to add an appropriate scenario configuration to the 'client-onboarding-scenarios.yml' file; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
   url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
   type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
   image: http://my.fine.host/image001.png&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The next step is to make that scenario accessible through adapting 'client-onboarding.properties' file. Hence, the scenario identifier needs to be added to the devices, to which it applies (Android devices in this case):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios=..., mygoogleapp&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Furthermore, that scenario needs to be made accessible to users as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
At last, a .pot file is supposed to be generated from the translatable strings using /opt/open-xchange/sbin/parsei18nyaml command-line tool to yield the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Provided that target users do hold appropriate capabilities, they are allowed to execute that scenario. In the example above the &amp;amp;quot;app&amp;amp;quot; provider is specified, which does no require any capabilities. Hence, that scenario is available.&lt;br /&gt;
&lt;br /&gt;
== HowTos ==&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly setup a default/test configuration ? ===&lt;br /&gt;
&lt;br /&gt;
# Install open-xchange-client-onboarding package&lt;br /&gt;
# Edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; and set &amp;lt;code&amp;gt;com.openexchange.client.onboarding.enabled&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Edit &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt; to enable autoconfig sending via email. PS: Have a fully working smtp login available like “noreply@yourdomain.tld”&lt;br /&gt;
# Edit client-onboarding-scenarios.yml and set “enable” for : “driveappinstall” , “davsync” “davmanual” “mailsync” “mailmanual” to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Now set the correct caldav/carddav server FQDNs in the corresponding files for your setup&lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; &lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
# Restart OX process&lt;br /&gt;
# Login to AppSuite. Click on Settings - Connect your device&lt;br /&gt;
# Verify that you have following onboarding options available: &lt;br /&gt;
#* windows -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; drive app &lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; details for dav setup&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; drive app&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; drive app&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly disable a certain scenario ===&lt;br /&gt;
&lt;br /&gt;
Simply enter the 'client-onboarding-scenarios.yml' file and go to the section specifying the target scenario. Switch the 'enabled' flag to &amp;amp;quot;false&amp;amp;quot; and execute /opt/open-xchange/sbin/reloadconfiguration command-line tool.&lt;br /&gt;
&lt;br /&gt;
E.g. to disable the OX Drive App:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_3.png]]&lt;br /&gt;
&lt;br /&gt;
=== How can I disable the outdated ui parts like 'Downloads'? ===&lt;br /&gt;
&lt;br /&gt;
The wizard replaces and extends the functionality of the old Download Section in settings and the corresponding widgets. We recommend to disable these outdated parts:&lt;br /&gt;
# widget: get ox drive&lt;br /&gt;
# widget: update&lt;br /&gt;
# settings entry: downloads&lt;br /&gt;
&lt;br /&gt;
'''Remove settings section 'Downloads' '''&lt;br /&gt;
&lt;br /&gt;
Edit ''/opt/open-xchange/etc/settings/appsuite.properties'' and add or change the value to true:&lt;br /&gt;
* ''io.ox/core//settings/downloadsDisabled''&lt;br /&gt;
&lt;br /&gt;
'''Remove widgets'''&lt;br /&gt;
&lt;br /&gt;
To remove the both related portal widget/tiles please refer to the&lt;br /&gt;
[[AppSuite:Configuring_portal_plugins#Disabling_a_tile_completely | portal plugins wiki page ]]&lt;br /&gt;
&lt;br /&gt;
* ''io.ox/portal/widget/oxdriveclients''&lt;br /&gt;
* ''io.ox/portal/widget/updater''&lt;br /&gt;
&lt;br /&gt;
=== How can I add my own App? ===&lt;br /&gt;
&lt;br /&gt;
Provided that the App is accessible by a link (pointing to a commercial App Store or to a downloadable executable/installer), the generic &amp;amp;quot;app&amp;amp;quot; is the suitable provider to choose.&lt;br /&gt;
&lt;br /&gt;
Hence, an appropriate section is supposed to be added to the 'client-onboarding-scenarios.yml' file having a unique name and &amp;amp;quot;provider&amp;amp;quot; attribute set to &amp;amp;quot;[app]&amp;amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The attribute &amp;amp;quot;type&amp;amp;quot; needs to be set to &amp;amp;quot;link&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The attribute &amp;amp;quot;link&amp;amp;quot; should be configured with:&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;url&amp;amp;quot; sub-attribute containing the actual link pointing to the URL location&lt;br /&gt;
* &amp;amp;quot;type&amp;amp;quot; sub-attribute specifying of what type that link is: either &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macappstore&amp;amp;quot;, &amp;amp;quot;playstore&amp;amp;quot; or &amp;amp;quot;common&amp;amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
The type &amp;amp;quot;common&amp;amp;quot; is supposed to be used for links that do not point to a commercial App Store, but to a downloadable executable/installer file.&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;quot;icon&amp;amp;quot; attribute is supposed to contain a comma-separated list of Font Awesome icons (only the ones from v4.4.0 are currently supported) that represent the App; e.g.&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;fa-cloud&amp;amp;quot; for Drive/file-related nature&lt;br /&gt;
* &amp;amp;quot;fa-calendar, fa-users&amp;amp;quot; for Calendar and Address Book synchronization&lt;br /&gt;
* &amp;amp;quot;fa-envelope-o&amp;amp;quot; for Mail nature&lt;br /&gt;
&lt;br /&gt;
Next, the translatable display name and description should be set through setting the attributes &amp;amp;quot;displayName_t10e&amp;amp;quot; and &amp;amp;quot;description_t10e&amp;amp;quot;. As described previously, executing the /opt/open-xchange/sbin/parsei18nyaml command-line tool yields an appropriate .pot file, which can then be used for generating the individual .po file for the different translations.&lt;br /&gt;
&lt;br /&gt;
Finally, the 'client-onboarding.properties' file needs to be modified to specify the &amp;amp;quot;scope&amp;amp;quot; for that new scenario. Add the scenario’s unique name to the appropriate device properties and add it to &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property as well.&lt;br /&gt;
&lt;br /&gt;
After executing /opt/open-xchange/sbin/reloadconfiguration command-line tool the new client onboarding scenario is available for the selected users/devices.&lt;br /&gt;
&lt;br /&gt;
=== How can I upsell my own app? ===&lt;br /&gt;
&lt;br /&gt;
Having the same prerequisites/steps as for &amp;amp;quot;How can I add my own App?&amp;amp;quot; the scenario description in the 'client-onboarding-scenarios.yml' file simply needs to be extended by the desired capabilities, which are supposed to be used for managing the upsell.&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 '''capabilities: &amp;amp;quot;mygoogleapp_capability&amp;amp;quot;'''&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The special &amp;amp;quot;capabilities&amp;amp;quot; attribute is only supported for scenarios of type &amp;amp;quot;link&amp;amp;quot; with the special &amp;amp;quot;app&amp;amp;quot; provider.&lt;br /&gt;
&lt;br /&gt;
With such a &amp;amp;quot;capabilities&amp;amp;quot; attribute only users, which have the &amp;amp;quot;mygoogleapp_capability&amp;amp;quot; capability are allowed to get the link. For those who don’t, the upsell opportunity will be displayed; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[[File:onboarding_4.png]]&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=22879</id>
		<title>AppSuite:Client Onboarding</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=22879"/>
		<updated>2017-02-07T13:09:55Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Scenarios' scope and order */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Client Onboarding&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.1}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Configuration guide for Open-Xchange Client Onboarding =&lt;br /&gt;
&lt;br /&gt;
With Open-Xchange Server v7.8.1 a new module is added allowing users to integrate several different clients and devices with Open-Xchange; such as providing a link to a commercial App Store to install certain apps on mobile devices.&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with several built-in providers; thereof&lt;br /&gt;
&lt;br /&gt;
* CalDAV&lt;br /&gt;
* CardDAV&lt;br /&gt;
* OX Mail App&lt;br /&gt;
* OX Drive App&lt;br /&gt;
* Connector for Microsoft Outlook®&lt;br /&gt;
* Sync App for Android&lt;br /&gt;
* Microsoft ActiveSync&lt;br /&gt;
* eM Client&lt;br /&gt;
* Mail (IMAP/SMTP)&lt;br /&gt;
* Generic Mobile App provider&lt;br /&gt;
&lt;br /&gt;
Those providers allow accessing and/or synchronizing with certain data held by Open-Xchange on a supported device.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
To install the Client Onboarding module, the package open-xchange-client-onboarding needs to be installed.&lt;br /&gt;
&lt;br /&gt;
Moreover the property &amp;lt;code&amp;gt;&amp;quot;com.openexchange.client.onboarding.enabled&amp;quot;&amp;lt;/code&amp;gt;; in installed file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; needs to be set to &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; (default). So getting rid off the entire client on-boarding module simply requires setting the mentioned property to &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; (and executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool).&lt;br /&gt;
&lt;br /&gt;
== Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
The way to specify what and how a certain device is able to get “on-boarded” is mainly determined by so called scenarios. A scenario describes what gets deployed using which providers that contribute their onboarding possibilities and how it is made accessible to the client’s device.&lt;br /&gt;
&lt;br /&gt;
A scenario consists of the following configuration attributes/options&lt;br /&gt;
&lt;br /&gt;
* A unique scenario identifier&lt;br /&gt;
* A flag determining if scenario is enabled or not. If set to 'false' the scenario will not be available, useful for testing/enabling the scenario later on&lt;br /&gt;
* A scenario type, which is one of &amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, or &amp;amp;quot;link&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;plist&amp;amp;quot; for generating a PLIST configuration file for iOS and OSX devices,&lt;br /&gt;
** &amp;amp;quot;manual&amp;amp;quot; for a description for the user for a manual set-up/configuration&lt;br /&gt;
** &amp;amp;quot;link&amp;amp;quot; for a link/URL to either Apple App Store / Google Play Store or to downloadable executable&lt;br /&gt;
* The &amp;amp;quot;link&amp;amp;quot; attribute, which is only considered it type is set to &amp;amp;quot;link&amp;amp;quot;. That attribute consists of the sub-attributes &amp;amp;quot;url&amp;amp;quot; and &amp;amp;quot;type&amp;amp;quot;.&lt;br /&gt;
** &amp;amp;quot;url&amp;amp;quot; provides the actual link/URL to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. For specifying a property that provides the actual link, please use special &amp;amp;quot;property&amp;amp;quot; scheme; e.g. &amp;amp;quot;property://com.openexchange.client.onboarding.app.mylink&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;type&amp;amp;quot; indicates if &amp;amp;quot;url&amp;amp;quot; holds a link for either Apple App Store, Apple Mac Store or Google Play Store. Must only be specified in case &amp;amp;quot;url&amp;amp;quot; points either of those commercial stores. Supported values are &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macstore&amp;amp;quot; and &amp;amp;quot;playstore&amp;amp;quot;&lt;br /&gt;
* The identifiers for the providers, which contribute to the scenario;&amp;lt;br /&amp;gt;&lt;br /&gt;
please check command-line tool &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; to check, which ones are available&lt;br /&gt;
* The identifiers for alternative scenarios. This is typically used to provide alternative manual setup possibility.&lt;br /&gt;
* The comma-separated names of Font Awesome icons that are supposed to be displayed for the scenario&amp;lt;br /&amp;gt;&lt;br /&gt;
(only the ones from v4.4.0 are currently supported)&lt;br /&gt;
* The translatable display name; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
* The translatable description; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
&lt;br /&gt;
== Onboarding providers ==&lt;br /&gt;
&lt;br /&gt;
As described in the previous section, a scenario specifies what providers contribute to it. A provider represents a certain App or (synchronization) protocol that a device can install, download and/or communicate with.&lt;br /&gt;
&lt;br /&gt;
Moreover a provider specifies what Onboarding types are supported (&amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, and/or &amp;amp;quot;link&amp;amp;quot;). Hence, once a provider is chosen to contribute to a certain scenario, the supported on-boarding type needs to match the one of the scenario itself. E.g. a scenario, which indicates to be of type &amp;amp;quot;link&amp;amp;quot;, will always fail if the associated provider signals to support types &amp;amp;quot;plist&amp;amp;quot; and &amp;amp;quot;manual&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To check what providers are available on your system, please execute the &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; command-line tool, which outputs something like:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_1.png]]&lt;br /&gt;
&lt;br /&gt;
Each provider might require one or more capabilities/permissions to be available for the requesting user. If capabilities/permissions are not satisfied, the associated scenario cannot be applied, but will be displayed to the user for upsell opportunities.&lt;br /&gt;
&lt;br /&gt;
=== Generic Onboarding provider for Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic onboarding provider for apps allows specifying custom scenarios of type &amp;amp;quot;link&amp;amp;quot; for arbitrary links/URLs pointing to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. The link can be set directly or via a property.&lt;br /&gt;
&lt;br /&gt;
This provider requires no capability/permission.&lt;br /&gt;
&lt;br /&gt;
An exemplary section in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file might look like (check &amp;amp;quot;Configuring Onboarding scenarios&amp;amp;quot; chapter for more details):&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== CalDAV/CardDAV ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;caldav&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;carddav&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order for a scenario (having CalDAV/CardDAV in its provider listing) to be executable by a user, the &amp;amp;quot;caldav&amp;amp;quot; capability and &amp;amp;quot;carddav&amp;amp;quot; capability respectively are required.&lt;br /&gt;
&lt;br /&gt;
Moreover, the appropriate *DAV end-points are supposed to be configured through property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.caldav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; file and property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.carddav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
=== Drive/Mail Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;driveapp&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;mailapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open-Xchange ships with built-in providers for Drive App and Mail App. The Drive-associated providers do require the &amp;amp;quot;drive&amp;amp;quot; capability and the Mail App requires the &amp;amp;quot;mobile_mail_app&amp;amp;quot; one.&lt;br /&gt;
&lt;br /&gt;
The appropriate links to the apps in the corresponding stores are configured in associated .properties files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-driveapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-mailapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default the links to the official apps are set, but may be changed to ones for branded versions.&lt;br /&gt;
&lt;br /&gt;
=== Drive Windows Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;drivewindowsclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the windows Drive Client. Requires the &amp;amp;quot;drive&amp;amp;quot; capability, but has no configuration options. However, this provider requires the &amp;amp;quot;open-xchange-drive-client-windows&amp;amp;quot; and the orderly configured binaries (e.g. through installing appropriate package according to the brand).&lt;br /&gt;
&lt;br /&gt;
Please check [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_Drive#OX_Drive_for_Windows ''this''] documentation for more details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === eM Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;emclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the eM Client needs the &amp;amp;quot;emclient&amp;amp;quot; capability.&lt;br /&gt;
&lt;br /&gt;
Allows to configure the URL pointing to the executable file through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.emclient.url&amp;lt;/code&amp;gt; in file 'client-onboarding-emclient.properties' file.&lt;br /&gt;
&lt;br /&gt;
=== Sync App ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;syncapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the Sync App for Android. Requires &amp;amp;quot;caldav&amp;amp;quot; and &amp;amp;quot;carddav&amp;amp;quot; capabilities.&lt;br /&gt;
&lt;br /&gt;
The link to Google Play Store is specified via property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.syncapp.store.google.playstore&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-syncapp.properties&amp;lt;/code&amp;gt; file. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mail (IMAP/SMTP) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for deploying the IMAP/STMP account on target device using native/stock mail app. All IMAP/SMTP related settings are settable in file 'client-onboarding-mail.properties'.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft ActiveSync (EAS) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configures the ActiveSync account on target device. Allows specifying the EAS end-point through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.eas.url&amp;lt;/code&amp;gt; property in 'client-onboarding-eas.properties'.&lt;br /&gt;
&lt;br /&gt;
=== OX Updater ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider offering the download for the OX Client Updater ([http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''http:''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''//oxpedia''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''org/wiki/index''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''php''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''?''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''title=AppSuite''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater '':''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''Open-Xchange_Updater'']). The provider is available as soon as the according package is installed and at least one product can be installed/updated via it by the user. A pre-configured scenario 'oxupdaterinstall' is already contained in &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuring Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
Onboarding scenarios are configured through the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Each scenario starts with its own &amp;amp;quot;section&amp;amp;quot; in that YAML file by typing its unique identifier. All further attributes as outlined in chapter &amp;amp;quot;Onboarding scenarios&amp;amp;quot; are nested below that identifier.&lt;br /&gt;
&lt;br /&gt;
=== Easily enabling/disabling scenarios ===&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with a set of pre-defined scenarios that might apply to the most common installations. Each scenario can easily be enabled/disabled through its &amp;amp;quot;enabled&amp;amp;quot; Boolean attribute in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool applies the changes without the need for restart.&lt;br /&gt;
&lt;br /&gt;
=== Translatable strings ===&lt;br /&gt;
&lt;br /&gt;
Those attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; refer to localizable strings and are placed into &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file. Once such attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; are changed/customized and/or added, the appropriate &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file needs to be re-created in order to get translated. For generating that &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file, please execute the /opt/open-xchange/sbin/parsei18nyaml command-line tool. That .pot file needs then be turned to the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Thus changing any of the attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; requires (provided that appropriate .po files are available in &amp;lt;code&amp;gt;/opt/open-xchange/i18n&amp;lt;/code&amp;gt; directory) either a restart or executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool together with stop/start of the &amp;amp;quot;com.openexchange.i18n&amp;amp;quot; bundle.&lt;br /&gt;
&lt;br /&gt;
=== Scenarios' scope and order ===&lt;br /&gt;
&lt;br /&gt;
While the previously mentioned &amp;amp;quot;enabled&amp;amp;quot; attribute offers some kind of generic on/off switch, the properties outlined in this section allow defining the device-scope for a scenario and in which order/precedence they are offered to the client. Scope in terms of&lt;br /&gt;
&lt;br /&gt;
* For what devices (from the set of those specified by providers) are what scenarios in which order available and&lt;br /&gt;
* For which users they are available&lt;br /&gt;
&lt;br /&gt;
As explained above, each scenario specifies one or more type-compatible providers associated with it. In turn, each provider determines to which devices the scenario applies. In order to further control, which device and which users are allowed to access a certain scenario, there are appropriate options available in file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt;. Every option is fully [http://oxpedia.org/wiki/index.php?title=ConfigCascade ''config-cascade''] aware and therefore can be controlled on a global, per context set, per context and per user basis.&lt;br /&gt;
&lt;br /&gt;
Thus, to make a scenario available for certain devices (as dictated by scenario’s providers) and for users as well, the scenario identifier needs to be added to the appropriate properties ending with &amp;amp;quot;.scenarios&amp;amp;quot; (for devices) and added to the &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property (for user) as well.&lt;br /&gt;
&lt;br /&gt;
The following properties accept a comma-separated list of scenario identifiers. The order of listed scenarios reflects the order in which they are offered to the client&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.mac.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.ipad.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.windows.desktop.scenarios&lt;br /&gt;
&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios=mailappinstall, driveappinstall, eassync, mailsync, davsync&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This exemplary setting specifies that Mail App, Drive App, EAS, Native Mail (IMAP/SMTP) and CalDAV/CardDAV are available in given order for iPhone devices.&lt;br /&gt;
&lt;br /&gt;
Once a scenario is made accessible through configuration it is visible to users trying to perform a client onboarding using one of associated devices. However, whether a user is effectively allowed to execute that scenario is determined by the required capabilities of the denoted providers; if not allowed it gets displayed as an upsell opportunity.&lt;br /&gt;
&lt;br /&gt;
=== Configuring actions ===&lt;br /&gt;
&lt;br /&gt;
The type for a scenario determines what actions are associated with it to &amp;amp;quot;''transport''&amp;amp;quot; the onboarding information to the client. The types &amp;amp;quot;manual&amp;amp;quot; and &amp;amp;quot;link&amp;amp;quot; only show static information like displaying a link. In contrast the type &amp;amp;quot;plist&amp;amp;quot; allows several actions to transport the configuration profile onto the client. Thereof&lt;br /&gt;
&lt;br /&gt;
* E-Mail&lt;br /&gt;
* SMS&lt;br /&gt;
&lt;br /&gt;
In order to utilize the &amp;amp;quot;E-Mail&amp;amp;quot; action, a special transport must be configured for system-composed E-Mails [http://oxpedia.org/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode#Share_Notifications ''as it is for using the sharing functionality'']. This transport is configured in noreply.properties. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
&lt;br /&gt;
Using the SMS action requires an according implementation being available. OX App Suite comes with an optional sipgate implementation. Please check [http://oxpedia.org/wiki/index.php?title=AppSuite:SMS_Sipgate ''this documentation''] how to setup App Suite accordingly.&lt;br /&gt;
&lt;br /&gt;
==== Implementing your own SMS gateway ====&lt;br /&gt;
&lt;br /&gt;
To use an SMS gateway other than sipgate, you can provide your own implementation. Therefore the Java interface &amp;lt;code&amp;gt;com.openexchange.sms.SMSServiceSPI&amp;lt;/code&amp;gt; needs to be implemented and published as an OSGi service. For parsing phone numbers provided by users &amp;lt;code&amp;gt;com.openexchange.sms.PhoneNumberParserService&amp;lt;/code&amp;gt; can be used. That one is also available as an OSGi service and can be tracked accordingly. You can have a look at bundle &amp;lt;code&amp;gt;com.openexchange.sms.sipgate&amp;lt;/code&amp;gt; as implementation reference.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' You must not install the &amp;lt;code&amp;gt;open-xchange-sms-sipgate&amp;lt;/code&amp;gt; package if you provide your own implementation.&lt;br /&gt;
&lt;br /&gt;
==== PLIST-signing ====&lt;br /&gt;
Scenarios of type &amp;amp;quot;plist&amp;amp;quot; require having PLIST-signing enabled. Otherwise the device will show a warning when importing a received PLIST configuration profile. Please follow the instructions as outlined in [http://oxpedia.org/wiki/index.php?title=AppSuite:PList_signing ''this article''] how to enable and configure signing for PLIST files.&lt;br /&gt;
&lt;br /&gt;
== Adding custom scenarios ==&lt;br /&gt;
&lt;br /&gt;
The first thing to do, is to add an appropriate scenario configuration to the 'client-onboarding-scenarios.yml' file; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The next step is to make that scenario accessible through adapting 'client-onboarding.properties' file. Hence, the scenario identifier needs to be added to the devices, to which it applies (Android devices in this case):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;com.openexchange.client.onboarding.android.tablet.scenarios=..., mygoogleapp&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Furthermore, that scenario needs to be made accessible to users as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;com.openexchange.client.onboarding.enabledScenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
At last, a .pot file is supposed to be generated from the translatable strings using /opt/open-xchange/sbin/parsei18nyaml command-line tool to yield the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Provided that target users do hold appropriate capabilities, they are allowed to execute that scenario. In the example above the &amp;amp;quot;app&amp;amp;quot; provider is specified, which does no require any capabilities. Hence, that scenario is available.&lt;br /&gt;
&lt;br /&gt;
== HowTos ==&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly setup a default/test configuration ? ===&lt;br /&gt;
&lt;br /&gt;
# Install open-xchange-client-onboarding package&lt;br /&gt;
# Edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; and set &amp;lt;code&amp;gt;com.openexchange.client.onboarding.enabled&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Edit &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt; to enable autoconfig sending via email. PS: Have a fully working smtp login available like “noreply@yourdomain.tld”&lt;br /&gt;
# Edit client-onboarding-scenarios.yml and set “enable” for : “driveappinstall” , “davsync” “davmanual” “mailsync” “mailmanual” to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Now set the correct caldav/carddav server FQDNs in the corresponding files for your setup&lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; &lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
# Restart OX process&lt;br /&gt;
# Login to AppSuite. Click on Settings - Connect your device&lt;br /&gt;
# Verify that you have following onboarding options available: &lt;br /&gt;
#* windows -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; drive app &lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; details for dav setup&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; drive app&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; drive app&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly disable a certain scenario ===&lt;br /&gt;
&lt;br /&gt;
Simply enter the 'client-onboarding-scenarios.yml' file and go to the section specifying the target scenario. Switch the 'enabled' flag to &amp;amp;quot;false&amp;amp;quot; and execute /opt/open-xchange/sbin/reloadconfiguration command-line tool.&lt;br /&gt;
&lt;br /&gt;
E.g. to disable the OX Drive App:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_3.png]]&lt;br /&gt;
&lt;br /&gt;
=== How can I disable the outdated ui parts like 'Downloads'? ===&lt;br /&gt;
&lt;br /&gt;
The wizard replaces and extends the functionality of the old Download Section in settings and the corresponding widgets. We recommend to disable these outdated parts:&lt;br /&gt;
# widget: get ox drive&lt;br /&gt;
# widget: update&lt;br /&gt;
# settings entry: downloads&lt;br /&gt;
&lt;br /&gt;
'''Remove settings section 'Downloads' '''&lt;br /&gt;
&lt;br /&gt;
Edit ''/opt/open-xchange/etc/settings/appsuite.properties'' and add or change the value to true:&lt;br /&gt;
* ''io.ox/core//settings/downloadsDisabled''&lt;br /&gt;
&lt;br /&gt;
'''Remove widgets'''&lt;br /&gt;
&lt;br /&gt;
To remove the both related portal widget/tiles please refer to the&lt;br /&gt;
[[AppSuite:Configuring_portal_plugins#Disabling_a_tile_completely | portal plugins wiki page ]]&lt;br /&gt;
&lt;br /&gt;
* ''io.ox/portal/widget/oxdriveclients''&lt;br /&gt;
* ''io.ox/portal/widget/updater''&lt;br /&gt;
&lt;br /&gt;
=== How can I add my own App? ===&lt;br /&gt;
&lt;br /&gt;
Provided that the App is accessible by a link (pointing to a commercial App Store or to a downloadable executable/installer), the generic &amp;amp;quot;app&amp;amp;quot; is the suitable provider to choose.&lt;br /&gt;
&lt;br /&gt;
Hence, an appropriate section is supposed to be added to the 'client-onboarding-scenarios.yml' file having a unique name and &amp;amp;quot;provider&amp;amp;quot; attribute set to &amp;amp;quot;[app]&amp;amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The attribute &amp;amp;quot;type&amp;amp;quot; needs to be set to &amp;amp;quot;link&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The attribute &amp;amp;quot;link&amp;amp;quot; should be configured with:&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;url&amp;amp;quot; sub-attribute containing the actual link pointing to the URL location&lt;br /&gt;
* &amp;amp;quot;type&amp;amp;quot; sub-attribute specifying of what type that link is: either &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macappstore&amp;amp;quot;, &amp;amp;quot;playstore&amp;amp;quot; or &amp;amp;quot;common&amp;amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
The type &amp;amp;quot;common&amp;amp;quot; is supposed to be used for links that do not point to a commercial App Store, but to a downloadable executable/installer file.&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;quot;icon&amp;amp;quot; attribute is supposed to contain a comma-separated list of Font Awesome icons (only the ones from v4.4.0 are currently supported) that represent the App; e.g.&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;fa-cloud&amp;amp;quot; for Drive/file-related nature&lt;br /&gt;
* &amp;amp;quot;fa-calendar, fa-users&amp;amp;quot; for Calendar and Address Book synchronization&lt;br /&gt;
* &amp;amp;quot;fa-envelope-o&amp;amp;quot; for Mail nature&lt;br /&gt;
&lt;br /&gt;
Next, the translatable display name and description should be set through setting the attributes &amp;amp;quot;displayName_t10e&amp;amp;quot; and &amp;amp;quot;description_t10e&amp;amp;quot;. As described previously, executing the /opt/open-xchange/sbin/parsei18nyaml command-line tool yields an appropriate .pot file, which can then be used for generating the individual .po file for the different translations.&lt;br /&gt;
&lt;br /&gt;
Finally, the 'client-onboarding.properties' file needs to be modified to specify the &amp;amp;quot;scope&amp;amp;quot; for that new scenario. Add the scenario’s unique name to the appropriate device properties and add it to &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property as well.&lt;br /&gt;
&lt;br /&gt;
After executing /opt/open-xchange/sbin/reloadconfiguration command-line tool the new client onboarding scenario is available for the selected users/devices.&lt;br /&gt;
&lt;br /&gt;
=== How can I upsell my own app? ===&lt;br /&gt;
&lt;br /&gt;
Having the same prerequisites/steps as for &amp;amp;quot;How can I add my own App?&amp;amp;quot; the scenario description in the 'client-onboarding-scenarios.yml' file simply needs to be extended by the desired capabilities, which are supposed to be used for managing the upsell.&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 '''capabilities: &amp;amp;quot;mygoogleapp_capability&amp;amp;quot;'''&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The special &amp;amp;quot;capabilities&amp;amp;quot; attribute is only supported for scenarios of type &amp;amp;quot;link&amp;amp;quot; with the special &amp;amp;quot;app&amp;amp;quot; provider.&lt;br /&gt;
&lt;br /&gt;
With such a &amp;amp;quot;capabilities&amp;amp;quot; attribute only users, which have the &amp;amp;quot;mygoogleapp_capability&amp;amp;quot; capability are allowed to get the link. For those who don’t, the upsell opportunity will be displayed; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[[File:onboarding_4.png]]&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=22878</id>
		<title>AppSuite:Client Onboarding</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=22878"/>
		<updated>2017-02-07T13:08:24Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Scenarios' scope and order */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Client Onboarding&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.1}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Configuration guide for Open-Xchange Client Onboarding =&lt;br /&gt;
&lt;br /&gt;
With Open-Xchange Server v7.8.1 a new module is added allowing users to integrate several different clients and devices with Open-Xchange; such as providing a link to a commercial App Store to install certain apps on mobile devices.&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with several built-in providers; thereof&lt;br /&gt;
&lt;br /&gt;
* CalDAV&lt;br /&gt;
* CardDAV&lt;br /&gt;
* OX Mail App&lt;br /&gt;
* OX Drive App&lt;br /&gt;
* Connector for Microsoft Outlook®&lt;br /&gt;
* Sync App for Android&lt;br /&gt;
* Microsoft ActiveSync&lt;br /&gt;
* eM Client&lt;br /&gt;
* Mail (IMAP/SMTP)&lt;br /&gt;
* Generic Mobile App provider&lt;br /&gt;
&lt;br /&gt;
Those providers allow accessing and/or synchronizing with certain data held by Open-Xchange on a supported device.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
To install the Client Onboarding module, the package open-xchange-client-onboarding needs to be installed.&lt;br /&gt;
&lt;br /&gt;
Moreover the property &amp;lt;code&amp;gt;&amp;quot;com.openexchange.client.onboarding.enabled&amp;quot;&amp;lt;/code&amp;gt;; in installed file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; needs to be set to &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; (default). So getting rid off the entire client on-boarding module simply requires setting the mentioned property to &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; (and executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool).&lt;br /&gt;
&lt;br /&gt;
== Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
The way to specify what and how a certain device is able to get “on-boarded” is mainly determined by so called scenarios. A scenario describes what gets deployed using which providers that contribute their onboarding possibilities and how it is made accessible to the client’s device.&lt;br /&gt;
&lt;br /&gt;
A scenario consists of the following configuration attributes/options&lt;br /&gt;
&lt;br /&gt;
* A unique scenario identifier&lt;br /&gt;
* A flag determining if scenario is enabled or not. If set to 'false' the scenario will not be available, useful for testing/enabling the scenario later on&lt;br /&gt;
* A scenario type, which is one of &amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, or &amp;amp;quot;link&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;plist&amp;amp;quot; for generating a PLIST configuration file for iOS and OSX devices,&lt;br /&gt;
** &amp;amp;quot;manual&amp;amp;quot; for a description for the user for a manual set-up/configuration&lt;br /&gt;
** &amp;amp;quot;link&amp;amp;quot; for a link/URL to either Apple App Store / Google Play Store or to downloadable executable&lt;br /&gt;
* The &amp;amp;quot;link&amp;amp;quot; attribute, which is only considered it type is set to &amp;amp;quot;link&amp;amp;quot;. That attribute consists of the sub-attributes &amp;amp;quot;url&amp;amp;quot; and &amp;amp;quot;type&amp;amp;quot;.&lt;br /&gt;
** &amp;amp;quot;url&amp;amp;quot; provides the actual link/URL to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. For specifying a property that provides the actual link, please use special &amp;amp;quot;property&amp;amp;quot; scheme; e.g. &amp;amp;quot;property://com.openexchange.client.onboarding.app.mylink&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;type&amp;amp;quot; indicates if &amp;amp;quot;url&amp;amp;quot; holds a link for either Apple App Store, Apple Mac Store or Google Play Store. Must only be specified in case &amp;amp;quot;url&amp;amp;quot; points either of those commercial stores. Supported values are &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macstore&amp;amp;quot; and &amp;amp;quot;playstore&amp;amp;quot;&lt;br /&gt;
* The identifiers for the providers, which contribute to the scenario;&amp;lt;br /&amp;gt;&lt;br /&gt;
please check command-line tool &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; to check, which ones are available&lt;br /&gt;
* The identifiers for alternative scenarios. This is typically used to provide alternative manual setup possibility.&lt;br /&gt;
* The comma-separated names of Font Awesome icons that are supposed to be displayed for the scenario&amp;lt;br /&amp;gt;&lt;br /&gt;
(only the ones from v4.4.0 are currently supported)&lt;br /&gt;
* The translatable display name; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
* The translatable description; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
&lt;br /&gt;
== Onboarding providers ==&lt;br /&gt;
&lt;br /&gt;
As described in the previous section, a scenario specifies what providers contribute to it. A provider represents a certain App or (synchronization) protocol that a device can install, download and/or communicate with.&lt;br /&gt;
&lt;br /&gt;
Moreover a provider specifies what Onboarding types are supported (&amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, and/or &amp;amp;quot;link&amp;amp;quot;). Hence, once a provider is chosen to contribute to a certain scenario, the supported on-boarding type needs to match the one of the scenario itself. E.g. a scenario, which indicates to be of type &amp;amp;quot;link&amp;amp;quot;, will always fail if the associated provider signals to support types &amp;amp;quot;plist&amp;amp;quot; and &amp;amp;quot;manual&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To check what providers are available on your system, please execute the &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; command-line tool, which outputs something like:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_1.png]]&lt;br /&gt;
&lt;br /&gt;
Each provider might require one or more capabilities/permissions to be available for the requesting user. If capabilities/permissions are not satisfied, the associated scenario cannot be applied, but will be displayed to the user for upsell opportunities.&lt;br /&gt;
&lt;br /&gt;
=== Generic Onboarding provider for Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic onboarding provider for apps allows specifying custom scenarios of type &amp;amp;quot;link&amp;amp;quot; for arbitrary links/URLs pointing to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. The link can be set directly or via a property.&lt;br /&gt;
&lt;br /&gt;
This provider requires no capability/permission.&lt;br /&gt;
&lt;br /&gt;
An exemplary section in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file might look like (check &amp;amp;quot;Configuring Onboarding scenarios&amp;amp;quot; chapter for more details):&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== CalDAV/CardDAV ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;caldav&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;carddav&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order for a scenario (having CalDAV/CardDAV in its provider listing) to be executable by a user, the &amp;amp;quot;caldav&amp;amp;quot; capability and &amp;amp;quot;carddav&amp;amp;quot; capability respectively are required.&lt;br /&gt;
&lt;br /&gt;
Moreover, the appropriate *DAV end-points are supposed to be configured through property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.caldav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; file and property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.carddav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
=== Drive/Mail Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;driveapp&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;mailapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open-Xchange ships with built-in providers for Drive App and Mail App. The Drive-associated providers do require the &amp;amp;quot;drive&amp;amp;quot; capability and the Mail App requires the &amp;amp;quot;mobile_mail_app&amp;amp;quot; one.&lt;br /&gt;
&lt;br /&gt;
The appropriate links to the apps in the corresponding stores are configured in associated .properties files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-driveapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-mailapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default the links to the official apps are set, but may be changed to ones for branded versions.&lt;br /&gt;
&lt;br /&gt;
=== Drive Windows Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;drivewindowsclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the windows Drive Client. Requires the &amp;amp;quot;drive&amp;amp;quot; capability, but has no configuration options. However, this provider requires the &amp;amp;quot;open-xchange-drive-client-windows&amp;amp;quot; and the orderly configured binaries (e.g. through installing appropriate package according to the brand).&lt;br /&gt;
&lt;br /&gt;
Please check [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_Drive#OX_Drive_for_Windows ''this''] documentation for more details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === eM Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;emclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the eM Client needs the &amp;amp;quot;emclient&amp;amp;quot; capability.&lt;br /&gt;
&lt;br /&gt;
Allows to configure the URL pointing to the executable file through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.emclient.url&amp;lt;/code&amp;gt; in file 'client-onboarding-emclient.properties' file.&lt;br /&gt;
&lt;br /&gt;
=== Sync App ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;syncapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the Sync App for Android. Requires &amp;amp;quot;caldav&amp;amp;quot; and &amp;amp;quot;carddav&amp;amp;quot; capabilities.&lt;br /&gt;
&lt;br /&gt;
The link to Google Play Store is specified via property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.syncapp.store.google.playstore&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-syncapp.properties&amp;lt;/code&amp;gt; file. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mail (IMAP/SMTP) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for deploying the IMAP/STMP account on target device using native/stock mail app. All IMAP/SMTP related settings are settable in file 'client-onboarding-mail.properties'.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft ActiveSync (EAS) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configures the ActiveSync account on target device. Allows specifying the EAS end-point through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.eas.url&amp;lt;/code&amp;gt; property in 'client-onboarding-eas.properties'.&lt;br /&gt;
&lt;br /&gt;
=== OX Updater ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider offering the download for the OX Client Updater ([http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''http:''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''//oxpedia''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''org/wiki/index''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''php''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''?''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''title=AppSuite''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater '':''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''Open-Xchange_Updater'']). The provider is available as soon as the according package is installed and at least one product can be installed/updated via it by the user. A pre-configured scenario 'oxupdaterinstall' is already contained in &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuring Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
Onboarding scenarios are configured through the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Each scenario starts with its own &amp;amp;quot;section&amp;amp;quot; in that YAML file by typing its unique identifier. All further attributes as outlined in chapter &amp;amp;quot;Onboarding scenarios&amp;amp;quot; are nested below that identifier.&lt;br /&gt;
&lt;br /&gt;
=== Easily enabling/disabling scenarios ===&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with a set of pre-defined scenarios that might apply to the most common installations. Each scenario can easily be enabled/disabled through its &amp;amp;quot;enabled&amp;amp;quot; Boolean attribute in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool applies the changes without the need for restart.&lt;br /&gt;
&lt;br /&gt;
=== Translatable strings ===&lt;br /&gt;
&lt;br /&gt;
Those attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; refer to localizable strings and are placed into &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file. Once such attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; are changed/customized and/or added, the appropriate &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file needs to be re-created in order to get translated. For generating that &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file, please execute the /opt/open-xchange/sbin/parsei18nyaml command-line tool. That .pot file needs then be turned to the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Thus changing any of the attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; requires (provided that appropriate .po files are available in &amp;lt;code&amp;gt;/opt/open-xchange/i18n&amp;lt;/code&amp;gt; directory) either a restart or executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool together with stop/start of the &amp;amp;quot;com.openexchange.i18n&amp;amp;quot; bundle.&lt;br /&gt;
&lt;br /&gt;
=== Scenarios' scope and order ===&lt;br /&gt;
&lt;br /&gt;
While the previously mentioned &amp;amp;quot;enabled&amp;amp;quot; attribute offers some kind of generic on/off switch, the properties outlined in this section allow defining the device-scope for a scenario and in which order/precedence they are offered to the client. Scope in terms of&lt;br /&gt;
&lt;br /&gt;
* For what devices (from the set of those specified by providers) are what scenarios in which order available and&lt;br /&gt;
* For which users they are available&lt;br /&gt;
&lt;br /&gt;
As explained above, each scenario specifies one or more type-compatible providers associated with it. In turn, each provider determines to which devices the scenario applies. In order to further control, which device and which users are allowed to access a certain scenario, there are appropriate options available in file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt;. Every option is fully [http://oxpedia.org/wiki/index.php?title=ConfigCascade ''config-cascade''] aware and therefore can be controlled on a global, per context set, per context and per user basis.&lt;br /&gt;
&lt;br /&gt;
Thus, to make a scenario available for certain devices (as dictated by scenario’s providers) and for users as well, the scenario identifier needs to be added to the appropriate properties ending with &amp;amp;quot;.scenarios&amp;amp;quot; (for devices) and added to the &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property (for user) as well.&lt;br /&gt;
&lt;br /&gt;
The following properties accept a comma-separated list of scenario identifiers. The order of listed scenarios reflects the order in which they are offered to the client&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.mac.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.ipad.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.windows.desktop.scenarios&lt;br /&gt;
&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios=mailappinstall, driveappinstall, eassync, mailsync, davsync&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This exemplary setting specifies that Mail App, Drive App, EAS, Mail and CalDAV/CardDAV are available in given order for iPhone devices.&lt;br /&gt;
&lt;br /&gt;
Once a scenario is made accessible through configuration it is visible to users trying to perform a client onboarding using one of associated devices. However, whether a user is effectively allowed to execute that scenario is determined by the required capabilities of the denoted providers; if not allowed it gets displayed as an upsell opportunity.&lt;br /&gt;
&lt;br /&gt;
=== Configuring actions ===&lt;br /&gt;
&lt;br /&gt;
The type for a scenario determines what actions are associated with it to &amp;amp;quot;''transport''&amp;amp;quot; the onboarding information to the client. The types &amp;amp;quot;manual&amp;amp;quot; and &amp;amp;quot;link&amp;amp;quot; only show static information like displaying a link. In contrast the type &amp;amp;quot;plist&amp;amp;quot; allows several actions to transport the configuration profile onto the client. Thereof&lt;br /&gt;
&lt;br /&gt;
* E-Mail&lt;br /&gt;
* SMS&lt;br /&gt;
&lt;br /&gt;
In order to utilize the &amp;amp;quot;E-Mail&amp;amp;quot; action, a special transport must be configured for system-composed E-Mails [http://oxpedia.org/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode#Share_Notifications ''as it is for using the sharing functionality'']. This transport is configured in noreply.properties. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
&lt;br /&gt;
Using the SMS action requires an according implementation being available. OX App Suite comes with an optional sipgate implementation. Please check [http://oxpedia.org/wiki/index.php?title=AppSuite:SMS_Sipgate ''this documentation''] how to setup App Suite accordingly.&lt;br /&gt;
&lt;br /&gt;
==== Implementing your own SMS gateway ====&lt;br /&gt;
&lt;br /&gt;
To use an SMS gateway other than sipgate, you can provide your own implementation. Therefore the Java interface &amp;lt;code&amp;gt;com.openexchange.sms.SMSServiceSPI&amp;lt;/code&amp;gt; needs to be implemented and published as an OSGi service. For parsing phone numbers provided by users &amp;lt;code&amp;gt;com.openexchange.sms.PhoneNumberParserService&amp;lt;/code&amp;gt; can be used. That one is also available as an OSGi service and can be tracked accordingly. You can have a look at bundle &amp;lt;code&amp;gt;com.openexchange.sms.sipgate&amp;lt;/code&amp;gt; as implementation reference.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' You must not install the &amp;lt;code&amp;gt;open-xchange-sms-sipgate&amp;lt;/code&amp;gt; package if you provide your own implementation.&lt;br /&gt;
&lt;br /&gt;
==== PLIST-signing ====&lt;br /&gt;
Scenarios of type &amp;amp;quot;plist&amp;amp;quot; require having PLIST-signing enabled. Otherwise the device will show a warning when importing a received PLIST configuration profile. Please follow the instructions as outlined in [http://oxpedia.org/wiki/index.php?title=AppSuite:PList_signing ''this article''] how to enable and configure signing for PLIST files.&lt;br /&gt;
&lt;br /&gt;
== Adding custom scenarios ==&lt;br /&gt;
&lt;br /&gt;
The first thing to do, is to add an appropriate scenario configuration to the 'client-onboarding-scenarios.yml' file; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The next step is to make that scenario accessible through adapting 'client-onboarding.properties' file. Hence, the scenario identifier needs to be added to the devices, to which it applies (Android devices in this case):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;com.openexchange.client.onboarding.android.tablet.scenarios=..., mygoogleapp&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Furthermore, that scenario needs to be made accessible to users as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;com.openexchange.client.onboarding.enabledScenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
At last, a .pot file is supposed to be generated from the translatable strings using /opt/open-xchange/sbin/parsei18nyaml command-line tool to yield the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Provided that target users do hold appropriate capabilities, they are allowed to execute that scenario. In the example above the &amp;amp;quot;app&amp;amp;quot; provider is specified, which does no require any capabilities. Hence, that scenario is available.&lt;br /&gt;
&lt;br /&gt;
== HowTos ==&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly setup a default/test configuration ? ===&lt;br /&gt;
&lt;br /&gt;
# Install open-xchange-client-onboarding package&lt;br /&gt;
# Edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; and set &amp;lt;code&amp;gt;com.openexchange.client.onboarding.enabled&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Edit &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt; to enable autoconfig sending via email. PS: Have a fully working smtp login available like “noreply@yourdomain.tld”&lt;br /&gt;
# Edit client-onboarding-scenarios.yml and set “enable” for : “driveappinstall” , “davsync” “davmanual” “mailsync” “mailmanual” to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Now set the correct caldav/carddav server FQDNs in the corresponding files for your setup&lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; &lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
# Restart OX process&lt;br /&gt;
# Login to AppSuite. Click on Settings - Connect your device&lt;br /&gt;
# Verify that you have following onboarding options available: &lt;br /&gt;
#* windows -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; drive app &lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; details for dav setup&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; drive app&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; drive app&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly disable a certain scenario ===&lt;br /&gt;
&lt;br /&gt;
Simply enter the 'client-onboarding-scenarios.yml' file and go to the section specifying the target scenario. Switch the 'enabled' flag to &amp;amp;quot;false&amp;amp;quot; and execute /opt/open-xchange/sbin/reloadconfiguration command-line tool.&lt;br /&gt;
&lt;br /&gt;
E.g. to disable the OX Drive App:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_3.png]]&lt;br /&gt;
&lt;br /&gt;
=== How can I disable the outdated ui parts like 'Downloads'? ===&lt;br /&gt;
&lt;br /&gt;
The wizard replaces and extends the functionality of the old Download Section in settings and the corresponding widgets. We recommend to disable these outdated parts:&lt;br /&gt;
# widget: get ox drive&lt;br /&gt;
# widget: update&lt;br /&gt;
# settings entry: downloads&lt;br /&gt;
&lt;br /&gt;
'''Remove settings section 'Downloads' '''&lt;br /&gt;
&lt;br /&gt;
Edit ''/opt/open-xchange/etc/settings/appsuite.properties'' and add or change the value to true:&lt;br /&gt;
* ''io.ox/core//settings/downloadsDisabled''&lt;br /&gt;
&lt;br /&gt;
'''Remove widgets'''&lt;br /&gt;
&lt;br /&gt;
To remove the both related portal widget/tiles please refer to the&lt;br /&gt;
[[AppSuite:Configuring_portal_plugins#Disabling_a_tile_completely | portal plugins wiki page ]]&lt;br /&gt;
&lt;br /&gt;
* ''io.ox/portal/widget/oxdriveclients''&lt;br /&gt;
* ''io.ox/portal/widget/updater''&lt;br /&gt;
&lt;br /&gt;
=== How can I add my own App? ===&lt;br /&gt;
&lt;br /&gt;
Provided that the App is accessible by a link (pointing to a commercial App Store or to a downloadable executable/installer), the generic &amp;amp;quot;app&amp;amp;quot; is the suitable provider to choose.&lt;br /&gt;
&lt;br /&gt;
Hence, an appropriate section is supposed to be added to the 'client-onboarding-scenarios.yml' file having a unique name and &amp;amp;quot;provider&amp;amp;quot; attribute set to &amp;amp;quot;[app]&amp;amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The attribute &amp;amp;quot;type&amp;amp;quot; needs to be set to &amp;amp;quot;link&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The attribute &amp;amp;quot;link&amp;amp;quot; should be configured with:&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;url&amp;amp;quot; sub-attribute containing the actual link pointing to the URL location&lt;br /&gt;
* &amp;amp;quot;type&amp;amp;quot; sub-attribute specifying of what type that link is: either &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macappstore&amp;amp;quot;, &amp;amp;quot;playstore&amp;amp;quot; or &amp;amp;quot;common&amp;amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
The type &amp;amp;quot;common&amp;amp;quot; is supposed to be used for links that do not point to a commercial App Store, but to a downloadable executable/installer file.&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;quot;icon&amp;amp;quot; attribute is supposed to contain a comma-separated list of Font Awesome icons (only the ones from v4.4.0 are currently supported) that represent the App; e.g.&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;fa-cloud&amp;amp;quot; for Drive/file-related nature&lt;br /&gt;
* &amp;amp;quot;fa-calendar, fa-users&amp;amp;quot; for Calendar and Address Book synchronization&lt;br /&gt;
* &amp;amp;quot;fa-envelope-o&amp;amp;quot; for Mail nature&lt;br /&gt;
&lt;br /&gt;
Next, the translatable display name and description should be set through setting the attributes &amp;amp;quot;displayName_t10e&amp;amp;quot; and &amp;amp;quot;description_t10e&amp;amp;quot;. As described previously, executing the /opt/open-xchange/sbin/parsei18nyaml command-line tool yields an appropriate .pot file, which can then be used for generating the individual .po file for the different translations.&lt;br /&gt;
&lt;br /&gt;
Finally, the 'client-onboarding.properties' file needs to be modified to specify the &amp;amp;quot;scope&amp;amp;quot; for that new scenario. Add the scenario’s unique name to the appropriate device properties and add it to &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property as well.&lt;br /&gt;
&lt;br /&gt;
After executing /opt/open-xchange/sbin/reloadconfiguration command-line tool the new client onboarding scenario is available for the selected users/devices.&lt;br /&gt;
&lt;br /&gt;
=== How can I upsell my own app? ===&lt;br /&gt;
&lt;br /&gt;
Having the same prerequisites/steps as for &amp;amp;quot;How can I add my own App?&amp;amp;quot; the scenario description in the 'client-onboarding-scenarios.yml' file simply needs to be extended by the desired capabilities, which are supposed to be used for managing the upsell.&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 '''capabilities: &amp;amp;quot;mygoogleapp_capability&amp;amp;quot;'''&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The special &amp;amp;quot;capabilities&amp;amp;quot; attribute is only supported for scenarios of type &amp;amp;quot;link&amp;amp;quot; with the special &amp;amp;quot;app&amp;amp;quot; provider.&lt;br /&gt;
&lt;br /&gt;
With such a &amp;amp;quot;capabilities&amp;amp;quot; attribute only users, which have the &amp;amp;quot;mygoogleapp_capability&amp;amp;quot; capability are allowed to get the link. For those who don’t, the upsell opportunity will be displayed; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[[File:onboarding_4.png]]&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=22877</id>
		<title>AppSuite:Client Onboarding</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=22877"/>
		<updated>2017-02-07T13:05:47Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Scenario scope and order */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Client Onboarding&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.1}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Configuration guide for Open-Xchange Client Onboarding =&lt;br /&gt;
&lt;br /&gt;
With Open-Xchange Server v7.8.1 a new module is added allowing users to integrate several different clients and devices with Open-Xchange; such as providing a link to a commercial App Store to install certain apps on mobile devices.&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with several built-in providers; thereof&lt;br /&gt;
&lt;br /&gt;
* CalDAV&lt;br /&gt;
* CardDAV&lt;br /&gt;
* OX Mail App&lt;br /&gt;
* OX Drive App&lt;br /&gt;
* Connector for Microsoft Outlook®&lt;br /&gt;
* Sync App for Android&lt;br /&gt;
* Microsoft ActiveSync&lt;br /&gt;
* eM Client&lt;br /&gt;
* Mail (IMAP/SMTP)&lt;br /&gt;
* Generic Mobile App provider&lt;br /&gt;
&lt;br /&gt;
Those providers allow accessing and/or synchronizing with certain data held by Open-Xchange on a supported device.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
To install the Client Onboarding module, the package open-xchange-client-onboarding needs to be installed.&lt;br /&gt;
&lt;br /&gt;
Moreover the property &amp;lt;code&amp;gt;&amp;quot;com.openexchange.client.onboarding.enabled&amp;quot;&amp;lt;/code&amp;gt;; in installed file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; needs to be set to &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; (default). So getting rid off the entire client on-boarding module simply requires setting the mentioned property to &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; (and executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool).&lt;br /&gt;
&lt;br /&gt;
== Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
The way to specify what and how a certain device is able to get “on-boarded” is mainly determined by so called scenarios. A scenario describes what gets deployed using which providers that contribute their onboarding possibilities and how it is made accessible to the client’s device.&lt;br /&gt;
&lt;br /&gt;
A scenario consists of the following configuration attributes/options&lt;br /&gt;
&lt;br /&gt;
* A unique scenario identifier&lt;br /&gt;
* A flag determining if scenario is enabled or not. If set to 'false' the scenario will not be available, useful for testing/enabling the scenario later on&lt;br /&gt;
* A scenario type, which is one of &amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, or &amp;amp;quot;link&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;plist&amp;amp;quot; for generating a PLIST configuration file for iOS and OSX devices,&lt;br /&gt;
** &amp;amp;quot;manual&amp;amp;quot; for a description for the user for a manual set-up/configuration&lt;br /&gt;
** &amp;amp;quot;link&amp;amp;quot; for a link/URL to either Apple App Store / Google Play Store or to downloadable executable&lt;br /&gt;
* The &amp;amp;quot;link&amp;amp;quot; attribute, which is only considered it type is set to &amp;amp;quot;link&amp;amp;quot;. That attribute consists of the sub-attributes &amp;amp;quot;url&amp;amp;quot; and &amp;amp;quot;type&amp;amp;quot;.&lt;br /&gt;
** &amp;amp;quot;url&amp;amp;quot; provides the actual link/URL to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. For specifying a property that provides the actual link, please use special &amp;amp;quot;property&amp;amp;quot; scheme; e.g. &amp;amp;quot;property://com.openexchange.client.onboarding.app.mylink&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;type&amp;amp;quot; indicates if &amp;amp;quot;url&amp;amp;quot; holds a link for either Apple App Store, Apple Mac Store or Google Play Store. Must only be specified in case &amp;amp;quot;url&amp;amp;quot; points either of those commercial stores. Supported values are &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macstore&amp;amp;quot; and &amp;amp;quot;playstore&amp;amp;quot;&lt;br /&gt;
* The identifiers for the providers, which contribute to the scenario;&amp;lt;br /&amp;gt;&lt;br /&gt;
please check command-line tool &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; to check, which ones are available&lt;br /&gt;
* The identifiers for alternative scenarios. This is typically used to provide alternative manual setup possibility.&lt;br /&gt;
* The comma-separated names of Font Awesome icons that are supposed to be displayed for the scenario&amp;lt;br /&amp;gt;&lt;br /&gt;
(only the ones from v4.4.0 are currently supported)&lt;br /&gt;
* The translatable display name; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
* The translatable description; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
&lt;br /&gt;
== Onboarding providers ==&lt;br /&gt;
&lt;br /&gt;
As described in the previous section, a scenario specifies what providers contribute to it. A provider represents a certain App or (synchronization) protocol that a device can install, download and/or communicate with.&lt;br /&gt;
&lt;br /&gt;
Moreover a provider specifies what Onboarding types are supported (&amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, and/or &amp;amp;quot;link&amp;amp;quot;). Hence, once a provider is chosen to contribute to a certain scenario, the supported on-boarding type needs to match the one of the scenario itself. E.g. a scenario, which indicates to be of type &amp;amp;quot;link&amp;amp;quot;, will always fail if the associated provider signals to support types &amp;amp;quot;plist&amp;amp;quot; and &amp;amp;quot;manual&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To check what providers are available on your system, please execute the &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; command-line tool, which outputs something like:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_1.png]]&lt;br /&gt;
&lt;br /&gt;
Each provider might require one or more capabilities/permissions to be available for the requesting user. If capabilities/permissions are not satisfied, the associated scenario cannot be applied, but will be displayed to the user for upsell opportunities.&lt;br /&gt;
&lt;br /&gt;
=== Generic Onboarding provider for Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic onboarding provider for apps allows specifying custom scenarios of type &amp;amp;quot;link&amp;amp;quot; for arbitrary links/URLs pointing to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. The link can be set directly or via a property.&lt;br /&gt;
&lt;br /&gt;
This provider requires no capability/permission.&lt;br /&gt;
&lt;br /&gt;
An exemplary section in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file might look like (check &amp;amp;quot;Configuring Onboarding scenarios&amp;amp;quot; chapter for more details):&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== CalDAV/CardDAV ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;caldav&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;carddav&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order for a scenario (having CalDAV/CardDAV in its provider listing) to be executable by a user, the &amp;amp;quot;caldav&amp;amp;quot; capability and &amp;amp;quot;carddav&amp;amp;quot; capability respectively are required.&lt;br /&gt;
&lt;br /&gt;
Moreover, the appropriate *DAV end-points are supposed to be configured through property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.caldav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; file and property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.carddav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
=== Drive/Mail Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;driveapp&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;mailapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open-Xchange ships with built-in providers for Drive App and Mail App. The Drive-associated providers do require the &amp;amp;quot;drive&amp;amp;quot; capability and the Mail App requires the &amp;amp;quot;mobile_mail_app&amp;amp;quot; one.&lt;br /&gt;
&lt;br /&gt;
The appropriate links to the apps in the corresponding stores are configured in associated .properties files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-driveapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-mailapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default the links to the official apps are set, but may be changed to ones for branded versions.&lt;br /&gt;
&lt;br /&gt;
=== Drive Windows Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;drivewindowsclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the windows Drive Client. Requires the &amp;amp;quot;drive&amp;amp;quot; capability, but has no configuration options. However, this provider requires the &amp;amp;quot;open-xchange-drive-client-windows&amp;amp;quot; and the orderly configured binaries (e.g. through installing appropriate package according to the brand).&lt;br /&gt;
&lt;br /&gt;
Please check [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_Drive#OX_Drive_for_Windows ''this''] documentation for more details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === eM Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;emclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the eM Client needs the &amp;amp;quot;emclient&amp;amp;quot; capability.&lt;br /&gt;
&lt;br /&gt;
Allows to configure the URL pointing to the executable file through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.emclient.url&amp;lt;/code&amp;gt; in file 'client-onboarding-emclient.properties' file.&lt;br /&gt;
&lt;br /&gt;
=== Sync App ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;syncapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the Sync App for Android. Requires &amp;amp;quot;caldav&amp;amp;quot; and &amp;amp;quot;carddav&amp;amp;quot; capabilities.&lt;br /&gt;
&lt;br /&gt;
The link to Google Play Store is specified via property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.syncapp.store.google.playstore&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-syncapp.properties&amp;lt;/code&amp;gt; file. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mail (IMAP/SMTP) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for deploying the IMAP/STMP account on target device using native/stock mail app. All IMAP/SMTP related settings are settable in file 'client-onboarding-mail.properties'.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft ActiveSync (EAS) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configures the ActiveSync account on target device. Allows specifying the EAS end-point through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.eas.url&amp;lt;/code&amp;gt; property in 'client-onboarding-eas.properties'.&lt;br /&gt;
&lt;br /&gt;
=== OX Updater ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider offering the download for the OX Client Updater ([http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''http:''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''//oxpedia''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''org/wiki/index''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''php''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''?''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''title=AppSuite''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater '':''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''Open-Xchange_Updater'']). The provider is available as soon as the according package is installed and at least one product can be installed/updated via it by the user. A pre-configured scenario 'oxupdaterinstall' is already contained in &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuring Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
Onboarding scenarios are configured through the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Each scenario starts with its own &amp;amp;quot;section&amp;amp;quot; in that YAML file by typing its unique identifier. All further attributes as outlined in chapter &amp;amp;quot;Onboarding scenarios&amp;amp;quot; are nested below that identifier.&lt;br /&gt;
&lt;br /&gt;
=== Easily enabling/disabling scenarios ===&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with a set of pre-defined scenarios that might apply to the most common installations. Each scenario can easily be enabled/disabled through its &amp;amp;quot;enabled&amp;amp;quot; Boolean attribute in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool applies the changes without the need for restart.&lt;br /&gt;
&lt;br /&gt;
=== Translatable strings ===&lt;br /&gt;
&lt;br /&gt;
Those attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; refer to localizable strings and are placed into &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file. Once such attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; are changed/customized and/or added, the appropriate &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file needs to be re-created in order to get translated. For generating that &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file, please execute the /opt/open-xchange/sbin/parsei18nyaml command-line tool. That .pot file needs then be turned to the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Thus changing any of the attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; requires (provided that appropriate .po files are available in &amp;lt;code&amp;gt;/opt/open-xchange/i18n&amp;lt;/code&amp;gt; directory) either a restart or executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool together with stop/start of the &amp;amp;quot;com.openexchange.i18n&amp;amp;quot; bundle.&lt;br /&gt;
&lt;br /&gt;
=== Scenarios' scope and order ===&lt;br /&gt;
&lt;br /&gt;
While the previously mentioned &amp;amp;quot;enabled&amp;amp;quot; attribute offers some kind of generic on/off switch, the properties outlined in this section allow defining the device-scope for a scenario and in which order/precedence they are offered to the client. Scope in terms of&lt;br /&gt;
&lt;br /&gt;
* For what devices (from the set of those specified by providers) are what scenarios in which order available and&lt;br /&gt;
* For which users they are available&lt;br /&gt;
&lt;br /&gt;
As explained above, each scenario specifies one or more type-compatible providers associated with it. In turn, each provider determines to which devices the scenario applies. In order to further control, which device and which users are allowed to access a certain scenario, there are appropriate options available in file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt;. Every option is fully [http://oxpedia.org/wiki/index.php?title=ConfigCascade ''config-cascade''] aware and therefore can be controlled on a global, per context set, per context and per user basis.&lt;br /&gt;
&lt;br /&gt;
Thus, to make a scenario available for certain devices (as dictated by scenario’s providers) and for users as well, the scenario identifier needs to be added to the appropriate properties ending with &amp;amp;quot;.scenarios&amp;amp;quot; (for devices) and added to the &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property (for user) as well.&lt;br /&gt;
&lt;br /&gt;
The following properties accept a comma-separated list of scenario identifiers. The order of listed scenarios reflects the order in which they are offered to the client&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.mac.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.ipad.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.windows.desktop.scenarios&lt;br /&gt;
&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once a scenario is made accessible through configuration it is visible to users trying to perform a client onboarding using one of associated devices. However, whether a user is effectively allowed to execute that scenario is determined by the required capabilities of the denoted providers; if not allowed it gets displayed as an upsell opportunity.&lt;br /&gt;
&lt;br /&gt;
=== Configuring actions ===&lt;br /&gt;
&lt;br /&gt;
The type for a scenario determines what actions are associated with it to &amp;amp;quot;''transport''&amp;amp;quot; the onboarding information to the client. The types &amp;amp;quot;manual&amp;amp;quot; and &amp;amp;quot;link&amp;amp;quot; only show static information like displaying a link. In contrast the type &amp;amp;quot;plist&amp;amp;quot; allows several actions to transport the configuration profile onto the client. Thereof&lt;br /&gt;
&lt;br /&gt;
* E-Mail&lt;br /&gt;
* SMS&lt;br /&gt;
&lt;br /&gt;
In order to utilize the &amp;amp;quot;E-Mail&amp;amp;quot; action, a special transport must be configured for system-composed E-Mails [http://oxpedia.org/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode#Share_Notifications ''as it is for using the sharing functionality'']. This transport is configured in noreply.properties. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
&lt;br /&gt;
Using the SMS action requires an according implementation being available. OX App Suite comes with an optional sipgate implementation. Please check [http://oxpedia.org/wiki/index.php?title=AppSuite:SMS_Sipgate ''this documentation''] how to setup App Suite accordingly.&lt;br /&gt;
&lt;br /&gt;
==== Implementing your own SMS gateway ====&lt;br /&gt;
&lt;br /&gt;
To use an SMS gateway other than sipgate, you can provide your own implementation. Therefore the Java interface &amp;lt;code&amp;gt;com.openexchange.sms.SMSServiceSPI&amp;lt;/code&amp;gt; needs to be implemented and published as an OSGi service. For parsing phone numbers provided by users &amp;lt;code&amp;gt;com.openexchange.sms.PhoneNumberParserService&amp;lt;/code&amp;gt; can be used. That one is also available as an OSGi service and can be tracked accordingly. You can have a look at bundle &amp;lt;code&amp;gt;com.openexchange.sms.sipgate&amp;lt;/code&amp;gt; as implementation reference.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' You must not install the &amp;lt;code&amp;gt;open-xchange-sms-sipgate&amp;lt;/code&amp;gt; package if you provide your own implementation.&lt;br /&gt;
&lt;br /&gt;
==== PLIST-signing ====&lt;br /&gt;
Scenarios of type &amp;amp;quot;plist&amp;amp;quot; require having PLIST-signing enabled. Otherwise the device will show a warning when importing a received PLIST configuration profile. Please follow the instructions as outlined in [http://oxpedia.org/wiki/index.php?title=AppSuite:PList_signing ''this article''] how to enable and configure signing for PLIST files.&lt;br /&gt;
&lt;br /&gt;
== Adding custom scenarios ==&lt;br /&gt;
&lt;br /&gt;
The first thing to do, is to add an appropriate scenario configuration to the 'client-onboarding-scenarios.yml' file; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The next step is to make that scenario accessible through adapting 'client-onboarding.properties' file. Hence, the scenario identifier needs to be added to the devices, to which it applies (Android devices in this case):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;com.openexchange.client.onboarding.android.tablet.scenarios=..., mygoogleapp&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Furthermore, that scenario needs to be made accessible to users as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;com.openexchange.client.onboarding.enabledScenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
At last, a .pot file is supposed to be generated from the translatable strings using /opt/open-xchange/sbin/parsei18nyaml command-line tool to yield the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Provided that target users do hold appropriate capabilities, they are allowed to execute that scenario. In the example above the &amp;amp;quot;app&amp;amp;quot; provider is specified, which does no require any capabilities. Hence, that scenario is available.&lt;br /&gt;
&lt;br /&gt;
== HowTos ==&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly setup a default/test configuration ? ===&lt;br /&gt;
&lt;br /&gt;
# Install open-xchange-client-onboarding package&lt;br /&gt;
# Edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; and set &amp;lt;code&amp;gt;com.openexchange.client.onboarding.enabled&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Edit &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt; to enable autoconfig sending via email. PS: Have a fully working smtp login available like “noreply@yourdomain.tld”&lt;br /&gt;
# Edit client-onboarding-scenarios.yml and set “enable” for : “driveappinstall” , “davsync” “davmanual” “mailsync” “mailmanual” to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Now set the correct caldav/carddav server FQDNs in the corresponding files for your setup&lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; &lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
# Restart OX process&lt;br /&gt;
# Login to AppSuite. Click on Settings - Connect your device&lt;br /&gt;
# Verify that you have following onboarding options available: &lt;br /&gt;
#* windows -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; drive app &lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; details for dav setup&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; drive app&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; drive app&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly disable a certain scenario ===&lt;br /&gt;
&lt;br /&gt;
Simply enter the 'client-onboarding-scenarios.yml' file and go to the section specifying the target scenario. Switch the 'enabled' flag to &amp;amp;quot;false&amp;amp;quot; and execute /opt/open-xchange/sbin/reloadconfiguration command-line tool.&lt;br /&gt;
&lt;br /&gt;
E.g. to disable the OX Drive App:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_3.png]]&lt;br /&gt;
&lt;br /&gt;
=== How can I disable the outdated ui parts like 'Downloads'? ===&lt;br /&gt;
&lt;br /&gt;
The wizard replaces and extends the functionality of the old Download Section in settings and the corresponding widgets. We recommend to disable these outdated parts:&lt;br /&gt;
# widget: get ox drive&lt;br /&gt;
# widget: update&lt;br /&gt;
# settings entry: downloads&lt;br /&gt;
&lt;br /&gt;
'''Remove settings section 'Downloads' '''&lt;br /&gt;
&lt;br /&gt;
Edit ''/opt/open-xchange/etc/settings/appsuite.properties'' and add or change the value to true:&lt;br /&gt;
* ''io.ox/core//settings/downloadsDisabled''&lt;br /&gt;
&lt;br /&gt;
'''Remove widgets'''&lt;br /&gt;
&lt;br /&gt;
To remove the both related portal widget/tiles please refer to the&lt;br /&gt;
[[AppSuite:Configuring_portal_plugins#Disabling_a_tile_completely | portal plugins wiki page ]]&lt;br /&gt;
&lt;br /&gt;
* ''io.ox/portal/widget/oxdriveclients''&lt;br /&gt;
* ''io.ox/portal/widget/updater''&lt;br /&gt;
&lt;br /&gt;
=== How can I add my own App? ===&lt;br /&gt;
&lt;br /&gt;
Provided that the App is accessible by a link (pointing to a commercial App Store or to a downloadable executable/installer), the generic &amp;amp;quot;app&amp;amp;quot; is the suitable provider to choose.&lt;br /&gt;
&lt;br /&gt;
Hence, an appropriate section is supposed to be added to the 'client-onboarding-scenarios.yml' file having a unique name and &amp;amp;quot;provider&amp;amp;quot; attribute set to &amp;amp;quot;[app]&amp;amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The attribute &amp;amp;quot;type&amp;amp;quot; needs to be set to &amp;amp;quot;link&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The attribute &amp;amp;quot;link&amp;amp;quot; should be configured with:&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;url&amp;amp;quot; sub-attribute containing the actual link pointing to the URL location&lt;br /&gt;
* &amp;amp;quot;type&amp;amp;quot; sub-attribute specifying of what type that link is: either &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macappstore&amp;amp;quot;, &amp;amp;quot;playstore&amp;amp;quot; or &amp;amp;quot;common&amp;amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
The type &amp;amp;quot;common&amp;amp;quot; is supposed to be used for links that do not point to a commercial App Store, but to a downloadable executable/installer file.&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;quot;icon&amp;amp;quot; attribute is supposed to contain a comma-separated list of Font Awesome icons (only the ones from v4.4.0 are currently supported) that represent the App; e.g.&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;fa-cloud&amp;amp;quot; for Drive/file-related nature&lt;br /&gt;
* &amp;amp;quot;fa-calendar, fa-users&amp;amp;quot; for Calendar and Address Book synchronization&lt;br /&gt;
* &amp;amp;quot;fa-envelope-o&amp;amp;quot; for Mail nature&lt;br /&gt;
&lt;br /&gt;
Next, the translatable display name and description should be set through setting the attributes &amp;amp;quot;displayName_t10e&amp;amp;quot; and &amp;amp;quot;description_t10e&amp;amp;quot;. As described previously, executing the /opt/open-xchange/sbin/parsei18nyaml command-line tool yields an appropriate .pot file, which can then be used for generating the individual .po file for the different translations.&lt;br /&gt;
&lt;br /&gt;
Finally, the 'client-onboarding.properties' file needs to be modified to specify the &amp;amp;quot;scope&amp;amp;quot; for that new scenario. Add the scenario’s unique name to the appropriate device properties and add it to &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property as well.&lt;br /&gt;
&lt;br /&gt;
After executing /opt/open-xchange/sbin/reloadconfiguration command-line tool the new client onboarding scenario is available for the selected users/devices.&lt;br /&gt;
&lt;br /&gt;
=== How can I upsell my own app? ===&lt;br /&gt;
&lt;br /&gt;
Having the same prerequisites/steps as for &amp;amp;quot;How can I add my own App?&amp;amp;quot; the scenario description in the 'client-onboarding-scenarios.yml' file simply needs to be extended by the desired capabilities, which are supposed to be used for managing the upsell.&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 '''capabilities: &amp;amp;quot;mygoogleapp_capability&amp;amp;quot;'''&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The special &amp;amp;quot;capabilities&amp;amp;quot; attribute is only supported for scenarios of type &amp;amp;quot;link&amp;amp;quot; with the special &amp;amp;quot;app&amp;amp;quot; provider.&lt;br /&gt;
&lt;br /&gt;
With such a &amp;amp;quot;capabilities&amp;amp;quot; attribute only users, which have the &amp;amp;quot;mygoogleapp_capability&amp;amp;quot; capability are allowed to get the link. For those who don’t, the upsell opportunity will be displayed; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[[File:onboarding_4.png]]&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=22876</id>
		<title>AppSuite:Client Onboarding</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=22876"/>
		<updated>2017-02-07T13:05:16Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Scenario scope */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Client Onboarding&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.1}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Configuration guide for Open-Xchange Client Onboarding =&lt;br /&gt;
&lt;br /&gt;
With Open-Xchange Server v7.8.1 a new module is added allowing users to integrate several different clients and devices with Open-Xchange; such as providing a link to a commercial App Store to install certain apps on mobile devices.&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with several built-in providers; thereof&lt;br /&gt;
&lt;br /&gt;
* CalDAV&lt;br /&gt;
* CardDAV&lt;br /&gt;
* OX Mail App&lt;br /&gt;
* OX Drive App&lt;br /&gt;
* Connector for Microsoft Outlook®&lt;br /&gt;
* Sync App for Android&lt;br /&gt;
* Microsoft ActiveSync&lt;br /&gt;
* eM Client&lt;br /&gt;
* Mail (IMAP/SMTP)&lt;br /&gt;
* Generic Mobile App provider&lt;br /&gt;
&lt;br /&gt;
Those providers allow accessing and/or synchronizing with certain data held by Open-Xchange on a supported device.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
To install the Client Onboarding module, the package open-xchange-client-onboarding needs to be installed.&lt;br /&gt;
&lt;br /&gt;
Moreover the property &amp;lt;code&amp;gt;&amp;quot;com.openexchange.client.onboarding.enabled&amp;quot;&amp;lt;/code&amp;gt;; in installed file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; needs to be set to &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; (default). So getting rid off the entire client on-boarding module simply requires setting the mentioned property to &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; (and executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool).&lt;br /&gt;
&lt;br /&gt;
== Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
The way to specify what and how a certain device is able to get “on-boarded” is mainly determined by so called scenarios. A scenario describes what gets deployed using which providers that contribute their onboarding possibilities and how it is made accessible to the client’s device.&lt;br /&gt;
&lt;br /&gt;
A scenario consists of the following configuration attributes/options&lt;br /&gt;
&lt;br /&gt;
* A unique scenario identifier&lt;br /&gt;
* A flag determining if scenario is enabled or not. If set to 'false' the scenario will not be available, useful for testing/enabling the scenario later on&lt;br /&gt;
* A scenario type, which is one of &amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, or &amp;amp;quot;link&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;plist&amp;amp;quot; for generating a PLIST configuration file for iOS and OSX devices,&lt;br /&gt;
** &amp;amp;quot;manual&amp;amp;quot; for a description for the user for a manual set-up/configuration&lt;br /&gt;
** &amp;amp;quot;link&amp;amp;quot; for a link/URL to either Apple App Store / Google Play Store or to downloadable executable&lt;br /&gt;
* The &amp;amp;quot;link&amp;amp;quot; attribute, which is only considered it type is set to &amp;amp;quot;link&amp;amp;quot;. That attribute consists of the sub-attributes &amp;amp;quot;url&amp;amp;quot; and &amp;amp;quot;type&amp;amp;quot;.&lt;br /&gt;
** &amp;amp;quot;url&amp;amp;quot; provides the actual link/URL to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. For specifying a property that provides the actual link, please use special &amp;amp;quot;property&amp;amp;quot; scheme; e.g. &amp;amp;quot;property://com.openexchange.client.onboarding.app.mylink&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;type&amp;amp;quot; indicates if &amp;amp;quot;url&amp;amp;quot; holds a link for either Apple App Store, Apple Mac Store or Google Play Store. Must only be specified in case &amp;amp;quot;url&amp;amp;quot; points either of those commercial stores. Supported values are &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macstore&amp;amp;quot; and &amp;amp;quot;playstore&amp;amp;quot;&lt;br /&gt;
* The identifiers for the providers, which contribute to the scenario;&amp;lt;br /&amp;gt;&lt;br /&gt;
please check command-line tool &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; to check, which ones are available&lt;br /&gt;
* The identifiers for alternative scenarios. This is typically used to provide alternative manual setup possibility.&lt;br /&gt;
* The comma-separated names of Font Awesome icons that are supposed to be displayed for the scenario&amp;lt;br /&amp;gt;&lt;br /&gt;
(only the ones from v4.4.0 are currently supported)&lt;br /&gt;
* The translatable display name; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
* The translatable description; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
&lt;br /&gt;
== Onboarding providers ==&lt;br /&gt;
&lt;br /&gt;
As described in the previous section, a scenario specifies what providers contribute to it. A provider represents a certain App or (synchronization) protocol that a device can install, download and/or communicate with.&lt;br /&gt;
&lt;br /&gt;
Moreover a provider specifies what Onboarding types are supported (&amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, and/or &amp;amp;quot;link&amp;amp;quot;). Hence, once a provider is chosen to contribute to a certain scenario, the supported on-boarding type needs to match the one of the scenario itself. E.g. a scenario, which indicates to be of type &amp;amp;quot;link&amp;amp;quot;, will always fail if the associated provider signals to support types &amp;amp;quot;plist&amp;amp;quot; and &amp;amp;quot;manual&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To check what providers are available on your system, please execute the &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; command-line tool, which outputs something like:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_1.png]]&lt;br /&gt;
&lt;br /&gt;
Each provider might require one or more capabilities/permissions to be available for the requesting user. If capabilities/permissions are not satisfied, the associated scenario cannot be applied, but will be displayed to the user for upsell opportunities.&lt;br /&gt;
&lt;br /&gt;
=== Generic Onboarding provider for Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic onboarding provider for apps allows specifying custom scenarios of type &amp;amp;quot;link&amp;amp;quot; for arbitrary links/URLs pointing to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. The link can be set directly or via a property.&lt;br /&gt;
&lt;br /&gt;
This provider requires no capability/permission.&lt;br /&gt;
&lt;br /&gt;
An exemplary section in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file might look like (check &amp;amp;quot;Configuring Onboarding scenarios&amp;amp;quot; chapter for more details):&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== CalDAV/CardDAV ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;caldav&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;carddav&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order for a scenario (having CalDAV/CardDAV in its provider listing) to be executable by a user, the &amp;amp;quot;caldav&amp;amp;quot; capability and &amp;amp;quot;carddav&amp;amp;quot; capability respectively are required.&lt;br /&gt;
&lt;br /&gt;
Moreover, the appropriate *DAV end-points are supposed to be configured through property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.caldav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; file and property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.carddav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
=== Drive/Mail Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;driveapp&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;mailapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open-Xchange ships with built-in providers for Drive App and Mail App. The Drive-associated providers do require the &amp;amp;quot;drive&amp;amp;quot; capability and the Mail App requires the &amp;amp;quot;mobile_mail_app&amp;amp;quot; one.&lt;br /&gt;
&lt;br /&gt;
The appropriate links to the apps in the corresponding stores are configured in associated .properties files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-driveapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-mailapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default the links to the official apps are set, but may be changed to ones for branded versions.&lt;br /&gt;
&lt;br /&gt;
=== Drive Windows Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;drivewindowsclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the windows Drive Client. Requires the &amp;amp;quot;drive&amp;amp;quot; capability, but has no configuration options. However, this provider requires the &amp;amp;quot;open-xchange-drive-client-windows&amp;amp;quot; and the orderly configured binaries (e.g. through installing appropriate package according to the brand).&lt;br /&gt;
&lt;br /&gt;
Please check [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_Drive#OX_Drive_for_Windows ''this''] documentation for more details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === eM Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;emclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the eM Client needs the &amp;amp;quot;emclient&amp;amp;quot; capability.&lt;br /&gt;
&lt;br /&gt;
Allows to configure the URL pointing to the executable file through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.emclient.url&amp;lt;/code&amp;gt; in file 'client-onboarding-emclient.properties' file.&lt;br /&gt;
&lt;br /&gt;
=== Sync App ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;syncapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the Sync App for Android. Requires &amp;amp;quot;caldav&amp;amp;quot; and &amp;amp;quot;carddav&amp;amp;quot; capabilities.&lt;br /&gt;
&lt;br /&gt;
The link to Google Play Store is specified via property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.syncapp.store.google.playstore&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-syncapp.properties&amp;lt;/code&amp;gt; file. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mail (IMAP/SMTP) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for deploying the IMAP/STMP account on target device using native/stock mail app. All IMAP/SMTP related settings are settable in file 'client-onboarding-mail.properties'.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft ActiveSync (EAS) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configures the ActiveSync account on target device. Allows specifying the EAS end-point through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.eas.url&amp;lt;/code&amp;gt; property in 'client-onboarding-eas.properties'.&lt;br /&gt;
&lt;br /&gt;
=== OX Updater ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider offering the download for the OX Client Updater ([http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''http:''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''//oxpedia''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''org/wiki/index''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''php''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''?''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''title=AppSuite''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater '':''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''Open-Xchange_Updater'']). The provider is available as soon as the according package is installed and at least one product can be installed/updated via it by the user. A pre-configured scenario 'oxupdaterinstall' is already contained in &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuring Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
Onboarding scenarios are configured through the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Each scenario starts with its own &amp;amp;quot;section&amp;amp;quot; in that YAML file by typing its unique identifier. All further attributes as outlined in chapter &amp;amp;quot;Onboarding scenarios&amp;amp;quot; are nested below that identifier.&lt;br /&gt;
&lt;br /&gt;
=== Easily enabling/disabling scenarios ===&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with a set of pre-defined scenarios that might apply to the most common installations. Each scenario can easily be enabled/disabled through its &amp;amp;quot;enabled&amp;amp;quot; Boolean attribute in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool applies the changes without the need for restart.&lt;br /&gt;
&lt;br /&gt;
=== Translatable strings ===&lt;br /&gt;
&lt;br /&gt;
Those attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; refer to localizable strings and are placed into &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file. Once such attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; are changed/customized and/or added, the appropriate &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file needs to be re-created in order to get translated. For generating that &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file, please execute the /opt/open-xchange/sbin/parsei18nyaml command-line tool. That .pot file needs then be turned to the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Thus changing any of the attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; requires (provided that appropriate .po files are available in &amp;lt;code&amp;gt;/opt/open-xchange/i18n&amp;lt;/code&amp;gt; directory) either a restart or executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool together with stop/start of the &amp;amp;quot;com.openexchange.i18n&amp;amp;quot; bundle.&lt;br /&gt;
&lt;br /&gt;
=== Scenario scope and order ===&lt;br /&gt;
&lt;br /&gt;
While the previously mentioned &amp;amp;quot;enabled&amp;amp;quot; attribute offers some kind of generic on/off switch, the properties outlined in this section allow defining the device-scope for a scenario and in which order/precedence they are offered to the client. Scope in terms of&lt;br /&gt;
&lt;br /&gt;
* For what devices (from the set of those specified by providers) are what scenarios in which order available and&lt;br /&gt;
* For which users they are available&lt;br /&gt;
&lt;br /&gt;
As explained above, each scenario specifies one or more type-compatible providers associated with it. In turn, each provider determines to which devices the scenario applies. In order to further control, which device and which users are allowed to access a certain scenario, there are appropriate options available in file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt;. Every option is fully [http://oxpedia.org/wiki/index.php?title=ConfigCascade ''config-cascade''] aware and therefore can be controlled on a global, per context set, per context and per user basis.&lt;br /&gt;
&lt;br /&gt;
Thus, to make a scenario available for certain devices (as dictated by scenario’s providers) and for users as well, the scenario identifier needs to be added to the appropriate properties ending with &amp;amp;quot;.scenarios&amp;amp;quot; (for devices) and added to the &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property (for user) as well.&lt;br /&gt;
&lt;br /&gt;
The following properties accept a comma-separated list of scenario identifiers. The order of listed scenarios reflects the order in which they are offered to the client&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.mac.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.ipad.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.windows.desktop.scenarios&lt;br /&gt;
&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Once a scenario is made accessible through configuration it is visible to users trying to perform a client onboarding using one of associated devices. However, whether a user is effectively allowed to execute that scenario is determined by the required capabilities of the denoted providers; if not allowed it gets displayed as an upsell opportunity.&lt;br /&gt;
&lt;br /&gt;
=== Configuring actions ===&lt;br /&gt;
&lt;br /&gt;
The type for a scenario determines what actions are associated with it to &amp;amp;quot;''transport''&amp;amp;quot; the onboarding information to the client. The types &amp;amp;quot;manual&amp;amp;quot; and &amp;amp;quot;link&amp;amp;quot; only show static information like displaying a link. In contrast the type &amp;amp;quot;plist&amp;amp;quot; allows several actions to transport the configuration profile onto the client. Thereof&lt;br /&gt;
&lt;br /&gt;
* E-Mail&lt;br /&gt;
* SMS&lt;br /&gt;
&lt;br /&gt;
In order to utilize the &amp;amp;quot;E-Mail&amp;amp;quot; action, a special transport must be configured for system-composed E-Mails [http://oxpedia.org/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode#Share_Notifications ''as it is for using the sharing functionality'']. This transport is configured in noreply.properties. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
&lt;br /&gt;
Using the SMS action requires an according implementation being available. OX App Suite comes with an optional sipgate implementation. Please check [http://oxpedia.org/wiki/index.php?title=AppSuite:SMS_Sipgate ''this documentation''] how to setup App Suite accordingly.&lt;br /&gt;
&lt;br /&gt;
==== Implementing your own SMS gateway ====&lt;br /&gt;
&lt;br /&gt;
To use an SMS gateway other than sipgate, you can provide your own implementation. Therefore the Java interface &amp;lt;code&amp;gt;com.openexchange.sms.SMSServiceSPI&amp;lt;/code&amp;gt; needs to be implemented and published as an OSGi service. For parsing phone numbers provided by users &amp;lt;code&amp;gt;com.openexchange.sms.PhoneNumberParserService&amp;lt;/code&amp;gt; can be used. That one is also available as an OSGi service and can be tracked accordingly. You can have a look at bundle &amp;lt;code&amp;gt;com.openexchange.sms.sipgate&amp;lt;/code&amp;gt; as implementation reference.&lt;br /&gt;
&lt;br /&gt;
'''Important:''' You must not install the &amp;lt;code&amp;gt;open-xchange-sms-sipgate&amp;lt;/code&amp;gt; package if you provide your own implementation.&lt;br /&gt;
&lt;br /&gt;
==== PLIST-signing ====&lt;br /&gt;
Scenarios of type &amp;amp;quot;plist&amp;amp;quot; require having PLIST-signing enabled. Otherwise the device will show a warning when importing a received PLIST configuration profile. Please follow the instructions as outlined in [http://oxpedia.org/wiki/index.php?title=AppSuite:PList_signing ''this article''] how to enable and configure signing for PLIST files.&lt;br /&gt;
&lt;br /&gt;
== Adding custom scenarios ==&lt;br /&gt;
&lt;br /&gt;
The first thing to do, is to add an appropriate scenario configuration to the 'client-onboarding-scenarios.yml' file; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The next step is to make that scenario accessible through adapting 'client-onboarding.properties' file. Hence, the scenario identifier needs to be added to the devices, to which it applies (Android devices in this case):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;com.openexchange.client.onboarding.android.tablet.scenarios=..., mygoogleapp&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Furthermore, that scenario needs to be made accessible to users as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;com.openexchange.client.onboarding.enabledScenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
At last, a .pot file is supposed to be generated from the translatable strings using /opt/open-xchange/sbin/parsei18nyaml command-line tool to yield the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Provided that target users do hold appropriate capabilities, they are allowed to execute that scenario. In the example above the &amp;amp;quot;app&amp;amp;quot; provider is specified, which does no require any capabilities. Hence, that scenario is available.&lt;br /&gt;
&lt;br /&gt;
== HowTos ==&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly setup a default/test configuration ? ===&lt;br /&gt;
&lt;br /&gt;
# Install open-xchange-client-onboarding package&lt;br /&gt;
# Edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; and set &amp;lt;code&amp;gt;com.openexchange.client.onboarding.enabled&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Edit &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt; to enable autoconfig sending via email. PS: Have a fully working smtp login available like “noreply@yourdomain.tld”&lt;br /&gt;
# Edit client-onboarding-scenarios.yml and set “enable” for : “driveappinstall” , “davsync” “davmanual” “mailsync” “mailmanual” to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Now set the correct caldav/carddav server FQDNs in the corresponding files for your setup&lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; &lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
# Restart OX process&lt;br /&gt;
# Login to AppSuite. Click on Settings - Connect your device&lt;br /&gt;
# Verify that you have following onboarding options available: &lt;br /&gt;
#* windows -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; drive app &lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; details for dav setup&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; drive app&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; drive app&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly disable a certain scenario ===&lt;br /&gt;
&lt;br /&gt;
Simply enter the 'client-onboarding-scenarios.yml' file and go to the section specifying the target scenario. Switch the 'enabled' flag to &amp;amp;quot;false&amp;amp;quot; and execute /opt/open-xchange/sbin/reloadconfiguration command-line tool.&lt;br /&gt;
&lt;br /&gt;
E.g. to disable the OX Drive App:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_3.png]]&lt;br /&gt;
&lt;br /&gt;
=== How can I disable the outdated ui parts like 'Downloads'? ===&lt;br /&gt;
&lt;br /&gt;
The wizard replaces and extends the functionality of the old Download Section in settings and the corresponding widgets. We recommend to disable these outdated parts:&lt;br /&gt;
# widget: get ox drive&lt;br /&gt;
# widget: update&lt;br /&gt;
# settings entry: downloads&lt;br /&gt;
&lt;br /&gt;
'''Remove settings section 'Downloads' '''&lt;br /&gt;
&lt;br /&gt;
Edit ''/opt/open-xchange/etc/settings/appsuite.properties'' and add or change the value to true:&lt;br /&gt;
* ''io.ox/core//settings/downloadsDisabled''&lt;br /&gt;
&lt;br /&gt;
'''Remove widgets'''&lt;br /&gt;
&lt;br /&gt;
To remove the both related portal widget/tiles please refer to the&lt;br /&gt;
[[AppSuite:Configuring_portal_plugins#Disabling_a_tile_completely | portal plugins wiki page ]]&lt;br /&gt;
&lt;br /&gt;
* ''io.ox/portal/widget/oxdriveclients''&lt;br /&gt;
* ''io.ox/portal/widget/updater''&lt;br /&gt;
&lt;br /&gt;
=== How can I add my own App? ===&lt;br /&gt;
&lt;br /&gt;
Provided that the App is accessible by a link (pointing to a commercial App Store or to a downloadable executable/installer), the generic &amp;amp;quot;app&amp;amp;quot; is the suitable provider to choose.&lt;br /&gt;
&lt;br /&gt;
Hence, an appropriate section is supposed to be added to the 'client-onboarding-scenarios.yml' file having a unique name and &amp;amp;quot;provider&amp;amp;quot; attribute set to &amp;amp;quot;[app]&amp;amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The attribute &amp;amp;quot;type&amp;amp;quot; needs to be set to &amp;amp;quot;link&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The attribute &amp;amp;quot;link&amp;amp;quot; should be configured with:&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;url&amp;amp;quot; sub-attribute containing the actual link pointing to the URL location&lt;br /&gt;
* &amp;amp;quot;type&amp;amp;quot; sub-attribute specifying of what type that link is: either &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macappstore&amp;amp;quot;, &amp;amp;quot;playstore&amp;amp;quot; or &amp;amp;quot;common&amp;amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
The type &amp;amp;quot;common&amp;amp;quot; is supposed to be used for links that do not point to a commercial App Store, but to a downloadable executable/installer file.&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;quot;icon&amp;amp;quot; attribute is supposed to contain a comma-separated list of Font Awesome icons (only the ones from v4.4.0 are currently supported) that represent the App; e.g.&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;fa-cloud&amp;amp;quot; for Drive/file-related nature&lt;br /&gt;
* &amp;amp;quot;fa-calendar, fa-users&amp;amp;quot; for Calendar and Address Book synchronization&lt;br /&gt;
* &amp;amp;quot;fa-envelope-o&amp;amp;quot; for Mail nature&lt;br /&gt;
&lt;br /&gt;
Next, the translatable display name and description should be set through setting the attributes &amp;amp;quot;displayName_t10e&amp;amp;quot; and &amp;amp;quot;description_t10e&amp;amp;quot;. As described previously, executing the /opt/open-xchange/sbin/parsei18nyaml command-line tool yields an appropriate .pot file, which can then be used for generating the individual .po file for the different translations.&lt;br /&gt;
&lt;br /&gt;
Finally, the 'client-onboarding.properties' file needs to be modified to specify the &amp;amp;quot;scope&amp;amp;quot; for that new scenario. Add the scenario’s unique name to the appropriate device properties and add it to &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property as well.&lt;br /&gt;
&lt;br /&gt;
After executing /opt/open-xchange/sbin/reloadconfiguration command-line tool the new client onboarding scenario is available for the selected users/devices.&lt;br /&gt;
&lt;br /&gt;
=== How can I upsell my own app? ===&lt;br /&gt;
&lt;br /&gt;
Having the same prerequisites/steps as for &amp;amp;quot;How can I add my own App?&amp;amp;quot; the scenario description in the 'client-onboarding-scenarios.yml' file simply needs to be extended by the desired capabilities, which are supposed to be used for managing the upsell.&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 '''capabilities: &amp;amp;quot;mygoogleapp_capability&amp;amp;quot;'''&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The special &amp;amp;quot;capabilities&amp;amp;quot; attribute is only supported for scenarios of type &amp;amp;quot;link&amp;amp;quot; with the special &amp;amp;quot;app&amp;amp;quot; provider.&lt;br /&gt;
&lt;br /&gt;
With such a &amp;amp;quot;capabilities&amp;amp;quot; attribute only users, which have the &amp;amp;quot;mygoogleapp_capability&amp;amp;quot; capability are allowed to get the link. For those who don’t, the upsell opportunity will be displayed; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[[File:onboarding_4.png]]&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22502</id>
		<title>AppSuite:File Storages per User</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22502"/>
		<updated>2016-11-03T08:42:24Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* What happens in over quota scenarios by deleting users? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version|7.8.0}}&lt;br /&gt;
&lt;br /&gt;
= File Storages per user =&lt;br /&gt;
&lt;br /&gt;
This document tries to outline and explain the new concept of having the possibility to specify file storages on a per user basis that is introduced with Open‐Xchange Server v7.8.0.&lt;br /&gt;
&lt;br /&gt;
== The previous situation ==&lt;br /&gt;
&lt;br /&gt;
Before the introduction of the file storages per user feature, it was only possible to specify the file storage association per context.&lt;br /&gt;
That file storage was used for all modules/functions that are supposed to store/retrieve files:&lt;br /&gt;
* Drive&lt;br /&gt;
* Thumbnails&lt;br /&gt;
* PIM attachments&lt;br /&gt;
* Signature attachments&lt;br /&gt;
&lt;br /&gt;
File storages are registered and maintained in file store table held in configDb database. File storage obtains a unique identifier, a base URI and a size limitation.&lt;br /&gt;
&lt;br /&gt;
For each context a file storage identifier is specified alongside with a context quota that defines how much space that context is allowed to occupy in assigned file storage. Thus the sum of all quotas from those contexts assigned to file storage must not exceed the file storage’s size.&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture1.png|One file storage per context|650px]]&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
The motivation is to differentiate between file storages for common context‐associated files and Drive file. Those Drive files may further reside in the common context‐associated storage, but it also possible to specify user‐associated file storages where Drive files are maintained. The association is determined based on a folder's creator/owner: The quota gets accounted to that user that created a folder (provided the user has a user‐associated file storage).&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture2.png|Differentiate|650px]]&lt;br /&gt;
&lt;br /&gt;
That kind of separation allows different provisioning scenarios that an administrator possibly wants to achieve. With regard to Drive files it is now possible to define per context that:&lt;br /&gt;
&lt;br /&gt;
* All Drive files reside in the file storage associated with the context, which is either automatically determined or explicitly set (through -F,--destination-store-id option) when creating a context. All Drive files (from users of that context) and all other file resources (Snippets, PIM attachments, ...) share the same quota usage and limit settings. The file storage associated with the context is called '''context file storage'''.&lt;br /&gt;
* Certain users are supposed to store their Drive files in their own file storage with individual quota settings different from the context file storage. All files created in Drive folders owned by such a user are then accounted to that user-associated file storage having their own quota usage and limitation. The user-associated file storage may be set on user creation as it is for context creation. The file storage associated with a user is called '''user file storage'''. Introducing a user file storage is suitable when an administrator wants to have user-sensitive quota settings for Drive files and/or wants to assign a different type of storage for Drive files uploaded by users; e.g. let seldom used/accessed file resources reside in context file storage, but let frequently, highly accessed Drive files reside in a better storage sink&lt;br /&gt;
* A certain user has his own (bigger) file storage for Drive files and other users of that context are supposed to use that file storage to share the quota usage and limitation specified for that file storage. A file storage owned by a user that is also used by other users is called '''master file storage'''.&lt;br /&gt;
&lt;br /&gt;
Having that possibilities of separation for quota usage and limitation it is possible to apply a certain use case scenario to contexts; e.g.&lt;br /&gt;
&lt;br /&gt;
* Slow mass storage vs. fast Drive storage setup&lt;br /&gt;
* OX Drive Stand‐Alone setup&lt;br /&gt;
&lt;br /&gt;
When assigning dedicated file storage for Drive to a certain user, the user’s file occupation is no more accounted to the overall context in which that user resides, but gets accounted to a dedicated user quota. Such a user quota can be used for different sales strategies that include tracking the user’s file occupation.&lt;br /&gt;
&lt;br /&gt;
To achieve the file storage association on a per user basis, the existing user table has been enhanced by file storage and quota information as it is for the context table. Moreover the filestore_usage table has also been enhanced by the capability to account storage occupation to a certain user&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture3.png|Enhancements|650px]]&lt;br /&gt;
&lt;br /&gt;
In addition the user table has also been extended by filestore_owner column. That column is used to let a user’s file storage be combined with another user’s storage. This serves the scenario in which a grouped OX Drive Stand‐Alone setup is operated. Multiple users’ file occupation gets accounted to a master user account.&lt;br /&gt;
&lt;br /&gt;
Furthermore Open‐Xchange allows changing the running setups at any time to adjust the file storage usages/associations according to possibly changing needs/requirements.&lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
Please note that with introducing the concept of having user-associated file storages, the output for &amp;quot;listfilestore&amp;quot; command-line tool changed. Since also a user can be accounted to a file storage's capacity, the output changed to be:&lt;br /&gt;
&lt;br /&gt;
 /opt/open-xchange/sbin/listfilestore -A oxadminmaster -P secret&lt;br /&gt;
  id path                      size reserved used max-entities cur-entities&lt;br /&gt;
   2 file:///var/opt/filestore 1000      300    0         5000            2&lt;br /&gt;
&lt;br /&gt;
Hence, &amp;quot;maxctx&amp;quot; is replaced with &amp;quot;max-entities&amp;quot; and &amp;quot;curctx&amp;quot; is replaced with &amp;quot;cur-entities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Seamless integration and flexibility ==&lt;br /&gt;
The new more flexible approach fits seamlessly into existing context/file storage setups. Thus there is no need to change anything, unless demanded by administrator&lt;br /&gt;
&lt;br /&gt;
=== The fall‐back setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture4.png|The fall-back setup|650px]]&lt;br /&gt;
&lt;br /&gt;
Everything stays as is. There is a storage‐per‐context association and every file is held in that storage. There are no user‐specific file storage attributes set in user table.&lt;br /&gt;
&lt;br /&gt;
=== Slow mass storage vs. fast file storage setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture5.png|Slow mass storage|650px]]&lt;br /&gt;
&lt;br /&gt;
There are two storages available: a file‐based and an S3 storage (assuming that the S3 one would be faster). While the context has the file‐based storage set, users in that context do have individual name spaces in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
That way common files (PIM/Signature attachments, thumbnails) are stored to context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage. Every user is allowed to occupy up to 10GB of space in the S3 storage (this can be varied as well).&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Single User ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture6.png|OX Drive Stand-Alone - Single User|650px]]&lt;br /&gt;
&lt;br /&gt;
Again there two file storages. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
Context designated to the Single User scenario for OX Drive Stand‐Alone operation, do hold only one user that has its individual name space associated in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
Again common files (PIM/Signature attachments, thumbnails) are stored in the context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage of each context. Every Drive document accounts the user‐sensitive quota of the associated user.&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Business Account ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture7.png|OX Drive Stand-Alone - Business Account|650px]]&lt;br /&gt;
&lt;br /&gt;
There two different file storages as in the previous setups. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
For this setup users do not hold their own individual name space in the S3 storage, but all share the same name space of the master user in the S3 storage. Moreover there are no dedicated user quotas, but all Drive documents do account to the master user’s quota&lt;br /&gt;
&lt;br /&gt;
== Extensions to provisioning command‐line tools ==&lt;br /&gt;
&lt;br /&gt;
=== createuser ===&lt;br /&gt;
&lt;br /&gt;
The existing createuser CLI is enhanced by the following options&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
 ‐f/‐‐filestore The identifier for the file storage.&lt;br /&gt;
 ‐o/‐‐owner The owner for the file storage. If no owner is given and f/filestore option is set, the user itself is taken as owner&lt;br /&gt;
&lt;br /&gt;
=== changeuser ===&lt;br /&gt;
&lt;br /&gt;
The existing changeuser CLI is enhanced by the following option&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Option ALLOW_CHANGING_QUOTA_IF_NO_FILESTORE_SET in file 'AdminUser.properties' controls if a user file storage is automatically enabled if the ‐q/‐‐quota option is given on a 'changeuser' invocation as an alternative to 'movecontextfilestore2user'. For users without a user file storage the 'changeuser' CLT needs to be called with a quota value different to unlimited (-1) and unlimited quota will only be enabled in case the user already has a user file storage.&lt;br /&gt;
&lt;br /&gt;
=== movecontextfilestore2user ===&lt;br /&gt;
&lt;br /&gt;
Move a user’s files from a context to an individual storage name space. &amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movecontextfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another which means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2context ===&lt;br /&gt;
&lt;br /&gt;
The counterpart for the previous CLI. Move a user's files from his individual storage name space to the context storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2context&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another that means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2master ===&lt;br /&gt;
Move a user's files from his individual storage name space to the storage name space of specified master.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;br /&gt;
&lt;br /&gt;
=== movemasterfilestore2user ===&lt;br /&gt;
Move a user's files from a master account name space to an individual storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movemasterfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;br /&gt;
&lt;br /&gt;
=== Creating a user file storage ===&lt;br /&gt;
&lt;br /&gt;
Having the extensions to command-line tools a user-associated file storage can be enabled:&lt;br /&gt;
&lt;br /&gt;
* After using 'movecontextfilestore2user' command-line tool&lt;br /&gt;
* Using 'changeuser' command-line tool with quota and filestore options or only quota options and &amp;quot;ALLOW_CHANGING_QUOTA_IF_NO_FILESTORE_SET&amp;quot; set to &amp;quot;true&amp;quot; in 'AdminUser.properties' file&lt;br /&gt;
* By provisioning via 'createuser' command-line tool with quota and filestore options&lt;br /&gt;
&lt;br /&gt;
== Useful command‐line tools ==&lt;br /&gt;
&lt;br /&gt;
The following command‐line tools might be useful to get an overview&lt;br /&gt;
&lt;br /&gt;
* 'listfilestore' to list available file storages that can be assigned to contexts/users&lt;br /&gt;
* 'listcontext' to get the quota limit specified per context or -1 if none&lt;br /&gt;
* 'listuser' to get the quota limit specified per user or -1 if none&lt;br /&gt;
* 'listuserfilestores' to get a listing of users that use their own user file storage&lt;br /&gt;
&lt;br /&gt;
== FAQs ==&lt;br /&gt;
&lt;br /&gt;
=== When is a user filestore enabled or when did a user has a own filestore? ===&lt;br /&gt;
&lt;br /&gt;
A user filestore has an own filestore if a filestore is assigned to this user. This can either be done via the create and update clt's or via the movecontextfilestore2user clt.&lt;br /&gt;
&lt;br /&gt;
=== When is which quota affected? ===&lt;br /&gt;
&lt;br /&gt;
In case the user has no own filestore the quota of the context filestore is affected. In case the user has an own filestore or in case the user is a slave user of another users filestore the quota of this user filestore is affected.&lt;br /&gt;
&lt;br /&gt;
=== How can a user check his quota usage? ===&lt;br /&gt;
&lt;br /&gt;
The 'Quota' portal widget shows quota and usage.&lt;br /&gt;
&lt;br /&gt;
=== How to change the filestore quota shown in the portal widget? ===&lt;br /&gt;
&lt;br /&gt;
To change the quota one just has to use the changeuser or changecontext CLT with the --quota (-q) argument. E.g.:&lt;br /&gt;
&lt;br /&gt;
changecontext -A adminmaster -P masterpassword -c -q 1024&lt;br /&gt;
&lt;br /&gt;
=== How does quota work for public files? ===&lt;br /&gt;
&lt;br /&gt;
The quota of the folder creator/owner is in charge for files other users put inside. This affects the quota for users having an own filestore&lt;br /&gt;
&lt;br /&gt;
=== What happens with ownership of public files and folders when the creator/owner gets deleted? ===&lt;br /&gt;
&lt;br /&gt;
This depends which argument is used during the delete operation. In the default case, the context admin is assigned as the owner. But it is also possible that the data is assigned to a different user or that the data is completed removed.&lt;br /&gt;
&lt;br /&gt;
=== What happens in over quota scenarios by deleting users? ===&lt;br /&gt;
&lt;br /&gt;
If the data is assigned to a different user the quota limit is ignored. But the user (inheriting deleted user's files) is supposed to clean existing files as any attempt to create a Drive file will fail due to over-quota&lt;br /&gt;
&lt;br /&gt;
=== How to deal with quota issues for the context admin caused by public files? ===&lt;br /&gt;
&lt;br /&gt;
If the quota is too limited for the context admin the data should be completely removed or assigned to a different user. E.g.:&lt;br /&gt;
 deleteuser -A ctxadmin -P password -c -i --no-reassign&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22501</id>
		<title>AppSuite:File Storages per User</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22501"/>
		<updated>2016-11-03T08:40:57Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Useful command‐line tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version|7.8.0}}&lt;br /&gt;
&lt;br /&gt;
= File Storages per user =&lt;br /&gt;
&lt;br /&gt;
This document tries to outline and explain the new concept of having the possibility to specify file storages on a per user basis that is introduced with Open‐Xchange Server v7.8.0.&lt;br /&gt;
&lt;br /&gt;
== The previous situation ==&lt;br /&gt;
&lt;br /&gt;
Before the introduction of the file storages per user feature, it was only possible to specify the file storage association per context.&lt;br /&gt;
That file storage was used for all modules/functions that are supposed to store/retrieve files:&lt;br /&gt;
* Drive&lt;br /&gt;
* Thumbnails&lt;br /&gt;
* PIM attachments&lt;br /&gt;
* Signature attachments&lt;br /&gt;
&lt;br /&gt;
File storages are registered and maintained in file store table held in configDb database. File storage obtains a unique identifier, a base URI and a size limitation.&lt;br /&gt;
&lt;br /&gt;
For each context a file storage identifier is specified alongside with a context quota that defines how much space that context is allowed to occupy in assigned file storage. Thus the sum of all quotas from those contexts assigned to file storage must not exceed the file storage’s size.&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture1.png|One file storage per context|650px]]&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
The motivation is to differentiate between file storages for common context‐associated files and Drive file. Those Drive files may further reside in the common context‐associated storage, but it also possible to specify user‐associated file storages where Drive files are maintained. The association is determined based on a folder's creator/owner: The quota gets accounted to that user that created a folder (provided the user has a user‐associated file storage).&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture2.png|Differentiate|650px]]&lt;br /&gt;
&lt;br /&gt;
That kind of separation allows different provisioning scenarios that an administrator possibly wants to achieve. With regard to Drive files it is now possible to define per context that:&lt;br /&gt;
&lt;br /&gt;
* All Drive files reside in the file storage associated with the context, which is either automatically determined or explicitly set (through -F,--destination-store-id option) when creating a context. All Drive files (from users of that context) and all other file resources (Snippets, PIM attachments, ...) share the same quota usage and limit settings. The file storage associated with the context is called '''context file storage'''.&lt;br /&gt;
* Certain users are supposed to store their Drive files in their own file storage with individual quota settings different from the context file storage. All files created in Drive folders owned by such a user are then accounted to that user-associated file storage having their own quota usage and limitation. The user-associated file storage may be set on user creation as it is for context creation. The file storage associated with a user is called '''user file storage'''. Introducing a user file storage is suitable when an administrator wants to have user-sensitive quota settings for Drive files and/or wants to assign a different type of storage for Drive files uploaded by users; e.g. let seldom used/accessed file resources reside in context file storage, but let frequently, highly accessed Drive files reside in a better storage sink&lt;br /&gt;
* A certain user has his own (bigger) file storage for Drive files and other users of that context are supposed to use that file storage to share the quota usage and limitation specified for that file storage. A file storage owned by a user that is also used by other users is called '''master file storage'''.&lt;br /&gt;
&lt;br /&gt;
Having that possibilities of separation for quota usage and limitation it is possible to apply a certain use case scenario to contexts; e.g.&lt;br /&gt;
&lt;br /&gt;
* Slow mass storage vs. fast Drive storage setup&lt;br /&gt;
* OX Drive Stand‐Alone setup&lt;br /&gt;
&lt;br /&gt;
When assigning dedicated file storage for Drive to a certain user, the user’s file occupation is no more accounted to the overall context in which that user resides, but gets accounted to a dedicated user quota. Such a user quota can be used for different sales strategies that include tracking the user’s file occupation.&lt;br /&gt;
&lt;br /&gt;
To achieve the file storage association on a per user basis, the existing user table has been enhanced by file storage and quota information as it is for the context table. Moreover the filestore_usage table has also been enhanced by the capability to account storage occupation to a certain user&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture3.png|Enhancements|650px]]&lt;br /&gt;
&lt;br /&gt;
In addition the user table has also been extended by filestore_owner column. That column is used to let a user’s file storage be combined with another user’s storage. This serves the scenario in which a grouped OX Drive Stand‐Alone setup is operated. Multiple users’ file occupation gets accounted to a master user account.&lt;br /&gt;
&lt;br /&gt;
Furthermore Open‐Xchange allows changing the running setups at any time to adjust the file storage usages/associations according to possibly changing needs/requirements.&lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
Please note that with introducing the concept of having user-associated file storages, the output for &amp;quot;listfilestore&amp;quot; command-line tool changed. Since also a user can be accounted to a file storage's capacity, the output changed to be:&lt;br /&gt;
&lt;br /&gt;
 /opt/open-xchange/sbin/listfilestore -A oxadminmaster -P secret&lt;br /&gt;
  id path                      size reserved used max-entities cur-entities&lt;br /&gt;
   2 file:///var/opt/filestore 1000      300    0         5000            2&lt;br /&gt;
&lt;br /&gt;
Hence, &amp;quot;maxctx&amp;quot; is replaced with &amp;quot;max-entities&amp;quot; and &amp;quot;curctx&amp;quot; is replaced with &amp;quot;cur-entities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Seamless integration and flexibility ==&lt;br /&gt;
The new more flexible approach fits seamlessly into existing context/file storage setups. Thus there is no need to change anything, unless demanded by administrator&lt;br /&gt;
&lt;br /&gt;
=== The fall‐back setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture4.png|The fall-back setup|650px]]&lt;br /&gt;
&lt;br /&gt;
Everything stays as is. There is a storage‐per‐context association and every file is held in that storage. There are no user‐specific file storage attributes set in user table.&lt;br /&gt;
&lt;br /&gt;
=== Slow mass storage vs. fast file storage setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture5.png|Slow mass storage|650px]]&lt;br /&gt;
&lt;br /&gt;
There are two storages available: a file‐based and an S3 storage (assuming that the S3 one would be faster). While the context has the file‐based storage set, users in that context do have individual name spaces in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
That way common files (PIM/Signature attachments, thumbnails) are stored to context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage. Every user is allowed to occupy up to 10GB of space in the S3 storage (this can be varied as well).&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Single User ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture6.png|OX Drive Stand-Alone - Single User|650px]]&lt;br /&gt;
&lt;br /&gt;
Again there two file storages. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
Context designated to the Single User scenario for OX Drive Stand‐Alone operation, do hold only one user that has its individual name space associated in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
Again common files (PIM/Signature attachments, thumbnails) are stored in the context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage of each context. Every Drive document accounts the user‐sensitive quota of the associated user.&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Business Account ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture7.png|OX Drive Stand-Alone - Business Account|650px]]&lt;br /&gt;
&lt;br /&gt;
There two different file storages as in the previous setups. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
For this setup users do not hold their own individual name space in the S3 storage, but all share the same name space of the master user in the S3 storage. Moreover there are no dedicated user quotas, but all Drive documents do account to the master user’s quota&lt;br /&gt;
&lt;br /&gt;
== Extensions to provisioning command‐line tools ==&lt;br /&gt;
&lt;br /&gt;
=== createuser ===&lt;br /&gt;
&lt;br /&gt;
The existing createuser CLI is enhanced by the following options&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
 ‐f/‐‐filestore The identifier for the file storage.&lt;br /&gt;
 ‐o/‐‐owner The owner for the file storage. If no owner is given and f/filestore option is set, the user itself is taken as owner&lt;br /&gt;
&lt;br /&gt;
=== changeuser ===&lt;br /&gt;
&lt;br /&gt;
The existing changeuser CLI is enhanced by the following option&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Option ALLOW_CHANGING_QUOTA_IF_NO_FILESTORE_SET in file 'AdminUser.properties' controls if a user file storage is automatically enabled if the ‐q/‐‐quota option is given on a 'changeuser' invocation as an alternative to 'movecontextfilestore2user'. For users without a user file storage the 'changeuser' CLT needs to be called with a quota value different to unlimited (-1) and unlimited quota will only be enabled in case the user already has a user file storage.&lt;br /&gt;
&lt;br /&gt;
=== movecontextfilestore2user ===&lt;br /&gt;
&lt;br /&gt;
Move a user’s files from a context to an individual storage name space. &amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movecontextfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another which means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2context ===&lt;br /&gt;
&lt;br /&gt;
The counterpart for the previous CLI. Move a user's files from his individual storage name space to the context storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2context&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another that means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2master ===&lt;br /&gt;
Move a user's files from his individual storage name space to the storage name space of specified master.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;br /&gt;
&lt;br /&gt;
=== movemasterfilestore2user ===&lt;br /&gt;
Move a user's files from a master account name space to an individual storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movemasterfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;br /&gt;
&lt;br /&gt;
=== Creating a user file storage ===&lt;br /&gt;
&lt;br /&gt;
Having the extensions to command-line tools a user-associated file storage can be enabled:&lt;br /&gt;
&lt;br /&gt;
* After using 'movecontextfilestore2user' command-line tool&lt;br /&gt;
* Using 'changeuser' command-line tool with quota and filestore options or only quota options and &amp;quot;ALLOW_CHANGING_QUOTA_IF_NO_FILESTORE_SET&amp;quot; set to &amp;quot;true&amp;quot; in 'AdminUser.properties' file&lt;br /&gt;
* By provisioning via 'createuser' command-line tool with quota and filestore options&lt;br /&gt;
&lt;br /&gt;
== Useful command‐line tools ==&lt;br /&gt;
&lt;br /&gt;
The following command‐line tools might be useful to get an overview&lt;br /&gt;
&lt;br /&gt;
* 'listfilestore' to list available file storages that can be assigned to contexts/users&lt;br /&gt;
* 'listcontext' to get the quota limit specified per context or -1 if none&lt;br /&gt;
* 'listuser' to get the quota limit specified per user or -1 if none&lt;br /&gt;
* 'listuserfilestores' to get a listing of users that use their own user file storage&lt;br /&gt;
&lt;br /&gt;
== FAQs ==&lt;br /&gt;
&lt;br /&gt;
=== When is a user filestore enabled or when did a user has a own filestore? ===&lt;br /&gt;
&lt;br /&gt;
A user filestore has an own filestore if a filestore is assigned to this user. This can either be done via the create and update clt's or via the movecontextfilestore2user clt.&lt;br /&gt;
&lt;br /&gt;
=== When is which quota affected? ===&lt;br /&gt;
&lt;br /&gt;
In case the user has no own filestore the quota of the context filestore is affected. In case the user has an own filestore or in case the user is a slave user of another users filestore the quota of this user filestore is affected.&lt;br /&gt;
&lt;br /&gt;
=== How can a user check his quota usage? ===&lt;br /&gt;
&lt;br /&gt;
The 'Quota' portal widget shows quota and usage.&lt;br /&gt;
&lt;br /&gt;
=== How to change the filestore quota shown in the portal widget? ===&lt;br /&gt;
&lt;br /&gt;
To change the quota one just has to use the changeuser or changecontext CLT with the --quota (-q) argument. E.g.:&lt;br /&gt;
&lt;br /&gt;
changecontext -A adminmaster -P masterpassword -c -q 1024&lt;br /&gt;
&lt;br /&gt;
=== How does quota work for public files? ===&lt;br /&gt;
&lt;br /&gt;
The quota of the folder creator/owner is in charge for files other users put inside. This affects the quota for users having an own filestore&lt;br /&gt;
&lt;br /&gt;
=== What happens with ownership of public files and folders when the creator/owner gets deleted? ===&lt;br /&gt;
&lt;br /&gt;
This depends which argument is used during the delete operation. In the default case, the context admin is assigned as the owner. But it is also possible that the data is assigned to a different user or that the data is completed removed.&lt;br /&gt;
&lt;br /&gt;
=== What happens in over quota scenarios by deleting users? ===&lt;br /&gt;
&lt;br /&gt;
If the data is assigned to a different user the quota limit is ignored.&lt;br /&gt;
&lt;br /&gt;
=== How to deal with quota issues for the context admin caused by public files? ===&lt;br /&gt;
&lt;br /&gt;
If the quota is too limited for the context admin the data should be completely removed or assigned to a different user. E.g.:&lt;br /&gt;
 deleteuser -A ctxadmin -P password -c -i --no-reassign&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22500</id>
		<title>AppSuite:File Storages per User</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22500"/>
		<updated>2016-11-03T08:36:41Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Useful command‐line tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version|7.8.0}}&lt;br /&gt;
&lt;br /&gt;
= File Storages per user =&lt;br /&gt;
&lt;br /&gt;
This document tries to outline and explain the new concept of having the possibility to specify file storages on a per user basis that is introduced with Open‐Xchange Server v7.8.0.&lt;br /&gt;
&lt;br /&gt;
== The previous situation ==&lt;br /&gt;
&lt;br /&gt;
Before the introduction of the file storages per user feature, it was only possible to specify the file storage association per context.&lt;br /&gt;
That file storage was used for all modules/functions that are supposed to store/retrieve files:&lt;br /&gt;
* Drive&lt;br /&gt;
* Thumbnails&lt;br /&gt;
* PIM attachments&lt;br /&gt;
* Signature attachments&lt;br /&gt;
&lt;br /&gt;
File storages are registered and maintained in file store table held in configDb database. File storage obtains a unique identifier, a base URI and a size limitation.&lt;br /&gt;
&lt;br /&gt;
For each context a file storage identifier is specified alongside with a context quota that defines how much space that context is allowed to occupy in assigned file storage. Thus the sum of all quotas from those contexts assigned to file storage must not exceed the file storage’s size.&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture1.png|One file storage per context|650px]]&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
The motivation is to differentiate between file storages for common context‐associated files and Drive file. Those Drive files may further reside in the common context‐associated storage, but it also possible to specify user‐associated file storages where Drive files are maintained. The association is determined based on a folder's creator/owner: The quota gets accounted to that user that created a folder (provided the user has a user‐associated file storage).&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture2.png|Differentiate|650px]]&lt;br /&gt;
&lt;br /&gt;
That kind of separation allows different provisioning scenarios that an administrator possibly wants to achieve. With regard to Drive files it is now possible to define per context that:&lt;br /&gt;
&lt;br /&gt;
* All Drive files reside in the file storage associated with the context, which is either automatically determined or explicitly set (through -F,--destination-store-id option) when creating a context. All Drive files (from users of that context) and all other file resources (Snippets, PIM attachments, ...) share the same quota usage and limit settings. The file storage associated with the context is called '''context file storage'''.&lt;br /&gt;
* Certain users are supposed to store their Drive files in their own file storage with individual quota settings different from the context file storage. All files created in Drive folders owned by such a user are then accounted to that user-associated file storage having their own quota usage and limitation. The user-associated file storage may be set on user creation as it is for context creation. The file storage associated with a user is called '''user file storage'''. Introducing a user file storage is suitable when an administrator wants to have user-sensitive quota settings for Drive files and/or wants to assign a different type of storage for Drive files uploaded by users; e.g. let seldom used/accessed file resources reside in context file storage, but let frequently, highly accessed Drive files reside in a better storage sink&lt;br /&gt;
* A certain user has his own (bigger) file storage for Drive files and other users of that context are supposed to use that file storage to share the quota usage and limitation specified for that file storage. A file storage owned by a user that is also used by other users is called '''master file storage'''.&lt;br /&gt;
&lt;br /&gt;
Having that possibilities of separation for quota usage and limitation it is possible to apply a certain use case scenario to contexts; e.g.&lt;br /&gt;
&lt;br /&gt;
* Slow mass storage vs. fast Drive storage setup&lt;br /&gt;
* OX Drive Stand‐Alone setup&lt;br /&gt;
&lt;br /&gt;
When assigning dedicated file storage for Drive to a certain user, the user’s file occupation is no more accounted to the overall context in which that user resides, but gets accounted to a dedicated user quota. Such a user quota can be used for different sales strategies that include tracking the user’s file occupation.&lt;br /&gt;
&lt;br /&gt;
To achieve the file storage association on a per user basis, the existing user table has been enhanced by file storage and quota information as it is for the context table. Moreover the filestore_usage table has also been enhanced by the capability to account storage occupation to a certain user&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture3.png|Enhancements|650px]]&lt;br /&gt;
&lt;br /&gt;
In addition the user table has also been extended by filestore_owner column. That column is used to let a user’s file storage be combined with another user’s storage. This serves the scenario in which a grouped OX Drive Stand‐Alone setup is operated. Multiple users’ file occupation gets accounted to a master user account.&lt;br /&gt;
&lt;br /&gt;
Furthermore Open‐Xchange allows changing the running setups at any time to adjust the file storage usages/associations according to possibly changing needs/requirements.&lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
Please note that with introducing the concept of having user-associated file storages, the output for &amp;quot;listfilestore&amp;quot; command-line tool changed. Since also a user can be accounted to a file storage's capacity, the output changed to be:&lt;br /&gt;
&lt;br /&gt;
 /opt/open-xchange/sbin/listfilestore -A oxadminmaster -P secret&lt;br /&gt;
  id path                      size reserved used max-entities cur-entities&lt;br /&gt;
   2 file:///var/opt/filestore 1000      300    0         5000            2&lt;br /&gt;
&lt;br /&gt;
Hence, &amp;quot;maxctx&amp;quot; is replaced with &amp;quot;max-entities&amp;quot; and &amp;quot;curctx&amp;quot; is replaced with &amp;quot;cur-entities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Seamless integration and flexibility ==&lt;br /&gt;
The new more flexible approach fits seamlessly into existing context/file storage setups. Thus there is no need to change anything, unless demanded by administrator&lt;br /&gt;
&lt;br /&gt;
=== The fall‐back setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture4.png|The fall-back setup|650px]]&lt;br /&gt;
&lt;br /&gt;
Everything stays as is. There is a storage‐per‐context association and every file is held in that storage. There are no user‐specific file storage attributes set in user table.&lt;br /&gt;
&lt;br /&gt;
=== Slow mass storage vs. fast file storage setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture5.png|Slow mass storage|650px]]&lt;br /&gt;
&lt;br /&gt;
There are two storages available: a file‐based and an S3 storage (assuming that the S3 one would be faster). While the context has the file‐based storage set, users in that context do have individual name spaces in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
That way common files (PIM/Signature attachments, thumbnails) are stored to context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage. Every user is allowed to occupy up to 10GB of space in the S3 storage (this can be varied as well).&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Single User ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture6.png|OX Drive Stand-Alone - Single User|650px]]&lt;br /&gt;
&lt;br /&gt;
Again there two file storages. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
Context designated to the Single User scenario for OX Drive Stand‐Alone operation, do hold only one user that has its individual name space associated in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
Again common files (PIM/Signature attachments, thumbnails) are stored in the context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage of each context. Every Drive document accounts the user‐sensitive quota of the associated user.&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Business Account ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture7.png|OX Drive Stand-Alone - Business Account|650px]]&lt;br /&gt;
&lt;br /&gt;
There two different file storages as in the previous setups. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
For this setup users do not hold their own individual name space in the S3 storage, but all share the same name space of the master user in the S3 storage. Moreover there are no dedicated user quotas, but all Drive documents do account to the master user’s quota&lt;br /&gt;
&lt;br /&gt;
== Extensions to provisioning command‐line tools ==&lt;br /&gt;
&lt;br /&gt;
=== createuser ===&lt;br /&gt;
&lt;br /&gt;
The existing createuser CLI is enhanced by the following options&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
 ‐f/‐‐filestore The identifier for the file storage.&lt;br /&gt;
 ‐o/‐‐owner The owner for the file storage. If no owner is given and f/filestore option is set, the user itself is taken as owner&lt;br /&gt;
&lt;br /&gt;
=== changeuser ===&lt;br /&gt;
&lt;br /&gt;
The existing changeuser CLI is enhanced by the following option&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Option ALLOW_CHANGING_QUOTA_IF_NO_FILESTORE_SET in file 'AdminUser.properties' controls if a user file storage is automatically enabled if the ‐q/‐‐quota option is given on a 'changeuser' invocation as an alternative to 'movecontextfilestore2user'. For users without a user file storage the 'changeuser' CLT needs to be called with a quota value different to unlimited (-1) and unlimited quota will only be enabled in case the user already has a user file storage.&lt;br /&gt;
&lt;br /&gt;
=== movecontextfilestore2user ===&lt;br /&gt;
&lt;br /&gt;
Move a user’s files from a context to an individual storage name space. &amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movecontextfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another which means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2context ===&lt;br /&gt;
&lt;br /&gt;
The counterpart for the previous CLI. Move a user's files from his individual storage name space to the context storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2context&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another that means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2master ===&lt;br /&gt;
Move a user's files from his individual storage name space to the storage name space of specified master.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;br /&gt;
&lt;br /&gt;
=== movemasterfilestore2user ===&lt;br /&gt;
Move a user's files from a master account name space to an individual storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movemasterfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;br /&gt;
&lt;br /&gt;
=== Creating a user file storage ===&lt;br /&gt;
&lt;br /&gt;
Having the extensions to command-line tools a user-associated file storage can be enabled:&lt;br /&gt;
&lt;br /&gt;
* After using 'movecontextfilestore2user' command-line tool&lt;br /&gt;
* Using 'changeuser' command-line tool with quota and filestore options or only quota options and &amp;quot;ALLOW_CHANGING_QUOTA_IF_NO_FILESTORE_SET&amp;quot; set to &amp;quot;true&amp;quot; in 'AdminUser.properties' file&lt;br /&gt;
* By provisioning via 'createuser' command-line tool with quota and filestore options&lt;br /&gt;
&lt;br /&gt;
== Useful command‐line tools ==&lt;br /&gt;
&lt;br /&gt;
The following command‐line tools might be useful to get an overview&lt;br /&gt;
&lt;br /&gt;
* 'listfilestore' to list available file storages that can be assigned to contexts/users&lt;br /&gt;
* 'listcontext' to get the quota limit specified per context or -1 if none&lt;br /&gt;
* 'listuser' to get the quota limit specified per user or -1 if none&lt;br /&gt;
* 'listuserfilestores' to get a listing of users that use their own user file storage&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22499</id>
		<title>AppSuite:File Storages per User</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22499"/>
		<updated>2016-11-03T08:36:11Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Extensions to provisioning command‐line tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version|7.8.0}}&lt;br /&gt;
&lt;br /&gt;
= File Storages per user =&lt;br /&gt;
&lt;br /&gt;
This document tries to outline and explain the new concept of having the possibility to specify file storages on a per user basis that is introduced with Open‐Xchange Server v7.8.0.&lt;br /&gt;
&lt;br /&gt;
== The previous situation ==&lt;br /&gt;
&lt;br /&gt;
Before the introduction of the file storages per user feature, it was only possible to specify the file storage association per context.&lt;br /&gt;
That file storage was used for all modules/functions that are supposed to store/retrieve files:&lt;br /&gt;
* Drive&lt;br /&gt;
* Thumbnails&lt;br /&gt;
* PIM attachments&lt;br /&gt;
* Signature attachments&lt;br /&gt;
&lt;br /&gt;
File storages are registered and maintained in file store table held in configDb database. File storage obtains a unique identifier, a base URI and a size limitation.&lt;br /&gt;
&lt;br /&gt;
For each context a file storage identifier is specified alongside with a context quota that defines how much space that context is allowed to occupy in assigned file storage. Thus the sum of all quotas from those contexts assigned to file storage must not exceed the file storage’s size.&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture1.png|One file storage per context|650px]]&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
The motivation is to differentiate between file storages for common context‐associated files and Drive file. Those Drive files may further reside in the common context‐associated storage, but it also possible to specify user‐associated file storages where Drive files are maintained. The association is determined based on a folder's creator/owner: The quota gets accounted to that user that created a folder (provided the user has a user‐associated file storage).&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture2.png|Differentiate|650px]]&lt;br /&gt;
&lt;br /&gt;
That kind of separation allows different provisioning scenarios that an administrator possibly wants to achieve. With regard to Drive files it is now possible to define per context that:&lt;br /&gt;
&lt;br /&gt;
* All Drive files reside in the file storage associated with the context, which is either automatically determined or explicitly set (through -F,--destination-store-id option) when creating a context. All Drive files (from users of that context) and all other file resources (Snippets, PIM attachments, ...) share the same quota usage and limit settings. The file storage associated with the context is called '''context file storage'''.&lt;br /&gt;
* Certain users are supposed to store their Drive files in their own file storage with individual quota settings different from the context file storage. All files created in Drive folders owned by such a user are then accounted to that user-associated file storage having their own quota usage and limitation. The user-associated file storage may be set on user creation as it is for context creation. The file storage associated with a user is called '''user file storage'''. Introducing a user file storage is suitable when an administrator wants to have user-sensitive quota settings for Drive files and/or wants to assign a different type of storage for Drive files uploaded by users; e.g. let seldom used/accessed file resources reside in context file storage, but let frequently, highly accessed Drive files reside in a better storage sink&lt;br /&gt;
* A certain user has his own (bigger) file storage for Drive files and other users of that context are supposed to use that file storage to share the quota usage and limitation specified for that file storage. A file storage owned by a user that is also used by other users is called '''master file storage'''.&lt;br /&gt;
&lt;br /&gt;
Having that possibilities of separation for quota usage and limitation it is possible to apply a certain use case scenario to contexts; e.g.&lt;br /&gt;
&lt;br /&gt;
* Slow mass storage vs. fast Drive storage setup&lt;br /&gt;
* OX Drive Stand‐Alone setup&lt;br /&gt;
&lt;br /&gt;
When assigning dedicated file storage for Drive to a certain user, the user’s file occupation is no more accounted to the overall context in which that user resides, but gets accounted to a dedicated user quota. Such a user quota can be used for different sales strategies that include tracking the user’s file occupation.&lt;br /&gt;
&lt;br /&gt;
To achieve the file storage association on a per user basis, the existing user table has been enhanced by file storage and quota information as it is for the context table. Moreover the filestore_usage table has also been enhanced by the capability to account storage occupation to a certain user&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture3.png|Enhancements|650px]]&lt;br /&gt;
&lt;br /&gt;
In addition the user table has also been extended by filestore_owner column. That column is used to let a user’s file storage be combined with another user’s storage. This serves the scenario in which a grouped OX Drive Stand‐Alone setup is operated. Multiple users’ file occupation gets accounted to a master user account.&lt;br /&gt;
&lt;br /&gt;
Furthermore Open‐Xchange allows changing the running setups at any time to adjust the file storage usages/associations according to possibly changing needs/requirements.&lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
Please note that with introducing the concept of having user-associated file storages, the output for &amp;quot;listfilestore&amp;quot; command-line tool changed. Since also a user can be accounted to a file storage's capacity, the output changed to be:&lt;br /&gt;
&lt;br /&gt;
 /opt/open-xchange/sbin/listfilestore -A oxadminmaster -P secret&lt;br /&gt;
  id path                      size reserved used max-entities cur-entities&lt;br /&gt;
   2 file:///var/opt/filestore 1000      300    0         5000            2&lt;br /&gt;
&lt;br /&gt;
Hence, &amp;quot;maxctx&amp;quot; is replaced with &amp;quot;max-entities&amp;quot; and &amp;quot;curctx&amp;quot; is replaced with &amp;quot;cur-entities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Seamless integration and flexibility ==&lt;br /&gt;
The new more flexible approach fits seamlessly into existing context/file storage setups. Thus there is no need to change anything, unless demanded by administrator&lt;br /&gt;
&lt;br /&gt;
=== The fall‐back setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture4.png|The fall-back setup|650px]]&lt;br /&gt;
&lt;br /&gt;
Everything stays as is. There is a storage‐per‐context association and every file is held in that storage. There are no user‐specific file storage attributes set in user table.&lt;br /&gt;
&lt;br /&gt;
=== Slow mass storage vs. fast file storage setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture5.png|Slow mass storage|650px]]&lt;br /&gt;
&lt;br /&gt;
There are two storages available: a file‐based and an S3 storage (assuming that the S3 one would be faster). While the context has the file‐based storage set, users in that context do have individual name spaces in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
That way common files (PIM/Signature attachments, thumbnails) are stored to context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage. Every user is allowed to occupy up to 10GB of space in the S3 storage (this can be varied as well).&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Single User ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture6.png|OX Drive Stand-Alone - Single User|650px]]&lt;br /&gt;
&lt;br /&gt;
Again there two file storages. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
Context designated to the Single User scenario for OX Drive Stand‐Alone operation, do hold only one user that has its individual name space associated in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
Again common files (PIM/Signature attachments, thumbnails) are stored in the context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage of each context. Every Drive document accounts the user‐sensitive quota of the associated user.&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Business Account ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture7.png|OX Drive Stand-Alone - Business Account|650px]]&lt;br /&gt;
&lt;br /&gt;
There two different file storages as in the previous setups. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
For this setup users do not hold their own individual name space in the S3 storage, but all share the same name space of the master user in the S3 storage. Moreover there are no dedicated user quotas, but all Drive documents do account to the master user’s quota&lt;br /&gt;
&lt;br /&gt;
== Extensions to provisioning command‐line tools ==&lt;br /&gt;
&lt;br /&gt;
=== createuser ===&lt;br /&gt;
&lt;br /&gt;
The existing createuser CLI is enhanced by the following options&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
 ‐f/‐‐filestore The identifier for the file storage.&lt;br /&gt;
 ‐o/‐‐owner The owner for the file storage. If no owner is given and f/filestore option is set, the user itself is taken as owner&lt;br /&gt;
&lt;br /&gt;
=== changeuser ===&lt;br /&gt;
&lt;br /&gt;
The existing changeuser CLI is enhanced by the following option&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Option ALLOW_CHANGING_QUOTA_IF_NO_FILESTORE_SET in file 'AdminUser.properties' controls if a user file storage is automatically enabled if the ‐q/‐‐quota option is given on a 'changeuser' invocation as an alternative to 'movecontextfilestore2user'. For users without a user file storage the 'changeuser' CLT needs to be called with a quota value different to unlimited (-1) and unlimited quota will only be enabled in case the user already has a user file storage.&lt;br /&gt;
&lt;br /&gt;
=== movecontextfilestore2user ===&lt;br /&gt;
&lt;br /&gt;
Move a user’s files from a context to an individual storage name space. &amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movecontextfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another which means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2context ===&lt;br /&gt;
&lt;br /&gt;
The counterpart for the previous CLI. Move a user's files from his individual storage name space to the context storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2context&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another that means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2master ===&lt;br /&gt;
Move a user's files from his individual storage name space to the storage name space of specified master.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;br /&gt;
&lt;br /&gt;
=== movemasterfilestore2user ===&lt;br /&gt;
Move a user's files from a master account name space to an individual storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movemasterfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;br /&gt;
&lt;br /&gt;
=== Creating a user file storage ===&lt;br /&gt;
&lt;br /&gt;
Having the extensions to command-line tools a user-associated file storage can be enabled:&lt;br /&gt;
&lt;br /&gt;
* After using 'movecontextfilestore2user' command-line tool&lt;br /&gt;
* Using 'changeuser' command-line tool with quota and filestore options or only quota options and &amp;quot;ALLOW_CHANGING_QUOTA_IF_NO_FILESTORE_SET&amp;quot; set to &amp;quot;true&amp;quot; in 'AdminUser.properties' file&lt;br /&gt;
* By provisioning via 'createuser' command-line tool with quota and filestore options&lt;br /&gt;
&lt;br /&gt;
== Useful command‐line tools ==&lt;br /&gt;
&lt;br /&gt;
The following command‐line tools might be useful to get an overview&lt;br /&gt;
&lt;br /&gt;
* listfilestore to list available file storages that can be assigned to contexts/users&lt;br /&gt;
* listcontext to get the quota limit specified per context or -1 if none&lt;br /&gt;
* listuser to get the quota limit specified per user or -1 if none&lt;br /&gt;
* listuserfilestores to get a listing of users that use their own user file storage&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22498</id>
		<title>AppSuite:File Storages per User</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22498"/>
		<updated>2016-11-03T08:31:51Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Extensions to provisioning command‐line tools */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version|7.8.0}}&lt;br /&gt;
&lt;br /&gt;
= File Storages per user =&lt;br /&gt;
&lt;br /&gt;
This document tries to outline and explain the new concept of having the possibility to specify file storages on a per user basis that is introduced with Open‐Xchange Server v7.8.0.&lt;br /&gt;
&lt;br /&gt;
== The previous situation ==&lt;br /&gt;
&lt;br /&gt;
Before the introduction of the file storages per user feature, it was only possible to specify the file storage association per context.&lt;br /&gt;
That file storage was used for all modules/functions that are supposed to store/retrieve files:&lt;br /&gt;
* Drive&lt;br /&gt;
* Thumbnails&lt;br /&gt;
* PIM attachments&lt;br /&gt;
* Signature attachments&lt;br /&gt;
&lt;br /&gt;
File storages are registered and maintained in file store table held in configDb database. File storage obtains a unique identifier, a base URI and a size limitation.&lt;br /&gt;
&lt;br /&gt;
For each context a file storage identifier is specified alongside with a context quota that defines how much space that context is allowed to occupy in assigned file storage. Thus the sum of all quotas from those contexts assigned to file storage must not exceed the file storage’s size.&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture1.png|One file storage per context|650px]]&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
The motivation is to differentiate between file storages for common context‐associated files and Drive file. Those Drive files may further reside in the common context‐associated storage, but it also possible to specify user‐associated file storages where Drive files are maintained. The association is determined based on a folder's creator/owner: The quota gets accounted to that user that created a folder (provided the user has a user‐associated file storage).&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture2.png|Differentiate|650px]]&lt;br /&gt;
&lt;br /&gt;
That kind of separation allows different provisioning scenarios that an administrator possibly wants to achieve. With regard to Drive files it is now possible to define per context that:&lt;br /&gt;
&lt;br /&gt;
* All Drive files reside in the file storage associated with the context, which is either automatically determined or explicitly set (through -F,--destination-store-id option) when creating a context. All Drive files (from users of that context) and all other file resources (Snippets, PIM attachments, ...) share the same quota usage and limit settings. The file storage associated with the context is called '''context file storage'''.&lt;br /&gt;
* Certain users are supposed to store their Drive files in their own file storage with individual quota settings different from the context file storage. All files created in Drive folders owned by such a user are then accounted to that user-associated file storage having their own quota usage and limitation. The user-associated file storage may be set on user creation as it is for context creation. The file storage associated with a user is called '''user file storage'''. Introducing a user file storage is suitable when an administrator wants to have user-sensitive quota settings for Drive files and/or wants to assign a different type of storage for Drive files uploaded by users; e.g. let seldom used/accessed file resources reside in context file storage, but let frequently, highly accessed Drive files reside in a better storage sink&lt;br /&gt;
* A certain user has his own (bigger) file storage for Drive files and other users of that context are supposed to use that file storage to share the quota usage and limitation specified for that file storage. A file storage owned by a user that is also used by other users is called '''master file storage'''.&lt;br /&gt;
&lt;br /&gt;
Having that possibilities of separation for quota usage and limitation it is possible to apply a certain use case scenario to contexts; e.g.&lt;br /&gt;
&lt;br /&gt;
* Slow mass storage vs. fast Drive storage setup&lt;br /&gt;
* OX Drive Stand‐Alone setup&lt;br /&gt;
&lt;br /&gt;
When assigning dedicated file storage for Drive to a certain user, the user’s file occupation is no more accounted to the overall context in which that user resides, but gets accounted to a dedicated user quota. Such a user quota can be used for different sales strategies that include tracking the user’s file occupation.&lt;br /&gt;
&lt;br /&gt;
To achieve the file storage association on a per user basis, the existing user table has been enhanced by file storage and quota information as it is for the context table. Moreover the filestore_usage table has also been enhanced by the capability to account storage occupation to a certain user&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture3.png|Enhancements|650px]]&lt;br /&gt;
&lt;br /&gt;
In addition the user table has also been extended by filestore_owner column. That column is used to let a user’s file storage be combined with another user’s storage. This serves the scenario in which a grouped OX Drive Stand‐Alone setup is operated. Multiple users’ file occupation gets accounted to a master user account.&lt;br /&gt;
&lt;br /&gt;
Furthermore Open‐Xchange allows changing the running setups at any time to adjust the file storage usages/associations according to possibly changing needs/requirements.&lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
Please note that with introducing the concept of having user-associated file storages, the output for &amp;quot;listfilestore&amp;quot; command-line tool changed. Since also a user can be accounted to a file storage's capacity, the output changed to be:&lt;br /&gt;
&lt;br /&gt;
 /opt/open-xchange/sbin/listfilestore -A oxadminmaster -P secret&lt;br /&gt;
  id path                      size reserved used max-entities cur-entities&lt;br /&gt;
   2 file:///var/opt/filestore 1000      300    0         5000            2&lt;br /&gt;
&lt;br /&gt;
Hence, &amp;quot;maxctx&amp;quot; is replaced with &amp;quot;max-entities&amp;quot; and &amp;quot;curctx&amp;quot; is replaced with &amp;quot;cur-entities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Seamless integration and flexibility ==&lt;br /&gt;
The new more flexible approach fits seamlessly into existing context/file storage setups. Thus there is no need to change anything, unless demanded by administrator&lt;br /&gt;
&lt;br /&gt;
=== The fall‐back setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture4.png|The fall-back setup|650px]]&lt;br /&gt;
&lt;br /&gt;
Everything stays as is. There is a storage‐per‐context association and every file is held in that storage. There are no user‐specific file storage attributes set in user table.&lt;br /&gt;
&lt;br /&gt;
=== Slow mass storage vs. fast file storage setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture5.png|Slow mass storage|650px]]&lt;br /&gt;
&lt;br /&gt;
There are two storages available: a file‐based and an S3 storage (assuming that the S3 one would be faster). While the context has the file‐based storage set, users in that context do have individual name spaces in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
That way common files (PIM/Signature attachments, thumbnails) are stored to context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage. Every user is allowed to occupy up to 10GB of space in the S3 storage (this can be varied as well).&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Single User ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture6.png|OX Drive Stand-Alone - Single User|650px]]&lt;br /&gt;
&lt;br /&gt;
Again there two file storages. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
Context designated to the Single User scenario for OX Drive Stand‐Alone operation, do hold only one user that has its individual name space associated in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
Again common files (PIM/Signature attachments, thumbnails) are stored in the context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage of each context. Every Drive document accounts the user‐sensitive quota of the associated user.&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Business Account ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture7.png|OX Drive Stand-Alone - Business Account|650px]]&lt;br /&gt;
&lt;br /&gt;
There two different file storages as in the previous setups. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
For this setup users do not hold their own individual name space in the S3 storage, but all share the same name space of the master user in the S3 storage. Moreover there are no dedicated user quotas, but all Drive documents do account to the master user’s quota&lt;br /&gt;
&lt;br /&gt;
== Extensions to provisioning command‐line tools ==&lt;br /&gt;
&lt;br /&gt;
=== createuser ===&lt;br /&gt;
&lt;br /&gt;
The existing createuser CLI is enhanced by the following options&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
 ‐f/‐‐filestore The identifier for the file storage.&lt;br /&gt;
 ‐o/‐‐owner The owner for the file storage. If no owner is given and f/filestore option is set, the user itself is taken as owner&lt;br /&gt;
&lt;br /&gt;
=== changeuser ===&lt;br /&gt;
&lt;br /&gt;
The existing changeuser CLI is enhanced by the following option&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Option ALLOW_CHANGING_QUOTA_IF_NO_FILESTORE_SET in file 'AdminUser.properties' controls if a user file storage is automatically enabled if the ‐q/‐‐quota option is given on a 'changeuser' invocation as an alternative to 'movecontextfilestore2user'. For users without a user file storage the 'changeuser' CLT needs to be called with a quota value different to unlimited (-1) and unlimited quota will only be enabled in case the user already has a user file storage.&lt;br /&gt;
&lt;br /&gt;
=== movecontextfilestore2user ===&lt;br /&gt;
&lt;br /&gt;
Move a user’s files from a context to an individual storage name space. &amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movecontextfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another which means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2context ===&lt;br /&gt;
&lt;br /&gt;
The counterpart for the previous CLI. Move a user's files from his individual storage name space to the context storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2context&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another that means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2master ===&lt;br /&gt;
Move a user's files from his individual storage name space to the storage name space of specified master.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;br /&gt;
&lt;br /&gt;
=== movemasterfilestore2user ===&lt;br /&gt;
Move a user's files from a master account name space to an individual storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movemasterfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;br /&gt;
&lt;br /&gt;
== Useful command‐line tools ==&lt;br /&gt;
&lt;br /&gt;
The following command‐line tools might be useful to get an overview&lt;br /&gt;
&lt;br /&gt;
* listfilestore to list available file storages that can be assigned to contexts/users&lt;br /&gt;
* listcontext to get the quota limit specified per context or -1 if none&lt;br /&gt;
* listuser to get the quota limit specified per user or -1 if none&lt;br /&gt;
* listuserfilestores to get a listing of users that use their own user file storage&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22497</id>
		<title>AppSuite:File Storages per User</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22497"/>
		<updated>2016-11-03T08:26:08Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* changeuser */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version|7.8.0}}&lt;br /&gt;
&lt;br /&gt;
= File Storages per user =&lt;br /&gt;
&lt;br /&gt;
This document tries to outline and explain the new concept of having the possibility to specify file storages on a per user basis that is introduced with Open‐Xchange Server v7.8.0.&lt;br /&gt;
&lt;br /&gt;
== The previous situation ==&lt;br /&gt;
&lt;br /&gt;
Before the introduction of the file storages per user feature, it was only possible to specify the file storage association per context.&lt;br /&gt;
That file storage was used for all modules/functions that are supposed to store/retrieve files:&lt;br /&gt;
* Drive&lt;br /&gt;
* Thumbnails&lt;br /&gt;
* PIM attachments&lt;br /&gt;
* Signature attachments&lt;br /&gt;
&lt;br /&gt;
File storages are registered and maintained in file store table held in configDb database. File storage obtains a unique identifier, a base URI and a size limitation.&lt;br /&gt;
&lt;br /&gt;
For each context a file storage identifier is specified alongside with a context quota that defines how much space that context is allowed to occupy in assigned file storage. Thus the sum of all quotas from those contexts assigned to file storage must not exceed the file storage’s size.&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture1.png|One file storage per context|650px]]&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
The motivation is to differentiate between file storages for common context‐associated files and Drive file. Those Drive files may further reside in the common context‐associated storage, but it also possible to specify user‐associated file storages where Drive files are maintained. The association is determined based on a folder's creator/owner: The quota gets accounted to that user that created a folder (provided the user has a user‐associated file storage).&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture2.png|Differentiate|650px]]&lt;br /&gt;
&lt;br /&gt;
That kind of separation allows different provisioning scenarios that an administrator possibly wants to achieve. With regard to Drive files it is now possible to define per context that:&lt;br /&gt;
&lt;br /&gt;
* All Drive files reside in the file storage associated with the context, which is either automatically determined or explicitly set (through -F,--destination-store-id option) when creating a context. All Drive files (from users of that context) and all other file resources (Snippets, PIM attachments, ...) share the same quota usage and limit settings. The file storage associated with the context is called '''context file storage'''.&lt;br /&gt;
* Certain users are supposed to store their Drive files in their own file storage with individual quota settings different from the context file storage. All files created in Drive folders owned by such a user are then accounted to that user-associated file storage having their own quota usage and limitation. The user-associated file storage may be set on user creation as it is for context creation. The file storage associated with a user is called '''user file storage'''. Introducing a user file storage is suitable when an administrator wants to have user-sensitive quota settings for Drive files and/or wants to assign a different type of storage for Drive files uploaded by users; e.g. let seldom used/accessed file resources reside in context file storage, but let frequently, highly accessed Drive files reside in a better storage sink&lt;br /&gt;
* A certain user has his own (bigger) file storage for Drive files and other users of that context are supposed to use that file storage to share the quota usage and limitation specified for that file storage. A file storage owned by a user that is also used by other users is called '''master file storage'''.&lt;br /&gt;
&lt;br /&gt;
Having that possibilities of separation for quota usage and limitation it is possible to apply a certain use case scenario to contexts; e.g.&lt;br /&gt;
&lt;br /&gt;
* Slow mass storage vs. fast Drive storage setup&lt;br /&gt;
* OX Drive Stand‐Alone setup&lt;br /&gt;
&lt;br /&gt;
When assigning dedicated file storage for Drive to a certain user, the user’s file occupation is no more accounted to the overall context in which that user resides, but gets accounted to a dedicated user quota. Such a user quota can be used for different sales strategies that include tracking the user’s file occupation.&lt;br /&gt;
&lt;br /&gt;
To achieve the file storage association on a per user basis, the existing user table has been enhanced by file storage and quota information as it is for the context table. Moreover the filestore_usage table has also been enhanced by the capability to account storage occupation to a certain user&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture3.png|Enhancements|650px]]&lt;br /&gt;
&lt;br /&gt;
In addition the user table has also been extended by filestore_owner column. That column is used to let a user’s file storage be combined with another user’s storage. This serves the scenario in which a grouped OX Drive Stand‐Alone setup is operated. Multiple users’ file occupation gets accounted to a master user account.&lt;br /&gt;
&lt;br /&gt;
Furthermore Open‐Xchange allows changing the running setups at any time to adjust the file storage usages/associations according to possibly changing needs/requirements.&lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
Please note that with introducing the concept of having user-associated file storages, the output for &amp;quot;listfilestore&amp;quot; command-line tool changed. Since also a user can be accounted to a file storage's capacity, the output changed to be:&lt;br /&gt;
&lt;br /&gt;
 /opt/open-xchange/sbin/listfilestore -A oxadminmaster -P secret&lt;br /&gt;
  id path                      size reserved used max-entities cur-entities&lt;br /&gt;
   2 file:///var/opt/filestore 1000      300    0         5000            2&lt;br /&gt;
&lt;br /&gt;
Hence, &amp;quot;maxctx&amp;quot; is replaced with &amp;quot;max-entities&amp;quot; and &amp;quot;curctx&amp;quot; is replaced with &amp;quot;cur-entities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Seamless integration and flexibility ==&lt;br /&gt;
The new more flexible approach fits seamlessly into existing context/file storage setups. Thus there is no need to change anything, unless demanded by administrator&lt;br /&gt;
&lt;br /&gt;
=== The fall‐back setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture4.png|The fall-back setup|650px]]&lt;br /&gt;
&lt;br /&gt;
Everything stays as is. There is a storage‐per‐context association and every file is held in that storage. There are no user‐specific file storage attributes set in user table.&lt;br /&gt;
&lt;br /&gt;
=== Slow mass storage vs. fast file storage setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture5.png|Slow mass storage|650px]]&lt;br /&gt;
&lt;br /&gt;
There are two storages available: a file‐based and an S3 storage (assuming that the S3 one would be faster). While the context has the file‐based storage set, users in that context do have individual name spaces in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
That way common files (PIM/Signature attachments, thumbnails) are stored to context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage. Every user is allowed to occupy up to 10GB of space in the S3 storage (this can be varied as well).&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Single User ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture6.png|OX Drive Stand-Alone - Single User|650px]]&lt;br /&gt;
&lt;br /&gt;
Again there two file storages. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
Context designated to the Single User scenario for OX Drive Stand‐Alone operation, do hold only one user that has its individual name space associated in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
Again common files (PIM/Signature attachments, thumbnails) are stored in the context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage of each context. Every Drive document accounts the user‐sensitive quota of the associated user.&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Business Account ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture7.png|OX Drive Stand-Alone - Business Account|650px]]&lt;br /&gt;
&lt;br /&gt;
There two different file storages as in the previous setups. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
For this setup users do not hold their own individual name space in the S3 storage, but all share the same name space of the master user in the S3 storage. Moreover there are no dedicated user quotas, but all Drive documents do account to the master user’s quota&lt;br /&gt;
&lt;br /&gt;
== Extensions to provisioning command‐line tools ==&lt;br /&gt;
&lt;br /&gt;
=== createuser ===&lt;br /&gt;
&lt;br /&gt;
The existing createuser CLI is enhanced by the following options&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
 ‐f/‐‐filestore The identifier for the file storage.&lt;br /&gt;
 ‐o/‐‐owner The owner for the file storage. If no owner is given and f/filestore option is set, the user itself is taken as owner&lt;br /&gt;
&lt;br /&gt;
=== changeuser ===&lt;br /&gt;
&lt;br /&gt;
The existing changeuser CLI is enhanced by the following option&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
&lt;br /&gt;
'''Note:''' Option ALLOW_CHANGING_QUOTA_IF_NO_FILESTORE_SET in file 'AdminUser.properties' controls if a user file storage is automatically enabled if the ‐q/‐‐quota option is given on a 'changeuser' invocation as an alternative to 'movecontextfilestore2user'. For users without a user file storage the 'changeuser' CLT needs to be called with a quota value different to unlimited (-1) and unlimited quota will only be enabled in case the user already has a user file storage.&lt;br /&gt;
&lt;br /&gt;
=== movecontextfilestore2user ===&lt;br /&gt;
&lt;br /&gt;
Move a user’s files from a context to an individual storage name space. &amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movecontextfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another which means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2context ===&lt;br /&gt;
&lt;br /&gt;
The counterpart for the previous CLI. Move a user's files from his individual storage name space to the context storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2context&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another that means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2master ===&lt;br /&gt;
Move a user's files from his individual storage name space to the storage name space of specified master.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;br /&gt;
&lt;br /&gt;
=== movemasterfilestore2user ===&lt;br /&gt;
Move a user's files from a master account name space to an individual storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movemasterfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22496</id>
		<title>AppSuite:File Storages per User</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22496"/>
		<updated>2016-11-03T08:17:34Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Motivation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version|7.8.0}}&lt;br /&gt;
&lt;br /&gt;
= File Storages per user =&lt;br /&gt;
&lt;br /&gt;
This document tries to outline and explain the new concept of having the possibility to specify file storages on a per user basis that is introduced with Open‐Xchange Server v7.8.0.&lt;br /&gt;
&lt;br /&gt;
== The previous situation ==&lt;br /&gt;
&lt;br /&gt;
Before the introduction of the file storages per user feature, it was only possible to specify the file storage association per context.&lt;br /&gt;
That file storage was used for all modules/functions that are supposed to store/retrieve files:&lt;br /&gt;
* Drive&lt;br /&gt;
* Thumbnails&lt;br /&gt;
* PIM attachments&lt;br /&gt;
* Signature attachments&lt;br /&gt;
&lt;br /&gt;
File storages are registered and maintained in file store table held in configDb database. File storage obtains a unique identifier, a base URI and a size limitation.&lt;br /&gt;
&lt;br /&gt;
For each context a file storage identifier is specified alongside with a context quota that defines how much space that context is allowed to occupy in assigned file storage. Thus the sum of all quotas from those contexts assigned to file storage must not exceed the file storage’s size.&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture1.png|One file storage per context|650px]]&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
The motivation is to differentiate between file storages for common context‐associated files and Drive file. Those Drive files may further reside in the common context‐associated storage, but it also possible to specify user‐associated file storages where Drive files are maintained. The association is determined based on a folder's creator/owner: The quota gets accounted to that user that created a folder (provided the user has a user‐associated file storage).&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture2.png|Differentiate|650px]]&lt;br /&gt;
&lt;br /&gt;
That kind of separation allows different provisioning scenarios that an administrator possibly wants to achieve. With regard to Drive files it is now possible to define per context that:&lt;br /&gt;
&lt;br /&gt;
* All Drive files reside in the file storage associated with the context, which is either automatically determined or explicitly set (through -F,--destination-store-id option) when creating a context. All Drive files (from users of that context) and all other file resources (Snippets, PIM attachments, ...) share the same quota usage and limit settings. The file storage associated with the context is called '''context file storage'''.&lt;br /&gt;
* Certain users are supposed to store their Drive files in their own file storage with individual quota settings different from the context file storage. All files created in Drive folders owned by such a user are then accounted to that user-associated file storage having their own quota usage and limitation. The user-associated file storage may be set on user creation as it is for context creation. The file storage associated with a user is called '''user file storage'''. Introducing a user file storage is suitable when an administrator wants to have user-sensitive quota settings for Drive files and/or wants to assign a different type of storage for Drive files uploaded by users; e.g. let seldom used/accessed file resources reside in context file storage, but let frequently, highly accessed Drive files reside in a better storage sink&lt;br /&gt;
* A certain user has his own (bigger) file storage for Drive files and other users of that context are supposed to use that file storage to share the quota usage and limitation specified for that file storage. A file storage owned by a user that is also used by other users is called '''master file storage'''.&lt;br /&gt;
&lt;br /&gt;
Having that possibilities of separation for quota usage and limitation it is possible to apply a certain use case scenario to contexts; e.g.&lt;br /&gt;
&lt;br /&gt;
* Slow mass storage vs. fast Drive storage setup&lt;br /&gt;
* OX Drive Stand‐Alone setup&lt;br /&gt;
&lt;br /&gt;
When assigning dedicated file storage for Drive to a certain user, the user’s file occupation is no more accounted to the overall context in which that user resides, but gets accounted to a dedicated user quota. Such a user quota can be used for different sales strategies that include tracking the user’s file occupation.&lt;br /&gt;
&lt;br /&gt;
To achieve the file storage association on a per user basis, the existing user table has been enhanced by file storage and quota information as it is for the context table. Moreover the filestore_usage table has also been enhanced by the capability to account storage occupation to a certain user&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture3.png|Enhancements|650px]]&lt;br /&gt;
&lt;br /&gt;
In addition the user table has also been extended by filestore_owner column. That column is used to let a user’s file storage be combined with another user’s storage. This serves the scenario in which a grouped OX Drive Stand‐Alone setup is operated. Multiple users’ file occupation gets accounted to a master user account.&lt;br /&gt;
&lt;br /&gt;
Furthermore Open‐Xchange allows changing the running setups at any time to adjust the file storage usages/associations according to possibly changing needs/requirements.&lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
Please note that with introducing the concept of having user-associated file storages, the output for &amp;quot;listfilestore&amp;quot; command-line tool changed. Since also a user can be accounted to a file storage's capacity, the output changed to be:&lt;br /&gt;
&lt;br /&gt;
 /opt/open-xchange/sbin/listfilestore -A oxadminmaster -P secret&lt;br /&gt;
  id path                      size reserved used max-entities cur-entities&lt;br /&gt;
   2 file:///var/opt/filestore 1000      300    0         5000            2&lt;br /&gt;
&lt;br /&gt;
Hence, &amp;quot;maxctx&amp;quot; is replaced with &amp;quot;max-entities&amp;quot; and &amp;quot;curctx&amp;quot; is replaced with &amp;quot;cur-entities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Seamless integration and flexibility ==&lt;br /&gt;
The new more flexible approach fits seamlessly into existing context/file storage setups. Thus there is no need to change anything, unless demanded by administrator&lt;br /&gt;
&lt;br /&gt;
=== The fall‐back setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture4.png|The fall-back setup|650px]]&lt;br /&gt;
&lt;br /&gt;
Everything stays as is. There is a storage‐per‐context association and every file is held in that storage. There are no user‐specific file storage attributes set in user table.&lt;br /&gt;
&lt;br /&gt;
=== Slow mass storage vs. fast file storage setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture5.png|Slow mass storage|650px]]&lt;br /&gt;
&lt;br /&gt;
There are two storages available: a file‐based and an S3 storage (assuming that the S3 one would be faster). While the context has the file‐based storage set, users in that context do have individual name spaces in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
That way common files (PIM/Signature attachments, thumbnails) are stored to context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage. Every user is allowed to occupy up to 10GB of space in the S3 storage (this can be varied as well).&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Single User ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture6.png|OX Drive Stand-Alone - Single User|650px]]&lt;br /&gt;
&lt;br /&gt;
Again there two file storages. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
Context designated to the Single User scenario for OX Drive Stand‐Alone operation, do hold only one user that has its individual name space associated in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
Again common files (PIM/Signature attachments, thumbnails) are stored in the context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage of each context. Every Drive document accounts the user‐sensitive quota of the associated user.&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Business Account ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture7.png|OX Drive Stand-Alone - Business Account|650px]]&lt;br /&gt;
&lt;br /&gt;
There two different file storages as in the previous setups. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
For this setup users do not hold their own individual name space in the S3 storage, but all share the same name space of the master user in the S3 storage. Moreover there are no dedicated user quotas, but all Drive documents do account to the master user’s quota&lt;br /&gt;
&lt;br /&gt;
== Extensions to provisioning command‐line tools ==&lt;br /&gt;
&lt;br /&gt;
=== createuser ===&lt;br /&gt;
&lt;br /&gt;
The existing createuser CLI is enhanced by the following options&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
 ‐f/‐‐filestore The identifier for the file storage.&lt;br /&gt;
 ‐o/‐‐owner The owner for the file storage. If no owner is given and f/filestore option is set, the user itself is taken as owner&lt;br /&gt;
&lt;br /&gt;
=== changeuser ===&lt;br /&gt;
&lt;br /&gt;
The existing changeuser CLI is enhanced by the following option&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
&lt;br /&gt;
=== movecontextfilestore2user ===&lt;br /&gt;
&lt;br /&gt;
Move a user’s files from a context to an individual storage name space. &amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movecontextfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another which means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2context ===&lt;br /&gt;
&lt;br /&gt;
The counterpart for the previous CLI. Move a user's files from his individual storage name space to the context storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2context&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another that means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2master ===&lt;br /&gt;
Move a user's files from his individual storage name space to the storage name space of specified master.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;br /&gt;
&lt;br /&gt;
=== movemasterfilestore2user ===&lt;br /&gt;
Move a user's files from a master account name space to an individual storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movemasterfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22495</id>
		<title>AppSuite:File Storages per User</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22495"/>
		<updated>2016-11-03T08:11:57Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Motivation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version|7.8.0}}&lt;br /&gt;
&lt;br /&gt;
= File Storages per user =&lt;br /&gt;
&lt;br /&gt;
This document tries to outline and explain the new concept of having the possibility to specify file storages on a per user basis that is introduced with Open‐Xchange Server v7.8.0.&lt;br /&gt;
&lt;br /&gt;
== The previous situation ==&lt;br /&gt;
&lt;br /&gt;
Before the introduction of the file storages per user feature, it was only possible to specify the file storage association per context.&lt;br /&gt;
That file storage was used for all modules/functions that are supposed to store/retrieve files:&lt;br /&gt;
* Drive&lt;br /&gt;
* Thumbnails&lt;br /&gt;
* PIM attachments&lt;br /&gt;
* Signature attachments&lt;br /&gt;
&lt;br /&gt;
File storages are registered and maintained in file store table held in configDb database. File storage obtains a unique identifier, a base URI and a size limitation.&lt;br /&gt;
&lt;br /&gt;
For each context a file storage identifier is specified alongside with a context quota that defines how much space that context is allowed to occupy in assigned file storage. Thus the sum of all quotas from those contexts assigned to file storage must not exceed the file storage’s size.&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture1.png|One file storage per context|650px]]&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
The motivation is to differentiate between file storages for common context‐associated files and Drive file. Those Drive files may further reside in the common context‐associated storage, but it also possible to specify user‐associated file storages where Drive files are maintained. The association is determined based on a folder's creator/owner: The quota gets accounted to that user that created a folder (provided the user has a user‐associated file storage).&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture2.png|Differentiate|650px]]&lt;br /&gt;
&lt;br /&gt;
That kind of separation allows different provisioning scenarios that an administrator possibly wants to achieve. With regard to Drive files it is now possible to define per context that:&lt;br /&gt;
&lt;br /&gt;
* All Drive files reside in the file storage associated with the context, which is either automatically determined or explicitly set (through -F,--destination-store-id option) when creating a context. All Drive files (from users of that context) and all other file resources (Snippets, PIM attachments, ...) share the same quota usage and limit settings. The file storage associated with the context is called '''context file storage'''.&lt;br /&gt;
* Certain users are supposed to store their Drive files in their own file storage with individual quota settings different from the context file storage. All files created in Drive folders owned by such a user are then accounted to that user-associated file storage having their own quota usage and limitation. The user-associated file storage may be set on user creation as it is for context creation. The file storage associated with a user is called '''user file storage'''.&lt;br /&gt;
* A certain user has his own (bigger) file storage for Drive files and other users of that context are supposed to use that file storage to share the quota usage and limitation specified for that file storage. A file storage owned by a user that is also used by other users is called '''master file storage'''.&lt;br /&gt;
&lt;br /&gt;
Having that possibilities of separation for quota usage and limitation it is possible to apply a certain use case scenario to contexts; e.g.&lt;br /&gt;
&lt;br /&gt;
* Slow mass storage vs. fast Drive storage setup&lt;br /&gt;
* OX Drive Stand‐Alone setup&lt;br /&gt;
&lt;br /&gt;
When assigning dedicated file storage for Drive to a certain user, the user’s file occupation is no more accounted to the overall context in which that user resides, but gets accounted to a dedicated user quota. Such a user quota can be used for different sales strategies that include tracking the user’s file occupation.&lt;br /&gt;
&lt;br /&gt;
To achieve the file storage association on a per user basis, the existing user table has been enhanced by file storage and quota information as it is for the context table. Moreover the filestore_usage table has also been enhanced by the capability to account storage occupation to a certain user&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture3.png|Enhancements|650px]]&lt;br /&gt;
&lt;br /&gt;
In addition the user table has also been extended by filestore_owner column. That column is used to let a user’s file storage be combined with another user’s storage. This serves the scenario in which a grouped OX Drive Stand‐Alone setup is operated. Multiple users’ file occupation gets accounted to a master user account.&lt;br /&gt;
&lt;br /&gt;
Furthermore Open‐Xchange allows changing the running setups at any time to adjust the file storage usages/associations according to possibly changing needs/requirements.&lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
Please note that with introducing the concept of having user-associated file storages, the output for &amp;quot;listfilestore&amp;quot; command-line tool changed. Since also a user can be accounted to a file storage's capacity, the output changed to be:&lt;br /&gt;
&lt;br /&gt;
 /opt/open-xchange/sbin/listfilestore -A oxadminmaster -P secret&lt;br /&gt;
  id path                      size reserved used max-entities cur-entities&lt;br /&gt;
   2 file:///var/opt/filestore 1000      300    0         5000            2&lt;br /&gt;
&lt;br /&gt;
Hence, &amp;quot;maxctx&amp;quot; is replaced with &amp;quot;max-entities&amp;quot; and &amp;quot;curctx&amp;quot; is replaced with &amp;quot;cur-entities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Seamless integration and flexibility ==&lt;br /&gt;
The new more flexible approach fits seamlessly into existing context/file storage setups. Thus there is no need to change anything, unless demanded by administrator&lt;br /&gt;
&lt;br /&gt;
=== The fall‐back setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture4.png|The fall-back setup|650px]]&lt;br /&gt;
&lt;br /&gt;
Everything stays as is. There is a storage‐per‐context association and every file is held in that storage. There are no user‐specific file storage attributes set in user table.&lt;br /&gt;
&lt;br /&gt;
=== Slow mass storage vs. fast file storage setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture5.png|Slow mass storage|650px]]&lt;br /&gt;
&lt;br /&gt;
There are two storages available: a file‐based and an S3 storage (assuming that the S3 one would be faster). While the context has the file‐based storage set, users in that context do have individual name spaces in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
That way common files (PIM/Signature attachments, thumbnails) are stored to context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage. Every user is allowed to occupy up to 10GB of space in the S3 storage (this can be varied as well).&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Single User ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture6.png|OX Drive Stand-Alone - Single User|650px]]&lt;br /&gt;
&lt;br /&gt;
Again there two file storages. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
Context designated to the Single User scenario for OX Drive Stand‐Alone operation, do hold only one user that has its individual name space associated in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
Again common files (PIM/Signature attachments, thumbnails) are stored in the context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage of each context. Every Drive document accounts the user‐sensitive quota of the associated user.&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Business Account ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture7.png|OX Drive Stand-Alone - Business Account|650px]]&lt;br /&gt;
&lt;br /&gt;
There two different file storages as in the previous setups. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
For this setup users do not hold their own individual name space in the S3 storage, but all share the same name space of the master user in the S3 storage. Moreover there are no dedicated user quotas, but all Drive documents do account to the master user’s quota&lt;br /&gt;
&lt;br /&gt;
== Extensions to provisioning command‐line tools ==&lt;br /&gt;
&lt;br /&gt;
=== createuser ===&lt;br /&gt;
&lt;br /&gt;
The existing createuser CLI is enhanced by the following options&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
 ‐f/‐‐filestore The identifier for the file storage.&lt;br /&gt;
 ‐o/‐‐owner The owner for the file storage. If no owner is given and f/filestore option is set, the user itself is taken as owner&lt;br /&gt;
&lt;br /&gt;
=== changeuser ===&lt;br /&gt;
&lt;br /&gt;
The existing changeuser CLI is enhanced by the following option&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
&lt;br /&gt;
=== movecontextfilestore2user ===&lt;br /&gt;
&lt;br /&gt;
Move a user’s files from a context to an individual storage name space. &amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movecontextfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another which means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2context ===&lt;br /&gt;
&lt;br /&gt;
The counterpart for the previous CLI. Move a user's files from his individual storage name space to the context storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2context&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another that means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2master ===&lt;br /&gt;
Move a user's files from his individual storage name space to the storage name space of specified master.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;br /&gt;
&lt;br /&gt;
=== movemasterfilestore2user ===&lt;br /&gt;
Move a user's files from a master account name space to an individual storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movemasterfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22494</id>
		<title>AppSuite:File Storages per User</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:File_Storages_per_User&amp;diff=22494"/>
		<updated>2016-11-03T08:09:50Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Motivation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Version|7.8.0}}&lt;br /&gt;
&lt;br /&gt;
= File Storages per user =&lt;br /&gt;
&lt;br /&gt;
This document tries to outline and explain the new concept of having the possibility to specify file storages on a per user basis that is introduced with Open‐Xchange Server v7.8.0.&lt;br /&gt;
&lt;br /&gt;
== The previous situation ==&lt;br /&gt;
&lt;br /&gt;
Before the introduction of the file storages per user feature, it was only possible to specify the file storage association per context.&lt;br /&gt;
That file storage was used for all modules/functions that are supposed to store/retrieve files:&lt;br /&gt;
* Drive&lt;br /&gt;
* Thumbnails&lt;br /&gt;
* PIM attachments&lt;br /&gt;
* Signature attachments&lt;br /&gt;
&lt;br /&gt;
File storages are registered and maintained in file store table held in configDb database. File storage obtains a unique identifier, a base URI and a size limitation.&lt;br /&gt;
&lt;br /&gt;
For each context a file storage identifier is specified alongside with a context quota that defines how much space that context is allowed to occupy in assigned file storage. Thus the sum of all quotas from those contexts assigned to file storage must not exceed the file storage’s size.&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture1.png|One file storage per context|650px]]&lt;br /&gt;
&lt;br /&gt;
== Motivation ==&lt;br /&gt;
&lt;br /&gt;
The motivation is to differentiate between file storages for common context‐associated files and Drive file. Those Drive files may further reside in the common context‐associated storage, but it also possible to specify user‐associated file storages where Drive files are maintained. The association is determined based on a folder's creator/owner: The quota gets accounted to that user that created a folder (provided the user has a user‐associated file storage).&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture2.png|Differentiate|650px]]&lt;br /&gt;
&lt;br /&gt;
That kind of separation allows different provisioning scenarios that an administrator possibly wants to achieve. With regard to Drive files it is now possible to define per context that:&lt;br /&gt;
&lt;br /&gt;
* All Drive files reside in the file storage associated with the context, which is either automatically determined or explicitly set (through -F,--destination-store-id option) when creating a context. The file storage associated with the context is called context file storage.&lt;br /&gt;
* Certain users are supposed to store their Drive files in their own file storage with individual quota settings different from the context file storage. All files created in Drive folders owned by such a user are then accounted to that user-associated file storage having their own quota usage and limitation. The user-associated file storage may be set on user creation as it is for context creation. The file storage associated with a user is called user file storage.&lt;br /&gt;
* A certain user has his own (bigger) file storage for Drive files and other users of that context are supposed to use that file storage to share the quota usage and limitation specified for that file storage. A file storage owned by a user that is also used by other users is called master file storage.&lt;br /&gt;
&lt;br /&gt;
Having that possibilities of separation for quota usage and limitation it is possible to apply a certain use case scenario to contexts; e.g.&lt;br /&gt;
&lt;br /&gt;
* Slow mass storage vs. fast Drive storage setup&lt;br /&gt;
* OX Drive Stand‐Alone setup&lt;br /&gt;
&lt;br /&gt;
When assigning dedicated file storage for Drive to a certain user, the user’s file occupation is no more accounted to the overall context in which that user resides, but gets accounted to a dedicated user quota. Such a user quota can be used for different sales strategies that include tracking the user’s file occupation.&lt;br /&gt;
&lt;br /&gt;
To achieve the file storage association on a per user basis, the existing user table has been enhanced by file storage and quota information as it is for the context table. Moreover the filestore_usage table has also been enhanced by the capability to account storage occupation to a certain user&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture3.png|Enhancements|650px]]&lt;br /&gt;
&lt;br /&gt;
In addition the user table has also been extended by filestore_owner column. That column is used to let a user’s file storage be combined with another user’s storage. This serves the scenario in which a grouped OX Drive Stand‐Alone setup is operated. Multiple users’ file occupation gets accounted to a master user account.&lt;br /&gt;
&lt;br /&gt;
Furthermore Open‐Xchange allows changing the running setups at any time to adjust the file storage usages/associations according to possibly changing needs/requirements.&lt;br /&gt;
&lt;br /&gt;
=== Note ===&lt;br /&gt;
&lt;br /&gt;
Please note that with introducing the concept of having user-associated file storages, the output for &amp;quot;listfilestore&amp;quot; command-line tool changed. Since also a user can be accounted to a file storage's capacity, the output changed to be:&lt;br /&gt;
&lt;br /&gt;
 /opt/open-xchange/sbin/listfilestore -A oxadminmaster -P secret&lt;br /&gt;
  id path                      size reserved used max-entities cur-entities&lt;br /&gt;
   2 file:///var/opt/filestore 1000      300    0         5000            2&lt;br /&gt;
&lt;br /&gt;
Hence, &amp;quot;maxctx&amp;quot; is replaced with &amp;quot;max-entities&amp;quot; and &amp;quot;curctx&amp;quot; is replaced with &amp;quot;cur-entities&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Seamless integration and flexibility ==&lt;br /&gt;
The new more flexible approach fits seamlessly into existing context/file storage setups. Thus there is no need to change anything, unless demanded by administrator&lt;br /&gt;
&lt;br /&gt;
=== The fall‐back setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture4.png|The fall-back setup|650px]]&lt;br /&gt;
&lt;br /&gt;
Everything stays as is. There is a storage‐per‐context association and every file is held in that storage. There are no user‐specific file storage attributes set in user table.&lt;br /&gt;
&lt;br /&gt;
=== Slow mass storage vs. fast file storage setup ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture5.png|Slow mass storage|650px]]&lt;br /&gt;
&lt;br /&gt;
There are two storages available: a file‐based and an S3 storage (assuming that the S3 one would be faster). While the context has the file‐based storage set, users in that context do have individual name spaces in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
That way common files (PIM/Signature attachments, thumbnails) are stored to context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage. Every user is allowed to occupy up to 10GB of space in the S3 storage (this can be varied as well).&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Single User ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture6.png|OX Drive Stand-Alone - Single User|650px]]&lt;br /&gt;
&lt;br /&gt;
Again there two file storages. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
Context designated to the Single User scenario for OX Drive Stand‐Alone operation, do hold only one user that has its individual name space associated in the S3 storage.&lt;br /&gt;
&lt;br /&gt;
Again common files (PIM/Signature attachments, thumbnails) are stored in the context‐ associated file‐based storage while Drive documents are stored in the individual user name spaces in the S3 storage of each context. Every Drive document accounts the user‐sensitive quota of the associated user.&lt;br /&gt;
&lt;br /&gt;
=== OX Drive Stand‐Alone – Business Account ===&lt;br /&gt;
&lt;br /&gt;
[[Image:file_storage_picture7.png|OX Drive Stand-Alone - Business Account|650px]]&lt;br /&gt;
&lt;br /&gt;
There two different file storages as in the previous setups. Again the file‐based one is assumed to serve the slow mass storage behavior while S3 is assumed to be the fast storage.&lt;br /&gt;
&lt;br /&gt;
For this setup users do not hold their own individual name space in the S3 storage, but all share the same name space of the master user in the S3 storage. Moreover there are no dedicated user quotas, but all Drive documents do account to the master user’s quota&lt;br /&gt;
&lt;br /&gt;
== Extensions to provisioning command‐line tools ==&lt;br /&gt;
&lt;br /&gt;
=== createuser ===&lt;br /&gt;
&lt;br /&gt;
The existing createuser CLI is enhanced by the following options&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
 ‐f/‐‐filestore The identifier for the file storage.&lt;br /&gt;
 ‐o/‐‐owner The owner for the file storage. If no owner is given and f/filestore option is set, the user itself is taken as owner&lt;br /&gt;
&lt;br /&gt;
=== changeuser ===&lt;br /&gt;
&lt;br /&gt;
The existing changeuser CLI is enhanced by the following option&lt;br /&gt;
 ‐q/‐‐quota The file storage quota in MB for associated user&lt;br /&gt;
&lt;br /&gt;
=== movecontextfilestore2user ===&lt;br /&gt;
&lt;br /&gt;
Move a user’s files from a context to an individual storage name space. &amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movecontextfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another which means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2context ===&lt;br /&gt;
&lt;br /&gt;
The counterpart for the previous CLI. Move a user's files from his individual storage name space to the context storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2context&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another that means that at least one of them must be set.&lt;br /&gt;
&lt;br /&gt;
=== moveuserfilestore2master ===&lt;br /&gt;
Move a user's files from his individual storage name space to the storage name space of specified master.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: moveuserfilestore2master&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;br /&gt;
&lt;br /&gt;
=== movemasterfilestore2user ===&lt;br /&gt;
Move a user's files from a master account name space to an individual storage name space.&amp;lt;br&amp;gt;&lt;br /&gt;
Usage: movemasterfilestore2user&lt;br /&gt;
&lt;br /&gt;
 ‐h,‐‐help	Prints a help text&lt;br /&gt;
 ‐‐environment	Show info about commandline environment&lt;br /&gt;
 ‐‐nonl	Remove all newlines (\n) from output&lt;br /&gt;
 ‐i,‐‐userid &amp;lt;userid&amp;gt;	| Id of the user&lt;br /&gt;
 ‐u,‐‐username &amp;lt;username&amp;gt;	| Username of the user&lt;br /&gt;
 ‐A,‐‐adminuser &amp;lt;adminuser&amp;gt;	? Admin username&lt;br /&gt;
 ‐P,‐‐adminpass &amp;lt;adminpass&amp;gt;	? Admin password&lt;br /&gt;
 ‐c,‐‐contextid &amp;lt;contextid&amp;gt;	| The id of the context&lt;br /&gt;
 ‐N,‐‐contextname &amp;lt;contextname&amp;gt;	| context name&lt;br /&gt;
 ‐m,‐‐master &amp;lt;master&amp;gt;	Master user id. If not set, the context administrator is assumed to be the master user.&lt;br /&gt;
 ‐f,‐‐filestore &amp;lt;filestore&amp;gt;	* The identifier for the file storage.&lt;br /&gt;
 ‐q,‐‐quota &amp;lt;quota&amp;gt;	* The file storage quota in MB for associated user.&lt;br /&gt;
&lt;br /&gt;
Entries marked with an asterisk (*) are mandatory.&lt;br /&gt;
Entries marked with an question mark (?) are mandatory depending on your configuration.&lt;br /&gt;
Entries marked with a pipe (|) are mandatory for one another, which means that at least one of them, must be set.&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Context_management&amp;diff=22493</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=22493"/>
		<updated>2016-11-03T07:20:15Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Parameters */&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:''' The context-associated filestore is not only used by Infostore/Drive module, but also for other features like snippets/signatures, thumbnail cache, PIM (contacts, calendar &amp;amp; tasks) attachments, etc. Thus even if you don't use the Infostore/Drive, you should always set an appropriate amount so users can e.g. store signatures or attach files to PIM items.&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>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Context_management&amp;diff=22492</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=22492"/>
		<updated>2016-11-03T07:19:11Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Parameters */&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:''' The context-associated filestore is not only used by Infostore/Drive module, but also for other features like snippets/signatures, thumbnail cache, PIM attachments, etc. Thus even if you don't use the Infostore/Drive, you should always set an appropriate 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>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Context_management&amp;diff=22491</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=22491"/>
		<updated>2016-11-03T07:18:44Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Parameters */&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: The context-associated filestore is not only used by Infostore/Drive module, but also for other features like snippets/signatures, thumbnail cache, PIM attachments, etc. Thus even if you don't use the Infostore/Drive, you should always set an appropriate 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>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=22319</id>
		<title>AppSuite:Running a cluster</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Running_a_cluster&amp;diff=22319"/>
		<updated>2016-08-17T08:36:22Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Upgrades of the Hazelcast library */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Running a cluster&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Concepts =&lt;br /&gt;
&lt;br /&gt;
For inter-OX-communication over the network, multiple Open-Xchange servers can form a cluster. This brings different advantages regarding distribution and caching of volatile data, load balancing, scalability, fail-safety and robustness. Additionally, it provides the infrastructure for upcoming features of the Open-Xchange server. &lt;br /&gt;
The clustering capabilities of the Open-Xchange server are mainly built up on [http://hazelcast.com Hazelcast], an open source clustering and highly scalable data distribution platform for Java. The following article provides an overview about the current featureset and configuration options.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
&lt;br /&gt;
== Synchronized system clock times ==&lt;br /&gt;
It is crucial that all involved members in a cluster do have their system clock times in sync with each other; e.g. by using an NTP service.&lt;br /&gt;
&lt;br /&gt;
== HTTP routing ==&lt;br /&gt;
An OX cluster is always part of a larger picture. Usually there is front level loadbalancer as central HTTPS entry point to the platform. This loadbalancer optionally performs HTTPS termination and forwards HTTP(S) requests to webservers (the usual and only supported choice as of now is Apache). These webservers are performing HTTPS termination (if this is not happening on the loadbalancer) and serve static content, and (which is what is relevant for our discussion here) they forward dynamic requests to the OX backends.&lt;br /&gt;
&lt;br /&gt;
A central requirement for the interaction of these components (loadbalancer, webservers, OX nodes) is that we have session stability based on the JSESSIONID cookie / jsessionid path component suffix. This means that our application sets a cookie named JSESSIONID which has a value like &amp;lt;large decimal number&amp;gt;.&amp;lt;route identifier&amp;gt;, e.g. &amp;quot;5661584529655240315.OX1&amp;quot;. The route identifier here (&amp;quot;OX1&amp;quot; in this example) is taken by the OX node from a configuration setting from a config file and is specific to one OX node. HTTP routing must happen such that HTTP requests with a cookie with such a suffix always end up the corresponding OX node. There are furthermore specific cirumstances when passing this information via cookie is not possible. Then the JSESSIONID is transferred in a path component as &amp;quot;jsessionid=...&amp;quot; in the HTTP request. The routing mechanism needs to take that into account also.&lt;br /&gt;
&lt;br /&gt;
There are mainly two options to implement this. If the Apache processes are running co-located on the same machines running the OX groupware processes, it is often desired to have the front level loadbalancer perform HTTP routing to the correct machines. If dedicated Apache nodes are employed, is is usually sufficient to have the front-level loadbalancer do HTTP routing to the Apache nodes in a round-robin fashion and perform routing to the correct OX nodes in the Apache nodes.&lt;br /&gt;
&lt;br /&gt;
We provide sample configuration files to configure Apache (with mod_proxy_http) to perform HTTP routing correctly in our guides on OXpedia, e.g. [[AppSuite:Main_Page_AppSuite#quickinstall]]. Central elements are the directives &amp;quot;ProxySet stickysession=JSESSIONID|jsessionid scolonpathdelim=On&amp;quot; in conjunction with the &amp;quot;route=OX1&amp;quot; parameters to the BalancerMember lines in the Proxy definition. This is valid for Apache 2.2 as of Sep-2014.&lt;br /&gt;
&lt;br /&gt;
How to configure a front level loadbalancer to perform HTTP equivalent HTTP routing is dependent on the specific loadbalancer implementation. If Apache is used as front level loadbalancer, the same configuration as discussed in the previous section can be employed. As of time of writing this text (Sep 2014), the alternative choices are thin. F5 BigIP is reported to be able to implement &amp;quot;jsessionid based persistence using iRules&amp;quot;. nginx has the functionality in their commercial &amp;quot;nginx plus&amp;quot; product. (Both of these options have not been tested by OX.) Other loadbalancers with this functionality are not known to us.&lt;br /&gt;
&lt;br /&gt;
If the front level loadbalancer is not capable of performing correct HTTP routing, is is required to configure correct HTTP routing on Apache level, even if Apache runs co-located on the OX nodes and thus cross-routing happens.&lt;br /&gt;
&lt;br /&gt;
There are several reasons why we require session stability in exactly this way. We require session stabilty for horizontal scale-out; while we support transparent resuming / migration of user sessions in the OX cluster without need for users to re-authenticate, sessions wandering around randomly will consume a fixed amount resources corresponding to a running session on each OX node in the cluster, while a session sticky to one OX node will consume this fixed amount of resources only on one OX node. Furthermore there are mechanisms in OX like TokenLogin which work only of all requests beloning to one sequence get routed to the same OX node even if they stem from different machines with different IPs. Only the JSESSIONID (which in this case is transferred as jsessionid path component, as cookies do not work during a 302 redirect, which is part of this sequence) carries the required information where the request must be routed to.&lt;br /&gt;
&lt;br /&gt;
Usual &amp;quot;routing based on cookie hash&amp;quot; is not sufficient here since it disregards the information which machine originally issued the cookie. It only ensures that the session will be sticky to any target, which statistically will not be the same machine that issued the cookie. OX will then set a new JSESSIONID cookie, assuming the session had been migrated. The loadbalancer will then route the session to a different target, as the hash of the cookie will differ. This procedure then happens iteratively until by chance the routing based on cookie hash will route the session to the correct target. By then, a lot of resources will have been wasted, by creating full (short-term) sessions on all OX nodes. Furthermore, processes like TokenLogin will not work this way.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
&lt;br /&gt;
All settings regarding cluster setup are located in the configuration file ''hazelcast.properties''. The former used additional files ''cluster.properties'', ''mdns.properties'' and ''static-cluster-discovery.properties'' are no longer needed. The following gives an overview about the most important settings - please refer to the inline documentation of the configuration file for more advanced options.&lt;br /&gt;
&lt;br /&gt;
Note: The configuration guide targets v7.4.0 of the OX server (and above). For older versions, please consult the history of this page.&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
To restrict access to the cluster and to separate the cluster from others in the local network, a name and password needs to be defined. Only backend nodes having the same values for those properties are able to join and form a cluster. &lt;br /&gt;
&lt;br /&gt;
 # Configures the name of the cluster. Only nodes using the same group name &lt;br /&gt;
 # will join each other and form the cluster. Required if &lt;br /&gt;
 # &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is not &amp;quot;empty&amp;quot; (see below).&lt;br /&gt;
 com.openexchange.hazelcast.group.name=&lt;br /&gt;
 &lt;br /&gt;
 # The password used when joining the cluster. Defaults to &amp;quot;wtV6$VQk8#+3ds!a&amp;quot;. &lt;br /&gt;
 # Please change this value, and ensure it's equal on all nodes in the cluster.&lt;br /&gt;
 com.openexchange.hazelcast.group.password=wtV6$VQk8#+3ds!a&lt;br /&gt;
&lt;br /&gt;
== Network ==&lt;br /&gt;
&lt;br /&gt;
It's required to define the network interface that is used for cluster communication via ''com.openexchange.hazelcast.network.interfaces''. By default, the interface is restricted to the local loopback address only. To allow the same configuration amongst all nodes in the cluster, it's recommended to define the value using a wildcard matching the IP addresses of all nodes participating in the cluster, e.g. ''192.168.0.*''&lt;br /&gt;
&lt;br /&gt;
 # Comma-separated list of interface addresses hazelcast should use. Wildcards &lt;br /&gt;
 # (*) and ranges (-) can be used. Leave blank to listen on all interfaces&lt;br /&gt;
 # Especially in server environments with multiple network interfaces, it's &lt;br /&gt;
 # recommended to specify the IP-address of the network interface to bind to &lt;br /&gt;
 # explicitly. Defaults to &amp;quot;127.0.0.1&amp;quot; (local loopback only), needs to be &lt;br /&gt;
 # adjusted when building a cluster of multiple backend nodes.&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=127.0.0.1&lt;br /&gt;
&lt;br /&gt;
To form a cluster of multiple OX server nodes, different discovery mechanisms can be used. The discovery mechanism is specified via the property ''com.openexchange.hazelcast.network.join'':&lt;br /&gt;
&lt;br /&gt;
 # Specifies which mechanism is used to discover other backend nodes in the &lt;br /&gt;
 # cluster. Possible values are &amp;quot;empty&amp;quot; (no discovery for single-node setups),&lt;br /&gt;
 # &amp;quot;static&amp;quot; (fixed set of cluster member nodes) or &amp;quot;multicast&amp;quot; (automatic &lt;br /&gt;
 # discovery of other nodes via multicast). Defaults to &amp;quot;empty&amp;quot;. Depending on &lt;br /&gt;
 # the specified value, further configuration might be needed, see &amp;quot;Networking&amp;quot;&lt;br /&gt;
 # section below. &lt;br /&gt;
 com.openexchange.hazelcast.network.join=empty&lt;br /&gt;
&lt;br /&gt;
Generally, it's advised to use the same network join mechanism for all nodes in the cluster, and, in most cases, it's strongly recommended to use a ''static'' network join configuration. This will allow the nodes to join the cluster directly upon startup. With a ''multicast'' based setup, nodes will merge to an existing cluster possibly at some later time, thus not being able to access the distributed data until they've joined.&lt;br /&gt;
&lt;br /&gt;
Depending on the network join setting, further configuration may be necessary, as decribed in the following paragraphs.&lt;br /&gt;
&lt;br /&gt;
=== empty ===&lt;br /&gt;
&lt;br /&gt;
When using the default value ''empty'', no other nodes are discovered in the cluster. This value is suitable for single-node installations. Note that other nodes that are configured to use other network join mechanisms may be still able to still to connect to this node, e.g. using a ''static'' network join, having the IP address of this host in the list of potential cluster members (see below).&lt;br /&gt;
&lt;br /&gt;
=== static ===&lt;br /&gt;
&lt;br /&gt;
The most common setting for ''com.openexchange.hazelcast.network.join'' is ''static''. A static cluster discovery uses a fixed list of IP addresses of the nodes in the cluster. During startup and after a specific interval, the underlying Hazelcast library probes for not yet joined nodes from this list and adds them to the cluster automatically. The address list is configured via ''com.openexchange.hazelcast.network.join.static.nodes'':&lt;br /&gt;
&lt;br /&gt;
 # Configures a comma-separated list of IP addresses / hostnames of possible &lt;br /&gt;
 # nodes in the cluster, e.g. &amp;quot;10.20.30.12, 10.20.30.13:5701, 192.178.168.110&amp;quot;.&lt;br /&gt;
 # Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set to &amp;quot;static&amp;quot;. &lt;br /&gt;
 # It doesn't hurt if the address of the local host appears in the list, so &lt;br /&gt;
 # that it's still possible to use the same list throughout all nodes in the &lt;br /&gt;
 # cluster.&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=&lt;br /&gt;
&lt;br /&gt;
For a fixed set of backend nodes, it's recommended to simply include the IP addresses of all nodes in the list, and use the same configuration for each node. However, it's only required to add the address of at least one other node in the cluster to allow the node to join the cluster. Also, when adding a new node to the cluster and this list is extended accordingly, existing nodes don't need to be shut down to recognize the new node, as long as the new node's address list contains at least one of the already running nodes. &lt;br /&gt;
&lt;br /&gt;
=== multicast ===&lt;br /&gt;
&lt;br /&gt;
For highly dynamic setups where nodes are added and removed from the cluster quite often and/or the host's IP addresses are not fixed, it's also possible to configure the network join via multicast. During startup and after a specific interval, the backend nodes initiate the multicast join process automatically, and discovered nodes form or join the cluster afterwards. The multicast group and port can be configured as follows:&lt;br /&gt;
&lt;br /&gt;
 # Configures the multicast address used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. If the nodes reside in different subnets, please ensure that &lt;br /&gt;
 # multicast is enabled between the subnets. Defaults to &amp;quot;224.2.2.3&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.group=224.2.2.3&lt;br /&gt;
 &lt;br /&gt;
 # Configures the multicast port used to discover other nodes in the cluster&lt;br /&gt;
 # dynamically. Only used if &amp;quot;com.openexchange.hazelcast.network.join&amp;quot; is set &lt;br /&gt;
 # to &amp;quot;multicast&amp;quot;. Defaults to &amp;quot;54327&amp;quot;. &lt;br /&gt;
 com.openexchange.hazelcast.network.join.multicast.port=54327&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
The following example shows how a simple cluster named ''MyCluster'' consisting of 4 backend nodes can be configured using ''static'' cluster discovery. The node's IP addresses are 10.0.0.15, 10.0.0.16, 10.0.0.17 and 10.0.0.18. Note that the same ''hazelcast.properties'' is used by all nodes.&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.group.name=MyCluster&lt;br /&gt;
 com.openexchange.hazelcast.group.password=secret&lt;br /&gt;
 com.openexchange.hazelcast.network.join=static&lt;br /&gt;
 com.openexchange.hazelcast.network.join.static.nodes=10.0.0.15,10.0.0.16,10.0.0.17,10.0.0.18&lt;br /&gt;
 com.openexchange.hazelcast.network.interfaces=10.0.0.*&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Advanced Configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Custom Partitioning (preliminary) ===&lt;br /&gt;
&lt;br /&gt;
While originally being desgined to separate the nodes holding distributed data into different risk groups for increased fail safety, a custom partioning strategy may also be used to distinguish between nodes holding distributed data from those who should not. &lt;br /&gt;
&lt;br /&gt;
This approach of custom partitioning may be used in a OX cluster, where usually different backend nodes serve different purposes. A common scenario is that there are nodes handling requests from the web interfaces, and others being responsible for USM/EAS traffic. Due to their nature of processing large chunks of synchronization data in memory, the USM/EAS nodes may encounter small delays when the Java garbage collector kicks in and suspends the Java Virtual Machine. Since those delays may also have an influence on hazelcast-based communication in the cluster, the idea is to instruct hazelcast to not store distributed data on that nodes. This is where a custom partitioning scheme comes into play.&lt;br /&gt;
&lt;br /&gt;
To setup a custom paritioning scheme in the cluster, an additional ''hazelcast.xml'' configuration file is used, which should be placed into the ''hazelcast'' subdirectory of the OX configuration folder, usually at ''/opt/openexchange/etc/hazelcast''. Please note that it's vital that each node in the cluster is configured equally here, so the same ''hazelcast.xml'' file should be copied to each server. The configuration read from there is used as basis for all further settings that are taken from the ordinary ''hazelcast.properties'' config file. &lt;br /&gt;
&lt;br /&gt;
To setup a custom paritioning scheme, the partition groups must be defined in the ''hazelcast.xml'' file. See the following file for an example configuration, where the three nodes ''10.10.10.60'', ''10.10.10.61'' and ''10.10.10.62'' are defined to form an own paritioning group each. Doing so, all distributed data will be stored at one of those nodes physically, while the corresponding backup data (if configured) at one of the other two nodes. All other nodes in the cluster will not be used to store distributed data, but will still be &amp;quot;full&amp;quot; hazelcast members, which is necessary for other cluster-wide operations the OX backends use. &lt;br /&gt;
&lt;br /&gt;
Please note that the configured backup count in the map configurations should be smaller than the number of nodes here, otherwise, there may be problems if one of those data nodes is shut down temporarily for maintenance. So, the minimum number of nodes to define in the partition group sections is implicitly bound to the sum of a map's ''backupCount'' and ''asyncBackupCount'' properties, plus ''1'' for the original data partition. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot;?&amp;gt;&lt;br /&gt;
 &amp;lt;!--&lt;br /&gt;
   ~ Copyright (c) 2008-2013, Hazelcast, Inc. All Rights Reserved.&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Licensed under the Apache License, Version 2.0 (the &amp;quot;License&amp;quot;);&lt;br /&gt;
   ~ you may not use this file except in compliance with the License.&lt;br /&gt;
   ~ You may obtain a copy of the License at&lt;br /&gt;
   ~&lt;br /&gt;
   ~ http://www.apache.org/licenses/LICENSE-2.0&lt;br /&gt;
   ~&lt;br /&gt;
   ~ Unless required by applicable law or agreed to in writing, software&lt;br /&gt;
   ~ distributed under the License is distributed on an &amp;quot;AS IS&amp;quot; BASIS,&lt;br /&gt;
   ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;
   ~ See the License for the specific language governing permissions and&lt;br /&gt;
   ~ limitations under the License.&lt;br /&gt;
   --&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;hazelcast xsi:schemaLocation=&amp;quot;http://www.hazelcast.com/schema/config hazelcast-config-3.1.xsd&amp;quot;&lt;br /&gt;
            xmlns=&amp;quot;http://www.hazelcast.com/schema/config&amp;quot;&lt;br /&gt;
            xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;&amp;gt;&lt;br /&gt;
     &amp;lt;partition-group enabled=&amp;quot;true&amp;quot; group-type=&amp;quot;CUSTOM&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.60&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.61&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
         &amp;lt;member-group&amp;gt;&lt;br /&gt;
             &amp;lt;interface&amp;gt;10.10.10.62&amp;lt;/interface&amp;gt;&lt;br /&gt;
         &amp;lt;/member-group&amp;gt;&lt;br /&gt;
     &amp;lt;/partition-group&amp;gt;&lt;br /&gt;
 &amp;lt;/hazelcast&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More general information regarding custom partioning is available at http://hazelcast.org/docs/latest/manual/html/partitiongroupconfig.html . &lt;br /&gt;
&lt;br /&gt;
It's also recommended to use a &amp;quot;static&amp;quot; cluster discovery for the network join, and list same the nodes that are also configured in the parition groups here, so that join requests are handled by those nodes, too (and not the other nodes that are potentially prone to garbage collection delays. &lt;br /&gt;
&lt;br /&gt;
After configuring a custom paritioning scheme, the data distribution may be verified, e.g. by inspecting the MBeans of the distributed maps via JMX.&lt;br /&gt;
&lt;br /&gt;
= Features =&lt;br /&gt;
&lt;br /&gt;
The following list gives an overview about different features that were implemented using the new cluster capabilities.&lt;br /&gt;
&lt;br /&gt;
== Distributed Session Storage ==&lt;br /&gt;
&lt;br /&gt;
Previously, when an Open-Xchange server was shutdown for maintenance, all user sessions that were bound to that machine were lost, i.e. the users needed to login again. With the distributed session storage, all sessions are backed by a distributed map in the cluster, so that they are no longer bound to a specific node in the cluster. When a node is shut down, the session data is still available in the cluster and can be accessed from the remaining nodes. The load-balancing techniques of the webserver then seamlessly routes the user session to another node, with no ''session expired'' errors. The distributed session storage comes with the package ''open-xchange-sessionstorage-hazelcast''. It's recommended to install this optional package in all clustered environments with multiple groupware server nodes.&lt;br /&gt;
&lt;br /&gt;
'''Notes:''' &lt;br /&gt;
* While there's some kind of built-in session distribution among the nodes in the cluster, this should not be seen as a replacement for session-stickiness between the loadbalancer and groupware nodes, i.e. one should still configure the webserver to use sticky sessions for performance reasons.&lt;br /&gt;
* The distributed session storage is still an in-memory storage. While the session data is distributed and backed up on multiple nodes in the cluster, shutting down multiple or all nodes at the same time will lead to loss of the the distributed data. To avoid such data loss when shutting down a node, please follow the guidelines at [[ Updating_a_Cluster ]].&lt;br /&gt;
&lt;br /&gt;
Depending on the cluster infrastructure, different backup-count configuration options might be set for the distributed session storage in the map configuration file ''sessions.properties'' in the ''hazelcast'' subdirectory:&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.backupCount=1&lt;br /&gt;
&lt;br /&gt;
The ''backupcount'' property configures the number of nodes with synchronized backups. Synchronized backups block operations until backups are successfully copied and acknowledgements are received. If 1 is set as the backup-count for example, then all entries of the map will be copied to another JVM for fail-safety. 0 means no backup. Any integer between 0 and 6. Default is 1, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
   com.openexchange.hazelcast.configuration.map.asyncBackupCount=0&lt;br /&gt;
&lt;br /&gt;
The ''asyncbackup'' property configures the number of nodes with async backups. Async backups do not block operations and do not require acknowledgements. 0 means no backup. Any integer between 0 and 6. Default is 0, setting bigger than 6 has no effect.&lt;br /&gt;
&lt;br /&gt;
Since session data is backed up by default continously by multiple nodes in the cluster, the steps described in [[ Session_Migration ]] to trigger session mirgration to other nodes explicitly is obsolete and no longer needed with the distributed session storage.&lt;br /&gt;
&lt;br /&gt;
Normally, sessions in the distributed storages are not evicted automatically, but are only removed when they're also removed from the session handler, either due to a logout operation or when exceeding the long-term session lifetime as configured by ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''. Under certain circumstances, i.e. the session is no longer accessed by the client and the OX node hosting the session in it's long-life container being shutdown, the remove operation from the distributed storage might not be triggered. Therefore, additionaly a maximum idle time of map-entries can be configured for the distributed sessions map via &lt;br /&gt;
&lt;br /&gt;
 com.openexchange.hazelcast.configuration.map.maxIdleSeconds=640000&lt;br /&gt;
&lt;br /&gt;
To avoid unnecessary eviction, the value should be higher than the configured ''com.openexchange.sessiond.sessionLongLifeTime'' in ''sessiond.properties''.&lt;br /&gt;
&lt;br /&gt;
== Remote Cache Invalidation ==&lt;br /&gt;
&lt;br /&gt;
For faster access, groupware data is held in different caches by the server. Formerly, the caches utilized the TCP Lateral Auxiliary Cache plug in (LTCP) for the underlying JCS caches to broadcast updates and removals to caches on other OX nodes in the cluster. This could potentially lead to problems when remote invalidation was not working reliably due to network discovery problems. As an alternative, remote cache invalidation can also be performed using reliable publish/subscribe events built up on Hazelcast topics. This can be configured in the ''cache.properties'' configuration file, where the 'eventInvalidation' property can either be set to 'false' for the legacy behavior or 'true' for the new mechanism:&lt;br /&gt;
&lt;br /&gt;
 com.openexchange.caching.jcs.eventInvalidation=true&lt;br /&gt;
&lt;br /&gt;
All nodes participating in the cluster should be configured equally.&lt;br /&gt;
&lt;br /&gt;
Internally, if ''com.openexchange.caching.jcs.eventInvalidation'' is set to ''true'', LTCP is disabled in JCS caches. Instead, an internal mechanism based on distributed Hazelcast event topics is used to invalidate data throughout all nodes in the cluster after local update- and remove-operations. Put-operations aren't propagated (and haven't been with LTCP either), since all data put into caches can be locally loaded/evaluated at each node from the persistent storage layer.&lt;br /&gt;
&lt;br /&gt;
Using Hazelcast-based cache invalidation also makes further configuration of the JCS auxiliaries obsolete in the ''cache.ccf'' configuration file. In that case, all ''jcs.auxiliary.LTCP.*'' configuration settings are virtually ignored. However, it's still required to mark caches that require cluster-wide invalidation via ''jcs.region.&amp;lt;cache_name&amp;gt;=LTCP'', just as before. So basically, when using the new default setting ''com.openexchange.caching.jcs.eventInvalidation=true'', it's recommended to just use the stock ''cache.ccf'' file, since no further LTCP configuration is required.&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
= Adminstration / Troubleshooting =&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Configuration ==&lt;br /&gt;
&lt;br /&gt;
The underlying Hazelcast library can be configured using the file ''hazelcast.properties''.&lt;br /&gt;
&lt;br /&gt;
'''Important''':&amp;lt;br&amp;gt;&lt;br /&gt;
By default property ''com.openexchange.hazelcast.network.interfaces'' is set to ''127.0.0.1''; meaning Hazelcast listens only to loop-back device. To build a cluster among remote nodes the appropriate network interface needs to be configured there. Leaving that property empty lets Hazelcast listen to all available network interfaces.&lt;br /&gt;
&lt;br /&gt;
The Hazelcast JMX MBean can be enabled or disabled with the property ''com.openexchange.hazelcast.jmx''. The properties ''com.openexchange.hazelcast.mergeFirstRunDelay'' and ''com.openexchange.hazelcast.mergeRunDelay'' control the run intervals of the so-called ''Split Brain Handler'' of Hazelcast that initiates the cluster join process when a new node is started. More details can be found at http://www.hazelcast.com/docs/2.5/manual/single_html/#NetworkPartitioning. &lt;br /&gt;
&lt;br /&gt;
The port ranges used by Hazelcast for incoming and outgoing connections can be controlled via the configuration parameters ''com.openexchange.hazelcast.networkConfig.port'', ''com.openexchange.hazelcast.networkConfig.portAutoIncrement'' and ''com.openexchange.hazelcast.networkConfig.outboundPortDefinitions''.&lt;br /&gt;
&lt;br /&gt;
== Commandline Tool ==&lt;br /&gt;
&lt;br /&gt;
To print out statistics about the cluster and the distributed data, the ''showruntimestats'' commandline tool can be executed witht the ''clusterstats'' ('c') argument. This provides an overview about the runtime cluster configuration of the node, other members in the cluster and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== JMX ==&lt;br /&gt;
&lt;br /&gt;
In the Open-Xchange server Java process, the MBean ''com.hazelcast'' can be used to monitor and manage different aspects of the underlying Hazelcast cluster. The ''com.hazelcast'' MBean provides detailed information about the cluster configuration and distributed data structures.&lt;br /&gt;
&lt;br /&gt;
== Hazelcast Errors ==&lt;br /&gt;
&lt;br /&gt;
When experiencing hazelcast related errors in the logfiles, most likely different versions of the packages are installed, leading to different message formats that can't be understood by nodes using another version. Examples for such errors are exceptions in hazelcast components regarding (de)serialization or other message processing.&lt;br /&gt;
This may happen when performing a consecutive update of all nodes in the cluster, where temporarily nodes with a heterogeneous setup try to communicate with each other. If the errors don't disappear after all nodes in the cluster have been update to the same package versions, it might be necessary to shutdown the cluster completely, so that all distributed data is cleared.&lt;br /&gt;
&lt;br /&gt;
== Cluster Discovery Errors ==&lt;br /&gt;
&lt;br /&gt;
* If the started OX nodes don't form a cluster, please double-check your configuration in ''hazelcast.properties''&lt;br /&gt;
* It's important to have the same cluster name defined in ''hazelcast.properties'' throughout all nodes in the cluster&lt;br /&gt;
* Especially when using multicast cluster discovery, it might take some time until the cluster is formed&lt;br /&gt;
* When using ''static'' cluster discovery, at least one other node in the cluster has to be configured in ''com.openexchange.hazelcast.network.join.static.nodes'' to allow joining, however, it's recommended to list all nodes in the cluster here&lt;br /&gt;
&lt;br /&gt;
== Disable Cluster Features ==&lt;br /&gt;
&lt;br /&gt;
The Hazelcast based clustering features can be disabled with the following property changes:&lt;br /&gt;
* Disable cluster discovery by setting ''com.openexchange.hazelcast.network.join'' to ''empty'' in ''hazelcast.properties''&lt;br /&gt;
* Disable Hazelcast by setting ''com.openexchange.hazelcast.enabled'' to false in ''hazelcast.properties''&lt;br /&gt;
* Disable message based cache event invalidation by setting ''com.openexchange.caching.jcs.eventInvalidation'' to ''false'' in ''cache.properties''&lt;br /&gt;
&lt;br /&gt;
== Update from 6.22.1 to version 6.22.2 and above ==&lt;br /&gt;
&lt;br /&gt;
As hazelcast will be used by default for the distribution of sessions starting 6.22.2 you have to adjust hazelcast according to our old cache configuration. First of all it's important that you install the open-xchange-sessionstorage-hazelcast package. This package will add the binding between hazelcast and the internal session management. Next you have to set a cluster name to the cluster.properties file (see [[#Cluster Discovery Errors]]). Furthermore you will have to add one of the two discovery modes mentioned in [[#Cluster Discovery]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Updating a Cluster =&lt;br /&gt;
&lt;br /&gt;
Running a cluster means built-in failover on the one hand, but might require some attention when it comes to the point of upgrading the services on all nodes in the cluster. This chapter gives an overview about general concepts and hints for silent updates of the cluster.&lt;br /&gt;
&lt;br /&gt;
== Limitations ==&lt;br /&gt;
&lt;br /&gt;
While in most cases a seamless, rolling upgrade of all nodes in the cluster is possible, there may be situations where nodes running a newer version of the Open-Xchange Server are not able to communicate with older nodes in the cluster, i.e. can't access distributed data or consume incompatible event notifications - especially, when the underlying Hazelcast library is part of the update, which does not support this scenario at the moment. In such cases, the release notes will contain corresponding information, so please have a look there before applying an update.&lt;br /&gt;
&lt;br /&gt;
Additionally, there may always be some kind of race conditions during an update, i.e. client requests that can't be completed successfully or internal events not being deliverd to all nodes in the cluster. That's why the following information should only serve as a best-practices guide to minimize the impact of upgrades to the user experience.&lt;br /&gt;
&lt;br /&gt;
== Upgrading a single Node ==&lt;br /&gt;
&lt;br /&gt;
Upgrading all nodes in the cluster should usually be done sequentially, i.o.w. one node after the other. This means that during the upgrade of one node, the node is temporarily disconnected from the other nodes in the cluster, and will join the cluster again after the update is completed. From the backend perspective, this is as easy as stopping the open-xchange service. other nodes in the cluster will recognize the disconnected node and start to repartition the shared cluster data automatically. But wait a minute - doing so would potentially lead to the webserver not registering the node being stopped immediately, resulting in temporary errors for currently logged in users until they are routed to another machine in the cluster. That's why it's good practice to tell the webserver's load balancer that the node should no longer fulfill incoming requests. The Apache Balancer Manager is an excellent tool for this ([http://httpd.apache.org/docs/2.2/mod/mod_status.html module ''mod_status'']). Look at the screen shot. Every node can be put into a disabled mode. Further requests will the redirected to other nodes in the cluster:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:balancer_manager.jpg]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Afterwards, the open-xchange service on the disabled node can be stopped by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange stop&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange stop&lt;br /&gt;
&lt;br /&gt;
Now, the node is effectively in maintenance mode and any updates can take place. One could now verify the changed cluster infrastructure by accessing the Hazelcast MBeans either via JMX or the ''showruntimestats -c'' commandline tool (see above for details). There, the shut down node should no longer appear in the 'Member' section (com.hazelcast:type=Member).&lt;br /&gt;
&lt;br /&gt;
When all upgrades are processed, the node open-xchange service can be started again by executing:&lt;br /&gt;
&lt;br /&gt;
 $ /etc/init.d/open-xchange start&lt;br /&gt;
&lt;br /&gt;
or &lt;br /&gt;
&lt;br /&gt;
 $ service open-xchange start&lt;br /&gt;
&lt;br /&gt;
As stated above, depending on the chosen cluster discovery mechanism, it might take some time until the node joins the cluster again. When using static cluster discovery, it will join the existing cluster usually directly during serivce startup, i.o.w. before other depending OSGi services are started. Otherwise, there might also be situations where the node cannot join the cluster directly, for example when there were no mDNS advertisments for other nodes in the cluster received yet. Then, it can take some additional time until the node finally joins the cluster. During startup of the node, you can observe the JMX console or the output of ''showruntimestats -c'' (com.hazelcast:type=Member) of another node in the cluster to verify when the node has joined. &lt;br /&gt;
&lt;br /&gt;
After the node has joined, distributed data is re-partioned automatically, and the node is ready to server incoming requests again - so now the node can finally be enabled again in the load balancer configuration of the webserver. Afterwards, the next node in the cluster can be upgraded using the same procedure, until all nodes were processed.&lt;br /&gt;
&lt;br /&gt;
== Upgrades of the Hazelcast library ==&lt;br /&gt;
&lt;br /&gt;
In case an upgrade includes a major update of the Hazelcast library, a newly upgraded node will usually not be able to connect to the nodes running the previous version. In this case, volatile cluster data is lost after all nodes in the cluster have been updated, including sessions held in the distributed session storage. As outlined above, the release notes will contain a corresponding warning in such cases.&lt;br /&gt;
&lt;br /&gt;
Besides upgraded nodes not being able to access distributed data of the legacy cluster, this also affects new data not being available in the legacy cluster, which may cause troubles if the updated backend version needs to perform database update tasks. Database update tasks usually operate in a &amp;quot;blocking&amp;quot; way and all contexts associated with the schema being upgraded are disabled temporarily. Since context data itself is being held in caches on potentially each node in the cluster, the affected cache entries are invalidated during the database update. And, since cluster-wide cache invalidations again utilize Hazelcast functionality ([[#Remote Cache Invalidation]]), such invalidations normally won't be propagated to nodes running a previous version of the Hazelcast library.&lt;br /&gt;
&lt;br /&gt;
To work around this specific scenario where an incompatible upgrade of the Hazelcast library needs to be performed along with blocking database update tasks, starting with v7.8.0, a supplementary package is available that explicitly enables the context cache invalidation of nodes running the previous Hazelcast library. This package follows the naming scheme ''open-xchange-cluster-upgrade-from-XXX'' (where XXX representing the version of the legacy version of the Open-Xchange server), and is available in the repositories for the updated server packages. This package should only be installed on the first node of the cluster that is going to be upgraded to the new version, and can be deactivated once the database upgrade tasks were executed successfully. &lt;br /&gt;
&lt;br /&gt;
Once installed, a legacy cluster is discovered based on the available information in the ''hazelcast.properties'' configuration file in case cluster discovery is set to ''static''. If ''multicast'' is used, there's an alternative option to configure at least one of the addresses of the legacy cluster via ''com.openexchange.hazelcast.network.client.nodes''.&lt;br /&gt;
&lt;br /&gt;
As an example, along with the server v7.8.0, a new package named ''open-xchange-cluster-upgrade-from-76x'' can be installed that aids in invalidating cluster server nodes running v7.6.x (which includes the Hazelcast library in version 3.2.4). Using this package, the recommended steps to update an OX cluster from version 7.6.x to version 7.8.0 would be:&lt;br /&gt;
# Pick a node from your cluster that you want to use for executing the database update tasks shipped with the new release&lt;br /&gt;
# Disable this node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Update the OX packages on this node, additionally install the package ''open-xchange-cluster-upgrade-from-76x''&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Trigger the update task executions using the ''runUpdate'' commandline utitlty as described at [[UpdateTasks]]&lt;br /&gt;
# Once they are finished, uninstall the package ''open-xchange-cluster-upgrade-from-76x'' again&lt;br /&gt;
# Restart the open-xchange services on this node&lt;br /&gt;
# Re-enable the node for incoming HTTP requests in your webserver configuration as described at [[#Upgrading a single Node]]&lt;br /&gt;
# Upgrade all other nodes in the cluster as described at [[#Upgrading a single Node]]&lt;br /&gt;
&lt;br /&gt;
Same steps apply to upgrading from v7.8.0 through v7.8.2 (incl.) to v7.8.3 using the package named ''open-xchange-cluster-upgrade-from-780-782'', since v7.8.0 through v7.8.2 (incl.) utilize Hazelcast v3.5.x, while v7.8.3 uses Hazelcast v3.6.4&lt;br /&gt;
&lt;br /&gt;
== Other Considerations ==&lt;br /&gt;
&lt;br /&gt;
* It's always recommended to only upgrade one node after the other, always ensuring that the cluster has formed correctly between each shutdown/startup of a node.&lt;br /&gt;
* Do not stop a node while running the runUpdate script or the associated update task.&lt;br /&gt;
* During the time of such a rolling upgrade of all nodes, we have effectively heterogeneous software versions in the cluster, which potentially might lead to temporary inconsistencies. Therefore, all nodes in the cluster should be updated in one cycle (but still one after the other).&lt;br /&gt;
* Following the above guideline, it's also possible to add or remove nodes dynamically to the cluster, not only when disconnecting a node temporary for updates.&lt;br /&gt;
* In case of trouble, i.e. a node refuses to join the cluster again after restart, consult the logfiles first for any hints about what is causing the problem - both on the disconnected node, and also on other nodes in the network&lt;br /&gt;
* If there are general incompatibilities between two revisions of the Open-Xchange Server that prevent an operation in a cluster (release notes), it's recommended to choose another name for the cluster in ''cluster.properties'' for the nodes with the new version. This will temporary lead to two separate clusters during the rolling upgrade, and finally the old cluster being shut down completely after the last node was updated to the new version. While distributed data can't be migrated from one server version to another in this scenario due to incompatibilities, the uptime of the system itself is not affected, since the nodes in the new cluster are able to serve new incoming requests directly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: AppSuite]] [[Category: Administration]] [[Category: Cluster]]&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=Authentication_IMAP_Plugin_description&amp;diff=21946</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=21946"/>
		<updated>2016-05-30T13:50:07Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* IMAP Authentication Matrix */&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&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>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Context_management&amp;diff=21943</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=21943"/>
		<updated>2016-05-30T08:44:14Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Parameters */&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&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>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=21881</id>
		<title>AppSuite:Client Onboarding</title>
		<link rel="alternate" type="text/html" href="https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Client_Onboarding&amp;diff=21881"/>
		<updated>2016-04-28T12:59:27Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* How can I disable the outdated UI parts like 'Downloads'? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;title&amp;quot;&amp;gt;Client Onboarding&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{VersionFrom|7.8.1}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= Configuration guide for Open-Xchange Client Onboarding =&lt;br /&gt;
&lt;br /&gt;
With Open-Xchange Server v7.8.1 a new module is added allowing users to integrate several different clients and devices with Open-Xchange; such as providing a link to a commercial App Store to install certain apps on mobile devices.&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with several built-in providers; thereof&lt;br /&gt;
&lt;br /&gt;
* CalDAV&lt;br /&gt;
* CardDAV&lt;br /&gt;
* OX Mail App&lt;br /&gt;
* OX Drive App&lt;br /&gt;
* Connector for Microsoft Outlook®&lt;br /&gt;
* Sync App for Android&lt;br /&gt;
* Microsoft ActiveSync&lt;br /&gt;
* eM Client&lt;br /&gt;
* Mail (IMAP/SMTP)&lt;br /&gt;
* Generic Mobile App provider&lt;br /&gt;
&lt;br /&gt;
Those providers allow accessing and/or synchronizing with certain data held by Open-Xchange on a supported device.&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
To install the Client Onboarding module, the package open-xchange-client-onboarding needs to be installed.&lt;br /&gt;
&lt;br /&gt;
Moreover the property &amp;lt;code&amp;gt;&amp;quot;com.openexchange.client.onboarding.enabled&amp;quot;&amp;lt;/code&amp;gt;; in installed file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; needs to be set to &amp;lt;code&amp;gt;&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt; (default). So getting rid off the entire client on-boarding module simply requires setting the mentioned property to &amp;lt;code&amp;gt;&amp;quot;false&amp;quot;&amp;lt;/code&amp;gt; (and executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool).&lt;br /&gt;
&lt;br /&gt;
== Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
The way to specify what and how a certain device is able to get “on-boarded” is mainly determined by so called scenarios. A scenario describes what gets deployed using which providers that contribute their onboarding possibilities and how it is made accessible to the client’s device.&lt;br /&gt;
&lt;br /&gt;
A scenario consists of the following configuration attributes/options&lt;br /&gt;
&lt;br /&gt;
* A unique scenario identifier&lt;br /&gt;
* A flag determining if scenario is enabled or not. If set to 'false' the scenario will not be available, useful for testing/enabling the scenario later on&lt;br /&gt;
* A scenario type, which is one of &amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, or &amp;amp;quot;link&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;plist&amp;amp;quot; for generating a PLIST configuration file for iOS and OSX devices,&lt;br /&gt;
** &amp;amp;quot;manual&amp;amp;quot; for a description for the user for a manual set-up/configuration&lt;br /&gt;
** &amp;amp;quot;link&amp;amp;quot; for a link/URL to either Apple App Store / Google Play Store or to downloadable executable&lt;br /&gt;
* The &amp;amp;quot;link&amp;amp;quot; attribute, which is only considered it type is set to &amp;amp;quot;link&amp;amp;quot;. That attribute consists of the sub-attributes &amp;amp;quot;url&amp;amp;quot; and &amp;amp;quot;type&amp;amp;quot;.&lt;br /&gt;
** &amp;amp;quot;url&amp;amp;quot; provides the actual link/URL to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. For specifying a property that provides the actual link, please use special &amp;amp;quot;property&amp;amp;quot; scheme; e.g. &amp;amp;quot;property://com.openexchange.client.onboarding.app.mylink&amp;amp;quot;&lt;br /&gt;
** &amp;amp;quot;type&amp;amp;quot; indicates if &amp;amp;quot;url&amp;amp;quot; holds a link for either Apple App Store, Apple Mac Store or Google Play Store. Must only be specified in case &amp;amp;quot;url&amp;amp;quot; points either of those commercial stores. Supported values are &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macstore&amp;amp;quot; and &amp;amp;quot;playstore&amp;amp;quot;&lt;br /&gt;
* The identifiers for the providers, which contribute to the scenario;&amp;lt;br /&amp;gt;&lt;br /&gt;
please check command-line tool &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; to check, which ones are available&lt;br /&gt;
* The identifiers for alternative scenarios. This is typically used to provide alternative manual setup possibility.&lt;br /&gt;
* The comma-separated names of Font Awesome icons that are supposed to be displayed for the scenario&amp;lt;br /&amp;gt;&lt;br /&gt;
(only the ones from v4.4.0 are currently supported)&lt;br /&gt;
* The translatable display name; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
* The translatable description; check &amp;lt;code&amp;gt;/opt/open-xchange/sbin/parsei18nyaml&amp;lt;/code&amp;gt; command-line tool to generate a .pot file from translatable texts&lt;br /&gt;
&lt;br /&gt;
== Onboarding providers ==&lt;br /&gt;
&lt;br /&gt;
As described in the previous section, a scenario specifies what providers contribute to it. A provider represents a certain App or (synchronization) protocol that a device can install, download and/or communicate with.&lt;br /&gt;
&lt;br /&gt;
Moreover a provider specifies what Onboarding types are supported (&amp;amp;quot;plist&amp;amp;quot;, &amp;amp;quot;manual&amp;amp;quot;, and/or &amp;amp;quot;link&amp;amp;quot;). Hence, once a provider is chosen to contribute to a certain scenario, the supported on-boarding type needs to match the one of the scenario itself. E.g. a scenario, which indicates to be of type &amp;amp;quot;link&amp;amp;quot;, will always fail if the associated provider signals to support types &amp;amp;quot;plist&amp;amp;quot; and &amp;amp;quot;manual&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To check what providers are available on your system, please execute the &amp;lt;code&amp;gt;/opt/open-xchange/sbin/listonboardingproviders&amp;lt;/code&amp;gt; command-line tool, which outputs something like:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_1.png]]&lt;br /&gt;
&lt;br /&gt;
Each provider might require one or more capabilities/permissions to be available for the requesting user. If capabilities/permissions are not satisfied, the associated scenario cannot be applied, but will be displayed to the user for upsell opportunities.&lt;br /&gt;
&lt;br /&gt;
=== Generic Onboarding provider for Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;app&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The generic onboarding provider for apps allows specifying custom scenarios of type &amp;amp;quot;link&amp;amp;quot; for arbitrary links/URLs pointing to Apple App Store, Apple Mac Store Google Play Store or to downloadable executable. The link can be set directly or via a property.&lt;br /&gt;
&lt;br /&gt;
This provider requires no capability/permission.&lt;br /&gt;
&lt;br /&gt;
An exemplary section in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file might look like (check &amp;amp;quot;Configuring Onboarding scenarios&amp;amp;quot; chapter for more details):&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_2.png]]&lt;br /&gt;
&lt;br /&gt;
=== CalDAV/CardDAV ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;caldav&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;carddav&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In order for a scenario (having CalDAV/CardDAV in its provider listing) to be executable by a user, the &amp;amp;quot;caldav&amp;amp;quot; capability and &amp;amp;quot;carddav&amp;amp;quot; capability respectively are required.&lt;br /&gt;
&lt;br /&gt;
Moreover, the appropriate *DAV end-points are supposed to be configured through property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.caldav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; file and property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.carddav.url&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt; file.&lt;br /&gt;
&lt;br /&gt;
=== Drive/Mail Apps ===&lt;br /&gt;
&lt;br /&gt;
Identifiers: &amp;lt;code&amp;gt;driveapp&amp;lt;/code&amp;gt; &amp;amp;amp; &amp;lt;code&amp;gt;mailapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Open-Xchange ships with built-in providers for Drive App and Mail App. The Drive-associated providers do require the &amp;amp;quot;drive&amp;amp;quot; capability and the Mail App requires the &amp;amp;quot;mobile_mail_app&amp;amp;quot; one.&lt;br /&gt;
&lt;br /&gt;
The appropriate links to the apps in the corresponding stores are configured in associated .properties files:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-driveapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;client-onboarding-mailapp.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default the links to the official apps are set, but may be changed to ones for branded versions.&lt;br /&gt;
&lt;br /&gt;
=== Drive Windows Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;drivewindowsclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the windows Drive Client. Requires the &amp;amp;quot;drive&amp;amp;quot; capability, but has no configuration options. However, this provider requires the &amp;amp;quot;open-xchange-drive-client-windows&amp;amp;quot; and the orderly configured binaries (e.g. through installing appropriate package according to the brand).&lt;br /&gt;
&lt;br /&gt;
Please check [https://oxpedia.org/wiki/index.php?title=AppSuite:OX_Drive#OX_Drive_for_Windows ''this''] documentation for more details.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- === eM Client ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;emclient&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the eM Client needs the &amp;amp;quot;emclient&amp;amp;quot; capability.&lt;br /&gt;
&lt;br /&gt;
Allows to configure the URL pointing to the executable file through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.emclient.url&amp;lt;/code&amp;gt; in file 'client-onboarding-emclient.properties' file.&lt;br /&gt;
&lt;br /&gt;
=== Sync App ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;syncapp&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for the Sync App for Android. Requires &amp;amp;quot;caldav&amp;amp;quot; and &amp;amp;quot;carddav&amp;amp;quot; capabilities.&lt;br /&gt;
&lt;br /&gt;
The link to Google Play Store is specified via property &amp;lt;code&amp;gt;com.openexchange.client.onboarding.syncapp.store.google.playstore&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;client-onboarding-syncapp.properties&amp;lt;/code&amp;gt; file. --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Mail (IMAP/SMTP) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;mail&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider for deploying the IMAP/STMP account on target device using native/stock mail app. All IMAP/SMTP related settings are settable in file 'client-onboarding-mail.properties'.&lt;br /&gt;
&lt;br /&gt;
=== Microsoft ActiveSync (EAS) ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;eas&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Configures the ActiveSync account on target device. Allows specifying the EAS end-point through &amp;lt;code&amp;gt;com.openexchange.client.onboarding.eas.url&amp;lt;/code&amp;gt; property in 'client-onboarding-eas.properties'.&lt;br /&gt;
&lt;br /&gt;
=== OX Updater ===&lt;br /&gt;
&lt;br /&gt;
Identifier: &amp;lt;code&amp;gt;oxupdater&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The provider offering the download for the OX Client Updater ([http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''http:''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''//oxpedia''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''org/wiki/index''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''.''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''php''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''?''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''title=AppSuite''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater '':''][http://oxpedia.org/wiki/index.php?title=AppSuite:Open-Xchange_Updater ''Open-Xchange_Updater'']). The provider is available as soon as the according package is installed and at least one product can be installed/updated via it by the user. A pre-configured scenario 'oxupdaterinstall' is already contained in &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Configuring Onboarding scenarios ==&lt;br /&gt;
&lt;br /&gt;
Onboarding scenarios are configured through the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Each scenario starts with its own &amp;amp;quot;section&amp;amp;quot; in that YAML file by typing its unique identifier. All further attributes as outlined in chapter &amp;amp;quot;Onboarding scenarios&amp;amp;quot; are nested below that identifier.&lt;br /&gt;
&lt;br /&gt;
=== Easily enabling/disabling scenarios ===&lt;br /&gt;
&lt;br /&gt;
By default, Open-Xchange ships with a set of pre-defined scenarios that might apply to the most common installations. Each scenario can easily be enabled/disabled through its &amp;amp;quot;enabled&amp;amp;quot; Boolean attribute in the &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding-scenarios.yml&amp;lt;/code&amp;gt; YAML file. Executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool applies the changes without the need for restart.&lt;br /&gt;
&lt;br /&gt;
=== Translatable strings ===&lt;br /&gt;
&lt;br /&gt;
Those attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; refer to localizable strings and are placed into &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file. Once such attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; are changed/customized and/or added, the appropriate &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file needs to be re-created in order to get translated. For generating that &amp;amp;quot;client-onboarding-scenarios.pot&amp;amp;quot; file, please execute the /opt/open-xchange/sbin/parsei18nyaml command-line tool. That .pot file needs then be turned to the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Thus changing any of the attributes ending with &amp;amp;quot;_t10e&amp;amp;quot; requires (provided that appropriate .po files are available in &amp;lt;code&amp;gt;/opt/open-xchange/i18n&amp;lt;/code&amp;gt; directory) either a restart or executing &amp;lt;code&amp;gt;/opt/open-xchange/sbin/reloadconfiguration&amp;lt;/code&amp;gt; command-line tool together with stop/start of the &amp;amp;quot;com.openexchange.i18n&amp;amp;quot; bundle.&lt;br /&gt;
&lt;br /&gt;
=== Scenario scope ===&lt;br /&gt;
&lt;br /&gt;
While the previously mentioned &amp;amp;quot;enabled&amp;amp;quot; attribute offers some kind of generic on/off switch, the properties outlined in this section allow defining the scope for a scenario. Scope in terms of&lt;br /&gt;
&lt;br /&gt;
* For what devices (from the set of those specified by providers) is that scenario available and&lt;br /&gt;
* For which users is it available&lt;br /&gt;
&lt;br /&gt;
As explained above, each scenario specifies one or more type-compatible providers associated with it. In turn, each provider determines to which devices the scenario applies. In order to further control, which device and which users are allowed to access a certain scenario, there are appropriate options available in file &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt;. Every option is fully [http://oxpedia.org/wiki/index.php?title=ConfigCascade ''config-cascade''] aware and therefore can be controlled on a global, per context set, per context and per user basis.&lt;br /&gt;
&lt;br /&gt;
Thus, to make a scenario available for certain devices (as dictated by scenario’s providers) and for users as well, the scenario identifier needs to be added to the appropriate properties ending with &amp;amp;quot;.scenarios&amp;amp;quot; (for devices) and added to the &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property (for user) as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;com.openexchange.client.onboarding.apple.mac.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.ipad.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.apple.iphone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.tablet.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.windows.desktop.scenarios&lt;br /&gt;
&lt;br /&gt;
com.openexchange.client.onboarding.enabledScenarios&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Once a scenario is made accessible through configuration it is visible to users trying to perform a client onboarding using one of associated devices. However, whether a user is effectively allowed to execute that scenario is determined by the required capabilities of the denoted providers; if not allowed it gets displayed as an upsell opportunity.&lt;br /&gt;
&lt;br /&gt;
=== Configuring actions ===&lt;br /&gt;
&lt;br /&gt;
The type for a scenario determines what actions are associated with it to &amp;amp;quot;''transport''&amp;amp;quot; the onboarding information to the client. The types &amp;amp;quot;manual&amp;amp;quot; and &amp;amp;quot;link&amp;amp;quot; only show static information like displaying a link. In contrast the type &amp;amp;quot;plist&amp;amp;quot; allows several actions to transport the configuration profile onto the client. Thereof&lt;br /&gt;
&lt;br /&gt;
* E-Mail&lt;br /&gt;
* SMS&lt;br /&gt;
&lt;br /&gt;
In order to utilize the &amp;amp;quot;E-Mail&amp;amp;quot; action, a special transport must be configured for system-composed E-Mails [http://oxpedia.org/wiki/index.php?title=AppSuite:Sharing_and_Guest_Mode#Share_Notifications ''as it is for using the sharing functionality'']. This transport is configured in noreply.properties. All properties therein are config-cascade capable, so their values can be sensitive to the current user or context.&lt;br /&gt;
&lt;br /&gt;
Using the SMS action requires a SIP Gate being available. Please check [http://oxpedia.org/wiki/index.php?title=AppSuite:SMS_Sipgate ''this documentation''] how to setup a SIP Gate for sending SMS to capable clients.&lt;br /&gt;
&lt;br /&gt;
Moreover, scenarios of type &amp;amp;quot;plist&amp;amp;quot; require having PLIST-signing enabled. Otherwise the device will show a warning when importing a received PLIST configuration profile. Please follow the instructions as outlined in [http://oxpedia.org/wiki/index.php?title=AppSuite:PList_signing ''this article''] how to enable and configure signing for PLIST files.&lt;br /&gt;
&lt;br /&gt;
== Adding custom scenarios ==&lt;br /&gt;
&lt;br /&gt;
The first thing to do, is to add an appropriate scenario configuration to the 'client-onboarding-scenarios.yml' file; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The next step is to make that scenario accessible through adapting 'client-onboarding.properties' file. Hence, the scenario identifier needs to be added to the devices, to which it applies (Android devices in this case):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;com.openexchange.client.onboarding.android.tablet.scenarios=..., mygoogleapp&amp;lt;br /&amp;gt;&lt;br /&gt;
com.openexchange.client.onboarding.android.phone.scenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
Furthermore, that scenario needs to be made accessible to users as well:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;com.openexchange.client.onboarding.enabledScenarios=..., mygoogleapp&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
At last, a .pot file is supposed to be generated from the translatable strings using /opt/open-xchange/sbin/parsei18nyaml command-line tool to yield the .po files for the individual languages.&lt;br /&gt;
&lt;br /&gt;
Provided that target users do hold appropriate capabilities, they are allowed to execute that scenario. In the example above the &amp;amp;quot;app&amp;amp;quot; provider is specified, which does no require any capabilities. Hence, that scenario is available.&lt;br /&gt;
&lt;br /&gt;
== HowTos ==&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly setup a default/test configuration ? ===&lt;br /&gt;
&lt;br /&gt;
# Install open-xchange-client-onboarding package&lt;br /&gt;
# Edit &amp;lt;code&amp;gt;/opt/open-xchange/etc/client-onboarding.properties&amp;lt;/code&amp;gt; and set &amp;lt;code&amp;gt;com.openexchange.client.onboarding.enabled&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Edit &amp;lt;code&amp;gt;noreply.properties&amp;lt;/code&amp;gt; to enable autoconfig sending via email. PS: Have a fully working smtp login available like “noreply@yourdomain.tld”&lt;br /&gt;
# Edit client-onboarding-scenarios.yml and set “enable” for : “driveappinstall” , “davsync” “davmanual” “mailsync” “mailmanual” to &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt; &lt;br /&gt;
# Now set the correct caldav/carddav server FQDNs in the corresponding files for your setup&lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-caldav.properties&amp;lt;/code&amp;gt; &lt;br /&gt;
#*&amp;lt;code&amp;gt;client-onboarding-carddav.properties&amp;lt;/code&amp;gt;&lt;br /&gt;
# Restart OX process&lt;br /&gt;
# Login to AppSuite. Click on Settings - Connect your device&lt;br /&gt;
# Verify that you have following onboarding options available: &lt;br /&gt;
#* windows -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; imap/smtp details&lt;br /&gt;
#* android/fon+tablet -&amp;gt; drive app &lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; config button&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; calendar/addressbok -&amp;gt; details for dav setup&lt;br /&gt;
#* apple -&amp;gt; iphone -&amp;gt; drive app&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; imap/smtp details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config send email&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook config button&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; calendar/addressbook details for experts&lt;br /&gt;
#* apple -&amp;gt; ipad -&amp;gt; drive app&lt;br /&gt;
&lt;br /&gt;
=== How can I quickly disable a certain scenario ===&lt;br /&gt;
&lt;br /&gt;
Simply enter the 'client-onboarding-scenarios.yml' file and go to the section specifying the target scenario. Switch the 'enabled' flag to &amp;amp;quot;false&amp;amp;quot; and execute /opt/open-xchange/sbin/reloadconfiguration command-line tool.&lt;br /&gt;
&lt;br /&gt;
E.g. to disable the OX Drive App:&lt;br /&gt;
&lt;br /&gt;
[[File:onboarding_3.png]]&lt;br /&gt;
&lt;br /&gt;
=== How can I disable the outdated ui parts like 'Downloads'? ===&lt;br /&gt;
&lt;br /&gt;
The wizard replaces and extends the functionality of the old Download Section in settings and the corresponding widgets. We recommend to disable these outdated parts:&lt;br /&gt;
# widget: get ox drive&lt;br /&gt;
# widget: update&lt;br /&gt;
# settings entry: downloads&lt;br /&gt;
&lt;br /&gt;
'''Remove settings section 'Downloads' '''&lt;br /&gt;
&lt;br /&gt;
Edit the property file and change the value to true:&lt;br /&gt;
* ''io.ox/core//settings/downloadsDisabled''&lt;br /&gt;
&lt;br /&gt;
'''Remove widgets'''&lt;br /&gt;
&lt;br /&gt;
To remove the both related portal widget/tiles please refer to the&lt;br /&gt;
[[AppSuite:Configuring_portal_plugins#Disabling_a_tile_completely | portal plugins wiki page ]]&lt;br /&gt;
&lt;br /&gt;
* ''io.ox/portal/widget/oxdriveclients''&lt;br /&gt;
* ''io.ox/portal/widget/updater''&lt;br /&gt;
&lt;br /&gt;
=== How can I add my own App? ===&lt;br /&gt;
&lt;br /&gt;
Provided that the App is accessible by a link (pointing to a commercial App Store or to a downloadable executable/installer), the generic &amp;amp;quot;app&amp;amp;quot; is the suitable provider to choose.&lt;br /&gt;
&lt;br /&gt;
Hence, an appropriate section is supposed to be added to the 'client-onboarding-scenarios.yml' file having a unique name and &amp;amp;quot;provider&amp;amp;quot; attribute set to &amp;amp;quot;[app]&amp;amp;quot;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The attribute &amp;amp;quot;type&amp;amp;quot; needs to be set to &amp;amp;quot;link&amp;amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The attribute &amp;amp;quot;link&amp;amp;quot; should be configured with:&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;url&amp;amp;quot; sub-attribute containing the actual link pointing to the URL location&lt;br /&gt;
* &amp;amp;quot;type&amp;amp;quot; sub-attribute specifying of what type that link is: either &amp;amp;quot;appstore&amp;amp;quot;, &amp;amp;quot;macappstore&amp;amp;quot;, &amp;amp;quot;playstore&amp;amp;quot; or &amp;amp;quot;common&amp;amp;quot;.&amp;lt;br /&amp;gt;&lt;br /&gt;
The type &amp;amp;quot;common&amp;amp;quot; is supposed to be used for links that do not point to a commercial App Store, but to a downloadable executable/installer file.&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;quot;icon&amp;amp;quot; attribute is supposed to contain a comma-separated list of Font Awesome icons (only the ones from v4.4.0 are currently supported) that represent the App; e.g.&lt;br /&gt;
&lt;br /&gt;
* &amp;amp;quot;fa-cloud&amp;amp;quot; for Drive/file-related nature&lt;br /&gt;
* &amp;amp;quot;fa-calendar, fa-users&amp;amp;quot; for Calendar and Address Book synchronization&lt;br /&gt;
* &amp;amp;quot;fa-envelope-o&amp;amp;quot; for Mail nature&lt;br /&gt;
&lt;br /&gt;
Next, the translatable display name and description should be set through setting the attributes &amp;amp;quot;displayName_t10e&amp;amp;quot; and &amp;amp;quot;description_t10e&amp;amp;quot;. As described previously, executing the /opt/open-xchange/sbin/parsei18nyaml command-line tool yields an appropriate .pot file, which can then be used for generating the individual .po file for the different translations.&lt;br /&gt;
&lt;br /&gt;
Finally, the 'client-onboarding.properties' file needs to be modified to specify the &amp;amp;quot;scope&amp;amp;quot; for that new scenario. Add the scenario’s unique name to the appropriate device properties and add it to &amp;amp;quot;com.openexchange.client.onboarding.enabledScenarios&amp;amp;quot; property as well.&lt;br /&gt;
&lt;br /&gt;
After executing /opt/open-xchange/sbin/reloadconfiguration command-line tool the new client onboarding scenario is available for the selected users/devices.&lt;br /&gt;
&lt;br /&gt;
=== How can I upsell my own app? ===&lt;br /&gt;
&lt;br /&gt;
Having the same prerequisites/steps as for &amp;amp;quot;How can I add my own App?&amp;amp;quot; the scenario description in the 'client-onboarding-scenarios.yml' file simply needs to be extended by the desired capabilities, which are supposed to be used for managing the upsell.&lt;br /&gt;
&lt;br /&gt;
Example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;mygoogleapp:&amp;lt;br /&amp;gt;&lt;br /&gt;
 enabled: true&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: link&amp;lt;br /&amp;gt;&lt;br /&gt;
 link:&amp;lt;br /&amp;gt;&lt;br /&gt;
 url: http://play.google.com/store/apps?id=mygoogleapp.invalid&amp;lt;br /&amp;gt;&lt;br /&gt;
 type: playstore&amp;lt;br /&amp;gt;&lt;br /&gt;
 '''capabilities: &amp;amp;quot;mygoogleapp_capability&amp;amp;quot;'''&amp;lt;br /&amp;gt;&lt;br /&gt;
 providers: [app]&amp;lt;br /&amp;gt;&lt;br /&gt;
 alternatives: []&amp;lt;br /&amp;gt;&lt;br /&gt;
 icon: fa-cloud&amp;lt;br /&amp;gt;&lt;br /&gt;
 displayName_t10e: &amp;amp;quot;My App for synchronizing files&amp;amp;quot;&amp;lt;br /&amp;gt;&lt;br /&gt;
 description_t10e: &amp;amp;quot;Synchronize your files with our Drive application.&amp;amp;quot;&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
The special &amp;amp;quot;capabilities&amp;amp;quot; attribute is only supported for scenarios of type &amp;amp;quot;link&amp;amp;quot; with the special &amp;amp;quot;app&amp;amp;quot; provider.&lt;br /&gt;
&lt;br /&gt;
With such a &amp;amp;quot;capabilities&amp;amp;quot; attribute only users, which have the &amp;amp;quot;mygoogleapp_capability&amp;amp;quot; capability are allowed to get the link. For those who don’t, the upsell opportunity will be displayed; e.g.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;blockquote&amp;gt;[[File:onboarding_4.png]]&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=21585</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=21585"/>
		<updated>2016-03-01T11:01:43Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Configuration */&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/groupware/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 [http://%20https//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;
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>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=21584</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=21584"/>
		<updated>2016-03-01T10:58:47Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Configuration */&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/groupware/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 [http://%20https//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;
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&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>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=21583</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=21583"/>
		<updated>2016-03-01T10:55:39Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Configuration */&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/groupware/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 [http://%20https//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;
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&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>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=21582</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=21582"/>
		<updated>2016-03-01T10:54:44Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Configuration */&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/groupware/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 [http://%20https//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;
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&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_MS_LIVE_CONNECT_CLIENT_KEY&lt;br /&gt;
 com.openexchange.oauth.boxcom.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.boxcom.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-boxcom|toplevel=products|sopath=appsuite/stable/backend|version=App Suite}}&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=21581</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=21581"/>
		<updated>2016-03-01T10:54:11Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Registering your app */&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/groupware/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 [http://%20https//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;
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&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 to Dropbox OAuth&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_MS_LIVE_CONNECT_CLIENT_KEY&lt;br /&gt;
 com.openexchange.oauth.boxcom.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.boxcom.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-boxcom|toplevel=products|sopath=appsuite/stable/backend|version=App Suite}}&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=21580</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=21580"/>
		<updated>2016-03-01T10:53:16Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Boxcom */&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/groupware/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 [http://%20https//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;
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&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 to Dropbox OAuth&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 enrol=&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_MS_LIVE_CONNECT_CLIENT_KEY&lt;br /&gt;
 com.openexchange.oauth.boxcom.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.boxcom.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-boxcom|toplevel=products|sopath=appsuite/stable/backend|version=App Suite}}&lt;/div&gt;</summary>
		<author><name>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=21579</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=21579"/>
		<updated>2016-03-01T10:43:39Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Microsoft Onedrive */&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/groupware/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 [http://%20https//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;
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&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 to Dropbox OAuth&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;
= Boxcom = &lt;br /&gt;
To setup the Boxcom file store you have to install the package &amp;quot;open-xchange-file-storage-boxcom&amp;quot;. In addition you have to configure the following properties:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Enable/disable&lt;br /&gt;
com.openexchange.oauth.boxcom=true&lt;br /&gt;
# The API key&lt;br /&gt;
com.openexchange.oauth.boxcom.apiKey=REPLACE_THIS_WITH_YOUR_BOX_COM_KEY&lt;br /&gt;
# The API secret&lt;br /&gt;
com.openexchange.oauth.boxcom.apiSecret=REPLACE_THIS_WITH_YOUR_BOX_COM_SECRET&lt;br /&gt;
# The redirect URL&lt;br /&gt;
# e.g. &amp;quot;https://myappsuite.mydomain.invalid/ajax/defer&amp;quot;&lt;br /&gt;
com.openexchange.oauth.boxcom.redirectUrl=REPLACE_THIS_WITH_YOUR_BOX_COM_REDIRECT_URL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You can define them system wide within boxcomoauth.properties 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>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=21578</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=21578"/>
		<updated>2016-03-01T10:38:13Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Microsoft Onedrive */&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/groupware/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 [http://%20https//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;
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&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;
* 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 [http://%20https//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/msliveconntectoauth.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.msliveconnect=true&lt;br /&gt;
&amp;lt;/syntaxhighlight&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_KEY&lt;br /&gt;
 com.openexchange.oauth.msliveconnect.apiSecret=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_SECRET&lt;br /&gt;
&amp;lt;/syntaxhighlight&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;
&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;
= Boxcom = &lt;br /&gt;
To setup the Boxcom file store you have to install the package &amp;quot;open-xchange-file-storage-boxcom&amp;quot;. In addition you have to configure the following properties:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Enable/disable&lt;br /&gt;
com.openexchange.oauth.boxcom=true&lt;br /&gt;
# The API key&lt;br /&gt;
com.openexchange.oauth.boxcom.apiKey=REPLACE_THIS_WITH_YOUR_BOX_COM_KEY&lt;br /&gt;
# The API secret&lt;br /&gt;
com.openexchange.oauth.boxcom.apiSecret=REPLACE_THIS_WITH_YOUR_BOX_COM_SECRET&lt;br /&gt;
# The redirect URL&lt;br /&gt;
# e.g. &amp;quot;https://myappsuite.mydomain.invalid/ajax/defer&amp;quot;&lt;br /&gt;
com.openexchange.oauth.boxcom.redirectUrl=REPLACE_THIS_WITH_YOUR_BOX_COM_REDIRECT_URL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You can define them system wide within boxcomoauth.properties 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>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=21577</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=21577"/>
		<updated>2016-03-01T10:35:35Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Registering your app */&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/groupware/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 [http://%20https//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;
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&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;. In addition you have to configure the following properties:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Enable/disable&lt;br /&gt;
com.openexchange.oauth.msliveconnect=true&lt;br /&gt;
# The API key&lt;br /&gt;
com.openexchange.oauth.msliveconnect.apiKey=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_KEY&lt;br /&gt;
# The API secret&lt;br /&gt;
com.openexchange.oauth.msliveconnect.apiSecret=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_SECRET&lt;br /&gt;
# The redirect URL&lt;br /&gt;
# e.g. &amp;quot;https://myappsuite.mydomain.invalid/ajax/defer&amp;quot;&lt;br /&gt;
com.openexchange.oauth.msliveconnect.redirectUrl=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_REDIRECT_URL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can define them system wide within msliveconntectoauth.properties 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;
= Boxcom = &lt;br /&gt;
To setup the Boxcom file store you have to install the package &amp;quot;open-xchange-file-storage-boxcom&amp;quot;. In addition you have to configure the following properties:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Enable/disable&lt;br /&gt;
com.openexchange.oauth.boxcom=true&lt;br /&gt;
# The API key&lt;br /&gt;
com.openexchange.oauth.boxcom.apiKey=REPLACE_THIS_WITH_YOUR_BOX_COM_KEY&lt;br /&gt;
# The API secret&lt;br /&gt;
com.openexchange.oauth.boxcom.apiSecret=REPLACE_THIS_WITH_YOUR_BOX_COM_SECRET&lt;br /&gt;
# The redirect URL&lt;br /&gt;
# e.g. &amp;quot;https://myappsuite.mydomain.invalid/ajax/defer&amp;quot;&lt;br /&gt;
com.openexchange.oauth.boxcom.redirectUrl=REPLACE_THIS_WITH_YOUR_BOX_COM_REDIRECT_URL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You can define them system wide within boxcomoauth.properties 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>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=21576</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=21576"/>
		<updated>2016-03-01T10:02:44Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Configuration */&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/groupware/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 [http://%20https//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;
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;
* 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 [http://%20https//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/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&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;. In addition you have to configure the following properties:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Enable/disable&lt;br /&gt;
com.openexchange.oauth.msliveconnect=true&lt;br /&gt;
# The API key&lt;br /&gt;
com.openexchange.oauth.msliveconnect.apiKey=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_KEY&lt;br /&gt;
# The API secret&lt;br /&gt;
com.openexchange.oauth.msliveconnect.apiSecret=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_SECRET&lt;br /&gt;
# The redirect URL&lt;br /&gt;
# e.g. &amp;quot;https://myappsuite.mydomain.invalid/ajax/defer&amp;quot;&lt;br /&gt;
com.openexchange.oauth.msliveconnect.redirectUrl=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_REDIRECT_URL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can define them system wide within msliveconntectoauth.properties 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;
= Boxcom = &lt;br /&gt;
To setup the Boxcom file store you have to install the package &amp;quot;open-xchange-file-storage-boxcom&amp;quot;. In addition you have to configure the following properties:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Enable/disable&lt;br /&gt;
com.openexchange.oauth.boxcom=true&lt;br /&gt;
# The API key&lt;br /&gt;
com.openexchange.oauth.boxcom.apiKey=REPLACE_THIS_WITH_YOUR_BOX_COM_KEY&lt;br /&gt;
# The API secret&lt;br /&gt;
com.openexchange.oauth.boxcom.apiSecret=REPLACE_THIS_WITH_YOUR_BOX_COM_SECRET&lt;br /&gt;
# The redirect URL&lt;br /&gt;
# e.g. &amp;quot;https://myappsuite.mydomain.invalid/ajax/defer&amp;quot;&lt;br /&gt;
com.openexchange.oauth.boxcom.redirectUrl=REPLACE_THIS_WITH_YOUR_BOX_COM_REDIRECT_URL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You can define them system wide within boxcomoauth.properties 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>Thorben</name></author>
	</entry>
	<entry>
		<id>https://wiki.open-xchange.com/wiki/index.php?title=AppSuite:Filestorages&amp;diff=21575</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=21575"/>
		<updated>2016-03-01T10:01:30Z</updated>

		<summary type="html">&lt;p&gt;Thorben: /* Configuration */&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/groupware/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 [http://%20https//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;
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;
* 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 [http://%20https//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/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&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;quot;https://&amp;quot; as protocol&lt;br /&gt;
** The redirect URI follows the pattern: &amp;quot;https://&amp;quot; + &amp;lt;host-name&amp;gt; + &amp;quot;/ajax/defer&amp;quot;&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;. In addition you have to configure the following properties:&lt;br /&gt;
&amp;lt;pre&amp;gt;# Enable/disable&lt;br /&gt;
com.openexchange.oauth.msliveconnect=true&lt;br /&gt;
# The API key&lt;br /&gt;
com.openexchange.oauth.msliveconnect.apiKey=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_KEY&lt;br /&gt;
# The API secret&lt;br /&gt;
com.openexchange.oauth.msliveconnect.apiSecret=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_SECRET&lt;br /&gt;
# The redirect URL&lt;br /&gt;
# e.g. &amp;quot;https://myappsuite.mydomain.invalid/ajax/defer&amp;quot;&lt;br /&gt;
com.openexchange.oauth.msliveconnect.redirectUrl=REPLACE_THIS_WITH_YOUR_MS_LIVE_CONNECT_REDIRECT_URL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can define them system wide within msliveconntectoauth.properties 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;
= Boxcom = &lt;br /&gt;
To setup the Boxcom file store you have to install the package &amp;quot;open-xchange-file-storage-boxcom&amp;quot;. In addition you have to configure the following properties:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;# Enable/disable&lt;br /&gt;
com.openexchange.oauth.boxcom=true&lt;br /&gt;
# The API key&lt;br /&gt;
com.openexchange.oauth.boxcom.apiKey=REPLACE_THIS_WITH_YOUR_BOX_COM_KEY&lt;br /&gt;
# The API secret&lt;br /&gt;
com.openexchange.oauth.boxcom.apiSecret=REPLACE_THIS_WITH_YOUR_BOX_COM_SECRET&lt;br /&gt;
# The redirect URL&lt;br /&gt;
# e.g. &amp;quot;https://myappsuite.mydomain.invalid/ajax/defer&amp;quot;&lt;br /&gt;
com.openexchange.oauth.boxcom.redirectUrl=REPLACE_THIS_WITH_YOUR_BOX_COM_REDIRECT_URL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
You can define them system wide within boxcomoauth.properties 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>Thorben</name></author>
	</entry>
</feed>