From f7e1b39af97c7ebfac579bcc800d93553dbdd920 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gina=20H=C3=A4u=C3=9Fge?= Date: Sat, 7 Jun 2014 13:21:54 +0200 Subject: [PATCH] Added checkbox to the settings dialog for CORS, also slight changes in the documentation --- docs/api/general.rst | 29 ++++++++++++------ docs/images/settings-global-api-key.png | Bin 20152 -> 18170 bytes src/octoprint/server/api/__init__.py | 3 +- src/octoprint/server/api/settings.py | 6 ++-- .../static/js/app/viewmodels/settings.js | 5 ++- src/octoprint/templates/settings.jinja2 | 7 +++++ 6 files changed, 35 insertions(+), 15 deletions(-) diff --git a/docs/api/general.rst b/docs/api/general.rst index 7e55d621..e7c22919 100644 --- a/docs/api/general.rst +++ b/docs/api/general.rst @@ -74,28 +74,37 @@ Encoding OctoPrint uses UTF-8 as charset. - .. _sec-api-cross-origin: Cross-origin requests -=================== -To make use of the Octoprint API from websites other than the Octoprint web interface, -cross-origin resource sharing (`CORS `) must be enabled. -This is the case even when the website in question is served from a different port on the same machine, and on localhost. +===================== -To enable this feature, set the ``allowCrossOrigin`` key in ``config.yml`` to ``true``. +To make use of the OctoPrint API from websites other than the OctoPrint web interface, +cross-origin resource sharing (`CORS `_) must be enabled. +This is the case even when the website in question is served from a different port on the same machine and on localhost. + +To enable this feature, set the ``allowCrossOrigin`` key of the ``api`` section in ``config.yml`` to ``true`` or +check the corresponding checkbox in the API settings dialog. .. code-block:: yaml api: enabled: true - key: MYKEY + key: ... allowCrossOrigin: true +.. _fig-api-general-apicors: +.. figure:: ../images/settings-api-cors.png + :align: center + :alt: CORS configuration in the API settings + + Support for CORS can be enabled in the "API" settings + .. note:: - This means any browser page can send requests to the Octoprint API. Authorization is still required, however. + This means any browser page can send requests to the OctoPrint API. Authorization is still required however. -If CORS is not enabled, you will get errors similar to: +If CORS is not enabled you will get errors like the following:: -``XMLHttpRequest cannot load http://localhost:8081/api/files. No 'Access-Control-Allow-Origin' header is present on the requested resource.`` + XMLHttpRequest cannot load http://localhost:8081/api/files. No 'Access-Control-Allow-Origin' + header is present on the requested resource. diff --git a/docs/images/settings-global-api-key.png b/docs/images/settings-global-api-key.png index ddadf35913474303d59b957b6fa19c45ea320518..60978f9b31927e76434c815ee16225fdc2f656dd 100644 GIT binary patch literal 18170 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%0D$Ee&+h%!J18Xs4gEh5%l~Jq zrkI550*SZ6IvFI;$>q0FSR=aSdilTX;|qBVYkaoGD_k=*QjA&hZj+uLoBHzy*Ou>A zS#AoYEsjRjYF0ray$`6y>ctwzTEwqK(`Qgf4(MUyZFsPI%mJI zy@tBCY;SMRRb2z_IC33f+;{i)mt|9z$a3>iO9fqQWzz^WpCx&6M=Q3Fmff2PWiEX4 ze*Y3}rw_R(q7jh2&HjLg9+04{byR-n@PkICNo2g=RyN zKXza-f-encurP%ErIB*Q->+i*PkL&YKL71ed#+z^hD+=px5B5MsnDK#Z@!N*jYQt0 zpW8TL?8LCr_kVOo94inCr?$2&h(nM5+FNe-XZZ0D1eh<3fTx77UKJsX$+oA_%q=hD zIp`9#M3PoJjVzQARleSv*n$x1MjOOf{&z|f^lOAg$X-vG*pRx0^>_2$+=%L>p^MXp z!sTv{?$j+DYFt(cSF`u#F-EGeci++5pHOGS={p;+ z==ftfgtDCrMt8T|WYV?5QkM=f84u^xY_2Tmf_{)=CPEh8qgSLEUP`5>`*j@l}}Te`!veV2mub?ow*N-d{{ zz{GybXnA+e{zQ19eb}dvWt`Vc>jxZ%Hy3xQgWLptj)5^MJ9!NaqBC35A_;H~(opkK z{LByt3FI%wgojeG#F##<)3+4jrWNE1u+;kxTv9lY=iAyc6)94`?ssV8!h=28 zZ(vDLFY#RteYC~xl z$OX$Ti5k`ecgyY@dJ#e|x3&qGPT4(Wd3#eAs50Qp{C41l-M#Z%SXsZdtyX=t+O8Hj z($jm>o)5-%C-a7GH;(Me6oMe>p|^%__P-%y#+V~mF~~Wa-Z`7BYGyvH|Bbhm#g_cd zVTKcab7ML@TJ5+fx^;gH=wvH#*^dpm9;a^|=aMrLI5#|;X-)|0@}=n#55=}laA6t)-S1$dLNgOS;t;mpn|yp}CPpJ&%MvXpS>1j%*8NTfWh8M# zY9fFFEe+|O9yDg#Z!2OL5)(J6yll6&KLyKvI7cY4-#51`!2a_X2MopKC;RT2-??w3 zw%iKpJGz2w;7r0A#Wk5ZBPpBbmA*)yA&i~3Eg&3+WoeLB?b0w`gb_Z%RI3TScNR)K z5sIE*KGZJ4!g@i6AQJAqS<)Fz+Z$-7Z#ISD3-YWi=EEZPMbw3XSX`SJj#o~Bq!d_fyWoAfuoF8qe3s-}SR<10J70!c&l>~tFk-mP(IUAyOb>Y= z2Ol}aLRvl4p2h@bh^ys@7{U%W}P(Conhg7i~XyV2|ByEXiIX6zz66($3$JXl#a)6*+-(lQ=n8MDSz1c&41zk_Ha9n>BA0Td`zH2xE;#PP8HJyKETF4Eh$9)uF#CR? zBw8%41$GB;d>=eBHGK^;Tgx+pEoYz6PwrD-0(9`z_Pcs$MXk}BgiCtuMoSj6znao$m4S3AL8iNn~Lwn>9Z(%V}GA%1%+cT=YOQDa*-T1L}#-;KQbf@KG7PC zNodBverJ3wawzogl=$si_CxW#v~uCSfT#o2 zRJDJ&C4q)yBXc0-2pH0sMVX}kPj}Vr`4Q}(0)g;JtneO;?~vC%%RfKD(>)m(xR@PO z2*Sw{Qn3El`F?PWM?KLC)Q<-}1Bmn8w2_qk5kMpSF(n%CdY_3lD6WDux7;k@3#RRv z?AO3|{=?mWIMbCZOHSk5zxgKRN0t=%$N?I6TU3S3?KmJaP z&`(H9(6!k>H;M5P03`6RG_7OV0EtJSGEX`5F2*oCwuy z{#XF;v|En6(i*`N&LO)Oh};b%@2q3NOpa65$mKU@+7#}dJRs0e znwf(5{S_zlDfg0y^GHHOiVU$sB-I0;J8%bU5>NnYiAn2zRc8!befJkrsI~?N=en5w zfE2d0U0|NpJ7&ohAMk?N%;1{~iC1<0*LzDz!K^`ip-_KWg_Uiut DE0+M7 literal 20152 zcmdVC2UOG9x;Mq=z;th*E+Oq)1Z`5D+3EbO_^d)Byxknv@U~ zl1Pmd2|*yvC`3YuCP0(`Q6Pj+B@jXafp-V>+;i@|-}=_Q?|Z-UUyDWl$u7^{``OR) zd&=I)=b+YGHtpRcBO|lr>={cZ8JWMKWn{kH@xuo2O~9>|YvA8E5l+@8WvaUO@xaU9 z0#DeVkddj**t~M-d+`3_wKMJ!GBR6VO8>s0z@JNdob2p`1Srpq`A->L+F=r4YBG|4*6A`;yV~!C?BS`u{k{6q)$eZoJaXXYgO?P3 z{==~J$gjW1-}wFT&%Zp9``Kypvy#4A@qPirG!Z#N5=LQi#6znIWi8?C3dA;|G_Bl8`a8Rp_E*|_TLBBoDL^IWX^ zs(Z@pV9(r3p1_YF?0f_>)`@r=J{XaGh=Sjn@yut~6Nhs^&%T9aEFaEEewD07$xzDO zZo6_SEY92Vva!GFsz>Cf4}Z3Cb3GJeNAIcG`>C4|ninsO%-5_i1j3m#KX?f`i@gGy)5AH{jgoy{q;Mii?BnH;dD2 zo@-M$?i(xUbydK~ZFh&dr>wb5v&rN+5hrJ(Qo>Uk#ycBYOXBigOfCmgMULKxTf`^c z7798iVH*{g9$SqQM$e7tY%BQgwh-^SP3g%hF(~2Pt8o4O@KMh-mPyRS@_S^b@kZQM zy(;C^=f)HAH)nlv2_C08&+_$@A&ujgWEZvw zZ_GX$8}kSY^Nc2q-YOuoV+Oct;imSKyojnbuzD@LQb86d0w3t1~o>E2YR z$~s-9cV<*_9qd~fmZ*dIrJe?@+z`tf@(RgqyTIO%If=9q4o3U*?%!{WxLlQx5>~2F zR7O|re^PU;acy;((Tz4Km+mZ?hhZH#n!M{96`wSgc$#wL9WEVYJIUR+y-f+K-Sp|? zh38SB`aehuHV;J5%y^t!pCa`ls>k$EerTl5el>F)i`_%dqi3heq-EY{KuX5%4-
25Nk@HE=NnB>Ji@esU?zhTapxbJnA9O<6z145kjM}L) zt;)V2r*sh2rO)iF`c~T3^kdr;XlYYxl^S|@zR){KB3PiR6H3q~(YSI#OI+0YL|u{d zazfg?)wH6>dchK^VCNyN%6BNu(JUg|74i*e<=E5l`%zQx93ySt>IgK@RgDv6@6St{ zf9Qog`&Lyy2Rg?a1~cIDxpbB%#EK}pALhqf0278KuXK$)qlT?zqHhBdBnQfXMLq~KwCBc{XM>Ce*Hxz*$p58C4rStkj z2xwQ!1*(&*tp5Q-l?}e|=1h{R?fq6yO#Q*?A}vDVc=SN%h>bF+;d0;ACs7~lJ>=rs zf;cns&wH!lP}8Pa0b~T73z$hyK1$S0% zm9@>x%;e2clrXNx1aYWG-Ellwq5;QnwRzKT_@cOpJN}LNu?PcOJkBpn4VS~H$Om+Y z8|{fd_mS7UcBQP7v8VI;cN@zPr5Xpxizt=Te(8;A z%y(eW|1K7g8qOgY!SibuckXV=LWl+#*p;tpf-_*5sDB#JJMjq#G5ClF~P-Fzqt&{%9ta@sOz- zVuDdx`LNN<7BAM($5sw}2N=dcFkIU4mug`zy|j>Y{B;3GTp*|!mmjNr#8(iVu+6@S zdL8Q#?pTI#CC%d8J^c9w8#T|0u^QKQdq4#Jv&ULrKcsjo(%x&J#aQn@w$z4|49q^X zxP2o54wmd;Ra2MN4r0HRQcrfR3#8Zf@rfZ7VkJyFkoxTt?};p{UlS`(w$7}pXx!s+ zPjY3$>wKF(5F{MElviI_pZILLm~Fi9++0$(>(_fIwookQ#P(8d8PA|bY$MGkDW0o^ z28o3EsLACDC3y4QvJ5bwUkkj6%t*n3;g1#BP=VpwR82J1aL}Gbg)iRLRH9Dz1y=qp zj?Fr95@!5XTaZ|n9fTFP^xNDQ3rc5;n>K*rC&|OAbiL)$RY?^lp0xx%U zTu-BH%*U)${JrJL$mUHY1_HzBSoDdZP9fdJ{HMmjnkAJ$wO%INmOy_Py4$IA+HDza z&C(xt?bdLXG$E+Nl`XR<`LX(TFjL`X%awBdIlRa&>QD2r?x2Iatv(%a@taTMe?QG9 zFtc@iHpJF?Ch1~Q^Z%`f6SnwE>FNqhdTGyOPK~%_*?+(me{5VIV27Qc35_;)O>|uL zmga>EDCaQ3WHid2N-wQ^5W-?UwK^TUMVzhM{8PkCb4!vS^e0%!f{Ap^!p$Zp^(Cgg z%+Tjyf~0N!w?u}ZDVe~Rpsfk`QD7%g?%+FR;Qq?!6%t?s@ej z2P!yN%Io)UuKMVdo&1Qs^5vDrr`l`*Kg`Z6*4AOqvB#OVk5DYdS0pX;?ue~|5GHa(Fl|kh5VMbo8aAqa zH%V!JFo&9~_o9hKSymTVv{)AH(i0`dvG1jFsBjAqTxD{GH%fS01jkrG>Lm!oJ)O>| zNlLGjPJ}ud(I24YzgaZ2s1EC=M|B&E8gB3RnV5X99?N>^-GRV>MxO2~6wp-_Mrl0j z{(x&g@!Oh8HG=x1Ndv#ILLpTs&Z}R#BYCo7FO0#!`|l!v{ALMZbvSQPIO+eEWT)@!a~QcKXFw*~tp$^lUK;VOiS-C1$@hO7&CJC>3K zefm4Uv&`Gy$#}kut)T_J+;hZ6+3lo#Qf0O4EfQ81e3N5>-Kp{DgoWE6S63?9!m^;( zb}xvJeR_S;{F>sI0^pwv8n&*{-WX%0ob=y&B|Wl{s_#F(J_~7iP-$aGDDQ9J->=-P z|3AE*evE{K4_h|QG)~g>nV!121!0Y<`%R)WrU#!JuA>sesO4#*>tyI)%f01>+Udl?Cb?d|Qmv`E)tmA08JyqVISZ(UNh5VcQ4?v{CBw6~qE zYLT92CE(*VO7d;+Qf<>aQe}%rkY#=)B6vvF{&L#u;>-;E?8=9hh1*F{A^nYsuIKk` zxd0KU{oeQx`K^pg<1Rx6Z*_UrA$lm5dkzb`dPtd;6}(Pj4f4X;yD^fTdCQS$i)+Uc z`P*7DSKHy9c`oeb7(skvDqS`Ad0$E+m?909T`4lc35*Q~T-Fj*ZKghnpR9t%s5j3})cReC+I z&&-3`FMlu7*y{`ljq$bZpIfozS(hu?k{1+QaY=&PhPYgxA+w(8NQn*J4X2SZye7)( zc!&#q7319!BspL1(xpJd!n6v*NSvHt($5`gMKZrR8r;`K+xX{Yk!M^Xt@GgpUUFC% z1NF^sVcA&57zS?3!X)X0qT)j0ByT=0lqM|?F1%%n9eB#yuAZe8iJQ&rcv*qFvPq-& zZO1fWIW`Vvf}W-wrB(aj7sv@(E#088sEF;oE_c3>(FpWA54jmR+1HhA*=&PvY6fWS z+>D&exQiBAF#&lhZlOAqw@fs1 zs>}~K?$5b{Lzo8WXScfMAr^Payik#UPFK}dAhHE&=)Wd<%QtGF`O^``;rl|RbCzw3 z=SEH0`7F_WTy+Z+<0nK5%Sj72795h6Cl-XlFmnkrh-enwXM;EO-hE0icgaSXNdHD= zB;YW>Y#04Iu#8)jqBFGVfy`A}k|>wwhiNHOD>R>PRiMA+`SmV!b1@bnV6nWkQ}S&} z5fVOWsd0J{0wx#_SSqL46JoaTx^aQp!lWA#MB!qNgAaQ3ec-B^B)8Y0gva9r;~2Ku z%}5tpe2oe8h5=S}v zn{6Dft`n1P)Y29VUe{E2nrO3)X7^|}gixl&`B4dDm*d!x1>E%L2O$8D$(%Dhj)loW z{oAvES+LvT#)Ru%SKpas4=r|W;iU-T12D0*ze7AI4SNLZ7R*H*AQUIgFAX$tevO;N zD$t8cM|wv*3rF2g&ywO`5Ir+p!^PD}V#(&&A@{Uq&i!^IrIyge3e!sGi|=_Je3lIj zy=lMCZ%UoOjJgx6luKZlMepM@O4?4b7Ei^d$5ymJvn~tfy*k6C)Tz_XWI;)vt`z8G z<*KG)Qv0SL#cn}rwvYEE6Z~A9jA5z)t{kUw@4vDhzm8q@S6I%`u;*@Heoe{Bc%(tU zB|jUzg&I+z?UCeJH0zt809tg51q0YbdUqv1Xy-(2(MbUHY;w-+R=1~y)@!orW{)~T zn@4(#vpP8QDSjH{?g`2pgQ3~Ib^8N7cy;eaq@F96qI;@n8`9_>d{tUYvb-7TZkcjQ zR!u@X)%S=xalh(jOluCb+Ot_hy`u=lu_w==m=6mD&P*4G=3;{s4`c@(w#8R8RaRD> z`w{F}FnfPL+OrwsjfJtMBdghI__mk69R;WnN!9iBNjLIXpY)4a{?_FC#Xh_q=ZY+r zMs8)foB>v)WccMXKQecCvC)YYC)n+9hIIF%g&Ts3;uK;Is zIL-~vw=B=thA^wV=8`8r879pe@^A%VHozwlZDnbBT5HZk1C`sGMC7uUqX)vR1u>u` z@IJ&XT77dz3*a9OYb&0twz*#$Bh$g0mp1KE6{@;zrgc<;fV=3&S@>soE_M7H8RPBP~FeS~A;T>dJ{5e{_4SsDmt=C2@;_ zkM=Z1PL|zQYwL{i%>wg&(RjiU(mFe~bm#VxfAjqvYf5aX?VO$r=KR92c2DbU{fg1r zP|~MAH!=W{p^s!(6xGAoRY>2__1eLzXqVwsT6_Ch?Z$8RD9lL-@0yFp=wPL*_d1mp z3#8(mo!Fh~H>In4NZXw22>Iq1Gz(fGyFMvRONC%CFN_=^)lMqt;J#)({pDRpnBRZU zm>-T%1Zyy2$$Mp^vjfXepg7>7y<2qbJxyazSGkb`qe^vKLPdDh;T3?6!mt-}PcV6;D^JwL73{#1ciHq~V>IJ#h+wtcO@eXQ!RG z&9KE$V)f9eVmY2HjOV!~30%uPV>#Kihw!}=z(7g0;*OK{e*RQW4Q6!#-|HsXbCNvr zt~Ss?ynwebGgK6fSgej9r`}ZuH-$st}74 z*fzJ3h0U}2iX#uXIMdME@bVBca$j?mJ#;lMWZ8J{s9O!rKWU*@sVg0~ zP>YdV9dgTCaV3eTLmpsQCs11P63?6BxjKpGOQ%$fHJIx^&j9QC@z|K=M!JVq-o7W! z6M?F>c&zCR7Ki-S$XX28(9(V3rgp-C#MOBWM*YaGY@+T~EKGE(P9uRoFWM3y3BPJM z^hXXHS8POu-9YzY@kB8h}ey8c>C#Jy#&BO;AZ!Y*RSg zq`QJCc4sY4a=o-&#AwPd>|F1TSF4jp>{wAY_S`H?xlip%L;1*SR;buJs~?rV!8qq` zYB_?`6h;WWeWJV6GvLi^^dEwLl$Ku;n|7WhzGl!$-nKrdT&Vwn9X{kWu_o`Y=g}^@ z$&Y(TBk!4G0T7P615hPssoIL@c;z+(ExNfN)rmyO%1V6IP}Wv^T4!3X&{g~12IHBh zmxMh7I-JqSxM_SSdQUu19NfO-SH@QF&zpD0p#vqNR?l3ZYw|r>co)7o$KbYdVGd^5 z<^W)qgtF?fKC2v`DwJ!Wj-qa!6eb`65Qv+xxhh!{dOgOi%C+5%y!GW&IWMMT zHkyp-Kv}rjQ+7-ecU^g!H5}*!_S?^7UF#NP3U{9A|IPhWoQe_OU?`4vt1fV2!J>a2 z&Wbzz=l#@&;*p$5nX8PYc@33XZ>FapuyS!?e2B6vvhz8cmQNv^}HvX{uk^x0+6h z!e1sSBe;>PaiEuwo61iAlpIoo1{~046&cO6j#FK>^N2O;Q}q6&FqA5MKFx-#pC7 zk;Ba0A{Guh@3uLBy2pg)sbf+JlURmC$o7%I-H-L!Vt{q$_C3aL9;j_{pE@zC&R6+R?H{s4%=G+M7I(G~^&UYLvT= zqrmf?G(^Ye5YZIh_bNw+-Qt_8X{=O954%(7K@K&Q(@RXW__2FtN2L46rh!!hw ztUBuOp;W={3y^H$jozIddeelkyCdBb9eo+)K^Dz@s)5Hj9Dd~MjQMAK)|rDJ5lgBM z+3=zQOilD)B(sS%Ff14CzWQp!Q_X+wv?lF>8fCsQd~)En`NE^v$VsN(-hF+@2EV@$jESyQ@#s@9ghZg%>kvZmyJj1pC)cm3q+krR=gH>RX=w~=q;R}gC98tcJ{Atxn$-8skTz+|-dw|1}B3zcHEs7cSy z4AEq#6?&2p-b*VFMPIVTpXjbFpWH$GrY(HgQ~5XZxTd86BHRbEwlc4f`q0y|RhthA zsZ{s|z}y3}iFCpJK*RkIC-bi0Jc1I7%D7Y-Z>O`S>n04ObXtsy(W3_ezyhL zM%m?CEUa>%-Rca=GsmPlL84pIpB{8~q$<})H2qHEusQR#w<9Yvts=r#1ANz3wA^4e6m;M|o2hq8?^k#9@8Djo#du4NnkURw)V^N-i77C z*`~NOE~Y#|qj`0GpqZZs>Ue9ErcO=bXu@@i%Go>m>d1{J(oIG^x(|k%nrww)95?k6 z-_~~@!@{nZ(B8C0s%98EDQ$d+``F68wMC)qy(P_jd1~t9JZGD%Ma-v*=MT3QybxDL zA3(hos-aK1pKDbhsTA>}CT_x>to1&}K7E%56>Yf+1)6V2CfCp3*QA;qQ`@hn=-wO` z8N%DaB9Q00Ci~c*v;s^q@roTh{Tu2bYH1Td1^5lsp@QyC=jytFWk#`c>u0@4IP&~Rte*e|E^aXcv>chW+E(yPamzlrja%C66d3EuLRhN1m>%j2?Sp*-v>b`G5EtK{93^L~){ zH<@Bh6dvGpW7MoJ?rWp8g$1NOOVvB~6%%-hhoj#C8^KKiEf6ku&L*~HeZl0kpS8P3 z*3|bA553}El$u)?hNIn9v`j|Ut`7^%{cNPx1{j3QQ^Zm;?E!FYteamjV6wOXB!5R? zeN0=lErC&Wxv3cGI{-#|F|Yr5G+Zz|pKda9#$x5;HU=1O;!=gYw*k^qwhK znY(2^oj|jfc_)~Q$BTmo8zZH$M}p#dy8$4&4T}E-+y`=%@3W6;6;0)-_s!;cA&~nq z#(6{0gJZ})y-Wfy-~7fHrm4-ch=jN~d0h-JZM+jT4<0-?QUF5Fj=Wc|6-aqdg(wFs z(WhRg5;gN-N_XT0?{B{rEO8RX-#nU#t_9Ooap%=63cIuTY6Y<72S(-3ees3B(l`RG zrg-ka(rtJQWUz_zqKWb`ZA6*zyedWmBtb;Su?!8J{ou{WQ~kPvF^k3e#MXDq1om+v zf#`YMeLsBPsUdG@C%p`=o_;9(BRUseXqc*=uCHWGNUYoMsuGySiImy1MORn1S35{* zH5(_h*N&C7;gD2+TVt5YrX0`4(Z7`CY)MzC86DGOf8jOqeLeg?GU^Gyk!Nmygf1e6 zPLsM$*x<$H;{C29)DsJ-hhv=jE(>b^y^YqT#|`bkDH=Y3g^C(VKdE9Si3A)Ue-@Uk zca`TnQ_K$6Pm}s-G;UU_qN%L5iDX|~i+2_ze6yFRK?6;#K9^%ESv&|(e^H8u0Gm_U+Pr#jgqEUdT?rF8d#{sqJiEVhMo!-h_cca-} zx@v<*5!1JLKzcW0_$1VFu-fmw=(qztpz3VH#Kf{Rtguct=~vZMw8|wad7mL5akr6< zt_u7)yJdsw@53>}y10qS(Qj2Ox|NVcO2llah~!P_MgC;Z+ySaztOgUeiG*y&xH}I) z>hIEd#Y9tGVx?FETc4=E>*N78eRncHkn$%lwlXF~%|x&I10J~GElv9RyJCXtbOF|2~#`#B3>x73LLp9+TP4S%+z zrCsu+*0WVe6c)G&SNdgLW>8_WavksLtebJ%Of2C$ak0Ev>|bqw51arq))5q*~b(9a$(UH^iP| z=tlU>l2NvepJvd#?|?OGw-)rWDA+?pI+JC_u`Bjm&AREZD&|K%XRumGm%`#XI<4Vj z)rF>q$}5p6f2nG(_1PMhpf_fqtJ%-%TMTAR=XJKmuU2;E)p zYZMzunQ48zo)3B~R7_|C#w?ILCDV!;t}W(Q_XuIcyY!#~TsE@Mp1B*8z3Ao#gWUA2 z7^SJG!FQPyU}3L`2=v71CF6)`J*^7J6Q0;OuKdnn^?UhJ#t@ z`%PTT40Uxg!@=vWc!qxjprRtuIejX6C zQTRci-6DCwFnxd?5)~Fc#glRdM@mS?e5Pw6~P5$}WnUe#XQBZ=AC~6jhaA zo@M3Gsij7#!5zN>D$H6a68GC`y%-iHm`KC7FN_pedC)m|8&PfHE%&6m^iqvn{!eA~ ze(iiNz~fs%k&8WP{ygVy4K*0XzwQlPwT;hwnFT$dRIqKQRARNgcgum=EA{QKy)!|4 zr(cP&edKvAn>f~+Q9R(_0mS`tZx<>5-6_7Ojh?8@n`ssfP26}nUm5A{U9S-zx64W} z4d8f2vBs19^dqz7=JRE!tDyXsI1%`8Iu+=7Ao#og$>IAy{rbhDD5YbwK9GZRd6~RK zW+-&0oP)s^S=i8&v3aInXZfekg`BVqr`;#lUDUtLNcSpcyWoo`t1VUy{SqAs?7Uw_ z5CR_)bX}6hirQjppM(t|erXoaw**PW4O-|!KH?Q4><&f)ZJy_15&d*l$FnYgIpF3k zo$reSckFpRb#}6*q=g{0d)?&FNe~?L1WTuyqiu^tQO;Ed1?!lNATshxW^_G&e-%7$k5@F76Q`LA=; z6NPem>8j`~w&p68#q-6%nvuaKx10w0y%^=GmyfcZcx=*qIlRF$*mXvS7ob}*-*vqpjjSDx%G<6CDE6W2*Nwqsq5 z$P`=s4{FE%RPRc|{cH7=yqAWiX3OJs1;l-40F&U>S)(&Z3L}Ri1UTfCxPZmHfUk>= zY!#c;(g5W$Z?b{N$xkU!d2Alnp*v4~GNP-@Sgv9voZjARxjvSsNYF+9(|EP!5#YxH zEHV+EWh>QM^nevR;ROy|6J7wG_UUNr1Y2Jv=l|I&F2uVv@B z>G5RUA{xh;QGrLaIcuS*k5${|M-WGy6Fux}OMJ)9dmG9*k=&^MFjS#!sb~87PA>pM zI++C_EhO(yPTFtfD2jAn=n2%y=A4IxJDW4>Pz4B)CxjEq6!z9hGs=DoKMul)pu)M7 zZ`I@sV*6m7-fEbPZ`IgT7l$lo$CWJN@J+;Nn6Y|UuBRerItMUmW@(G|XXG$*8i!0d zs2ql7gf)uu>m)XPpAr&>?xOX`n-`1)9iS%k3Ge$hp)KH9f@m72}9)ogG}KjE7~*J*o7PXpN+{tg3l7wr%P50+#u z=OEI}MX1Umw#(|`eFygtXx>y-TD7(h+~6veti)%%kEDGhY} zPs=^f0mw52a^owf>V?mZdTL3-z$((;I$FW(ts6Fgs~UYJMehTLG#;5JykvZ4=coJb zSn`lxK%hdPKCoVXjq5m)DaDIinjR&UlAl{)|2@`%+Zm797|425oR499%OZN}ZEH0*%^cToYy`cUnrr zo*^(Jk5);x9L;cdlAWyedPE_7BAh^1edSZ$!Aku$7=VA>06Xd4IM#4aZ9QzcXUjT= z$v~vJ3?Qj8;(zcJuk&mMTl$_LCAYifo;q6VLajQ8hviAbVT*Zh`E7HVJYXhPbRXdU z{drVpy4KJaedpa{FtUgJ54=~^{-^FvyS-}b&R`x})&Pue}@`G^F zWyBDQ)n*gwf3DD#6vmnxJvk0gKDS$$;Nhd4QV}!rm1`p3;}RDja)6}YP@o5?5I!Ho zaQ-kVe@Z9yiTRL0UtOijeZ-HMsa0k$N_jOuoaN?~O&5fy3>*7|U4Xmetel+FLiOrZx6ol%|BfTey9){yJ;YG6z2_sD$D!pO_qD~wv z2RQE8iN#0j3%J|wvJD=w==da8TQKKDu1-jGH*@S6r609$%`pr0i@YHX?n~S{hOa!r z!V*QOW#Fy>q^ANS3#N4eL4qC4RR*#uF0Hp!^GY=hM+*y9*eqq)kF|hhKNlXkco?KI zIjgqLlSX;Z?A*rPGUG~N7slOWokWCw&EDxq4nK?_MVUGMfZ@R`th|}5&~TgZx9hw} zovcgagl6d`^;0VlZB8t=Oi!)sR+xD`2mvO(7Wx9;@;`?1J{KxUDO9Zg7tZ|S_3{7Wm-5YYo~;m^!>26!O(IRFO-#||OKAJ~+~hnvo$n^tLx?zop0)Uh z{H5B+c}f>@$36eO>zWSW#O!U;cFF-zoJHa%tX`t;(L})zcdV@}&yJx?w^xY5jo@>B zte&D&xx;oj#IBSJ$;aRY2M=}}S??HWgC|(rH<*djH~X|Q$s0@(S@uVMx)OJhHAKp@ zb5v^%PdJJ;%A-?O#d#AX6JkqLV@zXsCjG2sjua}jwFCC{X_(Ao)E4x$xS45f#>N!d z;uSChCdBT62#2N$DXB{9qynX!@Y_<$OKZkP?dEcE6HbVlhL_W#sY)tC&T8nQ?Sj*B z7b)d7%G=!+0W}*DR?>%KC>>Vh^qjY- z4EvL{G#nDdzBj_Vu@;;9Z^Nw7Mz?$#;W8GIGkN79KEeA4=I2%}+mOk@*5@IiDF5K7 zjG(G(DV#Do&n@BS*!d_+%kIea3F2dTdKbsS2&_7MxToc15_b>lCPUNV+~*T^;FL`dqoh-=sZ*luJ0KN+|n6G^=nhUcu7+uC&OBIYtJR7{hu#S}g2Y2BDC>|cC{g{cVNmm{gH&#+|VDwvA99r-GVg949XgnJgH zU{j%YE0k4#8~A`~!k4|)F$Cpn>C2z_!#-+msW>OUq;WPf@ekdPI)J-fa2&8D{ehrVlE)N%Q{I@ zw4^o~FO)rSuIpBcztC>K(iPKvUji|~8cy2v22(}(9)`-ahLlKlk|akuHRW73qWyAY zLg=L4eweqmI+LK}Kpv5v12l5|0uy;skejVJ7nu`yBHPMoASG8xr~vN|xWhfDOz;`% zlcT_V$QmedB?D=vGgL zM%r*7_D9ZTBG5QLHA+Fcs>ka&DYP%tJOqRE2F~?tE{NGjEXyY1vaQaM=iZ@O>?@0E z&QO=T`~>vU(oei+P|3cN?nj?>dG1|^kuG2NO&~@lu=aU;mpTvy2?aGNcWu!%zXYqH z#g&;9xeJhI`?W#A7bHC(ml&0o4;0aqng*ReNC}&LmZ8x$dBlMPh4FgeXpjmbiuC&I zDI`h7SVF@hh%d!~b9)oId5>SHrar)J@JX-N-$My=cT)>Zy|u4B zE}{BW)1(QXHjhBazOIr%0Kt+c)JZP))IV0m7svP|e^a3oIUKYs(+EPG;NL$iB1409 z0WH(<|CZSMcT(`{>lOebSoQWGnz{azz&pRteJUFYgTX*F@bi;cjNAdDY|`f*2;csH z=(GEu#vnPgA0#36*N1wyTLJx-VHYo&Oe_n6u`uOtp`U&CVA4c0V)gj?#kJtVPaUw(Q->>yQT41m65&=qW zIUu1i!=P)EksfUa!?o5VoJ^jV&uUO)x;@wYiWDiWKkCOEtEN~)hmX#OtE@aTQLV5$ zYh(5f*tNNoEj;q_JcVJ=5OXSjNj&OyxSNx-l&VaB?tu0v9C>)e6ZTK7gsZ;?-gPOe zDS16lvtSDip6^LwVpjAdM0SFyeS$wiV?IMG(Nr?bWNuCDxFr8?Q%;BtdVx-W+GH(_)FSrPp}z`R-7uRkHq6yx34{gPVYEf{y^vbbv|e~W4(+c0GgklQ&zm5!t1tp3%Bf} zt1m}mxIM;d0FQpI{KPWvDL7+P_QPGnoy^M*={%t;Hd!00r9l=(2Msf;Vs+&PhMERQ z-K7!EU&r$LocmRtY?95ID~jW~eoTloaP8%mw2q?bSJje!g5-kuJq^`oG?W8+O?swg zzrt$&81W|?n`Yu;iw%rcg6n3}73sW5g%wC^pv500-c+^}ps29Gf4<8fGnwc%;k!^QkS`xz~ZCvw6R>7pCud)}# z)wHw@kEkH)Wjt;!5ttvnRH53+)?`kRHFDV!6ajDr*a_o1UhO&!h)t%+A2gVLcGqQ z#f=x%diV+$le(8qOoU$_BMG{YxGps>=s`Q|{ zGy2pW$_O}p*O_J=E1S^)@RsAT#I*~ zKIXmZY+tBeo8|JT@sA%u1cF@-h2EXhy_(#FF-Ou*#JK zPPIZnB7S9@$ZbQ{3oHXJS;bKC);%Vz{D=!|K!m)LHbX~dPGmW|YZ5edo157-nfu`lh| ze`3H}*aLGw>+Jp>xP8q%68G2MHD8^}aJ4$OS{@a9lu=|BKSq7BbO+yr(yH?{&4r4h zNQEl5e5bape%MyFL#^K9Xt!qlegIi?7HwOO3MS7VZBs@if|(y||Hv<0X1uakqXDY> zy5d(i8_w7q`E`R!i?c462l*MUKYKV%%72CYoLec9H4ApVMx;463=5&amdvy ziR-uQKr0kajFCdM)&8R}rT(rGJKVf>ELp(ks`pZgV#o3pz=1zo9ys%OHg4gqbva!n zcX#-6ucCHYtW(xm;M8D!^pzyAJnwKpd}22^`s-H_RDb>sr9Oh^TxD{`mnC`-e*}ym z5{zJB^c;yl^Pc7>rhXSR44dQ@CC!rKmyodwZ(5L?GC4-e4d729*NGOE;AVwYD=ZA! zdzQ|ifw4KTeTe}KTi$r-n&h27ZDD8?K7cuD9_5w4)b$Lnv@H|HeK&id&g!e+ulY8! zqoC%R{9(tbtL&C$wcHkvq1SDugqf2)LT8d!1;HEW>xT8Ccdl9`!`eMo@;%`6Cq-wK zfmy8+i>)ohj$(#|gfTH`bW5dW_{PhT`A5Sf6_PK@!F2A`dsXymYnk3$Y5ODoOwv4X zGktLD7mBMF{@e_=-O2TWak>TC*a-sDYd5At&tsn#(p7))X1P-3>ixmaQf`a*<^Bj( z<9xMi`Fp^M2_=`784)Zpf3b_#Q^qS_<6udg4M6KmMQipy{tAoSuLCwqd8BgXmVJdn zveT2*SR0*URq^jCx1?8Tkg82XRQrX{D|EvQ_qoZ*`B$xHkUdVQwVahV+z*{2|iVsl*x>Fu}D;C z>Jny=(aPkEocOHbF_ktu$q?fqAZosf$nElKURltQ2U3OI2o!eedXN94@sp2#1X;mV z=HnhicAlBnZSWbO5zK>qv;U%Ac41)=fM|2jL_z|hDPm$@_E+e3-1)Ix3^+AJ2fM%I z%z6_^HK3>3|Jc(d1fnL6tqmV*SH=_yUFY+6FlWfCWK{l9R4k%mzR1DsjqqRie5e0k z(mQB`E8x^`O`(lvYQs@UO3t3OG}|IO^0lFtLBqwFetAYjqkqN^d6t=X?!9 z2O4xj!5*pp!~MtP2p=*ku~9e_U;YJqy;_=a-CB~g^pn@j@hr!*FmP7 zd4je0_Sz`C?BBDhal+Cy{Z#+8RY?%Q0n%%6&Xl`UUbvSWkrDDU^I+9k&jMUXP9|Yc zJzj`UN|M~*C5fVmI3J@m55Idxxkh*+;)#FJ1bQUXdWG)vLGRo6p)7*fDYIm*rF=As|~9*bg*Mo-9p2^b6#)v^=Z~Dfx1<4UNvbZLxAG zPI@Pk;a9+V@O~|v-BM=TU+rfd!CMed67a6xu}7u{NV-6U<9f?o3#R{3)@QrV7E4=)Cc_#k@C|wK| z4>y9Q`=9lmJ|tu(ku~O5MwKms{&CM#B)H|t5L_h&9byR<5#W zN2K-J1Faf(eqZBwKDhn~XOdmJo(&Z>-G9DPHuSt*W{SImf?-&NK_f~MCx7qNwo?p1 zc!#R(9J_1@`);90Y6%rC$5a~RCqq>lAC3RI~5x$TW9 ol%MdPMjRRwVI^!ExmEamiyAH=w!}XK`pCJUi|z20)A%~djJ3c diff --git a/src/octoprint/server/api/__init__.py b/src/octoprint/server/api/__init__.py index ccfa1590..62675573 100644 --- a/src/octoprint/server/api/__init__.py +++ b/src/octoprint/server/api/__init__.py @@ -93,9 +93,8 @@ def beforeApiRequests(): @api.after_request def afterApiRequests(resp): - """""" - # Allow crossdomain + # Allow crossdomain allowCrossOrigin = s().getBoolean(["api", "allowCrossOrigin"]) if request.method != 'OPTIONS' and 'Origin' in request.headers and allowCrossOrigin: resp.headers['Access-Control-Allow-Origin'] = request.headers['Origin'] diff --git a/src/octoprint/server/api/settings.py b/src/octoprint/server/api/settings.py index 07195af0..b2306d9e 100644 --- a/src/octoprint/server/api/settings.py +++ b/src/octoprint/server/api/settings.py @@ -28,7 +28,8 @@ def getSettings(): return jsonify({ "api": { "enabled": s.getBoolean(["api", "enabled"]), - "key": s.get(["api", "key"]) + "key": s.get(["api", "key"]), + "allowCrossOrigin": s.get(["api", "allowCrossOrigin"]) }, "appearance": { "name": s.get(["appearance", "name"]), @@ -107,8 +108,9 @@ def setSettings(): s = settings() if "api" in data.keys(): - if "enabled" in data["api"].keys(): s.set(["api", "enabled"], data["api"]["enabled"]) + if "enabled" in data["api"].keys(): s.setBoolean(["api", "enabled"], data["api"]["enabled"]) if "key" in data["api"].keys(): s.set(["api", "key"], data["api"]["key"], True) + if "allowCrossOrigin" in data["api"].keys(): s.setBoolean(["api", "allowCrossOrigin"], data["api"]["allowCrossOrigin"]) if "appearance" in data.keys(): if "name" in data["appearance"].keys(): s.set(["appearance", "name"], data["appearance"]["name"]) diff --git a/src/octoprint/static/js/app/viewmodels/settings.js b/src/octoprint/static/js/app/viewmodels/settings.js index 77828a08..30d92698 100644 --- a/src/octoprint/static/js/app/viewmodels/settings.js +++ b/src/octoprint/static/js/app/viewmodels/settings.js @@ -6,6 +6,7 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { self.api_enabled = ko.observable(undefined); self.api_key = ko.observable(undefined); + self.api_allowCrossOrigin = ko.observable(undefined); self.appearance_name = ko.observable(undefined); self.appearance_color = ko.observable(undefined); @@ -188,6 +189,7 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { self.fromResponse = function(response) { self.api_enabled(response.api.enabled); self.api_key(response.api.key); + self.api_allowCrossOrigin(response.api.allowCrossOrigin); self.appearance_name(response.appearance.name); self.appearance_color(response.appearance.color); @@ -250,7 +252,8 @@ function SettingsViewModel(loginStateViewModel, usersViewModel) { var data = { "api" : { "enabled": self.api_enabled(), - "key": self.api_key() + "key": self.api_key(), + "allowCrossOrigin": self.api_allowCrossOrigin() }, "appearance" : { "name": self.appearance_name(), diff --git a/src/octoprint/templates/settings.jinja2 b/src/octoprint/templates/settings.jinja2 index 67d4ddd6..437d0cb2 100644 --- a/src/octoprint/templates/settings.jinja2 +++ b/src/octoprint/templates/settings.jinja2 @@ -433,6 +433,13 @@ +