From 879bd8d408a914cd7942edb445e055ace8337726 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Wed, 11 Oct 2017 12:50:09 -0600 Subject: [PATCH] Add support for downloading reports from mobile app, add HTML export format --- database.mwb | Bin 0 -> 5714 bytes database.sql | 34 +++++++++++++++++++++++ lang/en_us.php | 1 + lib/reports.php | 61 +++++++++++++++++++++++++++++++++++++++--- pages/export.php | 11 +++++--- required.php | 16 ++++++++++- settings.template.php | 10 ++++++- 7 files changed, 125 insertions(+), 8 deletions(-) create mode 100644 database.mwb create mode 100644 database.sql diff --git a/database.mwb b/database.mwb new file mode 100644 index 0000000000000000000000000000000000000000..09624edb6bb515dbf73a9dae97f4900be2abbf5c GIT binary patch literal 5714 zcmZ{oRZtwvUeaNTU43|Q-wC~2e18Yf$owHaWh%8Yt*jyF`lApAodH-&4bVB19h z;dcN)UOq)yoes^2cCCcwS501F2`adH)+he+996IHcNSU5CjeOe2 zak`XMIc$k^#BgID+L?d^Bvf}@v^Z2S%~!j3iuWRR0sAa>34{VyaLqKTs7z+rxtOm@c<%RgXGSD&*r5*UgG-I2M}Y z7jvIi{w}b^zEYru%TIfeh(YbO*RGVvfgX9eS?$G%+CCP$xL177V}s#+Nt~IqrgA~- zrZFXf{jx*m6SX(jwdGyj)bE>ku>ge^yty!u0Dy;_IN$9=zZwPCPU`K9RYo= zt<_n>5)A~Z86#NHN60mf8cSInq>?JM*?en9UuKV|SZI8{ZsOk*8BLVNUF(}J8gpM# z)X?jcH*KK*jrx1z$5}3=Q6eZIqq0|RRZvspvlFUipG4%9{VBL{r#m5#jU}^@wMvO>P6 zrQYe-0uOh-HSbpUs!0%4mN3_#D`tcJs`PKB#v!jWr=etJd+ah|r4}9T;4|;y6yS71 zV)bMWPxp^&{8f}%vU8~}i4tD5=#mr~N8~?yr03X&ebq!f!euK}K$YTAh9u@(tNlR1LXxMcG%i&y z1V@D=;z*`^dNpVY)j5nH5*d{QO+FTT7~AS(P~)!#kt|#l>5mUY|KtTqa7rGfFMv@_ z#LC~y=dnr0_HgqOnS_Adt~~P|@3HSe&FuLmpR<6e6Sb}u7757@dw@sp3T`%JA)&4Q;_gMDzmtgW(s{J;e#5EoNU4|Lg>uLHL@dP<07QhhC!i=Kunqgtif3`Y;#}7gRTpy!vX5YfI43H#YU`5gjAg$(PI+GEOcBvf zG|5ZPy5xE7S$bxUy8DSAYi{}V9{KyYY;@xq-HcDua4f4Y(GDwFuZyi42Kr5;9#cEwMORB9N{K#ZwC>*c+_V&k@xF zSrOSY{H;34WRrPyYs__ewXcdl40pMxTM^rwpItSiQM}(;!hUBR7)ZWJOoJNcrZqc8 zMa7?SUKSx5-oP*HTpDG6e9*;?WY+&tiSKbO9muH9B=s!hj^riQA5h4?fLY?4%AS6J z8zGGEC+j@7VTuzP!=4Pw zfV#nH&(5gOP2=t_)ZSl1rkHgZ??lnl<(o&7W-u7)vc4(X72JahC$q$C`{!H{N^FU% zeVd}D_?*mnkL!(SqQ50e#kSqCA*=%DS`}zAnOLd?wWx8YQ83HNkg4c#lUbGT1A}zf zKON#mQXtk21nCeg2_u_Eh*xssKKQ@8AHOl#6;Rr1OM*9IGLFb8JvJw%=j##)OPNy9 z;+tW2ryszw91@~JQF9r(&H5I}!gzSkqYh(QRd0_^&b#=KYt{;oM17)F>VBxnV7LNK zrpZ_&SG<5dBpR3RFp~_X>z2aI`ni;WlYg#~qFlF(#hxy++pjpTO19L`ws^xw8R9(U zqa*Lla}dyCCDRB-0^<^8Kq9Y9{E(;VfGg}7<2-xCsgH5n-)*iX1CQ!k`%d73TD*lo zWI?R=B*Om6H>2E*@us-4Gq;Rrh{PTRF3S9yGH2fa-)zEDlhP3dF@3N>)Y z!gIGK0%`OY^NAq%f?Y$Hz*q-gca&)hCzK#Y{z!frg-bZT_6!^SDcH%fP@PKX3-TAv zbRK0&eig3F65=HAfh-M5OfJ)t;1mA%tqRh(+_o9C1ej_Dzg0HM!I$K6rw_>s&H3i)LZpQKF z6^?v4C)_`rj11B-QAEAK;YBGM9PvgOJ{vSznY6n z43rGL!LVuD!H;#h4|lO2qhz#M-<4?6fN)raSs>HbDR#)%qABakswkqx$2-|xEjTrJ z=hV`*lf>_)l5QuWDHF#c@FT$kzH;83~`e8~sh~-^HF; zaJA)lopblG$x;(@bK=>Ha3S<9u4e1@kb_(27ZjS5*)Z;kyQ|;b)pl8zZzC-({HN;! zusJ>~{<32VrwQ75@Ux95h+f-FK1;vB&&xTKYNg25cg%vg;#1fZI_gVku??v$jybv; zO5C{cExWPe%T4xT8{uw&BxMG&0$)346`mJ}kKI~}AMb3r3EM?D*M%68ZGP!J zJN>g$)Sca-&1p%Szb}UOtAs}Zi3Uvw><09@p*$V))orUU;qMVz2&Td~=`!4;m{@&% z@@5grUfPQ;*_t)9x74(;RfJIaLmN=Rl2-EQ28fx43Zr`Y;hfsEv$nn2t6HB0iGtdC z+QYRe{!q1P@jm+d`MdDgtsQ5()ikcOhPv8TuYUxwnLoQZeLyqWOW{+TyWJop<(TOwO5g^=Ee}i$#i}z+x1=;KFDH7>2)EK`A zX{Y_(pJ+u&i;?c@J2Kz91V8@41AucOeN6OW0m)ZsN+$#Vt;n5?zD?P9DtgTETRhig zz-ghhZ{A2$3I!dV&5ktI`#;WRRR?jzuhd0l_4t~`Yn%pPuj5hr`*U4NWLH#UbG>vC zWYsfp;Bph#kEG+@@P~9AjL)X<{foJWoayA~2NRd$nNGdEn;yx4V_UJrO=DxK>jmjqH#w+}!K5(5k=*d#%jvGfJPv6sDX-gc-?aLN z!I~78NiIO<3JI;eu5Z1gXL{ONVjuf9Q={_JoyVbAytNweYY~Z!`tNMa!lsK7b@It` zC&LdaM&BvZ!A^>bUg6BTz@#w$!(efUA%<}_plLD{!bfUpkd|v8Felo|c*35&>E+AQ z^0>BlzEcffBVl1F)z;nwZi8}DLDw$A^@7yvRJ;c$yf$7gKk^i|*BQ+_#Zt?ewcCOf za&X3Fh#5CKqkCS^EA_72FCR{QRotWJrc-W8HB;R?v{lQhH!G6KwIGG|sUmaqn-qdy zhv9#0Z%ZpqW)(}xtdnc=7NrV7XSiaigDMy-Q;7rc)$-)a=b17G{8Pe9YXzE8E(lXq zh=ly-3f1!mjjxN=>)I1vV>a&g9#A06^&tvFpDWZ)I6(nI77B_erl=z7*IMzbCM1UK zz%4?}eYZ=fO){O^#Fr=RJ~bcN-fk{uSEb$qdpfZnZzsdhD+swx`25TD-ksSX%bRI=X9(ACG;K)Zr07%${8bVQU=W$&(BI2ZW>@As^0u zGfS9>U0J(7jXg}4m#@%Q=d1Jn`eei{t)G{@(zfd(S+7{lI{T+>?t9GuZ}~f5hXSy3 zvchMd@b{s?M)-`6b~6y5n$WJ<6OnBNO{}_U)kF6<8tJRw!+jmqdQ@KnA$mmXvCwFM zDE_I|x3Sj?|0xZYu)~_JfF=)PLOu8WM76fpGhRUVMB{iig z2fBG5znn;4v88w?(mwD-A}1ClEh8HIjbQ)LKx3h2YpcUfe@HzcvA&&sbJ`J-mb<}$ z)Aftlf3A8VcPlhKxXmH1Sf8j*(@;gt*WUgfJMnOIchm5+91ds7zm71Lt3#%j*2;V* zu=fhD&XeRxFP&j#3s{ptNj2fcAd4M_I1eu(`u3)(_I%7qL8N-W>3jOU< zCfpvUmq=k-8We!P%K~?=^LE--Fj|#CL>)+_(TQL@K3v6heMytL@1P=hgjwKyTMj!UdwjIykA1(h8GMC2Uc5l z$9)^faiwl!th4<^#H?8aXFM+V)1KRoC`ccLf{WndNt0_RQ3hKX8PIN1La~M9=G=1AP@~+Pegjazo=lRUfJR)JTR&0j?={NCEB4Of1QB$FgqTXUf z;c#mLOc;VZ(jOaZN*sZnvi&G5t;uVA?*W1Vg{t>&ku?bCUO8HIhdR?^T?74il#X`g&)2ic340xI-RR-%+3aGL@zq+_&E-c3_Y z!e&yk-4>@a>^=9mkU&vh5yhZ;dp`L>SO{W2r~vBKe4o!$J5b_ag$jCW(n^M=Z14t6 zD}l~n&O%w6P@3UKN`5BB5V@wtZ_O&h?~cLgm0m+`zD7J$)kER59Ttr}Xu@9u$ySyQ`TnqDyR=}$u+0UAjPOVBaZO`a~1h-P~GXA0(V-`xW*> z=sJp+S1$cGf@}DrH;?qCY|q~(?7G4BYGFG+p;=R>3_^_Qq5S{)t{yq4q&!oT9epj1 zpmfxj%+x58SENepDvRPZgUrQ# zbvYAh60<^~6#P>LU0uH$22)p8T%~GRO#{p|kHR;!@$OOIZ#g@fGoTVv{ABgPo6Js{cjJ0DxD2sTnb@ z*!HWxwCtZk{#$mAX0}{>-286=|2>BW;QBi!;NB8Fj_`NjFIvO=E8^y+9Ofo&ChX>> zM`@!DS>m{Zo=^%!x$LT+uy@iPgzB8@)fyjTB=xnO?WPzQb$ScIq?=tkhneLkGqAme zlSxTO5fGZg0iFGdZJij~pRs34tr08KbjmnHneKRa0_TJ(sY&cL04v#=O5Y=TqcwBU$NF%#hKGc* zucD&UPG9^1H-SpBKI32#bF|;QpS+owGh_%ZzkwPW9m$zW;#2R^b(slkKUk!0(d+zv#n=VWag^Y;VPmba zEz?H9RD<1q_LX~VaF}d$QoVO3ZdP_ZQ_~SmMx!29Xk~6mWkOgrll^PpuKYyTtUa$1 zDz!Wblt8eQJ%o6DPz|j=WNrAWx%Se~=>v?ou)9T9RYX7p zA^rbc_3z{V>of-aBmbMS{@eY3=j%Vc06=5V+rO;#pS1nk@qZ`n-wwmSj{lK6RYjD4 zQVT%(d&~Z+79jv20#NqWP*VbHJG$7KS~!?lft4N2E$qN1E@oEN9u{COc1{fYe>!Zg ZW>yyVCa!{DdlLr}OA99x2Marl{{YeaxQ+k- literal 0 HcmV?d00001 diff --git a/database.sql b/database.sql new file mode 100644 index 0000000..f2876e8 --- /dev/null +++ b/database.sql @@ -0,0 +1,34 @@ +-- MySQL Script generated by MySQL Workbench +-- Wed 11 Oct 2017 12:49:43 PM MDT +-- Model: New Model Version: 1.0 +-- MySQL Workbench Forward Engineering + +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; + +-- ----------------------------------------------------- +-- Schema managepanel +-- ----------------------------------------------------- + +-- ----------------------------------------------------- +-- Schema managepanel +-- ----------------------------------------------------- +CREATE SCHEMA IF NOT EXISTS `managepanel` DEFAULT CHARACTER SET utf8 ; +USE `managepanel` ; + +-- ----------------------------------------------------- +-- Table `managepanel`.`report_access_codes` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `managepanel`.`report_access_codes` ( + `id` INT NOT NULL AUTO_INCREMENT, + `code` VARCHAR(45) NULL, + `expires` DATETIME NULL, + PRIMARY KEY (`id`), + UNIQUE INDEX `id_UNIQUE` (`id` ASC)) +ENGINE = MEMORY; + + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; diff --git a/lang/en_us.php b/lang/en_us.php index 6cf7920..f9c1c41 100644 --- a/lang/en_us.php +++ b/lang/en_us.php @@ -101,6 +101,7 @@ define("STRINGS", [ "choose an option" => "Choose an option", "csv file" => "CSV text file", "ods file" => "ODS spreadsheet", + "html file" => "HTML web page", "uid" => "User ID", "manager name" => "Manager", "manager username" => "Mgr. Username", diff --git a/lib/reports.php b/lib/reports.php index 4ef8da5..6ec3219 100644 --- a/lib/reports.php +++ b/lib/reports.php @@ -1,8 +1,16 @@ has('report_access_codes', ["AND" => ['code' => $VARS['code'], 'expires[>]' => $date]])) { + $database2->delete('report_access_codes', ["OR" => ['code' => $VARS['code'], 'expires[<=]' => $date]]); + } else { + dieifnotloggedin(); + } +} else { + dieifnotloggedin(); +} + +if (LOADED) { + if (isset($VARS['type']) && isset($VARS['format'])) { + generateReport($VARS['type'], $VARS['format']); + die(); + } else { + lang("invalid parameters"); + die(); + } +} function getUserReport() { global $database; @@ -144,7 +172,7 @@ function dataToCSV($data, $name = "report") { $csv = Writer::createFromString(''); $csv->insertAll($data); header('Content-type: text/csv'); - header('Content-Disposition: attachment; filename="' . $name . "_" . date("Y-m-d_Hm") . ".csv" . '"'); + header('Content-Disposition: attachment; filename="' . $name . "_" . date("Y-m-d_Hi") . ".csv" . '"'); echo $csv; die(); } @@ -175,7 +203,31 @@ function dataToODS($data, $name = "report") { $rowid++; } $ods->addTable($table); - $ods->downloadOdsFile($name . "_" . date("Y-m-d_Hm") . ".ods"); + $ods->downloadOdsFile($name . "_" . date("Y-m-d_Hi") . ".ods"); +} + +function dataToHTML($data, $name = "report") { + header('Content-type: text/html'); + $converter = new HTMLConverter(); + $out = "\n" + . "\n" + . "\n" + . "" . $name . "_" . date("Y-m-d_Hi") . "\n" + . << +STYLE + . $converter->convert($data); + echo $out; } function generateReport($type, $format) { @@ -184,6 +236,9 @@ function generateReport($type, $format) { case "ods": dataToODS($data, $type); break; + case "html": + dataToHTML($data, $type); + break; case "csv": default: echo dataToCSV($data, $type); diff --git a/pages/export.php b/pages/export.php index f9f6dca..2427019 100644 --- a/pages/export.php +++ b/pages/export.php @@ -4,12 +4,11 @@ require_once __DIR__ . '/../required.php'; redirectifnotloggedin(); ?> -
+
+

+ insert('report_access_codes', ['code' => $code, 'expires' => date("Y-m-d H:i:s", strtotime("+5 minutes"))]); + ?> + - +
\ No newline at end of file diff --git a/required.php b/required.php index 1bfbb12..6fa46a4 100644 --- a/required.php +++ b/required.php @@ -53,9 +53,23 @@ try { ]); } catch (Exception $ex) { //header('HTTP/1.1 500 Internal Server Error'); - sendError("Database error. Try again later. $ex"); + sendError("Database error 1. Try again later. $ex"); } +$database2; +try { + $database2 = new Medoo([ + 'database_type' => DB2_TYPE, + 'database_name' => DB2_NAME, + 'server' => DB2_SERVER, + 'username' => DB2_USER, + 'password' => DB2_PASS, + 'charset' => DB2_CHARSET + ]); +} catch (Exception $ex) { + //header('HTTP/1.1 500 Internal Server Error'); + sendError("Database error 2. Try again later. $ex"); +} if (!DEBUG) { error_reporting(0); diff --git a/settings.template.php b/settings.template.php index d17db4d..98a6210 100644 --- a/settings.template.php +++ b/settings.template.php @@ -4,7 +4,7 @@ // DO NOT SET TO TRUE IN PRODUCTION!!! define("DEBUG", false); -// Portal database connection settings +// AccountHub database connection settings // See http://medoo.in/api/new for info define("DB_TYPE", "mysql"); define("DB_NAME", "sso"); @@ -13,6 +13,14 @@ define("DB_USER", "sso"); define("DB_PASS", ""); define("DB_CHARSET", "utf8"); +// ManagePanel DB connection +define("DB2_TYPE", "mysql"); +define("DB2_NAME", "managepanel"); +define("DB2_SERVER", "localhost"); +define("DB2_USER", "managepanel"); +define("DB2_PASS", ""); +define("DB2_CHARSET", "utf8"); + // Name of the app. define("SITE_TITLE", "ManagePanel");