mirror of
https://github.com/zulip/zulip.git
synced 2025-10-26 17:43:58 +00:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
49ff894d6a | ||
|
|
f3e75b6b5f | ||
|
|
6b9f37dc8f | ||
|
|
cd926b8aae |
@@ -7,6 +7,15 @@ All notable changes to the Zulip server are documented in this file.
|
|||||||
This section lists notable unreleased changes; it is generally updated
|
This section lists notable unreleased changes; it is generally updated
|
||||||
in bursts.
|
in bursts.
|
||||||
|
|
||||||
|
### 2.1.1 -- 2019-12-13
|
||||||
|
|
||||||
|
- Fixed upgrading to 2.1.x with the LDAP integration enabled in a
|
||||||
|
configuration where `AUTH_LDAP_REVERSE_EMAIL_SEARCH` is newly
|
||||||
|
required, but is not set yet.
|
||||||
|
- Reimplemented --postgres-missing-dictionaries installer option,
|
||||||
|
used with our new support for a DBaaS managed database.
|
||||||
|
- Improved documentation for `AUTH_LDAP_REVERSE_EMAIL_SEARCH`.
|
||||||
|
|
||||||
### 2.1.0 -- 2019-12-12
|
### 2.1.0 -- 2019-12-12
|
||||||
|
|
||||||
**Highlights:**
|
**Highlights:**
|
||||||
|
|||||||
@@ -176,29 +176,33 @@ In either configuration, you will need to do the following:
|
|||||||
the form it needs for authentication. There are three supported
|
the form it needs for authentication. There are three supported
|
||||||
ways to set up the username and/or email mapping:
|
ways to set up the username and/or email mapping:
|
||||||
|
|
||||||
(A) Using email addresses as usernames, if LDAP has each user's
|
(A) Using email addresses as Zulip usernames, if LDAP has each
|
||||||
email address. To do this, just set `AUTH_LDAP_USER_SEARCH` to
|
user's email address:
|
||||||
query by email address.
|
* Make `AUTH_LDAP_USER_SEARCH` a query by email address.
|
||||||
|
* Set `AUTH_LDAP_REVERSE_EMAIL_SEARCH` to the same query with
|
||||||
|
`%(email)s` rather than `%(user)s` as the search parameter.
|
||||||
|
* Set `AUTH_LDAP_USERNAME_ATTR` to the name of the LDAP
|
||||||
|
attribute for the user's LDAP username in the search result
|
||||||
|
for `AUTH_LDAP_REVERSE_EMAIL_SEARCH`.
|
||||||
|
|
||||||
(B) Using LDAP usernames as Zulip usernames, with email addresses
|
(B) Using LDAP usernames as Zulip usernames, with email addresses
|
||||||
formed consistently like `sam` -> `sam@example.com`. To do
|
formed consistently like `sam` -> `sam@example.com`:
|
||||||
this, set `AUTH_LDAP_USER_SEARCH` to query by LDAP username, and
|
* Set `AUTH_LDAP_USER_SEARCH` to query by LDAP username
|
||||||
`LDAP_APPEND_DOMAIN = "example.com"`.
|
* Set `LDAP_APPEND_DOMAIN = "example.com"`.
|
||||||
|
|
||||||
(C) Using LDAP usernames as Zulip usernames, with email addresses
|
(C) Using LDAP usernames as Zulip usernames, with email addresses
|
||||||
taken from some other attribute in LDAP (for example, `email`).
|
taken from some other attribute in LDAP (for example, `mail`):
|
||||||
To do this, set `AUTH_LDAP_USER_SEARCH` to query by LDAP
|
* Set `AUTH_LDAP_USER_SEARCH` to query by LDAP username
|
||||||
username, and `LDAP_EMAIL_ATTR = "email"`.
|
* Set `LDAP_EMAIL_ATTR = "mail"`.
|
||||||
|
* Set `AUTH_LDAP_REVERSE_EMAIL_SEARCH` to a query that will find
|
||||||
1. In configurations (A) and (C), you need to tell Zulip how to look
|
an LDAP user given their email address (i.e. a search by
|
||||||
up a user's LDAP data given their user's email address:
|
`LDAP_EMAIL_ATTR`). For example:
|
||||||
|
```
|
||||||
* Set `AUTH_LDAP_REVERSE_EMAIL_SEARCH` to a query that will find an
|
AUTH_LDAP_REVERSE_EMAIL_SEARCH = LDAPSearch("ou=users,dc=example,dc=com",
|
||||||
LDAP user given their email address. Generally, this will be
|
ldap.SCOPE_SUBTREE, "(mail=%(email)s)")
|
||||||
`AUTH_LDAP_USER_SEARCH` in configuration (A) or a search by
|
```
|
||||||
`LDAP_EMAIL_ATTR` in configuration (C).
|
* Set `AUTH_LDAP_USERNAME_ATTR` to the name of the LDAP
|
||||||
* Set `AUTH_LDAP_USERNAME_ATTR` to the name of the LDAP attribute
|
attribute for the user's LDAP username in that search result.
|
||||||
for the user's LDAP username in that search result.
|
|
||||||
|
|
||||||
You can quickly test whether your configuration works by running:
|
You can quickly test whether your configuration works by running:
|
||||||
|
|
||||||
@@ -210,24 +214,29 @@ from the root of your Zulip installation. If your configuration is
|
|||||||
working, that will output the full name for your user (and that user's
|
working, that will output the full name for your user (and that user's
|
||||||
email address, if it isn't the same as the "Zulip username").
|
email address, if it isn't the same as the "Zulip username").
|
||||||
|
|
||||||
**Active Directory**: For Active Directory, one typically sets
|
**Active Directory**: Most Active Directory installations will use one
|
||||||
`AUTH_LDAP_USER_SEARCH` to one of:
|
of the following configurations:
|
||||||
|
|
||||||
* To access by Active Directory username:
|
* To access by Active Directory username:
|
||||||
```
|
```
|
||||||
AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=users,dc=example,dc=com",
|
AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=users,dc=example,dc=com",
|
||||||
ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)")
|
ldap.SCOPE_SUBTREE, "(sAMAccountName=%(user)s)")
|
||||||
|
AUTH_LDAP_REVERSE_EMAIL_SEARCH = LDAPSearch("ou=users,dc=example,dc=com",
|
||||||
|
ldap.SCOPE_SUBTREE, "(mail=%(email)s)")
|
||||||
```
|
```
|
||||||
|
|
||||||
* To access by Active Directory email address:
|
* To access by Active Directory email address:
|
||||||
```
|
```
|
||||||
AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=users,dc=example,dc=com",
|
AUTH_LDAP_USER_SEARCH = LDAPSearch("ou=users,dc=example,dc=com",
|
||||||
ldap.SCOPE_SUBTREE, "(mail=%(user)s)")
|
ldap.SCOPE_SUBTREE, "(mail=%(user)s)")
|
||||||
|
AUTH_LDAP_REVERSE_EMAIL_SEARCH = LDAPSearch("ou=users,dc=example,dc=com",
|
||||||
|
ldap.SCOPE_SUBTREE, "(mail=%(email)s)")
|
||||||
```
|
```
|
||||||
|
|
||||||
**If you are using LDAP for authentication**: you will need to enable
|
**If you are using LDAP for authentication**: you will need to enable
|
||||||
the `zproject.backends.ZulipLDAPAuthBackend` auth backend, in
|
the `zproject.backends.ZulipLDAPAuthBackend` auth backend, in
|
||||||
`AUTHENTICATION_BACKENDS` in `/etc/zulip/settings.py`. After doing
|
`AUTHENTICATION_BACKENDS` in `/etc/zulip/settings.py`. After doing so
|
||||||
so (and as always [restarting the Zulip server](settings.md) to ensure
|
(and as always [restarting the Zulip server](settings.md) to ensure
|
||||||
your settings changes take effect), you should be able to log into
|
your settings changes take effect), you should be able to log into
|
||||||
Zulip by entering your email address and LDAP password on the Zulip
|
Zulip by entering your email address and LDAP password on the Zulip
|
||||||
login form.
|
login form.
|
||||||
|
|||||||
@@ -134,14 +134,11 @@ follows:
|
|||||||
postgres_password = abcd1234
|
postgres_password = abcd1234
|
||||||
```
|
```
|
||||||
|
|
||||||
Now complete the installation by running the following command to ask
|
Now complete the installation by running the following commands.
|
||||||
the Zulip installer to initialize the postgres database. (Note: The
|
|
||||||
options are different from before).
|
|
||||||
|
|
||||||
```
|
```
|
||||||
./zulip-server-*/scripts/setup/install --certbot \
|
# Ask Zulip installer to initialize the postgres database.
|
||||||
--email=YOUR_EMAIL --hostname=YOUR_HOSTNAME \
|
su zulip -c '/home/zulip/deployments/current/scripts/setup/initialize-database'
|
||||||
--remote-postgres --postgres-missing-dictionaries
|
|
||||||
|
|
||||||
# And then generate a realm creation link:
|
# And then generate a realm creation link:
|
||||||
su zulip -c '/home/zulip/deployments/current/manage.py generate_realm_creation_link'
|
su zulip -c '/home/zulip/deployments/current/manage.py generate_realm_creation_link'
|
||||||
|
|||||||
@@ -280,7 +280,7 @@ if [ "$DEPLOYMENT_TYPE" = "dockervoyager" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$POSTGRES_MISSING_DICTIONARIES" ]; then
|
if [ -n "$POSTGRES_MISSING_DICTIONARIES" ]; then
|
||||||
export POSTGRES_MISSING_DICTIONARIES="true"
|
crudini --set /etc/zulip/zulip.conf postgresql missing_dictionaries true
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -n "$REMOTE_POSTGRES" ]; then
|
if [ -n "$REMOTE_POSTGRES" ]; then
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import os
|
import os
|
||||||
|
|
||||||
ZULIP_VERSION = "2.1.0"
|
ZULIP_VERSION = "2.1.1"
|
||||||
# Add information on number of commits and commit hash to version, if available
|
# Add information on number of commits and commit hash to version, if available
|
||||||
zulip_git_version_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'zulip-git-version')
|
zulip_git_version_file = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'zulip-git-version')
|
||||||
if os.path.exists(zulip_git_version_file):
|
if os.path.exists(zulip_git_version_file):
|
||||||
@@ -10,7 +10,7 @@ if os.path.exists(zulip_git_version_file):
|
|||||||
ZULIP_VERSION = version
|
ZULIP_VERSION = version
|
||||||
|
|
||||||
LATEST_MAJOR_VERSION = "2.1"
|
LATEST_MAJOR_VERSION = "2.1"
|
||||||
LATEST_RELEASE_VERSION = "2.1.0"
|
LATEST_RELEASE_VERSION = "2.1.1"
|
||||||
LATEST_RELEASE_ANNOUNCEMENT = "https://blog.zulip.org/2019/12/13/zulip-2-1-released/"
|
LATEST_RELEASE_ANNOUNCEMENT = "https://blog.zulip.org/2019/12/13/zulip-2-1-released/"
|
||||||
|
|
||||||
# Bump the minor PROVISION_VERSION to indicate that folks should provision
|
# Bump the minor PROVISION_VERSION to indicate that folks should provision
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Generated by Django 1.11.2 on 2017-06-22 10:22
|
# Generated by Django 1.11.2 on 2017-06-22 10:22
|
||||||
import os
|
|
||||||
|
|
||||||
import bitfield.models
|
import bitfield.models
|
||||||
import django.contrib.auth.models
|
import django.contrib.auth.models
|
||||||
@@ -37,12 +36,11 @@ class Migration(migrations.Migration):
|
|||||||
|
|
||||||
initial = True
|
initial = True
|
||||||
|
|
||||||
zulip_postgres_dictionaries_unavailable = os.getenv("POSTGRES_MISSING_DICTIONARIES", False)
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
('auth', '0001_initial'),
|
('auth', '0001_initial'),
|
||||||
]
|
]
|
||||||
|
|
||||||
if zulip_postgres_dictionaries_unavailable:
|
if settings.POSTGRES_MISSING_DICTIONARIES:
|
||||||
fts_sql = """
|
fts_sql = """
|
||||||
CREATE TEXT SEARCH CONFIGURATION zulip.english_us_search (COPY=pg_catalog.english);
|
CREATE TEXT SEARCH CONFIGURATION zulip.english_us_search (COPY=pg_catalog.english);
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -3,7 +3,6 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth import get_backends
|
|
||||||
from django.db import migrations
|
from django.db import migrations
|
||||||
from django.db.backends.postgresql_psycopg2.schema import DatabaseSchemaEditor
|
from django.db.backends.postgresql_psycopg2.schema import DatabaseSchemaEditor
|
||||||
from django.db.migrations.state import StateApps
|
from django.db.migrations.state import StateApps
|
||||||
@@ -13,7 +12,6 @@ from django.utils.timezone import now as timezone_now
|
|||||||
from zerver.lib.cache import cache_delete, user_profile_by_api_key_cache_key
|
from zerver.lib.cache import cache_delete, user_profile_by_api_key_cache_key
|
||||||
from zerver.lib.queue import queue_json_publish
|
from zerver.lib.queue import queue_json_publish
|
||||||
from zerver.lib.utils import generate_api_key
|
from zerver.lib.utils import generate_api_key
|
||||||
from zproject.backends import EmailAuthBackend
|
|
||||||
|
|
||||||
from typing import Any, Set, Union
|
from typing import Any, Set, Union
|
||||||
|
|
||||||
@@ -159,8 +157,7 @@ def ensure_no_empty_passwords(apps: StateApps, schema_editor: DatabaseSchemaEdit
|
|||||||
# If Zulip's built-in password authentication is not enabled on
|
# If Zulip's built-in password authentication is not enabled on
|
||||||
# the server level, then we plan to skip resetting any users' API
|
# the server level, then we plan to skip resetting any users' API
|
||||||
# keys, since the bug requires EmailAuthBackend.
|
# keys, since the bug requires EmailAuthBackend.
|
||||||
email_auth_enabled = any(isinstance(backend, EmailAuthBackend)
|
email_auth_enabled = 'zproject.backends.EmailAuthBackend' in settings.AUTHENTICATION_BACKENDS
|
||||||
for backend in get_backends())
|
|
||||||
|
|
||||||
# A quick note: This query could in theory exclude users with
|
# A quick note: This query could in theory exclude users with
|
||||||
# is_active=False, is_bot=True, or realm__deactivated=True here to
|
# is_active=False, is_bot=True, or realm__deactivated=True here to
|
||||||
|
|||||||
@@ -293,6 +293,8 @@ elif REMOTE_POSTGRES_HOST != '':
|
|||||||
else:
|
else:
|
||||||
DATABASES['default']['OPTIONS']['sslmode'] = 'verify-full'
|
DATABASES['default']['OPTIONS']['sslmode'] = 'verify-full'
|
||||||
|
|
||||||
|
POSTGRES_MISSING_DICTIONARIES = bool(get_config('postgresql', 'missing_dictionaries', None))
|
||||||
|
|
||||||
########################################################################
|
########################################################################
|
||||||
# RABBITMQ CONFIGURATION
|
# RABBITMQ CONFIGURATION
|
||||||
########################################################################
|
########################################################################
|
||||||
|
|||||||
Reference in New Issue
Block a user