MessageListSent.coffee 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. class MessageListSent extends MessageList
  2. constructor: ->
  3. super
  4. @reload = true
  5. @loading = false
  6. @nolimit_loaded = false
  7. @cleanup = false # Cleanup secrets sent before save
  8. @messages = []
  9. @title = "Sent"
  10. getMessages: (mode="normal", cb=null) ->
  11. if mode == "nolimit"
  12. limit = null
  13. @nolimit_loaded = true
  14. else
  15. limit = 15
  16. if @reload and Page.site_info and Page.site_info.cert_user_id and not @loading
  17. @reload = false
  18. @loading = true
  19. query = """
  20. SELECT date_added, encrypted
  21. FROM message
  22. LEFT JOIN json USING (json_id)
  23. WHERE ?
  24. ORDER BY date_added DESC
  25. """
  26. if limit
  27. query += " LIMIT #{limit+1}"
  28. Page.cmd "dbQuery", [query, {"json.directory": Page.site_info.auth_address}], (db_rows) =>
  29. encrypted_messages = (row.encrypted.split(",") for row in db_rows)
  30. @setLoadingMessage "Decrypting sent secrets..."
  31. Page.user.getDecryptedSecretsSent (sent_secrets) =>
  32. keys = (aes_key.replace(/.*:/, "") for address, aes_key of sent_secrets)
  33. @setLoadingMessage "Decrypting sent messages..."
  34. Page.cmd "aesDecrypt", [encrypted_messages, keys], (decrypted_messages) =>
  35. message_rows = []
  36. usernames = []
  37. for decrypted_message, i in decrypted_messages
  38. if not decrypted_message then continue
  39. message_row = Text.jsonDecode(decrypted_message)
  40. message_row.date_added = db_rows[i].date_added
  41. message_row.key = "sent-"+message_row.date_added
  42. message_row.message_id = db_rows[i].date_added
  43. message_row.sender = "Unknown"
  44. message_row.folder = "sent"
  45. if not limit
  46. message_row.disable_animation = true
  47. if i < limit or not limit
  48. message_rows.push(message_row)
  49. if message_row.to not in usernames
  50. usernames.push(message_row.to)
  51. Page.users.getAddress usernames, (addresses) =>
  52. for message_row in message_rows
  53. message_row.to_address = addresses[message_row.to]
  54. message_row.to_address ?= ""
  55. @syncMessages(message_rows)
  56. @has_more = limit and decrypted_messages.length > limit and not @nolimit_loaded
  57. Page.projector.scheduleRender()
  58. @loading = false
  59. @loaded = true
  60. if cb then cb(true)
  61. else
  62. if cb then cb(false)
  63. return @messages
  64. cleanupSecretsSent: (cb) ->
  65. if @has_more
  66. @reload = true
  67. @getMessages "nolimit", =>
  68. message_nums = @getMessagesBySender()
  69. Page.user.getDecryptedSecretsSent (secrets_sent) =>
  70. for address, secret of secrets_sent
  71. if message_nums[address] then continue # Has messages
  72. delete secrets_sent[address] # Cleanup from secret_sent
  73. @log "Cleanup sent secret sent", address
  74. if secret.indexOf(":") == -1 then continue # No secret_id saved, can't cleanip
  75. secret_id = Base64Number.toNumber(secret.replace(/:.*/, ""))
  76. @log "Cleanup secret", address, secret_id
  77. delete Page.user.data.secret[secret_id.toString()]
  78. # Save user's file
  79. Page.cmd "eciesEncrypt", [JSON.stringify(secrets_sent)], (secrets_sent_encrypted) =>
  80. if not secrets_sent_encrypted
  81. if cb then cb()
  82. return false
  83. Page.user.data["secrets_sent"] = secrets_sent_encrypted
  84. if cb then cb()
  85. getMessagesBySender: ->
  86. messages = {}
  87. for message in @messages
  88. messages[message.row.to_address] ?= []
  89. messages[message.row.to_address].push(message)
  90. return messages
  91. deleteMessage: (message) ->
  92. super
  93. delete Page.user.data.message[message.row.message_id]
  94. if not @has_more
  95. # Cleanup sent secrets if all message loaded
  96. senders = @getMessagesBySender()
  97. if not senders[message.row.to_address]
  98. @log "Removing sent secrets to user", message.row.to
  99. @cleanup = true
  100. save: ->
  101. if @cleanup
  102. @cleanupSecretsSent =>
  103. Page.user.saveData().then (res) =>
  104. @log "Delete result", res
  105. @cleanup = false
  106. else
  107. Page.user.saveData().then (res) =>
  108. @log "Delete result", res
  109. window.MessageListSent = MessageListSent