msp: make the MSP gateway URL variable, add proxy access_token support

This commit is contained in:
Benjamin Dauvergne 2013-10-25 15:20:01 +02:00
parent 41bbdc37b9
commit 670fe83314
2 changed files with 64 additions and 29 deletions

View File

@ -11,7 +11,7 @@ class FileWithPreviewAndStrongboxWidget(FileWithPreviewWidget):
data-url="%smyspace/strongbox/pick"
rel="popup">%s</span></p>''') % (
root_url, _('Use file from strongbox'))
if get_publisher().has_site_option('msp') and not self.preview:
if get_publisher().get_site_option('msp') is not None and not self.preview:
get_response().add_javascript(['../../aq/js/msp.js'])
root_url = get_publisher().get_root_url()
t += htmltext('''<p class="use-file-from-msp"><span

View File

@ -9,46 +9,67 @@ from quixote import get_publisher, get_request, redirect, get_response, get_sess
from quixote.directory import AccessControlled, Directory
import qommon.form
from qommon.misc import http_post_request, http_get_page
authorize_url = 'https://portail-citoyen.dev.au-quotidien.com/msp/authorize/'
documents_url = 'https://portail-citoyen.dev.au-quotidien.com/msp/documents/'
document_url = 'https://portail-citoyen.dev.au-quotidien.com/msp/documents/%s/'
class MSPDirectory(Directory):
_q_exports = ['', 'pick', 'download']
def fix_document(self, document, site_charset):
@property
def msp_gateway_base_url(self):
return get_publisher().get_site_option('msp')
@property
def authorize_url(self):
return urlparse.urljoin(self.msp_gateway_base_url, 'authorize/')
@property
def access_token_url(self):
return urlparse.urljoin(self.msp_gateway_base_url, 'access_token/')
@property
def documents_url(self):
return urlparse.urljoin(self.msp_gateway_base_url, 'documents/')
@property
def document_url(self):
return urlparse.urljoin(self.msp_gateway_base_url, 'documents/%s/')
@property
def client_id(self):
return get_publisher().get_site_option('msp_client_id')
@property
def client_secret(self):
return get_publisher().get_site_option('msp_client_secret')
def fix_document(self, document):
site_charset = get_publisher().site_charset
for key, value in document.iteritems():
# date are returned as millisecond POSIX timestamp,
# it should be ISO-8601 instead
if key.endswith('Date') and value is not None:
document[key] = unicode(datetime.date.fromtimestamp(value // 1000))
value = document[key] = document[key].replace(u'-', u'\u2011')
if isinstance(value, unicode) and key != 'content':
document[key] = value.encode(site_charset)
def get_documents(self, code):
params = {
'code': code,
'redirect_uri': authorize_url,
}
url = '%s?%s' % (documents_url, urllib.urlencode(params))
content = urllib2.urlopen(url).read()
def get_documents(self, access_token):
response, status, content, auth_header = http_get_page(self.documents_url, {
'Authorization': 'Bearer %s' % access_token,
});
documents = json.loads(content)
'<ul>'
site_charset = get_publisher().site_charset
for document in documents:
self.fix_document(document, site_charset)
self.fix_document(document)
return documents
def get_document(self, code, doc_id):
params = {
'code': code,
'redirect_uri': authorize_url,
}
url = '%s?%s' % (document_url % doc_id, urllib.urlencode(params))
content = urllib2.urlopen(url).read()
def get_document(self, doc_id, access_token):
response, status, content, auth_header = http_get_page(
self.document_url % doc_id,
{ 'Authorization': 'Bearer %s' % access_token, }
);
document = json.loads(content)
site_charset = get_publisher().site_charset
self.fix_document(document, site_charset)
self.fix_document(document)
return document
def authorize(self, self_url, scope):
@ -58,7 +79,19 @@ class MSPDirectory(Directory):
'scope': scope,
}
return redirect('%s?%s' % (
authorize_url, urllib.urlencode(params)))
self.authorize_url, urllib.urlencode(params)))
def access_token(self, self_url, code):
params = {
'code': code,
'client_id': self.client_id,
'client_secret': self.client_secret,
'grant_type': 'authorization_code',
'redirect_uri': self_url,
}
response, status, data, auth_header = http_post_request(self.access_token_url,
urllib.urlencode(params), { 'Content-Type': 'application/x-www-form-urlencoded' })
return json.loads(data)['access_token']
def pick (self):
request = get_request()
@ -69,9 +102,10 @@ class MSPDirectory(Directory):
if 'code' not in request.form and 'error' not in request.form:
return self.authorize(self_url, 'LIST_DOCS')
return self.pick_display(request.form['code'])
access_token = self.access_token(self_url, request.form['code'])
return self.pick_display(access_token)
def pick_display [html] (self, code):
def pick_display [html] (self, access_token):
request = get_request()
get_response().add_javascript(['jquery.js',
@ -85,7 +119,7 @@ class MSPDirectory(Directory):
'<h2>%s</h2>' % _('Pick a file')
if 'error' not in request.form:
documents = self.get_documents(code)
documents = self.get_documents(access_token)
'<table id="msp-pick-file-table" class="sortable tablesorter">'
'<thead>'
'<tr>'
@ -135,7 +169,8 @@ class MSPDirectory(Directory):
if 'error' in request.form:
return self.download_error()
else:
document = self.get_document(request.form['code'], doc_id)
access_token = self.access_token(self_url, request.form['code'])
document = self.get_document(doc_id, access_token)
download = qommon.form.PicklableUpload(document['name'],
content_type='application/pdf')
download.__setstate__({