Skip to content

Commit

Permalink
Terms of Service: Add ability to update TOS and have users re-sign.
Browse files Browse the repository at this point in the history
Most directly useful for the migration to zulipchat.com.

Creates a new field in UserProfile to store the tos_version, as well as two
new settings TOS_VERSION and FIRST_TIME_TOS_TEMPLATE. We check for a version
mismatch between what the user has signed and the current
settings.TOS_VERSION whenever the user hits the home page, and redirect them
if needed.

Note that accounts_accept_terms.html and zerver.views.accounts_accept_terms
were unused before this commit (I'm guessing they are from the Dropbox
migration in 2014.)
  • Loading branch information
rishig committed Aug 13, 2016
1 parent 5725306 commit 4029e4c
Show file tree
Hide file tree
Showing 7 changed files with 19 additions and 17 deletions.
9 changes: 5 additions & 4 deletions zerver/lib/actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -277,12 +277,12 @@ def stream_name(stream):
send_event(event, bot_owner_userids(user_profile))

def do_create_user(email, password, realm, full_name, short_name,
active=True, bot_type=None, bot_owner=None,
active=True, bot_type=None, bot_owner=None, tos_version=None,
avatar_source=UserProfile.AVATAR_FROM_GRAVATAR,
default_sending_stream=None, default_events_register_stream=None,
default_all_public_streams=None, prereg_user=None,
newsletter_data=None):
# type: (text_type, text_type, Realm, text_type, text_type, bool, Optional[int], Optional[UserProfile], text_type, Optional[Stream], Optional[Stream], bool, Optional[PreregistrationUser], Optional[Dict[str, str]]) -> UserProfile
# type: (text_type, text_type, Realm, text_type, text_type, bool, Optional[int], Optional[UserProfile], Optional[text_type], text_type, Optional[Stream], Optional[Stream], bool, Optional[PreregistrationUser], Optional[Dict[str, str]]) -> UserProfile
event = {'type': 'user_created',
'timestamp': time.time(),
'full_name': full_name,
Expand All @@ -297,7 +297,7 @@ def do_create_user(email, password, realm, full_name, short_name,
user_profile = create_user(email=email, password=password, realm=realm,
full_name=full_name, short_name=short_name,
active=active, bot_type=bot_type, bot_owner=bot_owner,
avatar_source=avatar_source,
tos_version=tos_version, avatar_source=avatar_source,
default_sending_stream=default_sending_stream,
default_events_register_stream=default_events_register_stream,
default_all_public_streams=default_all_public_streams)
Expand Down Expand Up @@ -1579,8 +1579,9 @@ def do_activate_user(user_profile, log=True, join_date=timezone.now()):
user_profile.is_mirror_dummy = False
user_profile.set_unusable_password()
user_profile.date_joined = join_date
user_profile.tos_version = settings.TOS_VERSION
user_profile.save(update_fields=["is_active", "date_joined", "password",
"is_mirror_dummy"])
"is_mirror_dummy", "tos_version"])

if log:
domain = user_profile.realm.domain
Expand Down
6 changes: 3 additions & 3 deletions zerver/lib/bulk_create.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ def bulk_create_realms(realm_list):
existing_realms.add(domain)
Realm.objects.bulk_create(realms_to_create)

def bulk_create_users(realms, users_raw, bot_type=None):
# type: (Mapping[text_type, Realm], Set[Tuple[text_type, text_type, text_type, bool]], Optional[int]) -> None
def bulk_create_users(realms, users_raw, bot_type=None, tos_version=None):
# type: (Mapping[text_type, Realm], Set[Tuple[text_type, text_type, text_type, bool]], Optional[int], Optional[text_type]) -> None
"""
Creates and saves a UserProfile with the given email.
Has some code based off of UserManage.create_user, but doesn't .save()
Expand All @@ -39,7 +39,7 @@ def bulk_create_users(realms, users_raw, bot_type=None):
domain = resolve_email_to_domain(email)
profile = create_user_profile(realms[domain], email,
initial_password(email), active, bot_type,
full_name, short_name, None, False)
full_name, short_name, None, False, tos_version)
profiles_to_create.append(profile)
UserProfile.objects.bulk_create(profiles_to_create)

Expand Down
10 changes: 5 additions & 5 deletions zerver/lib/create_user.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ def random_api_key():
# create_user (below) which will also make the Subscription and
# Recipient objects
def create_user_profile(realm, email, password, active, bot_type, full_name,
short_name, bot_owner, is_mirror_dummy):
# type: (Realm, text_type, text_type, bool, Optional[int], text_type, text_type, Optional[UserProfile], bool) -> UserProfile
short_name, bot_owner, is_mirror_dummy, tos_version):
# type: (Realm, text_type, text_type, bool, Optional[int], text_type, text_type, Optional[UserProfile], bool, Optional[text_type]) -> UserProfile
now = timezone.now()
email = UserManager.normalize_email(email)

Expand All @@ -54,15 +54,15 @@ def create_user_profile(realm, email, password, active, bot_type, full_name,
return user_profile

def create_user(email, password, realm, full_name, short_name,
active=True, bot_type=None, bot_owner=None,
active=True, bot_type=None, bot_owner=None, tos_version=None,
avatar_source=UserProfile.AVATAR_FROM_GRAVATAR,
is_mirror_dummy=False, default_sending_stream=None,
default_events_register_stream=None,
default_all_public_streams=None, user_profile_id=None):
# type: (text_type, text_type, Realm, text_type, text_type, bool, Optional[int], Optional[UserProfile], text_type, bool, Optional[Stream], Optional[Stream], Optional[bool], Optional[int]) -> UserProfile
# type: (text_type, text_type, Realm, text_type, text_type, bool, Optional[int], Optional[UserProfile], Optional[text_type], text_type, bool, Optional[Stream], Optional[Stream], Optional[bool], Optional[int]) -> UserProfile
user_profile = create_user_profile(realm, email, password, active, bot_type,
full_name, short_name, bot_owner,
is_mirror_dummy)
is_mirror_dummy, tos_version)
user_profile.avatar_source = avatar_source
user_profile.default_sending_stream = default_sending_stream
user_profile.default_events_register_stream = default_events_register_stream
Expand Down
2 changes: 1 addition & 1 deletion zerver/migrations/0028_userprofile_tos_version.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ class Migration(migrations.Migration):
migrations.AddField(
model_name='userprofile',
name='tos_version',
field=models.CharField(default=None, max_length=10, null=True),
field=models.CharField(max_length=10, null=True),
),
]
2 changes: 1 addition & 1 deletion zerver/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -391,7 +391,7 @@ class UserProfile(ModelReprMixin, AbstractBaseUser, PermissionsMixin):
last_pointer_updater = models.CharField(max_length=64) # type: text_type
realm = models.ForeignKey(Realm) # type: Realm
api_key = models.CharField(max_length=32) # type: text_type
tos_version = models.CharField(null=True, max_length=10, default=settings.TOS_VERSION) # type: text_type
tos_version = models.CharField(null=True, max_length=10) # type: text_type

### Notifications settings. ###

Expand Down
2 changes: 1 addition & 1 deletion zerver/views/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@ def accounts_register(request):
do_activate_user(user_profile)
do_change_password(user_profile, password)
do_change_full_name(user_profile, full_name)
do_change_tos_version(user_profile, settings.TOS_VERSION)
except UserProfile.DoesNotExist:
user_profile = do_create_user(email, password, realm, full_name, short_name,
prereg_user=prereg_user,
Expand All @@ -224,7 +225,6 @@ def accounts_register(request):
user_profile = do_create_user(email, password, realm, full_name, short_name,
prereg_user=prereg_user,
newsletter_data={"IP": request.META['REMOTE_ADDR']})
do_change_tos_version(user_profile, settings.TOS_VERSION)

# This logs you in using the ZulipDummyBackend, since honestly nothing
# more fancy than this is required.
Expand Down
5 changes: 3 additions & 2 deletions zilencer/management/commands/populate_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ def create_users(realms, name_list, bot_type=None):
for full_name, email in name_list:
short_name = email_to_username(email)
user_set.add((email, full_name, short_name, True))
bulk_create_users(realms, user_set, bot_type)
tos_version = settings.TOS_VERSION if bot_type is None else None
bulk_create_users(realms, user_set, bot_type, tos_version)

def create_streams(realms, realm, stream_list):
# type: (Mapping[text_type, Realm], Realm, Iterable[text_type]) -> None
Expand Down Expand Up @@ -428,7 +429,7 @@ def fix_email(email):
streams[recipient.type_id].name.lower())] = recipient

print(datetime.datetime.now(), "Creating users...")
bulk_create_users(realms, user_set)
bulk_create_users(realms, user_set, None, settings.TOS_VERSION)

users = {} # type: Dict[text_type, UserProfile]
users_by_id = {} # type: Dict[int, UserProfile]
Expand Down

0 comments on commit 4029e4c

Please sign in to comment.