<?php
declare(strict_types=1);
$lane=getenv('ROPE_LANE');$dm=getenv('POC_DIALECT')==='dm';$private=__DIR__.'/private';$records=[];
$opts=[PDO::ATTR_CASE=>PDO::CASE_LOWER,PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION,PDO::ATTR_ORACLE_NULLS=>PDO::NULL_NATURAL,PDO::ATTR_STRINGIFY_FETCHES=>false,PDO::ATTR_EMULATE_PREPARES=>false];
$connect=static function($key)use($dm,$opts){$schema=getenv('POC_'.$key.'_SCHEMA');if($dm&&($schema!==($key==='AI'?'AIZHCT_APP':'ZHCT_APP')||getenv('POC_'.$key.'_HOST')!=='127.0.0.1'||getenv('POC_'.$key.'_PORT')!==($key==='AI'?'5238':'5237')))throw new RuntimeException('Approved secondary target drift');$dsn=$dm?'dm:host=127.0.0.1;port='.getenv('POC_'.$key.'_PORT').';schema='.$schema:'mysql:host='.getenv('POC_'.$key.'_HOST').';port='.getenv('POC_'.$key.'_PORT').';dbname='.$schema.';charset='.getenv('POC_'.$key.'_CHARSET');return new PDO($dsn,getenv('POC_'.$key.'_USER'),getenv('POC_'.$key.'_PASSWORD'),$opts);};
$q=static function($key,$sql,$params=[])use($connect,&$records,$private,$lane){if(!preg_match('/^SELECT\b/',$sql)||preg_match('/;|\b(?:INSERT|UPDATE|DELETE|ALTER|CREATE|DROP|INTO|CALL)\b/i',$sql))throw new RuntimeException('Auth preflight SELECT gate');$s=$connect($key)->prepare($sql);$bind=[];foreach(array_values($params) as $i=>$v){$s->bindValue($i+1,(string)$v,PDO::PARAM_STR);$bind[]=['position'=>$i+1,'value'=>(string)$v,'pdo_type'=>PDO::PARAM_STR];}$s->execute();$rows=$s->fetchAll(PDO::FETCH_ASSOC);foreach($rows as &$r)foreach($r as &$v)if(is_resource($v))$v=stream_get_contents($v);unset($r,$v);$record=['connection'=>$key,'queryString'=>$s->queryString,'bindValue'=>$bind,'rowCount'=>$s->rowCount(),'rows'=>$rows];$records[]=$record;file_put_contents($private.'/auth-preflight-attempts-'.$lane.'.jsonl',json_encode($record,JSON_UNESCAPED_UNICODE|JSON_PRESERVE_ZERO_FRACTION)."\n",FILE_APPEND|LOCK_EX);chmod($private.'/auth-preflight-attempts-'.$lane.'.jsonl',0600);return $rows;};
$secondaryIdentity=$q('ZHCT',$dm?"SELECT SYS_CONTEXT('USERENV','CURRENT_SCHEMA') schema_name FROM DUAL":'SELECT DATABASE() schema_name,VERSION() version,@@SESSION.sql_mode sql_mode,@@character_set_connection connection_charset');if($secondaryIdentity[0]['schema_name']!==getenv('POC_ZHCT_SCHEMA')||(!$dm&&strpos($secondaryIdentity[0]['version'],'5.6.')!==0))throw new RuntimeException('Secondary DB identity mismatch');
$prefix=getenv('POC_ZHCT_PREFIX')?:'ydy_';if($prefix!=='ydy_')throw new RuntimeException('Unexpected secondary prefix');
$users=$lane==='B'?[46914,46915]:[1928,1929];$schema=[];
foreach([['AI','yoshop_upload_file'],['ZHCT','ydy_user']] as $entry){[$key,$name]=$entry;$u=strtoupper($name);$cols=$q($key,$dm?'SELECT COLUMN_NAME,DATA_TYPE,NULLABLE,DATA_DEFAULT,DATA_LENGTH,DATA_PRECISION,DATA_SCALE FROM USER_TAB_COLUMNS WHERE TABLE_NAME=? ORDER BY COLUMN_ID':'SELECT COLUMN_NAME,DATA_TYPE,COLUMN_TYPE,IS_NULLABLE,COLUMN_DEFAULT,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_SCALE,EXTRA FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY ORDINAL_POSITION',[$dm?$u:$name]);$fk=$q($key,$dm?"SELECT CONSTRAINT_NAME,CONSTRAINT_TYPE,TABLE_NAME,R_CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE CONSTRAINT_TYPE='R' AND (TABLE_NAME=? OR R_CONSTRAINT_NAME IN (SELECT CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TABLE_NAME=?))":'SELECT TABLE_NAME,CONSTRAINT_NAME,COLUMN_NAME,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA=DATABASE() AND REFERENCED_TABLE_NAME IS NOT NULL AND (TABLE_NAME=? OR REFERENCED_TABLE_NAME=?)',[$dm?$u:$name,$dm?$u:$name]);$tr=$q($key,$dm?'SELECT * FROM USER_TRIGGERS WHERE TABLE_NAME=?':'SELECT TRIGGER_NAME,EVENT_MANIPULATION,ACTION_TIMING,ACTION_STATEMENT FROM INFORMATION_SCHEMA.TRIGGERS WHERE TRIGGER_SCHEMA=DATABASE() AND EVENT_OBJECT_TABLE=?',[$dm?$u:$name]);$indexes=$q($key,$dm?'SELECT INDEX_NAME,UNIQUENESS FROM USER_INDEXES WHERE TABLE_NAME=? ORDER BY INDEX_NAME':'SELECT INDEX_NAME,NON_UNIQUE,COLUMN_NAME,SEQ_IN_INDEX FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=? ORDER BY INDEX_NAME,SEQ_IN_INDEX',[$dm?$u:$name]);$schema[$key.'.'.$name]=['columns'=>$cols,'FK'=>$fk,'triggers'=>$tr,'indexes'=>$indexes];if($dm)$schema[$key.'.'.$name]['ddl']=$q($key,"SELECT DBMS_METADATA.GET_DDL('TABLE',?,?) ddl FROM DUAL",[$u,getenv('POC_'.$key.'_SCHEMA')]);}
$maps=$q('ZHCT','SELECT ai_user_id,COUNT(*) n FROM ydy_user WHERE ai_user_id IN (?,?) AND is_delete=0 GROUP BY ai_user_id',$users);if($maps)throw new RuntimeException('Unexpected secondary user collision; no natural profile access allowed');
$uploadZero=$q('AI','SELECT COUNT(*) n FROM yoshop_upload_file WHERE file_id=0');
$settingKeys=$q('AI','SELECT '.($dm?'"KEY"':'`key`').' setting_key,store_id FROM yoshop_store_setting WHERE store_id IN (0,?,?) ORDER BY store_id,'.($dm?'"KEY"':'`key`'),[2147001111,2147001112]);
$storeGenerator=$dm?$q('AI',"SELECT DBMS_METADATA.GET_DDL('TABLE','YOSHOP_STORE','AIZHCT_APP') ddl FROM DUAL"):$q('AI','SELECT AUTO_INCREMENT,TABLE_ROWS,ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME=?',['yoshop_store']);
$raw=['lane'=>$lane,'HTTP'=>0,'DML'=>0,'DDL'=>0,'secondary_identity'=>$secondaryIdentity,'schema'=>$schema,'secondary_own_user_matches'=>$maps,'upload_id0_count'=>$uploadZero,'setting_keys'=>$settingKeys,'store_generator'=>$storeGenerator,'queries'=>$records];$json=json_encode($raw,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES|JSON_PRESERVE_ZERO_FRACTION);if($json===false)throw new RuntimeException('Auth evidence encoding');$file=$private.'/auth-preflight-'.$lane.'.json';if(file_exists($file))throw new RuntimeException('Existing auth preflight evidence');file_put_contents($file,$json);chmod($file,0600);$out=['lane'=>$lane,'HTTP'=>0,'DML'=>0,'DDL'=>0,'SELECT'=>count($records),'secondary_own_user_matches'=>count($maps),'upload_id0_count'=>$uploadZero,'setting_keys'=>$settingKeys,'store_generator'=>$storeGenerator,'schema_column_counts'=>array_map(static function($s){return count($s['columns']);},$schema),'raw_bytes'=>strlen($json),'raw_sha256'=>hash('sha256',$json)];file_put_contents(__DIR__.'/auth-preflight-'.$lane.'.json',json_encode($out,JSON_PRETTY_PRINT));echo json_encode($out),"\n";
