diff --git a/app/controllers/pub_thursday_audit_controller.rb b/app/controllers/pub_thursday_audit_controller.rb new file mode 100644 index 0000000..401a43c --- /dev/null +++ b/app/controllers/pub_thursday_audit_controller.rb @@ -0,0 +1,84 @@ +class PubThursdayAuditController < ApplicationController + include ErrorHelper + + + # GET /pub-thursday-audit + # GET /pub-thursday-audit.json + # GET /pub-thursday-audit.xml + def index + + project = "pub-tracker-live" + api_url = "https://firestore.googleapis.com/v1/" + base_url = "#{api_url}projects/#{project}/databases/(default)/documents" + + @users = {} + + response = JSON.parse(RestClient.get("#{base_url}/users?mask.fieldPaths=displayName&mask.fieldPaths=photoURL&pageSize=300").body) + response["documents"].each do |user| + display_name = user["fields"]["displayName"]["stringValue"] + photo_url = user["fields"]["photoURL"]["stringValue"] + @users[user["name"]] = { name: display_name, photo: photo_url, sessions: [] } + end + + documents = [] + + url = "#{base_url}/sessions?orderBy=startTime%20desc&mask.fieldPaths=startTime&mask.fieldPaths=endTime&mask.fieldPaths=userRef&mask.fieldPaths=locationName&pageSize=300" + response = JSON.parse(RestClient.get(url).body) + documents.concat response["documents"] + + url = "#{url}&pageToken=#{response["nextPageToken"]}" + response = JSON.parse(RestClient.get(url).body) + documents.concat response["documents"] + + documents.each do |session| + ref = session["fields"]["userRef"]["referenceValue"] + start_time = session["fields"]["startTime"]["timestampValue"] + end_time = session["fields"]["endTime"]["timestampValue"] + location = session["fields"]["locationName"]["stringValue"] + @users[ref][:sessions] << { + id: session["name"], + url: "#{api_url}#{session["name"]}", + start: DateTime.parse(start_time), + end: DateTime.parse(end_time), + location: location + } + end + + @users.delete_if do |k,v| + v[:sessions].empty? + end + + @users.each do |key, user| + user[:sessions].each do |session| + user[:sessions].each do |other_session| + if + (other_session[:start] > session[:start] and other_session[:end] < session[:end]) || + (other_session[:start] < session[:start] and other_session[:end] > session[:end]) || + (other_session[:start] > session[:start] and other_session[:start] < session[:end] and other_session[:end] > session[:end]) || + (other_session[:start] < session[:start] and other_session[:end] < session[:end] and other_session[:end] > session[:start]) + session[:within] = { + id: other_session[:id], + url: other_session[:url], + start: other_session[:start], + end: other_session[:end] + } + user[:illegal] = true + end + end + end + user[:sessions].delete_if do |session| + session[:within].nil? + end + end + + @users.delete_if do |k,v| + v[:illegal].nil? + end + + respond_to do |format| + format.html # index.html.erb + format.json { render json: @users, callback: params[:callback] } + format.xml { render xml: @users } + end + end +end \ No newline at end of file diff --git a/app/views/pub_thursday_audit/index.html.erb b/app/views/pub_thursday_audit/index.html.erb new file mode 100644 index 0000000..6e57acc --- /dev/null +++ b/app/views/pub_thursday_audit/index.html.erb @@ -0,0 +1,36 @@ +<% provide(:title, "Pub Thursday Audit") %> +<% provide(:description, "Due to a small bug of allowing users to have more than one active session, an audit needs to occur") %> + +

Pub Thursday Audit

+ +

+ Due to a severe security vulnerability on the Pub Tursday backed, clients have been able to trigger multiple check-in sessions inflating their time spent in pub. + Here is an audit of sessions where they overlap another. +

+ +
+ <% @users.each do |key, user| %> +
+

+ Gravatar + <%= user[:name] %> +

+ <% user[:sessions].each do |session| %> +
+

+ + <%= session[:start].strftime('%d/%m/%Y') %> + <%= session[:start].strftime('%H:%M:%S') %> - <%= session[:end].strftime('%H:%M:%S') %> + +

+
<%= session[:location] %>
+

+ Overlaps with another session + <%= session[:within][:start].strftime('%H:%M:%S') %> - + <%= session[:within][:end].strftime('%H:%M:%S') %> +

+
+ <% end %> +
+ <% end %> +
diff --git a/config/routes.rb b/config/routes.rb index 7c78a24..5e1311b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -340,6 +340,7 @@ def matches?(request) get "pringles" => "pringles_prices#index" get "pubthursday" => "pub_thursday#challenge" post "pubthursday" => "pub_thursday#webhook" + get "pub-thursday-audit" => "pub_thursday_audit#index" get "qr" => "qr#index" get "reading" => "reading#index" get "realtime" => "realtime#index"