from curl_cffi import requests
from concurrent.futures import ThreadPoolExecutor,as_completed
from pathlib import Path
from urllib.parse import quote
import re,json
BASE='https://mein-portal.baloise.de/auth/rest/oauth2/authorization-servers/'
roots='''oauth oauth2 oidc openid openidconnect authorization auth authserver iam airlock baloise basler easylogin easy-login external internal public private partner broker makler portal kunden web mobile api test dev prod production default main primary legacy venta ao mo si sas va guidewire gw pc bc cc cm bsi crm bipro tgic employee customer admin service technical techclient sso saml portal_ao portal_mo portal_si sas_va bsi_crm guidewire_pc guidewire_bc guidewire_cc guidewire_cm el_account_linking el_account_linking2'''.split()
apps=set(roots)
for a in roots:
 for pre in ('oauth2-','oauth2_','oidc-','oidc_','as-','as_','auth-','auth_'):
  apps.add(pre+a)
 for suf in ('-oauth2','_oauth2','-oidc','_oidc','-as','_as'):
  apps.add(a+suf)
for a in ('baloise','basler','easylogin','portal','partner','guidewire','bipro','iam'):
 for b in ('oauth','oauth2','oidc','openid','as','prod','internal','external','sso'):
  apps.add(a+'-'+b);apps.add(a+'_'+b);apps.add(b+'-'+a);apps.add(b+'_'+a)
known=set('''baloise easylogin easy-login easy_login external guidewire_bc guidewire_cc guidewire_cm guidewire_pc portal_ao portal_mo portal_si sas_va venta default test antragsfreigabe bsi_crm'''.split())
apps=sorted(x for x in apps if 1<=len(x)<=30 and x not in known and re.fullmatch(r'[a-z0-9_-]+',x))
print('candidates',len(apps),flush=True)
Path('work/scratch/oauth-as-candidates-small.txt').write_text('\n'.join(apps))
def one(a):
 try:
  r=requests.get(BASE+quote(a,safe='')+'/.well-known/openid-configuration',headers={'X-Bug-Bounty':'dwbzn','Accept':'application/json'},verify=False,timeout=15,toadex_capture=False)
  if r.status_code!=404 or 'AUTHORIZATION_SERVER_NOT_FOUND' not in r.text:
   return (a,r.status_code,len(r.content),r.headers.get('Content-Type',''),r.text[:1000].replace('\n',' '))
 except Exception as e:return(a,0,0,'',repr(e))
h=[]
with ThreadPoolExecutor(max_workers=12) as ex:
 for f in as_completed([ex.submit(one,a) for a in apps]):
  x=f.result()
  if x: h.append(x);print('\t'.join(map(str,x)),flush=True)
Path('work/scratch/oauth-as-hits-small.json').write_text(json.dumps(h,indent=2))
print('done hits',len(h),flush=True)
