Skip to content

Commit 9844976

Browse files
committedJan 20, 2022
Add ability to scan Flarum 1.2 and Webpack 5
1 parent e83e974 commit 9844976

9 files changed

+543
-38
lines changed
 

‎app/Beta8JavascriptFileParser.php

+63-31
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,12 @@ public function extensions(): array
1818
// A module import part is always added before and after each extension import
1919
// in https://github.com/flarum/core/blob/master/src/Extend/Frontend.php
2020
// Since beta 14, there are a lot less semicolumns because of https://github.com/flarum/core/pull/2280
21-
if (preg_match_all('~var\s+module={};?\s*(module\.exports[\s\S]+?;)\s*flarum\.extensions\[[\'"]([^\'"]+)[\'"]\]\s*=\s*module\.exports;?~m', $this->content, $matches, PREG_SET_ORDER) <= 0) {
22-
return [];
23-
}
21+
preg_match_all('~var\s+module={};?\s*(module\.exports[\s\S]+?;)\s*flarum\.extensions\[[\'"]([^\'"]+)[\'"]]\s*=\s*module\.exports;?~m', $this->content, $matches1, PREG_SET_ORDER);
22+
23+
// With webpack 5, the common format has changed, the dist file no longer starts with module.exports=[...]
24+
// Instead, it's an immediately invoked function (()=>{[...]module.exports=n})();
25+
// There is sometimes a comment before the module, like "/*! For license information please see admin.js.LICENSE.txt */"
26+
preg_match_all('~var\s+module={};?\s*((?:/\*![\s\S]+?\*/\s*)?\(\(\)=>\{[\s\S]+?module\.exports=.{1,2}}\)\(\);)\s*flarum\.extensions\[[\'"]([^\'"]+)[\'"]]\s*=\s*module\.exports;?~m', $this->content, $matches2, PREG_SET_ORDER);
2427

2528
return array_map(function (array $match) {
2629
$content = $match[1];
@@ -36,41 +39,51 @@ public function extensions(): array
3639
'size' => mb_strlen($match[0], '8bit'),
3740
'dev' => str_contains($content, '/******/'),
3841
];
39-
}, $matches);
42+
}, array_merge($matches1, $matches2));
4043
}
4144

4245
public function coreSize(): array
4346
{
44-
// We detect the end of the core javascript by its known content
45-
// 1.1.0 forum: $e=n(74);De.app=je;var Ie=Object($e.a)(De,"forum")}]);
46-
// 1.1.0 admin: Dt=n(74);At.app=jt;var Pt=Object(Dt.a)(At,"admin")}]);
47-
// 1.0.0 forum: $e=n(73);De.app=je;var Ie=Object($e.a)(De,"forum")}]);
48-
// 1.0.0 admin: kt=n(73);Ct.app=_t;var jt=Object(kt.a)(Ct,"admin")}]);
49-
// Beta 15 forum: window.app=Fe,He.app=Fe;var qe=Object(Ue.a)(He,"forum")}]);
50-
// Beta 15 admin: window.app=Tt,xt.app=Tt;var Nt=Object(Ot.a)(xt,"admin")}]);
51-
// Beta 14.1 forum: window.app=Fe,Ue.app=Fe}]);
52-
// Beta 14.1 admin: window.app=dt,lt.app=dt}]);
53-
// Beta 14 forum: window.app=Fe,Ue.app=Fe}]);
54-
// Beta 14 admin: window.app=dt,lt.app=dt}]);
55-
// Beta 13 forum: (e,"compat",(function(){return he}))}]);
56-
// Beta 13 admin: (e,"compat",(function(){return ct}))}]);
57-
// Beta 12 forum: (e,"compat",(function(){return he}))}]);
58-
// Beta 12 admin: (e,"compat",(function(){return ct}))}]);
59-
// Beta 11 forum: (e,"compat",function(){return he})}]);
60-
// Beta 11 admin: (e,"compat",function(){return ct})}]);
61-
// Beta 10 forum: (e,"compat",function(){return he})}]);
62-
// Beta 10 admin: (e,"compat",function(){return ct})}]);
63-
// Beta 09 forum: (e,"compat",function(){return he})}]);
64-
// Beta 09 admin: (e,"compat",function(){return ct})}]);
65-
// Beta 08 forum: (e,"compat",function(){return he})}]);
66-
// Beta 08 admin: (e,"compat",function(){return lt})}]);
67-
// We also know everything between core and the first module will be TextFormatter
6847
// We truncate the input with substr because otherwise it's possible to reach pcre.backtrack_limit
6948
// We know Flarum's largest core JS is around 360kB and we're going to be generous and allow 240kB of TextFormatter, which is unlikely
70-
$preg = preg_match('~^([\s\S]*(?:\(e,"compat",\(?function\(\)\{return [a-z]{2}\}\)\)?|(?:window\.app=[A-Za-z]{2},|[$A-Za-z]{2}=n\([0-9]{2}\);)[A-Za-z]{2}\.app=[_A-Za-z]{2})(?:;var [A-Za-z]{2}=Object\([$A-Za-z]{2}\.a\)\([A-Za-z]{2},"(?:forum|admin)"\))?\}\]\);)([\s\S]*?)var\s+module\s*=\s*\{\}~m', mb_substr($this->content, 0, 600000, '8bit'), $matches);
49+
$areaOfInterest = mb_substr($this->content, 0, 600000, '8bit');
7150

72-
if ($preg === false) {
73-
throw new \Exception(preg_last_error_msg());
51+
// We detect the end of the core javascript by its known content
52+
// Core and its ending sequence will be captured as group 1
53+
// We also know everything between core and the first module will be TextFormatter, this is capture group 2
54+
// 1.2.0 forum: ;ki.app=ii;var Ei=vi(ki,"forum")})(),flarum.core=r})();
55+
// 1.2.0 admin: ;$r.app=dr;var Rr=Pr($r,"admin")})(),flarum.core=r})();
56+
$preg = $this->pregMatch('~^([\s\S]*var [A-Za-z]{2}=[A-Za-z]{2}\([$A-Za-z]{2},"(?:forum|admin)"\)\}\)\(\),flarum\.core=[a-z]\}\)\(\);)([\s\S]*?)var\s+module\s*=\s*\{\}~m', $areaOfInterest, $matches);
57+
58+
// Older Flarum versions are handled with separate regexes because it's becoming too difficult to maintain as a single regex
59+
if ($preg !== 1) {
60+
// 1.1.0 forum: $e=n(74);De.app=je;var Ie=Object($e.a)(De,"forum")}]);
61+
// 1.1.0 admin: Dt=n(74);At.app=jt;var Pt=Object(Dt.a)(At,"admin")}]);
62+
// 1.0.0 forum: $e=n(73);De.app=je;var Ie=Object($e.a)(De,"forum")}]);
63+
// 1.0.0 admin: kt=n(73);Ct.app=_t;var jt=Object(kt.a)(Ct,"admin")}]);
64+
// Beta 15 forum: window.app=Fe,He.app=Fe;var qe=Object(Ue.a)(He,"forum")}]);
65+
// Beta 15 admin: window.app=Tt,xt.app=Tt;var Nt=Object(Ot.a)(xt,"admin")}]);
66+
// Beta 14.1 forum: window.app=Fe,Ue.app=Fe}]);
67+
// Beta 14.1 admin: window.app=dt,lt.app=dt}]);
68+
// Beta 14 forum: window.app=Fe,Ue.app=Fe}]);
69+
// Beta 14 admin: window.app=dt,lt.app=dt}]);
70+
$preg = $this->pregMatch('~^([\s\S]*(?:(?:window\.app=[A-Za-z]{2},|[$A-Za-z]{2}=n\([0-9]{2}\);)[A-Za-z]{2}\.app=[_A-Za-z]{2})(?:;var [A-Za-z]{2}=Object\([$A-Za-z]{2}\.a\)\([A-Za-z]{2},"(?:forum|admin)"\))?\}\]\);)([\s\S]*?)var\s+module\s*=\s*\{\}~m', $areaOfInterest, $matches);
71+
}
72+
73+
if ($preg !== 1) {
74+
// Beta 13 forum: (e,"compat",(function(){return he}))}]);
75+
// Beta 13 admin: (e,"compat",(function(){return ct}))}]);
76+
// Beta 12 forum: (e,"compat",(function(){return he}))}]);
77+
// Beta 12 admin: (e,"compat",(function(){return ct}))}]);
78+
// Beta 11 forum: (e,"compat",function(){return he})}]);
79+
// Beta 11 admin: (e,"compat",function(){return ct})}]);
80+
// Beta 10 forum: (e,"compat",function(){return he})}]);
81+
// Beta 10 admin: (e,"compat",function(){return ct})}]);
82+
// Beta 09 forum: (e,"compat",function(){return he})}]);
83+
// Beta 09 admin: (e,"compat",function(){return ct})}]);
84+
// Beta 08 forum: (e,"compat",function(){return he})}]);
85+
// Beta 08 admin: (e,"compat",function(){return lt})}]);
86+
$preg = $this->pregMatch('~^([\s\S]*\(e,"compat",\(?function\(\)\{return [a-z]{2}\}\)\)?\}\]\);)([\s\S]*?)var\s+module\s*=\s*\{\}~m', $areaOfInterest, $matches);
7487
}
7588

7689
if ($preg !== 1) {
@@ -124,4 +137,23 @@ public function coreSize(): array
124137

125138
return $modules;
126139
}
140+
141+
/**
142+
* Wraps preg_match with an exception
143+
* @param string $pattern
144+
* @param string $subject
145+
* @param $matches
146+
* @return int
147+
* @throws \Exception
148+
*/
149+
protected function pregMatch(string $pattern, string $subject, &$matches): int
150+
{
151+
$preg = preg_match($pattern, $subject, $matches);
152+
153+
if ($preg === false) {
154+
throw new \Exception(preg_last_error_msg());
155+
}
156+
157+
return $preg;
158+
}
127159
}

‎app/FlarumVersion.php

+3
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ class FlarumVersion
2525
const V1_0_4 = "1.0.4";
2626
const V1_1_0 = "1.1.0";
2727
const V1_1_1 = "1.1.1";
28+
const V1_2_0 = "1.2.0";
2829

2930
// MD5 hash of the javascript of Flarum core, excluding the sourcemap declaration
3031
// Obtained through the GetCoreJavascriptHash command
@@ -43,6 +44,7 @@ class FlarumVersion
4344
'210e1cab71dfa71126a6dfbe8f5f6dff' => self::V1_0_2,
4445
'7fd38d2d84278f0c3aa30ea7d5eab99b' => [self::V1_0_3, self::V1_0_4],
4546
'c3d9c002b7b0b12c3c967723ac41ec77' => [self::V1_1_0, self::V1_1_1],
47+
'7ce80a4947d0a9d3ed59f1c983d6306c' => [self::V1_2_0],
4648
];
4749

4850
public array $adminJavascriptHashes = [
@@ -60,6 +62,7 @@ class FlarumVersion
6062
'db21719109058a04bc1fbb2bfb5b35a7' => self::V1_0_1,
6163
'40083f039fe8ec6990aa9fe5095707fa' => [self::V1_0_3, self::V1_0_4],
6264
'74fc375900d66b7c4f14a4aead2febc2' => [self::V1_1_0, self::V1_1_1],
65+
'd2f45e06f2914e9347c95a440e31ac6c' => [self::V1_2_0],
6366
];
6467

6568
public static function isBeta7(array $versions): bool

‎app/FlarumVersionGuesser.php

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public function guess(string $html, string $bootScript): array
1717
return [
1818
FlarumVersion::V1_1_0,
1919
FlarumVersion::V1_1_1,
20+
FlarumVersion::V1_2_0,
2021
];
2122
}
2223

‎tests/Unit/FlarumVersionGuesserTest.php

+13-4
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,7 @@
99

1010
class FlarumVersionGuesserTest extends TestCase
1111
{
12-
/**
13-
* @var $guesser FlarumVersionGuesser
14-
*/
15-
protected $guesser;
12+
protected FlarumVersionGuesser $guesser;
1613

1714
protected function setUp(): void
1815
{
@@ -498,6 +495,18 @@ function testV110Typical()
498495
$this->assertEquals([
499496
FlarumVersion::V1_1_0,
500497
FlarumVersion::V1_1_1,
498+
FlarumVersion::V1_2_0,
499+
], $this->guesser->guess($html, $html));
500+
}
501+
502+
function testV120Typical()
503+
{
504+
$html = file_get_contents(__DIR__ . '/version-guesser/1.2.0-typical.html');
505+
506+
$this->assertEquals([
507+
FlarumVersion::V1_1_0,
508+
FlarumVersion::V1_1_1,
509+
FlarumVersion::V1_2_0,
501510
], $this->guesser->guess($html, $html));
502511
}
503512
}

‎tests/Unit/JavascriptParserTest.php

+48
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,54 @@
77

88
class JavascriptParserTest extends TestCase
99
{
10+
public function testV1_2ForumParser()
11+
{
12+
$parser = new Beta8JavascriptFileParser(file_get_contents(__DIR__ . '/javascript-parser/1.2.0-typical-forum.js'));
13+
14+
$this->assertEquals([
15+
[
16+
'id' => 'flarum-tags',
17+
'checksum' => '1f4b16168c3f5e4dd941af671ce63987',
18+
'size' => 29389,
19+
'dev' => false,
20+
],
21+
], $parser->extensions());
22+
23+
$this->assertEquals([
24+
[
25+
'id' => 'core',
26+
'checksum' => '7ce80a4947d0a9d3ed59f1c983d6306c',
27+
'size' => 391876,
28+
],
29+
[
30+
'id' => 'textformatter',
31+
'size' => 46873,
32+
],
33+
], $parser->coreSize());
34+
}
35+
36+
public function testV1_2AdminParser()
37+
{
38+
$parser = new Beta8JavascriptFileParser(file_get_contents(__DIR__ . '/javascript-parser/1.2.0-typical-admin.js'));
39+
40+
$this->assertEquals([
41+
[
42+
'id' => 'flarum-tags',
43+
'checksum' => '746938ef3c28ade09d31da6bb658a39c',
44+
'size' => 52017,
45+
'dev' => false,
46+
],
47+
], $parser->extensions());
48+
49+
$this->assertEquals([
50+
[
51+
'id' => 'core',
52+
'checksum' => 'd2f45e06f2914e9347c95a440e31ac6c',
53+
'size' => 324971,
54+
],
55+
], $parser->coreSize());
56+
}
57+
1058
public function testV1ForumParser()
1159
{
1260
$parser = new Beta8JavascriptFileParser(file_get_contents(__DIR__ . '/javascript-parser/1.0.0-typical-forum.js'));

‎tests/Unit/javascript-parser/1.2.0-typical-admin.js

+13
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎tests/Unit/javascript-parser/1.2.0-typical-forum.js

+276
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎tests/Unit/version-guesser/1.1.0-typical.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html dir="ltr" lang="en" >
33
<head>
44
<meta charset="utf-8">
5-
<title>Flarum 1.0</title>
5+
<title>Flarum 1.1</title>
66

77
<link rel="stylesheet" href="http://1.1.flarum.localhost/assets/forum.css?v=ab911cbc">
88
<link rel="canonical" href="http://1.1.flarum.localhost">
@@ -28,7 +28,7 @@
2828
<div class="container">
2929
<h1 class="Header-title">
3030
<a href="http://1.1.flarum.localhost" id="home-link">
31-
Flarum 1.0
31+
Flarum 1.1
3232
</a>
3333
</h1>
3434
<div id="header-primary" class="Header-primary"></div>
@@ -106,7 +106,7 @@ <h2>All Discussions</h2>
106106
document.getElementById('flarum-loading').style.display = 'none';
107107

108108
try {
109-
flarum.core.app.load({"resources":[{"type":"forums","id":"1","attributes":{"title":"Flarum 1.0","description":"","showLanguageSelector":true,"baseUrl":"http:\/\/1.1.flarum.localhost","basePath":"","debug":false,"apiUrl":"http:\/\/1.1.flarum.localhost\/api","welcomeTitle":"Welcome to Flarum 1.0","welcomeMessage":"Enjoy your new forum! Hop over to discuss.flarum.org if you have any questions, or to join our community!","themePrimaryColor":"#4D698E","themeSecondaryColor":"#4D698E","logoUrl":null,"faviconUrl":null,"headerHtml":null,"footerHtml":null,"allowSignUp":true,"defaultRoute":"\/all","canViewForum":true,"canStartDiscussion":false,"canSearchUsers":false,"canViewFlags":false,"guidelinesUrl":null,"flarum-markdown.mdarea":true,"allowUsernameMentionFormat":true,"canBypassTagCounts":false,"minPrimaryTags":"1","maxPrimaryTags":"1","minSecondaryTags":"0","maxSecondaryTags":"3"},"relationships":{"groups":{"data":[{"type":"groups","id":"1"},{"type":"groups","id":"2"},{"type":"groups","id":"3"},{"type":"groups","id":"4"}]},"tags":{"data":[{"type":"tags","id":"1"}]}}},{"type":"groups","id":"1","attributes":{"nameSingular":"Admin","namePlural":"Admins","color":"#B72A2A","icon":"fas fa-wrench","isHidden":0}},{"type":"groups","id":"2","attributes":{"nameSingular":"Guest","namePlural":"Guests","color":null,"icon":null,"isHidden":0}},{"type":"groups","id":"3","attributes":{"nameSingular":"Member","namePlural":"Members","color":null,"icon":null,"isHidden":0}},{"type":"groups","id":"4","attributes":{"nameSingular":"Mod","namePlural":"Mods","color":"#80349E","icon":"fas fa-bolt","isHidden":0}},{"type":"tags","id":"1","attributes":{"name":"General","description":null,"slug":"general","color":"#888","backgroundUrl":null,"backgroundMode":null,"icon":null,"discussionCount":1,"position":0,"defaultSort":null,"isChild":false,"isHidden":false,"lastPostedAt":"2021-10-23T12:15:36+00:00","canStartDiscussion":false,"canAddToDiscussion":false}}],"session":{"userId":0,"csrfToken":"KLD1eSTgUOH1V41J23fIZ2V0rgunqUzsrVPpcC1u"},"locales":{"en":"English"},"locale":"en","apiDocument":{"links":{"first":"http:\/\/1.1.flarum.localhost\/api\/discussions?sort=\u0026page%5Blimit%5D=20"},"data":[{"type":"discussions","id":"1","attributes":{"title":"First discussion","slug":"1-first-discussion","commentCount":1,"participantCount":1,"createdAt":"2021-10-23T12:15:36+00:00","lastPostedAt":"2021-10-23T12:15:36+00:00","lastPostNumber":1,"canReply":false,"canRename":false,"canDelete":false,"canHide":false,"isApproved":true,"isLocked":false,"canLock":false,"isSticky":false,"canSticky":false,"subscription":null,"canTag":false},"relationships":{"user":{"data":{"type":"users","id":"1"}},"lastPostedUser":{"data":{"type":"users","id":"1"}},"firstPost":{"data":{"type":"posts","id":"1"}},"tags":{"data":[{"type":"tags","id":"1"}]}}}],"included":[{"type":"users","id":"1","attributes":{"username":"Admin","displayName":"Admin","avatarUrl":null,"slug":"Admin"}},{"type":"posts","id":"1","attributes":{"number":1,"createdAt":"2021-10-23T12:15:36+00:00","contentType":"comment","contentHtml":"\u003Cp\u003EHello World\u003C\/p\u003E"}},{"type":"tags","id":"1","attributes":{"name":"General","description":null,"slug":"general","color":"#888","backgroundUrl":null,"backgroundMode":null,"icon":null,"discussionCount":1,"position":0,"defaultSort":null,"isChild":false,"isHidden":false,"lastPostedAt":"2021-10-23T12:15:36+00:00","canStartDiscussion":false,"canAddToDiscussion":false}}]}});
109+
flarum.core.app.load({"resources":[{"type":"forums","id":"1","attributes":{"title":"Flarum 1.1","description":"","showLanguageSelector":true,"baseUrl":"http:\/\/1.1.flarum.localhost","basePath":"","debug":false,"apiUrl":"http:\/\/1.1.flarum.localhost\/api","welcomeTitle":"Welcome to Flarum 1.1","welcomeMessage":"Enjoy your new forum! Hop over to discuss.flarum.org if you have any questions, or to join our community!","themePrimaryColor":"#4D698E","themeSecondaryColor":"#4D698E","logoUrl":null,"faviconUrl":null,"headerHtml":null,"footerHtml":null,"allowSignUp":true,"defaultRoute":"\/all","canViewForum":true,"canStartDiscussion":false,"canSearchUsers":false,"canViewFlags":false,"guidelinesUrl":null,"flarum-markdown.mdarea":true,"allowUsernameMentionFormat":true,"canBypassTagCounts":false,"minPrimaryTags":"1","maxPrimaryTags":"1","minSecondaryTags":"0","maxSecondaryTags":"3"},"relationships":{"groups":{"data":[{"type":"groups","id":"1"},{"type":"groups","id":"2"},{"type":"groups","id":"3"},{"type":"groups","id":"4"}]},"tags":{"data":[{"type":"tags","id":"1"}]}}},{"type":"groups","id":"1","attributes":{"nameSingular":"Admin","namePlural":"Admins","color":"#B72A2A","icon":"fas fa-wrench","isHidden":0}},{"type":"groups","id":"2","attributes":{"nameSingular":"Guest","namePlural":"Guests","color":null,"icon":null,"isHidden":0}},{"type":"groups","id":"3","attributes":{"nameSingular":"Member","namePlural":"Members","color":null,"icon":null,"isHidden":0}},{"type":"groups","id":"4","attributes":{"nameSingular":"Mod","namePlural":"Mods","color":"#80349E","icon":"fas fa-bolt","isHidden":0}},{"type":"tags","id":"1","attributes":{"name":"General","description":null,"slug":"general","color":"#888","backgroundUrl":null,"backgroundMode":null,"icon":null,"discussionCount":1,"position":0,"defaultSort":null,"isChild":false,"isHidden":false,"lastPostedAt":"2021-10-23T12:15:36+00:00","canStartDiscussion":false,"canAddToDiscussion":false}}],"session":{"userId":0,"csrfToken":"KLD1eSTgUOH1V41J23fIZ2V0rgunqUzsrVPpcC1u"},"locales":{"en":"English"},"locale":"en","apiDocument":{"links":{"first":"http:\/\/1.1.flarum.localhost\/api\/discussions?sort=\u0026page%5Blimit%5D=20"},"data":[{"type":"discussions","id":"1","attributes":{"title":"First discussion","slug":"1-first-discussion","commentCount":1,"participantCount":1,"createdAt":"2021-10-23T12:15:36+00:00","lastPostedAt":"2021-10-23T12:15:36+00:00","lastPostNumber":1,"canReply":false,"canRename":false,"canDelete":false,"canHide":false,"isApproved":true,"isLocked":false,"canLock":false,"isSticky":false,"canSticky":false,"subscription":null,"canTag":false},"relationships":{"user":{"data":{"type":"users","id":"1"}},"lastPostedUser":{"data":{"type":"users","id":"1"}},"firstPost":{"data":{"type":"posts","id":"1"}},"tags":{"data":[{"type":"tags","id":"1"}]}}}],"included":[{"type":"users","id":"1","attributes":{"username":"Admin","displayName":"Admin","avatarUrl":null,"slug":"Admin"}},{"type":"posts","id":"1","attributes":{"number":1,"createdAt":"2021-10-23T12:15:36+00:00","contentType":"comment","contentHtml":"\u003Cp\u003EHello World\u003C\/p\u003E"}},{"type":"tags","id":"1","attributes":{"name":"General","description":null,"slug":"general","color":"#888","backgroundUrl":null,"backgroundMode":null,"icon":null,"discussionCount":1,"position":0,"defaultSort":null,"isChild":false,"isHidden":false,"lastPostedAt":"2021-10-23T12:15:36+00:00","canStartDiscussion":false,"canAddToDiscussion":false}}]}});
110110
flarum.core.app.bootExtensions(flarum.extensions);
111111
flarum.core.app.boot();
112112
} catch (e) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
<!doctype html>
2+
<html dir="ltr" lang="en" >
3+
<head>
4+
<meta charset="utf-8">
5+
<title>Flarum 1.2</title>
6+
7+
<link rel="stylesheet" href="http://1.2.flarum.localhost/assets/forum.css?v=dc6bf24a">
8+
<link rel="canonical" href="http://1.2.flarum.localhost">
9+
<link rel="preload" href="http://1.2.flarum.localhost/assets/forum.css?v=dc6bf24a" as="style">
10+
<link rel="preload" href="http://1.2.flarum.localhost/assets/forum.js?v=af4dedb1" as="script">
11+
<link rel="preload" href="http://1.2.flarum.localhost/assets/forum-en.js?v=2ee84075" as="script">
12+
<link rel="preload" href="http://1.2.flarum.localhost/assets/fonts/fa-solid-900.woff2" as="font" type="font/woff2" crossorigin="">
13+
<link rel="preload" href="http://1.2.flarum.localhost/assets/fonts/fa-regular-400.woff2" as="font" type="font/woff2" crossorigin="">
14+
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1">
15+
<meta name="description" content="">
16+
<meta name="theme-color" content="#4D698E">
17+
</head>
18+
19+
<body>
20+
<div id="app" class="App">
21+
22+
<div id="app-navigation" class="App-navigation"></div>
23+
24+
<div id="drawer" class="App-drawer">
25+
26+
<header id="header" class="App-header">
27+
<div id="header-navigation" class="Header-navigation"></div>
28+
<div class="container">
29+
<h1 class="Header-title">
30+
<a href="http://1.2.flarum.localhost" id="home-link">
31+
Flarum 1.2
32+
</a>
33+
</h1>
34+
<div id="header-primary" class="Header-primary"></div>
35+
<div id="header-secondary" class="Header-secondary"></div>
36+
</div>
37+
</header>
38+
39+
</div>
40+
41+
<main class="App-content">
42+
<div id="content"></div>
43+
44+
<div id="flarum-loading" style="display: none">
45+
Loading...
46+
</div>
47+
48+
<noscript>
49+
<div class="Alert">
50+
<div class="container">
51+
This site is best viewed in a modern browser with JavaScript enabled.
52+
</div>
53+
</div>
54+
</noscript>
55+
56+
<div id="flarum-loading-error" style="display: none">
57+
<div class="Alert">
58+
<div class="container">
59+
Something went wrong while trying to load the full version of this site. Try hard-refreshing this page to fix the error.
60+
</div>
61+
</div>
62+
</div>
63+
64+
<noscript id="flarum-content">
65+
<div class="container">
66+
<h2>All Discussions</h2>
67+
68+
<ul>
69+
<li>
70+
<a href="http://1.2.flarum.localhost/d/1-first-discussion">
71+
First discussion
72+
</a>
73+
</li>
74+
</ul>
75+
76+
77+
</div>
78+
79+
</noscript>
80+
81+
82+
<div class="App-composer">
83+
<div class="container">
84+
<div id="composer"></div>
85+
</div>
86+
</div>
87+
</main>
88+
89+
</div>
90+
91+
92+
93+
94+
<div id="modal"></div>
95+
<div id="alerts"></div>
96+
97+
<script>
98+
document.getElementById('flarum-loading').style.display = 'block';
99+
var flarum = {extensions: {}};
100+
</script>
101+
102+
<script src="http://1.2.flarum.localhost/assets/forum.js?v=af4dedb1"></script>
103+
<script src="http://1.2.flarum.localhost/assets/forum-en.js?v=2ee84075"></script>
104+
105+
<script>
106+
document.getElementById('flarum-loading').style.display = 'none';
107+
108+
try {
109+
flarum.core.app.load({"resources":[{"type":"forums","id":"1","attributes":{"title":"Flarum 1.2","description":"","showLanguageSelector":true,"baseUrl":"http:\/\/1.2.flarum.localhost","basePath":"","debug":false,"apiUrl":"http:\/\/1.2.flarum.localhost\/api","welcomeTitle":"Welcome to Flarum 1.2","welcomeMessage":"Enjoy your new forum! Hop over to discuss.flarum.org if you have any questions, or to join our community!","themePrimaryColor":"#4D698E","themeSecondaryColor":"#4D698E","logoUrl":null,"faviconUrl":null,"headerHtml":null,"footerHtml":null,"allowSignUp":true,"defaultRoute":"\/all","canViewForum":true,"canStartDiscussion":false,"canSearchUsers":false,"canViewFlags":false,"guidelinesUrl":null,"allowUsernameMentionFormat":true,"canBypassTagCounts":false,"minPrimaryTags":"1","maxPrimaryTags":"1","minSecondaryTags":"0","maxSecondaryTags":"3"},"relationships":{"groups":{"data":[{"type":"groups","id":"1"},{"type":"groups","id":"2"},{"type":"groups","id":"3"},{"type":"groups","id":"4"}]},"tags":{"data":[{"type":"tags","id":"1"}]}}},{"type":"groups","id":"1","attributes":{"nameSingular":"Admin","namePlural":"Admins","color":"#B72A2A","icon":"fas fa-wrench","isHidden":0}},{"type":"groups","id":"2","attributes":{"nameSingular":"Guest","namePlural":"Guests","color":null,"icon":null,"isHidden":0}},{"type":"groups","id":"3","attributes":{"nameSingular":"Member","namePlural":"Members","color":null,"icon":null,"isHidden":0}},{"type":"groups","id":"4","attributes":{"nameSingular":"Mod","namePlural":"Mods","color":"#80349E","icon":"fas fa-bolt","isHidden":0}},{"type":"tags","id":"1","attributes":{"name":"General","description":null,"slug":"general","color":"#888","backgroundUrl":null,"backgroundMode":null,"icon":null,"discussionCount":1,"position":0,"defaultSort":null,"isChild":false,"isHidden":false,"lastPostedAt":"2022-01-20T17:10:04+00:00","canStartDiscussion":false,"canAddToDiscussion":false}}],"session":{"userId":0,"csrfToken":"VWs01LQgYuZubkIi8ShfJtWOaPgofTumKxJyoWn2"},"locales":{"en":"English"},"locale":"en","apiDocument":{"links":{"first":"http:\/\/1.2.flarum.localhost\/api\/discussions?sort=\u0026page%5Blimit%5D=20"},"data":[{"type":"discussions","id":"1","attributes":{"title":"First discussion","slug":"1-first-discussion","commentCount":1,"participantCount":1,"createdAt":"2022-01-20T17:10:04+00:00","lastPostedAt":"2022-01-20T17:10:04+00:00","lastPostNumber":1,"canReply":false,"canRename":false,"canDelete":false,"canHide":false,"isApproved":true,"isLocked":false,"canLock":false,"isSticky":false,"canSticky":false,"subscription":null,"canTag":false},"relationships":{"user":{"data":{"type":"users","id":"1"}},"lastPostedUser":{"data":{"type":"users","id":"1"}},"firstPost":{"data":{"type":"posts","id":"1"}},"tags":{"data":[{"type":"tags","id":"1"}]}}}],"included":[{"type":"users","id":"1","attributes":{"username":"Admin","displayName":"Admin","avatarUrl":null,"slug":"Admin"}},{"type":"posts","id":"1","attributes":{"number":1,"createdAt":"2022-01-20T17:10:04+00:00","contentType":"comment","contentHtml":"\u003Cp\u003EHello World\u003C\/p\u003E","renderFailed":false}},{"type":"tags","id":"1","attributes":{"name":"General","description":null,"slug":"general","color":"#888","backgroundUrl":null,"backgroundMode":null,"icon":null,"discussionCount":1,"position":0,"defaultSort":null,"isChild":false,"isHidden":false,"lastPostedAt":"2022-01-20T17:10:04+00:00","canStartDiscussion":false,"canAddToDiscussion":false}}]}});
110+
flarum.core.app.bootExtensions(flarum.extensions);
111+
flarum.core.app.boot();
112+
} catch (e) {
113+
var error = document.getElementById('flarum-loading-error');
114+
error.innerHTML += document.getElementById('flarum-content').textContent;
115+
error.style.display = 'block';
116+
throw e;
117+
}
118+
</script>
119+
120+
121+
</body>
122+
</html>
123+

0 commit comments

Comments
 (0)
Please sign in to comment.