Esempio n. 1
0
    def test_delete(self):
        from google.protobuf import empty_pb2
        from google.cloud.bigtable._generated import (bigtable_table_admin_pb2
                                                      as table_admin_v2_pb2)
        from unit_tests.bigtable._testing import _FakeStub

        project_id = 'project-id'
        zone = 'zone'
        cluster_id = 'cluster-id'
        table_id = 'table-id'
        column_family_id = 'column-family-id'
        table_name = ('projects/' + project_id + '/zones/' + zone +
                      '/clusters/' + cluster_id + '/tables/' + table_id)

        client = _Client()
        table = _Table(table_name, client=client)
        column_family = self._makeOne(column_family_id, table)

        # Create request_pb
        request_pb = table_admin_v2_pb2.ModifyColumnFamiliesRequest(
            name=table_name)
        request_pb.modifications.add(id=column_family_id, drop=True)

        # Create response_pb
        response_pb = empty_pb2.Empty()

        # Patch the stub used by the API method.
        client._table_stub = stub = _FakeStub(response_pb)

        # Create expected_result.
        expected_result = None  # delete() has no return value.

        # Perform the method and check the result.
        self.assertEqual(stub.results, (response_pb, ))
        result = column_family.delete()
        self.assertEqual(stub.results, ())
        self.assertEqual(result, expected_result)
        self.assertEqual(stub.method_calls, [(
            'ModifyColumnFamilies',
            (request_pb, ),
            {},
        )])
Esempio n. 2
0
    def JoinGroup(self, request, context):
        with session_scope() as session:
            cluster = session.execute(
                select(Cluster).where(~Cluster.is_official_cluster).where(Cluster.id == request.group_id)
            ).scalar_one_or_none()
            if not cluster:
                context.abort(grpc.StatusCode.NOT_FOUND, errors.GROUP_NOT_FOUND)

            user_in_group = cluster.members.where(User.id == context.user_id).one_or_none()
            if user_in_group:
                context.abort(grpc.StatusCode.FAILED_PRECONDITION, errors.ALREADY_IN_GROUP)

            cluster.cluster_subscriptions.append(
                ClusterSubscription(
                    user_id=context.user_id,
                    role=ClusterRole.member,
                )
            )

            return empty_pb2.Empty()
Esempio n. 3
0
    def get(self, ip):
        with grpc.insecure_channel(target=ip + ":50051",
                                   options=[("grpc.enable_retries", 0),
                                            ("grpc.keepalive_timeout_ms",
                                             10000)]) as channel:
            grpc_client = nfd_agent_pb2_grpc.NFDRouterAgentStub(channel)

            grpc_res = grpc_client.NLSRLsdbList(empty_pb2.Empty())
            lsdbs = grpc_res.lsdbs
            result = []

            if grpc_res.ack.ack_code == 'ok':
                result = list(
                    map(
                        lambda lsdb: {
                            "origin_router": lsdb.origin_router,
                            "prefix": lsdb.prefix
                        }, lsdbs))

            return {"lsdb_list": result}
    def test_start_upload(self):
        # Setup Expected Response
        upload_url = 'uploadUrl-242738639'
        expected_response = {'upload_url': upload_url}
        expected_response = resources_pb2.UploadRef(**expected_response)

        # Mock the API response
        channel = ChannelStub(responses=[expected_response])
        patch = mock.patch('google.api_core.grpc_helpers.create_channel')
        with patch as create_channel:
            create_channel.return_value = channel
            client = publish_v1.StreetViewPublishServiceClient()

        response = client.start_upload()
        assert expected_response == response

        assert len(channel.requests) == 1
        expected_request = empty_pb2.Empty()
        actual_request = channel.requests[0][1]
        assert expected_request == actual_request
Esempio n. 5
0
    def LeaveGroup(self, request, context):
        with session_scope() as session:
            cluster = (session.query(Cluster).filter(
                ~Cluster.is_official_cluster).filter(
                    Cluster.id == request.group_id).one_or_none())
            if not cluster:
                context.abort(grpc.StatusCode.NOT_FOUND,
                              errors.GROUP_NOT_FOUND)

            current_membership = cluster.members.filter(
                User.id == context.user_id).one_or_none()

            if not current_membership:
                context.abort(grpc.StatusCode.FAILED_PRECONDITION,
                              errors.NOT_IN_GROUP)

            session.query(ClusterSubscription).filter(
                ClusterSubscription.user_id == context.user_id).delete()

            return empty_pb2.Empty()
Esempio n. 6
0
 def CompletePasswordReset(self, request, context):
     """
     Completes the password reset: just clears the user's password
     """
     with session_scope() as session:
         res = (
             session.query(PasswordResetToken, User)
             .join(User, User.id == PasswordResetToken.user_id)
             .filter(PasswordResetToken.token == request.password_reset_token)
             .filter(PasswordResetToken.is_valid)
             .one_or_none()
         )
         if res:
             password_reset_token, user = res
             session.delete(password_reset_token)
             user.hashed_password = None
             session.commit()
             return empty_pb2.Empty()
         else:
             context.abort(grpc.StatusCode.NOT_FOUND, errors.INVALID_TOKEN)
Esempio n. 7
0
 def ModifyAckDeadline(
     self,
     request: pubsub_pb2.ModifyAckDeadlineRequest,
     context: grpc.ServicerContext,
 ) -> empty_pb2.Empty:  # noqa: D403
     """ModifyAckDeadline implementation."""
     self.logger.debug("ModifyAckDeadline(%s)", LazyFormat(request))
     try:
         subscription = self.subscriptions[request.subscription]
     except KeyError:
         context.abort(grpc.StatusCode.NOT_FOUND, "Subscription not found")
     # deadline is not tracked so only handle expiration when set to 0
     if request.ack_deadline_seconds == 0:
         for ack_id in request.ack_ids:
             try:
                 # move message from pulled back to published
                 subscription.published.append(subscription.pulled.pop(ack_id))
             except KeyError:
                 context.abort(grpc.StatusCode.NOT_FOUND, "Ack ID not found")
     return empty_pb2.Empty()
Esempio n. 8
0
async def create_organization(request: Request):
    new_organization = model.Organization(
        name=request.parsed.name,
        address=request.parsed.address,
        data=dict(**request.parsed.data),
        timetable=request.parsed.timetable.SerializeToString(),
    )

    new_permission = model.Permission(
        user_id=request.user.id,
        permission_type='OWNER',
    )

    new_organization.admins.append(new_permission)
    request.connection.add(new_organization)

    with contextlib.suppress(Exception):
        await caches.get('redis').delete(f'user_{request.user.email}', timeout=0.5)

    return ProtobufResponse(empty_pb2.Empty())
Esempio n. 9
0
    def MarkLastSeenGroupChat(self, request, context):
        with session_scope() as session:
            subscription = session.execute(
                select(GroupChatSubscription)
                .where(GroupChatSubscription.group_chat_id == request.group_chat_id)
                .where(GroupChatSubscription.user_id == context.user_id)
                .where(GroupChatSubscription.left == None)
            ).scalar_one_or_none()

            if not subscription:
                context.abort(grpc.StatusCode.NOT_FOUND, errors.CHAT_NOT_FOUND)

            if not subscription.last_seen_message_id <= request.last_seen_message_id:
                context.abort(grpc.StatusCode.FAILED_PRECONDITION, errors.CANT_UNSEE_MESSAGES)

            subscription.last_seen_message_id = request.last_seen_message_id

            # TODO: notify

        return empty_pb2.Empty()
Esempio n. 10
0
    def OnTopicEvent(self, request, context):
        """Subscribes events from Pubsub."""
        pubsub_topic = request.pubsub_name + DELIMITER + request.topic
        if pubsub_topic not in self._topic_map:
            context.set_code(grpc.StatusCode.UNIMPLEMENTED)  # type: ignore
            raise NotImplementedError(
                f'topic {request.topic} is not implemented!')

        event = v1.Event()
        event.SetEventType(request.type)
        event.SetEventID(request.id)
        event.SetSource(request.source)
        event.SetData(request.data)
        event.SetContentType(request.data_content_type)

        # TODO: add metadata from context to CE envelope

        self._topic_map[pubsub_topic](event)

        return empty_pb2.Empty()
Esempio n. 11
0
    def test_le_ad_scan_dut_scans(self):
        with EventCallbackStream(
                # DUT Scans
                self.device_under_test.hci_le_scanning_manager.StartScan(
                    empty_proto.Empty())) as advertising_event_stream:

            hci_event_asserts = EventAsserts(advertising_event_stream)

            # CERT Advertises
            gap_name = hci_packets.GapData()
            gap_name.data_type = hci_packets.GapDataType.COMPLETE_LOCAL_NAME
            gap_name.data = list(bytes(b'Im_The_CERT!'))
            gap_data = le_advertising_facade.GapDataMsg(
                data=bytes(gap_name.Serialize()))
            config = le_advertising_facade.AdvertisingConfig(
                advertisement=[gap_data],
                random_address=common.BluetoothAddress(
                    address=bytes(b'A6:A5:A4:A3:A2:A1')),
                interval_min=512,
                interval_max=768,
                event_type=le_advertising_facade.AdvertisingEventType.ADV_IND,
                address_type=common.RANDOM_DEVICE_ADDRESS,
                peer_address_type=common.PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
                peer_address=common.BluetoothAddress(
                    address=bytes(b'0C:05:04:03:02:01')),
                channel_map=7,
                filter_policy=le_advertising_facade.AdvertisingFilterPolicy.
                ALL_DEVICES)
            request = le_advertising_facade.CreateAdvertiserRequest(
                config=config)

            create_response = self.cert_device.hci_le_advertising_manager.CreateAdvertiser(
                request)

            hci_event_asserts.assert_event_occurs(
                lambda packet: b'Im_The_CERT' in packet.event)

            remove_request = le_advertising_facade.RemoveAdvertiserRequest(
                advertiser_id=create_response.advertiser_id)
            self.cert_device.hci_le_advertising_manager.RemoveAdvertiser(
                remove_request)
Esempio n. 12
0
    def SendHostRequestMessage(self, request, context):
        if request.text == "":
            context.abort(grpc.StatusCode.INVALID_ARGUMENT,
                          errors.INVALID_MESSAGE)
        with session_scope() as session:
            host_request = (session.query(HostRequest).filter(
                HostRequest.conversation_id ==
                request.host_request_id).one_or_none())

            if not host_request:
                context.abort(grpc.StatusCode.NOT_FOUND,
                              errors.HOST_REQUEST_NOT_FOUND)

            if host_request.from_user_id != context.user_id and host_request.to_user_id != context.user_id:
                context.abort(grpc.StatusCode.NOT_FOUND,
                              errors.HOST_REQUEST_NOT_FOUND)

            # TODO: It is not very user-friendly to prevent messages for confirmed requests
            # but we also don't want people to use requests as normal messages...

            if (host_request.status == HostRequestStatus.rejected
                    or host_request.status == HostRequestStatus.confirmed
                    or host_request.status == HostRequestStatus.cancelled):
                context.abort(grpc.StatusCode.PERMISSION_DENIED,
                              errors.HOST_REQUEST_CLOSED)

            message = Message()
            message.conversation_id = host_request.conversation_id
            message.author_id = context.user_id
            message.message_type = MessageType.text
            message.text = request.text
            session.add(message)
            session.flush()

            if host_request.from_user_id == context.user_id:
                host_request.from_last_seen_message_id = message.id
            else:
                host_request.to_last_seen_message_id = message.id
            session.commit()

            return empty_pb2.Empty()
Esempio n. 13
0
 def RequestJoinPartition(self, request, context):
     response = dj_pb.RawDataResponse()
     meta_status = self._check_data_source_meta(request.data_source_meta)
     if meta_status.code != 0:
         response.status.MergeFrom(meta_status)
         return response
     rank_status = self._check_rank_id(request.rank_id)
     if rank_status.code != 0:
         response.status.MergeFrom(rank_status)
         return response
     data_source = self._fsm.get_data_source()
     if data_source.state != common_pb.DataSourceState.Processing:
         response.status.code = -3
         response.status.error_message = \
                 "data source is not at processing state"
     else:
         manifest_manager = self._fsm.get_mainifest_manager()
         rank_id = request.rank_id
         manifest = None
         partition_id = None if request.partition_id < 0 \
                 else request.partition_id
         if request.HasField('sync_example_id'):
             manifest = manifest_manager.alloc_sync_exampld_id(
                     rank_id, partition_id
                 )
         elif request.HasField('join_example'):
             manifest = manifest_manager.alloc_join_example(
                     rank_id, partition_id
                 )
         else:
             response.status.code = -4
             response.status.error_message = "request not support"
         if response.status.code == 0:
             if manifest is not None:
                 response.manifest.MergeFrom(manifest)
             else:
                 assert partition_id is None, \
                     "only the request without appoint partition "\
                     "support response no manifest"
                 response.finished.MergeFrom(empty_pb2.Empty())
     return response
Esempio n. 14
0
    def peer_list(self):
        """list peer on the chain

            return a list of peer nodes currently connected to the target peer.
            The returned  message structure is defined inside api_pb2.proto
            and fabric_pb2.proto.


            ```
            message PeersMessage {
            repeated PeerEndpoint peers = 1;
            }
            message PeerEndpoint {
            PeerID ID = 1;
            string address = 2;
            enum Type {
            UNDEFINED = 0;
            VALIDATOR = 1;
            NON_VALIDATOR = 2;
            }
            Type type = 3;
            bytes pkiID = 4;
            }
            message PeerID {
            string name = 1;
            }
            ```


            :param:empty
            :return:The peer list on the chain
            """

        peer_response = self.peer_stub.GetPeers(
            google_dot_protobuf_dot_empty__pb2.Empty())
        for peer_message in peer_response.peers:
            self.logger.debug(
                "peer information:--IDName:{0}--address:{1}--type:{2}\n".
                format(peer_message.ID.name, peer_message.address,
                       peer_message.type))
        return peer_response
Esempio n. 15
0
  def call(self, peer_id, email, headers=None):
    """Mocks pRPC environment and calls the interceptor.

    Returns:
      CapturedState with info about auth context inside the handler.
      MockContext as it is after the request finishes.
    """
    api.reset_local_state()

    headers = (headers or {}).copy()
    if email:
      headers['Authorization'] = 'Bearer %s' % email
    metadata = [(k.lower(), v) for k, v in sorted(headers.items())]

    if email != 'BROKEN':
      ident = model.Anonymous
      if email:
        ident = model.Identity(model.IDENTITY_USER, email)
      self.mock(api, 'check_oauth_access_token', lambda _: (ident, False))
    else:
      def raise_exc(_):
        raise api.AuthenticationError('OMG, bad token')
      self.mock(api, 'check_oauth_access_token', raise_exc)

    ctx = MockContext(peer_id, metadata)
    call_details = prpclib.HandlerCallDetails('service.Method', metadata)

    state = []
    def continuation(request, context, call_details):
      state.append(CapturedState(
          current_identity=api.get_current_identity().to_bytes(),
          is_superuser=api.is_superuser(),
          peer_identity=api.get_peer_identity().to_bytes(),
          peer_ip=api.get_peer_ip(),
          delegation_token=api.get_delegation_token(),
      ))
      return empty_pb2.Empty()
    prpc.prpc_interceptor(empty_pb2.Empty(), ctx, call_details, continuation)

    self.assertTrue(len(state) <= 1)
    return state[0] if state else None, ctx
Esempio n. 16
0
    def LeaveCommunity(self, request, context):
        with session_scope() as session:
            node = session.execute(select(Node).where(Node.id == request.community_id)).scalar_one_or_none()
            if not node:
                context.abort(grpc.StatusCode.NOT_FOUND, errors.COMMUNITY_NOT_FOUND)

            current_membership = node.official_cluster.members.where(User.id == context.user_id).one_or_none()

            if not current_membership:
                context.abort(grpc.StatusCode.FAILED_PRECONDITION, errors.NOT_IN_COMMUNITY)

            if context.user_id in node.contained_user_ids:
                context.abort(grpc.StatusCode.FAILED_PRECONDITION, errors.CANNOT_LEAVE_CONTAINING_COMMUNITY)

            session.execute(
                delete(ClusterSubscription)
                .where(ClusterSubscription.cluster_id == node.official_cluster.id)
                .where(ClusterSubscription.user_id == context.user_id)
            )

            return empty_pb2.Empty()
Esempio n. 17
0
    def JoinCommunity(self, request, context):
        with session_scope() as session:
            node = session.query(Node).filter(
                Node.id == request.community_id).one_or_none()
            if not node:
                context.abort(grpc.StatusCode.NOT_FOUND,
                              errors.COMMUNITY_NOT_FOUND)

            current_membership = node.official_cluster.members.filter(
                User.id == context.user_id).one_or_none()
            if current_membership:
                context.abort(grpc.StatusCode.FAILED_PRECONDITION,
                              errors.ALREADY_IN_COMMUNITY)

            node.official_cluster.cluster_subscriptions.append(
                ClusterSubscription(
                    user_id=context.user_id,
                    role=ClusterRole.member,
                ))

            return empty_pb2.Empty()
Esempio n. 18
0
    def UploadConfirmation(self, request, context):
        with session_scope() as session:
            initiated_upload = (session.query(InitiatedUpload).filter(
                InitiatedUpload.key == request.key).filter(
                    InitiatedUpload.is_valid).one_or_none())

            if not initiated_upload:
                context.abort(grpc.StatusCode.NOT_FOUND, "Upload not found.")

            # move it to a completed upload
            upload = Upload(
                key=request.key,
                filename=request.filename,
                creator_user_id=initiated_upload.initiator_user_id,
            )
            session.add(upload)

            # delete the old upload
            session.delete(initiated_upload)

            return empty_pb2.Empty()
Esempio n. 19
0
    def test_local_hci_cmd_and_event(self):
        # Loopback mode responds with ACL and SCO connection complete
        self.register_for_event(hci_packets.EventCode.CONNECTION_COMPLETE)
        self.register_for_event(hci_packets.EventCode.LOOPBACK_COMMAND)
        self.register_for_event(
            hci_packets.EventCode.CONNECTION_PACKET_TYPE_CHANGED)
        with EventCallbackStream(
                self.device_under_test.hci.FetchEvents(
                    empty_proto.Empty())) as hci_event_stream:
            hci_event_asserts = EventAsserts(hci_event_stream)

            self.enqueue_hci_command(
                hci_packets.WriteLoopbackModeBuilder(
                    hci_packets.LoopbackMode.ENABLE_LOCAL), True)

            cmd2loop = hci_packets.ReadLocalNameBuilder()
            self.enqueue_hci_command(cmd2loop, True)

            looped_bytes = bytes(cmd2loop.Serialize())
            hci_event_asserts.assert_event_occurs(
                lambda packet: looped_bytes in packet.event)
Esempio n. 20
0
    def test_servicer_persistence(self):
        """Basic test which ensures the servicer state persists."""

        headers = self.make_headers(encoding.Encoding.BINARY)
        req = test_pb2.GiveRequest(m=3333)
        raw_resp = self.app.post(
            '/prpc/test.Test/Give',
            req.SerializeToString(),
            headers,
        ).body
        self.assertEqual(len(raw_resp), 0)

        req = empty_pb2.Empty()
        raw_resp = self.app.post(
            '/prpc/test.Test/Take',
            req.SerializeToString(),
            headers,
        ).body
        resp = test_pb2.TakeResponse()
        test_pb2.TakeResponse.ParseFromString(resp, raw_resp)
        self.assertEqual(resp.k, 3333)
Esempio n. 21
0
    def test_write_entries_single(self):
        channel, api = self.make_logging_api()

        channel.WriteLogEntries.response = empty_pb2.Empty()

        entry = {
            "logName": self.LOG_PATH,
            "resource": {"type": "global"},
            "textPayload": "text",
        }

        api.write_entries([entry])

        # Check the request
        assert len(channel.WriteLogEntries.requests) == 1
        request = channel.WriteLogEntries.requests[0]
        assert request.partial_success is False
        assert len(request.entries) == 1
        assert request.entries[0].log_name == entry["logName"]
        assert request.entries[0].resource.type == entry["resource"]["type"]
        assert request.entries[0].text_payload == "text"
Esempio n. 22
0
    def Delete(self, request, context):
        # Check to see if they already exist:
        index = getUsersIndex(request.id)
        if index == -1:
            context.set_code(grpc.StatusCode.UNKNOWN)
            return

        if int(USERS[index]['id']) != int(request.id):
            context.set_code(grpc.StatusCode.NOT_FOUND)
            return

        del USERS[index]

        user = getUserByID(request.id)

        if user:
            context.set_code(grpc.StatusCode.UNKNOWN)
            return

        print("Deleted user {}".format(request.id))
        return empty_pb2.Empty()
Esempio n. 23
0
    def setup_test(self):
        super().setup_test()

        self.dut_address = self.dut.hci_controller.GetMacAddressSimple()
        cert_address = common.BluetoothAddress(
            address=self.cert.controller_read_only_property.ReadLocalAddress(
                empty_proto.Empty()).address)

        self.dut_l2cap = PyL2cap(self.dut, cert_address)
        self.cert_l2cap = CertL2cap(self.cert)
        self.dut_le_l2cap = PyLeL2cap(self.dut)
        self.cert_le_l2cap = CertLeL2cap(self.cert)
        self.dut_le_address = common.BluetoothAddressWithType(
            address=common.BluetoothAddress(
                address=bytes(b'D0:05:04:03:02:01')),
            type=common.RANDOM_DEVICE_ADDRESS)
        self.cert_address = common.BluetoothAddressWithType(
            address=common.BluetoothAddress(
                address=bytes(b'C0:11:FF:AA:33:22')),
            type=common.RANDOM_DEVICE_ADDRESS)
        dut_privacy_policy = le_initiator_address_facade.PrivacyPolicy(
            address_policy=le_initiator_address_facade.AddressPolicy.
            USE_STATIC_ADDRESS,
            address_with_type=self.dut_le_address,
            rotation_irk=
            b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
            minimum_rotation_time=0,
            maximum_rotation_time=0)
        self.dut_l2cap._device.hci_le_initiator_address.SetPrivacyPolicyForInitiatorAddress(
            dut_privacy_policy)
        privacy_policy = le_initiator_address_facade.PrivacyPolicy(
            address_policy=le_initiator_address_facade.AddressPolicy.
            USE_STATIC_ADDRESS,
            address_with_type=self.cert_address,
            rotation_irk=
            b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
            minimum_rotation_time=0,
            maximum_rotation_time=0)
        self.cert_le_l2cap._device.hci_le_initiator_address.SetPrivacyPolicyForInitiatorAddress(
            privacy_policy)
Esempio n. 24
0
    def MakeGroupChatAdmin(self, request, context):
        with session_scope(self._Session) as session:
            your_subscription = (session.query(GroupChatSubscription).filter(
                GroupChatSubscription.group_chat_id == request.group_chat_id
            ).filter(GroupChatSubscription.user_id == context.user_id).filter(
                GroupChatSubscription.left == None).one_or_none())

            if not your_subscription:
                context.abort(grpc.StatusCode.NOT_FOUND, errors.CHAT_NOT_FOUND)

            if your_subscription.role != GroupChatRole.admin:
                context.abort(grpc.StatusCode.PERMISSION_DENIED,
                              errors.ONLY_ADMIN_CAN_MAKE_ADMIN)

            if request.user_id == context.user_id:
                context.abort(grpc.StatusCode.FAILED_PRECONDITION,
                              errors.CANT_MAKE_SELF_ADMIN)

            their_subscription = (session.query(GroupChatSubscription).filter(
                GroupChatSubscription.group_chat_id == request.group_chat_id
            ).filter(GroupChatSubscription.user_id == request.user_id).filter(
                GroupChatSubscription.left == None).one_or_none())

            if not their_subscription:
                context.abort(grpc.StatusCode.FAILED_PRECONDITION,
                              errors.USER_NOT_IN_CHAT)

            if their_subscription.role != GroupChatRole.participant:
                context.abort(grpc.StatusCode.FAILED_PRECONDITION,
                              errors.ALREADY_ADMIN)

            their_subscription.role = GroupChatRole.admin

            _add_message_to_subscription(
                session,
                your_subscription,
                message_type=MessageType.user_made_admin,
                target_id=request.user_id)

        return empty_pb2.Empty()
Esempio n. 25
0
    def SendFriendRequest(self, request, context):
        if context.user_id == request.user_id:
            context.abort(grpc.StatusCode.FAILED_PRECONDITION,
                          errors.CANT_FRIEND_SELF)

        with session_scope() as session:
            user = session.query(User).filter(User.id == context.user_id).one()
            to_user = session.query(User).filter(
                User.id == request.user_id).one_or_none()

            if not to_user:
                context.abort(grpc.StatusCode.NOT_FOUND, errors.USER_NOT_FOUND)

            if (session.query(FriendRelationship).filter(
                    or_(
                        and_(
                            FriendRelationship.from_user_id == context.user_id,
                            FriendRelationship.to_user_id == request.user_id,
                        ),
                        and_(
                            FriendRelationship.from_user_id == request.user_id,
                            FriendRelationship.to_user_id == context.user_id,
                        ),
                    )).filter(
                        or_(
                            FriendRelationship.status == FriendStatus.accepted,
                            FriendRelationship.status == FriendStatus.pending,
                        )).one_or_none() is not None):
                context.abort(grpc.StatusCode.FAILED_PRECONDITION,
                              errors.FRIENDS_ALREADY_OR_PENDING)

            # TODO: Race condition where we can create two friend reqs, needs db constraint! See comment in table

            friend_relationship = FriendRelationship(
                from_user=user, to_user=to_user, status=FriendStatus.pending)
            session.add(friend_relationship)

            send_friend_request_email(friend_relationship)

            return empty_pb2.Empty()
Esempio n. 26
0
    def SendHostRequestMessage(self, request, context):
        if request.text == "":
            context.abort(grpc.StatusCode.INVALID_ARGUMENT,
                          errors.INVALID_MESSAGE)
        with session_scope() as session:
            host_request = (session.query(HostRequest).filter(
                HostRequest.conversation_id ==
                request.host_request_id).one_or_none())

            if not host_request:
                context.abort(grpc.StatusCode.NOT_FOUND,
                              errors.HOST_REQUEST_NOT_FOUND)

            if host_request.from_user_id != context.user_id and host_request.to_user_id != context.user_id:
                context.abort(grpc.StatusCode.NOT_FOUND,
                              errors.HOST_REQUEST_NOT_FOUND)

            if host_request.status == HostRequestStatus.rejected or host_request.status == HostRequestStatus.cancelled:
                context.abort(grpc.StatusCode.PERMISSION_DENIED,
                              errors.HOST_REQUEST_CLOSED)

            if host_request.end_time < now():
                context.abort(grpc.StatusCode.INVALID_ARGUMENT,
                              errors.HOST_REQUEST_IN_PAST)

            message = Message()
            message.conversation_id = host_request.conversation_id
            message.author_id = context.user_id
            message.message_type = MessageType.text
            message.text = request.text
            session.add(message)
            session.flush()

            if host_request.from_user_id == context.user_id:
                host_request.from_last_seen_message_id = message.id
            else:
                host_request.to_last_seen_message_id = message.id
            session.commit()

            return empty_pb2.Empty()
Esempio n. 27
0
    def test_delete(self):
        from google.protobuf import empty_pb2
        from gcloud.bigtable._generated import (
            bigtable_table_service_messages_pb2 as messages_pb2)
        from gcloud.bigtable._testing import _FakeStub

        project_id = 'project-id'
        zone = 'zone'
        cluster_id = 'cluster-id'
        table_id = 'table-id'
        timeout_seconds = 871
        cluster_name = ('projects/' + project_id + '/zones/' + zone +
                        '/clusters/' + cluster_id)

        client = _Client(timeout_seconds=timeout_seconds)
        cluster = _Cluster(cluster_name, client=client)
        table = self._makeOne(table_id, cluster)

        # Create request_pb
        table_name = cluster_name + '/tables/' + table_id
        request_pb = messages_pb2.DeleteTableRequest(name=table_name)

        # Create response_pb
        response_pb = empty_pb2.Empty()

        # Patch the stub used by the API method.
        client._table_stub = stub = _FakeStub(response_pb)

        # Create expected_result.
        expected_result = None  # delete() has no return value.

        # Perform the method and check the result.
        result = table.delete()
        self.assertEqual(result, expected_result)
        self.assertEqual(stub.method_calls, [(
            'DeleteTable',
            (request_pb, timeout_seconds),
            {},
        )])
Esempio n. 28
0
    def LeaveGroupChat(self, request, context):
        with session_scope(self._Session) as session:
            subscription = (session.query(GroupChatSubscription).filter(
                GroupChatSubscription.group_chat_id == request.group_chat_id
            ).filter(GroupChatSubscription.user_id == context.user_id).filter(
                GroupChatSubscription.left == None).one_or_none())

            if not subscription:
                context.abort(grpc.StatusCode.NOT_FOUND, errors.CHAT_NOT_FOUND)

            if subscription.role == GroupChatRole.admin:
                other_admins_count = (session.query(
                    GroupChatSubscription.id).filter(
                        GroupChatSubscription.group_chat_id ==
                        request.group_chat_id).filter(
                            GroupChatSubscription.user_id != context.user_id
                        ).filter(
                            GroupChatSubscription.role == GroupChatRole.admin
                        ).filter(GroupChatSubscription.left == None).count())
                participants_count = (session.query(
                    GroupChatSubscription.id).filter(
                        GroupChatSubscription.group_chat_id ==
                        request.group_chat_id).filter(
                            GroupChatSubscription.user_id != context.user_id
                        ).filter(
                            GroupChatSubscription.role ==
                            GroupChatRole.participant).filter(
                                GroupChatSubscription.left == None).count())
                if not (other_admins_count > 0 or participants_count == 0):
                    context.abort(grpc.StatusCode.FAILED_PRECONDITION,
                                  errors.LAST_ADMIN_CANT_LEAVE)

            _add_message_to_subscription(session,
                                         subscription,
                                         message_type=MessageType.user_left)

            subscription.left = func.now()

        return empty_pb2.Empty()
Esempio n. 29
0
    def DeletePhoto(self, request, context):
        """Deletes a photo.
           gRPC calls this method when clients call the DeletePhoto rpc (method).

        Arguments:
            request (DeletePhotoRequest): The incoming request.
            context: The gRPC connection context.
        
        Returns:
            an Empty gRPC message.
        """
        name = request.name

        try:
            model.delete_photo(name)
        except ValueError:
            return error_handler.throw_exception(
                grpc_context=context,
                code=grpc.StatusCode.NOT_FOUND,
                details='NOT_FOUND: Cannot find specified photo.')

        return empty_pb2.Empty()
Esempio n. 30
0
def _make_transaction(txn_id, **txn_kwargs):
    from google.protobuf import empty_pb2
    from google.cloud.firestore_v1.types import firestore
    from google.cloud.firestore_v1.types import write
    from google.cloud.firestore_v1.async_transaction import AsyncTransaction

    # Create a fake GAPIC ...
    firestore_api = AsyncMock()
    # ... with a dummy ``BeginTransactionResponse`` result ...
    begin_response = firestore.BeginTransactionResponse(transaction=txn_id)
    firestore_api.begin_transaction.return_value = begin_response
    # ... and a dummy ``Rollback`` result ...
    firestore_api.rollback.return_value = empty_pb2.Empty()
    # ... and a dummy ``Commit`` result.
    commit_response = firestore.CommitResponse(write_results=[write.WriteResult()])
    firestore_api.commit.return_value = commit_response

    # Attach the fake GAPIC to a real client.
    client = _make_client()
    client._firestore_api_internal = firestore_api

    return AsyncTransaction(client, **txn_kwargs)