Exemplo n.º 1
0
 def on_nav(e=None, b=None, url=None, *a, **k):
     if not window.ie:
         e.Skip()
         #careful with name collision
         url = e.URL
     try:
         parsed = UrlQuery.parse(url)
     except Exception:
         traceback.print_exc()
     else:
         log.info('url: %r', url)
         log.info('in: %r', 'session' in parsed['query'])
         if 'session' in parsed['query']:
             #not sure how to clean this up right now.
             session = parsed['query'].get('session')
             log.info('parsed: %r', parsed)
             parsed_base = dict(parsed)
             parsed_base.pop('query')
             self.api.set_session(session)
             self.api.logged_in = True
             if not getattr(self, 'dead', False):
                 self.dead = True
                 self.finish_init(True, callback, register, on_success,
                                  on_fail, invisible, do_conn_fail)
             return
Exemplo n.º 2
0
 def on_nav(e = None, b = None, url=None, *a, **k):
     if not window.ie:
         e.Skip()
         #careful with name collision
         url = e.URL
     try:
         parsed = UrlQuery.parse(url)
     except Exception:
         traceback.print_exc()
     else:
         log.info('url: %r', url)
         log.info('in: %r', 'session' in parsed['query'])
         if 'session' in parsed['query']:
             #not sure how to clean this up right now.
             session = parsed['query'].get('session')
             log.info('parsed: %r', parsed)
             parsed_base = dict(parsed)
             parsed_base.pop('query')
             self.api.set_session(session)
             self.api.logged_in = True
             if not getattr(self, 'dead', False):
                 self.dead = True
                 self.finish_init(True, callback, register, on_success, on_fail, invisible, do_conn_fail)
             return
Exemplo n.º 3
0
    def on_call(self, json_obj, webview=None):
        params = json_obj.get('params')
        method = json_obj.get('method')
        id_ = json_obj.get('id')
        events = self.protocol.events

        try:
            call = getattr(self, 'on_call_' + method)
            call.__call__
        except AttributeError:
            pass
        else:
            if call.func_code.co_argcount < 3:
                return call(params[0])
            elif call.func_code.co_argcount < 4:
                return call(params[0], id_)
            else:
                return call(params[0], id_, webview)

        if method == 'viewChanged':
            feedName = params[0].get('feedName')
            events.on_view(feedName)
        elif method == 'following':
            following = params[0].get('following')
            events.following(following)
        elif method == 'state':
            state = params[0].get('state')
            if state is not None:
                events.state_changed(state)
        elif method == 'received_whole_update':
            events.received_whole_update()
        elif method == 'trends':
            trends = params[0].get('trends', None)
            if trends is not None:
                events.trends(trends)
        elif method == 'recentTimeline':
            tweets = params[0].get('tweets')
            events.recent_timeline(tweets)
        elif method == 'selfTweet':
            tweet = params[0].get('tweet')
            events.self_tweet(tweet)
        elif params:
            param = params[0]
            if param is not None and isinstance(param, dict):
                url = param.get('url')
                if url and url.startswith('digsby:'):
                    url = UrlQuery.parse('http' + url[6:], utf8=True) # UrlQuery doesn't like digsby://
                    q = url['query'].get

                    netloc = url['netloc']
                    if netloc == 'reply':
                        id, screen_name, text = q('id'), q('screen_name'), q('text')
                        if id and screen_name:
                            self.protocol.on_reply(id, screen_name, text)
                    elif netloc == 'retweet':
                        id, screen_name, text = q('id'), q('screen_name'), q('text')
                        if id and screen_name:
                            self.protocol.on_retweet(id, screen_name, text)
                    elif netloc == 'direct':
                        screen_name = q('screen_name')
                        if screen_name:
                            self.protocol.on_direct(screen_name)
Exemplo n.º 4
0
    def initialize(self, username, password, userfeeds=None, accountopts=None):
        self.username = username
        self.password = password
        userfeeds = [] if userfeeds is None else userfeeds


        def when_load():
            self.protocol._verify_databases()
            self.evaljs('window.resdir = %s' % simplejson.dumps((path(__file__).parent / 'res').url()))
            def success(token):
                opts = dict(username=self.username,
                            password=self.password,
                            feeds=userfeeds,
                            accountopts=accountopts or {})

                if token is not None:
                    assert hasattr(token, 'key'), repr(token)
                    opts.update(oauthTokenKey = token.key,
                                oauthTokenSecret = token.secret,

                                oauthConsumerKey = twitter_auth.CONSUMER_KEY,
                                oauthConsumerSecret = twitter_auth.CONSUMER_SECRET)

                    time_correction = twitter_auth.get_time_correction()
                    if time_correction is not None:
                        opts['accountopts'].update(timeCorrectionSecs=-time_correction)

                self.JSCall('initialize', **opts)

            api_server = getattr(self.protocol.account, 'api_server', None)
            if api_server is not None:
                return success(None)

            if self.oauth_token is not None:
                try:
                    token = OAuthToken.from_string(self.oauth_token)
                except Exception:
                    traceback.print_exc()
                else:
                    log.info('using token stored in account')
                    return success(token)

            def on_token(token):
                token_string = token.to_string()
                log.info('on_token received token from network: %r', token_string[:5])
                self.protocol.account.update_info(oauth_token=token_string)
                success(token)

            def on_token_error(e):
                errcode = getattr(e, 'code', None)

                # if obtaining an token fails, it may be because our time is set incorrectly.
                # we can use the Date: header returned by Twitter's servers to adjust for
                # this.
                if errcode == 401:
                    server_date = getattr(e, 'hdrs', {}).get('Date', None)
                    retries_after_401 = getattr(self.protocol, 'retries_after_401', 0)
                    if server_date and retries_after_401 < 1:
                        self.protocol.retries_after_401 = retries_after_401 + 1
                        log.warning('on_token_error: server date is %r', server_date)
                        server_date = parse_http_date(server_date)
                        log.warning('on_token_Error: RETRYING WITH NEW SERVER DATE %r', server_date)
                        twitter_auth.set_server_timestamp(server_date)
                        return twitter_auth.get_oauth_token(self.username, self.password, success=on_token, error=on_token_error)

                state = 'autherror' if errcode == 401 else 'connfail'
                log.error('on_token_error: e.code is %r', errcode)
                log.error('  changing state to %r', state)
                self.protocol.events.state_changed(state)

            log.info('getting new oauth token from network')
            twitter_auth.get_oauth_token(self.username, self.password, success=on_token, error=on_token_error)

        self.when_load = when_load

        url = APP_PATH.url()

        from gui.browser import webkit
        webkit.update_origin_whitelist(url, 'https', 'twitter.com', True)
        webkit.update_origin_whitelist(url, 'http', 'twitter.com', True)

        api_server = getattr(self.protocol.account, 'api_server', None)
        if api_server is not None:
            api = UrlQuery.parse(api_server)
            webkit.update_origin_whitelist(url, api['scheme'], api['netloc'], True)

        self.bridge.LoadURL(url)
Exemplo n.º 5
0
def urls_have_same_domain(a, b):
    try:
        return UrlQuery.parse(a).netloc == UrlQuery.parse(b).netloc
    except Exception:
        traceback.print_exc_once()
        return a == b
Exemplo n.º 6
0
    def on_call(self, json_obj, webview=None):
        params = json_obj.get('params')
        method = json_obj.get('method')
        id_ = json_obj.get('id')
        events = self.protocol.events

        try:
            call = getattr(self, 'on_call_' + method)
            call.__call__
        except AttributeError:
            pass
        else:
            if call.func_code.co_argcount < 3:
                return call(params[0])
            elif call.func_code.co_argcount < 4:
                return call(params[0], id_)
            else:
                return call(params[0], id_, webview)

        if method == 'viewChanged':
            feedName = params[0].get('feedName')
            events.on_view(feedName)
        elif method == 'following':
            following = params[0].get('following')
            events.following(following)
        elif method == 'state':
            state = params[0].get('state')
            if state is not None:
                events.state_changed(state)
        elif method == 'received_whole_update':
            events.received_whole_update()
        elif method == 'trends':
            trends = params[0].get('trends', None)
            if trends is not None:
                events.trends(trends)
        elif method == 'recentTimeline':
            tweets = params[0].get('tweets')
            events.recent_timeline(tweets)
        elif method == 'selfTweet':
            tweet = params[0].get('tweet')
            events.self_tweet(tweet)
        elif params:
            param = params[0]
            if param is not None and isinstance(param, dict):
                url = param.get('url')
                if url and url.startswith('digsby:'):
                    url = UrlQuery.parse(
                        'http' + url[6:],
                        utf8=True)  # UrlQuery doesn't like digsby://
                    q = url['query'].get

                    netloc = url['netloc']
                    if netloc == 'reply':
                        id, screen_name, text = q('id'), q('screen_name'), q(
                            'text')
                        if id and screen_name:
                            self.protocol.on_reply(id, screen_name, text)
                    elif netloc == 'retweet':
                        id, screen_name, text = q('id'), q('screen_name'), q(
                            'text')
                        if id and screen_name:
                            self.protocol.on_retweet(id, screen_name, text)
                    elif netloc == 'direct':
                        screen_name = q('screen_name')
                        if screen_name:
                            self.protocol.on_direct(screen_name)
Exemplo n.º 7
0
    def initialize(self, username, password, userfeeds=None, accountopts=None):
        self.username = username
        self.password = password
        userfeeds = [] if userfeeds is None else userfeeds

        def when_load():
            self.protocol._verify_databases()
            self.evaljs('window.resdir = %s' % simplejson.dumps(
                (path(__file__).parent / 'res').url()))

            def success(token):
                opts = dict(username=self.username,
                            password=self.password,
                            feeds=userfeeds,
                            accountopts=accountopts or {})

                if token is not None:
                    assert hasattr(token, 'key'), repr(token)
                    opts.update(
                        oauthTokenKey=token.key,
                        oauthTokenSecret=token.secret,
                        oauthConsumerKey=twitter_auth.CONSUMER_KEY,
                        oauthConsumerSecret=twitter_auth.CONSUMER_SECRET)

                    time_correction = twitter_auth.get_time_correction()
                    if time_correction is not None:
                        opts['accountopts'].update(
                            timeCorrectionSecs=-time_correction)

                self.JSCall('initialize', **opts)

            api_server = getattr(self.protocol.account, 'api_server', None)
            if api_server is not None:
                return success(None)

            if self.oauth_token is not None:
                try:
                    token = OAuthToken.from_string(self.oauth_token)
                except Exception:
                    traceback.print_exc()
                else:
                    log.info('using token stored in account')
                    return success(token)

            def on_token(token):
                token_string = token.to_string()
                log.info('on_token received token from network: %r',
                         token_string[:5])
                self.protocol.account.update_info(oauth_token=token_string)
                success(token)

            def on_token_error(e):
                errcode = getattr(e, 'code', None)

                # if obtaining an token fails, it may be because our time is set incorrectly.
                # we can use the Date: header returned by Twitter's servers to adjust for
                # this.
                if errcode == 401:
                    server_date = getattr(e, 'hdrs', {}).get('Date', None)
                    retries_after_401 = getattr(self.protocol,
                                                'retries_after_401', 0)
                    if server_date and retries_after_401 < 1:
                        self.protocol.retries_after_401 = retries_after_401 + 1
                        log.warning('on_token_error: server date is %r',
                                    server_date)
                        server_date = parse_http_date(server_date)
                        log.warning(
                            'on_token_Error: RETRYING WITH NEW SERVER DATE %r',
                            server_date)
                        twitter_auth.set_server_timestamp(server_date)
                        return twitter_auth.get_oauth_token(
                            self.username,
                            self.password,
                            success=on_token,
                            error=on_token_error)

                state = 'autherror' if errcode == 401 else 'connfail'
                log.error('on_token_error: e.code is %r', errcode)
                log.error('  changing state to %r', state)
                self.protocol.events.state_changed(state)

            log.info('getting new oauth token from network')
            twitter_auth.get_oauth_token(self.username,
                                         self.password,
                                         success=on_token,
                                         error=on_token_error)

        self.when_load = when_load

        url = APP_PATH.url()

        from gui.browser import webkit
        webkit.update_origin_whitelist(url, 'https', 'twitter.com', True)
        webkit.update_origin_whitelist(url, 'http', 'twitter.com', True)

        api_server = getattr(self.protocol.account, 'api_server', None)
        if api_server is not None:
            api = UrlQuery.parse(api_server)
            webkit.update_origin_whitelist(url, api['scheme'], api['netloc'],
                                           True)

        self.bridge.LoadURL(url)
Exemplo n.º 8
0
def urls_have_same_domain(a, b):
    try:
        return UrlQuery.parse(a).netloc == UrlQuery.parse(b).netloc
    except Exception:
        traceback.print_exc_once()
        return a == b