Mikael Nordfeldth
7c829852b8
Output selfLink from notice asActivity[Object]
2017-05-06 12:26:54 +02:00
Mikael Nordfeldth
8a4bec811b
Notices start saving selfLink from activities/objects
2017-05-06 12:15:54 +02:00
Mikael Nordfeldth
000af6d9ee
default to #addtag on !group mention
2017-05-02 21:21:53 +02:00
Mikael Nordfeldth
07458e5375
Fixed the parsing of ostatus:conversation etc.
...
Conversation will now start storing remote URL
The namespace features don't work the way they were written for here
so I fixed that, making the ostatus: namespace properly looked up and
then the homegrown getLink function looks for what is back-compat with
StatusNet etc. if I remember correctly.
2017-05-02 18:58:22 +02:00
Mikael Nordfeldth
979c525124
I like to throw exceptions instead of using if statements.
2017-05-02 09:07:39 +02:00
Mikael Nordfeldth
75079320d1
Give remote Atom URL for remote profile view
2017-04-09 12:13:53 +02:00
Mikael Nordfeldth
d2c7c83615
Merge branch 'nightly' of git.gnu.io:gnu/gnu-social into nightly
2017-04-06 13:34:57 +02:00
mmn
550606177b
Merge branch 'fixtests' into 'nightly'
...
Got Old Unittests Passing
See merge request !131
2017-04-06 10:23:12 +00:00
Mikael Nordfeldth
2ce2201496
Show full acct uri as html title on link mouseover
2017-04-06 11:45:58 +02:00
Thomas Karpiniec
47cd054976
Use the statusnet namespace for notice_id
2017-02-04 21:59:30 +11:00
Mikael Nordfeldth
a7043bf7cc
Split up source and source_link. Never trust HTML!
...
https://community.highlandarrow.com/notice/269667
or alternatively: https://social.umeahackerspace.se/conversation/495655
2016-09-02 01:00:52 +02:00
Mikael Nordfeldth
59b93b23e2
Split up source and source_link. Never trust HTML!
...
https://community.highlandarrow.com/notice/269667
or alternatively: https://social.umeahackerspace.se/conversation/495655
2016-09-02 00:55:46 +02:00
Mikael Nordfeldth
3b046ee49d
Shorthand function to check if notice has been repeated.
2016-08-27 14:42:28 +02:00
Nym Coy
1f866fcaed
ActivityGenerationTests.php fails but doesn't crash anymore.
...
Fixed an error where a profile id was reused after another profile was
deleted, and the new profile still had the deleted role.
Fixed ActivityGenerationTests::testNoticeInfoRepeated() which was passing
User instead of Profile, throwing errors.
tests/ActivityGenerationTests.php now passes.
CommandInterpreterTest now passes.
Moved JidValidateTest to XmppValidateTest, since Jabber functionality has
moved to the XmppPlugin. Tests work but don't pass, but they are at least
skipped if XmppPlugin is not active.
LocationTest passes, but the tests are not very good. Lots of nulls.
MediaFileTest passes.
NicknameTest passes. Nickname::normalize() now throws an error if the
nickname is too long with underscores.
UserFeedParseTest passes.
URLDetectionTest passes if $config['linkify']['(bare_ipv4|bare_ipv6|
bare_domains)'] are false. Untested otherwise.
Fixed Nickname::isBlacklisted() so it does not throw an error if
$config['nickname]['blacklist'] not set.
2016-08-14 11:55:49 +05:30
Mikael Nordfeldth
d84bf83419
Created function File->setTitle(str)
2016-07-23 21:00:57 +02:00
Mikael Nordfeldth
1b3d583418
file_quota for OembedPlugin too
...
Don't download huge files that might kill memory limits.
2016-07-21 03:19:05 +02:00
Mikael Nordfeldth
1981cb7662
Select the first generated thumbnail, which should be the proper size
...
...most of the time. If all works well.
2016-07-21 00:38:16 +02:00
Mikael Nordfeldth
f02d32b718
Reworked File->getUrl to throw exception
...
In case you require a local URL and one can't be generated, throw
FileNotStoredLocallyException(File $file)
2016-07-07 00:44:50 +02:00
Mikael Nordfeldth
b4a0bff740
Some mimetype madness!
2016-07-06 08:59:16 +02:00
Martin Lyth
b0204023c0
Fix the case of a call to sameAs()
2016-07-02 17:43:47 -04:00
Martin Lyth
c9afdae01c
Check if we're the current user before retrieving
2016-07-02 17:02:37 -04:00
Martin Lyth
a62755182c
Test user equality better in Profile->getUser()
2016-07-02 15:45:42 -04:00
Martin Lyth
d7a29be3ac
Change Profile->getUser() to match the current user
...
Profile->getUser() gets the User independently from common_current_user.
This means that changes to one does not affect the other, even if they
are the same user.
This changes that, so that getUser() returns common_current_user() if
they are both the same user.
This is done to fix a bug in the user profile settings, where changes in
the language and timezone are applied to the return value of
Profile->getUser() but not propagated to common_cur_user(), which causes
the profile settings to display incorrect information until the page is
refreshed.
2016-06-30 18:24:58 -04:00
Mikael Nordfeldth
3d6e25ee5f
We have to create and populate the Notice_location table before constraint checking foreign keys.
2016-06-25 13:01:56 +02:00
Mikael Nordfeldth
f93f02f424
Managed_DataObject now has getByUri()
2016-06-25 11:59:06 +02:00
Mikael Nordfeldth
42a62da764
getByUri shorthand function for Managed_DataObject (with uri)
2016-06-25 11:52:17 +02:00
Mikael Nordfeldth
7978cd6d59
s/EmptyIdException/EmptyPkeyValueException/
2016-06-25 11:50:59 +02:00
Mikael Nordfeldth
1dfac3ad63
Allow getting filesize by function
2016-06-24 15:53:23 +02:00
Stephen Paul Weber
47e541eaec
Allow getting notice title without implying one
...
Sometimes I just want explicit titles, and not the generated "blah posted on date" text
2016-06-10 21:00:01 +00:00
Mikael Nordfeldth
6d6db77f06
Documentation update in File class file
2016-05-04 11:44:14 +02:00
Mikael Nordfeldth
87dd0fbdb6
UseFileAsThumbnailException uses direct File object now
2016-05-04 11:34:50 +02:00
Mikael Nordfeldth
7aa9a69c2f
Link to attachment page instead of big-ass image
2016-05-01 11:35:51 +02:00
Mikael Nordfeldth
0959efd7be
Use constant for ATTN_PUBLIC (public collection)
2016-04-18 15:56:52 +02:00
Mikael Nordfeldth
c48508d590
use getByID (also bad variable reference)
2016-04-18 15:08:47 +02:00
Mikael Nordfeldth
6d33c003fc
Maybe stop deleteRelated from failing on constraint checking
2016-04-04 12:04:20 +02:00
Mikael Nordfeldth
195285ac2f
Fix constraint checking and only run it if not already constrained
2016-04-01 06:24:11 +02:00
Mikael Nordfeldth
8de3469957
Constraint check Notice table, need to get foreign key array!
2016-03-31 17:57:01 +02:00
Mikael Nordfeldth
2f91cb0df7
We should assume all verbs and such are their full URIs in our db
2016-03-29 12:57:52 +02:00
Mikael Nordfeldth
72cafe03e9
Index object_type too...
2016-03-29 12:48:25 +02:00
Mikael Nordfeldth
4e2be07234
Better indexing for Notice (performance++)
2016-03-29 12:13:33 +02:00
Mikael Nordfeldth
4790db348d
FetchRemoteNotice event call in Notice (not effective yet)
2016-03-27 14:00:05 +02:00
Mikael Nordfeldth
49a91885c9
Strictify Notice->isPublic()
2016-03-24 01:54:33 +01:00
Mikael Nordfeldth
6b4c331060
Attachment and file handling since we could get NULL instead of File
2016-03-23 17:53:38 +01:00
Mikael Nordfeldth
e32f2b0a39
Not really necessary in practice but makes better queries
2016-03-23 17:51:13 +01:00
Mikael Nordfeldth
250d99d997
Allow actions to be performed on updateWithKeys
...
Avoids overloading and lets dataobject classes use onUpdateKeys()
to do special stuff, like if a key is made up of a hash of other fields etc.
2016-03-23 15:19:50 +01:00
Mikael Nordfeldth
86ce93b376
Notice->deleteRelated should be called from delete()
2016-03-21 17:34:03 +01:00
Neil E. Hodges
39ebb64b85
Added proper enabling and disabling of sending RTs to Twitter.
2016-03-21 07:12:52 -07:00
Mikael Nordfeldth
566977c136
forgot 'new' after throw
2016-03-10 13:46:19 +01:00
Mikael Nordfeldth
15c16ac54e
Make sure File_thumbnail->getPath() doesn't throw NoResultException
2016-03-09 23:49:01 +01:00
Mikael Nordfeldth
a24c6fdb39
If our host matched in File lookup, it could throw exceptions on Router->map
2016-03-09 14:52:15 +01:00
Mikael Nordfeldth
e4310a57cd
Profile->noticeCount minor change
2016-03-08 20:00:58 +01:00
Mikael Nordfeldth
4360c65ed9
Super special case where we should copy files instead of mv
2016-03-08 01:59:58 +01:00
Mikael Nordfeldth
3b1181dae6
Display locally stored remote GIFs as thumbnails
...
Many newspapers seem to use animated GIFs as catchy header images, which
we would fail to show from oEmbed/OpenGraph fetching since they would
want us to "use File as Thumbnail", but the only place the image filename
was stored was in File_thumbnail, for the thumbnail of that file_id which
had a URL set.
2016-03-08 01:36:24 +01:00
Mikael Nordfeldth
4e5c0e70a6
fillConfigVoids to set default value of empty config options
2016-03-07 22:55:52 +01:00
Mikael Nordfeldth
265fa12917
Relatively experimental change to store thumbnails in 'file/thumb/' (by default)
2016-03-07 22:33:34 +01:00
Mikael Nordfeldth
a3b265a477
Portability for filepath in File
2016-03-07 20:13:07 +01:00
Mikael Nordfeldth
a0336ce48b
Unnecessary debug output
2016-03-06 18:15:36 +01:00
Mikael Nordfeldth
d9538183bd
Use information about activityschema public mention for Notice scope
2016-03-06 17:47:35 +01:00
Mikael Nordfeldth
6ec72b2978
Move mail_confirm_address out of mail.php
2016-03-06 17:27:40 +01:00
Mikael Nordfeldth
175b7e8541
Refactor some ConfirmaddressAction stuff
2016-03-02 15:31:48 +01:00
Mikael Nordfeldth
346a73c36f
Fix a regression in 1f76c1e4
that stopped sending email confirmation on registration
2016-03-02 14:38:34 +01:00
Mikael Nordfeldth
97d8e4571f
Fix a regression in 1f76c1e4
that stopped sending email confirmation on registration
2016-03-02 14:35:08 +01:00
Mikael Nordfeldth
53772ba305
Some rights one does not have if either sandboxed or silenced
2016-03-02 12:41:56 +01:00
Mikael Nordfeldth
d6598e790c
Introduce a ConfigException
2016-03-02 12:33:06 +01:00
Mikael Nordfeldth
9534969c05
Don't set is_local=LOCAL_NONPUBLIC on sandboxed user notices
...
Let's decide whether they are nonpublic by testing them when the notice
is shown instead.
2016-03-02 12:26:23 +01:00
Mikael Nordfeldth
79d68a52d0
No 'acct:' in FancyName please.
2016-03-02 10:49:33 +01:00
Mikael Nordfeldth
7ec69e4215
User->hasBlocked typing
2016-03-02 00:04:31 +01:00
Mikael Nordfeldth
99fbb181c1
Translation changes, use FancyName in email subject
2016-03-01 23:53:36 +01:00
Mikael Nordfeldth
4abb3f19bf
Make Profile->getFancyUrl() somewhat better on fallback
...
It tries to get a referential identifier apart from the fullname trying
with acct: URI, profile URL and lastly URI.
2016-03-01 23:48:32 +01:00
Mikael Nordfeldth
ddd60e7142
Make Profile->getFancyName() return including the acct URI
2016-03-01 23:37:38 +01:00
Mikael Nordfeldth
47f408ca7c
Strict typing for mail_notify_attn
2016-03-01 23:37:11 +01:00
Mikael Nordfeldth
e41809af89
Nothing interesting was made in this commit.
2016-03-01 16:30:00 +01:00
Mikael Nordfeldth
a112e7f9a4
Use another method of detecting unspecified defaultImage size
2016-03-01 15:00:52 +01:00
Mikael Nordfeldth
63c087a255
Consistent behaviour for ScopingNoticeStream $scoped
...
We don't guess the current profile anymore if the value of the profile === -1
Also sets $this->scoped for all ScopingNoticeStream inheritors, which just
like in an Action can be null if we're not scoped in any way (logged in).
2016-03-01 14:51:47 +01:00
Mikael Nordfeldth
52a3764ae4
Resolve relative URLs (assuming URI.Base==notice URL)
...
The real way to do this would be to get the xml:base property from
the Atom feed but it's probably not there in any posts we see today.
2016-02-26 14:46:26 +01:00
Mikael Nordfeldth
1e6520fddd
Woops, forgot to skip the / in path
2016-02-26 14:13:46 +01:00
Mikael Nordfeldth
6a4470912f
Fiddling with merge request #98 to use internal routing functions
2016-02-26 14:10:32 +01:00
Mikael Nordfeldth
8356c2495c
Use mb_* and strict === comparison
2016-02-26 13:52:25 +01:00
mmn
722ff4d9c0
Merge branch 'foolproof_file_redirection_branch' into 'nightly'
...
Foolproof file redirection
This solves an issue when our internal /attachment/{file_id} links are shortened with an remote shorteners (which caused the /attachment/{file_id} links to be saved to the File table and a thumbnail of a thumbnail being generated)
See merge request !98
2016-02-26 12:49:10 +00:00
mmn
fae9e27365
Merge branch 'group-autocomplete' into 'nightly'
...
Fix !group autocomplete
"Call to undefined method User_group::getFullname"
See merge request !108
2016-02-26 12:30:19 +00:00
Mikael Nordfeldth
c58228195b
Make sure the saved Notice has an ID
2016-02-26 01:11:20 +01:00
Mikael Nordfeldth
519e3308ab
Use mb_strlen to see if something is an empty string
2016-02-26 01:04:59 +01:00
Mikael Nordfeldth
aeb2e282db
Commented on the mime extension matching regexp
2016-02-25 22:32:54 +01:00
Mikael Nordfeldth
bac37d1714
syntax error
2016-02-25 22:17:44 +01:00
Mikael Nordfeldth
e6e1705852
Make uploads work properly if we accept _all_ attachment types
...
Also introduced $config['attachments']['extblacklist'] that can disable
certain file extensions (or rewrite them, for example php => phps)
2016-02-25 22:15:54 +01:00
Mikael Nordfeldth
6336248d71
Notice getRendered() can now be called on uninserted notices
2016-02-25 20:13:00 +01:00
Mikael Nordfeldth
e69f878241
Notice getRendered() can now be called on uninserted notices
2016-02-25 15:48:37 +01:00
Mikael Nordfeldth
e3e3a91734
Correct comment on Notice->conversation in table schema
2016-02-24 19:34:44 +01:00
Chimo
54da2526ed
Fix !group autocomplete
...
"Call to undefined method User_group::getFullname"
2016-02-24 13:00:15 -05:00
Mikael Nordfeldth
731fd01139
Allow easy fetching of rel="me" values
2016-02-24 16:42:54 +01:00
Mikael Nordfeldth
3ef573f67c
Default to profile size in Avatar::defaultAvatar
2016-02-24 16:42:35 +01:00
Mikael Nordfeldth
d672547112
getAliases should be only a list (numeric array)
2016-02-23 14:33:09 +01:00
Mikael Nordfeldth
b59dacb806
getAliases for Profile and Notice
...
Also move fancyurlfix into site-wide $config['fix']['fancyurls']
TODO: getByUri should make use of this directly I guess?
2016-02-23 14:00:59 +01:00
Mikael Nordfeldth
d16a883e17
Allow lookup of User->getByUri (throws NoResultException)
2016-02-21 18:47:47 +01:00
hannes
501d081d3b
getKV doesn't throw exception
2016-02-16 19:16:05 +00:00
Mikael Nordfeldth
83f679fb57
Profile->isPrivileged() to check if users have more rights than to post etc.
2016-02-12 14:47:49 +01:00
Mikael Nordfeldth
e5ad98e601
Silence action can only be used on non-priviliged users
2016-02-12 14:22:25 +01:00
Mikael Nordfeldth
5dce08d068
Add Profile::ensureCurrent() to verify we _certainly_ got a Profile.
2016-02-12 13:52:48 +01:00
Mikael Nordfeldth
733debd9b3
Use thumbnail upscaling config value
2016-02-10 04:40:54 +01:00
Mikael Nordfeldth
dd229e855a
Allow finding the "original remote thumbnail"
...
This will probably cause older oEmbed images not to show, since they
probably were updated to use empty url entries because they were thought
of as local ones. During a migration period maybe you want to change
the default value of notNullUrl to 'false' in File_thumbnail::byFile(...)
2016-02-10 04:37:43 +01:00
Mikael Nordfeldth
893d888152
Add urlhash field to File_thumbnail for indexing
2016-02-10 04:15:41 +01:00
Mikael Nordfeldth
49b7648fea
Managed_DataObject gets onInsert and onUpdate
2016-02-10 03:37:27 +01:00
Mikael Nordfeldth
ec257d940a
Either use or don't use HTTPS
...
The risk of injection attacks using HTTP is too great to allow a
site that allows both HTTP and HTTPS...
2016-02-10 00:57:39 +01:00
Mikael Nordfeldth
3dea259f52
Return intval from getID()
2016-02-08 12:21:46 +01:00
Mikael Nordfeldth
e903bd0bc3
Hacky support for geo URI detection
...
Won't work with common_purify yet because there is no geo uri scheme for it
2016-02-03 14:19:08 +01:00
Mikael Nordfeldth
6a4aa34b0c
Don't process further in redirection if HEAD gives 400 Bad request
2016-02-03 00:34:49 +01:00
Mikael Nordfeldth
40cffb9463
File::isProtected is static
2016-02-03 00:22:18 +01:00
Mikael Nordfeldth
c6ae883ad2
Don't trust local HTML either
...
If we reallyreally want to include <img> or <script> or whatever then we
have to do that after Notice::saveActivity sets ->rendered.
2016-01-30 00:00:37 +01:00
hannes
f708a5b016
Never save our /attachment/{file_id} links as links in the file table, return the old file
2016-01-29 00:36:30 +00:00
hannes
efd2326a29
the last url in the redirection chain can actually also be a redirection (e.g. if it's one of our /attachment/{file_id} links)
2016-01-29 00:34:32 +00:00
Mikael Nordfeldth
efe23ed404
updateWithKeys now understands multi-column keys
...
and automatically identifies _which_ columns are the right ones,
so for example 'uri' primary keys don't need to be explicitly set
2016-01-28 16:42:59 +01:00
hannes
a888294135
add our own protected urls
2016-01-25 19:00:46 +00:00
hannes
ca0c792ed3
File and File_redirection records are saved in File_redirection::where() now
2016-01-25 19:00:05 +00:00
hannes
48e1a2431b
save File and File_redirection records in File_redirection::where(), because then we will have to run where() over and over again
2016-01-25 18:55:48 +00:00
Mikael Nordfeldth
a9d18a077e
Harmonize, clarify, categorize URL schemes
...
Regular expression + avoid-redirection list now match each other.
2016-01-24 12:47:31 +01:00
Mikael Nordfeldth
1cec627d72
Allow bitcoin scheme to URLs
2016-01-24 12:44:28 +01:00
Mikael Nordfeldth
f74d2d555c
Working on some RSVP code stuff
2016-01-21 02:10:34 +01:00
Mikael Nordfeldth
5999171c11
Throw NoObjectTypeException on Notice->getObjectType if no string
2016-01-20 21:37:14 +01:00
Mikael Nordfeldth
7715ea993b
getVerb function in Notice class
2016-01-18 22:02:05 +01:00
Mikael Nordfeldth
6c46a93a81
Minor improvements on Notice::saveActivity
2016-01-18 19:29:45 +01:00
Mikael Nordfeldth
11b925c4ca
Use a function to getCreated()
2016-01-18 17:03:37 +01:00
Mikael Nordfeldth
deda83fdef
Distinguish notice saving errors from others for Salmon
2016-01-16 22:39:04 +01:00
Mikael Nordfeldth
a85a08ff35
Add a check in Notice->asActivityObject that we're actually returning such a thing!
2016-01-16 21:13:26 +01:00
Mikael Nordfeldth
fdfa71a033
Extremely verbose debugging is annoying
2016-01-16 18:04:04 +01:00
Mikael Nordfeldth
1f76c1e4a9
Initial user doesn't need as strict checking on email
2016-01-16 17:23:50 +01:00
Mikael Nordfeldth
0caf0612d0
Make Twitter Media upload API v1.1 reach us
...
Now we just have to accept the 'media' or 'media_data' (base64 encoded)
POST arguments instead of $_FILES uploads.
2016-01-14 18:29:21 +01:00
Mikael Nordfeldth
45dd343126
Eventify Notice getAsTimestamp (for Deleted_notice)
2016-01-13 21:01:47 +01:00
Mikael Nordfeldth
961725205d
Try if Profile is a Person (in effect ActivityObject::PERSON)
2016-01-13 18:34:48 +01:00
Mikael Nordfeldth
e75472f460
Use the upstream function to get effectiveUrl
2016-01-13 14:00:05 +01:00
Mikael Nordfeldth
b696fb4eb1
Mimetypes like image/svg+xml were misinterpreted when guessing
...
We don't really need the mb_ in mb_strtolower but what the heck, why not. I love Unicode.
2016-01-12 13:46:25 +01:00
Mikael Nordfeldth
93c614c184
Do updateWithKeys properly if someone would like to update PRI
2016-01-11 19:52:33 +01:00
Mikael Nordfeldth
67801a5566
Not only local groups should be added to group inbox notificiation table
2016-01-09 15:14:38 +01:00
Mikael Nordfeldth
5ef10a14ef
Get group attentions too for outbound notices
2016-01-09 15:06:44 +01:00
Mikael Nordfeldth
c3c5a9974d
Do proper fromUri lookup on groups too
2016-01-09 14:36:47 +01:00
Mikael Nordfeldth
d1e609a886
Local user profile getUrl gives dynamically generated URL
2016-01-09 13:47:38 +01:00
Mikael Nordfeldth
f143925931
Actually return the group home URL
2016-01-09 13:33:30 +01:00
Mikael Nordfeldth
28cd5640c1
Save attentions to Reply table for backwards compatibility
...
local users only of course
2016-01-08 01:59:16 +01:00
Mikael Nordfeldth
c48871cf1b
Notice from web now saves context->attention too! ;)
2016-01-07 23:24:15 +01:00
Mikael Nordfeldth
6255e1dca3
saveAttentions, trying to move away from saveReply
2016-01-07 23:23:51 +01:00
Mikael Nordfeldth
3eebf2a353
Don't store the notice object for distrib queue handler, just id
2016-01-07 20:24:59 +01:00
Mikael Nordfeldth
d4be5349b3
think I have managed to show oEmbed images better now
2016-01-07 17:35:37 +01:00
Mikael Nordfeldth
9e5c71e701
Fixed group representation in Directory plugin, also some ->raw calls
2016-01-07 12:58:14 +01:00
Mikael Nordfeldth
839ae571d8
Define User_group::$profile_id among class variables
2016-01-07 12:12:27 +01:00
Mikael Nordfeldth
94392ab00c
Index the verb column since we do COUNT(*) based on it
2016-01-07 11:39:46 +01:00
Mikael Nordfeldth
05d3622939
Conversation entries where id==0 would screw up the "re-auto-increment" sequencing
2016-01-06 22:26:17 +01:00
Mikael Nordfeldth
f1c4c64cd9
Don't update stored URLs just because we have a filename
...
This would overwrite remote URLs with local verisons which removes source href...
The reason one might have filenames for remote URLs is that StoreRemoteMedia plugin
fetches them and uses the filename field.
2016-01-06 19:24:03 +01:00
Mikael Nordfeldth
346e34e543
Return dynamically generated URLs for thumbnails for all locally stored entries
2016-01-06 19:06:29 +01:00
Mikael Nordfeldth
4352d1739d
Always generate notice URLs on the fly for local notices
...
Related to issue #118
2016-01-06 16:24:33 +01:00
Mikael Nordfeldth
1a1e44cdfd
Issue #118 wanted better TOR support, now Avatar URLs are not stored
...
There was no reason to store the generated Avatar URLs because it's so
cheap to generate them on the fly.
2016-01-06 16:14:26 +01:00
Mikael Nordfeldth
7b2036a4b5
Note in the debug log if we render the HTML of a message
2016-01-06 15:37:30 +01:00