From 180d179f66ccb6fa5ff223606e0fb72663bdbbed Mon Sep 17 00:00:00 2001 From: Andreas Nergaard Date: Fri, 9 Dec 2016 09:23:02 +0100 Subject: [PATCH 01/78] HFP-186 Added new icons to h5p core font. --- fonts/h5p-core-15.eot | Bin 5168 -> 0 bytes fonts/h5p-core-15.svg | 46 ---------------- fonts/h5p-core-16.eot | Bin 0 -> 7660 bytes fonts/h5p-core-16.svg | 55 +++++++++++++++++++ fonts/{h5p-core-15.ttf => h5p-core-16.ttf} | Bin 5020 -> 7496 bytes fonts/{h5p-core-15.woff => h5p-core-16.woff} | Bin 5096 -> 7572 bytes styles/h5p.css | 10 ++-- 7 files changed, 60 insertions(+), 51 deletions(-) delete mode 100644 fonts/h5p-core-15.eot delete mode 100644 fonts/h5p-core-15.svg create mode 100755 fonts/h5p-core-16.eot create mode 100755 fonts/h5p-core-16.svg rename fonts/{h5p-core-15.ttf => h5p-core-16.ttf} (53%) mode change 100644 => 100755 rename fonts/{h5p-core-15.woff => h5p-core-16.woff} (52%) mode change 100644 => 100755 diff --git a/fonts/h5p-core-15.eot b/fonts/h5p-core-15.eot deleted file mode 100644 index 5a51b7221e45d6e34ce98293705d05ca207b6a73..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5168 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 aOzfOHdiMD2>D4cD%em-TzOsuyNdF)4)VB)& diff --git a/fonts/h5p-core-15.svg b/fonts/h5p-core-15.svg deleted file mode 100644 index 3a440df..0000000 --- a/fonts/h5p-core-15.svg +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - -{ - "fontFamily": "h5p", - "description": "Font generated by IcoMoon.", - "majorVersion": 1, - "minorVersion": 1, - "version": "Version 1.1", - "fontId": "h5p", - "psName": "h5p", - "subFamily": "Regular", - "fullName": "h5p" -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/fonts/h5p-core-16.eot b/fonts/h5p-core-16.eot new file mode 100755 index 0000000000000000000000000000000000000000..d8b7655031910d95d0367a5c64275878a9b0c6e4 GIT binary patch literal 7660 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 YNAbSN{meSk_{^HesPn6* + + + + + +{ + "fontFamily": "h5p", + "description": "Font generated by IcoMoon.", + "majorVersion": 1, + "minorVersion": 1, + "version": "Version 1.1", + "fontId": "h5p", + "psName": "h5p", + "subFamily": "Regular", + "fullName": "h5p" +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fonts/h5p-core-15.ttf b/fonts/h5p-core-16.ttf old mode 100644 new mode 100755 similarity index 53% rename from fonts/h5p-core-15.ttf rename to fonts/h5p-core-16.ttf index d3a9a27a77cabd64a96df07d6f000077fd64c3c1..814236d3270561116a18f35933e4d082bb7cb4b2 GIT binary patch delta 3042 zcmZt|TW}NC^*(l`T|IWSdaWf{k}cVijci$xkrZSsKV)nJcEI3-N5GGf4K{-2x}s!9Q(2`q8v$(jw7wwQ|Bx zcK7ai-E;2V^SXO8dOxQjj1V%T*AYdD9lJYHvfc0&aDD+}s<<${^xz*C+7ZI_KwmgK zeS8U^4e0j(3WtxLIn;9fSNDN_AECOR&dpBGSo&Z4F+$!0AkWMJLlAf~(AR)&np-$= z`r?P49-!|4ec@=S*f+gh8as=SZ!<6k7N$=xp*WU+ejVtB#p#9F8{5SH0{tE=a&f72 z`~-X`T>cg&N0dA8)@lznzm4}`^H28TU&yGhW`=uT9RHlZ=J4-^%r!6@NyV<-}h z69FHIh$l=Rc_Lpt}sI@Yk!-m8brv1 zERVmW|D>lNa*e1NwW5tEkNVLd+J;^L?|@sFPnbho3b+Y}49pwM70eIeMjTFe8mj}m zkPYB2>}rnYaX0P+=QM+WhmnQ>F4JN--3gvGl6T4vwmZ$3~PPZQ{r6CgpPOO&&$zbwY2~Rf!12Ms2^2Y?@f+?tc>FBq z@((-ro+=bh?d@!jSX43Eo}0ZmI&yI)SD)V6X7WgF+tUG(jrQ$JrS|njr?zGWaWFmH z+B&3Vg7tN{Esb3mTdb6dX515K+Yr3T^RWO}dfRGK?MLKBTizSRNwxr6C|`;Z(U^Fp zFtR+8%grp0q>JMNswh+Y=I0M~ruOznBK><)W15<97xS${nP4z8)EXV|az@$_n(YFI zLe&k^FQ}@a2tv*4HPgY$ht=JBg84BkJ-zZ2`h`UV3r2}sn;puS!_P682*~@IZbof|kJ2Ab^7)WhnvH*~5B;-YWE^@>tIm z4VJ~BI7xq%FcJyVKfl6Df-S7D9^mZuQjy~YdO-5ab}Wf+iWX`Vs2q^?a{_Ohwh)e^ z_OMN`a%TjyML5k#q7t^TUgFy9g$&{a?j_K5Na9t&N(3VZs{1&RQ>H9bqqM4P;X#*J zgi0{Jt2-R--WBiAVF&Tqm7qRtCa+Gc{TKHE5$tw7J0=#4#q;$qc1rAno zx2dwORi(ux@3RVl#)i|p#NVr)UX25s4V|5ZJ6G`|s zC|B;W4_W^p2B9cNO_VzAb&j}v!8-wslh~gE| zBmSD>2_#v9ez4>6ow>O?Oi722UaqRGs{X5EJVWDcNg22RJ%@l(bPy_=L*>za?-jf!< z5_C|4{OCFQh&wEZ9+p|CHHJ0kKp~Z6 z2dad_)U7+C2kUhNkp8{mrZr5YWV07j%G2HKfWsaW9BtI$ev>yCc>EWbh1U!` zG4g*Pv5`ZYHqDO2u<$vA0v_$(M&i4%$J*Z}s5Z$X+$GEc2k*OrTd{fh$Vh#Rf*k|B zaf2FoDpdZXw)ho$pvAR3N-!p)%Mi~A^nLmxN{|Hm&cT^cJuwu$bx~+5?5Bb1qyl7= zx-+noWFn)f0h*+8EH}z9@^D9 z)e#xh8X86;@yQK&Uy}S>Q7YFgHlGWBQ&J?ka?a(GWPI3RSIVC%TM5k%QXB|KHsbCk zB)oxe*-A)Je15-AQA`%Rrg|JMm&2o08VLNuL65Iq?Z5x+?MZp_zmOTy9tsv zm7J2sjVnvaR1=8V6bp>=HQWTy0E1PGAI8MW10_`_~U zkc=nLi)a=dL&sqP2*6Gf#Zls!TF+v}7I)1aK6!Nd7_2%ApL!Aqf(UJQsbDa=nKQlK376cFC`4L_V!D(r z@iq}!I(2FX7bz-*E{+Zz`UiCGAh`Q{?Pm^-_xC){d*8j^d$o8n+kpU(z&><5UMW8+ zrZdrRbk6x!YjrEQzUfW_B2V3QtX9A}ME!|1=6HLrzrS<#sJ{Sd&$X>r$;8<$F#Le| zf=eS7i)hr#)YEQ#r@i$vJ4`Llsd|3xg*ExNa75#pMzLCTKj?(Wc9>fz&xupOuN(jQ= z`Il=IyV=_I8x!Wdi3)5q(ZV)-G`KMn^Dz7EeOR@fUC(M_mF*68;lV<)pYq;1cQO_} HFAUrP+>Tuc diff --git a/fonts/h5p-core-15.woff b/fonts/h5p-core-16.woff old mode 100644 new mode 100755 similarity index 52% rename from fonts/h5p-core-15.woff rename to fonts/h5p-core-16.woff index fa8d5b067ca91876764dca20068333248065fb86..823548655761b88912784aa586b2742851d7dc88 GIT binary patch delta 3090 zcmZt|TW}NC^*(l`U1_z_Y9%d_td%X5tKbka6S|oa|R!$ho z?w&p8o_o)^_ndpqx%b29^&Z!m9fbnI2%f-oWUb-hmG@Nb)tIaNYH?xu7(#ds*q0c* z`_D@qho?_4-ru1u)WLE1=($6{`vjqNKWET-<2P^5%}&oCiT%Hac4H0VSYDi7 zm<1jz1}`zVxmEn{vC@f?U=2Wh90iJU&#y?h4_jA8@Lp{F*)9BQdzk}+6ZB)c6E&cX zXbkNK6^hGbmT|Z#6p6-hO4*RkD+PPgJ>P2jRl7{i8!c^F{G8lr|| z(u3Visf>m-`ms%t0?vo`6R@?Z)`y5XxftTm#05vg+5Hqd3Cfn_@ z-0XITfdI1E8Hnaid&>$+Ht!NK;2i(GZ!W`mOz)d)0 zV%}h`V15WU;c%+kTm$ezM#nwa-4e~=Ufd1NX@L$NAO!#}E5~rE8$4?!->y7}4-UqO z9v{R5@yY|I-|r;4>hn7*56Hb@@h$jeD9NQd89J*N76D!%6QKYS|>4@dhj$(#B)uZ+vMrKeb=#bU98;5_B}AWjfP z7azSzi}W^1py$vQ2!D%W@(Ed_y=qiZ5APXIKfAQA*lY_JQm$>OsSo~{q-F+sHi zVuE?W5>(z%b>7EuxW!-jQTM*n`TXg9-5n806Qdp3*`?8urI~C)YD>GtE4Ob;=_C^! z*q==9ABawENf&T1HQd%VR89vQ*5URPc4I8rC>5=^Pj6oze2wR0I%xWq&7nDu*qa164{@@_4_0+^+qk$DRJOcFtZS>{$J z^3{|1iHSV^Mt)+Iw*iwAr3+RkM=;MnI9TtRoXj75!1I`JPHW}6h#+Z~p^@WHOyVgEV-VruRS@&QiZ9n%uwIO+^L1RHlwuu8&NP8OB0gVhrEvp$F*Uf`YsSydLV2{s~_ zIS}2?iJUSe(K4kqS&0W(A_>)Cd{=Kc+`B8@Y2Z%ccPc@L7SpIeIe`SS8s#Y6Y?k;J z1=%J9`gC447bu-^P=SNlJnfo2;BaEQ`I;c(nryp=Gjp(W4OtCD>1M&opBHQrlPz;L zp+LA^RDPCRY%9lFaXrZP5*(t|+dS=k8qIx%2X!x%t~ycI>!vdw%?SslUH;eSG}J zVt@bQjjZ4mzgB=>LKLrxUh%gaPawz=^o<=??##{IVL}Fe_(Dx=O&l;$MJ6jGK<=st zq88p{<#7UW2tB&bA$lLFWfVm{XvhECfn5*?kD1c)gq`XW{RADk`|{Y>%Xg2|G2UA^ zf9v4ETjz&{&VLW^i-l_6@P)~Adh)_B!(iacMbug6`9P*)42ka0w6wUm$Hawrmp z(w70K9hMo$HAb~$K_J=14pbS3smE|eA2#v`F#Sh0KryX;sIId)>{cJ9l&8Dd0f)U7 zINGS{d4)Hbc>Grwg;z~HG4p>Sv5`X?H_nd4u<$8t1$^ayn~DGCUfW>1pgCl(aF;L* z9Q^MJ9>w9~BO?tl3VKZR=1pqisZjlo)*4WpdaHYRlweFomtj9A&=2U3DM2#WorN=_ zc48<->7r0p*rkCQO$C}!>PdqoU5RvA(`kk#B2YoPjK6WHm}|8NxG}66a>idZMaW8H zkGJ8O#?*LMqH#D>U2Pr?CA#*cLfL>f7kqzH>SS?j+y31RLz{cm{KfdD`Qx4AC&{Je zt*xzF{rXUAWTaV3cxg}DRA*$g+}Jo8iBGQ2`Mbz36{UJza`@f&>#`!-s~6mU*^UpZ zPNnjZvW3uGfnr^k9mLa1NO(QrGS!fx_yYmIqF5xns(DqnTlH$yM#3(Um>s1Eb^P%U zw%$F7$yW)wJud41niKmWwDs$KD;ZsMakHaLh cu(DI=D4IscpE`0Ss%~cz>% delta 613 zcmX|-!Alfj7{;G(W>!~saB~gWTo)8KLPTLD^%%*Bnx2x;)wNfr z?a!45>06gbIW&Op_h#e&r~W#&q_Wz{mGypZK0{kBWt9t8BCupv`ghK4%PZ2OhkhIw zwqc`X*df0$oZ!AU4ENFBGdzef46s(t03GT4V+%t#Hf+;>V%QP7w^HkAM8Y41M7?j W*g*sjjb4{?+udCp Date: Thu, 22 Dec 2016 15:10:15 +0100 Subject: [PATCH 02/78] Revert "Merge branch 'master' into HFP-186-tutorial-example-links" This reverts commit 893f610861352300f651c6a7bd255f14a8a35819, reversing changes made to e00bdbd125920c26cb3b5aeee5f753a679705de9. --- fonts/h5p-core-16.eot | Bin 0 -> 8096 bytes fonts/h5p-core-16.svg | 58 +++++++++++++++++++++++++++++++++++++++++ fonts/h5p-core-16.ttf | Bin 0 -> 7932 bytes fonts/h5p-core-16.woff | Bin 0 -> 8008 bytes 4 files changed, 58 insertions(+) create mode 100644 fonts/h5p-core-16.eot create mode 100644 fonts/h5p-core-16.svg create mode 100644 fonts/h5p-core-16.ttf create mode 100644 fonts/h5p-core-16.woff diff --git a/fonts/h5p-core-16.eot b/fonts/h5p-core-16.eot new file mode 100644 index 0000000000000000000000000000000000000000..239079bac7fcb443abd2063703ed61bab0a9b3b9 GIT binary patch literal 8096 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 literal 0 HcmV?d00001 diff --git a/fonts/h5p-core-16.svg b/fonts/h5p-core-16.svg new file mode 100644 index 0000000..d0bdb88 --- /dev/null +++ b/fonts/h5p-core-16.svg @@ -0,0 +1,58 @@ + + + + + + +{ + "fontFamily": "h5p", + "description": "Font generated by IcoMoon.", + "majorVersion": 1, + "minorVersion": 1, + "version": "Version 1.1", + "fontId": "h5p", + "psName": "h5p", + "subFamily": "Regular", + "fullName": "h5p" +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/fonts/h5p-core-16.ttf b/fonts/h5p-core-16.ttf new file mode 100644 index 0000000000000000000000000000000000000000..daf157117573b9cc4baba149f16cb136104f217b GIT binary patch literal 7932 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%0DU=~7luN=L83 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 Date: Thu, 9 Feb 2017 12:45:51 +0100 Subject: [PATCH 03/78] HFP-750 Updated h5p core font from 16 to 17. --- fonts/h5p-core-16.eot | Bin 8096 -> 0 bytes fonts/h5p-core-16.svg | 58 ----------------------------------------- fonts/h5p-core-16.ttf | Bin 7932 -> 0 bytes fonts/h5p-core-16.woff | Bin 8008 -> 0 bytes fonts/h5p-core-17.eot | Bin 0 -> 6188 bytes fonts/h5p-core-17.svg | 50 +++++++++++++++++++++++++++++++++++ fonts/h5p-core-17.ttf | Bin 0 -> 6040 bytes fonts/h5p-core-17.woff | Bin 0 -> 6116 bytes styles/h5p.css | 10 +++---- 9 files changed, 55 insertions(+), 63 deletions(-) delete mode 100644 fonts/h5p-core-16.eot delete mode 100644 fonts/h5p-core-16.svg delete mode 100644 fonts/h5p-core-16.ttf delete mode 100644 fonts/h5p-core-16.woff create mode 100755 fonts/h5p-core-17.eot create mode 100755 fonts/h5p-core-17.svg create mode 100755 fonts/h5p-core-17.ttf create mode 100755 fonts/h5p-core-17.woff mode change 100644 => 100755 styles/h5p.css diff --git a/fonts/h5p-core-16.eot b/fonts/h5p-core-16.eot deleted file mode 100644 index 239079bac7fcb443abd2063703ed61bab0a9b3b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8096 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 diff --git a/fonts/h5p-core-16.svg b/fonts/h5p-core-16.svg deleted file mode 100644 index d0bdb88..0000000 --- a/fonts/h5p-core-16.svg +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - -{ - "fontFamily": "h5p", - "description": "Font generated by IcoMoon.", - "majorVersion": 1, - "minorVersion": 1, - "version": "Version 1.1", - "fontId": "h5p", - "psName": "h5p", - "subFamily": "Regular", - "fullName": "h5p" -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/fonts/h5p-core-16.ttf b/fonts/h5p-core-16.ttf deleted file mode 100644 index daf157117573b9cc4baba149f16cb136104f217b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7932 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%0DU=~7luN=L83 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 M75dY!$^TFKKi?ExG5`Po literal 0 HcmV?d00001 diff --git a/fonts/h5p-core-17.svg b/fonts/h5p-core-17.svg new file mode 100755 index 0000000..1c5ad99 --- /dev/null +++ b/fonts/h5p-core-17.svg @@ -0,0 +1,50 @@ + + + + + + +{ + "fontFamily": "h5p", + "description": "Font generated by IcoMoon.", + "majorVersion": 1, + "minorVersion": 1, + "version": "Version 1.1", + "fontId": "h5p", + "psName": "h5p", + "subFamily": "Regular", + "fullName": "h5p" +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/h5p-core-17.ttf b/fonts/h5p-core-17.ttf new file mode 100755 index 0000000000000000000000000000000000000000..d9350bf45cb00ec56c06884c348946d1ea9f036a GIT binary patch literal 6040 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 NLWTYG-{k-2`5*nsP-g%D literal 0 HcmV?d00001 diff --git a/fonts/h5p-core-17.woff b/fonts/h5p-core-17.woff new file mode 100755 index 0000000000000000000000000000000000000000..0e07503a8a1476e1113c0136dafd2410a0e44dbb GIT binary patch literal 6116 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 literal 0 HcmV?d00001 diff --git a/styles/h5p.css b/styles/h5p.css old mode 100644 new mode 100755 index 2e5842e..af1af73 --- a/styles/h5p.css +++ b/styles/h5p.css @@ -3,11 +3,11 @@ /* Custom H5P font to use for icons. */ @font-face { font-family: 'h5p'; - src: url('../fonts/h5p-core-16.eot?80e76o'); - src: url('../fonts/h5p-core-16.eot?80e76o#iefix') format('embedded-opentype'), - url('../fonts/h5p-core-16.ttf?80e76o') format('truetype'), - url('../fonts/h5p-core-16.woff?80e76o') format('woff'), - url('../fonts/h5p-core-16.svg?80e76o#h5p-core-15') format('svg'); + src: url('../fonts/h5p-core-17.eot?8pte1w'); + src: url('../fonts/h5p-core-17.eot?8pte1w#iefix') format('embedded-opentype'), + url('../fonts/h5p-core-17.ttf?8pte1w') format('truetype'), + url('../fonts/h5p-core-17.woff?8pte1w') format('woff'), + url('../fonts/h5p-core-17.svg?8pte1w#h5p') format('svg'); font-weight: normal; font-style: normal; } From c41d001754128a8901a6452ef2601be426b44708 Mon Sep 17 00:00:00 2001 From: Andreas Nergaard Date: Thu, 9 Feb 2017 14:09:25 +0100 Subject: [PATCH 04/78] HFP-750 Adding fixed icon. --- fonts/h5p-core-17.eot | Bin 6188 -> 6072 bytes fonts/h5p-core-17.svg | 2 +- fonts/h5p-core-17.ttf | Bin 6040 -> 5924 bytes fonts/h5p-core-17.woff | Bin 6116 -> 6000 bytes styles/h5p.css | 10 +++++----- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/fonts/h5p-core-17.eot b/fonts/h5p-core-17.eot index 1e70252b8fc169596257637bb69d84d7db2e1f2f..89bfcc6349e3036065ebc568728a7ad0eae161a5 100755 GIT binary patch delta 536 zcmZ2uutT49hd2X+%0yOk7VD&tu89s)>OXAa$zfn%+`zyfbR{D-F@-0!SCN51q=kWj z!7KwPz}~`q7s%fOf3=ERGag|S5@C>JkY!M0P-W0$ z&}A?Ls-0}eEX-zV%_ypDI@y3(VsZqt5ue8#4-bz}cXxLXW|%yUd8vd5g9L*zP`MHx zlcU~`kH*9xiHEk6~(oxy9ot=@)#H@A}AEInE32oWR5OQ-VAs-?k zsuv5A+e1h%g@Kfyut-5c1pb7cg5JWQ#a^Q5A*4G+5YofB=YHRJ&-u>bzD%rivCdlH z;R5RpSj$`PLjQxgMRWBwK-Pe8W^y8bAvkf20FfU6+(}8Ox0DZn-X(F%WMO9ZB8(Y{ zvl17lrqAc?bi7644T*aS`Pm{YvKufYMAPMbVdCz`pzLQfNsp1@^wk+Cz7(DHbtp>d z6xkqF7*W)t5hhyEfrNZ(>t?qMbw?Hh%3v^?$z+B-&+|hpDo^Wl)IknGnnP5N#HgL@ zqt5*v#VkZrq!n;21IOAeI+-|mM+~F!ADtDN6Nn=w?(^z%2f1YGoHCJg_ zya=aazxg(bW{3YxZzWO+KV%)jL|PcB3Lxu~do~i{uv`6o*Ry diff --git a/fonts/h5p-core-17.svg b/fonts/h5p-core-17.svg index 1c5ad99..9c12732 100755 --- a/fonts/h5p-core-17.svg +++ b/fonts/h5p-core-17.svg @@ -45,6 +45,6 @@ - + \ No newline at end of file diff --git a/fonts/h5p-core-17.ttf b/fonts/h5p-core-17.ttf index d9350bf45cb00ec56c06884c348946d1ea9f036a..4d70f94fb03a2743caab5f6d4365b0d4c990fc82 100755 GIT binary patch delta 538 zcmbQCzeI0>L;Z(MJUI*uj2jpjgsx(kk2C)(#{{fI+kdvRBXw0Jfgn>ac0LZt>O{^$j&}0+>@_T@Mg}lVv)Sf3ij6nVx zpdDca`Nbs+%s?3iaTbs~12gl+{YMzJMHnO*WEm70R2eiGbQuhRN{vO8&4HL5i8i%n z6je5zJcmhQ@)0H@K94yb9v-3Y?(QJWFqw&Yse}lF1cNeAvl1VZsE8bsv5_5W{rPBlS5cTnKYCpuVR(ie3JDQ zv#2nG1)Aj`yH9eOF@{ZM}vqA%!`VnV&(FL7Tw=Q-iXhppqVwsfiuX z{c=Em@G*fzkbDF*RC%(Bun`k8|Kv(xlg+1vO&MjnLXxcG`E9;3aDxJtf#J#_@uM($ zvW)0%^)(Fp7=AG7FcvZKFil|o!xF^uhSh;}73&kW0QMmE77j6v8jdTRS)2cf&SC@r DE!ubV delta 656 zcmZuuO=}ZD7=CAVXLq7Wq{;3^ZH*;cOgEK8vmavAP(-uAgJ?}+6=H}Q3E0@60do)w zq8|K!!d#>`r9$z8s-dTfMd+bFz?0xjdI@?FKM<+TS_>i`-g)PFo_RkWW;%H|ws5e^ebD*_2E^yo&8$VMubIAdY z7dg%}s_iBiClnTjoO{}e%?>(=QB#p@k=cbJSo!lbP$B+3yUZeh6wb+R?s01 zLy+Q6*({E*SD5~ZjK7f2=ZmiEdch>&VO51qzz3sP5UWZQo9QgJcUnmtmrYd<>$Yk0 zP)!+wQ^^@duHvla#OUa?In%tIB6xO{cMZd>I9AzBU^BO}U_CJ3rhrlLzV84Wfs=3w zPO}%H%f5>z@Jfc2ND&=kPe~sJ=q!=0peeBXpH=uKI$QENc-LL_(^u*oTUVkJ1Rle% zP{dtOz*B{>T^EK7?llsKf`*_`&4-I`qSK6W;4os{1Lo_FK9cu ji2Zm{_#qa=k7Pf2LYAcwxgg)98|hVF&^O(=rB0z=E|G}@ diff --git a/fonts/h5p-core-17.woff b/fonts/h5p-core-17.woff index 0e07503a8a1476e1113c0136dafd2410a0e44dbb..78cdb4c2904038a3fe7e63d96c435195a3edda3d 100755 GIT binary patch delta 549 zcmaE&|3Ocp+~3WOfsp|S#0wa>!L$mH&p7!ZqsT-Zw|b!~3=Be7K5XL2$w*C1VPFus z090cJ!aS+HiWxvb1_n_MAYTQ9*;|ld`zMua!kfXc1)&*CVEVhc~}$}6DI4iNOKyx{o8M{$oQ82_o}3}NTYU|~K87ERI*dh3JWLaq|F8tHykT`q`6+c3fgIFbMBw%8S2HHch z7xko|%td-ptAeN?5pJM;3ue2%r_{j>Wr z89*Rbpbf5Gy(%=~?~!(8JhPzY0My)~@!)*5Qa%pgpAvU08+TlNYE08q*1qO0vj zGmSG%5%2lKl^4jTLI8rW4h)FE7{vKItn&|;{lP0)?m{k?D`vA<8=jYL5BOog&WFNY z?AJm#nMh-EV=9It+$RrVYm{%0gD#xRbf2b{l5gU`3-S%e6zqqCa2SsAuAJqsojN~6 zCUJLyFOeeJ#ea}N4A9bON76Oe{LgeT+~Ati!kaGf-Of_$nzO_f2;771QW1ARgD9k7 zFVz3@tS=nHW-2XGhD2H~Hv0aKZ4Xvb))th|1AZ?WL*eyiK%;iuhHT$7V(8Z?p|3^B zgzm?Xou4+%X+Eir8Y7IFR6$6gCSfNTsS(DA$7AmY2=h<{cX&fhg?j!7RTR2x_kvW( zi#Ka1V|130)=kw!gVx78(IdXC-@qk{4+MDm?8~Fym4DS9NAAKC_>RWWY3#mRN Date: Mon, 20 Feb 2017 15:06:42 +0100 Subject: [PATCH 05/78] Add reveling field support for settings HFP-495 --- js/h5p-display-options.js | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/js/h5p-display-options.js b/js/h5p-display-options.js index 9c8f664..2165152 100644 --- a/js/h5p-display-options.js +++ b/js/h5p-display-options.js @@ -2,7 +2,7 @@ * Utility that makes it possible to hide fields when a checkbox is unchecked */ (function ($) { - function setupHiding () { + function setupHiding() { var $toggler = $(this); // Getting the field which should be hidden: @@ -16,8 +16,39 @@ toggle(); } + function setupRevealing() { + var $button = $(this); + + // Getting the field which should have the value: + var $input = $('#' + $button.data('control')); + + if (!$input.data('value')) { + $button.remove(); + return; + } + + // Setup button action + var revealed = false; + var text = $button.html(); + $button.click(function () { + if (revealed) { + $input.val(''); + $button.html(text); + revealed = false; + } + else { + $input.val($input.data('value')); + $button.html($button.data('hide')); + revealed = true; + } + }); + } + $(document).ready(function () { // Get the checkboxes making other fields being hidden: $('.h5p-visibility-toggler').each(setupHiding); + + // Get the buttons making other fields have hidden values: + $('.h5p-reveal-value').each(setupRevealing); }); })(H5P.jQuery); From ff496d9a38b19ea66f24da64563dba1079310511 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Tue, 21 Feb 2017 14:01:49 +0100 Subject: [PATCH 06/78] Check for H5P requirements. HFP-502 --- h5p.classes.php | 78 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/h5p.classes.php b/h5p.classes.php index b0ad889..d211b3f 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2758,6 +2758,84 @@ class H5PCore { return $token === substr(hash('md5', $action . $time_factor . $_SESSION['h5p_token']), -16, 13) || // Under 12 hours $token === substr(hash('md5', $action . ($time_factor - 1) . $_SESSION['h5p_token']), -16, 13); // Between 12-24 hours } + + /** + * Check that all H5P requirements for the server setup is met. + */ + public function check_setup_for_requirements() { + $disable_hub = FALSE; + + if (!class_exists('ZipArchive')) { + $this->h5pF->setErrorMessage('Your PHP version does not support ZipArchive.'); + $disable_hub = TRUE; + } + + if (!extension_loaded('mbstring')) { + $this->h5pF->setErrorMessage( + $this->h5pF->t('The mbstring PHP extension is not loaded. H5P need this to function properly') + ); + $disable_hub = TRUE; + } + + // Check php version >= 5.2 + $php_version = explode('.', phpversion()); + if ($php_version[0] < 5 || ($php_version[0] === 5 && $php_version[1] < 2)) { + $this->h5pF->setErrorMessage( + $this->h5pF->t('Your PHP version is too old. H5P needs at least version 5.2 to function properly') + ); + $disable_hub = TRUE; + } + + // Check max upload and post size + function return_bytes($val) { + $val = trim($val); + $last = strtolower($val[strlen($val)-1]); + switch($last) { + case 'g': + $val *= 1024; + case 'm': + $val *= 1024; + case 'k': + $val *= 1024; + } + + return $val; + } + + $max_upload_size = ini_get('upload_max_filesize'); + $max_post_size = ini_get('post_max_size'); + $byte_threshold = 5000000; // 5MB + if (return_bytes($max_upload_size) < $byte_threshold) { + $this->h5pF->setErrorMessage( + $this->h5pF->t('Your PHP max upload size option is too small. You should consider to increase it to more than 5MB.') + ); + } + + if (return_bytes($max_post_size) < $byte_threshold) { + $this->h5pF->setErrorMessage( + $this->h5pF->t('Your PHP max post size option is too small. You should consider to increase it to more than 5MB.') + ); + } + + // Check SSL + if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { + $this->h5pF->setErrorMessage( + $this->h5pF->t('Your server does not have SSL enabled. SSL should be enabled to ensure a secure connection with the H5P hub.') + ); + $disable_hub = TRUE; + } + + // Disable hub, and inform how to re-enable it + $this->h5pF->setOption('disable_hub', $disable_hub); + if ($disable_hub) { + $this->h5pF->setErrorMessage( + $this->h5pF->t('H5P hub communication has been disabled because one or more H5P requirements failed.') + ); + $this->h5pF->setErrorMessage( + $this->h5pF->t('When you have revised your server setup you may re-enable H5P hub communication in H5P Settings.') + ); + } + } } /** From c70f8521bb7add642eff0fc0e1b9d208679030ff Mon Sep 17 00:00:00 2001 From: thomasmars Date: Tue, 21 Feb 2017 14:31:01 +0100 Subject: [PATCH 07/78] Use core naming convention for requirements function HFP-502 --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index d211b3f..3deda1e 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2762,7 +2762,7 @@ class H5PCore { /** * Check that all H5P requirements for the server setup is met. */ - public function check_setup_for_requirements() { + public function checkSetupForRequirements() { $disable_hub = FALSE; if (!class_exists('ZipArchive')) { From c4affb23dd6f4ea0ebe57dbe634a7457b32d1fdb Mon Sep 17 00:00:00 2001 From: thomasmars Date: Tue, 21 Feb 2017 17:37:01 +0100 Subject: [PATCH 08/78] Added confirmation dialog functionality when disabling hub. Refactored server setup check into check and var updates. Moved bytes string parsing out of server setup check and fixed naming convention. Fixed indentation to match library core instead of Moodle style. --- h5p.classes.php | 161 ++++++++++++++++++--------------- js/settings/h5p-disable-hub.js | 66 ++++++++++++++ 2 files changed, 155 insertions(+), 72 deletions(-) create mode 100644 js/settings/h5p-disable-hub.js diff --git a/h5p.classes.php b/h5p.classes.php index 3deda1e..1d0c5d9 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2759,82 +2759,99 @@ class H5PCore { $token === substr(hash('md5', $action . ($time_factor - 1) . $_SESSION['h5p_token']), -16, 13); // Between 12-24 hours } - /** - * Check that all H5P requirements for the server setup is met. - */ + /** + * Check if the current server setup is valid and set error messages + * + * @return bool True if errors was found + */ + public function checkSetupErrorMessage() { + $disable_hub = FALSE; + + if (!class_exists('ZipArchive')) { + $this->h5pF->setErrorMessage('Your PHP version does not support ZipArchive.'); + $disable_hub = TRUE; + } + + if (!extension_loaded('mbstring')) { + $this->h5pF->setErrorMessage( + $this->h5pF->t('The mbstring PHP extension is not loaded. H5P need this to function properly') + ); + $disable_hub = TRUE; + } + + // Check php version >= 5.2 + $php_version = explode('.', phpversion()); + if ($php_version[0] < 5 || ($php_version[0] === 5 && $php_version[1] < 2)) { + $this->h5pF->setErrorMessage( + $this->h5pF->t('Your PHP version is too old. H5P needs at least version 5.2 to function properly') + ); + $disable_hub = TRUE; + } + + $max_upload_size = ini_get('upload_max_filesize'); + $max_post_size = ini_get('post_max_size'); + $byte_threshold = 5000000; // 5MB + if (self::returnBytes($max_upload_size) < $byte_threshold) { + $this->h5pF->setErrorMessage( + $this->h5pF->t('Your PHP max upload size option is too small. You should consider to increase it to more than 5MB.') + ); + } + + if (self::returnBytes($max_post_size) < $byte_threshold) { + $this->h5pF->setErrorMessage( + $this->h5pF->t('Your PHP max post size option is too small. You should consider to increase it to more than 5MB.') + ); + } + + // Check SSL + if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { + $this->h5pF->setErrorMessage( + $this->h5pF->t('Your server does not have SSL enabled. SSL should be enabled to ensure a secure connection with the H5P hub.') + ); + $disable_hub = TRUE; + } + + return $disable_hub; + } + + /** + * Check that all H5P requirements for the server setup is met. + */ public function checkSetupForRequirements() { - $disable_hub = FALSE; + $disable_hub = $this->checkSetupErrorMessage(); - if (!class_exists('ZipArchive')) { - $this->h5pF->setErrorMessage('Your PHP version does not support ZipArchive.'); - $disable_hub = TRUE; - } + // Disable hub, and inform how to re-enable it + $this->h5pF->setOption('disable_hub', $disable_hub); + if ($disable_hub) { + $this->h5pF->setErrorMessage( + $this->h5pF->t('H5P hub communication has been disabled because one or more H5P requirements failed.') + ); + $this->h5pF->setErrorMessage( + $this->h5pF->t('When you have revised your server setup you may re-enable H5P hub communication in H5P Settings.') + ); + } + } - if (!extension_loaded('mbstring')) { - $this->h5pF->setErrorMessage( - $this->h5pF->t('The mbstring PHP extension is not loaded. H5P need this to function properly') - ); - $disable_hub = TRUE; - } + /** + * Return bytes from php_ini string value + * + * @param string $val + * + * @return int|string + */ + public static function returnBytes($val) { + $val = trim($val); + $last = strtolower($val[strlen($val) - 1]); + switch ($last) { + case 'g': + $val *= 1024; + case 'm': + $val *= 1024; + case 'k': + $val *= 1024; + } - // Check php version >= 5.2 - $php_version = explode('.', phpversion()); - if ($php_version[0] < 5 || ($php_version[0] === 5 && $php_version[1] < 2)) { - $this->h5pF->setErrorMessage( - $this->h5pF->t('Your PHP version is too old. H5P needs at least version 5.2 to function properly') - ); - $disable_hub = TRUE; - } - - // Check max upload and post size - function return_bytes($val) { - $val = trim($val); - $last = strtolower($val[strlen($val)-1]); - switch($last) { - case 'g': - $val *= 1024; - case 'm': - $val *= 1024; - case 'k': - $val *= 1024; - } - - return $val; - } - - $max_upload_size = ini_get('upload_max_filesize'); - $max_post_size = ini_get('post_max_size'); - $byte_threshold = 5000000; // 5MB - if (return_bytes($max_upload_size) < $byte_threshold) { - $this->h5pF->setErrorMessage( - $this->h5pF->t('Your PHP max upload size option is too small. You should consider to increase it to more than 5MB.') - ); - } - - if (return_bytes($max_post_size) < $byte_threshold) { - $this->h5pF->setErrorMessage( - $this->h5pF->t('Your PHP max post size option is too small. You should consider to increase it to more than 5MB.') - ); - } - - // Check SSL - if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { - $this->h5pF->setErrorMessage( - $this->h5pF->t('Your server does not have SSL enabled. SSL should be enabled to ensure a secure connection with the H5P hub.') - ); - $disable_hub = TRUE; - } - - // Disable hub, and inform how to re-enable it - $this->h5pF->setOption('disable_hub', $disable_hub); - if ($disable_hub) { - $this->h5pF->setErrorMessage( - $this->h5pF->t('H5P hub communication has been disabled because one or more H5P requirements failed.') - ); - $this->h5pF->setErrorMessage( - $this->h5pF->t('When you have revised your server setup you may re-enable H5P hub communication in H5P Settings.') - ); - } + return $val; } } diff --git a/js/settings/h5p-disable-hub.js b/js/settings/h5p-disable-hub.js new file mode 100644 index 0000000..b525bd4 --- /dev/null +++ b/js/settings/h5p-disable-hub.js @@ -0,0 +1,66 @@ +/* global H5PDisableHubData */ + +/** + * Global data for disable hub functionality + * + * @typedef {object} H5PDisableHubData Data passed in from the backend + * + * @property {string} selector Selector for the disable hub check-button + * @property {string} overlaySelector Selector for the element that the confirmation dialog will mask + * @property {Array} errors Errors found with the current server setup + * + * @property {string} header Header of the confirmation dialog + * @property {string} confirmationDialogMsg Body of the confirmation dialog + * @property {string} cancelLabel Cancel label of the confirmation dialog + * @property {string} confirmLabel Confirm button label of the confirmation dialog + * + */ +/** + * Utility that makes it possible to force the user to confirm that he really + * wants to use the H5P hub without proper server settings. + */ +(function ($) { + + + + $(document).on('ready', function () { + + // No data found + if (!H5PDisableHubData) { + return; + } + + // No errors found, no need for confirmation dialog + if (!H5PDisableHubData.errors || !H5PDisableHubData.errors.length) { + return; + } + + var selector = H5PDisableHubData.selector; + var dialogHtml = '
' + + '

' + H5PDisableHubData.errors.join('

') + '

' + + '

' + H5PDisableHubData.confirmationDialogMsg + '

'; + + // Create confirmation dialog, make sure to include translations + var confirmationDialog = new H5P.ConfirmationDialog({ + headerText: H5PDisableHubData.header, + dialogText: dialogHtml, + cancelText: H5PDisableHubData.cancelLabel, + confirmText: H5PDisableHubData.confirmLabel + }).appendTo($(H5PDisableHubData.overlaySelector).get(0)); + + confirmationDialog.on('confirmed', function () { + disableButton.get(0).checked = false; + }); + + confirmationDialog.on('canceled', function () { + disableButton.get(0).checked = true; + }); + + var disableButton = $(selector); + disableButton.change(function () { + if (!$(this).is(':checked')) { + confirmationDialog.show(disableButton.offset().top); + } + }); + }); +})(H5P.jQuery); From 46d4d403f450c3033e1efd35eb79956f7478687b Mon Sep 17 00:00:00 2001 From: thomasmars Date: Tue, 21 Feb 2017 20:01:30 +0100 Subject: [PATCH 09/78] Added default selectors for disable hub elements. HFP-503 --- js/settings/h5p-disable-hub.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/js/settings/h5p-disable-hub.js b/js/settings/h5p-disable-hub.js index b525bd4..e78970a 100644 --- a/js/settings/h5p-disable-hub.js +++ b/js/settings/h5p-disable-hub.js @@ -21,8 +21,6 @@ */ (function ($) { - - $(document).on('ready', function () { // No data found @@ -35,7 +33,11 @@ return; } - var selector = H5PDisableHubData.selector; + H5PDisableHubData.selector = H5PDisableHubData.selector || + '.h5p-settings-disable-hub-checkbox'; + H5PDisableHubData.overlaySelector = H5PDisableHubData.overlaySelector || + '.h5p-settings-container'; + var dialogHtml = '
' + '

' + H5PDisableHubData.errors.join('

') + '

' + '

' + H5PDisableHubData.confirmationDialogMsg + '

'; @@ -56,7 +58,7 @@ disableButton.get(0).checked = true; }); - var disableButton = $(selector); + var disableButton = $(H5PDisableHubData.selector); disableButton.change(function () { if (!$(this).is(':checked')) { confirmationDialog.show(disableButton.offset().top); From 24fd6b1bc521ab464c39a3c18012b8ec232b2b11 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Wed, 22 Feb 2017 11:14:35 +0100 Subject: [PATCH 10/78] Made server setup check return errors instead of setting them. This is useful in cases where you want to process the error messages differently HFP-502 --- h5p.classes.php | 49 ++++++++++++++++++++++--------------------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 1d0c5d9..76780a3 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2762,67 +2762,62 @@ class H5PCore { /** * Check if the current server setup is valid and set error messages * - * @return bool True if errors was found + * @return array Errors found */ public function checkSetupErrorMessage() { - $disable_hub = FALSE; + $errors = array(); if (!class_exists('ZipArchive')) { - $this->h5pF->setErrorMessage('Your PHP version does not support ZipArchive.'); - $disable_hub = TRUE; + $errors[] = $this->h5pF->t('Your PHP version does not support ZipArchive.'); } if (!extension_loaded('mbstring')) { - $this->h5pF->setErrorMessage( - $this->h5pF->t('The mbstring PHP extension is not loaded. H5P need this to function properly') - ); - $disable_hub = TRUE; + $errors[] = + $this->h5pF->t('The mbstring PHP extension is not loaded. H5P need this to function properly'); } // Check php version >= 5.2 $php_version = explode('.', phpversion()); if ($php_version[0] < 5 || ($php_version[0] === 5 && $php_version[1] < 2)) { - $this->h5pF->setErrorMessage( - $this->h5pF->t('Your PHP version is too old. H5P needs at least version 5.2 to function properly') - ); - $disable_hub = TRUE; + $errors[] = + $this->h5pF->t('Your PHP version is too old. H5P needs at least version 5.2 to function properly'); } $max_upload_size = ini_get('upload_max_filesize'); $max_post_size = ini_get('post_max_size'); $byte_threshold = 5000000; // 5MB if (self::returnBytes($max_upload_size) < $byte_threshold) { - $this->h5pF->setErrorMessage( - $this->h5pF->t('Your PHP max upload size option is too small. You should consider to increase it to more than 5MB.') - ); + $errors[] = + $this->h5pF->t('Your PHP max upload size option is too small. You should consider to increase it to more than 5MB.'); } if (self::returnBytes($max_post_size) < $byte_threshold) { - $this->h5pF->setErrorMessage( - $this->h5pF->t('Your PHP max post size option is too small. You should consider to increase it to more than 5MB.') - ); + $errors[] = + $this->h5pF->t('Your PHP max post size option is too small. You should consider to increase it to more than 5MB.'); } // Check SSL if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { - $this->h5pF->setErrorMessage( - $this->h5pF->t('Your server does not have SSL enabled. SSL should be enabled to ensure a secure connection with the H5P hub.') - ); - $disable_hub = TRUE; + $errors[] = + $this->h5pF->t('Your server does not have SSL enabled. SSL should be enabled to ensure a secure connection with the H5P hub.'); } - return $disable_hub; + return $errors; } /** * Check that all H5P requirements for the server setup is met. */ public function checkSetupForRequirements() { - $disable_hub = $this->checkSetupErrorMessage(); + $errors = $this->checkSetupErrorMessage(); - // Disable hub, and inform how to re-enable it - $this->h5pF->setOption('disable_hub', $disable_hub); - if ($disable_hub) { + $this->h5pF->setOption('disable_hub', !empty($errors)); + if (!empty($errors)) { + foreach ($errors as $err) { + $this->h5pF->setErrorMessage($err); + } + + // Inform how to re-enable hub $this->h5pF->setErrorMessage( $this->h5pF->t('H5P hub communication has been disabled because one or more H5P requirements failed.') ); From 79fa5076f2b7020348be0864716a8ca4019962b5 Mon Sep 17 00:00:00 2001 From: Frode Petterson Date: Wed, 22 Feb 2017 11:25:05 +0100 Subject: [PATCH 11/78] Use realpath() instead of document root = safer Document root might be rewritten or incorrect for some sites(observed on multiple WP) HFP-784 --- h5p.classes.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index b0ad889..e04a0e9 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -1589,15 +1589,11 @@ Class H5PExport { $zip = new ZipArchive(); $zip->open($tmpFile, ZipArchive::CREATE | ZipArchive::OVERWRITE); - // Some system needs the root prefix for ZipArchive's addFile() - $rootPrefix = (empty($_SERVER['DOCUMENT_ROOT']) ? '' : $_SERVER['DOCUMENT_ROOT'] . '/'); - // Add all the files from the tmp dir. foreach ($files as $file) { // Please note that the zip format has no concept of folders, we must // use forward slashes to separate our directories. - $zip->addFile($file->absolutePath, $file->relativePath); - $zip->addFile($rootPrefix . $file->absolutePath, $file->relativePath); + $zip->addFile(realpath($file->absolutePath), $file->relativePath); } // Close zip and remove tmp dir From 58cbfc7f0c57dbbb86ccce69901acfdd2e4169d2 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Wed, 22 Feb 2017 14:50:45 +0100 Subject: [PATCH 12/78] Moved update content type cache into library core and interface. JI-53 --- h5p.classes.php | 57 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/h5p.classes.php b/h5p.classes.php index e04a0e9..05f093f 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -568,6 +568,24 @@ interface H5PFrameworkInterface { * @return boolean */ public function hasPermission($permission, $id = NULL); + + /** + * Get content type cache from an external url. + * + * @param string $endpoint Endpoint containing content type cache + * + * @return object Json object with an array called 'libraries' containing + * all content types that should be cached + */ + public function getExternalContentTypeCache($endpoint); + + /** + * Replaces existing content type cache with the one passed in + * + * @param object $contentTypeCache Json with an array called 'libraries' + * containing the new content type cache that should replace the old one. + */ + public function replaceContentTypeCache($contentTypeCache); } /** @@ -2754,6 +2772,45 @@ class H5PCore { return $token === substr(hash('md5', $action . $time_factor . $_SESSION['h5p_token']), -16, 13) || // Under 12 hours $token === substr(hash('md5', $action . ($time_factor - 1) . $_SESSION['h5p_token']), -16, 13); // Between 12-24 hours } + + /** + * Update content type cache + * + * @return bool True if successfully updated + */ + function updateContentTypeCache() { + // Get content type cache + $endpoint = 'http://hubendpoints'; + + $interface = $this->h5pF; + $data = $interface->getExternalContentTypeCache($endpoint); + + // No data received + if (!$data) { + $interface->setErrorMessage( + $interface->t('Could not connect to the H5P Content Type Hub. Please try again later.') + ); + return FALSE; + } + + $json = json_decode($data); + + // No libraries received + if (!isset($json->libraries) || empty($json->libraries)) { + $interface->setErrorMessage( + $interface->t('No libraries was received from the Content Type Hub. Please try again later.') + ); + return FALSE; + } + + // Replace content type cache + $interface->replaceContentTypeCache($json); + + // Inform of the changes and update timestamp + $interface->setInfoMessage($interface->t('Library cache was successfully updated!')); + $interface->setOption('content_type_cache_updated_at', time()); + return TRUE; + } } /** From f556cde38584325d4925d360369a063659863e8a Mon Sep 17 00:00:00 2001 From: thomasmars Date: Wed, 22 Feb 2017 16:20:09 +0100 Subject: [PATCH 13/78] Added localized time interface for displaying correct time of content type cache update. JI-53 --- h5p.classes.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index 05f093f..d6ced22 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -586,6 +586,13 @@ interface H5PFrameworkInterface { * containing the new content type cache that should replace the old one. */ public function replaceContentTypeCache($contentTypeCache); + + /** + * Get timestamp of time at user + * + * @return int Timestamp of localized time + */ + public function getCurrentUserTime(); } /** @@ -2808,7 +2815,7 @@ class H5PCore { // Inform of the changes and update timestamp $interface->setInfoMessage($interface->t('Library cache was successfully updated!')); - $interface->setOption('content_type_cache_updated_at', time()); + $interface->setOption('content_type_cache_updated_at', $interface->getCurrentUserTime()); return TRUE; } } From 1f7d03dfd462f887887e02df93e4e03858b0c550 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Wed, 22 Feb 2017 18:03:23 +0100 Subject: [PATCH 14/78] Don't use verb in setting name. HFP-502 --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index 76780a3..135e8aa 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2811,7 +2811,7 @@ class H5PCore { public function checkSetupForRequirements() { $errors = $this->checkSetupErrorMessage(); - $this->h5pF->setOption('disable_hub', !empty($errors)); + $this->h5pF->setOption('hub_is_disabled', !empty($errors)); if (!empty($errors)) { foreach ($errors as $err) { $this->h5pF->setErrorMessage($err); From ff531a157c242a34d22afe9a992e984ed6a8e024 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Wed, 22 Feb 2017 18:29:21 +0100 Subject: [PATCH 15/78] Improved error msg and check for openssl extension HFP-502 --- h5p.classes.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 135e8aa..b1898fe 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2780,7 +2780,7 @@ class H5PCore { $php_version = explode('.', phpversion()); if ($php_version[0] < 5 || ($php_version[0] === 5 && $php_version[1] < 2)) { $errors[] = - $this->h5pF->t('Your PHP version is too old. H5P needs at least version 5.2 to function properly'); + $this->h5pF->t('Your PHP version is outdated. H5P requires version 5.2 to function properly. Version 5.6 or later is recommended.'); } $max_upload_size = ini_get('upload_max_filesize'); @@ -2797,7 +2797,7 @@ class H5PCore { } // Check SSL - if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != 'off') { + if (!extension_loaded('openssl')) { $errors[] = $this->h5pF->t('Your server does not have SSL enabled. SSL should be enabled to ensure a secure connection with the H5P hub.'); } From bdf60a943d61e08ed6382ecc298d3ba5998e22a9 Mon Sep 17 00:00:00 2001 From: Frode Petterson Date: Wed, 22 Feb 2017 11:25:05 +0100 Subject: [PATCH 16/78] Use realpath() instead of document root = safer Document root might be rewritten or incorrect for some sites(observed on multiple WP) HFP-784 --- h5p.classes.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index b0ad889..e04a0e9 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -1589,15 +1589,11 @@ Class H5PExport { $zip = new ZipArchive(); $zip->open($tmpFile, ZipArchive::CREATE | ZipArchive::OVERWRITE); - // Some system needs the root prefix for ZipArchive's addFile() - $rootPrefix = (empty($_SERVER['DOCUMENT_ROOT']) ? '' : $_SERVER['DOCUMENT_ROOT'] . '/'); - // Add all the files from the tmp dir. foreach ($files as $file) { // Please note that the zip format has no concept of folders, we must // use forward slashes to separate our directories. - $zip->addFile($file->absolutePath, $file->relativePath); - $zip->addFile($rootPrefix . $file->absolutePath, $file->relativePath); + $zip->addFile(realpath($file->absolutePath), $file->relativePath); } // Close zip and remove tmp dir From 952a07456cff171f48a7c630725c36e3ae7f09fa Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 23 Feb 2017 11:33:39 +0100 Subject: [PATCH 17/78] Merge fetch libraries metadata and update content type cache into one request. Use fetchExteralData instead of adding new functionality since we're now using post. JI-53 --- h5p.classes.php | 66 ++++++++++++++++--------------------------------- 1 file changed, 21 insertions(+), 45 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index d6ced22..df78030 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -569,16 +569,6 @@ interface H5PFrameworkInterface { */ public function hasPermission($permission, $id = NULL); - /** - * Get content type cache from an external url. - * - * @param string $endpoint Endpoint containing content type cache - * - * @return object Json object with an array called 'libraries' containing - * all content types that should be cached - */ - public function getExternalContentTypeCache($endpoint); - /** * Replaces existing content type cache with the one passed in * @@ -2425,9 +2415,9 @@ class H5PCore { } /** - * Fetch a list of libraries' metadata from h5p.org. - * Save URL tutorial to database. Each platform implementation - * is responsible for invoking this, eg using cron + * Communicate with H5P.org and get content type cache. Each platform + * implementation is responsible for invoking this, eg using cron + * * @param bool $fetchingDisabled */ public function fetchLibrariesMetadata($fetchingDisabled = FALSE) { @@ -2456,37 +2446,16 @@ class H5PCore { ))) ); - // Send request - $protocol = (extension_loaded('openssl') ? 'https' : 'http'); - $result = $this->h5pF->fetchExternalData("{$protocol}://h5p.org/libraries-metadata.json", $data); - if (empty($result)) { - return; - } + $result = $this->updateContentTypeCache($data); - // Process results - $json = json_decode($result); - if (empty($json)) { + // No data received + if (!$result || empty($result)) { return; } - // Handle libraries metadata - if (isset($json->libraries)) { - foreach ($json->libraries as $machineName => $libInfo) { - if (isset($libInfo->tutorialUrl)) { - $this->h5pF->setLibraryTutorialUrl($machineName, $libInfo->tutorialUrl); - } - } - } - // Handle new uuid - if ($uuid === '' && isset($json->uuid)) { - $this->h5pF->setOption('site_uuid', $json->uuid); - } - - // Handle latest version of H5P - if (!empty($json->latest)) { - $this->h5pF->setOption('update_available', $json->latest->releasedAt); - $this->h5pF->setOption('update_available_path', $json->latest->path); + if ($uuid === '' && isset($result->uuid)) { + $this->h5pF->setOption('site_uuid', $result->uuid); } } @@ -2783,14 +2752,21 @@ class H5PCore { /** * Update content type cache * - * @return bool True if successfully updated + * @return bool|object Returns endpoint data if found, otherwise FALSE */ - function updateContentTypeCache() { - // Get content type cache - $endpoint = 'http://hubendpoints'; + function updateContentTypeCache($postData) { + $endpoint = 'http://hubendpoints/contenttypes'; $interface = $this->h5pF; - $data = $interface->getExternalContentTypeCache($endpoint); + + // Set uuid + if (!$postData) { + $postData = (object) array( + 'uuid' => $this->h5pF->getOption('site_uuid', '') + ); + } + + $data = $interface->fetchExternalData($endpoint, $postData); // No data received if (!$data) { @@ -2816,7 +2792,7 @@ class H5PCore { // Inform of the changes and update timestamp $interface->setInfoMessage($interface->t('Library cache was successfully updated!')); $interface->setOption('content_type_cache_updated_at', $interface->getCurrentUserTime()); - return TRUE; + return $data; } } From 4a8a7913275b55c453097118bcc672048c0c9dd2 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 23 Feb 2017 12:43:18 +0100 Subject: [PATCH 18/78] Fixed default arg for update content type cache JI-53 --- h5p.classes.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index df78030..16c029c 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2749,12 +2749,14 @@ class H5PCore { $token === substr(hash('md5', $action . ($time_factor - 1) . $_SESSION['h5p_token']), -16, 13); // Between 12-24 hours } - /** - * Update content type cache - * - * @return bool|object Returns endpoint data if found, otherwise FALSE - */ - function updateContentTypeCache($postData) { + /** + * Update content type cache + * + * @param object $postData Data sent to the hub + * + * @return bool|object Returns endpoint data if found, otherwise FALSE + */ + function updateContentTypeCache($postData = NULL) { $endpoint = 'http://hubendpoints/contenttypes'; $interface = $this->h5pF; From 183ec0a930b00b7bd4ffce826a2d64da823f5318 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 23 Feb 2017 13:28:59 +0100 Subject: [PATCH 19/78] Pass postData as array when fetching external ct cache data JI-54 --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index 16c029c..b83d668 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2763,7 +2763,7 @@ class H5PCore { // Set uuid if (!$postData) { - $postData = (object) array( + $postData = array( 'uuid' => $this->h5pF->getOption('site_uuid', '') ); } From aa861fc8ce278ce7f6036715644b4a75e0ae5a83 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 23 Feb 2017 14:20:56 +0100 Subject: [PATCH 20/78] Make disable hub, into enable hub to match the checkbox state. Implemented write access check HFP-502 --- h5p-default-storage.class.php | 25 +++++++++++++++++++++++++ h5p-file-storage.interface.php | 8 ++++++++ h5p.classes.php | 19 +++++++++++++++---- js/settings/h5p-disable-hub.js | 2 +- 4 files changed, 49 insertions(+), 5 deletions(-) diff --git a/h5p-default-storage.class.php b/h5p-default-storage.class.php index 0c67341..19cb2fe 100644 --- a/h5p-default-storage.class.php +++ b/h5p-default-storage.class.php @@ -386,6 +386,31 @@ class H5PDefaultStorage implements \H5PFileStorage { } } + /** + * Check if server setup has write permission to + * the required folders + * + * @return bool True if server has the proper write access + */ + public function hasWriteAccess() { + $dirs = array( + '/content', + '/libraries', + '/cachedassets', + '/temp', + '/editor', + '/exports' + ); + + // Check that directories are writable + $has_write_access = TRUE; + foreach ($dirs as $dir) { + $has_write_access = $has_write_access && self::dirReady($this->path . $dir); + } + + return $has_write_access; + } + /** * Recursive function for copying directories. * diff --git a/h5p-file-storage.interface.php b/h5p-file-storage.interface.php index 3c621f7..93ca771 100644 --- a/h5p-file-storage.interface.php +++ b/h5p-file-storage.interface.php @@ -171,4 +171,12 @@ interface H5PFileStorage { * @param int $contentId */ public function removeContentFile($file, $contentId); + + /** + * Check if server setup has write permission to + * the required folders + * + * @return bool True if server has the proper write access + */ + public function hasWriteAccess(); } diff --git a/h5p.classes.php b/h5p.classes.php index b1898fe..c4ad467 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2783,19 +2783,30 @@ class H5PCore { $this->h5pF->t('Your PHP version is outdated. H5P requires version 5.2 to function properly. Version 5.6 or later is recommended.'); } - $max_upload_size = ini_get('upload_max_filesize'); - $max_post_size = ini_get('post_max_size'); + // Check write access + if (!$this->fs->hasWriteAccess()) { + $errors[] = + $this->h5pF->t('A problem with the server write access was detected. Please make sure that your server can write to your data folder.'); + } + + $max_upload_size = self::returnBytes(ini_get('upload_max_filesize')); + $max_post_size = self::returnBytes(ini_get('post_max_size')); $byte_threshold = 5000000; // 5MB - if (self::returnBytes($max_upload_size) < $byte_threshold) { + if ($max_upload_size < $byte_threshold) { $errors[] = $this->h5pF->t('Your PHP max upload size option is too small. You should consider to increase it to more than 5MB.'); } - if (self::returnBytes($max_post_size) < $byte_threshold) { + if ($max_post_size < $byte_threshold) { $errors[] = $this->h5pF->t('Your PHP max post size option is too small. You should consider to increase it to more than 5MB.'); } + if ($max_upload_size > $max_post_size) { + $errors[] = + $this->h5pF->t('Your PHP max upload size is bigger than your max post size. This is known to cause issues in some installations.'); + } + // Check SSL if (!extension_loaded('openssl')) { $errors[] = diff --git a/js/settings/h5p-disable-hub.js b/js/settings/h5p-disable-hub.js index e78970a..7864695 100644 --- a/js/settings/h5p-disable-hub.js +++ b/js/settings/h5p-disable-hub.js @@ -60,7 +60,7 @@ var disableButton = $(H5PDisableHubData.selector); disableButton.change(function () { - if (!$(this).is(':checked')) { + if ($(this).is(':checked')) { confirmationDialog.show(disableButton.offset().top); } }); From a32f210188fea97279f7b34d35868a140322c10e Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 23 Feb 2017 14:22:56 +0100 Subject: [PATCH 21/78] Fixed enable hub button state after confirming dialog HFP-502 --- js/settings/h5p-disable-hub.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/js/settings/h5p-disable-hub.js b/js/settings/h5p-disable-hub.js index 7864695..406e8b2 100644 --- a/js/settings/h5p-disable-hub.js +++ b/js/settings/h5p-disable-hub.js @@ -51,17 +51,17 @@ }).appendTo($(H5PDisableHubData.overlaySelector).get(0)); confirmationDialog.on('confirmed', function () { - disableButton.get(0).checked = false; + enableButton.get(0).checked = true; }); confirmationDialog.on('canceled', function () { - disableButton.get(0).checked = true; + enableButton.get(0).checked = false; }); - var disableButton = $(H5PDisableHubData.selector); - disableButton.change(function () { + var enableButton = $(H5PDisableHubData.selector); + enableButton.change(function () { if ($(this).is(':checked')) { - confirmationDialog.show(disableButton.offset().top); + confirmationDialog.show(enableButton.offset().top); } }); }); From e88a23d26505364d3d4772833c03c8aaaf461930 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 23 Feb 2017 14:54:37 +0100 Subject: [PATCH 22/78] Changed hub variable name to match new settings name HFP-502 --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index c4ad467..d942c25 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2822,7 +2822,7 @@ class H5PCore { public function checkSetupForRequirements() { $errors = $this->checkSetupErrorMessage(); - $this->h5pF->setOption('hub_is_disabled', !empty($errors)); + $this->h5pF->setOption('hub_is_enabled', !empty($errors)); if (!empty($errors)) { foreach ($errors as $err) { $this->h5pF->setErrorMessage($err); From 585f4d238a3fdec161178209e20607c75e654b7a Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 23 Feb 2017 15:22:55 +0100 Subject: [PATCH 23/78] Fixed incorrect hub enabled value after server check HFP-502 --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index d942c25..4ea0e70 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2822,7 +2822,7 @@ class H5PCore { public function checkSetupForRequirements() { $errors = $this->checkSetupErrorMessage(); - $this->h5pF->setOption('hub_is_enabled', !empty($errors)); + $this->h5pF->setOption('hub_is_enabled', empty($errors)); if (!empty($errors)) { foreach ($errors as $err) { $this->h5pF->setErrorMessage($err); From fb1ed589e5e96786dcf3aef5fe65f8744c5d207b Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 23 Feb 2017 17:00:43 +0100 Subject: [PATCH 24/78] Style for drupal form seems to live here JI-47 --- styles/h5p-admin.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/styles/h5p-admin.css b/styles/h5p-admin.css index 64c025c..100dfea 100644 --- a/styles/h5p-admin.css +++ b/styles/h5p-admin.css @@ -232,7 +232,8 @@ button.h5p-admin.disabled:hover { .h5p-admin-header { margin-top: 1.5em; } -#h5p-library-upload-form.h5p-admin-upload-libraries-form { +#h5p-library-upload-form.h5p-admin-upload-libraries-form, +#h5p-content-type-cache-update-form.h5p-admin-upload-libraries-form { position: relative; margin: 0; From 1dec6453fdb249789125c3dc3b36dc3f30e3baae Mon Sep 17 00:00:00 2001 From: thomasmars Date: Fri, 24 Feb 2017 09:47:44 +0100 Subject: [PATCH 25/78] Check write access of H5P folder HFP-502 --- h5p-default-storage.class.php | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/h5p-default-storage.class.php b/h5p-default-storage.class.php index 19cb2fe..3ea2ba9 100644 --- a/h5p-default-storage.class.php +++ b/h5p-default-storage.class.php @@ -390,25 +390,10 @@ class H5PDefaultStorage implements \H5PFileStorage { * Check if server setup has write permission to * the required folders * - * @return bool True if server has the proper write access + * @return bool True if site can write to the H5P files folder */ public function hasWriteAccess() { - $dirs = array( - '/content', - '/libraries', - '/cachedassets', - '/temp', - '/editor', - '/exports' - ); - - // Check that directories are writable - $has_write_access = TRUE; - foreach ($dirs as $dir) { - $has_write_access = $has_write_access && self::dirReady($this->path . $dir); - } - - return $has_write_access; + return self::dirReady($this->path); } /** From 0641b3b824785e8eab504a4a0abbe419f2ba26e1 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Fri, 24 Feb 2017 15:38:49 +0100 Subject: [PATCH 26/78] Restored old package and tutorial functionality Removed uuid registration, will need separate endpoint Use time instead of localized time when setting ct cache update time Changed variable names to match API docs --- h5p.classes.php | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index b83d668..df40cac 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -576,13 +576,6 @@ interface H5PFrameworkInterface { * containing the new content type cache that should replace the old one. */ public function replaceContentTypeCache($contentTypeCache); - - /** - * Get timestamp of time at user - * - * @return int Timestamp of localized time - */ - public function getCurrentUserTime(); } /** @@ -2453,9 +2446,19 @@ class H5PCore { return; } - // Handle new uuid - if ($uuid === '' && isset($result->uuid)) { - $this->h5pF->setOption('site_uuid', $result->uuid); + // Handle libraries metadata + if (isset($result->libraries)) { + foreach ($result->libraries as $library) { + if (isset($library->tutorialUrl) && isset($library->machineName)) { + $this->h5pF->setLibraryTutorialUrl($library->machineNamee, $library->tutorialUrl); + } + } + } + + // Handle latest version of H5P + if (!empty($result->packageReleased)) { + $this->h5pF->setOption('update_available', $result->packageReleased->releasedAt); + $this->h5pF->setOption('update_available_path', $result->packageReleased->path); } } @@ -2793,7 +2796,7 @@ class H5PCore { // Inform of the changes and update timestamp $interface->setInfoMessage($interface->t('Library cache was successfully updated!')); - $interface->setOption('content_type_cache_updated_at', $interface->getCurrentUserTime()); + $interface->setOption('content_type_cache_updated_at', time()); return $data; } } From ec5a164971a29fb99dbc880ee40160dc35e6a626 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Fri, 24 Feb 2017 16:06:55 +0100 Subject: [PATCH 27/78] Send in current content type cache update timestamp when updating content type cache JI-53 --- h5p.classes.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/h5p.classes.php b/h5p.classes.php index df40cac..1ace399 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2771,6 +2771,8 @@ class H5PCore { ); } + $postData['current_cache'] = $this->h5pF->getOption('content_type_cache_updated_at', 0); + $data = $interface->fetchExternalData($endpoint, $postData); // No data received From 933b95f5ceeae4c61bb45e4da84a1fe20b708ba6 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Fri, 24 Feb 2017 16:34:16 +0100 Subject: [PATCH 28/78] Allow ajaxError to specify an error code as well. JI-53 --- h5p.classes.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index 1ace399..f0d2c2c 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2690,13 +2690,18 @@ class H5PCore { * @param string $message * @since 1.6.0 */ - public static function ajaxError($message = NULL) { + public static function ajaxError($message = NULL, $error_code = NULL) { $response = array( 'success' => FALSE ); if ($message !== NULL) { $response['message'] = $message; } + + if ($error_code !== NULL) { + $response['error_code'] = $error_code; + } + self::printJson($response); } From 3068d58b2bd21d098fe39cb05247ebfb0ef5954d Mon Sep 17 00:00:00 2001 From: thomasmars Date: Fri, 24 Feb 2017 17:00:43 +0100 Subject: [PATCH 29/78] Make update content type cache function public JI-53 --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index f0d2c2c..c8ad7f8 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2764,7 +2764,7 @@ class H5PCore { * * @return bool|object Returns endpoint data if found, otherwise FALSE */ - function updateContentTypeCache($postData = NULL) { + public function updateContentTypeCache($postData = NULL) { $endpoint = 'http://hubendpoints/contenttypes'; $interface = $this->h5pF; From 362464ad568dec0c266bcb5b76a83486646c9363 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Mon, 27 Feb 2017 16:01:08 +0100 Subject: [PATCH 30/78] Updated endpoint JI-90 --- h5p.classes.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 93c9597..7d7327f 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2765,7 +2765,7 @@ class H5PCore { * @return bool|object Returns endpoint data if found, otherwise FALSE */ public function updateContentTypeCache($postData = NULL) { - $endpoint = 'http://hubendpoints/contenttypes'; + $endpoint = 'http://api.h5p.org/v1/content-types'; $interface = $this->h5pF; @@ -2791,7 +2791,7 @@ class H5PCore { $json = json_decode($data); // No libraries received - if (!isset($json->libraries) || empty($json->libraries)) { + if (!isset($json->contentTypes) || empty($json->contentTypes)) { $interface->setErrorMessage( $interface->t('No libraries was received from the Content Type Hub. Please try again later.') ); From 0f08031abf2508159283afe95a3e63431d764b72 Mon Sep 17 00:00:00 2001 From: Frode Petterson Date: Tue, 28 Feb 2017 13:05:11 +0100 Subject: [PATCH 31/78] Allow Core to override permission check HFP-504 HFP-505 --- h5p.classes.php | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 93c9597..3f07493 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -783,7 +783,7 @@ class H5PValidator { } // The rest should be library folders - elseif ($this->h5pF->mayUpdateLibraries()) { + elseif ($this->h5pC->mayUpdateLibraries()) { if (!is_dir($filePath)) { // Ignore this. Probably a file that shouldn't have been included. continue; @@ -866,7 +866,7 @@ class H5PValidator { foreach ($missingLibraries as $libString => $library) { $this->h5pF->setErrorMessage($this->h5pF->t('Missing required library @library', array('@library' => $libString))); } - if (!$this->h5pF->mayUpdateLibraries()) { + if (!$this->h5pC->mayUpdateLibraries()) { $this->h5pF->setInfoMessage($this->h5pF->t("Note that the libraries may exist in the file you uploaded, but you're not allowed to upload new libraries. Contact the site administrator about this.")); } } @@ -1303,7 +1303,7 @@ class H5PStorage { * FALSE otherwise */ public function savePackage($content = NULL, $contentMainId = NULL, $skipContent = FALSE, $options = array()) { - if ($this->h5pF->mayUpdateLibraries()) { + if ($this->h5pC->mayUpdateLibraries()) { // Save the libraries we processed during validation $this->saveLibraries(); } @@ -2907,6 +2907,29 @@ class H5PCore { return $val; } + + /** + * Check if the current user has permission to update and install new + * libraries. + * + * @param bool [$set] Optional, sets the permission + * @return bool + */ + public function mayUpdateLibraries($set = null) { + static $can; + + if ($set !== null) { + // Use value set + $can = $set; + } + + if ($can === null) { + // Ask our framework + $can = $this->h5pF->mayUpdateLibraries(); + } + + return $can; + } } /** From 179601657c8f7b2a61fa16cbee6d5227360cd020 Mon Sep 17 00:00:00 2001 From: Frode Petterson Date: Thu, 2 Mar 2017 10:17:16 +0100 Subject: [PATCH 32/78] Remove prefix from file path Should already be complete at this point. JI-92 --- h5p-default-storage.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p-default-storage.class.php b/h5p-default-storage.class.php index 0c67341..5bb1495 100644 --- a/h5p-default-storage.class.php +++ b/h5p-default-storage.class.php @@ -285,7 +285,7 @@ class H5PDefaultStorage implements \H5PFileStorage { * @return string */ public function getContent($file_path) { - return file_get_contents($this->path . $file_path); + return file_get_contents($file_path); } /** From 3dbb8fae705df8ae31ba58b97812f007b9213d8b Mon Sep 17 00:00:00 2001 From: Paal Joergensen Date: Thu, 2 Mar 2017 11:43:45 +0100 Subject: [PATCH 33/78] Added check for icon.svg [HFP-806] --- h5p.classes.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 4ef02b1..8483bda 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -721,7 +721,7 @@ class H5PValidator { $mainH5pData = null; $libraryJsonData = null; $contentJsonData = null; - $mainH5pExists = $imageExists = $contentExists = FALSE; + $mainH5pExists = $contentExists = FALSE; foreach ($files as $file) { if (in_array(substr($file, 0, 1), array('.', '_'))) { continue; @@ -749,10 +749,6 @@ class H5PValidator { } } } - // Check for h5p.jpg? - elseif (strtolower($file) == 'h5p.jpg') { - $imageExists = TRUE; - } // Content directory holds content. elseif ($file == 'content') { // We do a separate skipContent check to avoid having the content folder being treated as a library @@ -937,6 +933,9 @@ class H5PValidator { } } + // Check for icon: + $h5pData['hasIcon'] = file_exists($filePath . DIRECTORY_SEPARATOR . 'icon.svg'); + $validLibrary = $this->isValidH5pData($h5pData, $file, $this->libraryRequired, $this->libraryOptional); $validLibrary = $this->h5pCV->validateContentFiles($filePath, TRUE) && $validLibrary; From 0e2edff5a85c67ba61c83f3b6d609e25c2f16c9b Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 2 Mar 2017 12:48:30 +0100 Subject: [PATCH 34/78] Helper functions for ct cache Generates properly formatted json from content type cache Merges content type cache with locally installed libraries HFP-797 --- h5p.classes.php | 94 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/h5p.classes.php b/h5p.classes.php index 4ef02b1..4b5b84c 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2807,6 +2807,100 @@ class H5PCore { return $data; } + /** + * Extract library properties from cached library so they are ready to be + * returned as JSON + * + * @param object $cached_library A single library from the content type cache + * + * @return array A list containing the necessary properties for a cached + * library to send to the front-end + */ + public function getCachedLibAsList($cached_library) { + return array( + 'id' => $cached_library->id, + 'machineName' => $cached_library->machine_name, + 'majorVersion' => $cached_library->major_version, + 'minorVersion' => $cached_library->minor_version, + 'patchVersion' => $cached_library->patch_version, + 'h5pMajorVersion' => $cached_library->h5p_major_version, + 'h5pMinorVersion' => $cached_library->h5p_minor_version, + 'title' => $cached_library->title, + 'summary' => $cached_library->summary, + 'description' => $cached_library->description, + 'icon' => $cached_library->icon, + 'createdAt' => $cached_library->created_at, + 'updatedAt' => $cached_library->updated_at, + 'isRecommended' => $cached_library->is_recommended, + 'popularity' => $cached_library->popularity, + 'screenshots' => json_decode($cached_library->screenshots), + 'license' => $cached_library->license, + 'example' => $cached_library->example, + 'tutorial' => $cached_library->tutorial, + 'keywords' => json_decode($cached_library->keywords), + 'categories' => json_decode($cached_library->categories), + 'owner' => $cached_library->owner, + 'installed' => FALSE, + 'isUpToDate' => FALSE, + 'restricted' => isset($cached_library->restricted) ? $cached_library->restricted : FALSE + ); + } + + /** + * Merge local libraries into cached libraries so that local libraries will + * get supplemented with the additional info from externally cached libraries. + * + * Also sets whether a given cached library is installed and up to date with + * the locally installed libraries + * + * @param object $local_libraries Locally installed libraries + * @param object $cached_libraries Cached libraries from the H5P hub + */ + public function mergeLocalLibsIntoCachedLibs($local_libraries, &$cached_libraries) { + + // Add local libraries to supplement content type cache + foreach ($local_libraries as $local_lib) { + $is_local_only = TRUE; + foreach ($cached_libraries as &$cached_lib) { + + // Determine if library is local + $is_matching_library = $cached_lib['machineName'] === $local_lib->machine_name; + if ($is_matching_library) { + $is_local_only = FALSE; + + // Set local properties + $cached_lib['installed'] = TRUE; + $cached_lib['restricted'] = $local_lib->restricted; + // TODO: set icon if it exists locally HFP-807 + + // Determine if library is the same as ct cache + $is_updated_library = + $cached_lib['majorVersion'] === $local_lib->major_version && + $cached_lib['minorVersion'] === $local_lib->minor_version && + $cached_lib['patchVersion'] === $local_lib->patch_version; + + if ($is_updated_library) { + $cached_lib['isUpToDate'] = TRUE; + } + } + } + + // Add minimal data to display local only libraries + if ($is_local_only) { + $cached_libraries[] = array( + 'id' => $local_lib->library_id, + 'machineName' => $local_lib->machine_name, + 'majorVersion' => $local_lib->major_version, + 'minorVersion' => $local_lib->minor_version, + 'patchVersion' => $local_lib->patch_version, + 'installed' => TRUE, + 'isUpToDate' => TRUE, + 'restricted' => $local_lib->restricted + ); + } + } + } + /** * Check if the current server setup is valid and set error messages * From 34b8a2fb585083011bc4fbb6385eb03f4faee913 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 2 Mar 2017 13:10:00 +0100 Subject: [PATCH 35/78] Updated phpdocs HFP-797 --- h5p.classes.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 2487a75..f12ae20 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2852,8 +2852,8 @@ class H5PCore { * Also sets whether a given cached library is installed and up to date with * the locally installed libraries * - * @param object $local_libraries Locally installed libraries - * @param object $cached_libraries Cached libraries from the H5P hub + * @param array $local_libraries Locally installed libraries + * @param array $cached_libraries Cached libraries from the H5P hub */ public function mergeLocalLibsIntoCachedLibs($local_libraries, &$cached_libraries) { From 515365d8df2ff00215d8ad6d67535529430eb39b Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 2 Mar 2017 14:14:26 +0100 Subject: [PATCH 36/78] Add common hub endpoint to core HFP-794 --- h5p.classes.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/h5p.classes.php b/h5p.classes.php index f12ae20..c85091f 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -1725,6 +1725,12 @@ class H5PCore { 'js/h5p-utils.js', ); + const CONTENT_TYPES = 0; + + public static $hubEndpoints = array( + self::CONTENT_TYPES => 'api.h5p.org/v1/content-types/' + ); + public static $defaultContentWhitelist = 'json png jpg jpeg gif bmp tif tiff svg eot ttf woff woff2 otf webm mp4 ogg mp3 txt pdf rtf doc docx xls xlsx ppt pptx odt ods odp xml csv diff patch swf md textile'; public static $defaultLibraryWhitelistExtras = 'js css'; From 79e32f0a7f1da3b7f94e9a414f9bdb0384d1c519 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 2 Mar 2017 14:21:11 +0100 Subject: [PATCH 37/78] Added proper protocol for endpoints HFP-794 --- h5p.classes.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index c85091f..85f0116 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2770,8 +2770,6 @@ class H5PCore { * @return bool|object Returns endpoint data if found, otherwise FALSE */ public function updateContentTypeCache($postData = NULL) { - $endpoint = 'http://api.h5p.org/v1/content-types'; - $interface = $this->h5pF; // Set uuid @@ -2783,7 +2781,9 @@ class H5PCore { $postData['current_cache'] = $this->h5pF->getOption('content_type_cache_updated_at', 0); - $data = $interface->fetchExternalData($endpoint, $postData); + $protocol = (extension_loaded('openssl') ? 'https' : 'http'); + $endpoint = H5PCore::$hubEndpoints[H5PCore::CONTENT_TYPES]; + $data = $interface->fetchExternalData($protocol . $endpoint, $postData); // No data received if (!$data) { From c0e82edfb4b4e4c422fb5613e21ab5303000a5ea Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 2 Mar 2017 14:25:30 +0100 Subject: [PATCH 38/78] Fixed endpoint address HFP-794 --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index 85f0116..0ce52a2 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2783,7 +2783,7 @@ class H5PCore { $protocol = (extension_loaded('openssl') ? 'https' : 'http'); $endpoint = H5PCore::$hubEndpoints[H5PCore::CONTENT_TYPES]; - $data = $interface->fetchExternalData($protocol . $endpoint, $postData); + $data = $interface->fetchExternalData("{$protocol}://{$endpoint}", $postData); // No data received if (!$data) { From 0af411bac8fd6d09b61f86ce887257a0144fe54f Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 2 Mar 2017 14:39:36 +0100 Subject: [PATCH 39/78] Send json as camelCase HFP-794 --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index 0ce52a2..478844d 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2704,7 +2704,7 @@ class H5PCore { } if ($error_code !== NULL) { - $response['error_code'] = $error_code; + $response['errorCode'] = $error_code; } self::printJson($response); From 410c2a9ae18af0d66ae50f13b77e1b1f6ffadba3 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Fri, 3 Mar 2017 10:33:21 +0100 Subject: [PATCH 40/78] Added permission check for restricted local libraries Renamed cached library map function to something more appropriate HFP-797 --- h5p.classes.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 478844d..e3dc773 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -1685,6 +1685,7 @@ Class H5PExport { abstract class H5PPermission { const DOWNLOAD_H5P = 0; const EMBED_H5P = 1; + const CREATE_RESTRICTED = 2; } abstract class H5PDisplayOptionBehaviour { @@ -2818,10 +2819,10 @@ class H5PCore { * * @param object $cached_library A single library from the content type cache * - * @return array A list containing the necessary properties for a cached + * @return array A map containing the necessary properties for a cached * library to send to the front-end */ - public function getCachedLibAsList($cached_library) { + public function getCachedLibsMap($cached_library) { return array( 'id' => $cached_library->id, 'machineName' => $cached_library->machine_name, @@ -2862,6 +2863,7 @@ class H5PCore { * @param array $cached_libraries Cached libraries from the H5P hub */ public function mergeLocalLibsIntoCachedLibs($local_libraries, &$cached_libraries) { + $can_create_restricted = $this->h5pF->hasPermission(H5PPermission::CREATE_RESTRICTED); // Add local libraries to supplement content type cache foreach ($local_libraries as $local_lib) { @@ -2875,7 +2877,8 @@ class H5PCore { // Set local properties $cached_lib['installed'] = TRUE; - $cached_lib['restricted'] = $local_lib->restricted; + $cached_lib['restricted'] = $can_create_restricted ? FALSE + : $local_lib->restricted; // TODO: set icon if it exists locally HFP-807 // Determine if library is the same as ct cache @@ -2900,7 +2903,7 @@ class H5PCore { 'patchVersion' => $local_lib->patch_version, 'installed' => TRUE, 'isUpToDate' => TRUE, - 'restricted' => $local_lib->restricted + 'restricted' => $can_create_restricted ? FALSE : $local_lib->restricted ); } } From 318b9f48195af78cfb9e5133c3b7176a289c7d8e Mon Sep 17 00:00:00 2001 From: thomasmars Date: Fri, 3 Mar 2017 10:43:39 +0100 Subject: [PATCH 41/78] Restrict LRS dependent content if set HFP-797 --- h5p.classes.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/h5p.classes.php b/h5p.classes.php index e3dc773..8112a5c 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2907,6 +2907,15 @@ class H5PCore { ); } } + + // Restrict LRS dependent content + if (!$this->h5pF->getOption('enable_lrs_content_types')) { + foreach ($cached_libraries as &$lib) { + if ($lib['machineName'] === 'H5P.Questionnaire') { + $lib['restricted'] = TRUE; + } + } + } } /** From 217c2006a4a54238010bf61d480c4c12db31fd5f Mon Sep 17 00:00:00 2001 From: thomasmars Date: Fri, 3 Mar 2017 11:29:09 +0100 Subject: [PATCH 42/78] Separate between setup error messages and disabling hub HFP-509 --- h5p.classes.php | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 8112a5c..f6227a2 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2921,72 +2921,81 @@ class H5PCore { /** * Check if the current server setup is valid and set error messages * - * @return array Errors found + * @return object Setup object with errors and disable hub properties */ public function checkSetupErrorMessage() { - $errors = array(); + $setup = (object) array( + 'errors' => array(), + 'disable_hub' => FALSE + ); if (!class_exists('ZipArchive')) { - $errors[] = $this->h5pF->t('Your PHP version does not support ZipArchive.'); + $setup->errors[] = $this->h5pF->t('Your PHP version does not support ZipArchive.'); + $setup->disable_hub = TRUE; } if (!extension_loaded('mbstring')) { - $errors[] = - $this->h5pF->t('The mbstring PHP extension is not loaded. H5P need this to function properly'); + $setup->errors[] = $this->h5pF->t( + 'The mbstring PHP extension is not loaded. H5P need this to function properly' + ); + $setup->disable_hub = TRUE; } // Check php version >= 5.2 $php_version = explode('.', phpversion()); if ($php_version[0] < 5 || ($php_version[0] === 5 && $php_version[1] < 2)) { - $errors[] = - $this->h5pF->t('Your PHP version is outdated. H5P requires version 5.2 to function properly. Version 5.6 or later is recommended.'); + $setup->errors[] = $this->h5pF->t('Your PHP version is outdated. H5P requires version 5.2 to function properly. Version 5.6 or later is recommended.'); + $setup->disable_hub = TRUE; } // Check write access if (!$this->fs->hasWriteAccess()) { - $errors[] = - $this->h5pF->t('A problem with the server write access was detected. Please make sure that your server can write to your data folder.'); + $setup->errors[] = $this->h5pF->t('A problem with the server write access was detected. Please make sure that your server can write to your data folder.'); + $setup->disable_hub = TRUE; } $max_upload_size = self::returnBytes(ini_get('upload_max_filesize')); $max_post_size = self::returnBytes(ini_get('post_max_size')); $byte_threshold = 5000000; // 5MB if ($max_upload_size < $byte_threshold) { - $errors[] = + $setup->errors[] = $this->h5pF->t('Your PHP max upload size option is too small. You should consider to increase it to more than 5MB.'); } if ($max_post_size < $byte_threshold) { - $errors[] = + $setup->errors[] = $this->h5pF->t('Your PHP max post size option is too small. You should consider to increase it to more than 5MB.'); } if ($max_upload_size > $max_post_size) { - $errors[] = + $setup->errors[] = $this->h5pF->t('Your PHP max upload size is bigger than your max post size. This is known to cause issues in some installations.'); } // Check SSL if (!extension_loaded('openssl')) { - $errors[] = + $setup->errors[] = $this->h5pF->t('Your server does not have SSL enabled. SSL should be enabled to ensure a secure connection with the H5P hub.'); + $setup->disable_hub = TRUE; } - return $errors; + return $setup; } /** * Check that all H5P requirements for the server setup is met. */ public function checkSetupForRequirements() { - $errors = $this->checkSetupErrorMessage(); + $setup = $this->checkSetupErrorMessage(); - $this->h5pF->setOption('hub_is_enabled', empty($errors)); - if (!empty($errors)) { - foreach ($errors as $err) { + $this->h5pF->setOption('hub_is_enabled', !$setup->disable_hub); + if (!empty($setup->errors)) { + foreach ($setup->errors as $err) { $this->h5pF->setErrorMessage($err); } + } + if ($setup->disable_hub) { // Inform how to re-enable hub $this->h5pF->setErrorMessage( $this->h5pF->t('H5P hub communication has been disabled because one or more H5P requirements failed.') From a95323948eeda654e8ea72d6c89275015e461a49 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Fri, 3 Mar 2017 14:47:15 +0100 Subject: [PATCH 43/78] Improved upload size error msg HFP-509 --- h5p.classes.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index f6227a2..d5569d1 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2959,12 +2959,12 @@ class H5PCore { $byte_threshold = 5000000; // 5MB if ($max_upload_size < $byte_threshold) { $setup->errors[] = - $this->h5pF->t('Your PHP max upload size option is too small. You should consider to increase it to more than 5MB.'); + $this->h5pF->t('Your PHP max upload size is quite small. With your current setup, you may not upload files larger than %number MB. This might be a problem when trying to upload H5Ps, images and videos. Please consider to increase it to more than 5MB.', array('%number' => number_format($max_upload_size / 1024 / 1024, 2, '.', ' '))); } if ($max_post_size < $byte_threshold) { $setup->errors[] = - $this->h5pF->t('Your PHP max post size option is too small. You should consider to increase it to more than 5MB.'); + $this->h5pF->t('Your PHP max post size is quite small. With your current setup, you may not upload files larger than %number MB. This might be a problem when trying to upload H5Ps, images and videos. Please consider to increase it to more than 5MB', array('%number' => number_format($max_upload_size / 1024 / 1024, 2, '.', ' '))); } if ($max_upload_size > $max_post_size) { From ae56eef91da34b57eb77dc01e360ae86ebf9fcc2 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Fri, 3 Mar 2017 15:45:19 +0100 Subject: [PATCH 44/78] Use ID instead of library_id for lbiraries HFP-793 --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index d5569d1..f9508d0 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2896,7 +2896,7 @@ class H5PCore { // Add minimal data to display local only libraries if ($is_local_only) { $cached_libraries[] = array( - 'id' => $local_lib->library_id, + 'id' => $local_lib->id, 'machineName' => $local_lib->machine_name, 'majorVersion' => $local_lib->major_version, 'minorVersion' => $local_lib->minor_version, From c8b123c5c3205818485bf3880e1e85816097b390 Mon Sep 17 00:00:00 2001 From: Paal Joergensen Date: Tue, 7 Mar 2017 09:46:16 +0100 Subject: [PATCH 45/78] Using local icon if present (HFP-807) --- h5p.classes.php | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index f9508d0..e2e1bba 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -67,6 +67,8 @@ interface H5PFrameworkInterface { */ public function t($message, $replacements = array()); + public function getLibraryFilePath($library_folder, $file); + /** * Get the Path to the last uploaded h5p * @@ -2868,18 +2870,33 @@ class H5PCore { // Add local libraries to supplement content type cache foreach ($local_libraries as $local_lib) { $is_local_only = TRUE; - foreach ($cached_libraries as &$cached_lib) { + // Check if icon is available locally: + if($local_lib->has_icon) { + // Create path to icon: + $library_folder = H5PCore::libraryToString(array( + 'machineName' => $local_lib->machine_name, + 'majorVersion' => $local_lib->major_version, + 'minorVersion' => $local_lib->minor_version + ), TRUE); + $icon_path = $this->h5pF->getLibraryFilePath($library_folder, 'icon.svg'); + } + + foreach ($cached_libraries as &$cached_lib) { // Determine if library is local $is_matching_library = $cached_lib['machineName'] === $local_lib->machine_name; if ($is_matching_library) { $is_local_only = FALSE; + // Set icon if it exists locally + if(isset($icon_path)) { + $cached_lib['icon'] = $icon_path; + } + // Set local properties $cached_lib['installed'] = TRUE; $cached_lib['restricted'] = $can_create_restricted ? FALSE : $local_lib->restricted; - // TODO: set icon if it exists locally HFP-807 // Determine if library is the same as ct cache $is_updated_library = @@ -2895,7 +2912,7 @@ class H5PCore { // Add minimal data to display local only libraries if ($is_local_only) { - $cached_libraries[] = array( + $local_only_lib = array( 'id' => $local_lib->id, 'machineName' => $local_lib->machine_name, 'majorVersion' => $local_lib->major_version, @@ -2905,6 +2922,12 @@ class H5PCore { 'isUpToDate' => TRUE, 'restricted' => $can_create_restricted ? FALSE : $local_lib->restricted ); + + if (isset($icon_path)) { + $local_only_lib['icon'] = $icon_path; + } + + $cached_libraries[] = $local_only_lib; } } From 37f4399ab4b4a1d3ae68390f47e8eb8b5edd3d62 Mon Sep 17 00:00:00 2001 From: Paal Joergensen Date: Tue, 7 Mar 2017 10:25:52 +0100 Subject: [PATCH 46/78] Added interface function that returns library file URL [HFP-805] --- h5p.classes.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index e2e1bba..90c0333 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -67,7 +67,13 @@ interface H5PFrameworkInterface { */ public function t($message, $replacements = array()); - public function getLibraryFilePath($library_folder, $file); + /** + * Get URL to file in the specific library + * @param string $libraryFolderName + * @param string $fileName + * @return string URL to file + */ + public function getLibraryFileUrl($libraryFolderName, $fileName); /** * Get the Path to the last uploaded h5p From 914ee55ac51e5ae61a83f0ed75e2e51ead677dca Mon Sep 17 00:00:00 2001 From: Paal Joergensen Date: Tue, 7 Mar 2017 10:36:49 +0100 Subject: [PATCH 47/78] Fixed broken core - using wrong function name [HFP-805] --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index 90c0333..52856fd 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2885,7 +2885,7 @@ class H5PCore { 'majorVersion' => $local_lib->major_version, 'minorVersion' => $local_lib->minor_version ), TRUE); - $icon_path = $this->h5pF->getLibraryFilePath($library_folder, 'icon.svg'); + $icon_path = $this->h5pF->getLibraryFileUrl($library_folder, 'icon.svg'); } foreach ($cached_libraries as &$cached_lib) { From f247bbdfe8c2457ee12f1be639144522523246ff Mon Sep 17 00:00:00 2001 From: Paal Joergensen Date: Tue, 7 Mar 2017 11:24:08 +0100 Subject: [PATCH 48/78] Improved json returned from content type cache endpoint --- h5p.classes.php | 43 ++++++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 52856fd..7ef173d 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2831,33 +2831,46 @@ class H5PCore { * library to send to the front-end */ public function getCachedLibsMap($cached_library) { - return array( - 'id' => $cached_library->id, + // Add mandatory fields + $lib = array( + 'id' => intval($cached_library->id), 'machineName' => $cached_library->machine_name, - 'majorVersion' => $cached_library->major_version, - 'minorVersion' => $cached_library->minor_version, - 'patchVersion' => $cached_library->patch_version, - 'h5pMajorVersion' => $cached_library->h5p_major_version, - 'h5pMinorVersion' => $cached_library->h5p_minor_version, + 'majorVersion' => intval( $cached_library->major_version), + 'minorVersion' => intval($cached_library->minor_version), + 'patchVersion' => intval($cached_library->patch_version), + 'h5pMajorVersion' => intval($cached_library->h5p_major_version), + 'h5pMinorVersion' => intval($cached_library->h5p_minor_version), 'title' => $cached_library->title, 'summary' => $cached_library->summary, 'description' => $cached_library->description, 'icon' => $cached_library->icon, - 'createdAt' => $cached_library->created_at, - 'updatedAt' => $cached_library->updated_at, - 'isRecommended' => $cached_library->is_recommended, - 'popularity' => $cached_library->popularity, + 'createdAt' => intval($cached_library->created_at), + 'updatedAt' => intval($cached_library->updated_at), + 'isRecommended' => $cached_library->is_recommended != 0, + 'popularity' => intval($cached_library->popularity), 'screenshots' => json_decode($cached_library->screenshots), 'license' => $cached_library->license, - 'example' => $cached_library->example, - 'tutorial' => $cached_library->tutorial, - 'keywords' => json_decode($cached_library->keywords), - 'categories' => json_decode($cached_library->categories), 'owner' => $cached_library->owner, 'installed' => FALSE, 'isUpToDate' => FALSE, 'restricted' => isset($cached_library->restricted) ? $cached_library->restricted : FALSE ); + + // Add optional fields + if (!empty($cached_library->categories)) { + $lib['categories'] = json_decode($cached_library->categories); + } + if (!empty($cached_library->keywords)) { + $lib['keywords'] = json_decode($cached_library->keywords); + } + if (!empty($cached_library->tutorial)) { + $lib['tutorial'] = $cached_library->tutorial; + } + if (!empty($cached_library->example)) { + $lib['example'] = $cached_library->example; + } + + return $lib; } /** From 358424f2be43a37707d09916c07bb5f792b0c2be Mon Sep 17 00:00:00 2001 From: Andreas Nergaard Date: Wed, 8 Mar 2017 12:25:56 +0100 Subject: [PATCH 49/78] HFP-826 Added 2 new icons to the core font. --- fonts/h5p-core-17.eot | Bin 6072 -> 0 bytes fonts/h5p-core-17.ttf | Bin 5924 -> 0 bytes fonts/h5p-core-17.woff | Bin 6000 -> 0 bytes fonts/h5p-core-18.eot | Bin 0 -> 6532 bytes fonts/{h5p-core-17.svg => h5p-core-18.svg} | 50 +++++++++++---------- fonts/h5p-core-18.ttf | Bin 0 -> 6384 bytes fonts/h5p-core-18.woff | Bin 0 -> 6460 bytes styles/h5p.css | 10 ++--- 8 files changed, 31 insertions(+), 29 deletions(-) delete mode 100755 fonts/h5p-core-17.eot delete mode 100755 fonts/h5p-core-17.ttf delete mode 100755 fonts/h5p-core-17.woff create mode 100755 fonts/h5p-core-18.eot rename fonts/{h5p-core-17.svg => h5p-core-18.svg} (50%) create mode 100755 fonts/h5p-core-18.ttf create mode 100755 fonts/h5p-core-18.woff diff --git a/fonts/h5p-core-17.eot b/fonts/h5p-core-17.eot deleted file mode 100755 index 89bfcc6349e3036065ebc568728a7ad0eae161a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6072 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 literal 0 HcmV?d00001 diff --git a/fonts/h5p-core-17.svg b/fonts/h5p-core-18.svg similarity index 50% rename from fonts/h5p-core-17.svg rename to fonts/h5p-core-18.svg index 9c12732..13da36e 100755 --- a/fonts/h5p-core-17.svg +++ b/fonts/h5p-core-18.svg @@ -23,28 +23,30 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/fonts/h5p-core-18.ttf b/fonts/h5p-core-18.ttf new file mode 100755 index 0000000000000000000000000000000000000000..37f845e07c942ee71609208e7bb775764e297355 GIT binary patch literal 6384 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 PBP&$QA9rW*|IGdyo!5`V literal 0 HcmV?d00001 diff --git a/styles/h5p.css b/styles/h5p.css index 7bb0a56..cdf593a 100755 --- a/styles/h5p.css +++ b/styles/h5p.css @@ -3,11 +3,11 @@ /* Custom H5P font to use for icons. */ @font-face { font-family: 'h5p'; - src: url('../fonts/h5p-core-17.eot?ddjqkb'); - src: url('../fonts/h5p-core-17.eot?ddjqkb#iefix') format('embedded-opentype'), - url('../fonts/h5p-core-17.ttf?ddjqkb') format('truetype'), - url('../fonts/h5p-core-17.woff?ddjqkb') format('woff'), - url('../fonts/h5p-core-17.svg?ddjqkb#h5p') format('svg'); + src: url('../fonts/h5p-core-18.eot?cb8kvi'); + src: url('../fonts/h5p-core-18.eot?cb8kvi#iefix') format('embedded-opentype'), + url('../fonts/h5p-core-18.ttf?cb8kvi') format('truetype'), + url('../fonts/h5p-core-18.woff?cb8kvi') format('woff'), + url('../fonts/h5p-core-18.svg?cb8kvi#h5p') format('svg'); font-weight: normal; font-style: normal; } From a720d465487e0048bc27c846efa010c749b77b5e Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 9 Mar 2017 17:36:20 +0100 Subject: [PATCH 50/78] Make it easier to send files to the editor HFP-822 --- h5p-default-storage.class.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/h5p-default-storage.class.php b/h5p-default-storage.class.php index eba4257..479c86a 100644 --- a/h5p-default-storage.class.php +++ b/h5p-default-storage.class.php @@ -408,7 +408,7 @@ class H5PDefaultStorage implements \H5PFileStorage { * * @throws Exception Unable to copy the file */ - private static function copyFileTree($source, $destination) { + public static function copyFileTree($source, $destination) { if (!self::dirReady($destination)) { throw new \Exception('unabletocopy'); } @@ -482,4 +482,13 @@ class H5PDefaultStorage implements \H5PFileStorage { return TRUE; } + + /** + * Easy helper function for retrieving the editor path + * + * @return null|string Path to editor files + */ + public function getEditorPath() { + return $this->alteditorpath; + } } From 4999862689de67a8e81042ad4ec7e1cd4666b280 Mon Sep 17 00:00:00 2001 From: Luke Muller Date: Fri, 10 Mar 2017 12:31:20 +1000 Subject: [PATCH 51/78] Fixed iOS bug for Image Hotspots and iFrames There is a bug in iOS with IFrame's that when changing orientation width: 100% stays at landscape rather than going back to portrait. https://bugs.webkit.org/show_bug.cgi?id=155198. Tested on iOS 10 iPhone 7 on image hotspot. --- styles/h5p.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/styles/h5p.css b/styles/h5p.css index cdf593a..cbc296a 100755 --- a/styles/h5p.css +++ b/styles/h5p.css @@ -147,7 +147,9 @@ div.h5p-fullscreen { z-index: 20; } .h5p-iframe-wrapper iframe.h5p-iframe { - width: 100%; + width: 10px; + min-width: 100%; + *width: 100%; height: 100%; z-index: 10; overflow: hidden; From 58d5eef4224f7c6877bad135bb844ead2275a1b4 Mon Sep 17 00:00:00 2001 From: Svein-Tore Griff With Date: Fri, 10 Mar 2017 08:59:46 +0100 Subject: [PATCH 52/78] Document ios landscape / portrait hack --- styles/h5p.css | 2 ++ 1 file changed, 2 insertions(+) diff --git a/styles/h5p.css b/styles/h5p.css index cbc296a..b13c6e0 100755 --- a/styles/h5p.css +++ b/styles/h5p.css @@ -147,9 +147,11 @@ div.h5p-fullscreen { z-index: 20; } .h5p-iframe-wrapper iframe.h5p-iframe { + /* Hack for IOS landscape / portrait */ width: 10px; min-width: 100%; *width: 100%; + /* End of hack */ height: 100%; z-index: 10; overflow: hidden; From 2b327323e1db58438d0d1f6427ca28caecff257b Mon Sep 17 00:00:00 2001 From: Frode Petterson Date: Fri, 10 Mar 2017 13:06:19 +0100 Subject: [PATCH 53/78] Add missing default --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index f12ae20..03c6a62 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -23,7 +23,7 @@ interface H5PFrameworkInterface { * @param $data * @return string The content (response body). NULL if something went wrong */ - public function fetchExternalData($url, $data); + public function fetchExternalData($url, $data = NULL); /** * Set the tutorial URL for a library. All versions of the library is set From b3e0539261ad2dc41ad291d66f8c27ed55e28101 Mon Sep 17 00:00:00 2001 From: Paal Joergensen Date: Fri, 10 Mar 2017 14:29:49 +0100 Subject: [PATCH 54/78] Resetting [HFP-805] --- h5p.classes.php | 1 + 1 file changed, 1 insertion(+) diff --git a/h5p.classes.php b/h5p.classes.php index a6c9940..628d30a 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2889,6 +2889,7 @@ class H5PCore { // Add local libraries to supplement content type cache foreach ($local_libraries as $local_lib) { $is_local_only = TRUE; + $icon_path = NULL; // Check if icon is available locally: if($local_lib->has_icon) { From 0970f74b432c2dbc8831fdeac9453ce3cae4a7c3 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Sat, 11 Mar 2017 18:43:08 +0100 Subject: [PATCH 55/78] Made it easier to use ajax functions in core with existing endpoints Moved common ajax functionality to core. Created interface functions for ajax functionality that must be handled by each plugin Re-encapsulated storage functions to keep a clean interface Added function for moving temp files to the editor HFP-822 --- h5p-default-storage.class.php | 45 ++++++++++++++++++--- h5p.classes.php | 74 +++++++++++++++++++++++++++++++---- 2 files changed, 106 insertions(+), 13 deletions(-) diff --git a/h5p-default-storage.class.php b/h5p-default-storage.class.php index 479c86a..df82802 100644 --- a/h5p-default-storage.class.php +++ b/h5p-default-storage.class.php @@ -299,7 +299,7 @@ class H5PDefaultStorage implements \H5PFileStorage { // Prepare directory if (empty($contentId)) { // Should be in editor tmp folder - $path = ($this->alteditorpath !== NULL ? $this->alteditorpath : $this->path . '/editor'); + $path = $this->getEditorPath(); } else { // Should be in content folder @@ -333,7 +333,7 @@ class H5PDefaultStorage implements \H5PFileStorage { public function cloneContentFile($file, $fromId, $toId) { // Determine source path if ($fromId === 'editor') { - $sourcepath = ($this->alteditorpath !== NULL ? $this->alteditorpath : "{$this->path}/editor"); + $sourcepath = $this->getEditorPath(); } else { $sourcepath = "{$this->path}/content/{$fromId}"; @@ -358,6 +358,39 @@ class H5PDefaultStorage implements \H5PFileStorage { copy($sourcepath, $targetpath); } + /** + * Copy a content from one directory to another. Defaults to cloning + * content from the current temporary upload folder to the editor path. + * + * @param string $source path to source directory + * @param string $target path of target directory. Defaults to editor path + */ + public function moveContentDirectory($source, $target = NULL) { + if ($source === NULL) { + return NULL; + } + + if ($target === NULL) { + $target = $this->getEditorPath(); + } + + $content_files = array_diff(scandir($content_path), array('.','..', 'content.json')); + foreach ($content_files as $file) { + if (is_dir($source)) { + self::copyFileTree($source, $taget); + } + else { + copy($tmp_file_path, $editor_file_path); + } + } + + // Successfully loaded content json of file into editor + $h5pJson = $this->getContent($path . DIRECTORY_SEPARATOR . 'h5p.json'); + $contentJson = $core->fs->getContent($path . DIRECTORY_SEPARATOR . 'content' . DIRECTORY_SEPARATOR . 'content.json'); + + return array(); + } + /** * Checks to see if content has the given file. * Used when saving content. @@ -408,7 +441,7 @@ class H5PDefaultStorage implements \H5PFileStorage { * * @throws Exception Unable to copy the file */ - public static function copyFileTree($source, $destination) { + private static function copyFileTree($source, $destination) { if (!self::dirReady($destination)) { throw new \Exception('unabletocopy'); } @@ -486,9 +519,9 @@ class H5PDefaultStorage implements \H5PFileStorage { /** * Easy helper function for retrieving the editor path * - * @return null|string Path to editor files + * @return string Path to editor files */ - public function getEditorPath() { - return $this->alteditorpath; + private function getEditorPath() { + return ($this->alteditorpath !== NULL ? $this->alteditorpath : "{$this->path}/editor"); } } diff --git a/h5p.classes.php b/h5p.classes.php index 628d30a..13c271d 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -23,7 +23,7 @@ interface H5PFrameworkInterface { * @param $data * @return string The content (response body). NULL if something went wrong */ - public function fetchExternalData($url, $data = NULL); + public function fetchExternalData($url, $data); /** * Set the tutorial URL for a library. All versions of the library is set @@ -584,6 +584,12 @@ interface H5PFrameworkInterface { * containing the new content type cache that should replace the old one. */ public function replaceContentTypeCache($contentTypeCache); + + public function getLatestLibraryVersions(); + + public function getContentTypeCache(); + + public function getAuthorsRecentlyUsedLibraries(); } /** @@ -1694,6 +1700,8 @@ abstract class H5PPermission { const DOWNLOAD_H5P = 0; const EMBED_H5P = 1; const CREATE_RESTRICTED = 2; + const UPDATE_LIBRARIES = 3; + const INSTALL_RECOMMENDED = 4; } abstract class H5PDisplayOptionBehaviour { @@ -2687,12 +2695,17 @@ class H5PCore { * @param mixed $data * @since 1.6.0 */ - public static function ajaxSuccess($data = NULL) { + public static function ajaxSuccess($data = NULL, $only_data = FALSE) { $response = array( 'success' => TRUE ); if ($data !== NULL) { $response['data'] = $data; + + // Pass data flatly to support old methods + if ($only_data) { + $response = $data; + } } self::printJson($response); } @@ -2701,10 +2714,13 @@ class H5PCore { * Makes it easier to print response when AJAX request fails. * Will exit after printing error. * - * @param string $message + * @param string $message A human readable error message + * @param string $error_code An machine readable error code that a client + * should be able to interpret + * @param null|int $status_code Http response code * @since 1.6.0 */ - public static function ajaxError($message = NULL, $error_code = NULL) { + public static function ajaxError($message = NULL, $error_code = NULL, $status_code = NULL) { $response = array( 'success' => FALSE ); @@ -2716,7 +2732,7 @@ class H5PCore { $response['errorCode'] = $error_code; } - self::printJson($response); + self::printJson($response, $status_code); } /** @@ -2724,8 +2740,13 @@ class H5PCore { * Makes it easier to respond using JSON. * * @param mixed $data + * @param null|int $status_code Http response code */ - private static function printJson($data) { + private static function printJson($data, $status_code = NULL) { + if ($status_code !== NULL) { + http_response_code($status_code); + } + header('Cache-Control: no-cache'); header('Content-type: application/json; charset=utf-8'); print json_encode($data); @@ -2889,7 +2910,6 @@ class H5PCore { // Add local libraries to supplement content type cache foreach ($local_libraries as $local_lib) { $is_local_only = TRUE; - $icon_path = NULL; // Check if icon is available locally: if($local_lib->has_icon) { @@ -3093,6 +3113,46 @@ class H5PCore { return $can; } + + /** + * Gets content type cache, applies user specific properties and formats + * as camelCase. + * + * @return array $libraries Cached libraries from the H5P Hub with user specific + * permission properties + */ + public function getUserSpecificContentTypeCache() { + $cached_libraries = $this->h5pF->getContentTypeCache(); + + // Determine access + $can_install_all = $this->h5pF->hasPermission(H5PPermission::UPDATE_LIBRARIES); + $can_install_recommended = $this->h5pF->hasPermission(H5PPermission::INSTALL_RECOMMENDED); + + + // Check if user has access to install libraries and format to json + $libraries = array(); + foreach ($cached_libraries as &$result) { + $can_install_lib = $can_install_all || $result->is_recommended && $can_install_recommended; + $result->restricted = !$can_install_lib; + $libraries[] = $this->getCachedLibsMap($result); + } + + return $libraries; + } + + /** + * Gets local and external libraries data with metadata to display + * all libraries that are currently available for the user. + * + * @return array $libraries Latest local and external libraries data with + * user specific permissions + */ + public function getLatestGlobalLibrariesData() { + $latest_local_libraries = $this->h5pF->getLatestLibraryVersions(); + $cached_libraries = $this->getUserSpecificContentTypeCache(); + $this->mergeLocalLibsIntoCachedLibs($latest_local_libraries, $cached_libraries); + return $cached_libraries; + } } /** From cf3022af4394df351075bd23187cb8ae1a632d87 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Sun, 12 Mar 2017 17:56:36 +0100 Subject: [PATCH 56/78] Moved editor specific functionality to editor interface Refactored hub endpoints into an abstract class for consistency and easier lookup Fixed bug in moveContentDirectory function HFP-822 --- h5p-default-storage.class.php | 20 ++-- h5p.classes.php | 196 +--------------------------------- 2 files changed, 16 insertions(+), 200 deletions(-) diff --git a/h5p-default-storage.class.php b/h5p-default-storage.class.php index df82802..c9dc99d 100644 --- a/h5p-default-storage.class.php +++ b/h5p-default-storage.class.php @@ -374,21 +374,25 @@ class H5PDefaultStorage implements \H5PFileStorage { $target = $this->getEditorPath(); } - $content_files = array_diff(scandir($content_path), array('.','..', 'content.json')); - foreach ($content_files as $file) { - if (is_dir($source)) { - self::copyFileTree($source, $taget); + $contentSource = $source . DIRECTORY_SEPARATOR . 'content'; + $contentFiles = array_diff(scandir($contentSource), array('.','..', 'content.json')); + foreach ($contentFiles as $file) { + if (is_dir($contentSource)) { + self::copyFileTree($contentSource, $target); } else { - copy($tmp_file_path, $editor_file_path); + copy($contentSource . DIRECTORY_SEPARATOR . $file, $target . DIRECTORY_SEPARATOR . $file); } } // Successfully loaded content json of file into editor - $h5pJson = $this->getContent($path . DIRECTORY_SEPARATOR . 'h5p.json'); - $contentJson = $core->fs->getContent($path . DIRECTORY_SEPARATOR . 'content' . DIRECTORY_SEPARATOR . 'content.json'); + $h5pJson = $this->getContent($source . DIRECTORY_SEPARATOR . 'h5p.json'); + $contentJson = $this->getContent($contentSource . DIRECTORY_SEPARATOR . 'content.json'); - return array(); + return (object) array( + 'h5pJson' => $h5pJson, + 'contentJson' => $contentJson + ); } /** diff --git a/h5p.classes.php b/h5p.classes.php index 13c271d..a48efa0 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -584,12 +584,6 @@ interface H5PFrameworkInterface { * containing the new content type cache that should replace the old one. */ public function replaceContentTypeCache($contentTypeCache); - - public function getLatestLibraryVersions(); - - public function getContentTypeCache(); - - public function getAuthorsRecentlyUsedLibraries(); } /** @@ -1712,6 +1706,9 @@ abstract class H5PDisplayOptionBehaviour { const CONTROLLED_BY_PERMISSIONS = 4; } +abstract class H5PHubEndpoints { + const CONTENT_TYPES = 'api.h5p.org/v1/content-types/'; +} /** * Functions and storage shared by the other H5P classes @@ -1742,12 +1739,6 @@ class H5PCore { 'js/h5p-utils.js', ); - const CONTENT_TYPES = 0; - - public static $hubEndpoints = array( - self::CONTENT_TYPES => 'api.h5p.org/v1/content-types/' - ); - public static $defaultContentWhitelist = 'json png jpg jpeg gif bmp tif tiff svg eot ttf woff woff2 otf webm mp4 ogg mp3 txt pdf rtf doc docx xls xlsx ppt pptx odt ods odp xml csv diff patch swf md textile'; public static $defaultLibraryWhitelistExtras = 'js css'; @@ -2812,7 +2803,7 @@ class H5PCore { $postData['current_cache'] = $this->h5pF->getOption('content_type_cache_updated_at', 0); $protocol = (extension_loaded('openssl') ? 'https' : 'http'); - $endpoint = H5PCore::$hubEndpoints[H5PCore::CONTENT_TYPES]; + $endpoint = H5PHubEndpoints::CONTENT_TYPES; $data = $interface->fetchExternalData("{$protocol}://{$endpoint}", $postData); // No data received @@ -2842,145 +2833,6 @@ class H5PCore { return $data; } - /** - * Extract library properties from cached library so they are ready to be - * returned as JSON - * - * @param object $cached_library A single library from the content type cache - * - * @return array A map containing the necessary properties for a cached - * library to send to the front-end - */ - public function getCachedLibsMap($cached_library) { - // Add mandatory fields - $lib = array( - 'id' => intval($cached_library->id), - 'machineName' => $cached_library->machine_name, - 'majorVersion' => intval( $cached_library->major_version), - 'minorVersion' => intval($cached_library->minor_version), - 'patchVersion' => intval($cached_library->patch_version), - 'h5pMajorVersion' => intval($cached_library->h5p_major_version), - 'h5pMinorVersion' => intval($cached_library->h5p_minor_version), - 'title' => $cached_library->title, - 'summary' => $cached_library->summary, - 'description' => $cached_library->description, - 'icon' => $cached_library->icon, - 'createdAt' => intval($cached_library->created_at), - 'updatedAt' => intval($cached_library->updated_at), - 'isRecommended' => $cached_library->is_recommended != 0, - 'popularity' => intval($cached_library->popularity), - 'screenshots' => json_decode($cached_library->screenshots), - 'license' => $cached_library->license, - 'owner' => $cached_library->owner, - 'installed' => FALSE, - 'isUpToDate' => FALSE, - 'restricted' => isset($cached_library->restricted) ? $cached_library->restricted : FALSE - ); - - // Add optional fields - if (!empty($cached_library->categories)) { - $lib['categories'] = json_decode($cached_library->categories); - } - if (!empty($cached_library->keywords)) { - $lib['keywords'] = json_decode($cached_library->keywords); - } - if (!empty($cached_library->tutorial)) { - $lib['tutorial'] = $cached_library->tutorial; - } - if (!empty($cached_library->example)) { - $lib['example'] = $cached_library->example; - } - - return $lib; - } - - /** - * Merge local libraries into cached libraries so that local libraries will - * get supplemented with the additional info from externally cached libraries. - * - * Also sets whether a given cached library is installed and up to date with - * the locally installed libraries - * - * @param array $local_libraries Locally installed libraries - * @param array $cached_libraries Cached libraries from the H5P hub - */ - public function mergeLocalLibsIntoCachedLibs($local_libraries, &$cached_libraries) { - $can_create_restricted = $this->h5pF->hasPermission(H5PPermission::CREATE_RESTRICTED); - - // Add local libraries to supplement content type cache - foreach ($local_libraries as $local_lib) { - $is_local_only = TRUE; - - // Check if icon is available locally: - if($local_lib->has_icon) { - // Create path to icon: - $library_folder = H5PCore::libraryToString(array( - 'machineName' => $local_lib->machine_name, - 'majorVersion' => $local_lib->major_version, - 'minorVersion' => $local_lib->minor_version - ), TRUE); - $icon_path = $this->h5pF->getLibraryFileUrl($library_folder, 'icon.svg'); - } - - foreach ($cached_libraries as &$cached_lib) { - // Determine if library is local - $is_matching_library = $cached_lib['machineName'] === $local_lib->machine_name; - if ($is_matching_library) { - $is_local_only = FALSE; - - // Set icon if it exists locally - if(isset($icon_path)) { - $cached_lib['icon'] = $icon_path; - } - - // Set local properties - $cached_lib['installed'] = TRUE; - $cached_lib['restricted'] = $can_create_restricted ? FALSE - : $local_lib->restricted; - - // Determine if library is the same as ct cache - $is_updated_library = - $cached_lib['majorVersion'] === $local_lib->major_version && - $cached_lib['minorVersion'] === $local_lib->minor_version && - $cached_lib['patchVersion'] === $local_lib->patch_version; - - if ($is_updated_library) { - $cached_lib['isUpToDate'] = TRUE; - } - } - } - - // Add minimal data to display local only libraries - if ($is_local_only) { - $local_only_lib = array( - 'id' => $local_lib->id, - 'machineName' => $local_lib->machine_name, - 'majorVersion' => $local_lib->major_version, - 'minorVersion' => $local_lib->minor_version, - 'patchVersion' => $local_lib->patch_version, - 'installed' => TRUE, - 'isUpToDate' => TRUE, - 'restricted' => $can_create_restricted ? FALSE : $local_lib->restricted - ); - - if (isset($icon_path)) { - $local_only_lib['icon'] = $icon_path; - } - - $cached_libraries[] = $local_only_lib; - } - } - - // Restrict LRS dependent content - if (!$this->h5pF->getOption('enable_lrs_content_types')) { - foreach ($cached_libraries as &$lib) { - if ($lib['machineName'] === 'H5P.Questionnaire') { - $lib['restricted'] = TRUE; - } - } - } - } - /** * Check if the current server setup is valid and set error messages * @@ -3113,46 +2965,6 @@ class H5PCore { return $can; } - - /** - * Gets content type cache, applies user specific properties and formats - * as camelCase. - * - * @return array $libraries Cached libraries from the H5P Hub with user specific - * permission properties - */ - public function getUserSpecificContentTypeCache() { - $cached_libraries = $this->h5pF->getContentTypeCache(); - - // Determine access - $can_install_all = $this->h5pF->hasPermission(H5PPermission::UPDATE_LIBRARIES); - $can_install_recommended = $this->h5pF->hasPermission(H5PPermission::INSTALL_RECOMMENDED); - - - // Check if user has access to install libraries and format to json - $libraries = array(); - foreach ($cached_libraries as &$result) { - $can_install_lib = $can_install_all || $result->is_recommended && $can_install_recommended; - $result->restricted = !$can_install_lib; - $libraries[] = $this->getCachedLibsMap($result); - } - - return $libraries; - } - - /** - * Gets local and external libraries data with metadata to display - * all libraries that are currently available for the user. - * - * @return array $libraries Latest local and external libraries data with - * user specific permissions - */ - public function getLatestGlobalLibrariesData() { - $latest_local_libraries = $this->h5pF->getLatestLibraryVersions(); - $cached_libraries = $this->getUserSpecificContentTypeCache(); - $this->mergeLocalLibsIntoCachedLibs($latest_local_libraries, $cached_libraries); - return $cached_libraries; - } } /** From 1b19f2701d2b900f757fb8ee529a2e8e53006a0e Mon Sep 17 00:00:00 2001 From: thomasmars Date: Mon, 13 Mar 2017 14:56:01 +0100 Subject: [PATCH 57/78] Make data optional in fetchExternalData function HFP-822 --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index a48efa0..819ceb8 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -23,7 +23,7 @@ interface H5PFrameworkInterface { * @param $data * @return string The content (response body). NULL if something went wrong */ - public function fetchExternalData($url, $data); + public function fetchExternalData($url, $data = NULL); /** * Set the tutorial URL for a library. All versions of the library is set From 754346992bfe0dd854cb9cc4ade8806bc0f4b64d Mon Sep 17 00:00:00 2001 From: thomasmars Date: Tue, 14 Mar 2017 14:21:36 +0100 Subject: [PATCH 58/78] Minor documentation details --- h5p-default-storage.class.php | 2 ++ h5p-file-storage.interface.php | 17 ++++++++++++++--- h5p.classes.php | 3 ++- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/h5p-default-storage.class.php b/h5p-default-storage.class.php index c9dc99d..2f8fbbc 100644 --- a/h5p-default-storage.class.php +++ b/h5p-default-storage.class.php @@ -364,6 +364,8 @@ class H5PDefaultStorage implements \H5PFileStorage { * * @param string $source path to source directory * @param string $target path of target directory. Defaults to editor path + * + * @return object Object containing h5p json and content json data */ public function moveContentDirectory($source, $target = NULL) { if ($source === NULL) { diff --git a/h5p-file-storage.interface.php b/h5p-file-storage.interface.php index 93ca771..fadee65 100644 --- a/h5p-file-storage.interface.php +++ b/h5p-file-storage.interface.php @@ -139,7 +139,7 @@ interface H5PFileStorage { * The files must be marked as temporary until the content form is saved. * * @param \H5peditorFile $file - * @param int $contentid + * @param int $contentId */ public function saveFile($file, $contentId); @@ -148,11 +148,22 @@ interface H5PFileStorage { * Used when copy pasting content in H5P. * * @param string $file path + name - * @param string|int $fromid Content ID or 'editor' string - * @param int $toid Target Content ID + * @param string|int $fromId Content ID or 'editor' string + * @param int $toId Target Content ID */ public function cloneContentFile($file, $fromId, $toId); + /** + * Copy a content from one directory to another. Defaults to cloning + * content from the current temporary upload folder to the editor path. + * + * @param string $source path to source directory + * @param string $target path of target directory. Defaults to editor path + * + * @return object Object containing h5p json and content json data + */ + public function moveContentDirectory($source, $target = NULL); + /** * Checks to see if content has the given file. * Used when saving content. diff --git a/h5p.classes.php b/h5p.classes.php index 819ceb8..0587bf7 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2795,8 +2795,9 @@ class H5PCore { // Set uuid if (!$postData) { + $siteKey = $this->h5pF->getOption('site_key', ''); $postData = array( - 'uuid' => $this->h5pF->getOption('site_uuid', '') + 'uuid' => $siteKey ? $siteKey : $this->h5pF->getOption('site_uuid', '') ); } From 75b8f9efd63ad75f7723705e89e4833fb780c71c Mon Sep 17 00:00:00 2001 From: thomasmars Date: Tue, 14 Mar 2017 15:00:14 +0100 Subject: [PATCH 59/78] Fixed move content folder bug HFP-822 --- h5p-default-storage.class.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/h5p-default-storage.class.php b/h5p-default-storage.class.php index 2f8fbbc..f34bf09 100644 --- a/h5p-default-storage.class.php +++ b/h5p-default-storage.class.php @@ -319,7 +319,7 @@ class H5PDefaultStorage implements \H5PFileStorage { copy($_FILES['file']['tmp_name'], $path); } - return $path; + return $file; } /** @@ -379,11 +379,11 @@ class H5PDefaultStorage implements \H5PFileStorage { $contentSource = $source . DIRECTORY_SEPARATOR . 'content'; $contentFiles = array_diff(scandir($contentSource), array('.','..', 'content.json')); foreach ($contentFiles as $file) { - if (is_dir($contentSource)) { - self::copyFileTree($contentSource, $target); + if (is_dir("{$contentSource}/{$file}")) { + self::copyFileTree("{$contentSource}/{$file}", "{$target}/{$file}"); } else { - copy($contentSource . DIRECTORY_SEPARATOR . $file, $target . DIRECTORY_SEPARATOR . $file); + copy("{$contentSource}/{$file}", "{$target}/{$file}"); } } From 93e9d6e0ec7db72624c5eeb69e1b46fda4afaca0 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 16 Mar 2017 09:51:46 +0100 Subject: [PATCH 60/78] Register site with new endpoint if no site is already registered HFP-489 --- h5p.classes.php | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index 628d30a..589d456 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2426,6 +2426,8 @@ class H5PCore { * implementation is responsible for invoking this, eg using cron * * @param bool $fetchingDisabled + * + * @return bool|object Returns endpoint data if found, otherwise FALSE */ public function fetchLibrariesMetadata($fetchingDisabled = FALSE) { // Gather data @@ -2453,6 +2455,26 @@ class H5PCore { ))) ); + // Register site if it is not registered + if (empty($uuid)) { + $protocol = (extension_loaded('openssl') ? 'https' : 'http'); + $endpoint = 'api.h5p.org/v1/sites'; + $registration = $this->h5pF->fetchExternalData("{$protocol}://{$endpoint}", $data); + + // Failed retrieving uuid + if (!$registration) { + return H5PCore::ajaxError( + t('Site could not be registered with the hub. Please contact your site administrator.'), + 'SITE_REGISTRATION_FAILED' + ); + } + + // Successfully retrieved new uuid + $json = json_decode($registration); + $data['uuid'] = $json->uuid; + $this->h5pF->setOption('site_uuid', $json->uuid); + } + $result = $this->updateContentTypeCache($data); // No data received @@ -2783,8 +2805,16 @@ class H5PCore { // Set uuid if (!$postData) { + $site_uuid = $this->h5pF->getOption('site_uuid', ''); + + // Register site with site uuid if we don't already have it + // and try to update content type cache again when this is done + if (empty($site_uuid)) { + return $this->fetchLibrariesMetadata(); + } + $postData = array( - 'uuid' => $this->h5pF->getOption('site_uuid', '') + 'uuid' => $site_uuid ); } From 675c87df6876ee17230eccac4ed0ecf82734b35e Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 16 Mar 2017 10:01:41 +0100 Subject: [PATCH 61/78] Added more detailed messages when site is or fails to register HFP-489 --- h5p.classes.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index 589d456..5c6c394 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2463,16 +2463,27 @@ class H5PCore { // Failed retrieving uuid if (!$registration) { + $errorMessage = $this->h5pF->t('Site could not be registered with the hub. Please contact your site administrator.'); return H5PCore::ajaxError( - t('Site could not be registered with the hub. Please contact your site administrator.'), + $errorMessage, 'SITE_REGISTRATION_FAILED' ); + $this->h5pF->setErrorMessage($errorMessage); + $this->h5pF->setErrorMessage( + $this->h5pF->t('The H5P Hub has been disabled until this problem can be resolved. You may still upload libraries through the "H5P Libraries" page.') + ); } // Successfully retrieved new uuid $json = json_decode($registration); $data['uuid'] = $json->uuid; $this->h5pF->setOption('site_uuid', $json->uuid); + $this->h5pF->setInfoMessage( + $this->h5pF->t('Your site was successfully registered with the H5P Hub.') + ); + $this->h5pF->setInfoMessage( + $this->h5pF->t('You have been provided a unique key that identifies you with the Hub when receiving new updates. The key is available for viewing in the "H5P Settings" page.') + ); } $result = $this->updateContentTypeCache($data); From fd93b30a388a4146cc52a15332342fa18c400ece Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 16 Mar 2017 10:09:52 +0100 Subject: [PATCH 62/78] Fixed return statement of fetch libraries metadata HFP-489 --- h5p.classes.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index 5c6c394..3889c72 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2464,7 +2464,7 @@ class H5PCore { // Failed retrieving uuid if (!$registration) { $errorMessage = $this->h5pF->t('Site could not be registered with the hub. Please contact your site administrator.'); - return H5PCore::ajaxError( + H5PCore::ajaxError( $errorMessage, 'SITE_REGISTRATION_FAILED' ); @@ -2472,6 +2472,7 @@ class H5PCore { $this->h5pF->setErrorMessage( $this->h5pF->t('The H5P Hub has been disabled until this problem can be resolved. You may still upload libraries through the "H5P Libraries" page.') ); + return FALSE; } // Successfully retrieved new uuid From 3611da5921703db2c0ff82957f96284767d32bc7 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Sat, 18 Mar 2017 15:39:27 +0100 Subject: [PATCH 63/78] Only send the necessary data when registering a site Merge in the rest of the metadata when fetching ct cache HFP-489 --- h5p.classes.php | 44 ++++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 18 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index bc74150..4bf126c 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2432,33 +2432,21 @@ class H5PCore { // Gather data $uuid = $this->h5pF->getOption('site_uuid', ''); $platform = $this->h5pF->getPlatformInfo(); - $data = array( - 'api_version' => 2, + $registrationData = array( 'uuid' => $uuid, 'platform_name' => $platform['name'], 'platform_version' => $platform['version'], 'h5p_version' => $platform['h5pVersion'], 'disabled' => $fetchingDisabled ? 1 : 0, 'local_id' => hash('crc32', $this->fullPluginPath), - 'type' => $this->h5pF->getOption('site_type', 'local'), - 'num_authors' => $this->h5pF->getNumAuthors(), - 'libraries' => json_encode($this->combineArrayValues(array( - 'patch' => $this->getLibrariesInstalled(), - 'content' => $this->h5pF->getLibraryContentCount(), - 'loaded' => $this->h5pF->getLibraryStats('library'), - 'created' => $this->h5pF->getLibraryStats('content create'), - 'createdUpload' => $this->h5pF->getLibraryStats('content create upload'), - 'deleted' => $this->h5pF->getLibraryStats('content delete'), - 'resultViews' => $this->h5pF->getLibraryStats('results content'), - 'shortcodeInserts' => $this->h5pF->getLibraryStats('content shortcode insert') - ))) + 'type' => $this->h5pF->getOption('site_type', 'local') ); // Register site if it is not registered if (empty($uuid)) { $protocol = (extension_loaded('openssl') ? 'https' : 'http'); $endpoint = 'api.h5p.org/v1/sites'; - $registration = $this->h5pF->fetchExternalData("{$protocol}://{$endpoint}", $data); + $registration = $this->h5pF->fetchExternalData("{$protocol}://{$endpoint}", $registrationData); // Failed retrieving uuid if (!$registration) { @@ -2476,7 +2464,7 @@ class H5PCore { // Successfully retrieved new uuid $json = json_decode($registration); - $data['uuid'] = $json->uuid; + $registrationData['uuid'] = $json->uuid; $this->h5pF->setOption('site_uuid', $json->uuid); $this->h5pF->setInfoMessage( $this->h5pF->t('Your site was successfully registered with the H5P Hub.') @@ -2486,7 +2474,25 @@ class H5PCore { ); } - $result = $this->updateContentTypeCache($data); + $siteData = array_merge( + $registrationData, + array( + 'api_version' => 2, + 'num_authors' => $this->h5pF->getNumAuthors(), + 'libraries' => json_encode($this->combineArrayValues(array( + 'patch' => $this->getLibrariesInstalled(), + 'content' => $this->h5pF->getLibraryContentCount(), + 'loaded' => $this->h5pF->getLibraryStats('library'), + 'created' => $this->h5pF->getLibraryStats('content create'), + 'createdUpload' => $this->h5pF->getLibraryStats('content create upload'), + 'deleted' => $this->h5pF->getLibraryStats('content delete'), + 'resultViews' => $this->h5pF->getLibraryStats('results content'), + 'shortcodeInserts' => $this->h5pF->getLibraryStats('content shortcode insert') + ))) + ) + ); + + $result = $this->updateContentTypeCache($siteData); // No data received if (!$result || empty($result)) { @@ -2507,6 +2513,8 @@ class H5PCore { $this->h5pF->setOption('update_available', $result->packageReleased->releasedAt); $this->h5pF->setOption('update_available_path', $result->packageReleased->path); } + + return $result; } /** @@ -2828,7 +2836,7 @@ class H5PCore { $interface = $this->h5pF; // Set uuid - if (!$postData) { + if (!$postData || !isset($postData['uuid'])) { $site_uuid = $this->h5pF->getOption('site_uuid', ''); // Register site with site uuid if we don't already have it From d3d5dbe1a7408326f52d60487120f864a5f7102e Mon Sep 17 00:00:00 2001 From: thomasmars Date: Tue, 21 Mar 2017 14:48:52 +0100 Subject: [PATCH 64/78] Removed api_version from site data, since it is part of url now. --- h5p.classes.php | 1 - 1 file changed, 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index 4bf126c..3c77fb7 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2477,7 +2477,6 @@ class H5PCore { $siteData = array_merge( $registrationData, array( - 'api_version' => 2, 'num_authors' => $this->h5pF->getNumAuthors(), 'libraries' => json_encode($this->combineArrayValues(array( 'patch' => $this->getLibrariesInstalled(), From 33406c69cca6987762ef7229c604d20bcbd516f2 Mon Sep 17 00:00:00 2001 From: Timothy Lim Date: Tue, 28 Mar 2017 13:32:30 +0200 Subject: [PATCH 65/78] JI-89 Fix spelling error --- h5p.classes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p.classes.php b/h5p.classes.php index 3c77fb7..a1866bc 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2900,7 +2900,7 @@ class H5PCore { if (!extension_loaded('mbstring')) { $setup->errors[] = $this->h5pF->t( - 'The mbstring PHP extension is not loaded. H5P need this to function properly' + 'The mbstring PHP extension is not loaded. H5P needs this to function properly' ); $setup->disable_hub = TRUE; } From bd83ddc5e7589638be518c58d86670b279f92627 Mon Sep 17 00:00:00 2001 From: otacke Date: Fri, 31 Mar 2017 13:36:40 +0200 Subject: [PATCH 66/78] make actionbar buttons unselectable --- js/h5p-action-bar.js | 2 +- styles/h5p.css | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/js/h5p-action-bar.js b/js/h5p-action-bar.js index 9a0f441..3af1a43 100644 --- a/js/h5p-action-bar.js +++ b/js/h5p-action-bar.js @@ -36,7 +36,7 @@ H5P.ActionBar = (function ($, EventDispatcher) { self.trigger(type); }; H5P.jQuery('
  • ', { - 'class': 'h5p-button h5p-' + (customClass ? customClass : type), + 'class': 'h5p-button h5p-noselect h5p-' + (customClass ? customClass : type), role: 'button', tabindex: 0, title: H5P.t(type + 'Description'), diff --git a/styles/h5p.css b/styles/h5p.css index b13c6e0..66d3521 100755 --- a/styles/h5p.css +++ b/styles/h5p.css @@ -30,6 +30,15 @@ html.h5p-iframe, html.h5p-iframe > body { box-sizing: border-box; -moz-box-sizing: border-box; } +.h5p-noselect +{ + -khtml-user-select: none; + -ms-user-select: none; + -moz-user-select: none; + -webkit-touch-callout: none; + -webkit-user-select: none; + user-select: none; +} html.h5p-iframe .h5p-content { font-size: 16px; line-height: 1.5em; From 8cb9e8b0d1c241121e37411972373220843220a8 Mon Sep 17 00:00:00 2001 From: otacke Date: Fri, 31 Mar 2017 13:57:11 +0200 Subject: [PATCH 67/78] remove non standard touch CSS --- styles/h5p.css | 1 - 1 file changed, 1 deletion(-) diff --git a/styles/h5p.css b/styles/h5p.css index 66d3521..9876d3a 100755 --- a/styles/h5p.css +++ b/styles/h5p.css @@ -35,7 +35,6 @@ html.h5p-iframe, html.h5p-iframe > body { -khtml-user-select: none; -ms-user-select: none; -moz-user-select: none; - -webkit-touch-callout: none; -webkit-user-select: none; user-select: none; } From 280946979f82de90d0f381acf249d3e0d13027b6 Mon Sep 17 00:00:00 2001 From: Frode Petterson Date: Mon, 3 Apr 2017 13:33:47 +0200 Subject: [PATCH 68/78] Remove update functionality JI-111 --- h5p.classes.php | 6 ------ 1 file changed, 6 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index a1866bc..12b4471 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2507,12 +2507,6 @@ class H5PCore { } } - // Handle latest version of H5P - if (!empty($result->packageReleased)) { - $this->h5pF->setOption('update_available', $result->packageReleased->releasedAt); - $this->h5pF->setOption('update_available_path', $result->packageReleased->path); - } - return $result; } From c5974e62129fa2b3f0953350efbf3ce130580c30 Mon Sep 17 00:00:00 2001 From: Frode Petterson Date: Mon, 3 Apr 2017 14:51:54 +0200 Subject: [PATCH 69/78] Update fetch api --- h5p.classes.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 12b4471..1730050 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -19,11 +19,13 @@ interface H5PFrameworkInterface { /** * Fetches a file from a remote server using HTTP GET * - * @param $url - * @param $data + * @param $url Where you want to get or send data. + * @param $data Data to post to the URL. + * @param $blocking Set to 'FALSE' to instantly time out (fire and forget). + * @param $stream Where to save the file directly on the filesystem. * @return string The content (response body). NULL if something went wrong */ - public function fetchExternalData($url, $data = NULL); + public function fetchExternalData($url, $data = NULL, $blocking = TRUE, $stream = NULL); /** * Set the tutorial URL for a library. All versions of the library is set From 29fd758bf5dbbb31b7db1e13289da049b31f36de Mon Sep 17 00:00:00 2001 From: Frode Petterson Date: Tue, 4 Apr 2017 12:44:22 +0200 Subject: [PATCH 70/78] Update phpdoc HFP-884 --- h5p.classes.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 1730050..dff1b30 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -19,10 +19,10 @@ interface H5PFrameworkInterface { /** * Fetches a file from a remote server using HTTP GET * - * @param $url Where you want to get or send data. - * @param $data Data to post to the URL. - * @param $blocking Set to 'FALSE' to instantly time out (fire and forget). - * @param $stream Where to save the file directly on the filesystem. + * @param string $url Where you want to get or send data. + * @param array $data Data to post to the URL. + * @param bool $blocking Set to 'FALSE' to instantly time out (fire and forget). + * @param string $stream Path to where the file should be saved. * @return string The content (response body). NULL if something went wrong */ public function fetchExternalData($url, $data = NULL, $blocking = TRUE, $stream = NULL); From a0069235f1df38f1a288cb10435fe8b40fa84be9 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Thu, 6 Apr 2017 16:30:26 +0200 Subject: [PATCH 71/78] Make it possible to move content directory to existing content HFP-899 --- h5p-default-storage.class.php | 10 +++++++--- h5p-file-storage.interface.php | 6 +++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/h5p-default-storage.class.php b/h5p-default-storage.class.php index f34bf09..2147f9b 100644 --- a/h5p-default-storage.class.php +++ b/h5p-default-storage.class.php @@ -363,18 +363,22 @@ class H5PDefaultStorage implements \H5PFileStorage { * content from the current temporary upload folder to the editor path. * * @param string $source path to source directory - * @param string $target path of target directory. Defaults to editor path + * @param string $contentId Id of content * * @return object Object containing h5p json and content json data */ - public function moveContentDirectory($source, $target = NULL) { + public function moveContentDirectory($source, $contentId = NULL) { if ($source === NULL) { return NULL; } - if ($target === NULL) { + if ($contentId === NULL || $contentId === 0) { $target = $this->getEditorPath(); } + else { + // Use content folder + $target = "{$this->path}/content/{$contentId}"; + } $contentSource = $source . DIRECTORY_SEPARATOR . 'content'; $contentFiles = array_diff(scandir($contentSource), array('.','..', 'content.json')); diff --git a/h5p-file-storage.interface.php b/h5p-file-storage.interface.php index fadee65..394210b 100644 --- a/h5p-file-storage.interface.php +++ b/h5p-file-storage.interface.php @@ -158,12 +158,12 @@ interface H5PFileStorage { * content from the current temporary upload folder to the editor path. * * @param string $source path to source directory - * @param string $target path of target directory. Defaults to editor path + * @param string $contentId Id of content * * @return object Object containing h5p json and content json data */ - public function moveContentDirectory($source, $target = NULL); - + public function moveContentDirectory($source, $contentId = NULL); + /** * Checks to see if content has the given file. * Used when saving content. From 86ee19905e97f671ba0f71866261d6da6055d821 Mon Sep 17 00:00:00 2001 From: Tom Arild Jakobsen Date: Fri, 7 Apr 2017 10:28:17 +0200 Subject: [PATCH 72/78] Fix confirmation dialog confirm icon * Position icon up a bit * Fix icon not showing in IE at all Relates to: HFP-889 --- js/h5p-confirmation-dialog.js | 4 ++-- styles/h5p-confirmation-dialog.css | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/js/h5p-confirmation-dialog.js b/js/h5p-confirmation-dialog.js index a06166b..d34f620 100644 --- a/js/h5p-confirmation-dialog.js +++ b/js/h5p-confirmation-dialog.js @@ -118,8 +118,8 @@ H5P.ConfirmationDialog = (function (EventDispatcher) { // Confirm button var confirmButton = document.createElement('button'); - confirmButton.classList.add('h5p-core-button', - 'h5p-confirmation-dialog-confirm-button'); + confirmButton.classList.add('h5p-core-button'); + confirmButton.classList.add('h5p-confirmation-dialog-confirm-button'); confirmButton.textContent = options.confirmText; // Exit button diff --git a/styles/h5p-confirmation-dialog.css b/styles/h5p-confirmation-dialog.css index 47f727a..5a8f597 100644 --- a/styles/h5p-confirmation-dialog.css +++ b/styles/h5p-confirmation-dialog.css @@ -113,4 +113,6 @@ button.h5p-confirmation-dialog-exit:hover { .h5p-core-button.h5p-confirmation-dialog-confirm-button:before { content: "\e601"; + margin-top: -6px; + display: inline-block; } From c4f2b26116bbf5f3dbbe4dcd1ee0a306de7e99d1 Mon Sep 17 00:00:00 2001 From: thomasmars Date: Sun, 9 Apr 2017 17:43:56 +0200 Subject: [PATCH 73/78] Make sure contentId are handled when passed as strings --- h5p-default-storage.class.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/h5p-default-storage.class.php b/h5p-default-storage.class.php index 2147f9b..8d2daf8 100644 --- a/h5p-default-storage.class.php +++ b/h5p-default-storage.class.php @@ -372,7 +372,7 @@ class H5PDefaultStorage implements \H5PFileStorage { return NULL; } - if ($contentId === NULL || $contentId === 0) { + if ($contentId === NULL || $contentId == 0) { $target = $this->getEditorPath(); } else { From c475db843d0afa1e3a17cf850cea6de3ba49ddcc Mon Sep 17 00:00:00 2001 From: Frode Petterson Date: Mon, 10 Apr 2017 14:09:02 +0200 Subject: [PATCH 74/78] Separate statistics reporting from 'Use H5P Hub' option JI-114 --- h5p.classes.php | 45 +++++++++++++++++++++++++++------------------ 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index dff1b30..19488c8 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2476,22 +2476,27 @@ class H5PCore { ); } - $siteData = array_merge( - $registrationData, - array( - 'num_authors' => $this->h5pF->getNumAuthors(), - 'libraries' => json_encode($this->combineArrayValues(array( - 'patch' => $this->getLibrariesInstalled(), - 'content' => $this->h5pF->getLibraryContentCount(), - 'loaded' => $this->h5pF->getLibraryStats('library'), - 'created' => $this->h5pF->getLibraryStats('content create'), - 'createdUpload' => $this->h5pF->getLibraryStats('content create upload'), - 'deleted' => $this->h5pF->getLibraryStats('content delete'), - 'resultViews' => $this->h5pF->getLibraryStats('results content'), - 'shortcodeInserts' => $this->h5pF->getLibraryStats('content shortcode insert') - ))) - ) - ); + if ($this->h5pF->getOption('h5p_send_usage_statistics', TRUE)) { + $siteData = array_merge( + $registrationData, + array( + 'num_authors' => $this->h5pF->getNumAuthors(), + 'libraries' => json_encode($this->combineArrayValues(array( + 'patch' => $this->getLibrariesInstalled(), + 'content' => $this->h5pF->getLibraryContentCount(), + 'loaded' => $this->h5pF->getLibraryStats('library'), + 'created' => $this->h5pF->getLibraryStats('content create'), + 'createdUpload' => $this->h5pF->getLibraryStats('content create upload'), + 'deleted' => $this->h5pF->getLibraryStats('content delete'), + 'resultViews' => $this->h5pF->getLibraryStats('results content'), + 'shortcodeInserts' => $this->h5pF->getLibraryStats('content shortcode insert') + ))) + ) + ); + } + else { + $siteData = $registrationData; + } $result = $this->updateContentTypeCache($siteData); @@ -2851,10 +2856,14 @@ class H5PCore { $endpoint = H5PHubEndpoints::CONTENT_TYPES; $data = $interface->fetchExternalData("{$protocol}://{$endpoint}", $postData); + if (! $this->h5pF->getOption('h5p_hub_is_enabled', TRUE)) { + return TRUE; + } + // No data received if (!$data) { $interface->setErrorMessage( - $interface->t('Could not connect to the H5P Content Type Hub. Please try again later.') + $interface->t("Couldn't communicate with the H5P Hub. Please try again later.") ); return FALSE; } @@ -2864,7 +2873,7 @@ class H5PCore { // No libraries received if (!isset($json->contentTypes) || empty($json->contentTypes)) { $interface->setErrorMessage( - $interface->t('No libraries was received from the Content Type Hub. Please try again later.') + $interface->t('No content types were received from the H5P Hub. Please try again later.') ); return FALSE; } From d81fa06499bb259985a35d3e18f9efd9573c8aa6 Mon Sep 17 00:00:00 2001 From: Frode Petterson Date: Tue, 11 Apr 2017 09:35:17 +0200 Subject: [PATCH 75/78] Check correct variable JI-114 --- h5p.classes.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index 19488c8..f4b4bef 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2476,7 +2476,7 @@ class H5PCore { ); } - if ($this->h5pF->getOption('h5p_send_usage_statistics', TRUE)) { + if ($this->h5pF->getOption('send_usage_statistics', TRUE)) { $siteData = array_merge( $registrationData, array( @@ -2856,7 +2856,7 @@ class H5PCore { $endpoint = H5PHubEndpoints::CONTENT_TYPES; $data = $interface->fetchExternalData("{$protocol}://{$endpoint}", $postData); - if (! $this->h5pF->getOption('h5p_hub_is_enabled', TRUE)) { + if (! $this->h5pF->getOption('hub_is_enabled', TRUE)) { return TRUE; } From 2ff14ecd371649f9d19335ab52f465fcf5cdc68c Mon Sep 17 00:00:00 2001 From: thomasmars Date: Tue, 11 Apr 2017 13:02:44 +0200 Subject: [PATCH 76/78] Remove key message when registering with Hub until it is back. JI-115 --- h5p.classes.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index f4b4bef..f3b9970 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2471,9 +2471,10 @@ class H5PCore { $this->h5pF->setInfoMessage( $this->h5pF->t('Your site was successfully registered with the H5P Hub.') ); - $this->h5pF->setInfoMessage( - $this->h5pF->t('You have been provided a unique key that identifies you with the Hub when receiving new updates. The key is available for viewing in the "H5P Settings" page.') - ); + // TODO: Uncomment when key is once again available in H5P Settings +// $this->h5pF->setInfoMessage( +// $this->h5pF->t('You have been provided a unique key that identifies you with the Hub when receiving new updates. The key is available for viewing in the "H5P Settings" page.') +// ); } if ($this->h5pF->getOption('send_usage_statistics', TRUE)) { From 727e88908a7503860d9bd833672c490eae1deb24 Mon Sep 17 00:00:00 2001 From: Paal Joergensen Date: Tue, 11 Apr 2017 14:51:27 +0200 Subject: [PATCH 77/78] Made statistics being sent on updateContentTypeCache [HFP-931] --- h5p.classes.php | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/h5p.classes.php b/h5p.classes.php index f3b9970..1fe5140 100644 --- a/h5p.classes.php +++ b/h5p.classes.php @@ -2836,19 +2836,9 @@ class H5PCore { public function updateContentTypeCache($postData = NULL) { $interface = $this->h5pF; - // Set uuid - if (!$postData || !isset($postData['uuid'])) { - $site_uuid = $this->h5pF->getOption('site_uuid', ''); - - // Register site with site uuid if we don't already have it - // and try to update content type cache again when this is done - if (empty($site_uuid)) { - return $this->fetchLibrariesMetadata(); - } - - $postData = array( - 'uuid' => $site_uuid - ); + // Make sure data is sent! + if (!isset($postData) || !isset($postData['uuid'])) { + return $this->fetchLibrariesMetadata(); } $postData['current_cache'] = $this->h5pF->getOption('content_type_cache_updated_at', 0); From d50d98297b7dcef2d375ef475870027900c91e8c Mon Sep 17 00:00:00 2001 From: thomasmars Date: Tue, 11 Apr 2017 19:34:58 +0200 Subject: [PATCH 78/78] Set action frame button sizes in pixels to be IE11 compat Frame is always set in pixels anyway, so should not be a problem HFP-939 --- styles/h5p.css | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/styles/h5p.css b/styles/h5p.css index 9876d3a..760c916 100755 --- a/styles/h5p.css +++ b/styles/h5p.css @@ -215,11 +215,10 @@ div.h5p-fullscreen { } .h5p-actions > .h5p-button:before { font-family: 'H5P'; - font-size: 1em; + font-size: 20px; + line-height: 20px; + vertical-align: top; padding-right: 0; - font-size: 1.7em; - line-height: 1.125em; - vertical-align: middle; } .h5p-actions > .h5p-button.h5p-export:before { content: "\e893";