scinote-web/app/utilities/wopi_util.rb

79 lines
2.5 KiB
Ruby
Raw Normal View History

2016-08-03 21:31:25 +08:00
module WopiUtil
require 'open-uri'
# Used for timestamp
UNIX_EPOCH_IN_CLR_TICKS = 621355968000000000
CLR_TICKS_PER_SECOND = 10000000
2016-08-03 21:31:25 +08:00
DISCOVERY_TTL = 60*60*24
DISCOVERY_TTL.freeze
# For more explanation see this:
# http://stackoverflow.com/questions/11888053/
# convert-net-datetime-ticks-property-to-date-in-objective-c
def convert_to_unix_timestamp(timestamp)
Time.at((timestamp-UNIX_EPOCH_IN_CLR_TICKS)/CLR_TICKS_PER_SECOND)
end
2016-08-03 21:31:25 +08:00
def get_action(extension, activity)
get_discovery
action = WopiAction.find_action(extension, activity)
end
2016-08-03 21:31:25 +08:00
def get_discovery
discovery = WopiDiscovery.first
return discovery if discovery && discovery.expires >= Time.now.to_i
initialize_discovery(discovery)
2016-08-03 21:31:25 +08:00
end
private
2016-08-03 21:31:25 +08:00
# Currently only saves Excel, Word and PowerPoint view and edit actions
def initialize_discovery(discovery)
2016-08-03 21:31:25 +08:00
begin
Rails.logger.warn "Initializing discovery"
discovery.destroy if discovery
2016-08-03 21:31:25 +08:00
@doc = Nokogiri::XML(open(ENV["WOPI_DISCOVERY_URL"]))
discovery = WopiDiscovery.new
discovery.expires = Time.now.to_i + DISCOVERY_TTL
key = @doc.xpath("//proof-key")
discovery.proof_key_mod = key.xpath("@modulus").first.value
discovery.proof_key_exp = key.xpath("@exponent").first.value
discovery.proof_key_old_mod = key.xpath("@oldmodulus").first.value
discovery.proof_key_old_exp = key.xpath("@oldexponent").first.value
discovery.save!
@doc.xpath("//app").each do |app|
app_name = app.xpath("@name").first.value
if ["Excel","Word","PowerPoint","WopiTest"].include?(app_name)
wopi_app = WopiApp.new
wopi_app.name = app.xpath("@name").first.value
wopi_app.icon = app.xpath("@favIconUrl").first.value
wopi_app.wopi_discovery_id=discovery.id
wopi_app.save!
app.xpath("action").each do |action|
name = action.xpath("@name").first.value
if ["view","edit","wopitest"].include?(name)
wopi_action = WopiAction.new
wopi_action.action = name
wopi_action.extension = action.xpath("@ext").first.value
wopi_action.urlsrc = action.xpath("@urlsrc").first.value
wopi_action.wopi_app_id = wopi_app.id
wopi_action.save!
end
end
end
end
discovery
2016-08-03 21:31:25 +08:00
rescue
Rails.logger.warn "Initialization failed"
discovery = WopiDiscovery.first
discovery.destroy if discovery
2016-08-03 21:31:25 +08:00
end
end
end