; Licensed to the Apache Software Foundation (ASF) under one or more
; contributor license agreements.  See the NOTICE file distributed with
; this work for additional information regarding copyright ownership.
; The ASF licenses this file to You under the Apache License, Version 2.0
; (the "License"); you may not use this file except in compliance with
; the License.  You may obtain a copy of the License at
;
;     http://www.apache.org/licenses/LICENSE-2.0
;
; Unless required by applicable law or agreed to in writing, software
; distributed under the License is distributed on an "AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
; See the License for the specific language governing permissions and
; limitations under the License.


; CAS-BROWSER module configuration file
; ------------------------------------------------------------------------


; FILE MANAGER CONNECTIVITY
; -----------------------------------------------------------------------------
; Specify connection information for an instance of the OODT file manager.
;
browser_filemgr_url   = http://localhost:9000
browser_filemgr_path  = /
browser_datadeliv_url = http://host:port/path



; AUTHENTICATION AND AUTHORIZATION
; -----------------------------------------------------------------------------
; Customize the behavior of the module for specific auth & auth requirements.

; This key specifies the behavior to take when users attempt to access resources
; for which they do not have the necessary permissions. There are two options:
;
; deny  => force redirect with a 403 Not Authorized error
;           This option prevents a user from viewing any information about
;           products or productTypes they are not authorized to see.
;
; limit => apply the metadata filtering policy specified in element-visibility.ini
;           to control access to information on a more granular, element by
;           element level. This allows users to see publicly available information
;           about an otherwise protected product or productType.
;
; Policy for product types:
browser_pt_auth_policy = limit
; Policy for products:
browser_p_auth_policy  = limit

; This key specifies the productType metadata element that contains
; the list of security groups (aka roles, permissions,etc) that should
; be granted access. This key can exist in productType metadata, or
; product metadata, or both. If it exists in productType metadata only,
; products will inherit the information.
;
browser_data_access_key 	= AccessGrantedTo
browser_data_public_access 	= public

; LOOK AND FEEL SETTINGS
; -----------------------------------------------------------------------------
; Customize aspects of the user interface to suit project needs

browser_index_title_text  = Cas Browser

; These keys identify the metadata keys used to obtain basic product type 
; information. These rarely need to be manually changed.
;    browser_pt_name_key: the product type name
;    browser_pt_desc_key: the key containing a description of the product type 
;    browser_pt_id_key:   the key containing the unique product type id (urn)

browser_pt_name_key       = name
browser_pt_desc_key       = description
browser_pt_id_key         = id

; These keys determine which metadata elements will
; appear as column headers on the dataset viewer

browser_pt_search_met[]   = name
browser_pt_search_met[]   = description
browser_pt_search_met[]   = id

; This key determines which of the `browser_pt_search_met` keys will be used
; as the clickable link taking the user to the overview page for the given
; product type

browser_pt_search_linkkey = name

; These keys specify (an array of) product types to exclude from the 
; product type list displayed on the index page.
browser_dataset_ignores[] = urn:oodt:GenericFile



; The browser_products_met[] array key dictates which metadata elements will
; be displayed in the products view.  One can designate any number of
; elements to display (including zero), but all of them must be defined for
; all product types.

browser_products_met[] = CAS.ProductId
browser_products_met[] = MimeType
browser_products_met[] = ProductStructure
browser_products_met[] = CAS.ProductReceivedTime

; The browser_private_products_visibility key dictates whether private products 
; will be displayed in the products view.
browser_private_products_visibility = true

; If the browser_show_download_widget key is set to 0, the download widget in
; the products view won't be displayed.  If the key is set to any other value
; the widget will be displayed.

browser_show_download_widget=1

; If default_show_all is set to 1, then the typesearch view will, by deafult,
; display all products of all types when the view is opened.  Otherwise, no
; products will be shown in the typesearch vie until filters are specified.

default_show_all = 1

