LinkController.php 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758
  1. <?php
  2. //Thanks to http://blog.csdn.net/jollyjumper/article/details/9823047
  3. namespace App\Controllers;
  4. use App\Models\Link;
  5. use App\Models\User;
  6. use App\Models\Node;
  7. use App\Models\Relay;
  8. use App\Models\Smartline;
  9. use App\Utils\Tools;
  10. use App\Utils\URL;
  11. use App\Services\Config;
  12. /**
  13. * HomeController
  14. */
  15. class LinkController extends BaseController
  16. {
  17. public function __construct()
  18. {
  19. }
  20. public static function GenerateRandomLink()
  21. {
  22. $i =0;
  23. for ($i = 0; $i < 10; $i++) {
  24. $token = Tools::genRandomChar(16);
  25. $Elink = Link::where("token", "=", $token)->first();
  26. if ($Elink == null) {
  27. return $token;
  28. }
  29. }
  30. return "couldn't alloc token";
  31. }
  32. public static function GenerateCode($type, $address, $port, $ios, $userid)
  33. {
  34. $Elink = Link::where("type", "=", $type)->where("address", "=", $address)->where("port", "=", $port)->where("ios", "=", $ios)->where("userid", "=", $userid)->first();
  35. if ($Elink != null) {
  36. return $Elink->token;
  37. }
  38. $NLink = new Link();
  39. $NLink->type = $type;
  40. $NLink->address = $address;
  41. $NLink->port = $port;
  42. $NLink->ios = $ios;
  43. $NLink->userid = $userid;
  44. $NLink->token = LinkController::GenerateRandomLink();
  45. $NLink->save();
  46. return $NLink->token;
  47. }
  48. public static function GenerateApnCode($isp, $address, $port, $userid)
  49. {
  50. $Elink = Link::where("type", "=", 6)->where("address", "=", $address)->where("port", "=", $port)->where("userid", "=", $userid)->where("isp", "=", $isp)->first();
  51. if ($Elink != null) {
  52. return $Elink->token;
  53. }
  54. $NLink = new Link();
  55. $NLink->type = 6;
  56. $NLink->address = $address;
  57. $NLink->port = $port;
  58. $NLink->ios = 1;
  59. $NLink->isp = $isp;
  60. $NLink->userid = $userid;
  61. $NLink->token = LinkController::GenerateRandomLink();
  62. $NLink->save();
  63. return $NLink->token;
  64. }
  65. public static function GenerateSurgeCode($address, $port, $userid, $geo, $method)
  66. {
  67. $Elink = Link::where("type", "=", 0)->where("address", "=", $address)->where("port", "=", $port)->where("userid", "=", $userid)->where("geo", "=", $geo)->where("method", "=", $method)->first();
  68. if ($Elink != null) {
  69. return $Elink->token;
  70. }
  71. $NLink = new Link();
  72. $NLink->type = 0;
  73. $NLink->address = $address;
  74. $NLink->port = $port;
  75. $NLink->ios = 1;
  76. $NLink->geo = $geo;
  77. $NLink->method = $method;
  78. $NLink->userid = $userid;
  79. $NLink->token = LinkController::GenerateRandomLink();
  80. $NLink->save();
  81. return $NLink->token;
  82. }
  83. public static function GenerateIosCode($address, $port, $userid, $geo, $method)
  84. {
  85. $Elink = Link::where("type", "=", -1)->where("address", "=", $address)->where("port", "=", $port)->where("userid", "=", $userid)->where("geo", "=", $geo)->where("method", "=", $method)->first();
  86. if ($Elink != null) {
  87. return $Elink->token;
  88. }
  89. $NLink = new Link();
  90. $NLink->type = -1;
  91. $NLink->address = $address;
  92. $NLink->port = $port;
  93. $NLink->ios = 1;
  94. $NLink->geo = $geo;
  95. $NLink->method = $method;
  96. $NLink->userid = $userid;
  97. $NLink->token = LinkController::GenerateRandomLink();
  98. $NLink->save();
  99. return $NLink->token;
  100. }
  101. public static function GenerateAclCode($address, $port, $userid, $geo, $method)
  102. {
  103. $Elink = Link::where("type", "=", 9)->where("address", "=", $address)->where("port", "=", $port)->where("userid", "=", $userid)->where("geo", "=", $geo)->where("method", "=", $method)->first();
  104. if ($Elink != null) {
  105. return $Elink->token;
  106. }
  107. $NLink = new Link();
  108. $NLink->type = 9;
  109. $NLink->address = $address;
  110. $NLink->port = $port;
  111. $NLink->ios = 0;
  112. $NLink->geo = $geo;
  113. $NLink->method = $method;
  114. $NLink->userid = $userid;
  115. $NLink->token = LinkController::GenerateRandomLink();
  116. $NLink->save();
  117. return $NLink->token;
  118. }
  119. public static function GenerateRouterCode($userid, $without_mu)
  120. {
  121. $Elink = Link::where("type", "=", 10)->where("userid", "=", $userid)->where("geo", $without_mu)->first();
  122. if ($Elink != null) {
  123. return $Elink->token;
  124. }
  125. $NLink = new Link();
  126. $NLink->type = 10;
  127. $NLink->address = "";
  128. $NLink->port = 0;
  129. $NLink->ios = 0;
  130. $NLink->geo = $without_mu;
  131. $NLink->method = "";
  132. $NLink->userid = $userid;
  133. $NLink->token = LinkController::GenerateRandomLink();
  134. $NLink->save();
  135. return $NLink->token;
  136. }
  137. public static function GenerateSSRSubCode($userid, $without_mu)
  138. {
  139. $Elink = Link::where("type", "=", 11)->where("userid", "=", $userid)->where("geo", $without_mu)->first();
  140. if ($Elink != null) {
  141. return $Elink->token;
  142. }
  143. $NLink = new Link();
  144. $NLink->type = 11;
  145. $NLink->address = "";
  146. $NLink->port = 0;
  147. $NLink->ios = 0;
  148. $NLink->geo = $without_mu;
  149. $NLink->method = "";
  150. $NLink->userid = $userid;
  151. $NLink->token = LinkController::GenerateRandomLink();
  152. $NLink->save();
  153. return $NLink->token;
  154. }
  155. public static function GetContent($request, $response, $args)
  156. {
  157. $token = $args['token'];
  158. //$builder->getPhrase();
  159. $Elink = Link::where("token", "=", $token)->first();
  160. if ($Elink == null) {
  161. return null;
  162. }
  163. switch ($Elink->type) {
  164. case -1:
  165. $user=User::where("id", $Elink->userid)->first();
  166. if ($user == null) {
  167. return null;
  168. }
  169. $is_ss = 1;
  170. if (isset($request->getQueryParams()["is_ss"])) {
  171. $is_ss = $request->getQueryParams()["is_ss"];
  172. }
  173. $is_mu = 0;
  174. if (isset($request->getQueryParams()["is_mu"])) {
  175. $is_mu = $request->getQueryParams()["is_mu"];
  176. }
  177. $newResponse = $response->withHeader('Content-type', ' application/octet-stream; charset=utf-8')->withHeader('Cache-Control', 'no-store, no-cache, must-revalidate')->withHeader('Content-Disposition', ' attachment; filename=allinone.conf');//->getBody()->write($builder->output());
  178. $newResponse->getBody()->write(LinkController::GetIosConf($user, $is_mu, $is_ss));
  179. return $newResponse;
  180. case 3:
  181. $type = "PROXY";
  182. break;
  183. case 7:
  184. $type = "PROXY";
  185. break;
  186. case 6:
  187. $newResponse = $response->withHeader('Content-type', ' application/octet-stream; charset=utf-8')->withHeader('Cache-Control', 'no-store, no-cache, must-revalidate')->withHeader('Content-Disposition', ' attachment; filename='.$token.'.mobileconfig');//->getBody()->write($builder->output());
  188. $newResponse->getBody()->write(LinkController::GetApn($Elink->isp, $Elink->address, $Elink->port, User::where("id", "=", $Elink->userid)->first()->pac));
  189. return $newResponse;
  190. case 0:
  191. if ($Elink->geo==0) {
  192. $newResponse = $response->withHeader('Content-type', ' application/octet-stream; charset=utf-8')->withHeader('Cache-Control', 'no-store, no-cache, must-revalidate')->withHeader('Content-Disposition', ' attachment; filename='.$token.'.conf');//->getBody()->write($builder->output());
  193. $newResponse->getBody()->write(LinkController::GetSurge(User::where("id", "=", $Elink->userid)->first()->passwd, $Elink->method, $Elink->address, $Elink->port, User::where("id", "=", $Elink->userid)->first()->pac));
  194. return $newResponse;
  195. } else {
  196. $newResponse = $response->withHeader('Content-type', ' application/octet-stream; charset=utf-8')->withHeader('Cache-Control', 'no-store, no-cache, must-revalidate')->withHeader('Content-Disposition', ' attachment; filename='.$token.'.conf');//->getBody()->write($builder->output());
  197. $newResponse->getBody()->write(LinkController::GetSurgeGeo(User::where("id", "=", $Elink->userid)->first()->passwd, $Elink->method, $Elink->address, $Elink->port));
  198. return $newResponse;
  199. }
  200. case 8:
  201. if ($Elink->ios==0) {
  202. $type = "SOCKS5";
  203. } else {
  204. $type = "SOCKS";
  205. }
  206. break;
  207. case 9:
  208. $newResponse = $response->withHeader('Content-type', ' application/octet-stream; charset=utf-8')->withHeader('Cache-Control', 'no-store, no-cache, must-revalidate')->withHeader('Content-Disposition', ' attachment; filename='.$token.'.acl');//->getBody()->write($builder->output());
  209. $newResponse->getBody()->write(LinkController::GetAcl(User::where("id", "=", $Elink->userid)->first()));
  210. return $newResponse;
  211. case 10:
  212. $user=User::where("id", $Elink->userid)->first();
  213. if ($user == null) {
  214. return null;
  215. }
  216. $is_ss = 0;
  217. if (isset($request->getQueryParams()["is_ss"])) {
  218. $is_ss = $request->getQueryParams()["is_ss"];
  219. }
  220. $newResponse = $response->withHeader('Content-type', ' application/octet-stream; charset=utf-8')->withHeader('Cache-Control', 'no-store, no-cache, must-revalidate')->withHeader('Content-Disposition', ' attachment; filename='.$token.'.sh');//->getBody()->write($builder->output());
  221. $newResponse->getBody()->write(LinkController::GetRouter(User::where("id", "=", $Elink->userid)->first(), $Elink->geo, $is_ss));
  222. return $newResponse;
  223. case 11:
  224. $user=User::where("id", $Elink->userid)->first();
  225. if ($user == null) {
  226. return null;
  227. }
  228. $max = 0;
  229. if (isset($request->getQueryParams()["max"])) {
  230. $max = (int)$request->getQueryParams()["max"];
  231. }
  232. $mu = 0;
  233. if (isset($request->getQueryParams()["mu"])) {
  234. $mu = (int)$request->getQueryParams()["mu"];
  235. }
  236. $newResponse = $response->withHeader('Content-type', ' application/octet-stream; charset=utf-8')->withHeader('Cache-Control', 'no-store, no-cache, must-revalidate')->withHeader('Content-Disposition', ' attachment; filename='.$token.'.txt');
  237. $newResponse->getBody()->write(LinkController::GetSSRSub(User::where("id", "=", $Elink->userid)->first(), $mu, $max));
  238. return $newResponse;
  239. default:
  240. break;
  241. }
  242. $newResponse = $response->withHeader('Content-type', ' application/x-ns-proxy-autoconfig; charset=utf-8')->withHeader('Cache-Control', 'no-store, no-cache, must-revalidate');//->getBody()->write($builder->output());
  243. $newResponse->getBody()->write(LinkController::GetPac($type, $Elink->address, $Elink->port, User::where("id", "=", $Elink->userid)->first()->pac));
  244. return $newResponse;
  245. }
  246. public static function GetGfwlistJs($request, $response, $args)
  247. {
  248. $newResponse = $response->withHeader('Content-type', ' application/x-ns-proxy-autoconfig; charset=utf-8')->withHeader('Cache-Control', 'no-store, no-cache, must-revalidate')->withHeader('Content-Disposition', ' attachment; filename=gfwlist.js');
  249. ;//->getBody()->write($builder->output());
  250. $newResponse->getBody()->write(LinkController::GetMacPac());
  251. return $newResponse;
  252. }
  253. public static function GetPcConf($user, $is_mu = 0, $is_ss = 0)
  254. {
  255. $string='
  256. {
  257. "index" : 0,
  258. "random" : false,
  259. "sysProxyMode" : 0,
  260. "shareOverLan" : false,
  261. "bypassWhiteList" : false,
  262. "localPort" : 1080,
  263. "localAuthPassword" : "'.Tools::genRandomChar(26).'",
  264. "dns_server" : "",
  265. "reconnectTimes" : 4,
  266. "randomAlgorithm" : 0,
  267. "TTL" : 60,
  268. "connect_timeout" : 5,
  269. "proxyRuleMode" : 1,
  270. "proxyEnable" : false,
  271. "pacDirectGoProxy" : false,
  272. "proxyType" : 0,
  273. "proxyHost" : "",
  274. "proxyPort" : 0,
  275. "proxyAuthUser" : "",
  276. "proxyAuthPass" : "",
  277. "proxyUserAgent" : "",
  278. "authUser" : "",
  279. "authPass" : "",
  280. "autoBan" : false,
  281. "sameHostForSameTarget" : true,
  282. "keepVisitTime" : 180,
  283. "isHideTips" : true,
  284. "token" : {
  285. },
  286. "portMap" : {
  287. }
  288. }
  289. ';
  290. $json=json_decode($string, true);
  291. $temparray=array();
  292. $items = URL::getAllItems($user, $is_mu, $is_ss);
  293. foreach($items as $item) {
  294. array_push($temparray, array("remarks"=>$item['remark'],
  295. "server"=>$item['address'],
  296. "server_port"=>$item['port'],
  297. "method"=>$item['method'],
  298. "obfs"=>$item['obfs'],
  299. "obfsparam"=>$item['obfs_param'],
  300. "remarks_base64"=>base64_encode($item['remark']),
  301. "password"=>$item['passwd'],
  302. "tcp_over_udp"=>false,
  303. "udp_over_tcp"=>false,
  304. "group"=>$item['group'],
  305. "protocol"=>$item['protocol'],
  306. "protoparam"=>$item['protocol_param'],
  307. "obfs_udp"=>false,
  308. "enable"=>true));
  309. }
  310. $json["configs"]=$temparray;
  311. return json_encode($json, JSON_PRETTY_PRINT);
  312. }
  313. public static function GetIosConf($user, $is_mu = 0, $is_ss = 0)
  314. {
  315. $proxy_name="";
  316. $proxy_group="";
  317. $items = URL::getAllItems($user, $is_mu, $is_ss);
  318. foreach($items as $item) {
  319. $proxy_group .= $item['remark'].' = custom,'.$item['address'].','.$item['port'].','.$item['method'].','.$item['passwd'].','.Config::get('baseUrl').'/downloads/SSEncrypt.module'.URL::getSurgeObfs($item)."\n";
  320. $proxy_name .= ",".$item['remark'];
  321. }
  322. return '
  323. [General]
  324. skip-proxy = 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, localhost, *.local
  325. bypass-tun = 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
  326. dns-server = 119.29.29.29, 223.5.5.5, 114.114.114.114
  327. loglevel = notify
  328. [Proxy]
  329. DIRECT = direct
  330. '.$proxy_group.'
  331. [Proxy Group]
  332. Proxy = select,DIRECT'.$proxy_name.'
  333. [Rule]
  334. DOMAIN-KEYWORD,adsmogo,REJECT
  335. DOMAIN-SUFFIX,acs86.com,REJECT
  336. DOMAIN-SUFFIX,adcome.cn,REJECT
  337. DOMAIN-SUFFIX,adinfuse.com,REJECT
  338. DOMAIN-SUFFIX,admaster.com.cn,REJECT
  339. DOMAIN-SUFFIX,admob.com,REJECT
  340. DOMAIN-SUFFIX,adsage.cn,REJECT
  341. DOMAIN-SUFFIX,adsage.com,REJECT
  342. DOMAIN-SUFFIX,adsmogo.org,REJECT
  343. DOMAIN-SUFFIX,ads.mobclix.com,REJECT
  344. DOMAIN-SUFFIX,adview.cn,REJECT
  345. DOMAIN-SUFFIX,adwhirl.com,REJECT
  346. DOMAIN-SUFFIX,adwo.com,REJECT
  347. DOMAIN-SUFFIX,appads.com,REJECT
  348. DOMAIN-SUFFIX,domob.cn,REJECT
  349. DOMAIN-SUFFIX,domob.com.cn,REJECT
  350. DOMAIN-SUFFIX,domob.org,REJECT
  351. DOMAIN-SUFFIX,doubleclick.net,REJECT
  352. DOMAIN-SUFFIX,duomeng.cn,REJECT
  353. DOMAIN-SUFFIX,duomeng.net,REJECT
  354. DOMAIN-SUFFIX,duomeng.org,REJECT
  355. DOMAIN-SUFFIX,googeadsserving.cn,REJECT
  356. DOMAIN-SUFFIX,guomob.com,REJECT
  357. DOMAIN-SUFFIX,immob.cn,REJECT
  358. DOMAIN-SUFFIX,inmobi.com,REJECT
  359. DOMAIN-SUFFIX,mobads.baidu.com,REJECT
  360. DOMAIN-SUFFIX,mobads-logs.baidu.com,REJECT
  361. DOMAIN-SUFFIX,smartadserver.com,REJECT
  362. DOMAIN-SUFFIX,tapjoyads.com,REJECT
  363. DOMAIN-SUFFIX,umeng.co,REJECT
  364. DOMAIN-SUFFIX,umeng.com,REJECT
  365. DOMAIN-SUFFIX,umtrack.com,REJECT
  366. DOMAIN-SUFFIX,uyunad.com,REJECT
  367. DOMAIN-SUFFIX,youmi.net,REJECT
  368. GEOIP,AD,Proxy
  369. GEOIP,AE,Proxy
  370. GEOIP,AF,Proxy
  371. GEOIP,AG,Proxy
  372. GEOIP,AI,Proxy
  373. GEOIP,AL,Proxy
  374. GEOIP,AM,Proxy
  375. GEOIP,AO,Proxy
  376. GEOIP,AQ,Proxy
  377. GEOIP,AR,Proxy
  378. GEOIP,AS,Proxy
  379. GEOIP,AS,Proxy
  380. GEOIP,AS,Proxy
  381. GEOIP,AS,Proxy
  382. GEOIP,AT,Proxy
  383. GEOIP,AU,Proxy
  384. GEOIP,AW,Proxy
  385. GEOIP,AX,Proxy
  386. GEOIP,AZ,Proxy
  387. GEOIP,BA,Proxy
  388. GEOIP,BD,Proxy
  389. GEOIP,BE,Proxy
  390. GEOIP,BF,Proxy
  391. GEOIP,BG,Proxy
  392. GEOIP,BH,Proxy
  393. GEOIP,BI,Proxy
  394. GEOIP,BJ,Proxy
  395. GEOIP,BL,Proxy
  396. GEOIP,BM,Proxy
  397. GEOIP,BN,Proxy
  398. GEOIP,BO,Proxy
  399. GEOIP,BQ,Proxy
  400. GEOIP,BR,Proxy
  401. GEOIP,BS,Proxy
  402. GEOIP,BT,Proxy
  403. GEOIP,BW,Proxy
  404. GEOIP,BY,Proxy
  405. GEOIP,BZ,Proxy
  406. GEOIP,CA,Proxy
  407. GEOIP,CC,Proxy
  408. GEOIP,CD,Proxy
  409. GEOIP,CF,Proxy
  410. GEOIP,CG,Proxy
  411. GEOIP,CH,Proxy
  412. GEOIP,CI,Proxy
  413. GEOIP,CK,Proxy
  414. GEOIP,CL,Proxy
  415. GEOIP,CM,Proxy
  416. GEOIP,CO,Proxy
  417. GEOIP,CR,Proxy
  418. GEOIP,CU,Proxy
  419. GEOIP,CV,Proxy
  420. GEOIP,CW,Proxy
  421. GEOIP,CX,Proxy
  422. GEOIP,CY,Proxy
  423. GEOIP,CZ,Proxy
  424. GEOIP,DE,Proxy
  425. GEOIP,DJ,Proxy
  426. GEOIP,DK,Proxy
  427. GEOIP,DM,Proxy
  428. GEOIP,DO,Proxy
  429. GEOIP,DZ,Proxy
  430. GEOIP,EC,Proxy
  431. GEOIP,EE,Proxy
  432. GEOIP,EG,Proxy
  433. GEOIP,EG,Proxy
  434. GEOIP,EH,Proxy
  435. GEOIP,ER,Proxy
  436. GEOIP,ES,Proxy
  437. GEOIP,ET,Proxy
  438. GEOIP,FI,Proxy
  439. GEOIP,FJ,Proxy
  440. GEOIP,FK,Proxy
  441. GEOIP,FM,Proxy
  442. GEOIP,FO,Proxy
  443. GEOIP,FR,Proxy
  444. GEOIP,GA,Proxy
  445. GEOIP,GB,Proxy
  446. GEOIP,GD,Proxy
  447. GEOIP,GE,Proxy
  448. GEOIP,GF,Proxy
  449. GEOIP,GG,Proxy
  450. GEOIP,GH,Proxy
  451. GEOIP,GI,Proxy
  452. GEOIP,GL,Proxy
  453. GEOIP,GM,Proxy
  454. GEOIP,GN,Proxy
  455. GEOIP,GP,Proxy
  456. GEOIP,GQ,Proxy
  457. GEOIP,GR,Proxy
  458. GEOIP,GS,Proxy
  459. GEOIP,GT,Proxy
  460. GEOIP,GU,Proxy
  461. GEOIP,GW,Proxy
  462. GEOIP,GY,Proxy
  463. GEOIP,HK,Proxy
  464. GEOIP,HM,Proxy
  465. GEOIP,HN,Proxy
  466. GEOIP,HR,Proxy
  467. GEOIP,HT,Proxy
  468. GEOIP,HU,Proxy
  469. GEOIP,ID,Proxy
  470. GEOIP,IE,Proxy
  471. GEOIP,IL,Proxy
  472. GEOIP,IM,Proxy
  473. GEOIP,IN,Proxy
  474. GEOIP,IO,Proxy
  475. GEOIP,IQ,Proxy
  476. GEOIP,IR,Proxy
  477. GEOIP,IS,Proxy
  478. GEOIP,IT,Proxy
  479. GEOIP,JE,Proxy
  480. GEOIP,JM,Proxy
  481. GEOIP,JO,Proxy
  482. GEOIP,JP,Proxy
  483. GEOIP,KE,Proxy
  484. GEOIP,KG,Proxy
  485. GEOIP,KH,Proxy
  486. GEOIP,KI,Proxy
  487. GEOIP,KM,Proxy
  488. GEOIP,KN,Proxy
  489. GEOIP,KP,Proxy
  490. GEOIP,KR,Proxy
  491. GEOIP,KW,Proxy
  492. GEOIP,KY,Proxy
  493. GEOIP,KZ,Proxy
  494. GEOIP,LA,Proxy
  495. GEOIP,LB,Proxy
  496. GEOIP,LC,Proxy
  497. GEOIP,LI,Proxy
  498. GEOIP,LK,Proxy
  499. GEOIP,LR,Proxy
  500. GEOIP,LS,Proxy
  501. GEOIP,LT,Proxy
  502. GEOIP,LU,Proxy
  503. GEOIP,LV,Proxy
  504. GEOIP,LY,Proxy
  505. GEOIP,MA,Proxy
  506. GEOIP,MC,Proxy
  507. GEOIP,MD,Proxy
  508. GEOIP,ME,Proxy
  509. GEOIP,MF,Proxy
  510. GEOIP,MG,Proxy
  511. GEOIP,MH,Proxy
  512. GEOIP,MK,Proxy
  513. GEOIP,ML,Proxy
  514. GEOIP,MM,Proxy
  515. GEOIP,MN,Proxy
  516. GEOIP,MO,Proxy
  517. GEOIP,MP,Proxy
  518. GEOIP,MQ,Proxy
  519. GEOIP,MR,Proxy
  520. GEOIP,MS,Proxy
  521. GEOIP,MT,Proxy
  522. GEOIP,MU,Proxy
  523. GEOIP,MV,Proxy
  524. GEOIP,MW,Proxy
  525. GEOIP,MX,Proxy
  526. GEOIP,MY,Proxy
  527. GEOIP,MZ,Proxy
  528. GEOIP,NA,Proxy
  529. GEOIP,NC,Proxy
  530. GEOIP,NE,Proxy
  531. GEOIP,NF,Proxy
  532. GEOIP,NG,Proxy
  533. GEOIP,NI,Proxy
  534. GEOIP,NL,Proxy
  535. GEOIP,NO,Proxy
  536. GEOIP,NP,Proxy
  537. GEOIP,NR,Proxy
  538. GEOIP,NU,Proxy
  539. GEOIP,NZ,Proxy
  540. GEOIP,OM,Proxy
  541. GEOIP,PA,Proxy
  542. GEOIP,PE,Proxy
  543. GEOIP,PF,Proxy
  544. GEOIP,PG,Proxy
  545. GEOIP,PH,Proxy
  546. GEOIP,PK,Proxy
  547. GEOIP,PL,Proxy
  548. GEOIP,PM,Proxy
  549. GEOIP,PN,Proxy
  550. GEOIP,PR,Proxy
  551. GEOIP,PS,Proxy
  552. GEOIP,PT,Proxy
  553. GEOIP,PW,Proxy
  554. GEOIP,PY,Proxy
  555. GEOIP,QA,Proxy
  556. GEOIP,RE,Proxy
  557. GEOIP,RO,Proxy
  558. GEOIP,RS,Proxy
  559. GEOIP,RU,Proxy
  560. GEOIP,RW,Proxy
  561. GEOIP,SA,Proxy
  562. GEOIP,SB,Proxy
  563. GEOIP,SC,Proxy
  564. GEOIP,SD,Proxy
  565. GEOIP,SE,Proxy
  566. GEOIP,SG,Proxy
  567. GEOIP,SH,Proxy
  568. GEOIP,SI,Proxy
  569. GEOIP,SJ,Proxy
  570. GEOIP,SK,Proxy
  571. GEOIP,SL,Proxy
  572. GEOIP,SM,Proxy
  573. GEOIP,SN,Proxy
  574. GEOIP,SO,Proxy
  575. GEOIP,SR,Proxy
  576. GEOIP,SS,Proxy
  577. GEOIP,ST,Proxy
  578. GEOIP,SV,Proxy
  579. GEOIP,SX,Proxy
  580. GEOIP,SY,Proxy
  581. GEOIP,SZ,Proxy
  582. GEOIP,TC,Proxy
  583. GEOIP,TD,Proxy
  584. GEOIP,TF,Proxy
  585. GEOIP,TG,Proxy
  586. GEOIP,TH,Proxy
  587. GEOIP,TJ,Proxy
  588. GEOIP,TK,Proxy
  589. GEOIP,TL,Proxy
  590. GEOIP,TM,Proxy
  591. GEOIP,TN,Proxy
  592. GEOIP,TO,Proxy
  593. GEOIP,TR,Proxy
  594. GEOIP,TT,Proxy
  595. GEOIP,TV,Proxy
  596. GEOIP,TW,Proxy
  597. GEOIP,TZ,Proxy
  598. GEOIP,UA,Proxy
  599. GEOIP,UG,Proxy
  600. GEOIP,UM,Proxy
  601. GEOIP,US,Proxy
  602. GEOIP,UY,Proxy
  603. GEOIP,UZ,Proxy
  604. GEOIP,VA,Proxy
  605. GEOIP,VC,Proxy
  606. GEOIP,VE,Proxy
  607. GEOIP,VG,Proxy
  608. GEOIP,VI,Proxy
  609. GEOIP,VN,Proxy
  610. GEOIP,VU,Proxy
  611. GEOIP,WF,Proxy
  612. GEOIP,WS,Proxy
  613. GEOIP,YE,Proxy
  614. GEOIP,YT,Proxy
  615. GEOIP,ZA,Proxy
  616. GEOIP,ZM,Proxy
  617. GEOIP,ZW,Proxy
  618. IP-CIDR,91.108.4.0/22,Proxy,no-resolve
  619. IP-CIDR,91.108.56.0/22,Proxy,no-resolve
  620. IP-CIDR,109.239.140.0/24,Proxy,no-resolve
  621. IP-CIDR,149.154.160.0/20,Proxy,no-resolve
  622. IP-CIDR,10.0.0.0/8,DIRECT
  623. IP-CIDR,127.0.0.0/8,DIRECT
  624. IP-CIDR,172.16.0.0/12,DIRECT
  625. IP-CIDR,192.168.0.0/16,DIRECT
  626. GEOIP,CN,DIRECT
  627. FINAL,Proxy';
  628. }
  629. private static function GetSurge($passwd, $method, $server, $port, $defined)
  630. {
  631. $rulelist = base64_decode(file_get_contents("https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"))."\n".$defined;
  632. $gfwlist = explode("\n", $rulelist);
  633. $count = 0;
  634. $pac_content = '';
  635. $find_function_content = '
  636. [General]
  637. skip-proxy = 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, localhost, *.local
  638. bypass-tun = 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
  639. dns-server = 119.29.29.29, 223.5.5.5, 114.114.114.114
  640. loglevel = notify
  641. [Proxy]
  642. Proxy = custom,'.$server.','.$port.','.$method.','.$passwd.','.Config::get('baseUrl').'/downloads/SSEncrypt.module
  643. [Rule]
  644. DOMAIN-KEYWORD,adsmogo,REJECT
  645. DOMAIN-SUFFIX,acs86.com,REJECT
  646. DOMAIN-SUFFIX,adcome.cn,REJECT
  647. DOMAIN-SUFFIX,adinfuse.com,REJECT
  648. DOMAIN-SUFFIX,admaster.com.cn,REJECT
  649. DOMAIN-SUFFIX,admob.com,REJECT
  650. DOMAIN-SUFFIX,adsage.cn,REJECT
  651. DOMAIN-SUFFIX,adsage.com,REJECT
  652. DOMAIN-SUFFIX,adsmogo.org,REJECT
  653. DOMAIN-SUFFIX,ads.mobclix.com,REJECT
  654. DOMAIN-SUFFIX,adview.cn,REJECT
  655. DOMAIN-SUFFIX,adwhirl.com,REJECT
  656. DOMAIN-SUFFIX,adwo.com,REJECT
  657. DOMAIN-SUFFIX,appads.com,REJECT
  658. DOMAIN-SUFFIX,domob.cn,REJECT
  659. DOMAIN-SUFFIX,domob.com.cn,REJECT
  660. DOMAIN-SUFFIX,domob.org,REJECT
  661. DOMAIN-SUFFIX,doubleclick.net,REJECT
  662. DOMAIN-SUFFIX,duomeng.cn,REJECT
  663. DOMAIN-SUFFIX,duomeng.net,REJECT
  664. DOMAIN-SUFFIX,duomeng.org,REJECT
  665. DOMAIN-SUFFIX,googeadsserving.cn,REJECT
  666. DOMAIN-SUFFIX,guomob.com,REJECT
  667. DOMAIN-SUFFIX,immob.cn,REJECT
  668. DOMAIN-SUFFIX,inmobi.com,REJECT
  669. DOMAIN-SUFFIX,mobads.baidu.com,REJECT
  670. DOMAIN-SUFFIX,mobads-logs.baidu.com,REJECT
  671. DOMAIN-SUFFIX,smartadserver.com,REJECT
  672. DOMAIN-SUFFIX,tapjoyads.com,REJECT
  673. DOMAIN-SUFFIX,umeng.co,REJECT
  674. DOMAIN-SUFFIX,umeng.com,REJECT
  675. DOMAIN-SUFFIX,umtrack.com,REJECT
  676. DOMAIN-SUFFIX,uyunad.com,REJECT
  677. DOMAIN-SUFFIX,youmi.net,REJECT'."\n";
  678. $isget=array();
  679. foreach ($gfwlist as $index=>$rule) {
  680. if (empty($rule)) {
  681. continue;
  682. } elseif (substr($rule, 0, 1) == '!' || substr($rule, 0, 1) == '[') {
  683. continue;
  684. }
  685. if (substr($rule, 0, 2) == '@@') {
  686. // ||开头表示前面还有路径
  687. if (substr($rule, 2, 2) =='||') {
  688. //$rule_reg = preg_match("/^((http|https):\/\/)?([^\/]+)/i",substr($rule, 2), $matches);
  689. $host = substr($rule, 4);
  690. //preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
  691. if (isset($isget[$host])) {
  692. continue;
  693. }
  694. $isget[$host]=1;
  695. $find_function_content.="DOMAIN,".$host.",DIRECT,force-remote-dns\n";
  696. continue;
  697. // !开头相当于正则表达式^
  698. } elseif (substr($rule, 2, 1) == '|') {
  699. preg_match("/(\d{1,3}\.){3}\d{1,3}/", substr($rule, 3), $matches);
  700. if (!isset($matches[0])) {
  701. continue;
  702. }
  703. $host = $matches[0];
  704. if ($host != "") {
  705. if (isset($isget[$host])) {
  706. continue;
  707. }
  708. $isget[$host]=1;
  709. $find_function_content.="IP-CIDR,".$host."/32,DIRECT,no-resolve \n";
  710. continue;
  711. } else {
  712. preg_match_all("~^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?~i", substr($rule, 3), $matches);
  713. if (!isset($matches[4][0])) {
  714. continue;
  715. }
  716. $host = $matches[4][0];
  717. if ($host != "") {
  718. if (isset($isget[$host])) {
  719. continue;
  720. }
  721. $isget[$host]=1;
  722. $find_function_content.="DOMAIN-SUFFIX,".$host.",DIRECT,force-remote-dns\n";
  723. continue;
  724. }
  725. }
  726. } elseif (substr($rule, 2, 1) == '.') {
  727. $host = substr($rule, 3);
  728. if ($host != "") {
  729. if (isset($isget[$host])) {
  730. continue;
  731. }
  732. $isget[$host]=1;
  733. $find_function_content.="DOMAIN-SUFFIX,".$host.",DIRECT,force-remote-dns \n";
  734. continue;
  735. }
  736. }
  737. }
  738. // ||开头表示前面还有路径
  739. if (substr($rule, 0, 2) =='||') {
  740. //$rule_reg = preg_match("/^((http|https):\/\/)?([^\/]+)/i",substr($rule, 2), $matches);
  741. $host = substr($rule, 2);
  742. //preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
  743. if (strpos($host, "*")!==false) {
  744. $host = substr($host, strpos($host, "*")+1);
  745. if (strpos($host, ".")!==false) {
  746. $host = substr($host, strpos($host, ".")+1);
  747. }
  748. if (isset($isget[$host])) {
  749. continue;
  750. }
  751. $isget[$host]=1;
  752. $find_function_content.="DOMAIN-KEYWORD,".$host.",Proxy,force-remote-dns\n";
  753. continue;
  754. }
  755. if (isset($isget[$host])) {
  756. continue;
  757. }
  758. $isget[$host]=1;
  759. $find_function_content.="DOMAIN,".$host.",Proxy,force-remote-dns\n";
  760. // !开头相当于正则表达式^
  761. } elseif (substr($rule, 0, 1) == '|') {
  762. preg_match("/(\d{1,3}\.){3}\d{1,3}/", substr($rule, 1), $matches);
  763. if (!isset($matches[0])) {
  764. continue;
  765. }
  766. $host = $matches[0];
  767. if ($host != "") {
  768. if (isset($isget[$host])) {
  769. continue;
  770. }
  771. $isget[$host]=1;
  772. $find_function_content.="IP-CIDR,".$host."/32,Proxy,no-resolve \n";
  773. continue;
  774. } else {
  775. preg_match_all("~^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?~i", substr($rule, 1), $matches);
  776. if (!isset($matches[4][0])) {
  777. continue;
  778. }
  779. $host = $matches[4][0];
  780. if (strpos($host, "*")!==false) {
  781. $host = substr($host, strpos($host, "*")+1);
  782. if (strpos($host, ".")!==false) {
  783. $host = substr($host, strpos($host, ".")+1);
  784. }
  785. if (isset($isget[$host])) {
  786. continue;
  787. }
  788. $isget[$host]=1;
  789. $find_function_content.="DOMAIN-KEYWORD,".$host.",Proxy,force-remote-dns\n";
  790. continue;
  791. }
  792. if ($host != "") {
  793. if (isset($isget[$host])) {
  794. continue;
  795. }
  796. $isget[$host]=1;
  797. $find_function_content.="DOMAIN-SUFFIX,".$host.",Proxy,force-remote-dns\n";
  798. continue;
  799. }
  800. }
  801. } else {
  802. $host = substr($rule, 0);
  803. if (strpos($host, "/")!==false) {
  804. $host = substr($host, 0, strpos($host, "/"));
  805. }
  806. if ($host != "") {
  807. if (isset($isget[$host])) {
  808. continue;
  809. }
  810. $isget[$host]=1;
  811. $find_function_content.="DOMAIN-KEYWORD,".$host.",PROXY,force-remote-dns \n";
  812. continue;
  813. }
  814. }
  815. $count = $count + 1;
  816. }
  817. $find_function_content.='
  818. DOMAIN-KEYWORD,google,Proxy,force-remote-dns
  819. IP-CIDR,91.108.4.0/22,Proxy,no-resolve
  820. IP-CIDR,91.108.56.0/22,Proxy,no-resolve
  821. IP-CIDR,109.239.140.0/24,Proxy,no-resolve
  822. IP-CIDR,149.154.160.0/20,Proxy,no-resolve
  823. IP-CIDR,10.0.0.0/8,DIRECT
  824. IP-CIDR,127.0.0.0/8,DIRECT
  825. IP-CIDR,172.16.0.0/12,DIRECT
  826. IP-CIDR,192.168.0.0/16,DIRECT
  827. GEOIP,CN,DIRECT
  828. FINAL,DIRECT
  829. ';
  830. $pac_content.=$find_function_content;
  831. return $pac_content;
  832. }
  833. private static function GetSurgeGeo($passwd, $method, $server, $port)
  834. {
  835. return '
  836. [General]
  837. skip-proxy = 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12, localhost, *.local
  838. bypass-tun = 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
  839. dns-server = 119.29.29.29, 223.5.5.5, 114.114.114.114
  840. loglevel = notify
  841. [Proxy]
  842. Proxy = custom,'.$server.','.$port.','.$method.','.$passwd.','.Config::get('baseUrl').'/downloads/SSEncrypt.module
  843. [Rule]
  844. DOMAIN-KEYWORD,adsmogo,REJECT
  845. DOMAIN-SUFFIX,acs86.com,REJECT
  846. DOMAIN-SUFFIX,adcome.cn,REJECT
  847. DOMAIN-SUFFIX,adinfuse.com,REJECT
  848. DOMAIN-SUFFIX,admaster.com.cn,REJECT
  849. DOMAIN-SUFFIX,admob.com,REJECT
  850. DOMAIN-SUFFIX,adsage.cn,REJECT
  851. DOMAIN-SUFFIX,adsage.com,REJECT
  852. DOMAIN-SUFFIX,adsmogo.org,REJECT
  853. DOMAIN-SUFFIX,ads.mobclix.com,REJECT
  854. DOMAIN-SUFFIX,adview.cn,REJECT
  855. DOMAIN-SUFFIX,adwhirl.com,REJECT
  856. DOMAIN-SUFFIX,adwo.com,REJECT
  857. DOMAIN-SUFFIX,appads.com,REJECT
  858. DOMAIN-SUFFIX,domob.cn,REJECT
  859. DOMAIN-SUFFIX,domob.com.cn,REJECT
  860. DOMAIN-SUFFIX,domob.org,REJECT
  861. DOMAIN-SUFFIX,doubleclick.net,REJECT
  862. DOMAIN-SUFFIX,duomeng.cn,REJECT
  863. DOMAIN-SUFFIX,duomeng.net,REJECT
  864. DOMAIN-SUFFIX,duomeng.org,REJECT
  865. DOMAIN-SUFFIX,googeadsserving.cn,REJECT
  866. DOMAIN-SUFFIX,guomob.com,REJECT
  867. DOMAIN-SUFFIX,immob.cn,REJECT
  868. DOMAIN-SUFFIX,inmobi.com,REJECT
  869. DOMAIN-SUFFIX,mobads.baidu.com,REJECT
  870. DOMAIN-SUFFIX,mobads-logs.baidu.com,REJECT
  871. DOMAIN-SUFFIX,smartadserver.com,REJECT
  872. DOMAIN-SUFFIX,tapjoyads.com,REJECT
  873. DOMAIN-SUFFIX,umeng.co,REJECT
  874. DOMAIN-SUFFIX,umeng.com,REJECT
  875. DOMAIN-SUFFIX,umtrack.com,REJECT
  876. DOMAIN-SUFFIX,uyunad.com,REJECT
  877. DOMAIN-SUFFIX,youmi.net,REJECT
  878. GEOIP,AD,Proxy
  879. GEOIP,AE,Proxy
  880. GEOIP,AF,Proxy
  881. GEOIP,AG,Proxy
  882. GEOIP,AI,Proxy
  883. GEOIP,AL,Proxy
  884. GEOIP,AM,Proxy
  885. GEOIP,AO,Proxy
  886. GEOIP,AQ,Proxy
  887. GEOIP,AR,Proxy
  888. GEOIP,AS,Proxy
  889. GEOIP,AS,Proxy
  890. GEOIP,AS,Proxy
  891. GEOIP,AS,Proxy
  892. GEOIP,AT,Proxy
  893. GEOIP,AU,Proxy
  894. GEOIP,AW,Proxy
  895. GEOIP,AX,Proxy
  896. GEOIP,AZ,Proxy
  897. GEOIP,BA,Proxy
  898. GEOIP,BD,Proxy
  899. GEOIP,BE,Proxy
  900. GEOIP,BF,Proxy
  901. GEOIP,BG,Proxy
  902. GEOIP,BH,Proxy
  903. GEOIP,BI,Proxy
  904. GEOIP,BJ,Proxy
  905. GEOIP,BL,Proxy
  906. GEOIP,BM,Proxy
  907. GEOIP,BN,Proxy
  908. GEOIP,BO,Proxy
  909. GEOIP,BQ,Proxy
  910. GEOIP,BR,Proxy
  911. GEOIP,BS,Proxy
  912. GEOIP,BT,Proxy
  913. GEOIP,BW,Proxy
  914. GEOIP,BY,Proxy
  915. GEOIP,BZ,Proxy
  916. GEOIP,CA,Proxy
  917. GEOIP,CC,Proxy
  918. GEOIP,CD,Proxy
  919. GEOIP,CF,Proxy
  920. GEOIP,CG,Proxy
  921. GEOIP,CH,Proxy
  922. GEOIP,CI,Proxy
  923. GEOIP,CK,Proxy
  924. GEOIP,CL,Proxy
  925. GEOIP,CM,Proxy
  926. GEOIP,CO,Proxy
  927. GEOIP,CR,Proxy
  928. GEOIP,CU,Proxy
  929. GEOIP,CV,Proxy
  930. GEOIP,CW,Proxy
  931. GEOIP,CX,Proxy
  932. GEOIP,CY,Proxy
  933. GEOIP,CZ,Proxy
  934. GEOIP,DE,Proxy
  935. GEOIP,DJ,Proxy
  936. GEOIP,DK,Proxy
  937. GEOIP,DM,Proxy
  938. GEOIP,DO,Proxy
  939. GEOIP,DZ,Proxy
  940. GEOIP,EC,Proxy
  941. GEOIP,EE,Proxy
  942. GEOIP,EG,Proxy
  943. GEOIP,EG,Proxy
  944. GEOIP,EH,Proxy
  945. GEOIP,ER,Proxy
  946. GEOIP,ES,Proxy
  947. GEOIP,ET,Proxy
  948. GEOIP,FI,Proxy
  949. GEOIP,FJ,Proxy
  950. GEOIP,FK,Proxy
  951. GEOIP,FM,Proxy
  952. GEOIP,FO,Proxy
  953. GEOIP,FR,Proxy
  954. GEOIP,GA,Proxy
  955. GEOIP,GB,Proxy
  956. GEOIP,GD,Proxy
  957. GEOIP,GE,Proxy
  958. GEOIP,GF,Proxy
  959. GEOIP,GG,Proxy
  960. GEOIP,GH,Proxy
  961. GEOIP,GI,Proxy
  962. GEOIP,GL,Proxy
  963. GEOIP,GM,Proxy
  964. GEOIP,GN,Proxy
  965. GEOIP,GP,Proxy
  966. GEOIP,GQ,Proxy
  967. GEOIP,GR,Proxy
  968. GEOIP,GS,Proxy
  969. GEOIP,GT,Proxy
  970. GEOIP,GU,Proxy
  971. GEOIP,GW,Proxy
  972. GEOIP,GY,Proxy
  973. GEOIP,HK,Proxy
  974. GEOIP,HM,Proxy
  975. GEOIP,HN,Proxy
  976. GEOIP,HR,Proxy
  977. GEOIP,HT,Proxy
  978. GEOIP,HU,Proxy
  979. GEOIP,ID,Proxy
  980. GEOIP,IE,Proxy
  981. GEOIP,IL,Proxy
  982. GEOIP,IM,Proxy
  983. GEOIP,IN,Proxy
  984. GEOIP,IO,Proxy
  985. GEOIP,IQ,Proxy
  986. GEOIP,IR,Proxy
  987. GEOIP,IS,Proxy
  988. GEOIP,IT,Proxy
  989. GEOIP,JE,Proxy
  990. GEOIP,JM,Proxy
  991. GEOIP,JO,Proxy
  992. GEOIP,JP,Proxy
  993. GEOIP,KE,Proxy
  994. GEOIP,KG,Proxy
  995. GEOIP,KH,Proxy
  996. GEOIP,KI,Proxy
  997. GEOIP,KM,Proxy
  998. GEOIP,KN,Proxy
  999. GEOIP,KP,Proxy
  1000. GEOIP,KR,Proxy
  1001. GEOIP,KW,Proxy
  1002. GEOIP,KY,Proxy
  1003. GEOIP,KZ,Proxy
  1004. GEOIP,LA,Proxy
  1005. GEOIP,LB,Proxy
  1006. GEOIP,LC,Proxy
  1007. GEOIP,LI,Proxy
  1008. GEOIP,LK,Proxy
  1009. GEOIP,LR,Proxy
  1010. GEOIP,LS,Proxy
  1011. GEOIP,LT,Proxy
  1012. GEOIP,LU,Proxy
  1013. GEOIP,LV,Proxy
  1014. GEOIP,LY,Proxy
  1015. GEOIP,MA,Proxy
  1016. GEOIP,MC,Proxy
  1017. GEOIP,MD,Proxy
  1018. GEOIP,ME,Proxy
  1019. GEOIP,MF,Proxy
  1020. GEOIP,MG,Proxy
  1021. GEOIP,MH,Proxy
  1022. GEOIP,MK,Proxy
  1023. GEOIP,ML,Proxy
  1024. GEOIP,MM,Proxy
  1025. GEOIP,MN,Proxy
  1026. GEOIP,MO,Proxy
  1027. GEOIP,MP,Proxy
  1028. GEOIP,MQ,Proxy
  1029. GEOIP,MR,Proxy
  1030. GEOIP,MS,Proxy
  1031. GEOIP,MT,Proxy
  1032. GEOIP,MU,Proxy
  1033. GEOIP,MV,Proxy
  1034. GEOIP,MW,Proxy
  1035. GEOIP,MX,Proxy
  1036. GEOIP,MY,Proxy
  1037. GEOIP,MZ,Proxy
  1038. GEOIP,NA,Proxy
  1039. GEOIP,NC,Proxy
  1040. GEOIP,NE,Proxy
  1041. GEOIP,NF,Proxy
  1042. GEOIP,NG,Proxy
  1043. GEOIP,NI,Proxy
  1044. GEOIP,NL,Proxy
  1045. GEOIP,NO,Proxy
  1046. GEOIP,NP,Proxy
  1047. GEOIP,NR,Proxy
  1048. GEOIP,NU,Proxy
  1049. GEOIP,NZ,Proxy
  1050. GEOIP,OM,Proxy
  1051. GEOIP,PA,Proxy
  1052. GEOIP,PE,Proxy
  1053. GEOIP,PF,Proxy
  1054. GEOIP,PG,Proxy
  1055. GEOIP,PH,Proxy
  1056. GEOIP,PK,Proxy
  1057. GEOIP,PL,Proxy
  1058. GEOIP,PM,Proxy
  1059. GEOIP,PN,Proxy
  1060. GEOIP,PR,Proxy
  1061. GEOIP,PS,Proxy
  1062. GEOIP,PT,Proxy
  1063. GEOIP,PW,Proxy
  1064. GEOIP,PY,Proxy
  1065. GEOIP,QA,Proxy
  1066. GEOIP,RE,Proxy
  1067. GEOIP,RO,Proxy
  1068. GEOIP,RS,Proxy
  1069. GEOIP,RU,Proxy
  1070. GEOIP,RW,Proxy
  1071. GEOIP,SA,Proxy
  1072. GEOIP,SB,Proxy
  1073. GEOIP,SC,Proxy
  1074. GEOIP,SD,Proxy
  1075. GEOIP,SE,Proxy
  1076. GEOIP,SG,Proxy
  1077. GEOIP,SH,Proxy
  1078. GEOIP,SI,Proxy
  1079. GEOIP,SJ,Proxy
  1080. GEOIP,SK,Proxy
  1081. GEOIP,SL,Proxy
  1082. GEOIP,SM,Proxy
  1083. GEOIP,SN,Proxy
  1084. GEOIP,SO,Proxy
  1085. GEOIP,SR,Proxy
  1086. GEOIP,SS,Proxy
  1087. GEOIP,ST,Proxy
  1088. GEOIP,SV,Proxy
  1089. GEOIP,SX,Proxy
  1090. GEOIP,SY,Proxy
  1091. GEOIP,SZ,Proxy
  1092. GEOIP,TC,Proxy
  1093. GEOIP,TD,Proxy
  1094. GEOIP,TF,Proxy
  1095. GEOIP,TG,Proxy
  1096. GEOIP,TH,Proxy
  1097. GEOIP,TJ,Proxy
  1098. GEOIP,TK,Proxy
  1099. GEOIP,TL,Proxy
  1100. GEOIP,TM,Proxy
  1101. GEOIP,TN,Proxy
  1102. GEOIP,TO,Proxy
  1103. GEOIP,TR,Proxy
  1104. GEOIP,TT,Proxy
  1105. GEOIP,TV,Proxy
  1106. GEOIP,TW,Proxy
  1107. GEOIP,TZ,Proxy
  1108. GEOIP,UA,Proxy
  1109. GEOIP,UG,Proxy
  1110. GEOIP,UM,Proxy
  1111. GEOIP,US,Proxy
  1112. GEOIP,UY,Proxy
  1113. GEOIP,UZ,Proxy
  1114. GEOIP,VA,Proxy
  1115. GEOIP,VC,Proxy
  1116. GEOIP,VE,Proxy
  1117. GEOIP,VG,Proxy
  1118. GEOIP,VI,Proxy
  1119. GEOIP,VN,Proxy
  1120. GEOIP,VU,Proxy
  1121. GEOIP,WF,Proxy
  1122. GEOIP,WS,Proxy
  1123. GEOIP,YE,Proxy
  1124. GEOIP,YT,Proxy
  1125. GEOIP,ZA,Proxy
  1126. GEOIP,ZM,Proxy
  1127. GEOIP,ZW,Proxy
  1128. IP-CIDR,91.108.4.0/22,Proxy,no-resolve
  1129. IP-CIDR,91.108.56.0/22,Proxy,no-resolve
  1130. IP-CIDR,109.239.140.0/24,Proxy,no-resolve
  1131. IP-CIDR,149.154.160.0/20,Proxy,no-resolve
  1132. IP-CIDR,10.0.0.0/8,DIRECT
  1133. IP-CIDR,127.0.0.0/8,DIRECT
  1134. IP-CIDR,172.16.0.0/12,DIRECT
  1135. IP-CIDR,192.168.0.0/16,DIRECT
  1136. GEOIP,CN,DIRECT
  1137. FINAL,Proxy';
  1138. }
  1139. private static function GetApn($apn, $server, $port)
  1140. {
  1141. return '
  1142. <?xml version="1.0" encoding="UTF-8"?>
  1143. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  1144. <plist version="1.0">
  1145. <dict>
  1146. <key>PayloadContent</key>
  1147. <array>
  1148. <dict>
  1149. <key>PayloadContent</key>
  1150. <array>
  1151. <dict>
  1152. <key>DefaultsData</key>
  1153. <dict>
  1154. <key>apns</key>
  1155. <array>
  1156. <dict>
  1157. <key>apn</key>
  1158. <string>'.$apn.'</string>
  1159. <key>proxy</key>
  1160. <string>'.$server.'</string>
  1161. <key>proxyPort</key>
  1162. <integer>'.$port.'</integer>
  1163. </dict>
  1164. </array>
  1165. </dict>
  1166. <key>DefaultsDomainName</key>
  1167. <string>com.apple.managedCarrier</string>
  1168. </dict>
  1169. </array>
  1170. <key>PayloadDescription</key>
  1171. <string>提供对营运商“接入点名称”的自定义。</string>
  1172. <key>PayloadDisplayName</key>
  1173. <string>APN</string>
  1174. <key>PayloadIdentifier</key>
  1175. <string>com.tony.APNUNI'.$server.'.</string>
  1176. <key>PayloadOrganization</key>
  1177. <string>Tony</string>
  1178. <key>PayloadType</key>
  1179. <string>com.apple.apn.managed</string>
  1180. <key>PayloadUUID</key>
  1181. <string>7AC1FC00-7670-41CA-9EE1-4A5882DBD'.rand(100, 999).'D</string>
  1182. <key>PayloadVersion</key>
  1183. <integer>1</integer>
  1184. </dict>
  1185. </array>
  1186. <key>PayloadDescription</key>
  1187. <string>APN配置文件</string>
  1188. <key>PayloadDisplayName</key>
  1189. <string>APN快速配置 - '.$server.' ('.$apn.')</string>
  1190. <key>PayloadIdentifier</key>
  1191. <string>com.tony.APNUNI'.$server.'</string>
  1192. <key>PayloadOrganization</key>
  1193. <string>Tony</string>
  1194. <key>PayloadRemovalDisallowed</key>
  1195. <false/>
  1196. <key>PayloadType</key>
  1197. <string>Configuration</string>
  1198. <key>PayloadUUID</key>
  1199. <string>4C355D66-E72E-4DC8-864F-62C416015'.rand(100, 999).'D</string>
  1200. <key>PayloadVersion</key>
  1201. <integer>1</integer>
  1202. </dict>
  1203. </plist>
  1204. ';
  1205. }
  1206. private static function GetPac($type, $address, $port, $defined)
  1207. {
  1208. header('Content-type: application/x-ns-proxy-autoconfig; charset=utf-8');
  1209. return LinkController::get_pac($type, $address, $port, true, $defined);
  1210. }
  1211. private static function GetMacPac()
  1212. {
  1213. header('Content-type: application/x-ns-proxy-autoconfig; charset=utf-8');
  1214. return LinkController::get_mac_pac();
  1215. }
  1216. private static function GetAcl($user)
  1217. {
  1218. $rulelist = base64_decode(file_get_contents("https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"))."\n".$user->pac;
  1219. $gfwlist = explode("\n", $rulelist);
  1220. $count = 0;
  1221. $acl_content = '';
  1222. $find_function_content = '
  1223. #Generated by sspanel-glzjin-mod v3
  1224. #Time:'.date('Y-m-d H:i:s').'
  1225. [bypass_all]
  1226. ';
  1227. $proxy_list = '[proxy_list]
  1228. ';
  1229. $bypass_list = '[bypass_list]
  1230. ';
  1231. $outbound_block_list = '[outbound_block_list]
  1232. ';
  1233. $isget=array();
  1234. foreach ($gfwlist as $index=>$rule) {
  1235. if (empty($rule)) {
  1236. continue;
  1237. } elseif (substr($rule, 0, 1) == '!' || substr($rule, 0, 1) == '[') {
  1238. continue;
  1239. }
  1240. if (substr($rule, 0, 2) == '@@') {
  1241. // ||开头表示前面还有路径
  1242. if (substr($rule, 2, 2) =='||') {
  1243. //$rule_reg = preg_match("/^((http|https):\/\/)?([^\/]+)/i",substr($rule, 2), $matches);
  1244. $host = substr($rule, 4);
  1245. //preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
  1246. if (isset($isget[$host])) {
  1247. continue;
  1248. }
  1249. $isget[$host]=1;
  1250. //$find_function_content.="DOMAIN,".$host.",DIRECT,force-remote-dns\n";
  1251. $bypass_list .= $host."\n";
  1252. continue;
  1253. // !开头相当于正则表达式^
  1254. } elseif (substr($rule, 2, 1) == '|') {
  1255. preg_match("/(\d{1,3}\.){3}\d{1,3}/", substr($rule, 3), $matches);
  1256. if (!isset($matches[0])) {
  1257. continue;
  1258. }
  1259. $host = $matches[0];
  1260. if ($host != "") {
  1261. if (isset($isget[$host])) {
  1262. continue;
  1263. }
  1264. $isget[$host]=1;
  1265. //$find_function_content.="IP-CIDR,".$host."/32,DIRECT,no-resolve \n";
  1266. $bypass_list .= $host."/32\n";
  1267. continue;
  1268. } else {
  1269. preg_match_all("~^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?~i", substr($rule, 3), $matches);
  1270. if (!isset($matches[4][0])) {
  1271. continue;
  1272. }
  1273. $host = $matches[4][0];
  1274. if ($host != "") {
  1275. if (isset($isget[$host])) {
  1276. continue;
  1277. }
  1278. $isget[$host]=1;
  1279. //$find_function_content.="DOMAIN-SUFFIX,".$host.",DIRECT,force-remote-dns\n";
  1280. $bypass_list .= $host."\n";
  1281. continue;
  1282. }
  1283. }
  1284. } elseif (substr($rule, 2, 1) == '.') {
  1285. $host = substr($rule, 3);
  1286. if ($host != "") {
  1287. if (isset($isget[$host])) {
  1288. continue;
  1289. }
  1290. $isget[$host]=1;
  1291. //$find_function_content.="DOMAIN-SUFFIX,".$host.",DIRECT,force-remote-dns \n";
  1292. $bypass_list .= $host."\n";
  1293. continue;
  1294. }
  1295. }
  1296. }
  1297. // ||开头表示前面还有路径
  1298. if (substr($rule, 0, 2) =='||') {
  1299. //$rule_reg = preg_match("/^((http|https):\/\/)?([^\/]+)/i",substr($rule, 2), $matches);
  1300. $host = substr($rule, 2);
  1301. //preg_match("/[^\.\/]+\.[^\.\/]+$/", $host, $matches);
  1302. if (strpos($host, "*")!==false) {
  1303. $host = substr($host, strpos($host, "*")+1);
  1304. if (strpos($host, ".")!==false) {
  1305. $host = substr($host, strpos($host, ".")+1);
  1306. }
  1307. if (isset($isget[$host])) {
  1308. continue;
  1309. }
  1310. $isget[$host]=1;
  1311. //$find_function_content.="DOMAIN-KEYWORD,".$host.",Proxy,force-remote-dns\n";
  1312. $proxy_list .= $host."\n";
  1313. continue;
  1314. }
  1315. if (isset($isget[$host])) {
  1316. continue;
  1317. }
  1318. $isget[$host]=1;
  1319. //$find_function_content.="DOMAIN,".$host.",Proxy,force-remote-dns\n";
  1320. $proxy_list .= $host."\n";
  1321. // !开头相当于正则表达式^
  1322. } elseif (substr($rule, 0, 1) == '|') {
  1323. preg_match("/(\d{1,3}\.){3}\d{1,3}/", substr($rule, 1), $matches);
  1324. if (!isset($matches[0])) {
  1325. continue;
  1326. }
  1327. $host = $matches[0];
  1328. if ($host != "") {
  1329. if (isset($isget[$host])) {
  1330. continue;
  1331. }
  1332. $isget[$host]=1;
  1333. preg_match("/(\d{1,3}\.){3}\d{1,3}\/\d{1,2}/", substr($rule, 1), $matches_ips);
  1334. if (!isset($matches_ips[0])) {
  1335. $proxy_list .= $host."/32\n";
  1336. } else {
  1337. $host = $matches_ips[0];
  1338. $proxy_list .= $host."\n";
  1339. }
  1340. //$find_function_content.="IP-CIDR,".$host."/32,Proxy,no-resolve \n";
  1341. continue;
  1342. } else {
  1343. preg_match_all("~^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?~i", substr($rule, 1), $matches);
  1344. if (!isset($matches[4][0])) {
  1345. continue;
  1346. }
  1347. $host = $matches[4][0];
  1348. if (strpos($host, "*")!==false) {
  1349. $host = substr($host, strpos($host, "*")+1);
  1350. if (strpos($host, ".")!==false) {
  1351. $host = substr($host, strpos($host, ".")+1);
  1352. }
  1353. if (isset($isget[$host])) {
  1354. continue;
  1355. }
  1356. $isget[$host]=1;
  1357. //$find_function_content.="DOMAIN-KEYWORD,".$host.",Proxy,force-remote-dns\n";
  1358. $proxy_list .= $host."\n";
  1359. continue;
  1360. }
  1361. if ($host != "") {
  1362. if (isset($isget[$host])) {
  1363. continue;
  1364. }
  1365. $isget[$host]=1;
  1366. //$find_function_content.="DOMAIN-SUFFIX,".$host.",Proxy,force-remote-dns\n";
  1367. $proxy_list .= $host."\n";
  1368. continue;
  1369. }
  1370. }
  1371. } else {
  1372. $host = substr($rule, 0);
  1373. if (strpos($host, "/")!==false) {
  1374. $host = substr($host, 0, strpos($host, "/"));
  1375. }
  1376. if ($host != "") {
  1377. if (isset($isget[$host])) {
  1378. continue;
  1379. }
  1380. $isget[$host]=1;
  1381. //$find_function_content.="DOMAIN-KEYWORD,".$host.",PROXY,force-remote-dns \n";
  1382. $proxy_list .= $host."\n";
  1383. continue;
  1384. }
  1385. }
  1386. $count = $count + 1;
  1387. }
  1388. $acl_content .= $find_function_content."\n".$proxy_list."\n".$bypass_list."\n".$outbound_block_list;
  1389. return $acl_content;
  1390. }
  1391. /**
  1392. * This is a php implementation of autoproxy2pac
  1393. */
  1394. private static function reg_encode($str)
  1395. {
  1396. $tmp_str = $str;
  1397. $tmp_str = str_replace('/', "\\/", $tmp_str);
  1398. $tmp_str = str_replace('.', "\\.", $tmp_str);
  1399. $tmp_str = str_replace(':', "\\:", $tmp_str);
  1400. $tmp_str = str_replace('%', "\\%", $tmp_str);
  1401. $tmp_str = str_replace('*', ".*", $tmp_str);
  1402. $tmp_str = str_replace('-', "\\-", $tmp_str);
  1403. $tmp_str = str_replace('&', "\\&", $tmp_str);
  1404. $tmp_str = str_replace('?', "\\?", $tmp_str);
  1405. $tmp_str = str_replace('+', "\\+", $tmp_str);
  1406. return $tmp_str;
  1407. }
  1408. private static function get_pac($proxy_type, $proxy_host, $proxy_port, $proxy_google, $defined)
  1409. {
  1410. $rulelist = base64_decode(file_get_contents("https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"))."\n".$defined;
  1411. $gfwlist = explode("\n", $rulelist);
  1412. if ($proxy_google == "true") {
  1413. $gfwlist[] = ".google.com";
  1414. }
  1415. $count = 0;
  1416. $pac_content = '';
  1417. $find_function_content = 'function FindProxyForURL(url, host) { var PROXY = "'.$proxy_type.' '.$proxy_host.':'.$proxy_port.'; DIRECT"; var DEFAULT = "DIRECT";'."\n";
  1418. foreach ($gfwlist as $index=>$rule) {
  1419. if (empty($rule)) {
  1420. continue;
  1421. } elseif (substr($rule, 0, 1) == '!' || substr($rule, 0, 1) == '[') {
  1422. continue;
  1423. }
  1424. $return_proxy = 'PROXY';
  1425. // @@开头表示默认是直接访问
  1426. if (substr($rule, 0, 2) == '@@') {
  1427. $rule = substr($rule, 2);
  1428. $return_proxy = "DEFAULT";
  1429. }
  1430. // ||开头表示前面还有路径
  1431. if (substr($rule, 0, 2) =='||') {
  1432. $rule_reg = "^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?".LinkController::reg_encode(substr($rule, 2));
  1433. // !开头相当于正则表达式^
  1434. } elseif (substr($rule, 0, 1) == '|') {
  1435. $rule_reg = "^" . LinkController::reg_encode(substr($rule, 1));
  1436. // 前后匹配的/表示精确匹配
  1437. } elseif (substr($rule, 0, 1) == '/' && substr($rule, -1) == '/') {
  1438. $rule_reg = substr($rule, 1, strlen($rule) - 2);
  1439. } else {
  1440. $rule_reg = LinkController::reg_encode($rule);
  1441. }
  1442. // 以|结尾,替换为$结尾
  1443. if (preg_match("/\|$/i", $rule_reg)) {
  1444. $rule_reg = substr($rule_reg, 0, strlen($rule_reg) - 1)."$";
  1445. }
  1446. $find_function_content.='if (/' . $rule_reg . '/i.test(url)) return '.$return_proxy.';'."\n";
  1447. $count = $count + 1;
  1448. }
  1449. $find_function_content.='return DEFAULT;'."}";
  1450. $pac_content.=$find_function_content;
  1451. return $pac_content;
  1452. }
  1453. private static function get_mac_pac()
  1454. {
  1455. $rulelist = base64_decode(file_get_contents("https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt"));
  1456. $gfwlist = explode("\n", $rulelist);
  1457. $gfwlist[] = ".google.com";
  1458. $count = 0;
  1459. $pac_content = '';
  1460. $find_function_content = 'function FindProxyForURL(url, host) { var PROXY = "SOCKS5 127.0.0.1:1080; SOCKS 127.0.0.1:1080; DIRECT;"; var DEFAULT = "DIRECT";'."\n";
  1461. foreach ($gfwlist as $index=>$rule) {
  1462. if (empty($rule)) {
  1463. continue;
  1464. } elseif (substr($rule, 0, 1) == '!' || substr($rule, 0, 1) == '[') {
  1465. continue;
  1466. }
  1467. $return_proxy = 'PROXY';
  1468. // @@开头表示默认是直接访问
  1469. if (substr($rule, 0, 2) == '@@') {
  1470. $rule = substr($rule, 2);
  1471. $return_proxy = "DEFAULT";
  1472. }
  1473. // ||开头表示前面还有路径
  1474. if (substr($rule, 0, 2) =='||') {
  1475. $rule_reg = "^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?".LinkController::reg_encode(substr($rule, 2));
  1476. // !开头相当于正则表达式^
  1477. } elseif (substr($rule, 0, 1) == '|') {
  1478. $rule_reg = "^" . LinkController::reg_encode(substr($rule, 1));
  1479. // 前后匹配的/表示精确匹配
  1480. } elseif (substr($rule, 0, 1) == '/' && substr($rule, -1) == '/') {
  1481. $rule_reg = substr($rule, 1, strlen($rule) - 2);
  1482. } else {
  1483. $rule_reg = LinkController::reg_encode($rule);
  1484. }
  1485. // 以|结尾,替换为$结尾
  1486. if (preg_match("/\|$/i", $rule_reg)) {
  1487. $rule_reg = substr($rule_reg, 0, strlen($rule_reg) - 1)."$";
  1488. }
  1489. $find_function_content.='if (/' . $rule_reg . '/i.test(url)) return '.$return_proxy.';'."\n";
  1490. $count = $count + 1;
  1491. }
  1492. $find_function_content.='return DEFAULT;'."}";
  1493. $pac_content.=$find_function_content;
  1494. return $pac_content;
  1495. }
  1496. public static function GetRouter($user, $is_mu = 0, $is_ss = 0)
  1497. {
  1498. $bash = '#!/bin/sh'."\n";
  1499. $bash .= 'export PATH=\'/opt/usr/sbin:/opt/usr/bin:/opt/sbin:/opt/bin:/usr/local/sbin:/usr/sbin:/usr/bin:/sbin:/bin\''."\n";
  1500. $bash .= 'export LD_LIBRARY_PATH=/lib:/opt/lib'."\n";
  1501. $bash .= 'nvram set ss_type='.($is_ss == 1 ? '0' : '1')."\n";
  1502. $count = 0;
  1503. $items = URL::getAllItems($user, $is_mu, $is_ss);
  1504. foreach($items as $item) {
  1505. if($is_ss == 0) {
  1506. $bash .= 'nvram set rt_ss_name_x'.$count.'="'.$item['remark']."\"\n";
  1507. $bash .= 'nvram set rt_ss_port_x'.$count.'='.$item['port']."\n";
  1508. $bash .= 'nvram set rt_ss_password_x'.$count.'="'.$item['passwd']."\"\n";
  1509. $bash .= 'nvram set rt_ss_server_x'.$count.'='.$item['address']."\n";
  1510. $bash .= 'nvram set rt_ss_usage_x'.$count.'="'."-o ".$item['obfs']." -g ".$item['obfs_param']." -O ".$item['protocol']." -G ".$item['protocol_param']."\"\n";
  1511. $bash .= 'nvram set rt_ss_method_x'.$count.'='.$item['method']."\n";
  1512. $count += 1;
  1513. }else{
  1514. $bash .= 'nvram set rt_ss_name_x'.$count.'="'.$item['remark']."\"\n";
  1515. $bash .= 'nvram set rt_ss_port_x'.$count.'='.$item['port']."\n";
  1516. $bash .= 'nvram set rt_ss_password_x'.$count.'="'.$item['passwd']."\"\n";
  1517. $bash .= 'nvram set rt_ss_server_x'.$count.'='.$item['address']."\n";
  1518. $bash .= 'nvram set rt_ss_usage_x'.$count.'=""'."\n";
  1519. $bash .= 'nvram set rt_ss_method_x'.$count.'='.$item['method']."\n";
  1520. $count += 1;
  1521. }
  1522. }
  1523. $bash .= "nvram set rt_ssnum_x=".$count."\n";
  1524. return $bash;
  1525. }
  1526. public static function GetSSRSub($user, $mu = 0, $max = 0)
  1527. {
  1528. return Tools::base64_url_encode(URL::getAllUrl($user, $mu, 0, 1));
  1529. }
  1530. }