mirror of https://github.com/zulip/zulip.git
docs: Add missing space to compound verbs “back up”, “log in”, etc.
Noun: backup, login, logout, lookup, setup. Verb: back up, log in, log out, look up, set up. Signed-off-by: Anders Kaseorg <anders@zulip.com>
This commit is contained in:
parent
b0ce4f1bce
commit
e1f42c1ac5
|
@ -108,7 +108,7 @@ See our guide on [writing help center articles](helpcenter.md).
|
||||||
### Integrations documentation
|
### Integrations documentation
|
||||||
|
|
||||||
Zulip's [integrations documentation](https://zulip.com/integrations)
|
Zulip's [integrations documentation](https://zulip.com/integrations)
|
||||||
is user-facing documentation explaining to end users how to setup each
|
is user-facing documentation explaining to end users how to set up each
|
||||||
of Zulip's more than 100 integrations. There is a detailed [guide on
|
of Zulip's more than 100 integrations. There is a detailed [guide on
|
||||||
documenting integrations](integrations.md), including style guidelines
|
documenting integrations](integrations.md), including style guidelines
|
||||||
to ensure that the documentation is high quality and consistent.
|
to ensure that the documentation is high quality and consistent.
|
||||||
|
|
|
@ -566,7 +566,7 @@ to the root and `engineering` subdomains:
|
||||||
|
|
||||||
4. If you want to sign SAML requests, you have to do two things in Keycloak:
|
4. If you want to sign SAML requests, you have to do two things in Keycloak:
|
||||||
|
|
||||||
1. In the Keycloak client settings you setup previously, open the
|
1. In the Keycloak client settings you set up previously, open the
|
||||||
`Settings` tab and **enable** `Client Signature Required`.
|
`Settings` tab and **enable** `Client Signature Required`.
|
||||||
2. Keycloak can generate the Client private key and certificate
|
2. Keycloak can generate the Client private key and certificate
|
||||||
automatically, but Zulip's SAML library does not support the
|
automatically, but Zulip's SAML library does not support the
|
||||||
|
@ -636,7 +636,7 @@ another IdP.
|
||||||
logging out from Zulip, logging back in using SAML, and then using
|
logging out from Zulip, logging back in using SAML, and then using
|
||||||
the SAML logout feature from KeyCloak. Check
|
the SAML logout feature from KeyCloak. Check
|
||||||
`/var/log/zulip/errors.log` for error output if it doesn't work.
|
`/var/log/zulip/errors.log` for error output if it doesn't work.
|
||||||
1. Once SAML logout is working for you, you can use the `manage.py logout_all_users` management command to logout all users so that
|
1. Once SAML logout is working for you, you can use the `manage.py logout_all_users` management command to log out all users so that
|
||||||
SAML logout works for everyone.
|
SAML logout works for everyone.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
@ -837,9 +837,9 @@ Note that `SOCIAL_AUTH_OIDC_ENABLED_IDPS` only supports a single IdP currently.
|
||||||
The Return URL to authorize with the provider is
|
The Return URL to authorize with the provider is
|
||||||
`https://yourzulipdomain.example.com/complete/oidc/`.
|
`https://yourzulipdomain.example.com/complete/oidc/`.
|
||||||
|
|
||||||
By default, users who attempt to login with OIDC using an email
|
By default, users who attempt to log in with OIDC using an email
|
||||||
address that does not have a current Zulip account will be prompted
|
address that does not have a current Zulip account will be prompted
|
||||||
for whether they intend to create a new account or would like to login
|
for whether they intend to create a new account or would like to log in
|
||||||
using another authentication method. You can configure automatic
|
using another authentication method. You can configure automatic
|
||||||
account creation on first login attempt by setting
|
account creation on first login attempt by setting
|
||||||
`"auto_signup": True` in the IdP configuration dictionary.
|
`"auto_signup": True` in the IdP configuration dictionary.
|
||||||
|
|
|
@ -25,12 +25,12 @@ feature to billing.
|
||||||
|
|
||||||
### Setup
|
### Setup
|
||||||
|
|
||||||
Apart from the common setup mentioned above, you also need to setup your
|
Apart from the common setup mentioned above, you also need to set up your
|
||||||
development environment to receive webhook events from Stripe.
|
development environment to receive webhook events from Stripe.
|
||||||
|
|
||||||
- Install the Stripe CLI locally by following the instructions
|
- Install the Stripe CLI locally by following the instructions
|
||||||
[here](https://stripe.com/docs/webhooks/test).
|
[here](https://stripe.com/docs/webhooks/test).
|
||||||
- Login to Stripe CLI using the command `stripe login`.
|
- Log in to Stripe CLI using the command `stripe login`.
|
||||||
- You can get Stripe CLI to forward all Stripe webhook events to our local
|
- You can get Stripe CLI to forward all Stripe webhook events to our local
|
||||||
webhook endpoint using the following command:
|
webhook endpoint using the following command:
|
||||||
`stripe listen --forward-to http://localhost:9991/stripe/webhook/`
|
`stripe listen --forward-to http://localhost:9991/stripe/webhook/`
|
||||||
|
|
|
@ -321,7 +321,7 @@ def add_cert_to_pipconf() -> None:
|
||||||
|
|
||||||
def do_setup_virtualenv(venv_path: str, requirements_file: str) -> None:
|
def do_setup_virtualenv(venv_path: str, requirements_file: str) -> None:
|
||||||
|
|
||||||
# Setup Python virtualenv
|
# Set up Python virtualenv
|
||||||
new_packages = set(get_package_names(requirements_file))
|
new_packages = set(get_package_names(requirements_file))
|
||||||
|
|
||||||
run_as_root(["rm", "-rf", venv_path])
|
run_as_root(["rm", "-rf", venv_path])
|
||||||
|
|
|
@ -203,7 +203,7 @@ if not os.path.exists(os.path.join(deploy_path, "zproject/prod_settings.py")):
|
||||||
# zulip<1.4.0, we need to do it. See discussion in commit 586b23637.
|
# zulip<1.4.0, we need to do it. See discussion in commit 586b23637.
|
||||||
os.symlink("/etc/zulip/settings.py", os.path.join(deploy_path, "zproject/prod_settings.py"))
|
os.symlink("/etc/zulip/settings.py", os.path.join(deploy_path, "zproject/prod_settings.py"))
|
||||||
|
|
||||||
# Now we should have an environment setup where we can run our tools;
|
# Now we should have an environment set up where we can run our tools;
|
||||||
# first, creating the production venv.
|
# first, creating the production venv.
|
||||||
subprocess.check_call(
|
subprocess.check_call(
|
||||||
[os.path.join(deploy_path, "scripts", "lib", "create-production-venv"), deploy_path]
|
[os.path.join(deploy_path, "scripts", "lib", "create-production-venv"), deploy_path]
|
||||||
|
|
|
@ -1139,7 +1139,7 @@ export class MessageListView {
|
||||||
const message_group_id = recipient_row.attr("id");
|
const message_group_id = recipient_row.attr("id");
|
||||||
|
|
||||||
// Since there might be multiple dates within the message
|
// Since there might be multiple dates within the message
|
||||||
// group, it's important to lookup the original/full message
|
// group, it's important to look up the original/full message
|
||||||
// group rather than doing an artificial rerendering of the
|
// group rather than doing an artificial rerendering of the
|
||||||
// message header from the set of message containers passed in
|
// message header from the set of message containers passed in
|
||||||
// here.
|
// here.
|
||||||
|
|
|
@ -64,7 +64,7 @@ function compare_by_huddle(huddle) {
|
||||||
return person && person.user_id;
|
return person && person.user_id;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Construct dict for all huddles, so we can lookup each's recency
|
// Construct dict for all huddles, so we can look up each's recency
|
||||||
const huddles = huddle_data.get_huddles();
|
const huddles = huddle_data.get_huddles();
|
||||||
const huddle_dict = new Map();
|
const huddle_dict = new Map();
|
||||||
for (const [i, huddle] of huddles.entries()) {
|
for (const [i, huddle] of huddles.entries()) {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
// Module for displaying the modal asking spectators to login when
|
// Module for displaying the modal asking spectators to log in when
|
||||||
// attempting to do things that are not possible as a spectator (like
|
// attempting to do things that are not possible as a spectator (like
|
||||||
// add an emoji reaction, star a message, etc.). While in many cases,
|
// add an emoji reaction, star a message, etc.). While in many cases,
|
||||||
// we will prefer to hide menu options that don't make sense for
|
// we will prefer to hide menu options that don't make sense for
|
||||||
|
|
|
@ -193,14 +193,14 @@ export class TopicListWidget {
|
||||||
input.trigger("focus");
|
input.trigger("focus");
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup display of clear(x) button.
|
// set up display of clear(x) button.
|
||||||
if (this.topic_search_text.length) {
|
if (this.topic_search_text.length) {
|
||||||
$("#clear_search_topic_button").show();
|
$("#clear_search_topic_button").show();
|
||||||
} else {
|
} else {
|
||||||
$("#clear_search_topic_button").hide();
|
$("#clear_search_topic_button").hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
// setup event handlers.
|
// set up event handlers.
|
||||||
const rebuild_list = () => this.build();
|
const rebuild_list = () => this.build();
|
||||||
input.on("input", rebuild_list);
|
input.on("input", rebuild_list);
|
||||||
}
|
}
|
||||||
|
|
|
@ -436,7 +436,7 @@
|
||||||
Zulip Cloud is built with <a href="/privacy/">privacy</a> and <a href="/security/">security</a> in mind, and is used by some of the most security-conscious organizations in the world.
|
Zulip Cloud is built with <a href="/privacy/">privacy</a> and <a href="/security/">security</a> in mind, and is used by some of the most security-conscious organizations in the world.
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
<li><div class="list-content">Zulip is <a href="https://github.com/zulip">100% open-source software</a>, with no "open core" catch. We work hard to make it <a href="https://zulip.readthedocs.io/en/latest/production/install.html">easy to set up</a>, <a href="https://zulip.readthedocs.io/en/stable/production/export-and-import.html#backups">backup</a>, and <a href="https://zulip.readthedocs.io/en/stable/production/upgrade-or-modify.html">maintain</a> a self-hosted Zulip installation, where you have full control of your data.</div></li>
|
<li><div class="list-content">Zulip is <a href="https://github.com/zulip">100% open-source software</a>, with no "open core" catch. We work hard to make it <a href="https://zulip.readthedocs.io/en/latest/production/install.html">easy to set up</a>, <a href="https://zulip.readthedocs.io/en/stable/production/export-and-import.html#backups">back up</a>, and <a href="https://zulip.readthedocs.io/en/stable/production/upgrade-or-modify.html">maintain</a> a self-hosted Zulip installation, where you have full control of your data.</div></li>
|
||||||
<li><div class="list-content">Move your data with our high quality <a href="/help/export-your-organization">export</a> and <a href="https://zulip.readthedocs.io/en/latest/production/export-and-import.html">import</a> tools; you are never locked into a proprietary tool.</div></li>
|
<li><div class="list-content">Move your data with our high quality <a href="/help/export-your-organization">export</a> and <a href="https://zulip.readthedocs.io/en/latest/production/export-and-import.html">import</a> tools; you are never locked into a proprietary tool.</div></li>
|
||||||
<li><div class="list-content">Zulip is built for scale and works reliably for organizations with thousands of users online at once with <a href="https://zulip.readthedocs.io/en/stable/production/requirements.html#scalability">modest hardware</a>.</div></li>
|
<li><div class="list-content">Zulip is built for scale and works reliably for organizations with thousands of users online at once with <a href="https://zulip.readthedocs.io/en/stable/production/requirements.html#scalability">modest hardware</a>.</div></li>
|
||||||
<li>
|
<li>
|
||||||
|
|
|
@ -109,7 +109,7 @@ the user will get to choose which playground to open the code in.
|
||||||
programming language. The language tag for a code block is internally mapped
|
programming language. The language tag for a code block is internally mapped
|
||||||
to these human-readable Pygments names; e.g., `py3` and `py` are mapped to
|
to these human-readable Pygments names; e.g., `py3` and `py` are mapped to
|
||||||
`Python`. One can use the typeahead (which appears when you type something
|
`Python`. One can use the typeahead (which appears when you type something
|
||||||
or just click on the language field) to lookup the Pygments name.
|
or just click on the language field) to look up the Pygments name.
|
||||||
|
|
||||||
* The links for opening code playgrounds are always constructed by concatenating
|
* The links for opening code playgrounds are always constructed by concatenating
|
||||||
the provided URL prefix with the URL-encoded contents of the code block.
|
the provided URL prefix with the URL-encoded contents of the code block.
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
* Zulip is [100% open-source software](https://github.com/zulip), with no "open core" catch.
|
* Zulip is [100% open-source software](https://github.com/zulip), with no "open core" catch.
|
||||||
* We work hard to make it easy to [set up][install-zulip],
|
* We work hard to make it easy to [set up][install-zulip],
|
||||||
[backup][backup-zulip], and [maintain][maintain-zulip] a self-hosted
|
[back up][back-up-zulip], and [maintain][maintain-zulip] a self-hosted
|
||||||
Zulip installation.
|
Zulip installation.
|
||||||
* Retain full control over your data.
|
* Retain full control over your data.
|
||||||
* Customize Zulip for all your needs.
|
* Customize Zulip for all your needs.
|
||||||
|
|
||||||
[install-zulip]: https://zulip.readthedocs.io/en/latest/production/install.html
|
[install-zulip]: https://zulip.readthedocs.io/en/latest/production/install.html
|
||||||
[backup-zulip]: https://zulip.readthedocs.io/en/stable/production/export-and-import.html#backups
|
[back-up-zulip]: https://zulip.readthedocs.io/en/stable/production/export-and-import.html#backups
|
||||||
[maintain-zulip]: https://zulip.readthedocs.io/en/stable/production/upgrade-or-modify.html
|
[maintain-zulip]: https://zulip.readthedocs.io/en/stable/production/upgrade-or-modify.html
|
||||||
|
|
|
@ -4,7 +4,7 @@ Zulip supports using SAML authentication for single sign-on, both when
|
||||||
self-hosting or on the Zulip Cloud Plus plan.
|
self-hosting or on the Zulip Cloud Plus plan.
|
||||||
|
|
||||||
This page documents details on how to set up SAML authentication with
|
This page documents details on how to set up SAML authentication with
|
||||||
Zulip with various common SAML identity providers. Once you have setup
|
Zulip with various common SAML identity providers. Once you have set up
|
||||||
SAML, you may also want to consider configuring [SCIM](/help/scim).
|
SAML, you may also want to consider configuring [SCIM](/help/scim).
|
||||||
|
|
||||||
If you are self-hosting, this documentation is likely still useful for
|
If you are self-hosting, this documentation is likely still useful for
|
||||||
|
|
|
@ -12,7 +12,7 @@ The instructions below explain how to configure SCIM in Okta for Zulip
|
||||||
Cloud customers. Like SAML, feature is currently only available in
|
Cloud customers. Like SAML, feature is currently only available in
|
||||||
Zulip Cloud with the Zulip Cloud Plus plan.
|
Zulip Cloud with the Zulip Cloud Plus plan.
|
||||||
|
|
||||||
These instructions can also be used by self-hosters to setup the Okta
|
These instructions can also be used by self-hosters to set up the Okta
|
||||||
side of SCIM for their deployment.
|
side of SCIM for their deployment.
|
||||||
|
|
||||||
## Configure SCIM with Okta
|
## Configure SCIM with Okta
|
||||||
|
|
|
@ -62,7 +62,7 @@ ensure you can always move from our hosting to yours (and back).
|
||||||
* Zulip is [100% open-source software](https://github.com/zulip), with
|
* Zulip is [100% open-source software](https://github.com/zulip), with
|
||||||
no "open core" catch.
|
no "open core" catch.
|
||||||
* We work hard to make it easy to [set up][install-zulip],
|
* We work hard to make it easy to [set up][install-zulip],
|
||||||
[backup][backup-zulip], and [maintain][maintain-zulip] a self-hosted
|
[back up][back-up-zulip], and [maintain][maintain-zulip] a self-hosted
|
||||||
Zulip installation.
|
Zulip installation.
|
||||||
* Retain full control over your data. If cloud hosting is not an
|
* Retain full control over your data. If cloud hosting is not an
|
||||||
option due to stringent data and privacy requirements (e.g. in the
|
option due to stringent data and privacy requirements (e.g. in the
|
||||||
|
@ -70,7 +70,7 @@ ensure you can always move from our hosting to yours (and back).
|
||||||
* Customize Zulip for all your needs.
|
* Customize Zulip for all your needs.
|
||||||
|
|
||||||
[install-zulip]: https://zulip.readthedocs.io/en/latest/production/install.html
|
[install-zulip]: https://zulip.readthedocs.io/en/latest/production/install.html
|
||||||
[backup-zulip]: https://zulip.readthedocs.io/en/stable/production/export-and-import.html#backups
|
[back-up-zulip]: https://zulip.readthedocs.io/en/stable/production/export-and-import.html#backups
|
||||||
[maintain-zulip]: https://zulip.readthedocs.io/en/stable/production/upgrade-or-modify.html
|
[maintain-zulip]: https://zulip.readthedocs.io/en/stable/production/upgrade-or-modify.html
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,7 @@ realms used for testing; consider using deactivate_realm instead."""
|
||||||
if settings.BILLING_ENABLED:
|
if settings.BILLING_ENABLED:
|
||||||
# Deleting a Realm object also deletes associating billing
|
# Deleting a Realm object also deletes associating billing
|
||||||
# metadata in an invariant-violating way, so we should
|
# metadata in an invariant-violating way, so we should
|
||||||
# never use this tool for a realm with billing setup.
|
# never use this tool for a realm with billing set up.
|
||||||
from corporate.models import CustomerPlan, get_customer_by_realm
|
from corporate.models import CustomerPlan, get_customer_by_realm
|
||||||
|
|
||||||
customer = get_customer_by_realm(realm)
|
customer = get_customer_by_realm(realm)
|
||||||
|
|
|
@ -2458,7 +2458,7 @@ class SAMLAuthBackendTest(SocialAuthBase):
|
||||||
self.assertEqual(result.url, realm.uri + "/register/")
|
self.assertEqual(result.url, realm.uri + "/register/")
|
||||||
|
|
||||||
def test_social_auth_saml_multiple_idps_configured(self) -> None:
|
def test_social_auth_saml_multiple_idps_configured(self) -> None:
|
||||||
# Setup a new SOCIAL_AUTH_SAML_ENABLED_IDPS dict with two idps.
|
# Set up a new SOCIAL_AUTH_SAML_ENABLED_IDPS dict with two idps.
|
||||||
# We deepcopy() dictionaries around for the sake of brevity,
|
# We deepcopy() dictionaries around for the sake of brevity,
|
||||||
# to avoid having to spell them out explicitly here.
|
# to avoid having to spell them out explicitly here.
|
||||||
# The second idp's configuration is a copy of the first one,
|
# The second idp's configuration is a copy of the first one,
|
||||||
|
@ -4884,7 +4884,7 @@ class TestTwoFactor(ZulipTestCase):
|
||||||
|
|
||||||
mock_totp.side_effect = totp
|
mock_totp.side_effect = totp
|
||||||
|
|
||||||
# Setup LDAP
|
# Set up LDAP
|
||||||
self.init_default_ldap_database()
|
self.init_default_ldap_database()
|
||||||
ldap_user_attr_map = {"full_name": "cn"}
|
ldap_user_attr_map = {"full_name": "cn"}
|
||||||
with self.settings(
|
with self.settings(
|
||||||
|
|
|
@ -928,7 +928,7 @@ class RestartEventsTest(ZulipTestCase):
|
||||||
hamlet = self.example_user("hamlet")
|
hamlet = self.example_user("hamlet")
|
||||||
realm = hamlet.realm
|
realm = hamlet.realm
|
||||||
|
|
||||||
# Setup an empty event queue
|
# Set up an empty event queue
|
||||||
clear_client_event_queues_for_testing()
|
clear_client_event_queues_for_testing()
|
||||||
|
|
||||||
queue_data = dict(
|
queue_data = dict(
|
||||||
|
|
|
@ -313,7 +313,7 @@ class HomeTest(ZulipTestCase):
|
||||||
self.assertEqual(result.status_code, 302)
|
self.assertEqual(result.status_code, 302)
|
||||||
self.assertEqual(result.url, "/login/")
|
self.assertEqual(result.url, "/login/")
|
||||||
|
|
||||||
# Tell server that user wants to login anonymously
|
# Tell server that user wants to log in anonymously
|
||||||
# Redirects to load webapp.
|
# Redirects to load webapp.
|
||||||
realm = get_realm("zulip")
|
realm = get_realm("zulip")
|
||||||
result = self.client_post("/", {"prefers_web_public_view": "true"})
|
result = self.client_post("/", {"prefers_web_public_view": "true"})
|
||||||
|
|
|
@ -1858,7 +1858,7 @@ class GitHubAuthBackend(SocialAuthMixin, GithubOAuth2):
|
||||||
]
|
]
|
||||||
|
|
||||||
def get_verified_emails(self, realm: Realm, *args: Any, **kwargs: Any) -> List[str]:
|
def get_verified_emails(self, realm: Realm, *args: Any, **kwargs: Any) -> List[str]:
|
||||||
# We only let users login using email addresses that are
|
# We only let users log in using email addresses that are
|
||||||
# verified by GitHub, because the whole point is for the user
|
# verified by GitHub, because the whole point is for the user
|
||||||
# to demonstrate that they control the target email address.
|
# to demonstrate that they control the target email address.
|
||||||
verified_emails: List[str] = []
|
verified_emails: List[str] = []
|
||||||
|
@ -2437,10 +2437,10 @@ class SAMLAuthBackend(SocialAuthMixin, SAMLAuth):
|
||||||
callback function without arguments, to delete the session. We're not
|
callback function without arguments, to delete the session. We're not
|
||||||
happy with that for two reasons:
|
happy with that for two reasons:
|
||||||
1. These implementations don't look at the NameID in the LogoutRequest, which
|
1. These implementations don't look at the NameID in the LogoutRequest, which
|
||||||
is not quite correct, as a LogoutRequest to logout user X can be delivered
|
is not quite correct, as a LogoutRequest to log out user X can be delivered
|
||||||
through any means, and doesn't need a session to be valid.
|
through any means, and doesn't need a session to be valid.
|
||||||
E.g. a backchannel logout request sent by the IdP wouldn't have a session cookie.
|
E.g. a backchannel logout request sent by the IdP wouldn't have a session cookie.
|
||||||
Also, hypothetically, a LogoutRequest to logout user Y shouldn't logout user X, even if the
|
Also, hypothetically, a LogoutRequest to log out user Y shouldn't log out user X, even if the
|
||||||
request is made with a session cookie belonging to user X.
|
request is made with a session cookie belonging to user X.
|
||||||
2. We want to revoke all sessions for the user, not just the current session
|
2. We want to revoke all sessions for the user, not just the current session
|
||||||
of the request, so after validating the LogoutRequest, we need to identify
|
of the request, so after validating the LogoutRequest, we need to identify
|
||||||
|
|
|
@ -195,8 +195,8 @@ AUTH_LDAP_USER_SEARCH = LDAPSearch(
|
||||||
"ou=users,dc=example,dc=com", ldap.SCOPE_SUBTREE, "(uid=%(user)s)"
|
"ou=users,dc=example,dc=com", ldap.SCOPE_SUBTREE, "(uid=%(user)s)"
|
||||||
)
|
)
|
||||||
|
|
||||||
## Configuration to lookup a user's LDAP data given their email address
|
## Configuration to look up a user's LDAP data given their email address
|
||||||
## (For Zulip reverse mapping). If users log in as e.g. "sam" when
|
## (for Zulip reverse mapping). If users log in as e.g. "sam" when
|
||||||
## their email address is "sam@example.com", set LDAP_APPEND_DOMAIN to
|
## their email address is "sam@example.com", set LDAP_APPEND_DOMAIN to
|
||||||
## "example.com". Otherwise, leave LDAP_APPEND_DOMAIN=None and set
|
## "example.com". Otherwise, leave LDAP_APPEND_DOMAIN=None and set
|
||||||
## AUTH_LDAP_REVERSE_EMAIL_SEARCH and AUTH_LDAP_USERNAME_ATTR below.
|
## AUTH_LDAP_REVERSE_EMAIL_SEARCH and AUTH_LDAP_USERNAME_ATTR below.
|
||||||
|
|
Loading…
Reference in New Issue