> ## Documentation Index
> Fetch the complete documentation index at: https://doc.lucidworks.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Jive V1

> The Jive V1 connector retrieves content from a Jive instance.

export const schema = {
  "type": "object",
  "title": "Jive",
  "description": "Connector for a Jive instance, using Jive's REST API.",
  "required": ["id", "connector", "type", "pipeline", "properties"],
  "properties": {
    "category": {
      "type": "string",
      "title": "Category",
      "default": "Social",
      "hints": ["hidden", "readonly"]
    },
    "id": {
      "type": "string",
      "title": "Datasource ID",
      "description": "Unique name for this datasource.",
      "minLength": 1,
      "pattern": "^[a-zA-Z0-9_-]+$"
    },
    "connector": {
      "type": "string",
      "title": "Connector Type",
      "description": "Connector Type.",
      "hints": ["hidden"],
      "minLength": 1
    },
    "type": {
      "type": "string",
      "title": "Datasource Type",
      "description": "Datasource type supported by the selected connector type.",
      "hints": ["hidden"],
      "minLength": 1
    },
    "pipeline": {
      "type": "string",
      "title": "Pipeline ID",
      "description": "Name of an existing index pipeline for processing documents.",
      "minLength": 1
    },
    "description": {
      "type": "string",
      "title": "Description",
      "description": "Optional description for this datasource."
    },
    "type_description": {
      "type": "string",
      "title": "Type Description",
      "default": "Connector for a Jive instance, using Jive's REST API.",
      "hints": ["hidden", "readonly"]
    },
    "parserId": {
      "type": "string",
      "title": "Parser",
      "description": "Parser used when parsing raw content. For some connectors, a configuration to 'retry' parsing if an error occurs is available as an advanced setting"
    },
    "properties": {
      "type": "object",
      "title": "Properties",
      "description": "Datasource configuration properties",
      "required": ["jive_instance_url", "contents_to_crawl"],
      "properties": {
        "collection": {
          "type": "string",
          "title": "Collection",
          "description": "Collection documents will be indexed to.",
          "hints": ["hidden"],
          "pattern": "^[a-zA-Z0-9_-]+$"
        },
        "db": {
          "type": "object",
          "title": "Connector DB",
          "description": "Type and properties for a ConnectorDB implementation to use with this datasource.",
          "required": ["type"],
          "properties": {
            "type": {
              "type": "string",
              "title": "Implementation Class Name",
              "description": "Fully qualified class name of ConnectorDb implementation.",
              "default": "com.lucidworks.connectors.db.impl.MapDbConnectorDb",
              "minLength": 1
            },
            "inlinks": {
              "type": "boolean",
              "title": "Process Inlinks?",
              "description": "Keep track of incoming links. This negatively impacts performance and size of DB.",
              "default": false
            },
            "aliases": {
              "type": "boolean",
              "title": "Process Aliases?",
              "description": "Keep track of original URI-s that resolved to the current URI. This negatively impacts performance and size of DB.",
              "default": false
            },
            "inv_aliases": {
              "type": "boolean",
              "title": "Process Inverted Aliases?",
              "description": "Keep track of target URI-s that the current URI resolves to. This negatively impacts performance and size of DB.",
              "default": false
            }
          },
          "hints": ["hidden"]
        },
        "places_filter": {
          "type": "array",
          "title": "Places Filter",
          "description": "Filter to control the indexation of contents under specific places. Cannot be set with places_to_crawl at the same time. To get object_type_id and object_id from the Jive UI, go to the Place, select Actions, and mouse over any option. A URL will display with parameters containerType (object_type_id) and ContainerId (object_id).",
          "hints": ["advanced"],
          "items": {
            "type": "object",
            "title": "Hosts",
            "properties": {
              "object_type_id": {
                "type": "string",
                "title": "Object Type Id",
                "description": "A valid object type Id for places. For example, 14 for space, 700 for group, 600 for project, 37 for blog. Check the correct object type ids for your Jive instance"
              },
              "object_id": {
                "type": "string",
                "title": "Object Id",
                "description": "The Object type of the place to indexed content from."
              }
            },
            "category": "Other",
            "categoryPriority": 1,
            "unsafe": false
          }
        },
        "initial_mapping": {
          "type": "object",
          "title": "Initial field mapping",
          "description": "Provides mapping of fields before documents are sent to an index pipeline.",
          "properties": {
            "skip": {
              "type": "boolean",
              "title": "Skip This Stage",
              "description": "Set to true to skip this stage.",
              "default": false,
              "hints": ["advanced"]
            },
            "label": {
              "type": "string",
              "title": "Label",
              "description": "A unique label for this stage.",
              "hints": ["advanced"],
              "maxLength": 255
            },
            "condition": {
              "type": "string",
              "title": "Condition",
              "description": "Define a conditional script that must result in true or false. This can be used to determine if the stage should process or not.",
              "hints": ["code", "code/javascript", "advanced"]
            },
            "reservedFieldsMappingAllowed": {
              "type": "boolean",
              "title": "Allow System Fields Mapping?",
              "default": false,
              "hints": ["advanced"]
            },
            "retentionMappings": {
              "type": "array",
              "title": "Field Retention",
              "description": "Fields that should be kept or deleted",
              "hints": ["advanced"],
              "items": {
                "type": "object",
                "required": ["field"],
                "properties": {
                  "field": {
                    "type": "string",
                    "title": "Field",
                    "description": "The name of the field to operate on.",
                    "hints": ["advanced"]
                  },
                  "operation": {
                    "type": "string",
                    "title": "Operation",
                    "description": "The type of operation to perform: keep (default) or delete",
                    "enum": ["keep", "delete"],
                    "default": "keep",
                    "hints": ["advanced"]
                  }
                }
              }
            },
            "updateMappings": {
              "type": "array",
              "title": "Field Value Updates",
              "description": "Values that should be added to or set on a field. When a value is added, any values previously on the field will be retained. When a value is set, any values previously on the field will be overwritten.",
              "hints": ["advanced"],
              "items": {
                "type": "object",
                "required": ["field", "value"],
                "properties": {
                  "field": {
                    "type": "string",
                    "title": "Field",
                    "description": "The name of the field to operate on.",
                    "hints": ["advanced"]
                  },
                  "value": {
                    "type": "string",
                    "title": "Value",
                    "description": "The value to add to or set on the field.",
                    "hints": ["advanced"]
                  },
                  "operation": {
                    "type": "string",
                    "title": "Operation",
                    "description": "The type of operation to perform: add (default) or set.",
                    "enum": ["add", "set"],
                    "default": "add",
                    "hints": ["advanced"]
                  }
                }
              }
            },
            "translationMappings": {
              "type": "array",
              "title": "Field Translations",
              "description": "Fields that should be moved or copied to another field. When a field is moved, the values from the source field are moved over to the target field and the source field is removed. When a field is copied, the values from the source field are copied over to the target field and the source field is retained.",
              "hints": ["advanced"],
              "items": {
                "type": "object",
                "required": ["source", "target"],
                "properties": {
                  "source": {
                    "type": "string",
                    "title": "Source Field",
                    "description": "The name of the field to operate on.",
                    "hints": ["advanced"]
                  },
                  "target": {
                    "type": "string",
                    "title": "Target Field",
                    "description": "The name of the target field.",
                    "hints": ["advanced"]
                  },
                  "operation": {
                    "type": "string",
                    "title": "Operation",
                    "description": "The type of operation to perform: copy (default) or move.",
                    "enum": ["copy", "move"],
                    "default": "copy",
                    "hints": ["advanced"]
                  }
                }
              }
            },
            "unmappedRule": {
              "type": "object",
              "title": "Unmapped Fields",
              "description": "Fields not mapped by the above rules. By default, any remaining fields will be kept on the document.",
              "properties": {
                "keep": {
                  "type": "boolean",
                  "title": "Keep",
                  "description": "Keep all unmapped fields",
                  "default": true,
                  "hints": ["advanced"]
                },
                "delete": {
                  "type": "boolean",
                  "title": "Delete",
                  "description": "Delete all unmapped fields",
                  "default": false,
                  "hints": ["advanced"]
                },
                "fieldToMoveValuesTo": {
                  "type": "string",
                  "title": "Move",
                  "description": "Move all unmapped field values to this field",
                  "hints": ["advanced"]
                },
                "fieldToCopyValuesTo": {
                  "type": "string",
                  "title": "Copy",
                  "description": "Copy all unmapped field values to this field",
                  "hints": ["advanced"]
                },
                "valueToAddToUnmappedFields": {
                  "type": "string",
                  "title": "Add",
                  "description": "Add this value to all unmapped fields",
                  "hints": ["advanced"]
                },
                "valueToSetOnUnmappedFields": {
                  "type": "string",
                  "title": "Set",
                  "description": "Set this value on all unmapped fields",
                  "hints": ["advanced"]
                }
              }
            }
          },
          "category": "Field Transformation",
          "categoryPriority": 7,
          "hints": ["advanced"],
          "unsafe": false
        },
        "jive_instance_url": {
          "type": "string",
          "title": "Jive instance URL",
          "description": "Address of your Jive instance.",
          "minLength": 1
        },
        "proxy_address": {
          "type": "string",
          "title": "HTTP proxy address",
          "description": "Address of the HTTP proxy, if required. This should be entered in the format <scheme>://<host>:<port>",
          "hints": ["advanced"]
        },
        "jive_username": {
          "type": "string",
          "title": "Jive username",
          "description": "Username to access the Jive instance. If this is provided and the Client ID is also provided, the Client ID will be preferred for OAuth-based auhtentication to Jive. The username and password are defined as a backup in case OAuth is not available.",
          "minLength": 1
        },
        "jive_password": {
          "type": "string",
          "title": "Jive password",
          "description": "Password for the provided user.",
          "hints": ["secret"],
          "minLength": 1
        },
        "jive_client_id": {
          "type": "string",
          "title": "Jive Add-on Client Id",
          "description": "Jive Client ID provided by the Jive Add-on. If the Add-on has been installed in your Jive instance, OAuth will be used to authenticate to the Jive instance. If this is not provided, the username and password will be used instead.",
          "hints": ["secret"]
        },
        "jive_client_secret": {
          "type": "string",
          "title": "Jive Add-on Client Secret",
          "description": "Jive Secret Key for the provided Client ID.",
          "hints": ["secret"]
        },
        "kerberosEnabled": {
          "type": "boolean",
          "title": "kerberosEnabled",
          "description": "This property is no longer in use, and is only in place due to backwards compatible configuration validation purposes.",
          "hints": ["hidden"]
        },
        "kerberosLoginContextName": {
          "type": "string",
          "title": "kerberosLoginContextName",
          "description": "This property is no longer in use, and is only in place due to backwards compatible configuration validation purposes.",
          "hints": ["hidden"]
        },
        "kerberosSpn": {
          "type": "string",
          "title": "kerberosSpn",
          "description": "This property is no longer in use, and is only in place due to backwards compatible configuration validation purposes.",
          "hints": ["hidden"]
        },
        "kerberosPrincipal": {
          "type": "string",
          "title": "kerberosPrincipal",
          "description": "This property is no longer in use, and is only in place due to backwards compatible configuration validation purposes.",
          "hints": ["hidden"]
        },
        "kerberosKeytabFile": {
          "type": "string",
          "title": "kerberosKeytabFile",
          "description": "This property is no longer in use, and is only in place due to backwards compatible configuration validation purposes.",
          "hints": ["hidden"]
        },
        "kerberosKeytabBase64": {
          "type": "string",
          "title": "kerberosKeytabBase64",
          "description": "This property is no longer in use, and is only in place due to backwards compatible configuration validation purposes.",
          "hints": ["hidden"]
        },
        "kerberosPassword": {
          "type": "string",
          "title": "kerberosPassword",
          "description": "This property is no longer in use, and is only in place due to backwards compatible configuration validation purposes.",
          "hints": ["secret", "hidden"]
        },
        "kerberos_sso_endpoint": {
          "type": "string",
          "title": "Kerberos SSO Endpoint URL",
          "description": "This property is no longer in use, and is only in place due to backwards compatible configuration validation purposes.",
          "hints": ["hidden"]
        },
        "kerberos_sso_cookie_ttl": {
          "type": "integer",
          "title": "Kerberos SSO Cookie TTL (ms)",
          "description": "This property is no longer in use, and is only in place due to backwards compatible configuration validation purposes.",
          "hints": ["hidden"]
        },
        "contents_to_crawl": {
          "type": "string",
          "title": "Contents to crawl",
          "description": "List of content types to crawl, separated by commas and no spaces (lowercase). The connector can only retrieve objects from Jive's Content entity, as described in https://developers.jivesoftware.com/api/v3/cloud/rest/ContentEntity.html.",
          "default": "All",
          "minLength": 1
        },
        "enable_security_trimming": {
          "type": "boolean",
          "title": "Enable Security Trimming",
          "description": "Security trimming restricts query results to records the user is allowed to access by indexing user access information with other document metadata. Enable this option to index user access metadata.",
          "default": false
        },
        "places_to_crawl": {
          "type": "string",
          "title": "Places to crawl",
          "description": "List of places to crawl, separated by commas and no spaces (lowercase). The connector can only retrieve Places from Jive's Place entity, as described in https://developers.jivesoftware.com/api/v3/cloud/rest/PlaceEntity.html.",
          "default": "space,group"
        },
        "fetch_announcements": {
          "type": "boolean",
          "title": "Fetch Announcements",
          "description": "When enabled system and place announcements are fetched",
          "default": true
        },
        "max_file_size": {
          "type": "integer",
          "title": "Maximum file size (bytes)",
          "description": "Maximum size (in bytes) of documents to fetch or -1 for unlimited file size. Files with size greater than this value will not be downloaded but metadata will be added.",
          "default": 10485760
        },
        "default_content_encoding": {
          "type": "string",
          "title": "Default content encoding",
          "description": "The default encoding to use when parsing Jive content. Can be left blank to have fusion make an educated guess before parsing instead.",
          "default": "UTF-8"
        },
        "excluded_content_types": {
          "type": "array",
          "title": "Excluded content types",
          "description": "Content MIME types to exclude from fetching. Files with a content type contained in this list will not be downloaded but available metadata will be added to the index. By default, this list includes many content types Apache Tika is not able to process.",
          "default": ["video/x-ms-wm", "text/csv", "application/postscript", "video/x-ms-wmv", "image/vnd.dwg", "image/tiff", "audio/x-aiff", "audio/x-ms-wma", "application/mac-binhex40", "application/winhlp", "application/x-font-ttf", "video/x-ms-asf", "application/illustrator", "chemical/x-pdb", "application/x-iso9660-image", "application/x-msdownload", "audio/x-pn-realaudio", "application/x-ms-installer", "image/gif", "video/x-msvideo", "application/vnd.visio", "audio/mpeg", "application/x-emf", "image/vnd.dxf", "application/x-dosexec", "application/x-shockwave-flash", "audio/midi", "image/vnd.adobe.photoshop", "application/octet-stream", "application/x-java-jnilib", "image/x-ms-bmp", "image/jpeg", "application/x-msaccess", "video/mp4", "text/plain", "video/quicktime", "application/x-dtbresource+xml", "text/x-expect", "application/vnd.ms-htmlhelp", "audio/basic", "video/mpeg", "application/x-quattro-pro", "application/vnd.rn-realmedia", "audio/x-wav", "application/vnd.ms-cab-compressed", "audio/ogg", "video/ogg", "application/ogg", "audio/vorbis", "audio/x-oggflac", "audio/x-oggpcm", "audio/opus", "audio/speex", "video/daala", "video/theora", "video/x-dirac", "video/x-ogm", "video/x-ogguvs", "video/x-oggyuv", "video/x-oggrgb", "audio/x-flac", "application/x-msmetafile", "application/x-roxio-toast", "application/mp4", "audio/mp4", "audio/mp4a-latm", "video/mp4v-es", "video/x-m4v", "audio/mpeg4-generic", "audio/vnd.sealedmedia.softseal.mpeg", "audio/x-mpegurl", "video/bmpeg", "video/mpeg4-generic", "application/x-msdownload;format=pe", "application/x-dosexec", "application/x-msdownload;format=pe32", "application/x-msdownload;format=pe64", "application/x-msdownload;format=pe-itanium", "application/x-msdownload;format=pe-armLE", "application/x-msdownload;format=pe-arm7", "application/x-tika-msoffice"],
          "items": {
            "type": "string"
          }
        },
        "batch_size": {
          "type": "integer",
          "title": "Batch Size",
          "description": "Number of items to fetch in each batch request. The Jive API limit is 100. If you are having problems with Jive timing out on requests, decreasing the batch size might help the crawl continue, but will extend the overall time the crawl takes.",
          "default": 95,
          "hints": ["advanced"]
        },
        "requests_timeout": {
          "type": "integer",
          "title": "Connection timeout (ms)",
          "description": "Time in milliseconds to wait for server response.",
          "default": 60000,
          "hints": ["advanced"]
        },
        "diagnostic_mode": {
          "type": "boolean",
          "title": "Diagnostic Mode",
          "description": "Enable to print more detailed information to the logs about each request.",
          "default": false,
          "hints": ["advanced"]
        },
        "request_delay": {
          "type": "integer",
          "title": "Request delay (ms)",
          "description": "The amount of time, in milliseconds, to wait before perform each request.",
          "default": 0,
          "hints": ["advanced"]
        },
        "retry_delay": {
          "type": "integer",
          "title": "Retry delay (ms)",
          "description": "The number of milliseconds to wait before retrying a failed request.",
          "default": 15000,
          "hints": ["advanced"]
        },
        "max_retries": {
          "type": "integer",
          "title": "Maximum number of retries.",
          "description": "The maximum number of retries for a failed request.",
          "default": 5,
          "hints": ["advanced"]
        },
        "fetch_users": {
          "type": "boolean",
          "title": "Fetch Jive users",
          "description": "If enabled, users from Jive will be fetched",
          "default": false
        },
        "fetch_deactivated_users": {
          "type": "boolean",
          "title": "Fetch deactivated Jive users",
          "description": "If enabled, deactivated users from Jive will be fetched",
          "default": false
        },
        "fetch_personal_blogs": {
          "type": "boolean",
          "title": "Fetch personal blogs",
          "description": "If enabled, all user's blogs from Jive will be fetched",
          "default": false
        },
        "fetch_threads": {
          "type": "integer",
          "title": "Fetch threads",
          "description": "The number of threads to use during fetching",
          "default": 10,
          "minimum": 1,
          "exclusiveMinimum": false
        },
        "queue_capacity": {
          "type": "integer",
          "title": "Fetch queue capacity",
          "description": "The capacity for the fetch queue",
          "default": 10,
          "minimum": 1,
          "exclusiveMinimum": false
        },
        "producer_threads": {
          "type": "integer",
          "title": "Producer threads",
          "description": "The number of threads to use during production",
          "default": 2,
          "minimum": 1,
          "exclusiveMinimum": false
        },
        "allowCircularRedirects": {
          "type": "boolean",
          "title": "Allow circular redirects",
          "description": "If true, a request can be redirected to the same URL multiple times",
          "default": false
        }
      },
      "propertyGroups": [{
        "label": "Crawl Performance",
        "properties": ["batch_size", "requests_timeout", "retry_delay", "max_retries", "fetch_threads", "producer_threads", "queue_capacity", "allowCircularRedirects"]
      }, {
        "label": "Limit Documents",
        "properties": ["contents_to_crawl", "fetch_users", "fetch_deactivated_users", "fetch_personal_blogs", "max_file_size", "excluded_content_types", "places_filter"]
      }, {
        "label": "Field Mapping",
        "properties": ["initial_mapping"]
      }]
    }
  },
  "category": "Other",
  "categoryPriority": 1,
  "unsafe": false
};

export const SchemaParamFields = ({schema}) => {
  const sanitize = str => {
    if (typeof str !== "string") return str;
    return str.replace(/^"(.*)"$/s, "$1").replace(/\\/g, "").replace(/"/g, "'");
  };
  const formatDescription = str => {
    const s = sanitize(str);
    return (/[.!?]\)*$/).test(s) ? s : `${s}.`;
  };
  const {description, properties = {}, required: requiredProps = []} = schema;
  const visibleProps = useMemo(() => Object.entries(properties).filter(([, prop]) => !prop.hints?.includes("hidden")), [properties]);
  return <div>
      {description && <p>{formatDescription(description)}</p>}

      {visibleProps.map(([name, prop]) => {
    const isRequired = requiredProps.includes(name);
    const hasDefault = prop.default !== undefined;
    const rawDefault = prop.default;
    const isComplexDefault = hasDefault && (typeof rawDefault === "object" || typeof rawDefault === "string" && (rawDefault.length > 20 || rawDefault.includes('"')));
    const fieldProps = {
      key: name,
      body: prop.title || name,
      type: prop.type,
      ...prop.title && ({
        post: [<><span className="text-stone-400 dark:text-stone-500">API property: </span>{name}</>]
      }),
      ...isRequired && ({
        required: true
      }),
      ...!isComplexDefault && hasDefault ? {
        default: sanitize(String(rawDefault))
      } : {}
    };
    const isObject = prop.type === "object" && prop.properties;
    const isArrayOfObjects = prop.type === "array" && prop.items?.type === "object" && prop.items.properties;
    return <ParamField {...fieldProps}>
            {prop.description && <p>{formatDescription(prop.description)}</p>}

            {isComplexDefault && <div className="flex">
                <p>
                  <strong>Default:</strong>
                </p>
                <pre className="!my-0">
                  <code>
                    {JSON.stringify(rawDefault, null, 2)}
                  </code>
                </pre>
              </div>}

            {isArrayOfObjects && <div className="flex">
              <p>
                <strong>Object attributes:</strong>
              </p>
              <pre className="!my-0">
                <code>
                  {'{\n'}
                  {Object.entries(prop.items.properties).map(([iname, iprop]) => <>
                      {`  ${iname}`}
                      {prop.items?.required?.includes(iname) && <span style={{
      color: 'red'
    }}> required</span>}
                      {`: {\n    display name: ${sanitize(iprop.title || '')}\n    type: ${iprop.type}\n  }\n`}
                    </>)}
                  {'}'}
                </code>
              </pre>
              </div>}

            {isObject && <Expandable title="properties">
                <SchemaParamFields schema={{
      properties: prop.properties,
      required: prop.required
    }} />
              </Expandable>}
          </ParamField>;
  })}
    </div>;
};

export const LwTemplate = ({title = "Key questions to get you started", icon = "sparkles", cta = "Powered by Agent Studio", linkHref = "https://lucidworks.com/demo/?utm_source=docs&utm_medium=referral&utm_campaign=docs_cta_ai"}) => {
  const [isLoaded, setIsLoaded] = useState(false);
  useEffect(() => {
    const timer = setTimeout(() => {
      setIsLoaded(true);
    }, 500);
    return () => clearTimeout(timer);
  }, []);
  return <div className="lw-template-container">
      <Card title={title} icon={icon}>
        {isLoaded && <span dangerouslySetInnerHTML={{
    __html: `<lw-template id="a029c1a9-28be-427e-b0e1-5d918920246a"></lw-template
            >`
  }} />}
        <Link href={linkHref} className="agent-studio-link text-left text-gray-600 gap-2 dark:text-gray-400 text-sm font-medium flex flex-row items-center hover:text-primary dark:hover:text-primary-light group-hover:text-primary group-hover:dark:text-primary-light">Powered by Lucidworks Agent Studio</Link>
      </Card>
    </div>;
};

[localhost link]: http://localhost:3000/docs/fusion-connectors/connectors/v1/jive

[mintlify link]: https://doc.lucidworks.com/docs/fusion-connectors/connectors/v1/jive

[old doc.lw link]: https://doc.lucidworks.com/fusion-connectors/76

<Callout icon="plug" color="#A4C6F7" iconType="solid">
  **Compatible with Fusion version:** 4.0.0 through 5.12.0
</Callout>

<Tip>
  V1 deprecation and removal notice

  All V1 connectors are deprecated in Fusion 5.18.0 and later. This means they are no longer being actively developed and will be removed in Fusion 6. V1 connectors were also previously deprecated in Fusion 5.12.0 but remained available in all versions between 5.12.0 and 5.18.0, including the Fusion 5.9.x long-term support release line, to support customers on those versions.

  The replacement for this connector is in active development at this time and will be released at a future date.

  If you are using this connector, you must migrate to the replacement connector or a supported alternative before upgrading to Fusion 6. Migrate to the replacement connector as soon as possible to avoid any disruption to your workflows.
</Tip>

If security trimming is enabled, the Jive connector uses the `visibility` field while indexing permission metadata on content. This data is stored in the `acl_ss` field for each document.

The value of the `visibility` field determines the permissions assigned to a document. The following table describes how the types of permissions found in the `visibility` field of a document are used.

| Permission type      | Notes                                                                                                                                            |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| All                  | The value stored in the `acl_ss` field is "all".                                                                                                 |
| People               | The document includes a list of users who are authorized to view the content. This list is stored in the `acl_ss` field as user email addresses. |
| Place                | A request is made to determine the type of group. The group type determines the permissions stored.                                              |
| Open or Members Only | The value stored in the `acl_ss` field is "all".                                                                                                 |
| Private or Secret    | The value stored in the `acl_ss` field is the name of the group.                                                                                 |

<LwTemplate />

## Learn more

<Accordion title="Configure Kerberos Authentication for a Jive Datasource">
  Retrieve content from a [Jive](https://www.jivesoftware.com/) instance.

  The Fusion Jive connector can crawl Jive repositories protected by Kerberos using SPNEGO.
  This is a way to access Jive without requiring a user’s login credentials.

  The Fusion Jive connector can optionally use Kerberos with SAML/Smart Form authentication.

  To crawl a Kerberos-protected Jive repository, first create the necessary configuration files, then configure Fusion to use them.

  <Note>Kerberos support requires Fusion 5.9.5.</Note>

  ## Create standard Java configuration files to connect to Kerberos

  Fusion uses the JDK standard JAAS Kerberos implementation, which is based on three system properties that reference three separate files.

  The files are as follows:

  * On the Kerberos-protected server, a keytab file, named `kerberuser.keytab` in our examples.
  * On the Fusion server, a configuration file named `login.conf`.
  * On the Fusion server, an initialization file named `krb5.ini` (Windows) or `krb5.conf` (Linux).

  ### Create a Kerberos keytab

  Create and validate the keytab file for the Kerberos client principal you want to use to authenticate to the Jive repository.

  If you do not specify the `kerberosPrincipalName` and `kerberosKeytabFilePath` or `kerberosKeytabBase64` when [creating the Fusion datasource](#configure-fusion-to-use-kerberos), Fusion uses the default login principal and ticket cache.
  You can see the default values by logging into the Fusion server as the user who runs Fusion and running `klist`.

  If you do not want to use the default account and credentials, specify these configuration properties when creating a keytab as well as in the [Jive datasource setup](#configure-fusion-to-use-kerberos).
  Use the Kerberos user principal name (UPN), not the service principal name (SPN, which is used with the Kerberos security realm).
  In some cases the UPN can be a service.

  In our examples, the Fusion Jive connector authenticates to the Jive repository using the user [kerbuser@win.lab.lucidworks.com](mailto:kerbuser@win.lab.lucidworks.com).
  We create a keytab file `kerbuser.keytab` for the user principal [kerbuser@WIN.LAB.LUCIDWORKS.COM](mailto:kerbuser@WIN.LAB.LUCIDWORKS.COM).

  #### Create a Kerberos keytab on Windows

  Example:

  ```bash wrap theme={"dark"}
  ktpass -out kerbuser.keytab -princ kerbuser@WIN.LAB.LUCIDWORKS.COM -mapUser kerbuser -mapOp set -pass YOUR_PASSWORD -crypto AES256-SHA1 -pType KRB5_NT_PRINCIPAL
  ```

  <Note>The following weak encryption types are not supported by Fusion:  \* DES-CBC-CRC \* DES\_CBC\_MD5 \* Microsoft Windows 2000 RC4-HMAC</Note>

  #### Create a Kerberos keytab on Ubuntu Linux

  Prerequisite: Install the `krb5-user` package: `sudo apt-get install krb5-user`

  Example:

  ```bash theme={"dark"}
  ktutil
  addent -password -p HTTP/kerbuser@WIN.LAB.LUCIDWORKS.COM -k 1 -e aes128-cts-hmac-sha1-96
  - it will ask you for password of kerbuser -
  wkt kerbuser.keytab
  q
  ```

  #### Test the keytab

  Once you create a keytab, verify that it works.

  Prerequisite: You need a version of curl installed that allows SPNEGO. To test whether your version of curl does this, run `curl --version` and make sure SPNEGO is in the output.

  Run the following curl command (replace the keytab path and site):

  ```bash wrap theme={"dark"}
  export KRB5CCNAME=FILE:/path/to/kerbuser.keytab curl -vvv --negotiate -u : http://your-site.com
  ```

  Note that the first request is a 401 status code for the negotiate request followed by a second request, which is a status of 200.

  ### Create a login.conf and krb5.ini

  On the Fusion server, create `login.conf` and `krb5.ini` files as follows.

  #### Create a login.conf on Windows

  In this example, the keytab is stored at `C:\kerb\kerbuser.keytab`

  ```bash theme={"dark"}
  KrbLogin {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    storeKey=true
    keyTab="C:\kerb\kerbuser.keytab"
    useTicketCache=true
    principal="kerbuser@WIN.LAB.LUCIDWORKS.COM"
    debug=true;
  };
  ```

  ##### Create a login.conf on Linux

  In this example, the keytab is stored at `/home/lucidworks/kb.keytab`

  ```bash theme={"dark"}
  com.sun.security.jgss.initiate {
    com.sun.security.auth.module.Krb5LoginModule required
    useKeyTab=true
    storeKey=true
    keyTab="/home/lucidworks/kerbuser.keytab"
    useTicketCache=true
    principal="kerbuser@WIN.LAB.LUCIDWORKS.COM"
    debug=true;
  };
  ```

  The format of the login.conf is described on
  [the Oracle Web site](https://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/tutorials/LoginConfigFile.html).

  #### Create a krb5.ini or krb5.conf

  When you install krb5 on Linux, you can find a Kerberos configuration file in `/etc/krb5.conf`. You can optionally create a custom one instead.

  Creating a `krb5.conf` is the same for Linux and Windows. On Windows the file is `krb5.ini`.

  In this example the domain is WIN.LAB.LUCIDWORKS.COM, the Kerberos kdc host is `my.kdc-dns.com`, and the Kerberos admin server is `my-admin-server-dns.com`.

  Example:

  ```bash theme={"dark"}
  [libdefaults]
      default_realm = WIN.LAB.LUCIDWORKS.COM
      default_tkt_enctypes = aes128-cts-hmac-sha1-96
      default_tgs_enctypes = aes128-cts-hmac-sha1-96
      permitted_enctypes = aes128-cts-hmac-sha1-96
      dns_lookup_realm = false
      dns_lookup_kdc = false
      ticket_lifetime = 24h
      renew_lifetime = 7d
      forwardable = true
      udp_preference_limit = 1

  [realms]
  WIN.LAB.LUCIDWORKS.COM = {
      kdc = my.kdc-dns.com
      admin_server = my.admin-server-dns.com
  }

  [domain_realm]
  .WIN.LAB.LUCIDWORKS.COM = WIN.LAB.LUCIDWORKS.COM
  WIN.LAB.LUCIDWORKS.COM = WIN.LAB.LUCIDWORKS.COM
  ```

  The format of the `krb.conf` or `krb5.ini` file is described in [the MIT Kerberos documentation](https://web.mit.edu/kerberos/krb5-1.12/doc/admin/conf_files/krb5_conf.html).
  You can change the encryption algorithms by changing the properties `default_tkt_enctypes`, `default_tgs_enctypes`, and `permitted_enctypes` as needed. For example:

  ```bash theme={"dark"}
  default_tkt_enctypes = RC4-HMAC
  default_tgs_enctypes = RC4-HMAC
  Permitted_enctypes = RC4-HMAC
  ```

  ## Configure Fusion to use Kerberos

  Once you have the keytab, `login.conf`, and `krb5.ini` files, configure Fusion to use Kerberos. You must set a property in a Fusion configuration file in addition to defining the datasource in the Fusion UI.

  At the command line on any machine in your Fusion cluster:

  1. In `$FUSION_HOME/conf/fusion.cors` (`fusion.properties` in Fusion 4), add the following property to the `connectors-classic jvmOptions` setting: `-Djavax.security.auth.useSubjectCredsOnly=false`
  2. Restart the `connectors-classic` service using `./bin/connectors-classic restart` on Linux or `bin\connectors-classic.cmd restart` on Windows.

  In the Fusion UI:

  1. Click **Indexing > Datasources**.
     HEAD
  2. Click **Add+**, then **Jive**.
  3. Enter a datasource ID and a Jive instance URL.
  4. Check **Enable SPNEGO/Kerberos Authentication**.
  5. You can either use the default principal name or specify a principal name to use.
     * If you do not specify the principal name, then Fusion uses the default login principal and ticket cache. You can see those default values by logging into the Fusion server as the user who runs Fusion and running `klist`.
  6. If you specify a principal name, you must provide a keytab, either in Base64 or as a file path.
     * If you specify a keytab file path, the file must be on the machine running the Fusion connector, for each connector’s node in the cluster.
     * The Base64 option lets you supply the keytab in one place, in the UI.
  7. Fill in any remaining options to configure the datasource.
</Accordion>

## Configuration

<Tip>
  When entering configuration values in the UI, use *unescaped* characters, such as `\t` for the tab character. When entering configuration values in the API, use *escaped* characters, such as `\\t` for the tab character.
</Tip>

<SchemaParamFields schema={schema} />
