Exemple #1
0
    def __getattr__(self, func):
        def function(**kwargs):

            if '_call_direct' in kwargs:
                del kwargs['_call_direct']
                self.log.info('Creating a new direct request...')
            elif not self._req_method_list:
                self.log.info('Creating a new request...')

            name = func.upper()
            if kwargs:
                self._req_method_list.append({RequestType.Value(name): kwargs})
                self.log.info("Adding '%s' to RPC request including arguments",
                              name)
                self.log.debug("Arguments of '%s': \n\r%s", name, kwargs)
            else:
                self._req_method_list.append(RequestType.Value(name))
                self.log.info("Adding '%s' to RPC request", name)

            return self

        if func.upper() in RequestType.keys():
            return function
        else:
            raise AttributeError
Exemple #2
0
    def _parse_sub_responses(self,
                             response_proto,
                             subrequests_list,
                             response_proto_dict,
                             use_dict=True):
        self.log.debug('Parsing sub RPC responses...')
        response_proto_dict['responses'] = {}

        if response_proto.status_code == 53:
            exception = ServerApiEndpointRedirectException()
            exception.set_redirected_endpoint(response_proto.api_url)
            raise exception

        list_len = len(subrequests_list) - 1
        i = 0
        for subresponse in response_proto.returns:
            request_entry = subrequests_list[i]
            if isinstance(request_entry, int):
                entry_id = request_entry
            else:
                entry_id = list(request_entry.items())[0][0]

            entry_name = RequestType.Name(entry_id)
            proto_name = entry_name.lower() + '_response'
            proto_classname = 'pogoprotos.networking.responses.' + proto_name + '_pb2.' + proto_name

            self.log.debug("Parsing class: %s", proto_classname)

            subresponse_return = None
            try:
                subresponse_extension = self.get_class(proto_classname)()
            except Exception as e:
                subresponse_extension = None
                error = 'Protobuf definition for {} not found'.format(
                    proto_classname)
                subresponse_return = error
                self.log.warning(error)

            if subresponse_extension:
                try:
                    subresponse_extension.ParseFromString(subresponse)
                    if use_dict:

                        subresponse_return = protobuf_to_dict(
                            subresponse_extension)
                    else:
                        subresponse_return = subresponse_extension
                except Exception:
                    error = "Protobuf definition for {} seems not to match".format(
                        proto_classname)
                    subresponse_return = error
                    self.log.warning(error)

            response_proto_dict['responses'][entry_name] = subresponse_return
            i += 1

        return response_proto_dict
Exemple #3
0
        def add_request(**kwargs):

                if '_call_direct' in kwargs:
                    del kwargs['_call_direct']
                    self.log.info('Creating a new direct request...')
                elif not self._req_method_list:
                    self.log.info('Creating a new request...')

                name = func.upper()
                if kwargs:
                    self._req_method_list.append((RequestType.Value(name), kwargs))
                    self.log.info("Adding '%s' to RPC request including arguments", name)
                    self.log.debug("Arguments of '%s': \n\r%s", name, kwargs)
                else:
                    self._req_method_list.append((RequestType.Value(name), None))
                    self.log.info("Adding '%s' to RPC request", name)

                return self
Exemple #4
0
    def __getattr__(self, func):
        def function(**kwargs):
            request = self.create_request()
            getattr(request, func)(_call_direct=True, **kwargs)
            return request.call()

        if func.upper() in RequestType.keys():
            return function
        else:
            raise AttributeError
Exemple #5
0
    def __getattr__(self, func):
        def function(**kwargs):
            request = self.create_request()
            getattr(request, func)(_call_direct=True, **kwargs )
            return request.call()

        if func.upper() in RequestType.keys():
            return function
        else:
            raise AttributeError
Exemple #6
0
    def __getattr__(self, func):
        def add_request(**kwargs):

            if '_call_direct' in kwargs:
                del kwargs['_call_direct']
                self.log.info('Creating a new direct request...')
            elif not self._req_method_list:
                self.log.info('Creating a new request...')

            name = func.upper()
            if kwargs:
                self._req_method_list.append((RequestType.Value(name), kwargs))
                self.log.info("Adding '%s' to RPC request including arguments",
                              name)
                self.log.debug("Arguments of '%s': \n\r%s", name, kwargs)
            else:
                self._req_method_list.append((RequestType.Value(name), None))
                self.log.info("Adding '%s' to RPC request", name)

            return self

        def add_platform(**kwargs):

            if '_call_direct' in kwargs:
                del kwargs['_call_direct']

            name = func.upper()
            if kwargs:
                self._req_platform_list.append(
                    (PlatformRequestType.Value(name), kwargs))
                self.log.info("Adding '%s' to RPC request including arguments",
                              name)
                self.log.debug("Arguments of '%s': \n\r%s", name, kwargs)
            else:
                self._req_platform_list.append(
                    (PlatformRequestType.Value(name), None))
                self.log.info("Adding '%s' to RPC request", name)

            return self

        name = func.upper()
        if name in RequestType.keys():
            return add_request
        elif name in PlatformRequestType.keys():
            return add_platform
        else:
            raise AttributeError
Exemple #7
0
    def _build_sub_requests(self, mainrequest, subrequest_list):
        self.log.debug('Generating sub RPC requests...')

        for entry_id, params in subrequest_list:
            if params:
                entry_name = RequestType.Name(entry_id)
                proto_name = entry_name.lower() + '_message'
                bytes = self._get_proto_bytes('pogoprotos.networking.requests.messages.', proto_name, params)

                subrequest = mainrequest.requests.add()
                subrequest.request_type = entry_id
                subrequest.request_message = bytes

            else:
                subrequest = mainrequest.requests.add()
                subrequest.request_type = entry_id

        return mainrequest
Exemple #8
0
    def __getattr__(self, func):
        def add_request(**kwargs):

                if '_call_direct' in kwargs:
                    del kwargs['_call_direct']
                    self.log.info('Creating a new direct request...')
                elif not self._req_method_list:
                    self.log.info('Creating a new request...')

                name = func.upper()
                if kwargs:
                    self._req_method_list.append((RequestType.Value(name), kwargs))
                    self.log.info("Adding '%s' to RPC request including arguments", name)
                    self.log.debug("Arguments of '%s': \n\r%s", name, kwargs)
                else:
                    self._req_method_list.append((RequestType.Value(name), None))
                    self.log.info("Adding '%s' to RPC request", name)

                return self

        def add_platform(**kwargs):

            if '_call_direct' in kwargs:
                del kwargs['_call_direct']

            name = func.upper()
            if kwargs:
                self._req_platform_list.append((PlatformRequestType.Value(name), kwargs))
                self.log.info("Adding '%s' to RPC request including arguments", name)
                self.log.debug("Arguments of '%s': \n\r%s", name, kwargs)
            else:
                self._req_platform_list.append((PlatformRequestType.Value(name), None))
                self.log.info("Adding '%s' to RPC request", name)

            return self    

        name = func.upper()
        if name in RequestType.keys():
            return add_request
        elif name in PlatformRequestType.keys():
            return add_platform
        else:
            raise AttributeError
Exemple #9
0
    def __getattr__(self, func):
        def function(**kwargs):

            if '_call_direct' in kwargs:
                del kwargs['_call_direct']
                self.log.info('Creating a new direct request...')
            elif not self._req_method_list:
                self.log.info('Creating a new request...')

            name = func.upper()
            if kwargs:
                self._req_method_list.append({RequestType.Value(name): kwargs})
                self.log.info("Adding '%s' to RPC request including arguments", name)
                self.log.debug("Arguments of '%s': \n\r%s", name, kwargs)
            else:
                self._req_method_list.append(RequestType.Value(name))
                self.log.info("Adding '%s' to RPC request", name)

            return self

        if func.upper() in RequestType.keys():
            return function
        else:
            raise AttributeError
Exemple #10
0
 def list_curr_methods(self):
     for i in self._req_method_list:
         print("{} ({})".format(RequestType.Name(i), i))
Exemple #11
0
    def _build_sub_requests(self, mainrequest, subrequest_list):
        self.log.debug('Generating sub RPC requests...')

        for entry in subrequest_list:
            if isinstance(entry, dict):

                entry_id = list(entry.items())[0][0]
                entry_content = entry[entry_id]

                entry_name = RequestType.Name(entry_id)

                proto_name = entry_name.lower() + '_message'
                proto_classname = 'pogoprotos.networking.requests.messages.' + proto_name + '_pb2.' + proto_name
                subrequest_extension = self.get_class(proto_classname)()

                self.log.debug("Subrequest class: %s", proto_classname)

                for key, value in entry_content.items():
                    if isinstance(value, list):
                        self.log.debug("Found list: %s - trying as repeated",
                                       key)
                        for i in value:
                            try:
                                self.log.debug("%s -> %s", key, i)
                                r = getattr(subrequest_extension, key)
                                r.append(i)
                            except Exception as e:
                                self.log.warning(
                                    'Argument %s with value %s unknown inside %s (Exception: %s)',
                                    key, i, proto_name, e)
                    elif isinstance(value, dict):
                        for k in value.keys():
                            try:
                                r = getattr(subrequest_extension, key)
                                setattr(r, k, value[k])
                            except Exception as e:
                                self.log.warning(
                                    'Argument %s with value %s unknown inside %s (Exception: %s)',
                                    key, str(value), proto_name, e)
                    else:
                        try:
                            setattr(subrequest_extension, key, value)
                        except Exception as e:
                            try:
                                self.log.debug("%s -> %s", key, value)
                                r = getattr(subrequest_extension, key)
                                r.append(value)
                            except Exception as e:
                                self.log.warning(
                                    'Argument %s with value %s unknown inside %s (Exception: %s)',
                                    key, value, proto_name, e)

                subrequest = mainrequest.requests.add()
                subrequest.request_type = entry_id
                subrequest.request_message = subrequest_extension.SerializeToString(
                )

            elif isinstance(entry, int):
                subrequest = mainrequest.requests.add()
                subrequest.request_type = entry
            else:
                raise Exception('Unknown value in request list')

        return mainrequest
Exemple #12
0
    def _build_main_request(self, subrequests, player_position=None):
        self.log.debug('Generating main RPC request...')

        request = RequestEnvelope()
        request.status_code = 2
        request.request_id = self.get_rpc_id()
        request.accuracy = random.choice(
            (5, 5, 5, 5, 10, 10, 10, 30, 30, 50, 65, random.uniform(66, 80)))

        if player_position:
            request.latitude, request.longitude, altitude = player_position

        # generate sub requests before Signature generation
        request = self._build_sub_requests(request, subrequests)

        ticket = self._auth_provider.get_ticket()
        if ticket:
            self.log.debug(
                'Found Session Ticket - using this instead of oauth token')
            request.auth_ticket.expire_timestamp_ms, request.auth_ticket.start, request.auth_ticket.end = ticket
            ticket_serialized = request.auth_ticket.SerializeToString()

        else:
            self.log.debug(
                'No Session Ticket found - using OAUTH Access Token')
            request.auth_info.provider = self._auth_provider.get_name()
            request.auth_info.token.contents = self._auth_provider.get_access_token(
            )
            request.auth_info.token.unknown2 = self.token2
            ticket_serialized = request.auth_info.SerializeToString(
            )  #Sig uses this when no auth_ticket available

        sig = Signature()

        sig.session_hash = self.session_hash
        sig.timestamp = get_time(ms=True)
        sig.timestamp_since_start = get_time(ms=True) - RpcApi.START_TIME
        if sig.timestamp_since_start < 5000:
            sig.timestamp_since_start = random.randint(5000, 8000)

        self._hash_engine.hash(sig.timestamp, request.latitude,
                               request.longitude, request.accuracy,
                               ticket_serialized, sig.session_hash,
                               request.requests)
        sig.location_hash1 = self._hash_engine.get_location_auth_hash()
        sig.location_hash2 = self._hash_engine.get_location_hash()
        for req_hash in self._hash_engine.get_request_hashes():
            sig.request_hash.append(ctypes.c_uint64(req_hash).value)

        loc = sig.location_fix.add()
        sen = sig.sensor_info.add()

        sen.timestamp_snapshot = random.randint(
            sig.timestamp_since_start - 5000, sig.timestamp_since_start - 100)
        loc.timestamp_snapshot = random.randint(
            sig.timestamp_since_start - 5000, sig.timestamp_since_start - 1000)

        loc.provider = random.choice(
            ('network', 'network', 'network', 'network', 'fused'))
        loc.latitude = request.latitude
        loc.longitude = request.longitude

        loc.altitude = altitude or random.triangular(300, 400, 350)

        if random.random() > .95:
            # no reading for roughly 1 in 20 updates
            loc.course = -1
            loc.speed = -1
        else:
            self.course = random.triangular(0, 360, self.course)
            loc.course = self.course
            loc.speed = random.triangular(0.2, 4.25, 1)

        loc.provider_status = 3
        loc.location_type = 1
        if request.accuracy >= 65:
            loc.vertical_accuracy = random.triangular(35, 100, 65)
            loc.horizontal_accuracy = random.choice(
                (request.accuracy, 65, 65, random.uniform(66, 80), 200))
        else:
            if request.accuracy > 10:
                loc.vertical_accuracy = random.choice(
                    (24, 32, 48, 48, 64, 64, 96, 128))
            else:
                loc.vertical_accuracy = random.choice((3, 4, 6, 6, 8, 12, 24))
            loc.horizontal_accuracy = request.accuracy

        sen.linear_acceleration_x = random.triangular(-3, 1, 0)
        sen.linear_acceleration_y = random.triangular(-2, 3, 0)
        sen.linear_acceleration_z = random.triangular(-4, 2, 0)
        sen.magnetic_field_x = random.triangular(-50, 50, 0)
        sen.magnetic_field_y = random.triangular(-60, 50, -5)
        sen.magnetic_field_z = random.triangular(-60, 40, -30)
        sen.magnetic_field_accuracy = random.choice((-1, 1, 1, 2, 2, 2, 2))
        sen.attitude_pitch = random.triangular(-1.5, 1.5, 0.2)
        sen.attitude_yaw = random.uniform(-3, 3)
        sen.attitude_roll = random.triangular(-2.8, 2.5, 0.25)
        sen.rotation_rate_x = random.triangular(-6, 4, 0)
        sen.rotation_rate_y = random.triangular(-5.5, 5, 0)
        sen.rotation_rate_z = random.triangular(-5, 3, 0)
        sen.gravity_x = random.triangular(-1, 1, 0.15)
        sen.gravity_y = random.triangular(-1, 1, -.2)
        sen.gravity_z = random.triangular(-1, .7, -0.8)
        sen.status = 3

        sig.unknown25 = 5348175887752539474

        if self.device_info:
            for key in self.device_info:
                setattr(sig.device_info, key, self.device_info[key])
            if self.device_info['device_brand'] == 'Apple':
                sig.activity_status.stationary = True
        else:
            sig.activity_status.stationary = True

        signature_proto = sig.SerializeToString()

        try:
            if request.requests[0].request_type in (
                    RequestType.Value('GET_MAP_OBJECTS'),
                    RequestType.Value('GET_PLAYER')):
                plat_eight = UnknownPtr8Request()
                plat_eight.message = '15c79df0558009a4242518d2ab65de2a59e09499'
                plat8 = request.platform_requests.add()
                plat8.type = 8
                plat8.request_message = plat_eight.SerializeToString()
        except (IndexError, AttributeError):
            pass

        sig_request = SendEncryptedSignatureRequest()
        sig_request.encrypted_signature = pycrypt(signature_proto,
                                                  sig.timestamp_since_start)
        plat = request.platform_requests.add()
        plat.type = 6
        plat.request_message = sig_request.SerializeToString()

        request.ms_since_last_locationfix = int(
            random.triangular(300, 30000, 10000))

        self.log.debug('Generated protobuf request: \n\r%s', request)

        return request