module ReactiveRecord Engine.routes.append do module ::WebConsole class Middleware private def acceptable_content_type?(headers) Mime::Type.parse(headers['Content-Type'] || '').first == Mime[:html] end end end if defined? ::WebConsole::Middleware module ::Rails module Rack class Logger < ActiveSupport::LogSubscriber unless method_defined? :pre_synchromesh_call alias pre_synchromesh_call call def call(env) if !HyperMesh.opts[:noisy] && env['HTTP_X_SYNCHROMESH_SILENT_REQUEST'] Rails.logger.silence do pre_synchromesh_call(env) end else pre_synchromesh_call(env) end end end end end end if defined?(::Rails::Rack::Logger) class HyperMeshController < ::ApplicationController protect_from_forgery except: [:console_update] def client_id params[:client_id] end before_action do session.delete 'synchromesh-dummy-init' unless session.id end def channels(user = acting_user, session_id = session.id) HyperMesh::AutoConnect.channels(session_id, user) end def can_connect?(channel, user = acting_user) HyperMesh::InternalPolicy.regulate_connection( user, HyperMesh::InternalPolicy.channel_to_string(channel) ) true rescue nil end def view_permitted?(model, attr, user = acting_user) !!model.check_permission_with_acting_user(user, :view_permitted?, attr) rescue nil end def viewable_attributes(model, user = acting_user) model.attributes.select { |attr| view_permitted?(model, attr, user) } end [:create, :update, :destroy].each do |op| define_method "#{op}_permitted?" do |model, user = acting_user| begin !!model.check_permission_with_acting_user(user, "#{op}_permitted?".to_sym) rescue nil end end end def debug_console if Rails.env.development? render inline: "\n".html_safe # "
additional helper methods: channels, can_connect? "\ # "viewable_attributes, view_permitted?, create_permitted?, "\ # "update_permitted? and destroy_permitted?
\n".html_safe console else head :unauthorized end end def subscribe HyperMesh::InternalPolicy.regulate_connection(try(:acting_user), params[:channel]) root_path = request.original_url.gsub(/synchromesh-subscribe.*$/, '') HyperMesh::Connection.open(params[:channel], client_id, root_path) head :ok rescue Exception head :unauthorized end def read root_path = request.original_url.gsub(/synchromesh-read.*$/, '') data = HyperMesh::Connection.read(client_id, root_path) render json: data end def pusher_auth channel = params[:channel_name].gsub(/^#{Regexp.quote(HyperMesh.channel)}\-/,'') HyperMesh::InternalPolicy.regulate_connection(acting_user, channel) response = HyperMesh.pusher.authenticate(params[:channel_name], params[:socket_id]) render json: response rescue Exception => e head :unauthorized end def action_cable_auth channel = params[:channel_name].gsub(/^#{Regexp.quote(HyperMesh.channel)}\-/,'') HyperMesh::InternalPolicy.regulate_connection(acting_user, channel) salt = SecureRandom.hex authorization = HyperMesh.authorization(salt, channel, client_id) render json: {authorization: authorization, salt: salt} rescue Exception head :unauthorized end def connect_to_transport root_path = request.original_url.gsub(/synchromesh-connect-to-transport.*$/, '') render json: HyperMesh::Connection.connect_to_transport(params[:channel], client_id, root_path) end def console_update authorization = HyperMesh.authorization(params[:salt], params[:channel], params[:data][1][:broadcast_id]) #params[:data].to_json) return head :unauthorized if authorization != params[:authorization] HyperMesh::Connection.send_to_channel(params[:channel], params[:data]) head :no_content rescue head :unauthorized end end unless defined? HyperMeshController match 'synchromesh-subscribe/:client_id/:channel', to: 'hyper_mesh#subscribe', via: :get match 'synchromesh-read/:client_id', to: 'hyper_mesh#read', via: :get match 'synchromesh-pusher-auth', to: 'hyper_mesh#pusher_auth', via: :post match 'synchromesh-action-cable-auth/:client_id/:channel_name', to: 'hyper_mesh#action_cable_auth', via: :post match 'synchromesh-connect-to-transport/:client_id/:channel', to: 'hyper_mesh#connect_to_transport', via: :get match 'console', to: 'hyper_mesh#debug_console', via: :get match 'console_update', to: 'hyper_mesh#console_update', via: :post end end