The centralized file system (CFS) is used to store all dynamically defined and served files in a secure and extensible way. The CFS provides a mechanism for defining and configuring multiple file stores, each of which is a separate storage location with separate permissions and file detection logic.
Prior to Telligent Evolution 7.0, CFS file stores could only be defined within the communityserver.config file within the <CentralizedFileStorage /> node. For example,
<CentralizedFileStorage>
<fileStore name="Telligent.Evolution.Components.Attachments" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" downloadValidatorType="Telligent.Evolution.Components.AttachmentFileAccessValidator, Telligent.Evolution.Components" />
<fileStore name="Telligent.Evolution.Components.Attachments.Temporary" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStore name="CommunityServer.Components.PostAttachments" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStore name="CommunityServer.Components.SiteFiles" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStore name="CommunityServer.Blogs.Components.WeblogFiles" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" downloadValidatorType="Telligent.Evolution.Blogs.Components.BlogFileAccessValidator, Telligent.Evolution.Blogs" />
<fileStore name="CommunityServer.Components.ImageFileViewer" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStore name="CommunityServer.Components.MultipleUploadFileManager" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStore name="CommunityServer.Components.UserFiles" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStore name="CommunityServer.Components.Ranks" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStore name="CommunityServer.Components.Roles" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStore name="CommunityServer.Components.Avatars" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStore name="CommunityServer.Components.GroupAvatars" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStore name="CommunityServer.Components.SelectableAvatars" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStore name="CommunityServer.Components.GroupSelectableAvatars" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStore name="CommunityServer.Wikis.Components.Files" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" downloadValidatorType="Telligent.Evolution.Wikis.Components.WikiFileAccessValidator, Telligent.Evolution.Wikis" />
<fileStore name="CommunityServer.MailGateway.MailRoom.ForumsHandler" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" downloadValidatorType="Telligent.Evolution.MailGateway.MailRoom.Components.MailGatewayFileAccessValidator, Telligent.Evolution.MailGateway.MailRoom" />
<fileStore name="CommunityServer.Discussions.Components.Files" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" downloadValidatorType="Telligent.Evolution.Discussions.Components.ForumFileAccessValidator, Telligent.Evolution.Discussions" />
<fileStore name="themefiles" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" fileFinderType="Telligent.Evolution.Components.ThemeFileFinder, Telligent.Evolution.Components" />
<fileStore name="widgetfiles" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStore name="defaultwidgets" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStore name="oauthimages" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStore name="factorydefaultpages" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStore name="factorydefaultconfigurations" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
</CentralizedFileStorage>
This method of configuration (keeping each file store separate) is still supported; however, Telligent Evolution 7.0 enables the configuration to be simplified using two new features:
- Centralized File Store Groups
- Centralized File Store Plugins
Centralized File Store Groups
Centralized File Store Groups are a configuration concept that allows the configuration of multiple file stores to be centralized to prevent duplication of configuration information and the errors that can occur from multiple entry of authentication and configuration details. The sample configuration above can be rewritten to use file store groups:
<CentralizedFileStorage>
<fileStoreGroup type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/">
<fileStore name="Telligent.Evolution.Components.Attachments" downloadValidatorType="Telligent.Evolution.Components.AttachmentFileAccessValidator, Telligent.Evolution.Components" />
<fileStore name="Telligent.Evolution.Components.Attachments.Temporary" />
<fileStore name="CommunityServer.Components.PostAttachments" />
<fileStore name="CommunityServer.Components.SiteFiles" />
<fileStore name="CommunityServer.Blogs.Components.WeblogFiles" downloadValidatorType="Telligent.Evolution.Blogs.Components.BlogFileAccessValidator, Telligent.Evolution.Blogs" />
<fileStore name="CommunityServer.Components.ImageFileViewer" />
<fileStore name="CommunityServer.Components.MultipleUploadFileManager" />
<fileStore name="CommunityServer.Components.UserFiles" />
<fileStore name="CommunityServer.Components.Ranks" />
<fileStore name="CommunityServer.Components.Roles" />
<fileStore name="CommunityServer.Components.Avatars" />
<fileStore name="CommunityServer.Components.GroupAvatars" />
<fileStore name="CommunityServer.Components.SelectableAvatars" />
<fileStore name="CommunityServer.Components.GroupSelectableAvatars" />
<fileStore name="CommunityServer.Wikis.Components.Files" downloadValidatorType="Telligent.Evolution.Wikis.Components.WikiFileAccessValidator, Telligent.Evolution.Wikis" />
<fileStore name="CommunityServer.MailGateway.MailRoom.ForumsHandler" downloadValidatorType="Telligent.Evolution.MailGateway.MailRoom.Components.MailGatewayFileAccessValidator, Telligent.Evolution.MailGateway.MailRoom" />
<fileStore name="CommunityServer.Discussions.Components.Files" downloadValidatorType="Telligent.Evolution.Discussions.Components.ForumFileAccessValidator, Telligent.Evolution.Discussions" />
<fileStore name="themefiles" fileFinderType="Telligent.Evolution.Components.ThemeFileFinder, Telligent.Evolution.Components" />
<fileStore name="widgetfiles" />
<fileStore name="defaultwidgets" />
<fileStore name="oauthimages" />
<fileStore name="factorydefaultpages" />
<fileStore name="factorydefaultconfigurations" />
</fileStoreGroup>
</CentralizedFileStorage>
The file store group (identified as the <fileStoreGroup /> node) contains all of the CFS provider configuration details: The provider type and any configuration for the provider. All file stores (identified via <fileStore /> nodes) inherit the provider settings from the group and identify file-store-specific configuration only (names, file finder types, download validator types).
With this change, it is much easier to configure the location of all file stores. For example, to override the location of all CFS file stores, only the <fileStoreGroup /> node needs to be modified. Previously, all <fileStore /> nodes required adjustment.
Note that multiple file store groups can be defined. If some file stores should be placed in one location and others at another location (or if different sets of files stores should use a different provider), more file store groups can be defined and the file store definitions can be nested to identify which group they should inherit provider options from.
File Store Plugins
In Telligent Evolution 7.0, individual file stores can now be defined via the ICentralizedFileStore plugin type. By exposing file store definition to plugins, third parties can more easily make use of the CFS without having to require manual changes to the communityserver.config file. Also, individual file stores can be enabled/disabled through the control panel via Plugin Management.
By default, file stores defined as plugins do not appear in the communityserver.config file. Instead, they inherit the CFS provider configuration from the default (or first) file store group defined in the communityserver.config file. Because all core CFS file stores are defined as plugins in Telligent Evolution 7.0, the default configuration in communityserver.config is:
<CentralizedFileStorage>
<fileStoreGroup default="true" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
</CentralizedFileStorage>
Note that this file store group is identified as the default via the default="true" setting on the <fileStoreGroup /> node. All plugin-based file stores are placed in the default file store group. To change which file store group an individual plugin-based file store should be associated with, it can be explicitly added to the communityserver.config file. For example,
<CentralizedFileStorage>
<fileStoreGroup default="true" type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/filestorage/" />
<fileStoreGroup type="Telligent.Evolution.Extensibility.Storage.Providers.Version1.FileSystemFileStorageProvider, Telligent.Evolution.Components" basePath="~/avatars/">
<fileStore name="CommunityServer.Components.Avatars" />
<fileStore name="CommunityServer.Components.GroupAvatars" />
</fileStoreGroup>
</CentralizedFileStorage>
would cause avatars and group avatars (both plugin-based CFS file stores) to store files using the FileSystemFileStorageProvider, but in under a base path of ~/avatars/ instead of the default of ~/filestorage/.