From df94be866ec61c4a458a4a222266aef5d738aff3 Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Wed, 13 Jul 2016 14:22:03 +0200 Subject: [PATCH 1/8] Creating user session only when uploading a screenshot This makes responses usually cacheable. --- app/controllers/application_controller.rb | 10 +++++----- app/controllers/packages_controller.rb | 11 +++++++++++ 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 9e45186..07bbe48 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -3,15 +3,15 @@ class ApplicationController < ActionController::Base # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception - before_filter :create_user_token + # before_filter :create_user_token # Do not mention passwords in the log file # filter_parameter_logging :password # Assign the visitor a unique hash so that we can track their uploads # and show them even before moderation. - def create_user_token - session[:token] ||= SecureRandom.hex - session[:ip] ||= request.remote_ip - end + # def create_user_token + # session[:token] ||= SecureRandom.hex + # session[:ip] ||= request.remote_ip + # end end diff --git a/app/controllers/packages_controller.rb b/app/controllers/packages_controller.rb index 410fc8a..540b212 100644 --- a/app/controllers/packages_controller.rb +++ b/app/controllers/packages_controller.rb @@ -22,6 +22,9 @@ class PackagesController < ApplicationController # POST target of the screenshots upload form. # Checks upload images and creates a new Screenshot record for it. def upload_image + # Remember the user by the cookie session + create_user_token + @package = Package.find_by(name: params[:name]) successful_upload_count = 0 @@ -220,4 +223,12 @@ class PackagesController < ApplicationController # - Is the user an admin (=logged in)? @screenshot.uploaderhash == session[:token] or user_signed_in? end + + # Store a random identifier and the client's IP address in the session + # for later identification. + def create_user_token + session[:token] ||= SecureRandom.hex + session[:ip] ||= request.remote_ip + end + end From 82003ca1bf299b4d63e112bae7a3925a6c996927 Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Wed, 13 Jul 2016 14:22:28 +0200 Subject: [PATCH 2/8] Define cache expire times for JSON requests JSON requests are very expensive. Make sure they are cached for long enough. --- app/controllers/json_controller.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/controllers/json_controller.rb b/app/controllers/json_controller.rb index 9db5d5e..95f9c6e 100644 --- a/app/controllers/json_controller.rb +++ b/app/controllers/json_controller.rb @@ -1,21 +1,25 @@ class JsonController < ApplicationController # JSON information on a single package def package + expires_in 1.hours, public: true @p = Package.find_by_name! params[:name] end # JSON information on all packages def packages + expires_in 1.days, public: true @p = Package.all end # JSON information on all screenshots def screenshots + expires_in 1.days, public: true @s = Screenshot.includes(:package) end # JSON list of packages that do not have screenshots def packages_without_screenshots + expires_in 1.hours, public: true @p = Package.without_screenshots.all end end From 91c2b327d132e46d6e2cc297f3264119e4718bf8 Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Wed, 13 Jul 2016 14:22:38 +0200 Subject: [PATCH 3/8] Unused method removed --- app/models/screenshot.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/models/screenshot.rb b/app/models/screenshot.rb index 81e4b89..d87028e 100644 --- a/app/models/screenshot.rb +++ b/app/models/screenshot.rb @@ -92,9 +92,9 @@ class Screenshot < ActiveRecord::Base end # Return the number of screenshots that need to be approved - def self.unapproved - self.where(approved: false) - end + # def self.unapproved + # self.where(approved: false) + # end # Publish a screenshot from the moderation queue def approve_screenshot! From 5ced4d389894ec1ce26f5fb6221d154c7a860b97 Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Wed, 13 Jul 2016 14:30:13 +0200 Subject: [PATCH 4/8] Cruft removed --- app/controllers/application_controller.rb | 9 --------- 1 file changed, 9 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 07bbe48..e9b8357 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -3,15 +3,6 @@ class ApplicationController < ActionController::Base # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception - # before_filter :create_user_token - # Do not mention passwords in the log file # filter_parameter_logging :password - - # Assign the visitor a unique hash so that we can track their uploads - # and show them even before moderation. - # def create_user_token - # session[:token] ||= SecureRandom.hex - # session[:ip] ||= request.remote_ip - # end end From 473346d9f3b78d0edb418947d9e5a901695578f0 Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Wed, 13 Jul 2016 14:30:21 +0200 Subject: [PATCH 5/8] Returning 404 if packages are not found --- app/controllers/packages_controller.rb | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/app/controllers/packages_controller.rb b/app/controllers/packages_controller.rb index 540b212..b618d72 100644 --- a/app/controllers/packages_controller.rb +++ b/app/controllers/packages_controller.rb @@ -11,12 +11,11 @@ class PackagesController < ApplicationController end def details - @package = Package.find_by(name: params[:name]) + @package = Package.find_by!(name: params[:name]) end def upload - raise "name not given" unless params[:name] - @package = Package.find_by(name: params[:name]) + @package = Package.find_by!(name: params[:name]) end # POST target of the screenshots upload form. @@ -25,7 +24,7 @@ class PackagesController < ApplicationController # Remember the user by the cookie session create_user_token - @package = Package.find_by(name: params[:name]) + @package = Package.find_by!(name: params[:name]) successful_upload_count = 0 @@ -63,7 +62,7 @@ class PackagesController < ApplicationController # - description # - file def legacy_uploadfile - @package = Package.find_by(name: params[:packagename]) + @package = Package.find_by!(name: params[:packagename]) new_screenshot = @package.screenshots.new(image: params[:file]) @@ -82,7 +81,7 @@ class PackagesController < ApplicationController def delete_screenshot # Is the user allowed to delete the screenshot? - @screenshot = Screenshot.find(params[:id]) + @screenshot = Screenshot.find!(params[:id]) if user_can_alter_screenshot? @screenshot.destroy @@ -94,7 +93,7 @@ class PackagesController < ApplicationController end def approve_screenshot - @screenshot = Screenshot.find(params[:id]) + @screenshot = Screenshot.find!(params[:id]) @screenshot.approve_screenshot! flash['notice'] = "Screenshot approved." redirect_to :back @@ -105,7 +104,7 @@ class PackagesController < ApplicationController # If the package is found but has no screenshots then it also returns a # dummy image along with status 404. def thumbnail - @package = Package.find_by(name: params[:name]) + @package = Package.find_by!(name: params[:name]) unless @package thumbnail404 return @@ -134,7 +133,7 @@ class PackagesController < ApplicationController # If the package is found but has no screenshots then it also returns a # dummy image along with status 404. def screenshot - @package = Package.find_by(name: params[:name]) + @package = Package.find_by!(name: params[:name]) unless @package screenshot404 return @@ -161,7 +160,7 @@ class PackagesController < ApplicationController # Receives a form with a simple text field 'description' so that users can update # the description of their screenshot. def update_screenshot_description - @screenshot = Screenshot.find(params[:id]) + @screenshot = Screenshot.find!(params[:id]) @screenshot.description = params[:description] @screenshot.save! flash['notice'] = "Description updated." @@ -170,7 +169,7 @@ class PackagesController < ApplicationController # Receive an anonymous report from a user to have a screenshot removed. def report_screenshot - @screenshot = Screenshot.find(params[:id]) + @screenshot = Screenshot.find!(params[:id]) @screenshot.delete_reason = params[:delete_reason] @screenshot.markedfordelete = true @screenshot.save! From fcbe621ea13e151c83682bd419d9f0bc598a46bf Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Wed, 13 Jul 2016 15:06:09 +0200 Subject: [PATCH 6/8] Loading fonts from our own site instead of from Google ...for privacy reasons --- app/assets/stylesheets/_settings.scss | 19 ++++++++++++++++++- public/fonts/DroidSans-Bold.woff2 | Bin 0 -> 22516 bytes public/fonts/DroidSans.woff2 | Bin 0 -> 21448 bytes 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 public/fonts/DroidSans-Bold.woff2 create mode 100644 public/fonts/DroidSans.woff2 diff --git a/app/assets/stylesheets/_settings.scss b/app/assets/stylesheets/_settings.scss index 8dbd208..8c556ac 100644 --- a/app/assets/stylesheets/_settings.scss +++ b/app/assets/stylesheets/_settings.scss @@ -584,7 +584,24 @@ $topbar-breakpoint: 800px; $topbar-media-query: "only screen and (min-width: #{$topbar-breakpoint})"; // Import Google font -@import url(http://fonts.googleapis.com/css?family=Droid+Sans:400,700); +// @import url(//fonts.googleapis.com/css?family=Droid+Sans:400,700); + +// Use fonts from out own site. Do not load from Google for privacy reasons. +@font-face { + font-family: 'Droid Sans'; + font-style: normal; + font-weight: 400; + src: local('Droid Sans'), local('DroidSans'), url(/fonts/DroidSans.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; +} +@font-face { + font-family: 'Droid Sans'; + font-style: normal; + font-weight: 700; + src: local('Droid Sans Bold'), local('DroidSans-Bold'), url(/fonts/DroidSans-Bold.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; +} + $body-font-family: "Droid Sans"; $button-tny: rem-calc(4); diff --git a/public/fonts/DroidSans-Bold.woff2 b/public/fonts/DroidSans-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..5afcf3735f68249a98424cab2011a9a48d1ca86f GIT binary patch literal 22516 zcmV(@K-Rx^Pew8T0RR9109W(?5dZ)H0G>nu09TO!0RR9100000000000000000000 z0000Q78|8N91I3v0D%k$ga!$Y1rZDif$AKA)JFj}0we>5Obdf300bZff@BASXAFd5 z8=jCQY@0^$;5-O{yS{7lD1wcHM1WyC5+Q6Hkm0d{+5dk}PKJ!l0?@AS1qv*tX@U^q zBq0QcFoak$2?F1hjfXM1;fz#=LYcQC8Iizv)! z24I`T+*%t@F%b+TBqT%;sg{xuEI>uY=w94h>29;;Hdij=w%^ZPZ#&oFs(o^;_g<1q z2_XBks?4%#r>@3zPUt#dSC$0s15l1|bA>2*X?z5DpV zdjjT`L4^rBW#n&X@N=C4XdT*899up}h`BxekQ z3Op&(k>`*S!tsQ~g+buSB+r3_V~CZD)@80sh0dKz_noWKJm4>D`d!rs`6Y6NgD&l6 zGMVu6Gx-!XcU=yp)Y+@EVClLVvpJ1IRfR$*iLk(H`ZzrYVCf*sNekD0j*Wps=FAI- zcGL2f`ig)UlK>%`fXL6GPDQrem#pYrl)DP>VKohqVrl2HoMrcy?Ms$DUG9XA7_q$Lu%9cG&4yPd z&ZFSupRURyma1+(tgh@oY0R}(b%wip7DS+Had|L79u$@ zIlv8x6TH#6;o$KiAm&T9cz*|wQ-X=36+|x)LW9Mev|Go+N?QaOvRk;#YQ);3U8Y0& z%sAsQiAfNZTDzzMDY z1wc?pSY$Bzn+D3r$_;ktO>SytZei)%g-chi-G(Qim;E;#9vKDgPG(qTL*P7K8@nPX zDXXZehen%P+UuQ|X8j={9FB~F_BH0m8v8h9EJ>0iO&5P6|BFy3%nC*!?uyFEZNVMk z_7^3_^fCu)pZq`PUtqz77G7l0OE0tRa!lDm@F9~yG!QO?$-6-NWdm>)c;`ewUL%qu zlg#hz0Q}(lM~gTRw;d7=OGZHxQ&dt`QB{vWLHvh8**H?%@fhv|5BEcWdf%*-!rzwP z+Hg(3ZJm!Y>+vzILU6AJgdURqza4*?oge0t8Dj#-KE+T{4Qir&y6@9}hG+at&-_`R z?d;;<TASfg(QkL&HpSJ%E%FxKEv5BdfxrOE6**pI(T)J}YHr%~?4<5tQz3lz@ zzVbuwzn>OY0{!=!epNxAk9E28AdRwm3f*p;wmQl!8cMo*O*PjFjG38P{|9~Smw};? zQ{zq)e7m!faPPa`_o0u2D*Gu)^YOWK1ApqcT3HoPQvHr*+UcgRVaA$PcrjPsov6_N z#`$;p9dy`HPdo0U)6P2YqRXD`{NwvBdfBU9_qKPt--A51KYaeD-!_TvRZKZmv7%J} zPV{Y)O*h+oi!IYgl5#ZbBLnWxBu4)LYQ}2@gSld~oDBdlOJ@K90002M001zvIFti% z9)p|5LAy{R}5VdYqYcatg>&rz+fVq`|qe?-}ai^lV5R?(YZxW1BBRWV36h$aI z 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 PQ2<_bDkk*l4*&oFc@?$z literal 0 HcmV?d00001 diff --git a/public/fonts/DroidSans.woff2 b/public/fonts/DroidSans.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..79b4b8d3ad16a78f6cf1c164418756440390ed19 GIT binary patch literal 21448 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 nGpIOciR*QN5_ Date: Wed, 13 Jul 2016 15:06:56 +0200 Subject: [PATCH 7/8] Favicon fixed --- public/favicon.ico | Bin 0 -> 1926 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/public/favicon.ico b/public/favicon.ico index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..4bdf0fc2c699bc7cfa9792a5450f1cc2d108ee67 100644 GIT binary patch literal 1926 zcmZ`(&ud;q6g}@tFvYgXq*^z{^ero5NmF#AVvvH+MLHRpYh4L-*DmM z>$v#UHh#GD7n*N^rF+P2p^qFIS+I~=~vkX~CRR|h;)@(FWC}CE$qbm(H3sl6jn2Gl*#@520B~G#5s!t&M zshECi76(_JhwVvoEwKtrYQ6A*7B3#ra_qHEjq2OaT@C(v$=ui*j(X%=>~*oP_T1QT zvBZJbo4TfFmG=P?H4XH>a%L^?T+nkV?nCD==CAsiL`5U7slzNRruP2H^^FZXD&G5s z|1Wv;?YtBi3|@MB<*Y!)8?L;+IL+z|W1<@OGc4mZt5J<-uwyAD%KO+VhOA#9#-pFG zMEq?1DtSMZvF!XkI16)xhppavFVk#29ePF`;K1<{C!RGoR+o5P`dX9Ov>w~NB?vP! z7SLk~orghp-V=__@h75aF&C2=(&uip9*b9n;c1=i*ShHkB=hKwSl+RSKTl;X5Qx$e-#zcjGlC*A* zRTxRnvPe2A{xm8q-y!FF-OR{()HE;ezTWfgZv5VQj+mvi~mClA)pV`o_rSsy|KHLJayykQO literal 0 HcmV?d00001 From 5f02bd4708c728c700a1964330473cdc324e8fc0 Mon Sep 17 00:00:00 2001 From: Christoph Haas Date: Wed, 13 Jul 2016 15:07:28 +0200 Subject: [PATCH 8/8] Disallowing correct paths now --- public/robots.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/public/robots.txt b/public/robots.txt index 26164f9..8d4fbb0 100644 --- a/public/robots.txt +++ b/public/robots.txt @@ -1,4 +1,3 @@ User-agent: * Disallow: /json -Disallow: /api -Disallow: +Disallow: /upload