import json,time,base64
from pathlib import Path
import requests
client='2422828a-9a70-4bf8-b0c5-26fce94dbbff'
secret='mRiWutXQaxGnuhbeUDkKYempwEgwEVEb'
tenant='j61hrn'
zip_path=Path('work/scratch/config-j61hrn-ui-rules-v14.zip')
s=requests.Session()
# Researcher-owned vendor tenant: intentionally no engagement identifying header.
r=s.post('https://auth.airlock.cloud/login/rest/oauth2/authorization-servers/airlock-console/token',auth=(client,secret),data={'grant_type':'client_credentials','scope':'CONFIG_ACTIVATE CONFIG_UPLOAD'},timeout=30)
r.raise_for_status(); token=r.json()['access_token']
csrf='owned-trial-ui-v14'
h={'Authorization':'Bearer '+token,'X-Same-Domain':'1','X-XSRF-TOKEN':csrf}
c={'XSRF-TOKEN':csrf}
with zip_path.open('rb') as f:
 r=s.post(f'https://manage.airlock.cloud/api/public/v1/tenants/{tenant}/configs',headers=h,cookies=c,files={'configZipFile':(zip_path.name,f,'application/zip')},data={'description':'Owned trial wildcard UI resource-set dispatcher traversal reproduction'},timeout=60)
print('upload',r.status_code,r.text[:1000]); r.raise_for_status(); config_id=r.json()['data']['id']
r=s.post(f'https://manage.airlock.cloud/api/public/v1/tenants/{tenant}/config-activations',headers={**h,'Content-Type':'application/json'},cookies=c,json={'data':{'type':'config_activation','attributes':{'configId':config_id}}},timeout=30)
print('activate',r.status_code,r.text[:1000]); r.raise_for_status(); aid=r.json()['data']['id']
for _ in range(40):
 time.sleep(3)
 r=s.get(f'https://manage.airlock.cloud/api/public/v1/tenants/{tenant}/config-activations/{aid}',headers=h,cookies=c,timeout=30)
 print('poll',r.status_code,r.text[:600])
 if r.status_code==200 and r.json()['data']['attributes']['status'] in ('SUCCESS','FAILED'):
  break
