Implement API keys

This commit is contained in:
Jakob Borg committed 2014-06-04 22:00:55 +02:00
1 parent 80c2b32b92
commit 20a018db2e
6 files changed
+36 -2

No files matched your search

+2 -2
View File
@@ -18,7 +18,7 @@ func init() {
bs, _ = ioutil.ReadAll(gr)
Assets["angular.min.js"] = bs
bs, _ = hex.DecodeString("1f8b080000096e8800ffec3cfd73db36b2bffbaf40f5d223d5c894937777ef4d5ce72675d23b5fbe3c71d279f35cbf194a8424d614a910a06d8dabfffded0220852f52b49db4bd99f34c1b1b58ec17168bdd05c0f1981c17ab7599ce179c84c743f2f4e0c99fc93fe3cb62427e28ca3989f384147c414b322d725ea6938a17258bc88b2c236214232565b4bca249b407d83e314a8a19e18b94115654e594c2c08412f8735e5cd132a70999ac012d797bf2719ff1754649964e690ee3f822e6640a5d138aa8664505c4d31cda29797372fceaddd92b324b331aeded8dbffb856569cec9a42cae81fc33c2cb8a8e0493695ed1faef555631fc4ffe4dbe1bc3c879564ce28c3c7a466671c60028cee7551697ea6f04da0b2af88581bc531e1ceeed5dc52561eb7c0a62e57372548f8896455265340c9abe6044ce2f8687624055669318d01c91005424f0347011303a4be7e1ac8286b4c849f868c1f9eab42caed284964372bb47e0c7688c123a8bab8cb3e88695b37fd018dadec54b41e07ff68fcf3efcb8ffb1b8a43910da31f6b8282e535a8f35466e86369bbc2cb28c96617056b71ef332034135ded9b458812205c99a7754c1aaa4572f638e640e0e9bd639e5ef5f43134ec9b6157514975c2a58cc0470220411d891959c0a820c006e37875627a8d36d5fae4f5ea28c81d19a83452292f30b0f92931c0535d853fdabb2e0c5b4c88e1730ff60c70d9b1a0c2d4b581f2e6e4669fe0afb5c6ec08868e6b25ed255514b2ada61499c8145e673060b645694944c8a22632483d98416ce696952e45c00032fa2fd364d9e91e04dca38cd0111cc2068610a662f66969c2ae98884202f9204a6845106807cbd822515707ac3e12f3553724d6d461af2b7f1cd19cd93d79315d3d0bfaff8bcc079fd80a6f0265da6e06b5ea73f8cd9708b3baf96135a7662ff00f8e2fc240741afe2ec4ca3207b48dd45c23b6356d6e547ae3aef8fff342e635844d907fab902205d39a032020a8291792274b405e98f1f9048a3b4348fc87f048f4964af9c80feaad728fc5d38cd1779fe2a8f27194d3422b28bbc4cc1eec0c3afb788d13e3bf97e534c5b908a9e07e13c2d4ade8e90a8eefe3a3ec3f61fe476a3af1d6c26db769d4d63fca7d3fcd49553b610ecf40fbe30bde0bc4acffc0b5bad577d623e9d3c64317f3205456c2f2ad88b61879dc6c2f17f3244de89f03466ecba28936ea41a9442bcdab67472fbf18dbe6c3112f9c7c78fa7671048940408f5b2a15addcde6069bd559359d529ad024acf736fc496724fc466c657aab3655699ef27078687685c17fe49483349762370886e8fee32c0c16b04d0716b4bb51e2cfc66061bb6dde918dedc06e2610962d2a9e14d77937a46f073799deb8cafd3106ffe46ab65dac92f2aaccdbd4e19f9036addf4ee2e96552162b300aa0073608667149d793222e13150f6e5a26a54bc0660b9f811c0b046e62259d37112f458030ac63c5c72418b3352cd925f0c8d0ee18d382c424e6b12d9c69a0873e139018810d1cafb13c94e14ae8e74e21af27481fb7fdfdfde417d81923d0190bf5c06518c1aa7b154f171af2347126c6ab001110fd0dd11c05d04073cc203e7d38392e96ab2207578198faaa475383c07b9e26178e266ca9f4dffd3c6ad168ef99c228372fae813ac6c410855e87c39101c131a80c1166bf899d87644c9e1c1c1c989069a21c55fda385da30de140d1d20e80c73a93615096f869dd12266efaf73880657b4e46ba16a0f3cfed4c9d6a1d3bb715a386cb97e2c481427051c15042fc0fedb982fa2657c131e8cc87f93efa42e05c449fec39a53f6b1e0b095ef7b1203070a95c793a1cba141b9a8f82ed210a2f5a16d80b512df4096cba70b12d236d53a4a39e82b8207d09c8d8dcf4398c995ed26762d0699f4f45e0776aae427b739dcb3d32188b578c50c778acdf6de81bb7c3133573dc2c1ba3f82ecabca21194e7308c3fc5b0b840ef9658ebb9deedd0d0a2e6a9828480c608d7d83245a319ff162b502ca5ecca2cac0e51a0ed0f379c888feede81a5cfc7b7e7011f1e21310288f616ac0993f961d302f13c6cbf0c9f0d094430d3f22034c0161b31d905f7f25dbd69324a3035b16d9fd18ba4938d872894583535a4ec13fc773aa26e631197c3b1c78a5552ad104f2ccf87106b1dfd79ff0349f155f61b6134cbaca2f36d9c68c0529cc4d2b65b51083b630698b86c9896fc5b42ad3650c09980f93477dd61c9a46f1d52712f6c936893dea958540e1af05fe837e588d295c4d39480510b05b78ed0417962431f601683c1cda7a15bbd12c2b204203327eb788a52c8f5bc4e6e399113b23b7e8e601ceb379a901d13bf8f7e4e58569740868eba66e8f302acba8208b4a0455f836b5c6b5ae082f44fc1358e117a1587c6d1fa93c140971b1d8946117fa766863ecf03a81280408f11b6fecd1ecc914a5fa57d06b7179577daae4e42e4a5b42b4c7dab5e53aeb3facba5cffd84b67ae33dca9b376df88b2625de637d698624c284d9585ba7cfbdf3ae65b53f9ef2682e5043af7a976517ea23ba7019931391586a61d34b4b0a920ae68c900b78fbfafa99e2c85bdf7a776da3be619b6db04093bda31c545099698d3887315fd980530649cea3506e4b7269b6f554924d64323df401115de28a3f99c2f20e4224f5a246ee2830e41153688955b8d411d8cedb40615ada8de9e21ca60d016a134f30ce45b06eb201d329a165347ff90d3fed51f44e069ed3b9fe0f614e7d212ac61a135619a5efa2a25ac64ca25060d3b55b44b3f7d94d35b333449b9566ff76b663c8650ed929298608511631418bb6eba8dd3c54881bc5fd5c9767d968c6342135601e9f9b70f1716d13bf100808e030bba4aa6be95505121f7ab88c557b4b78a5855c2ff8a259527e95379926a3ac2e674f59b4626fab98a33e6d7cea853c14348689ded5cfeec400f4a6b416daa339d858ae5a169932033a314edb63e3826d76996919c827410044f68232ba84b15bcade0c6e52992071d22f36ce34ec10c5b2ba1ee49b679c420178e2dcd8bd52a5b03fbd7a4395bcef0542d5bef796898b3d46da0d69c798bd85b15f4c22527a91d5173cc6fd5f15b2588e4519a0a9988ad7d13ea8c97115b65290f8311aeb178a56d8037da067813718829c18312fb9c4196da5605730acf400e16e73fcfdebf8b98b81090ce2c250c47e476212e88b067e436382e72e089ef7f04c71cc0028f6122d571dbf81756e4c1c6287eef75bb8a019efd0cdaaa74c28a5bfd80714464da5ccb99d45d8f685ad4a630076dbed4baf5a13baeb3eb148bb5d774b2c21a46b3986161e7e2d4457705fe0536740f021a34b03f22cb8165ac1d6bdf5dd7363227b13171c3947e4c97b4a8786395a1c7595c43ec575c47b8c61124d2a8d4bf5a6446e2a4a265dd755e9f915c8aff5bdb8b3a7abc9749f96d413bcd740bd6beb343e7f8f3ae46b9e969761ef93102Line truncated
bs, _ = hex.DecodeString("1f8b080000096e8800ffec3cfd73dbb692bffbaf4075e923d5c89493bed7bb89ebbc499df43dbf7c79e2a47373ae6f8612218b35052a246845e3e87fbf5d00a4f0458ab693b66fe63cd3c60616fb85c5627701703c26c7f9725da497734ec2e321797cf0e8afe45ff1553e213fe5c525895942723ea70599e68c17e9a4e2795146e459961131aa24052d69714d93680fb07d2829c96784cfd3929479554c290c4c28813f2ff36b5a309a90c91ad092d727eff74bbece28c9d22965308ecf634ea6d035a1886a9657403c65d04ec9ab93e3176fce5e90599ad1686f6ffcdd6f6596324e2645be02f24f082f2a3a124ca6aca2f5dfcbac2af13ff937f96e0c232fb37c1267e4c113328bb312806276596571a1fe46a0bda0825f4a9077ca83c3bdbdebb820e59a4d412c76498eea11d1224faa8c8641d3178cc8f9c5f0500ca88a6c12039a2312808a049e062e024667e96538aba021cd19091fcc395f9e16f9759ad062486ef608fc188d5142677195f132fa5416b37fd218dadec40b41e0bff78fcfdefdbcff3ebfa20c08ed187b9ce75729adc71a2337439b4d5ee459468b3038ab5b8f799181a01aefe5345f822205c99a7754c1b2a0d7cf638e640e0e9bd64bcadfbe84269c926d2bea282eb854b09809e0440822b0232b8c0a822500dc6c0ead4e50a7dbbe589f3c471903a39581452292f30b0f921386821aeca9fe6591f37c9a67c773987fb0e3864d0d861605ac0f177749297b817d2e3760443473592fe832af2515edb024cec022d965090b649617944cf23c2b4906b3092d9cd3c2a4c8b900065e44fb4d9a3c21c1abb4e49401229841d0c214cc5ecc2c3955d21109419e25094c49494b00e4eb252ca980d34f1cfe523325d7d466a4217f1d7f3aa32c793959961afab715bfcc715edfa129bc4a1729f89a97e94fe372b8c5cdaac584169dd8df01be989d3010f43acece340ab287d45d24bc3566655d7ee4aaf3eef84fe322864594bda31f2b00d295032a23a02018c912a1a32d487ffc80441aa5a57944fe33784c227be504f457bd46e11fc2693e63ec058b27194d3422b28b3c4fc1eec0c3afb788d13e3bf97e954f5b908a9e7be13ccd0bde8e90a8eefe3a3ec3f69fe476a3af1d6c26db769d4d63fc875376eaca295b0876fa075f985ef0b24acffc0b5bad577d623e9cdc67317f3005456ccf2ad88b61879dc6c2f17f3044de89f0342ecb555e24dd4835288578b96de9e4f6fd2b7dd96224f2cff7ef4fcf2090280810ba850d3d3b3d7949d71a326820b245a18897e915fc6d4d52b325c21677564da794263409eb1d117fd21909bf111ba0deaa4d70ca521e0e0fcdae30f80f4639e8e04aec21c110378d380b83396cee8105ed6eaff8b33158d86eb6b764633bb09b09842de7154ff215eb86f4edfb26d31b57b93fc7e0d55ccdb68b55505e15ac4d1dfe0969d3facd249e5e2545be043b007a60b96017600d933c2e1215456e5a26a54bc066e39f811c73046e222c9d371165458030ac23cc872418976b58e80be0b144bb2b4b2db44c621edbc299067ae833018911d8c0f11acb4319e4847eee14f27a82f471dbdfdf4e7e83fd34029d95a11eee0c2358ab2fe2e95c439e26cec4781520c2a8bf239aa3001a28c3bce3c3bb93e37cb1cc193818c4d4573d9a1a04def334b97034614ba5ffeee7518b617bcf14c6c62c5f01758ca421765d85c39101c131140d1166bf89b887644c1e1d1c1c989069a21c55fda305e830de140ddd26e80c33b03615096f869dd13c2edfae18c4904b5af0b550b5071e7fea14edd0e9dd382d1c366a3f16248a93028e0a421e60ff75cce7d122fe141e8cc87f91efa42e05c409fb69cd69f93ee71000ec7bd209070a95c793a1cba14139aff82ed210d8f5a16d80b512df406ecca77312d236d53a4a39e82b8207d09c8d8dcf43982999ed26762d06992af55e077682e527b739dcb3932888d078551aee149bedbd0337f67c66ae7a8483757f04395bc520854e19046ffead05020e76c570b7d3bdbb41c1450d1305e904acb16f90442be6339e2f9740d98b59d426b85cc3017a3e0f19d1bf1d5d838b7fcf0f2e229e7f0002c5314c0d38f387b203e66552f2227c343c34e550c38fc8001347d86c07e4f367b26d3d49323ab06591dd0fa19b84832d97586a38a5c514fc737c49d5c43c24836f8703afb44a259a409e193fce2062fcfa139eb259fe15663bc154adf862936dcc5890c2dcb452560b31680b93b6684a39f1ad989645ba88216df361f2a8cf9a43d328befa44c23ed926b147bdb27c28fcb5c07fd00fab3185cb2907a90002760baf9de0c29224c63e008d87435baf62379a6539446840c6ef16b100e6718bd87c3c336267e416dd3cc079362f35207a03ff9e3cbf308d0e016dddd4ed1146651915645189a00adfa6d6b8d625e1b9887f022bfc22144bb6ed23958722212e169b32ec42df0e6d8c1d5e2710e503217ee38d3d9a3d99a254ff0e7acdaf6eab4f959cdc46690b88f6ca766db9cefa4fab2ed73ff6d299eb0c77eaacdd37a2ac58cdf99d35a618134a53c5a42edffef78ef9d654fe8789603981ce7daa5d945fe8ce6940664c4e85a169c7132d6c2a886b5a9480dbc7dfd7544f96c2defb4b3bed1df30cdb6d82841ded98e2a2040bcc69c4698c7e380318324ef51a03f25b93655b551289f5d0c83750448537ca28bbe47308b9c8a316899bf8a04350850d62e5566350c7693bad41452baab767883218b44528cd3c03f996c13a48878ca6c5d4d13fe4b43ff883083ce37de313dc9e62262dc11a165a13a6e9a5af52c24aa65c62d0b05345bbf4d34739bd354393946b557abf66c66308d5ae2889095618314681b1eba6db38938c14c8db659d6cd727d03826346115909e7ffb7061e9bd130f00e838b0a0ab64ea5b09157575bf8acaf89af656515915f0bf7c41e5f9fb549ebf9a8eb03993fda691897eace2acf46b67d4a9e02124b4ce762e7f76a007a5b5a036d599ce42c5f2d0b44990b9a414edb63e6e26ab34cb08a3201d04c113dac80aea52056f2bb871798ae4f188c83cdbb85330c3d64aa87bfe6d1e31c885634bf36cb9ccd6c0fe8a3427d2199ec565eb3d0f0d7396ba0dd49a336f117bab825eb8e424b5236a2e075875fc5609227900a74226626bdf843ae345542eb39487c108d758bcd436c04fda06f829e21053820725f639832cb52df3d2293c0339589cff3a7bfb262ac53582746629613822377371ada47c426e82e39c014f7cff3d38e6401c79016bf2906efc5b99b3606314bff7ba5dc500cf7e066d553a61c5ad7ec03822326daee54ceab647342d6a539883365f6add15d11dd7d92ac562ed8a4e9658c36816332c6c264e5d7457e05f6043f720a04103fb23b21c58c6dab1f6dd756d2373121b13374ce9fb7441f38a3756197a9cc50a62bf7c15e11a479048a352ff6a911989938a9675d779e9467229fe6f6d2feae8f14e26e5b705ed34d3Line truncated
gr, _ = gzip.NewReader(bytes.NewBuffer(bs))
bs, _ = ioutil.ReadAll(gr)
Assets["app.js"] = bs
@@ -63,7 +63,7 @@ func init() {
bs, _ = ioutil.ReadAll(gr)
Assets["favicon.png"] = bs
bs, _ = hex.DecodeString("1f8b080000096e8800ffec5deb76dc3692feafa7807bb2b69c15d9f225ceacdceab38ee44cb489ed1ccbde6c3627bb074da29b8848822640493db2e6d9a7aac07b932dea666b92fcb0451240a1502814be2a5c7a726fffcddebb9f7f7cc9021385d38dc93dc7d9d853c932958bc0b0cdbd87ecf1f6a3a7ecbff8919ab16f54ba603cf69932814899a76293ca596654aa5df6220c1995d22c155aa4c7c27737de6bc1d49c99406aa655967a024af982c1eb421d8b34163e9b2d81267b75f0ced166190a164a4fc450ce04dc300f92666263ae32a856c6f051b01f0ef65ebe3e7cc9e63214ee86e300dbc83d0b79bcd81d8978c4e285c3936477a497b10775c70bfa44fcaa3014e9eee8b048d9336938625ec8b5de1d61a650f1a3119214dc9f6e30368984e1cc0b78aa85d91d6566eefc75542504c6248ef890c9e3ddd1ff38ef5f387b2a4ab891b3508c4842228652072f7785bf10b572318fc4eee8588a9344a5a696f544fa26d8f5c53188c1a1972d68b83492878ef67828761fb9db2b847ca1bd542646aab8466b251bcf4ca0d2951ca18c8fa0d7429018241b2f334c7a482948c57c7734e7c7f8ea2620c8e9061630d284625a0a917d646767d8c9afa1735f434d9b0fcfcf27639babacc0129b2965b4497932f6b41e976f6e246317be8c723e5015742084b11c5ad530cb041a61c4a9c1c294c2d84cf94b76468f8c25dcf7812167a68c51d10efb7a3b397d9ea7cda1d1ce9c47325ceeb0d177223c16467a9cbd1699186db1f2c3167b9182b4b798e6b1764095e5dc9238dfa03f59f8efc157658d114f1732768c4a76d823f72b1135f2bac8ac13a958e98483f69f75f1f24ac4a1da62af54cc3df8bba762ad4021b7d8680fc68c84a1f65a9c0087259956151c940db5dbc771e34f0da9ae49a7a83aaba928affed43974487f6a49d95f4bb933b5a4ec975298a9d417a9955dace256bb42b5502d31efb0ede7cd9eae7d2132ce575587274a4b1c113ba85330268fdb15486d9c5839b30c8c8229aba2cfa4700e2a9c65ad55101a1666515c96f1a54e420e7d2963d075e1cc42e51d157c806adb910cfa58e847a93864334175aa8419f78e16295a3cac45a5c0fe62b6f9f8c9b32df6f8e936fef7e8e1f3a60453eecb4cefb027b5c617f279949cb2a7d5f742908fe1f3e3e2f379bb5da066b1eb73301c2d3d0fc51cb8ddae14bdd1bc47dbd567d27c1eca05ca1f1bf9fc625915022e0cf1aa7cb12fd83d19a1d5e4b1e91809304794c54e02698443636627562760671ac6e04458e13fdddeee24e4afd815dbfcc76055fa98f8cf48f892b3cd889fe652f9fad9d7c9e9c392543e3260924c60a083524eed97faf829333336fe12b417a64ac3382bad2583b9c8a0e115eec2dd29f3b22fa15d29d889194c8d2c0940561a8605e361a84e180a7b960a7ea471260d15144f45922a281382128d35cc71301f9f4813d4295a8d8019fecb71f9b92e57e89234e26121d8f352a126631a4430978eed64ba31a116d20c024083bd5309287bca700ac76f313f2e67627e8c29f60f1a88e2d117739e853061c24c2e289f5c709af6ec6c30f165490467390e8d4ef3349c4740af9b7538b31420cd683a91d1a24841cb33623af5702272f0cd79f4f8af34ff313b3f8f9e3c86d991d4c73e8fa7ac9c0e271ae41116c402e98309744e61be6ad66fa786cc08a8fd23080b92a69df328919be6398a966461ad1d85746a8f34e4ca86d31c5c14f05395f8ea24aea5423acf27e8bf8cdaf940fe8b05e2193408f94b9dca4b5f9afbf14c27cf27b352f6a04b50fd643c837fbc5151c579594124e2acc10df13b2d79b2f80d90e1116018df7f2b12b5f910a8d7c5b9089749803885954f4ee063cf5ac1dd171170f8c2f71916879941a54b646d32869a06578d3d33a86a68fe89b02268558f247a2b2e45238fa58f9a7b09f6c0f098436b18f4201e3db568f15714bfa460e470b97c48d10368571b807d3ad8bf15a9e82033a86483b853f3f90a6bb6f8252502e6ddf0d40c549539640f5a15bfb514baea9d8cb3b036b26ba955ca640cc222ec3c068b600d6c8f6db4f9d1227f2b536dc0b49e6c3115874b06eec049cce49cc5c2135af374f99ce57cb1139ec63805e5d63b270f1290208a7b407f2e1707311ac5d2a000e1ca143798099dc8071b5bb757b574108a0819fdefe4d5366d573baf83130ee59a044f9a29e4948ca6452b5e0be10b1f66a827d35262fd6471fe6adba964fa2e40b716db9ba53417b1806b705b05e0287e8c2e2e3854b18219dc0310cac1e0bbd564c1a20c459eb38393759e897cdd589c3449bb9371d254850b9946e05d9b03f36cc093014ead4b655fca7e9a19f0ba4dece888fee4732e4b0027e7f3caed68ba65a3c5685d4f42c1d3b93c1d75f455f343e3b5f6923fae68bc586421e00d50d0963e3734b7a08705ab49841c06b6892005e1e1c38a42a7963f5ba7e40e02ff64c4a48f82cd6b9042af57f77c689c9d61913d4cd8c427f7601ff003f515bc0a6e2c4d447ff8f707601b7bad57dcada1d4c807397b46562b1b218b06700039843cd1059e4800296028e22f8df61660043f42c3be90e0479e426356c9b750dd4530805929b9fb32151e75df4746518f1fb909cecf2f225f8d0156037696e6a1e126ab8bbe09d9eacaca57a48916a8d9136d15cf3ba7508dba549a1d51089895925ea96d88656b676cfb2ddd7d615da77a11d60a05e4efe0c8c804b16f0715a4637d85ae344c4dfb923031b8d81219de863eb5018d480488aca9c16f80f81c6be79a75b04fc12fbf97f9713ff7d76f9875e61c9588b8d5c06f29e53a2d2bc7ccb51a586084087060f84b2eb25f5d191ff350f6e9c3e0f6e7f8c0d172d116c0cb3455576d7f37b39fb3a33d1581dbd47630105704a98ae5df092e5ca3b73bacd9e76aea2254b3b6cbf037f8c6c3862f77131dbb20b2dfca506898187878c297fa7516cd447a7e4e2b0e7a8bf514fa6669a8d04cc61c87c8379f4f60818adaf2fa4179b720ae10a95e525a54e60e09cb0b55e63be8e3858ab7e3056f00baab39c1f59b91580c0ec725058645ee90bc305cdb92d22baec1c5b8ae76f5e62f30583e719060de022c7d033eea68fab3d07d40ab87c0bd1685d7ea22029f4fda19d873e11d89b6621e2c62950af6a34823a935987a7dfb32b7756295faea626f10b9cb92a778b8c3c39529d6c6c97f9226b8a24920ca9aa29828922bcfad90d28792218916153a7c8f15b7823e773b39238c6e754705925446608a463d81c8aa7503e20200563d19b6e11a50b1d1af2e0de9728fae1014a8bbf418c3ac39f324801bf3e663203ecc8d2f97386a7e3b96de9b2fd075ffa55820d87cf8ebdd71de6df30aaf1ddf1ce473488cbe8e5560f28b8bb58fbccd343aaee92f57fc5ce0298380ff7496579de59588dd8b57ecbd91e1f5bc0cbd04d410b9f0e76e001bc3f5916eb574efc7f737d7522fc960def360c4b4c01fbcLine truncated
bs, _ = hex.DecodeString("1f8b080000096e8800ffec5d7b77dbb692ffdf9f02e1ed2676d7a4ec244dbb8eacb3ae9db6de368f1327dbedf674f7402424a2260986006deb3abe9ffdce007c3f245ab613dfb67f2416096030180c06bf193c387e70f4faf0dd2f6f5e105f85c16463fcc0b6370e45bc48f8dc5764f3708b3cded97d4afe8b9e8a29f956247342238f08e5b384b82252099fa64a24d22107414074294912265972c63c67e3bd6444cc88f2b92452a489cba094c7083ccec5194b22e691e902689297c7ef6ca916012301775904e5944f15712169ca366622856a79042f19f9e9f8f0c5ab931764c603e66cd836b08ddc938046f37d8b451689e6368de37d4b2e2217ea8ee6fa95e65704014bf6ad933ce550258145dc804ab96f61a640d0530b4932ea4d360819874c51e2fa34914ced5ba99ad9df586582af546cb30f293fdbb7fec77e7f601f8a30a68a4f03666909b1084a1dbfd867de9c55ca453464fbd61967e7b1485425eb39f794bfefb1331083ad1fb6a1e15c711ad8d2a501dbdf75765a843c26dd84c78a8ba842ab958da6ca17492b47c0a353e8b5002406c9ca4d15e12e52f21336dbb766f40c1f9d180439d9c0028aab804d0a21928fe4f2123bf91574ee2ba86973ebea6a3c32b98a0a0cb1a9104aaa84c62357ca51f1e4843c72e08d95f181aa207dc694e1d0a8865ac4d008c52e1416d629844c85b72097fa272131f53c60c89e0aa544b847bede892f9e67693368b43da3210f167bc4fa8105674c719792572c65d636295e6c938304a4bd4d248da40daacc6786c4d586fe9306ffee7f55d418d264ce235b89788fec3a5fb1b096d74166ed504442c614b4ffb28b97972c0ac436792922eac2df431149010ab94dac4318331c86da2b760e1c16641a55505036d46e0fc78d37515a75553241d569a7a2bcfa5367d021fda905656f29e5ced482b25748612a128f25467691881aed0ac45c34c4bc47769ed77bbaf24693b1bf2a3b3c1692e388d8439d823179d6ac804b6547c29ea660145451957ead15ce468533ac350a42c382348c8a321e977140a12f7904baceec6920dcd39c0f506d3392411f73fd281447db4c509d32614addd37982160f6b1109b03f9f6e3e7ef26c9b3c7eba83ffed6e3daf4b30a11e4fe51e7952697c2e9fddf8823c2ddfe7827c0caf1fe7afaf9aed02358b1c8f82e168e879c066c0ed4ea9e8b5e6edee94afb5e6d380cf51fed8c8e7ab65950b3837c46df9625f90073c44ab4923d53112608e288a9dfb5c315b8f99bd489c839da91983736684ff7467a79390d7b22ba6f98fc1aaf431f19f21f338259b21bdc8a4f2f5b3afe38bad8254363260928c61a083524ecc9beaf829321332fa12b417a64a452829ac2581b948a1e165cedcd92bf2922fa15d09d889294c8d24f64156128605a14120ce090a7b9a307a2a71260d04144f589c08281380128d24cc71301f9f73e557291a8d8019fecb51f1ba2a57e89224a4412ed8ab42a1c6233d88602e1d99c97463ac5ba86710001ae49d8841d913825338be8be8593113d3334c317fd040e43f3d36a369001326cce44ce7e373aaa73d331b8c3d5e10c1598e42a3932c0de711d0eb7a1df6340148634dc63c9ce72968792c22131727221b9fecddc7dfe8f98f98f9d97af2186647ad3ee6f768428ae9702c411e414ecce71e9840fb02e6ab7afd666a481583da3f82b02069d2398f6a72932c47de9234a8b423974ee5a71e7245c3f51c9c17f012117be23caaa4423acd26e8bf59cd7c20fff91cf10c1a84eca14ae585c7d5c3682ae3e7e369217bd025a87e3c9ac23f5aaba8e4bca82064515ae346f33b297832f80d90e1296018cf7bcb62b1b905d4abe29c078bd8479c428a5fb6ef61cf1ac13d64217078e079048bc3cc209205b2361e414d83abc69e19543534ff9c191134aa4712bd1517a2e167dc43cdbd067b6078d489310c72108fae9837f8cb8b5f53307cb85c3e24e80134abf5c13e1d1fdd8954a49f2a54b241dc89d9acc59a297e4d89807957345103556506d9fd46c56f0d85ae7ac7a334a88cec4a6a99321e81b034761e81453006b6c7369afc6891bfe38954605acfb7898882050177e03c227c4622e6322969b2784e32bec8394d229c8232eb9d9107097010c503a03fe3f3e3088d6261508070698a6bcc0476e8818daddaab4a3a08850544ff6f67d5d66d5733af8d138ece35f69fd453b453624df256bc62cc631ecc504f2685c4fac9e2fcd5b453f1e49d8f6e2db6374df45c447c2ac16d6580a3e819bab8e050450266701740280583ef94930509531479c60e4ed65926edeb46ecbc4eda198fe2ba2aac641a8177650eccb2014f0a38352e957928fa69aac0eb56912d43fd279b73490c38399b57ee46d30d1b0d46ab7a12309accf885d5d157f517b5c7ca43f6b3a5f16c9e06803740411bfa5cd3dc9c1e162c2711ed30904d0429080fb74a0a9d5afe6c9992db08fc638b700f059bd5c0995caeeed9d0b8bcc4228798b089bf9ce323c00fbaafe09151656822fac3bf3f01dbd86bbde26e0ca55a3ec8d933b21ad934b2a801079043406399e3891890028622fe566b6f0e46f02534ec0b0e7ee40534a64dbe81ea56c10062a4e41cf184b9bafb3e121df57843957f75b58a7c39064805d8199a278aaab42afa3a64ab2a2b6d49132d50bd279a2a9e754eae1a55a9d43b2217302924ddaa6d88656b666cfa2ddd7d615ca76a11d2080564cfe0c8f018b16f0715a4637c85ae344c4dfa9230d15f6d89146d429fca804624024496d4e0d5407c86b533cd3a3ed2c12faf97f9513ff7376f9871e66c11b3a8d1c0ef74ca4d5a568c991b3530c70821e0c0e0d74c64bf393c3aa301efd387c1edcff0812df9bc2980174922d66d7f37b39fb3a35d1182dbd474301057f88988f8df355cb8416f7758b3cfd5d47920a64d97e17b7847839a2f771b1d3bd764bfe301933031d0e09c2ee4ab349cb2e4ea4aaf38c86dd253e8db85d285a63ca23844befd7c02f345d894d74fc2bd03710548f59ad2d265ee91b0dc40a49e8d3e5e2068335ef01aa0bb9869b87e3b128bc0e1b8a6c0b0c83d9217866b1b527a4925b81837d5aedefc3906cb260e2d98b7004b5f838f6a4d7e61b20f68f51078d0a0f04aac22f0f9a49d823d67ee296b2ae6f13c1209236f58127229c1d4cbbb97b9a913ab94eb8bbd46e43e4b5ec7c36d1ab4a6581327ff992b7f4d93a0294b1dc54491ac3db7424a1f4a8624bda8d0e17bb4dc0afdbadbc9b130bad51d1588131e8229b27a029165eb06c40500acba3c68c235a062a25f5d1ad2e51ead1114a8baf418c3ac38f35a00b7e6cd47407c981b5f2c7154fc762c7d389ba3ebfe6bbe40b0b9f5dbfd71de4df372af1d9f6ce473488cbe8a5560f28bf2b58faccd7a74dcd05f2ef959e1298380ff7296dbce722b6277f092bc573cb899972117801a4207fedc0f60a3a83c958d961ebe797f7b2d75e314e63d17464c03fcc16304deLine truncated
gr, _ = gzip.NewReader(bytes.NewBuffer(bs))
bs, _ = ioutil.ReadAll(gr)
Assets["index.html"] = bs
+8
View File
@@ -321,6 +321,10 @@ func getQR(w http.ResponseWriter, params martini.Params) {
func basic(username string, passhash string) http.HandlerFunc {
return func(res http.ResponseWriter, req *http.Request) {
if validAPIKey(req.Header.Get("X-API-Key")) {
return
}
error := func() {
time.Sleep(time.Duration(rand.Intn(100)+100) * time.Millisecond)
res.Header().Set("WWW-Authenticate", "Basic realm=\"Authorization Required\"")
@@ -358,6 +362,10 @@ func basic(username string, passhash string) http.HandlerFunc {
}
}
func validAPIKey(k string) bool {
return len(cfg.GUI.APIKey) > 0 && k == cfg.GUI.APIKey
}
func embeddedStatic() func(http.ResponseWriter, *http.Request, *log.Logger) {
var modt = time.Now().UTC().Format(http.TimeFormat)
+3
View File
@@ -22,6 +22,9 @@ var csrfMut sync.Mutex
// the request with 403. For / and /index.html, set a new CSRF cookie if none
// is currently set.
func csrfMiddleware(w http.ResponseWriter, r *http.Request) {
if validAPIKey(r.Header.Get("X-API-Key")) {
return
}
if strings.HasPrefix(r.URL.Path, "/rest/") {
token := r.Header.Get("X-CSRF-Token")
if !validCsrfToken(token) {
+1
View File
@@ -123,6 +123,7 @@ type GUIConfiguration struct {
User string `xml:"user,omitempty"`
Password string `xml:"password,omitempty"`
UseTLS bool `xml:"tls,attr"`
APIKey string `xml:"apikey,omitempty"`
}
func setDefaults(data interface{}) error {
+17
View File
@@ -52,6 +52,7 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http) {
{id: 'User', descr: 'GUI Authentication User', type: 'text', restart: true},
{id: 'Password', descr: 'GUI Authentication Password', type: 'password', restart: true},
{id: 'UseTLS', descr: 'Use HTTPS for GUI', type: 'bool', restart: true},
{id: 'APIKey', descr: 'API Key', type: 'apikey'},
];
function getSucceeded() {
@@ -514,6 +515,10 @@ syncthing.controller('SyncthingCtrl', function ($scope, $http) {
$http.post(urlbase + '/config', JSON.stringify($scope.config), {headers: {'Content-Type': 'application/json'}});
};
$scope.setAPIKey = function (cfg) {
cfg.APIKey = randomString(30, 32);
};
$scope.init = function() {
$http.get(urlbase + '/version').success(function (data) {
$scope.version = data;
@@ -593,6 +598,18 @@ function decimals(val, num) {
return decs;
}
function randomString(len, bits)
{
bits = bits || 36;
var outStr = "", newStr;
while (outStr.length < len)
{
newStr = Math.random().toString(bits).slice(2);
outStr += newStr.slice(0, Math.min(newStr.length, (len - outStr.length)));
}
return outStr.toUpperCase();
}
syncthing.filter('natural', function () {
return function (input, valid) {
return input.toFixed(decimals(input, valid));
+5
View File
@@ -595,6 +595,11 @@ found in the LICENSE file.
{{setting.descr}} <input id="{{setting.id}}" type="checkbox" ng-model="config.workingGUI[setting.id]"></input>
</label>
</div>
<div ng-if="setting.type == 'apikey'">
<label>{{setting.descr}} (<a href="http://discourse.syncthing.net/t/v0-8-14-api-keys/335">Usage</a>)</label>
<div class="well well-sm text-monospace">{{config.workingGUI[setting.id] || "-"}}</div>
<button type="button" class="btn btn-sm btn-default" ng-click="setAPIKey(config.workingGUI)">Generate</button>
</div>
</div>
</div>
</div>