| |
@@ -21,6 +21,7 @@
|
| |
|
| |
class MemberOf extends React.Component {
|
| |
componentWillMount(prevProps) {
|
| |
+ this.getObjectClasses();
|
| |
this.updateFields();
|
| |
}
|
| |
|
| |
@@ -33,6 +34,7 @@
|
| |
constructor(props) {
|
| |
super(props);
|
| |
|
| |
+ this.getObjectClasses = this.getObjectClasses.bind(this);
|
| |
this.updateFields = this.updateFields.bind(this);
|
| |
this.handleFieldChange = this.handleFieldChange.bind(this);
|
| |
this.handleCheckboxChange = this.handleCheckboxChange.bind(this);
|
| |
@@ -46,11 +48,13 @@
|
| |
this.toggleFixupModal = this.toggleFixupModal.bind(this);
|
| |
|
| |
this.state = {
|
| |
+ objectClasses: [],
|
| |
+
|
| |
memberOfAttr: [],
|
| |
memberOfGroupAttr: [],
|
| |
memberOfEntryScope: "",
|
| |
memberOfEntryScopeExcludeSubtree: "",
|
| |
- memberOfAutoAddOC: "",
|
| |
+ memberOfAutoAddOC: [],
|
| |
memberOfAllBackends: false,
|
| |
memberOfSkipNested: false,
|
| |
memberOfConfigEntry: "",
|
| |
@@ -62,7 +66,7 @@
|
| |
configGroupAttr: [],
|
| |
configEntryScope: "",
|
| |
configEntryScopeExcludeSubtree: "",
|
| |
- configAutoAddOC: "",
|
| |
+ configAutoAddOC: [],
|
| |
configAllBackends: false,
|
| |
configSkipNested: false,
|
| |
newEntry: true,
|
| |
@@ -87,7 +91,9 @@
|
| |
let cmd = [
|
| |
"dsconf",
|
| |
"-j",
|
| |
- "ldapi://%2fvar%2frun%2fslapd-" + this.props.serverId + ".socket",
|
| |
+ "ldapi://%2fvar%2frun%2fslapd-" +
|
| |
+ this.props.serverId +
|
| |
+ ".socket",
|
| |
"plugin",
|
| |
"memberof",
|
| |
"fixup",
|
| |
@@ -129,6 +135,7 @@
|
| |
}
|
| |
|
| |
openModal() {
|
| |
+ this.getObjectClasses();
|
| |
if (!this.state.memberOfConfigEntry) {
|
| |
this.setState({
|
| |
configEntryModalShow: true,
|
| |
@@ -138,7 +145,7 @@
|
| |
configGroupAttr: [],
|
| |
configEntryScope: "",
|
| |
configEntryScopeExcludeSubtree: "",
|
| |
- configAutoAddOC: "",
|
| |
+ configAutoAddOC: [],
|
| |
configAllBackends: false,
|
| |
configSkipNested: false
|
| |
});
|
| |
@@ -148,7 +155,9 @@
|
| |
let cmd = [
|
| |
"dsconf",
|
| |
"-j",
|
| |
- "ldapi://%2fvar%2frun%2fslapd-" + this.props.serverId + ".socket",
|
| |
+ "ldapi://%2fvar%2frun%2fslapd-" +
|
| |
+ this.props.serverId +
|
| |
+ ".socket",
|
| |
"plugin",
|
| |
"memberof",
|
| |
"config-entry",
|
| |
@@ -157,7 +166,11 @@
|
| |
];
|
| |
|
| |
this.props.toggleLoadingHandler();
|
| |
- log_cmd("openMemberOfModal", "Fetch the MemberOf Plugin config entry", cmd);
|
| |
+ log_cmd(
|
| |
+ "openMemberOfModal",
|
| |
+ "Fetch the MemberOf Plugin config entry",
|
| |
+ cmd
|
| |
+ );
|
| |
cockpit
|
| |
.spawn(cmd, {
|
| |
superuser: true,
|
| |
@@ -171,8 +184,9 @@
|
| |
configDN: this.state.memberOfConfigEntry,
|
| |
configAutoAddOC:
|
| |
configEntry["memberofautoaddoc"] === undefined
|
| |
- ? ""
|
| |
- : configEntry["memberofautoaddoc"][0],
|
| |
+ ? []
|
| |
+ : [{id:configEntry["memberofautoaddoc"][0],
|
| |
+ label: configEntry["memberofautoaddoc"][0]}],
|
| |
configAllBackends: !(
|
| |
configEntry["memberofallbackends"] === undefined ||
|
| |
configEntry["memberofallbackends"][0] == "off"
|
| |
@@ -182,7 +196,8 @@
|
| |
configEntry["memberofskipnested"][0] == "off"
|
| |
),
|
| |
configConfigEntry:
|
| |
- configEntry["nsslapd-pluginConfigArea"] === undefined
|
| |
+ configEntry["nsslapd-pluginConfigArea"] ===
|
| |
+ undefined
|
| |
? ""
|
| |
: configEntry["nsslapd-pluginConfigArea"][0],
|
| |
configEntryScope:
|
| |
@@ -190,7 +205,8 @@
|
| |
? ""
|
| |
: configEntry["memberofentryscope"][0],
|
| |
configEntryScopeExcludeSubtree:
|
| |
- configEntry["memberofentryscopeexcludesubtree"] === undefined
|
| |
+ configEntry["memberofentryscopeexcludesubtree"] ===
|
| |
+ undefined
|
| |
? ""
|
| |
: configEntry["memberofentryscopeexcludesubtree"][0]
|
| |
});
|
| |
@@ -214,9 +230,11 @@
|
| |
{ id: value, label: value }
|
| |
];
|
| |
}
|
| |
- this.setState({ configGroupAttr: configGroupAttrObjectList });
|
| |
- this.props.toggleLoadingHandler();
|
| |
+ this.setState({
|
| |
+ configGroupAttr: configGroupAttrObjectList
|
| |
+ });
|
| |
}
|
| |
+ this.props.toggleLoadingHandler();
|
| |
})
|
| |
.fail(_ => {
|
| |
this.setState({
|
| |
@@ -227,7 +245,7 @@
|
| |
configGroupAttr: [],
|
| |
configEntryScope: "",
|
| |
configEntryScopeExcludeSubtree: "",
|
| |
- configAutoAddOC: "",
|
| |
+ configAutoAddOC: [],
|
| |
configAllBackends: false,
|
| |
configSkipNested: false
|
| |
});
|
| |
@@ -261,26 +279,37 @@
|
| |
let cmd = [
|
| |
"dsconf",
|
| |
"-j",
|
| |
- "ldapi://%2fvar%2frun%2fslapd-" + this.props.serverId + ".socket",
|
| |
+ "ldapi://%2fvar%2frun%2fslapd-" +
|
| |
+ this.props.serverId +
|
| |
+ ".socket",
|
| |
"plugin",
|
| |
"memberof",
|
| |
"config-entry",
|
| |
action,
|
| |
configDN,
|
| |
"--scope",
|
| |
- configEntryScope || action == "add" ? configEntryScope : "delete",
|
| |
+ configEntryScope || action == "add"
|
| |
+ ? configEntryScope
|
| |
+ : "delete",
|
| |
"--exclude",
|
| |
configEntryScopeExcludeSubtree || action == "add"
|
| |
? configEntryScopeExcludeSubtree
|
| |
: "delete",
|
| |
- "--autoaddoc",
|
| |
- configAutoAddOC || action == "add" ? configAutoAddOC : "delete",
|
| |
"--allbackends",
|
| |
configAllBackends ? "on" : "off",
|
| |
"--skipnested",
|
| |
configSkipNested ? "on" : "off"
|
| |
];
|
| |
|
| |
+ cmd = [...cmd, "--autoaddoc"];
|
| |
+ if (configAutoAddOC.length != 0) {
|
| |
+ cmd = [...cmd, configAutoAddOC[0].id];
|
| |
+ } else if (action == "add") {
|
| |
+ cmd = [...cmd, ""];
|
| |
+ } else {
|
| |
+ cmd = [...cmd, "delete"];
|
| |
+ }
|
| |
+
|
| |
// Delete attributes if the user set an empty value to the field
|
| |
cmd = [...cmd, "--attr"];
|
| |
if (configAttr.length != 0) {
|
| |
@@ -296,7 +325,11 @@
|
| |
}
|
| |
|
| |
this.props.toggleLoadingHandler();
|
| |
- log_cmd("memberOfOperation", `Do the ${action} operation on the MemberOf Plugin`, cmd);
|
| |
+ log_cmd(
|
| |
+ "memberOfOperation",
|
| |
+ `Do the ${action} operation on the MemberOf Plugin`,
|
| |
+ cmd
|
| |
+ );
|
| |
cockpit
|
| |
.spawn(cmd, {
|
| |
superuser: true,
|
| |
@@ -347,7 +380,9 @@
|
| |
console.info("deleteConfig", "Result", content);
|
| |
this.props.addNotification(
|
| |
"success",
|
| |
- `Config entry ${this.state.configDN} was successfully deleted`
|
| |
+ `Config entry ${
|
| |
+ this.state.configDN
|
| |
+ } was successfully deleted`
|
| |
);
|
| |
this.props.pluginListHandler();
|
| |
this.closeModal();
|
| |
@@ -389,13 +424,20 @@
|
| |
let memberOfGroupAttrObjectList = [];
|
| |
|
| |
if (this.props.rows.length > 0) {
|
| |
- const pluginRow = this.props.rows.find(row => row.cn[0] === "MemberOf Plugin");
|
| |
+ const pluginRow = this.props.rows.find(
|
| |
+ row => row.cn[0] === "MemberOf Plugin"
|
| |
+ );
|
| |
|
| |
this.setState({
|
| |
memberOfAutoAddOC:
|
| |
pluginRow["memberofautoaddoc"] === undefined
|
| |
- ? ""
|
| |
- : pluginRow["memberofautoaddoc"][0],
|
| |
+ ? []
|
| |
+ : [
|
| |
+ {
|
| |
+ id: pluginRow["memberofautoaddoc"][0],
|
| |
+ label: pluginRow["memberofautoaddoc"][0]
|
| |
+ }
|
| |
+ ],
|
| |
memberOfAllBackends: !(
|
| |
pluginRow["memberofallbackends"] === undefined ||
|
| |
pluginRow["memberofallbackends"][0] == "off"
|
| |
@@ -437,13 +479,49 @@
|
| |
{ id: value, label: value }
|
| |
];
|
| |
}
|
| |
- this.setState({ memberOfGroupAttr: memberOfGroupAttrObjectList });
|
| |
+ this.setState({
|
| |
+ memberOfGroupAttr: memberOfGroupAttrObjectList
|
| |
+ });
|
| |
}
|
| |
}
|
| |
}
|
| |
|
| |
+ getObjectClasses() {
|
| |
+ const oc_cmd = [
|
| |
+ "dsconf",
|
| |
+ "-j",
|
| |
+ "ldapi://%2fvar%2frun%2fslapd-" + this.props.serverId + ".socket",
|
| |
+ "schema",
|
| |
+ "objectclasses",
|
| |
+ "list"
|
| |
+ ];
|
| |
+ log_cmd("getObjectClasses", "Get objectClasses", oc_cmd);
|
| |
+ cockpit
|
| |
+ .spawn(oc_cmd, { superuser: true, err: "message" })
|
| |
+ .done(content => {
|
| |
+ const ocContent = JSON.parse(content);
|
| |
+ let ocs = [];
|
| |
+ for (let content of ocContent["items"]) {
|
| |
+ ocs.push({
|
| |
+ id: content.name,
|
| |
+ label: content.name
|
| |
+ });
|
| |
+ }
|
| |
+ this.setState({
|
| |
+ objectClasses: ocs
|
| |
+ });
|
| |
+ })
|
| |
+ .fail(err => {
|
| |
+ this.props.addNotification(
|
| |
+ "error",
|
| |
+ `Failed to get objectClasses - ${err}`
|
| |
+ );
|
| |
+ });
|
| |
+ }
|
| |
+
|
| |
render() {
|
| |
const {
|
| |
+ objectClasses,
|
| |
memberOfAttr,
|
| |
memberOfGroupAttr,
|
| |
memberOfEntryScope,
|
| |
@@ -478,8 +556,6 @@
|
| |
memberOfEntryScope || "delete",
|
| |
"--exclude",
|
| |
memberOfEntryScopeExcludeSubtree || "delete",
|
| |
- "--autoaddoc",
|
| |
- memberOfAutoAddOC || "delete",
|
| |
"--config-entry",
|
| |
memberOfConfigEntry || "delete",
|
| |
"--allbackends",
|
| |
@@ -488,6 +564,13 @@
|
| |
memberOfSkipNested ? "on" : "off"
|
| |
];
|
| |
|
| |
+ specificPluginCMD = [...specificPluginCMD, "--autoaddoc"];
|
| |
+ if (memberOfAutoAddOC.length != 0) {
|
| |
+ specificPluginCMD = [...specificPluginCMD, memberOfAutoAddOC[0].id];
|
| |
+ } else {
|
| |
+ specificPluginCMD = [...specificPluginCMD, "delete"];
|
| |
+ }
|
| |
+
|
| |
// Delete attributes if the user set an empty value to the field
|
| |
specificPluginCMD = [...specificPluginCMD, "--attr"];
|
| |
if (memberOfAttr.length != 0) {
|
| |
@@ -526,27 +609,41 @@
|
| |
<Row>
|
| |
<Col sm={12}>
|
| |
<Form horizontal>
|
| |
- <FormGroup controlId="fixupDN" key="fixupDN">
|
| |
+ <FormGroup
|
| |
+ controlId="fixupDN"
|
| |
+ key="fixupDN"
|
| |
+ >
|
| |
<Col sm={3}>
|
| |
- <ControlLabel>Base DN</ControlLabel>
|
| |
+ <ControlLabel title="Base DN that contains entries to fix up">
|
| |
+ Base DN
|
| |
+ </ControlLabel>
|
| |
</Col>
|
| |
<Col sm={9}>
|
| |
<FormControl
|
| |
type="text"
|
| |
value={fixupDN}
|
| |
- onChange={this.handleFieldChange}
|
| |
+ onChange={
|
| |
+ this.handleFieldChange
|
| |
+ }
|
| |
/>
|
| |
</Col>
|
| |
</FormGroup>
|
| |
- <FormGroup controlId="fixupFilter" key="fixupFilter">
|
| |
+ <FormGroup
|
| |
+ controlId="fixupFilter"
|
| |
+ key="fixupFilter"
|
| |
+ >
|
| |
<Col sm={3}>
|
| |
- <ControlLabel>Filter DN</ControlLabel>
|
| |
+ <ControlLabel title="Filter for entries to fix up. If omitted, all entries with objectclass inetuser/inetadmin/nsmemberof under the specified base will have their memberOf attribute regenerated.">
|
| |
+ Filter DN
|
| |
+ </ControlLabel>
|
| |
</Col>
|
| |
<Col sm={9}>
|
| |
<FormControl
|
| |
type="text"
|
| |
value={fixupFilter}
|
| |
- onChange={this.handleFieldChange}
|
| |
+ onChange={
|
| |
+ this.handleFieldChange
|
| |
+ }
|
| |
/>
|
| |
</Col>
|
| |
</FormGroup>
|
| |
@@ -579,7 +676,9 @@
|
| |
>
|
| |
<Icon type="pf" name="close" />
|
| |
</button>
|
| |
- <Modal.Title>Manage MemberOf Plugin Shared Config Entry</Modal.Title>
|
| |
+ <Modal.Title>
|
| |
+ Manage MemberOf Plugin Shared Config Entry
|
| |
+ </Modal.Title>
|
| |
</Modal.Header>
|
| |
<Modal.Body>
|
| |
<Row>
|
| |
@@ -587,13 +686,17 @@
|
| |
<Form horizontal>
|
| |
<FormGroup controlId="configDN">
|
| |
<Col sm={3}>
|
| |
- <ControlLabel>Config DN</ControlLabel>
|
| |
+ <ControlLabel title="The config entry full DN">
|
| |
+ Config DN
|
| |
+ </ControlLabel>
|
| |
</Col>
|
| |
<Col sm={9}>
|
| |
<FormControl
|
| |
type="text"
|
| |
value={configDN}
|
| |
- onChange={this.handleFieldChange}
|
| |
+ onChange={
|
| |
+ this.handleFieldChange
|
| |
+ }
|
| |
disabled={!newEntry}
|
| |
/>
|
| |
</Col>
|
| |
@@ -603,7 +706,11 @@
|
| |
controlId="configAttr"
|
| |
disabled={false}
|
| |
>
|
| |
- <Col componentClass={ControlLabel} sm={3}>
|
| |
+ <Col
|
| |
+ componentClass={ControlLabel}
|
| |
+ sm={3}
|
| |
+ title="Specifies the attribute in the user entry for the Directory Server to manage to reflect group membership (memberOfAttr)"
|
| |
+ >
|
| |
Attribute
|
| |
</Col>
|
| |
<Col sm={9}>
|
| |
@@ -632,7 +739,11 @@
|
| |
controlId="configGroupAttr"
|
| |
disabled={false}
|
| |
>
|
| |
- <Col componentClass={ControlLabel} sm={3}>
|
| |
+ <Col
|
| |
+ componentClass={ControlLabel}
|
| |
+ sm={3}
|
| |
+ title="Specifies the attribute in the group entry to use to identify the DNs of group members (memberOfGroupAttr)"
|
| |
+ >
|
| |
Group Attribute
|
| |
</Col>
|
| |
<Col sm={9}>
|
| |
@@ -667,21 +778,31 @@
|
| |
controlId="configEntryScope"
|
| |
disabled={false}
|
| |
>
|
| |
- <Col componentClass={ControlLabel} sm={3}>
|
| |
+ <Col
|
| |
+ componentClass={ControlLabel}
|
| |
+ sm={3}
|
| |
+ title="Specifies backends or multiple-nested suffixes for the MemberOf plug-in to work on (memberOfEntryScope)"
|
| |
+ >
|
| |
Entry Scope
|
| |
</Col>
|
| |
<Col sm={6}>
|
| |
<FormControl
|
| |
type="text"
|
| |
value={configEntryScope}
|
| |
- onChange={this.handleFieldChange}
|
| |
+ onChange={
|
| |
+ this.handleFieldChange
|
| |
+ }
|
| |
/>
|
| |
</Col>
|
| |
<Col sm={3}>
|
| |
<Checkbox
|
| |
id="configAllBackends"
|
| |
checked={configAllBackends}
|
| |
- onChange={this.handleCheckboxChange}
|
| |
+ onChange={
|
| |
+ this
|
| |
+ .handleCheckboxChange
|
| |
+ }
|
| |
+ title="Specifies whether to search the local suffix for user entries on all available suffixes (memberOfAllBackends)"
|
| |
>
|
| |
All Backends
|
| |
</Checkbox>
|
| |
@@ -692,21 +813,33 @@
|
| |
controlId="configEntryScopeExcludeSubtree"
|
| |
disabled={false}
|
| |
>
|
| |
- <Col componentClass={ControlLabel} sm={3}>
|
| |
+ <Col
|
| |
+ componentClass={ControlLabel}
|
| |
+ sm={3}
|
| |
+ title="Specifies backends or multiple-nested suffixes for the MemberOf plug-in to exclude (memberOfEntryScopeExcludeSubtree)"
|
| |
+ >
|
| |
Entry Scope Exclude Subtree
|
| |
</Col>
|
| |
<Col sm={6}>
|
| |
<FormControl
|
| |
type="text"
|
| |
- value={configEntryScopeExcludeSubtree}
|
| |
- onChange={this.handleFieldChange}
|
| |
+ value={
|
| |
+ configEntryScopeExcludeSubtree
|
| |
+ }
|
| |
+ onChange={
|
| |
+ this.handleFieldChange
|
| |
+ }
|
| |
/>
|
| |
</Col>
|
| |
<Col sm={3}>
|
| |
<Checkbox
|
| |
id="configSkipNested"
|
| |
checked={configSkipNested}
|
| |
- onChange={this.handleCheckboxChange}
|
| |
+ onChange={
|
| |
+ this
|
| |
+ .handleCheckboxChange
|
| |
+ }
|
| |
+ title="Specifies wherher to skip nested groups or not (memberOfSkipNested)"
|
| |
>
|
| |
Skip Nested
|
| |
</Checkbox>
|
| |
@@ -718,15 +851,27 @@
|
| |
<Row>
|
| |
<Col sm={12}>
|
| |
<Form horizontal>
|
| |
- <FormGroup controlId="configAutoAddOC" disabled={false}>
|
| |
+ <FormGroup
|
| |
+ controlId="configAutoAddOC"
|
| |
+ disabled={false}
|
| |
+ >
|
| |
<Col sm={3}>
|
| |
- <ControlLabel>Auto Add OC</ControlLabel>
|
| |
+ <ControlLabel title="If an entry does not have an object class that allows the memberOf attribute then the memberOf plugin will automatically add the object class listed in the memberOfAutoAddOC parameter">
|
| |
+ Auto Add OC
|
| |
+ </ControlLabel>
|
| |
</Col>
|
| |
<Col sm={9}>
|
| |
- <FormControl
|
| |
- type="text"
|
| |
- value={configAutoAddOC}
|
| |
- onChange={this.handleFieldChange}
|
| |
+ <Typeahead
|
| |
+ allowNew
|
| |
+ onChange={value => {
|
| |
+ this.setState({
|
| |
+ configAutoAddOC: value
|
| |
+ });
|
| |
+ }}
|
| |
+ selected={configAutoAddOC}
|
| |
+ options={objectClasses}
|
| |
+ newSelectionPrefix="Add a memberOf objectClass: "
|
| |
+ placeholder="Type an objectClass..."
|
| |
/>
|
| |
</Col>
|
| |
</FormGroup>
|
| |
@@ -749,10 +894,18 @@
|
| |
>
|
| |
Delete
|
| |
</Button>
|
| |
- <Button bsStyle="primary" onClick={this.editConfig} disabled={newEntry}>
|
| |
+ <Button
|
| |
+ bsStyle="primary"
|
| |
+ onClick={this.editConfig}
|
| |
+ disabled={newEntry}
|
| |
+ >
|
| |
Save
|
| |
</Button>
|
| |
- <Button bsStyle="primary" onClick={this.addConfig} disabled={!newEntry}>
|
| |
+ <Button
|
| |
+ bsStyle="primary"
|
| |
+ onClick={this.addConfig}
|
| |
+ disabled={!newEntry}
|
| |
+ >
|
| |
Add
|
| |
</Button>
|
| |
</Modal.Footer>
|
| |
@@ -778,7 +931,11 @@
|
| |
controlId="memberOfAttr"
|
| |
disabled={false}
|
| |
>
|
| |
- <Col componentClass={ControlLabel} sm={3}>
|
| |
+ <Col
|
| |
+ componentClass={ControlLabel}
|
| |
+ sm={3}
|
| |
+ title="Specifies the attribute in the user entry for the Directory Server to manage to reflect group membership (memberOfAttr)"
|
| |
+ >
|
| |
Attribute
|
| |
</Col>
|
| |
<Col sm={9}>
|
| |
@@ -815,7 +972,11 @@
|
| |
controlId="memberOfGroupAttr"
|
| |
disabled={false}
|
| |
>
|
| |
- <Col componentClass={ControlLabel} sm={3}>
|
| |
+ <Col
|
| |
+ componentClass={ControlLabel}
|
| |
+ sm={3}
|
| |
+ title="Specifies the attribute in the group entry to use to identify the DNs of group members (memberOfGroupAttr)"
|
| |
+ >
|
| |
Group Attribute
|
| |
</Col>
|
| |
<Col sm={9}>
|
| |
@@ -862,7 +1023,11 @@
|
| |
controlId="memberOfEntryScope"
|
| |
disabled={false}
|
| |
>
|
| |
- <Col componentClass={ControlLabel} sm={3}>
|
| |
+ <Col
|
| |
+ componentClass={ControlLabel}
|
| |
+ sm={3}
|
| |
+ title="Specifies backends or multiple-nested suffixes for the MemberOf plug-in to work on (memberOfEntryScope)"
|
| |
+ >
|
| |
Entry Scope
|
| |
</Col>
|
| |
<Col sm={6}>
|
| |
@@ -877,6 +1042,7 @@
|
| |
id="memberOfAllBackends"
|
| |
checked={memberOfAllBackends}
|
| |
onChange={this.handleCheckboxChange}
|
| |
+ title="Specifies whether to search the local suffix for user entries on all available suffixes (memberOfAllBackends)"
|
| |
>
|
| |
All Backends
|
| |
</Checkbox>
|
| |
@@ -887,13 +1053,19 @@
|
| |
controlId="memberOfEntryScopeExcludeSubtree"
|
| |
disabled={false}
|
| |
>
|
| |
- <Col componentClass={ControlLabel} sm={3}>
|
| |
+ <Col
|
| |
+ componentClass={ControlLabel}
|
| |
+ sm={3}
|
| |
+ title="Specifies backends or multiple-nested suffixes for the MemberOf plug-in to exclude (memberOfEntryScopeExcludeSubtree)"
|
| |
+ >
|
| |
Entry Scope Exclude Subtree
|
| |
</Col>
|
| |
<Col sm={6}>
|
| |
<FormControl
|
| |
type="text"
|
| |
- value={memberOfEntryScopeExcludeSubtree}
|
| |
+ value={
|
| |
+ memberOfEntryScopeExcludeSubtree
|
| |
+ }
|
| |
onChange={this.handleFieldChange}
|
| |
/>
|
| |
</Col>
|
| |
@@ -902,6 +1074,7 @@
|
| |
id="memberOfSkipNested"
|
| |
checked={memberOfSkipNested}
|
| |
onChange={this.handleCheckboxChange}
|
| |
+ title="Specifies wherher to skip nested groups or not (memberOfSkipNested)"
|
| |
>
|
| |
Skip Nested
|
| |
</Checkbox>
|
| |
@@ -917,7 +1090,11 @@
|
| |
key="memberOfConfigEntry"
|
| |
controlId="memberOfConfigEntry"
|
| |
>
|
| |
- <Col componentClass={ControlLabel} sm={3}>
|
| |
+ <Col
|
| |
+ componentClass={ControlLabel}
|
| |
+ sm={3}
|
| |
+ title="The value to set as nsslapd-pluginConfigArea"
|
| |
+ >
|
| |
Shared Config Entry
|
| |
</Col>
|
| |
<Col sm={6}>
|
| |
@@ -943,15 +1120,28 @@
|
| |
<Row>
|
| |
<Col sm={9}>
|
| |
<Form horizontal>
|
| |
- <FormGroup controlId="memberOfAutoAddOC" disabled={false}>
|
| |
- <Col sm={3}>
|
| |
+ <FormGroup
|
| |
+ controlId="memberOfAutoAddOC"
|
| |
+ disabled={false}
|
| |
+ >
|
| |
+ <Col
|
| |
+ sm={3}
|
| |
+ title="If an entry does not have an object class that allows the memberOf attribute then the memberOf plugin will automatically add the object class listed in the memberOfAutoAddOC parameter"
|
| |
+ >
|
| |
<ControlLabel>Auto Add OC</ControlLabel>
|
| |
</Col>
|
| |
<Col sm={9}>
|
| |
- <FormControl
|
| |
- type="text"
|
| |
- value={memberOfAutoAddOC}
|
| |
- onChange={this.handleFieldChange}
|
| |
+ <Typeahead
|
| |
+ allowNew
|
| |
+ onChange={value => {
|
| |
+ this.setState({
|
| |
+ memberOfAutoAddOC: value
|
| |
+ });
|
| |
+ }}
|
| |
+ selected={memberOfAutoAddOC}
|
| |
+ options={objectClasses}
|
| |
+ newSelectionPrefix="Add a memberOf objectClass: "
|
| |
+ placeholder="Type an objectClass..."
|
| |
/>
|
| |
</Col>
|
| |
</FormGroup>
|
| |
Description: Add UI plugin tabs for accountPolicy, attributeUniqueness,
linkedAttributes, referentialIntegrity, retroChangelog, rootDNAccessControl
and winsync.
Reorder the tabs to make the usage more intuitive.
Fix Attribute Uniqueness logging level issue.
Move pluginTable.jsx content to pluginTables.jsx.
Fix a small 'help' typo in dbtasks.py.
https://pagure.io/389-ds-base/issue/50041
Reviewed by: ?