Skip to content

Commit

Permalink
* Finish separate /:room/view and /:room/edit support for #1.
Browse files Browse the repository at this point in the history
  To enable this mode, start ethercalc with a "--key" parameter:

      ./bin/ethercalc --key 85b5dd7a-8afe-11e1-bca8-002332d309a4

  Under this mode, /:room simply redirects to the /:room/view URL.

  Using a reverse proxy to authenticate or restrict access to the
  /:room/edit URL scheme is currently required.
  • Loading branch information
audreyt committed Apr 20, 2012
1 parent d1247bb commit 08a3b85
Show file tree
Hide file tree
Showing 5 changed files with 1,434 additions and 712 deletions.
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ SOCIALCALC_FILES=\
formatnumber2.js \
formula1.js \
socialcalcpopup.js \
socialcalcspreadsheetcontrol.js
socialcalcspreadsheetcontrol.js \
socialcalcviewer.js

ETHERCALC_FILES=\
$(SOCIALCALC_FILES) \
Expand Down
12 changes: 10 additions & 2 deletions main.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,28 @@
@response.sendfile "#{RealBin}/#{file}"

KEY = @KEY
HMAC_CACHE = {}
hmac = if !KEY then (x) -> (x) else (x) ->
return HMAC_CACHE[x] if HMAC_CACHE[x]
encoder = require('crypto').createHmac('sha256', KEY)
encoder.update x.toString()
encoder.digest('hex')
HMAC_CACHE[x] = encoder.digest('hex')

@get '/': sendFile "index.html"
@get '/_new': ->
room = require("uuid-pure").newId(10, 36).toLowerCase()
@response.redirect if KEY then "/#{ room }/edit" else "/#{ room }"
@get '/_start': sendFile "start.html"
@get '/:room': sendFile "index.html"
@get '/:room': if KEY then ->
return sendFile("index.html").call(@) if @query.auth?.length
@response.redirect "/#{ @params.room }?auth=0"
else sendFile "index.html"
@get '/:room/edit': ->
room = @params.room
@response.redirect "/#{ room }?auth=#{ hmac(room) }"
@get '/:room/view': ->
room = @params.room
@response.redirect "/#{ room }?auth=0"
@get '/_/:room': ->
SC._get @params.room, null, ({ log, snapshot }) =>
@response.send '', { 'Content-Type': 'text/plain' }, 404 unless snapshot
Expand Down
45 changes: 26 additions & 19 deletions player.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
SocialCalc.isConnected = true
SocialCalc.hadSnapshot = false
SocialCalc._auth = window.location.search?.replace(/\??auth=/, '')
SocialCalc._view = (SocialCalc._auth is '0')
SocialCalc._room ?= window.location.hash.replace('#', '')
SocialCalc._room = SocialCalc._room.replace(/^_+/, '').replace(/\?.*/, '')
unless SocialCalc._room
Expand All @@ -13,7 +14,8 @@

try window.history.pushState {}, '', "/#{
SocialCalc._room
}" + if SocialCalc._auth then "/edit" else ""
}" + if SocialCalc._view then "/view" else
if SocialCalc._auth then "/edit" else ""
@connect()

emit = (data) => @emit { data }
Expand All @@ -37,7 +39,8 @@
return if @data.to and @data.to != SocialCalc._username
return if @data.room and @data.room != SocialCalc._room and @data.type != "recalc"

editor = SocialCalc.CurrentSpreadsheetControlObject.editor
ss = window.spreadsheet
editor = ss.editor
switch @data.type
when "chat"
window.addmsg? @data.msg
Expand Down Expand Up @@ -70,44 +73,42 @@
when "log"
break if SocialCalc.hadSnapshot
SocialCalc.hadSnapshot = true
spreadsheet = SocialCalc.CurrentSpreadsheetControlObject
parts = spreadsheet.DecodeSpreadsheetSave(@data.snapshot) if @data.snapshot
parts = ss.DecodeSpreadsheetSave(@data.snapshot) if @data.snapshot
if parts
if parts.sheet
spreadsheet.sheet.ResetSheet()
spreadsheet.ParseSheetSave @data.snapshot.substring(parts.sheet.start, parts.sheet.end)
# spreadsheet.editor.LoadEditorSettings @data.snapshot.substring(parts.edit.start, parts.edit.end) if parts.edit
ss.sheet.ResetSheet()
ss.ParseSheetSave @data.snapshot.substring(parts.sheet.start, parts.sheet.end)
# ss.editor.LoadEditorSettings @data.snapshot.substring(parts.edit.start, parts.edit.end) if parts.edit
window.addmsg? @data.chat.join("\n"), true
cmdstr = (
line for line in @data.log when not /^re(calc|display)$/.test(line)
).join("\n")
if cmdstr.length
refreshCmd = "recalc"
editor = SocialCalc.CurrentSpreadsheetControlObject.editor
# if editor.context.sheetobj.attribs.recalc != "off"
# refreshCmd = "recalc"
SocialCalc.CurrentSpreadsheetControlObject.context.sheetobj.ScheduleSheetCommands cmdstr + "\n#{refreshCmd}\n", false, true
ss.context.sheetobj.ScheduleSheetCommands cmdstr + "\n#{refreshCmd}\n", false, true
else
SocialCalc.CurrentSpreadsheetControlObject.context.sheetobj.ScheduleSheetCommands "recalc\n", false, true
ss.context.sheetobj.ScheduleSheetCommands "recalc\n", false, true
# editor.MoveECellCallback.broadcast = (e) ->
# SocialCalc.Callbacks.broadcast "my.ecell"
# ecell: e.ecell.coord
when "recalc"
if @data.force
SocialCalc.Formula.SheetCache.sheets = {}
SocialCalc.CurrentSpreadsheetControlObject?.sheet.recalconce = true
parts = SocialCalc.CurrentSpreadsheetControlObject.DecodeSpreadsheetSave(@data.snapshot) if @data.snapshot
ss?.sheet.recalconce = true
parts = ss.DecodeSpreadsheetSave(@data.snapshot) if @data.snapshot
if parts?.sheet
SocialCalc.RecalcLoadedSheet(
@data.room,
@data.snapshot.substring(parts.sheet.start, parts.sheet.end),
true # recalc
)
SocialCalc.CurrentSpreadsheetControlObject.context.sheetobj.ScheduleSheetCommands "recalc\n", false, true
ss.context.sheetobj.ScheduleSheetCommands "recalc\n", false, true
else
SocialCalc.RecalcLoadedSheet(@data.room, "", true)
when "execute"
SocialCalc.CurrentSpreadsheetControlObject.context.sheetobj.ScheduleSheetCommands @data.cmdstr, @data.saveundo, true
ss.context.sheetobj.ScheduleSheetCommands @data.cmdstr, @data.saveundo, true
return

window.doresize = -> window.spreadsheet?.DoOnResize()
Expand All @@ -129,13 +130,19 @@
scc.defaultImagePrefix = "/images/sc-"
SocialCalc.Popup.LocalizeString = SocialCalc.LocalizeString
$ ->
window.spreadsheet = spreadsheet = new SocialCalc.SpreadsheetControl()
window.spreadsheet = ss = (
if SocialCalc._view
new SocialCalc.SpreadsheetViewer()
else
new SocialCalc.SpreadsheetControl()
)
document.getElementById("msgtext").value = ""
savestr = document.getElementById("savestr")
spreadsheet.InitializeSpreadsheetControl "tableeditor", 0, 0, 0
spreadsheet.ExecuteCommand "redisplay", ""
spreadsheet.ExecuteCommand "set sheet defaulttextvalueformat text-wiki"
spreadsheet.ExportCallback = (s) ->
ss.InitializeSpreadsheetViewer? "tableeditor", 0, 0, 0
ss.InitializeSpreadsheetControl? "tableeditor", 0, 0, 0
ss.ExecuteCommand? "redisplay", ""
ss.ExecuteCommand? "set sheet defaulttextvalueformat text-wiki"
ss.ExportCallback = (s) ->
alert SocialCalc.ConvertSaveToOtherFormat(SocialCalc.Clipboard.clipboard, "csv")

SocialCalc.Callbacks.expand_wiki = (val) -> """
Expand Down
Loading

0 comments on commit 08a3b85

Please sign in to comment.