def test_jail_basic(db): user1, token1 = generate_user(db) with real_api_session(db, token1) as api: res = api.Ping(api_pb2.PingReq()) with real_jail_session(db, token1) as jail: res = jail.JailInfo(empty_pb2.Empty()) # check every field is false for field in res.DESCRIPTOR.fields: assert getattr(res, field.name) == False assert not res.jailed # make the user jailed user2, token2 = generate_user(db, accepted_tos=0) with real_api_session(db, token2) as api, pytest.raises(grpc.RpcError) as e: res = api.Ping(api_pb2.PingReq()) assert e.value.code() == grpc.StatusCode.UNAUTHENTICATED with real_jail_session(db, token2) as jail: res = jail.JailInfo(empty_pb2.Empty()) assert res.jailed reason_count = 0 # check at least one field is true for field in res.DESCRIPTOR.fields: reason_count += getattr(res, field.name) == True assert reason_count > 0
def test_AcceptCommunityGuidelines(db): # make them have not accepted GC user1, token1 = generate_user(accepted_community_guidelines=0) with real_jail_session(token1) as jail: res = jail.JailInfo(empty_pb2.Empty()) assert res.jailed assert res.has_not_accepted_community_guidelines # make sure we can't unaccept with pytest.raises(grpc.RpcError) as e: res = jail.AcceptCommunityGuidelines( jail_pb2.AcceptCommunityGuidelinesReq(accept=False)) assert e.value.code() == grpc.StatusCode.FAILED_PRECONDITION assert e.value.details() == errors.CANT_UNACCEPT_COMMUNITY_GUIDELINES res = jail.JailInfo(empty_pb2.Empty()) assert res.jailed assert res.has_not_accepted_community_guidelines # now accept res = jail.AcceptCommunityGuidelines( jail_pb2.AcceptCommunityGuidelinesReq(accept=True)) res = jail.JailInfo(empty_pb2.Empty()) assert not res.jailed assert not res.has_not_accepted_community_guidelines # make sure we can't unaccept with pytest.raises(grpc.RpcError) as e: res = jail.AcceptCommunityGuidelines( jail_pb2.AcceptCommunityGuidelinesReq(accept=False)) assert e.value.code() == grpc.StatusCode.FAILED_PRECONDITION assert e.value.details() == errors.CANT_UNACCEPT_COMMUNITY_GUIDELINES # make them have accepted GC user2, token2 = generate_user() with real_jail_session(token2) as jail: res = jail.JailInfo(empty_pb2.Empty()) assert not res.jailed assert not res.has_not_accepted_community_guidelines # make sure we can't unaccept with pytest.raises(grpc.RpcError) as e: res = jail.AcceptCommunityGuidelines( jail_pb2.AcceptCommunityGuidelinesReq(accept=False)) assert e.value.code() == grpc.StatusCode.FAILED_PRECONDITION assert e.value.details() == errors.CANT_UNACCEPT_COMMUNITY_GUIDELINES # accepting again doesn't do anything res = jail.AcceptCommunityGuidelines( jail_pb2.AcceptCommunityGuidelinesReq(accept=True)) res = jail.JailInfo(empty_pb2.Empty()) assert not res.jailed assert not res.has_not_accepted_community_guidelines
def test_AcceptTOS(db): # make them have not accepted TOS user1, token1 = generate_user(db, accepted_tos=0) with real_jail_session(db, token1) as jail: res = jail.JailInfo(empty_pb2.Empty()) assert res.jailed assert res.has_not_accepted_tos # calling with accept=False changes nothing res = jail.AcceptTOS(jail_pb2.AcceptTOSReq(accept=False)) res = jail.JailInfo(empty_pb2.Empty()) assert res.jailed assert res.has_not_accepted_tos # now accept res = jail.AcceptTOS(jail_pb2.AcceptTOSReq(accept=True)) res = jail.JailInfo(empty_pb2.Empty()) assert not res.jailed assert not res.has_not_accepted_tos # make sure we can't unaccept with pytest.raises(grpc.RpcError) as e: res = jail.AcceptTOS(jail_pb2.AcceptTOSReq(accept=False)) assert e.value.code() == grpc.StatusCode.FAILED_PRECONDITION assert e.value.details() == errors.CANT_UNACCEPT_TOS # make them have accepted TOS user2, token2 = generate_user(db, accepted_tos=1) with real_jail_session(db, token2) as jail: res = jail.JailInfo(empty_pb2.Empty()) assert not res.jailed assert not res.has_not_accepted_tos # make sure we can't unaccept with pytest.raises(grpc.RpcError) as e: res = jail.AcceptTOS(jail_pb2.AcceptTOSReq(accept=False)) assert e.value.code() == grpc.StatusCode.FAILED_PRECONDITION assert e.value.details() == errors.CANT_UNACCEPT_TOS # accepting again doesn't do anything res = jail.AcceptTOS(jail_pb2.AcceptTOSReq(accept=True)) res = jail.JailInfo(empty_pb2.Empty()) assert not res.jailed assert not res.has_not_accepted_tos
def test_JailInfo(db): user1, token1 = generate_user(accepted_tos=0) with real_jail_session(token1) as jail: res = jail.JailInfo(empty_pb2.Empty()) assert res.jailed assert res.has_not_accepted_tos with real_api_session(token1) as api, pytest.raises(grpc.RpcError) as e: res = api.Ping(api_pb2.PingReq()) assert e.value.code() == grpc.StatusCode.UNAUTHENTICATED # make the user not jailed user2, token2 = generate_user(accepted_tos=1) with real_jail_session(token2) as jail: res = jail.JailInfo(empty_pb2.Empty()) assert not res.jailed assert not res.has_not_accepted_tos with real_api_session(token2) as api: res = api.Ping(api_pb2.PingReq())
def test_TOS_increase(db, monkeypatch): # test if the TOS version is updated # not jailed yet user, token = generate_user() with real_jail_session(token) as jail: res = jail.JailInfo(empty_pb2.Empty()) assert not res.jailed assert not res.has_not_accepted_tos with real_api_session(token) as api: res = api.Ping(api_pb2.PingReq()) # now we pretend to update the TOS version new_TOS_VERSION = TOS_VERSION + 1 monkeypatch.setattr(models, "TOS_VERSION", new_TOS_VERSION) monkeypatch.setattr(servicers_jail, "TOS_VERSION", new_TOS_VERSION) # make sure we're jailed with real_api_session(token) as api, pytest.raises(grpc.RpcError) as e: res = api.Ping(api_pb2.PingReq()) assert e.value.code() == grpc.StatusCode.UNAUTHENTICATED with real_jail_session(token) as jail: res = jail.JailInfo(empty_pb2.Empty()) assert res.jailed assert res.has_not_accepted_tos # now accept res = jail.AcceptTOS(jail_pb2.AcceptTOSReq(accept=True)) res = jail.JailInfo(empty_pb2.Empty()) assert not res.jailed assert not res.has_not_accepted_tos
def test_coords(db): # make them have not added a location user1, token1 = generate_user(geom=None, geom_radius=None) user2, token2 = generate_user() with api_session(token2) as api: res = api.Ping(api_pb2.PingReq()) assert res.user.city == user2.city lat, lng = user2.coordinates or (0, 0) assert res.user.lat == lat assert res.user.lng == lng assert res.user.radius == user2.geom_radius with api_session(token2) as api: res = api.GetUser(api_pb2.GetUserReq(user=user1.username)) assert res.city == user1.city assert res.lat == 0.0 assert res.lng == 0.0 assert res.radius == 0.0 with real_jail_session(token1) as jail: res = jail.JailInfo(empty_pb2.Empty()) assert res.jailed assert res.has_not_added_location res = jail.SetLocation( jail_pb2.SetLocationReq( city="New York City", lat=40.7812, lng=-73.9647, radius=250, )) assert not res.jailed assert not res.has_not_added_location res = jail.JailInfo(empty_pb2.Empty()) assert not res.jailed assert not res.has_not_added_location with api_session(token2) as api: res = api.GetUser(api_pb2.GetUserReq(user=user1.username)) assert res.city == "New York City" assert res.lat == 40.7812 assert res.lng == -73.9647 assert res.radius == 250
def test_SetLocation(db): # make them have not added a location user1, token1 = generate_user(geom=None, geom_radius=None) with real_jail_session(token1) as jail: res = jail.JailInfo(empty_pb2.Empty()) assert res.jailed assert res.has_not_added_location res = jail.SetLocation( jail_pb2.SetLocationReq( city="New York City", lat=40.7812, lng=-73.9647, radius=250, )) assert not res.jailed assert not res.has_not_added_location res = jail.JailInfo(empty_pb2.Empty()) assert not res.jailed assert not res.has_not_added_location
def test_SetPassword(db, fast_passwords): # make them not have a password user1, token1 = generate_user(hashed_password=None) with real_jail_session(token1) as jail: res = jail.JailInfo(empty_pb2.Empty()) assert res.jailed assert res.has_not_set_password # make sure bad password are caught with pytest.raises(grpc.RpcError) as e: jail.SetPassword(jail_pb2.SetPasswordReq(new_password="******")) assert e.value.code() == grpc.StatusCode.INVALID_ARGUMENT assert e.value.details() == errors.INSECURE_PASSWORD res = jail.JailInfo(empty_pb2.Empty()) assert res.jailed assert res.has_not_set_password # make sure we can set a good password pwd = random_hex() res = jail.SetPassword(jail_pb2.SetPasswordReq(new_password=pwd)) assert not res.jailed assert not res.has_not_set_password # make sure we can't set a password again with pytest.raises(grpc.RpcError) as e: jail.SetPassword( jail_pb2.SetPasswordReq(new_password=random_hex())) assert e.value.code() == grpc.StatusCode.FAILED_PRECONDITION assert e.value.details() == errors.ALREADY_HAS_PASSWORD res = jail.JailInfo(empty_pb2.Empty()) assert not res.jailed assert not res.has_not_set_password
def test_coords(db): # make them have not added a location user1, token1 = generate_user(geom=None, geom_radius=None) user2, token2 = generate_user() with api_session(token2) as api: res = api.Ping(api_pb2.PingReq()) assert res.user.city == user2.city lat, lng = user2.coordinates or (0, 0) assert res.user.lat == lat assert res.user.lng == lng assert res.user.radius == user2.geom_radius with api_session(token2) as api: res = api.GetUser(api_pb2.GetUserReq(user=user1.username)) assert res.city == user1.city assert res.lat == 0.0 assert res.lng == 0.0 assert res.radius == 0.0 # Check coordinate wrapping user3, token3 = generate_user(geom=create_coordinate(40.0, -180.5)) user4, token4 = generate_user(geom=create_coordinate(40.0, 20.0)) user5, token5 = generate_user(geom=create_coordinate(90.5, 20.0)) with api_session(token3) as api: res = api.GetUser(api_pb2.GetUserReq(user=user3.username)) assert res.lat == 40.0 assert res.lng == 179.5 with api_session(token4) as api: res = api.GetUser(api_pb2.GetUserReq(user=user4.username)) assert res.lat == 40.0 assert res.lng == 20.0 # PostGIS does not wrap longitude for latitude overflow with api_session(token5) as api: res = api.GetUser(api_pb2.GetUserReq(user=user5.username)) assert res.lat == 89.5 assert res.lng == 20.0 with real_jail_session(token1) as jail: res = jail.JailInfo(empty_pb2.Empty()) assert res.jailed assert res.has_not_added_location res = jail.SetLocation( jail_pb2.SetLocationReq( city="New York City", lat=40.7812, lng=-73.9647, radius=250, )) assert not res.jailed assert not res.has_not_added_location res = jail.JailInfo(empty_pb2.Empty()) assert not res.jailed assert not res.has_not_added_location with api_session(token2) as api: res = api.GetUser(api_pb2.GetUserReq(user=user1.username)) assert res.city == "New York City" assert res.lat == 40.7812 assert res.lng == -73.9647 assert res.radius == 250