mirror of https://gitlab.com/bashrc2/epicyon
Refactoring for signed GET
parent
746f58fd7f
commit
894a8ce3fc
141
session.py
141
session.py
|
@ -11,6 +11,7 @@ import os
|
||||||
import requests
|
import requests
|
||||||
from utils import urlPermitted
|
from utils import urlPermitted
|
||||||
from utils import isImageFile
|
from utils import isImageFile
|
||||||
|
from httpsig import createSignedHeader
|
||||||
import json
|
import json
|
||||||
from socket import error as SocketError
|
from socket import error as SocketError
|
||||||
import errno
|
import errno
|
||||||
|
@ -84,49 +85,23 @@ def urlExists(session, url: str, timeoutSec: int = 3,
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def _getJsonSigned(url: str, sessionHeaders: {},
|
def _getJsonRequest(session, url: str, domainFull: str, sessionHeaders: {},
|
||||||
sessionParams: {}, timeoutSec: int) -> {}:
|
sessionParams: {}, timeoutSec: int,
|
||||||
"""Authorized fetch
|
privateKeyPem: str, quiet: bool, debug: bool) -> {}:
|
||||||
|
"""http GET for json
|
||||||
"""
|
"""
|
||||||
# TODO
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def getJson(session, url: str, headers: {}, params: {}, debug: bool,
|
|
||||||
version: str = '1.2.0', httpPrefix: str = 'https',
|
|
||||||
domain: str = 'testdomain',
|
|
||||||
timeoutSec: int = 20, quiet: bool = False) -> {}:
|
|
||||||
if not isinstance(url, str):
|
|
||||||
if debug and not quiet:
|
|
||||||
print('url: ' + str(url))
|
|
||||||
print('ERROR: getJson failed, url should be a string')
|
|
||||||
return None
|
|
||||||
sessionParams = {}
|
|
||||||
sessionHeaders = {}
|
|
||||||
if headers:
|
|
||||||
sessionHeaders = headers
|
|
||||||
if params:
|
|
||||||
sessionParams = params
|
|
||||||
sessionHeaders['User-Agent'] = 'Epicyon/' + version
|
|
||||||
if domain:
|
|
||||||
sessionHeaders['User-Agent'] += \
|
|
||||||
'; +' + httpPrefix + '://' + domain + '/'
|
|
||||||
if not session:
|
|
||||||
if not quiet:
|
|
||||||
print('WARN: getJson failed, no session specified for getJson')
|
|
||||||
return None
|
|
||||||
|
|
||||||
if debug:
|
|
||||||
HTTPConnection.debuglevel = 1
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
result = session.get(url, headers=sessionHeaders,
|
result = session.get(url, headers=sessionHeaders,
|
||||||
params=sessionParams, timeout=timeoutSec)
|
params=sessionParams, timeout=timeoutSec)
|
||||||
if result.status_code != 200:
|
if result.status_code != 200:
|
||||||
if result.status_code == 401:
|
if result.status_code == 401:
|
||||||
print("WARN: getJson requires secure fetch url: " + url)
|
if not privateKeyPem:
|
||||||
return _getJsonSigned(url, sessionHeaders,
|
print("WARN: getJson requires secure fetch url: " + url)
|
||||||
sessionParams, timeoutSec)
|
else:
|
||||||
|
return _getJsonSigned(session, url, domainFull,
|
||||||
|
sessionHeaders, sessionParams,
|
||||||
|
timeoutSec, privateKeyPem,
|
||||||
|
quiet, debug)
|
||||||
elif result.status_code == 403:
|
elif result.status_code == 403:
|
||||||
print('WARN: getJson Forbidden url: ' + url)
|
print('WARN: getJson Forbidden url: ' + url)
|
||||||
elif result.status_code == 404:
|
elif result.status_code == 404:
|
||||||
|
@ -161,6 +136,98 @@ def getJson(session, url: str, headers: {}, params: {}, debug: bool,
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def _getJsonSigned(session, url: str, domainFull: str, sessionHeaders: {},
|
||||||
|
sessionParams: {}, timeoutSec: int,
|
||||||
|
privateKeyPem: str, quiet: bool, debug: bool) -> {}:
|
||||||
|
"""Authorized fetch
|
||||||
|
"""
|
||||||
|
if not domainFull:
|
||||||
|
if debug:
|
||||||
|
print('No sending domain for signed GET')
|
||||||
|
return None
|
||||||
|
if '://' not in url:
|
||||||
|
return None
|
||||||
|
httpPrefix = url.split('://')[0]
|
||||||
|
toDomainFull = url.split('://')[1]
|
||||||
|
if '/' in toDomainFull:
|
||||||
|
toDomainFull = toDomainFull.split('/')[0]
|
||||||
|
|
||||||
|
if ':' in domainFull:
|
||||||
|
domain = domainFull.split(':')[0]
|
||||||
|
port = domainFull.split(':')[1]
|
||||||
|
else:
|
||||||
|
domain = domainFull
|
||||||
|
if httpPrefix == 'https':
|
||||||
|
port = 443
|
||||||
|
else:
|
||||||
|
port = 80
|
||||||
|
|
||||||
|
if ':' in toDomainFull:
|
||||||
|
toDomain = toDomainFull.split(':')[0]
|
||||||
|
toPort = toDomainFull.split(':')[1]
|
||||||
|
else:
|
||||||
|
toDomain = toDomainFull
|
||||||
|
if httpPrefix == 'https':
|
||||||
|
toPort = 443
|
||||||
|
else:
|
||||||
|
toPort = 80
|
||||||
|
# instance actor
|
||||||
|
nickname = domain
|
||||||
|
|
||||||
|
if debug:
|
||||||
|
print('Signed GET privateKeyPem: ' + privateKeyPem)
|
||||||
|
print('Signed GET nickname: ' + nickname)
|
||||||
|
print('Signed GET domain: ' + domain + ' ' + str(port))
|
||||||
|
print('Signed GET toDomain: ' + toDomain + ' ' + str(toPort))
|
||||||
|
print('Signed GET url: ' + url)
|
||||||
|
print('Signed GET httpPrefix: ' + httpPrefix)
|
||||||
|
signatureHeaderJson = \
|
||||||
|
createSignedHeader(privateKeyPem, nickname, domain, port,
|
||||||
|
toDomain, toPort,
|
||||||
|
url, httpPrefix, False, '')
|
||||||
|
for key, value in signatureHeaderJson.items():
|
||||||
|
if key == 'Accept' or key == 'User-Agent':
|
||||||
|
continue
|
||||||
|
sessionHeaders[key] = value
|
||||||
|
|
||||||
|
return _getJsonRequest(session, url, domainFull, sessionHeaders,
|
||||||
|
sessionParams, timeoutSec,
|
||||||
|
None, quiet, debug)
|
||||||
|
|
||||||
|
|
||||||
|
def getJson(session, url: str, headers: {}, params: {}, debug: bool,
|
||||||
|
version: str = '1.2.0', httpPrefix: str = 'https',
|
||||||
|
domain: str = 'testdomain',
|
||||||
|
timeoutSec: int = 20, quiet: bool = False) -> {}:
|
||||||
|
if not isinstance(url, str):
|
||||||
|
if debug and not quiet:
|
||||||
|
print('url: ' + str(url))
|
||||||
|
print('ERROR: getJson failed, url should be a string')
|
||||||
|
return None
|
||||||
|
sessionParams = {}
|
||||||
|
sessionHeaders = {}
|
||||||
|
if headers:
|
||||||
|
sessionHeaders = headers
|
||||||
|
if params:
|
||||||
|
sessionParams = params
|
||||||
|
sessionHeaders['User-Agent'] = 'Epicyon/' + version
|
||||||
|
if domain:
|
||||||
|
sessionHeaders['User-Agent'] += \
|
||||||
|
'; +' + httpPrefix + '://' + domain + '/'
|
||||||
|
if not session:
|
||||||
|
if not quiet:
|
||||||
|
print('WARN: getJson failed, no session specified for getJson')
|
||||||
|
return None
|
||||||
|
|
||||||
|
if debug:
|
||||||
|
HTTPConnection.debuglevel = 1
|
||||||
|
|
||||||
|
privateKeyPem = 'TODO instance actor private key'
|
||||||
|
return _getJsonRequest(session, url, domain, sessionHeaders,
|
||||||
|
sessionParams, timeoutSec,
|
||||||
|
privateKeyPem, quiet, debug)
|
||||||
|
|
||||||
|
|
||||||
def postJson(httpPrefix: str, domainFull: str,
|
def postJson(httpPrefix: str, domainFull: str,
|
||||||
session, postJsonObject: {}, federationList: [],
|
session, postJsonObject: {}, federationList: [],
|
||||||
inboxUrl: str, headers: {}, timeoutSec: int = 60,
|
inboxUrl: str, headers: {}, timeoutSec: int = 60,
|
||||||
|
|
Loading…
Reference in New Issue