Пример #1
0
 def get_current_user(self):
     sid = self.get_secure_cookie("sid")
     secret = self.get_secure_cookie("secret")
     if not sid or not secret:
         return None
     self.nsp_user = NSPClient(sid, secret)
     svc_user = self.nsp_user.service('nsp.user')
     ret = svc_user.getInfo(['user.uid', 'user.username'])
     if ret is None or 'user.uid' not in ret or ret['user.uid'] == '':
         return None
     self.uid = '%s' % (ret['user.uid'])
     self.username = '******' % (ret['user.username'])
     user = {'uid' : self.uid, 'username' : self.username}
     return user
Пример #2
0
def sendMsg():
    nsp = NSPClient('2', '8e68aa485d4c2a3853e1fd9dd278847d')
    svc = nsp.service('nsp.event')
    message_type = 'nsp.cloudprint'
    uid = 1130703
    cid = '00d41d8cd98f00b204e980091546ffe6'
    files = list()
    '''
    name = '小说.txt'
    f0 = {'name' : name, 'size' : '3265', 'md5' : 'd0ee66c260ae39fb1efb4f69879c50d3', 'url' : createDownloadUrl('c0o6hcik3l', '1', name)}
    files.append(f0)
    name = 'bitcask-intro.pdf'
    f1 = {'name' : name, 'size' : '324579', 'md5' : '72fe4623357be8446ad673fb91077f00', 'url' : createDownloadUrl('c0kbn3obzv', '1', name)}
    files.append(f1)
    name = '2E0BDF62d01.pdf'
    f2 = {'name' : name, 'size' : '152336', 'md5' : '1231ca284634f7a225422d97afbacd8f', 'url' : createDownloadUrl('c0j743rkh8', '1', name)}
    files.append(f2)
    '''
    name = 'Getting Started.pdf'
    f3 = {'name' : name, 'size' : '127748', 'md5' : '2d75da7f0406283193cf04c3886c8574', 'url' : createDownloadUrl('c0n3la0jvh', '1', name)}
    files.append(f3)
    ret = svc.send(message_type, {'nsp.event.cid' : cid, 'action' : 'print', 'files' : files, 'source.uid' : uid, 'printer' : 'hp_p2015dn'})
    print ret
Пример #3
0
    def __init__(self, printers, http_client):
        # client id
        self.client = None
        # client secret
        self.secret = None

        self.nsp_app = NSPClient(options.appid, options.appsecret)

        # local directory
        #self.dirname = os.path.dirname(os.path.realpath(__file__))
        self.dirname = '/etc/cloudprint'

        self.conf_file = '%s/conf.ini' % (self.dirname)

        self.data_file = '%s/data.ini' % (self.dirname)

        # check if client already init
        self.check()

        self.nsp_push = NSPClient('%s@%s' % (self.client, options.appid), '%s@%s' % (self.secret, options.appsecret))

        self.printer = printers.split(',')

        self.http_client = http_client
Пример #4
0
def sendMsg():
    nsp = NSPClient('50033', 'test50033bba8df90acb8eb160a8087f')
    svc = nsp.service('nsp.push')
    token = '5f2dde08fb4a106760be7d4fb7d3ebf817828'
    message_type = 'nsp.cloudprint'
    uid = 2
    cid = '00574bc1e0bff0828890136748ce8c0f'
    files = list()
    '''
    name = '小说.txt'
    f0 = {'name' : name, 'size' : '3265', 'md5' : 'd0ee66c260ae39fb1efb4f69879c50d3', 'url' : createDownloadUrl('c0o6hcik3l', '1', name)}
    files.append(f0)
    name = 'bitcask-intro.pdf'
    f1 = {'name' : name, 'size' : '324579', 'md5' : '72fe4623357be8446ad673fb91077f00', 'url' : createDownloadUrl('c0kbn3obzv', '1', name)}
    files.append(f1)
    name = '2E0BDF62d01.pdf'
    f2 = {'name' : name, 'size' : '152336', 'md5' : '1231ca284634f7a225422d97afbacd8f', 'url' : createDownloadUrl('c0j743rkh8', '1', name)}
    files.append(f2)
    '''
    name = 'Getting Started.pdf'
    f3 = {'name' : name, 'size' : '127748', 'md5' : '2d75da7f0406283193cf04c3886c8574', 'url' : createDownloadUrl('c0n3la0jvh', '1', name)}
    files.append(f3)
    ret = svc.send(token, {'title' : name, 'content' : '%s %s' % ('print', name), 'data' : {'msg_type' : message_type, 'param' : {'nsp.event.cid' : cid, 'action' : 'print', 'files' : files, 'source.uid' : uid, 'printer' : 'hp_p2015dn'}}})
    print ret
Пример #5
0
class BaseHandler(tornado.web.RequestHandler):
    def get_current_user(self):
        sid = self.get_secure_cookie("sid")
        secret = self.get_secure_cookie("secret")
        if not sid or not secret:
            return None
        self.nsp_user = NSPClient(sid, secret)
        svc_user = self.nsp_user.service('nsp.user')
        ret = svc_user.getInfo(['user.uid', 'user.username'])
        if ret is None or 'user.uid' not in ret or ret['user.uid'] == '':
            return None
        self.uid = '%s' % (ret['user.uid'])
        self.username = '******' % (ret['user.username'])
        user = {'uid' : self.uid, 'username' : self.username}
        self.nsp_app = NSPClient(options.appid, options.appsecret)
        return user
Пример #6
0
    def login(self, username, password):
        '''sign in dbank account'''

        if username is None or username == '' \
                and password is None or password == '':
                    return False

        url = 'http://login.dbank.com/accounts/loginAuth'
        params = urlencode({'userDomain.user.email' : username, 'userDomain.user.password' : password, 'ru' : 'http://www.dbank.com/ServiceLogin.action'})
        self.cookie = cookielib.CookieJar()
        self.opener = build_opener(HTTPCookieProcessor(self.cookie))
        self.opener.addheaders = [
            ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
            ('Accept-Charset', 'GBK,utf-8;q=0.7,*;q=0.3'),
            ('Accept-Encoding', 'gzip,deflate,sdch'),
            ('Accept-Language', 'zh-CN,zh;q=0.8'),
            ('Connection', 'keep-alive'),
            ('Content-Type', 'application/x-www-form-urlencoded'),
            ('Host', 'http://login.dbank.com'),
            ('Origin', 'http://www.dbank.com'),
            ('Referer', 'http://www.dbank.com/'),
            ('User-Agent', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7')
        ]
        request = Request(url, params)
        response = self.opener.open(request)
        info = response.info()
        cookies = self.cookie.make_cookies(response, request)
        for cookie in cookies:
            if cookie.name == 'client':
                self.client = cookie.value
            elif cookie.name == 'secret':
                self.secret = cookie.value
            elif cookie.name == 'session':
                self.session = cookie.value

        if self.client is None or self.client == '' \
                or self.secret is None or self.secret == '' \
                or self.session is None or self.session == '':
                    return False

        self.nsp = NSPClient(self.session, self.secret)
        self.svc_msg = self.nsp.service('nsp.user.push')
        return True
Пример #7
0
    def __init__(self, printer_name):
        # client id
        self.client = None
        # client secret
        self.secret = None
        # session for login
        self.session = None

        self.nsp = NSPClient(appid, appsecret)
        self.svc_auth = self.nsp.service('nsp.auth')

        # local directory
        self.dirname = os.path.dirname(os.path.realpath(__file__))

        # config info of client
        self.filename = '%s/client.conf' % (self.dirname)

        # check if client already init
        self.check()

        self.printer_name = printer_name
Пример #8
0
class Client(object):
    '''cloud printer client'''

    def __init__(self, printers, http_client):
        # client id
        self.client = None
        # client secret
        self.secret = None

        self.nsp_app = NSPClient(options.appid, options.appsecret)

        # local directory
        #self.dirname = os.path.dirname(os.path.realpath(__file__))
        self.dirname = '/etc/cloudprint'

        self.conf_file = '%s/conf.ini' % (self.dirname)

        self.data_file = '%s/data.ini' % (self.dirname)

        # check if client already init
        self.check()

        self.nsp_push = NSPClient('%s@%s' % (self.client, options.appid), '%s@%s' % (self.secret, options.appsecret))

        self.printer = printers.split(',')

        self.http_client = http_client

    def check(self):
        '''init client'''

        infos = dict()
        if not os.path.exists(self.conf_file):
            self.create()
        with open('%s' % (self.conf_file), 'r') as fp:
            for line in fp:
                k, v = line.strip().split('=')
                infos[k] = v
        if 'client' not in infos or 'secret' not in infos:
            self.create()
        self.__dict__.update(infos)

        users = dict()
        if not os.path.exists(self.data_file):
            with open(self.data_file, 'w') as fp:
                pass
        else:
            with open(self.data_file, 'r') as fp:
                for line in fp:
                    uid, username, status, regdate = line.strip().split('\t')
                    users[uid] = {'uid' : uid, 'username' : username, 'status' : status, 'regdate' : datetime.strptime(regdate, '%Y-%m-%d %H:%M:%S')}
        self.__dict__['users'] = users

    def create(self):
        '''create client'''

        svc_auth = self.nsp_app.service('nsp.auth')
        ret = svc_auth.createClient(1)
        if 'errCode' in ret or 'errMsg' in ret:
            raise RuntimeError, "create client failure: %s" % (ret)
        self.client = ret['client']
        self.secret = ret['secret']
        if self.client is None or self.client == '' \
                or self.secret is None or self.secret == '':
            raise RuntimeError, "create client failure: %s" % (ret)
        with open('%s' % (self.conf_file), 'w+') as fp:
            fp.write('client=%s\n' % (self.client))
            fp.write('secret=%s\n' % (self.secret))

    def subscribe(self):
        '''subscribe message'''

        message_type = 'nsp.cloudprint'
        svc_push = self.nsp_push.service('nsp.user.push')
        ret = svc_push.subscribe(message_type)
        if ret is None or ret == '' \
                or 'nsp.http.query.status' not in ret or ret['nsp.http.query.status'] != '200':
                    raise RuntimeError, "subscribe message failure: %s" % (ret)
        interval = ret['nsp.http.query.interval']
        url = ret['nsp.http.query.url']
        return url

    def download(self, url, **headers):
        '''get method of http'''

        host = urlparse.urlparse(url).hostname
        opener = build_opener()
        opener.addheaders = [(k, headers[k]) for k in headers]
        opener.addheaders.append(('Host', host))
        request = Request(url)
        response = opener.open(request)
        info = response.info()
        return response.read()

    def print_file(self, dirname, filename, printer):
        '''print file by ext'''

        ext = os.path.splitext(filename)[1]
        if ext == '.pdf':
            pdf_file = '%s/%s' % (dirname, filename)
            ps_file = '%s/%s.ps' % (dirname, filename)
            call(['/usr/bin/pdftops', pdf_file, ps_file])
            if not os.path.exists(ps_file):
                return False
            call(['/usr/bin/lpr', '-P', printer, ps_file])
            os.remove(ps_file)
        elif ext == '.txt':
            txt_file = '%s/%s' % (dirname, filename)
            call(['/usr/bin/lpr', '-P', printer, txt_file])
        else:
            return False
        return True

    def handle_response(self, response):
        t = threading.Thread(target=self._handle, args=(response,))
        t.start()

    def _handle(self, response):
        waittime = time.time()
        if response.error:
            logging.error('response error:\t%s' % (response.error))
            url = self.subscribe()
            logging.info('push tunnel:\t%s' % (url))
            waittime = waittime + 10
        else:
            logging.info('response body:\t%s' % (response.body.decode('utf-8')))
            json = json_decode(response.body.decode('utf-8'))
            header = json['header']
            if 'nsp.http.query.status' not in header or header['nsp.http.query.status'] != '200':
                logging.error('response status error:\t%s' % (json))
                url = self.subscribe()
                logging.info('push tunnel:\t%s' % (url))
                waittime = waittime + 10
            else:
                interval = header['nsp.http.query.interval']
                url = header['nsp.http.query.url']
                if interval != '0':
                    waittime = waittime + float(interval)
                body = json['body']
                if 'nsp.message.type' in header and 'nsp.event.type' in header and body is not None:
                    source_uid = '%s' % (body['source.uid']) if 'source.uid' in body else ''
                    if source_uid in self.users and self.users[source_uid]['status'] == '1':
                        cid = body['nsp.event.cid']
                        action = body['action']
                        printer = body['printer']
                        files = body['files']
                        if action == 'print':
                            for f in files:
                                logging.info('downloading:\t%s\t%s\t%s' % (f['name'], f['size'], f['md5']))
                                headers = {
                                        'Accept' : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                                        'Accept-Charset' : 'GBK,utf-8;q=0.7,*;q=0.3',
                                        'Accept-Encoding' : 'gzip,deflate,sdch',
                                        'Accept-Language' : 'zh-CN,zh;q=0.8',
                                        'Connection' : 'keep-alive',
                                        'User-Agent' : 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7',
                                        'Referer' : 'http://www.dbank.com'
                                }
                                content = self.download(f['url'], **headers)
                                if len(content) != int(f['size']):
                                    logging.error('file size error:\t%s\t%s\t%s' % (f['name'], len(content), int(f['size'])))
                                    continue
                                if not os.path.exists('%s/data/' % (self.dirname)):
                                    os.makedirs('%s/data/' % (self.dirname))
                                origin_file = '%s/data/%s' % (self.dirname, f['name'])
                                file_md5 = ''
                                with open(origin_file, 'w+') as fp:
                                    file_md5 = md5_for_data(content)
                                    if file_md5 != f['md5']:
                                        logging.error('file md5 error:\t%s\t%s\t%s' % (f['name'], file_md5, f['md5']))
                                        continue
                                    fp.write(content)
                                logging.info('download success:\t%s' % (f['name']))
                                logging.info('printing:\t%s' % (f['name']))
                                ret = self.print_file('%s/data/' % (self.dirname), f['name'], printer)
                                os.remove(origin_file)
                                if ret is False:
                                    logging.error('print error:\t%s' % (f['name']))
                                    continue
                                logging.info('print success:\t%s' % (f['name']))
                        elif action == 'config':
                            pass
        tornado.ioloop.IOLoop.instance().add_timeout(waittime, lambda: self.http_client.fetch(url, callback=self.handle_response, request_timeout=300))
Пример #9
0
class Client(object):
    '''cloud printer client'''

    def __init__(self, printer_name):
        # client id
        self.client = None
        # client secret
        self.secret = None
        # session for login
        self.session = None

        self.nsp = NSPClient(appid, appsecret)
        self.svc_auth = self.nsp.service('nsp.auth')

        # local directory
        self.dirname = os.path.dirname(os.path.realpath(__file__))

        # config info of client
        self.filename = '%s/client.conf' % (self.dirname)

        # check if client already init
        self.check()

        self.printer_name = printer_name

    def check(self):
        '''init client'''

        if not os.path.exists(self.filename):
            self.create()

        infos = dict()
        with open('%s' % (self.filename), 'r') as fp:
            for line in fp:
                k, v = line.strip().split('=')
                infos[k] = v
        self.__dict__.update(infos)

    def create(self):
        '''create client'''

        ret = self.svc_auth.createClient(1)
        if 'errCode' in ret or 'errMsg' in ret:
            raise RuntimeError, "create client failure: code=%s\tmsg=%s" % (ret['errCode'], ret['errMsg'])
        client = ret['client']
        secret = ret['secret']
        if client is None or client == '' \
                or secret is None or secret != '':
            raise RuntimeError, "create client failure: client=%s\tsecret=%s" % (client, secret)
        with open('%s' % (self.filename), 'w+') as fp:
            fp.write('client=%s\n' % (client))
            fp.write('secret=%s\n' % (secret))

    def login(self, username, password):
        '''sign in dbank account'''

        if username is None or username == '' \
                and password is None or password == '':
                    return False

        url = 'http://login.dbank.com/accounts/loginAuth'
        params = urlencode({'userDomain.user.email' : username, 'userDomain.user.password' : password, 'ru' : 'http://www.dbank.com/ServiceLogin.action'})
        self.cookie = cookielib.CookieJar()
        self.opener = build_opener(HTTPCookieProcessor(self.cookie))
        self.opener.addheaders = [
            ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
            ('Accept-Charset', 'GBK,utf-8;q=0.7,*;q=0.3'),
            ('Accept-Encoding', 'gzip,deflate,sdch'),
            ('Accept-Language', 'zh-CN,zh;q=0.8'),
            ('Connection', 'keep-alive'),
            ('Content-Type', 'application/x-www-form-urlencoded'),
            ('Host', 'http://login.dbank.com'),
            ('Origin', 'http://www.dbank.com'),
            ('Referer', 'http://www.dbank.com/'),
            ('User-Agent', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7')
        ]
        request = Request(url, params)
        response = self.opener.open(request)
        info = response.info()
        cookies = self.cookie.make_cookies(response, request)
        for cookie in cookies:
            if cookie.name == 'client':
                self.client = cookie.value
            elif cookie.name == 'secret':
                self.secret = cookie.value
            elif cookie.name == 'session':
                self.session = cookie.value

        if self.client is None or self.client == '' \
                or self.secret is None or self.secret == '' \
                or self.session is None or self.session == '':
                    return False

        self.nsp = NSPClient(self.session, self.secret)
        self.svc_msg = self.nsp.service('nsp.user.push')
        return True

    def subscribe(self):
        '''subscribe message'''

        #self.message_type = 'nsp.cloudprint'
        self.message_type = 'nsp.push.resource'
        ret = self.svc_msg.subscribe(self.message_type)
        if ret is None or ret == '' \
                or 'nsp.http.query.status' not in ret or ret['nsp.http.query.status'] != '200':
                    return False

        interval = ret['nsp.http.query.interval']
        url = ret['nsp.http.query.url']
        return url

    def get(self, url, referer = ''):
        '''get method of http'''

        host = urlparse(url).hostname
        self.opener = build_opener()
        self.opener.addheaders = [
            ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'),
            ('Accept-Charset', 'GBK,utf-8;q=0.7,*;q=0.3'),
            ('Accept-Encoding', 'gzip,deflate,sdch'),
            ('Accept-Language', 'zh-CN,zh;q=0.8'),
            ('Connection', 'keep-alive'),
            ('Host', host),
            ('User-Agent', 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7')
        ]
        if referer is not None and referer != '':
            self.opener.addheaders.append(('Referer', referer))

        request = Request(url)
        response = self.opener.open(request)
        info = response.info()
        return response.read()

    def print_file(self, dirname, filename):
        '''print file by ext'''

        ext = os.path.splitext(filename)[1]
        if ext == '.pdf':
            pdf_file = '%s/%s' % (dirname, filename)
            ps_file = '%s/%s.ps' % (dirname, filename)
            #call(['/usr/bin/pdftops', pdf_file, ps_file])
            if not os.path.exists(ps_file):
                os.remove(pdf_file)
                return False
            #call(['/usr/bin/lpr', '-P', self.printer_name, ps_file])
            os.remove(ps_file)
        elif ext == '.txt':
            txt_file = '%s/%s' % (dirname, filename)
            #call(['/usr/bin/lpr', '-P', self.printer_name, txt_file])
        else:
            return False
        return True

    def createAuthUrl(self):
        machine = '%s@%s' % (getusername(), gethostname())
        h = ('%s' % (time())).split('.')[0]
        v = md5('%s%s%s%s' % (self.client, machine, self.printer_name, h)).hexdigest()[0:8]
        return 'http://apps.dbank.com/cloudprint/register.php?cid=%s&machine=%s&printer=%s&h=%s&v=%s' % (self.client, machine, self.printer_name, h, v)