aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG15
-rw-r--r--Zotlabs/Lib/Config.php26
-rw-r--r--Zotlabs/Module/Siteinfo.php2
-rw-r--r--boot.php2
-rw-r--r--include/text.php5
-rw-r--r--tests/unit/Lib/ConfigTest.php61
-rw-r--r--view/nb-no/hmessages.po76
-rw-r--r--view/nb-no/hstrings.php72
-rw-r--r--view/tpl/siteinfo.tpl20
9 files changed, 198 insertions, 81 deletions
diff --git a/CHANGELOG b/CHANGELOG
index b8893c32b..084715858 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,18 @@
+Hubzilla 8.8.4 (2023-12-20)
+ - Fix regression introduced in version 8.8.3
+ - Add test for Lib/Config
+ - Add active addons and blocked sites to siteinfo
+
+
+Hubzilla 8.8.3 (2023-12-17)
+ - Check return from Config::Load() and retry on failure
+ - Libzot::import() do not prozess items where we could not fetch the author
+ - Translation updates for Norwegian Bokmål (nb_NO)
+ - Add the app terms before syncing, otherwise the terms will be reset at the other end
+ - Addon statistics: deprecate nodeinfo 1.0 and implement nodeinfo 2.1
+ - Addon cards: fix PHP error
+
+
Hubzilla 8.8.2 (2023-12-06)
- Fix missing includes - issue #1820
- Addon logger_stats: improved performance reading big log files
diff --git a/Zotlabs/Lib/Config.php b/Zotlabs/Lib/Config.php
index 40d5cc246..5e735be34 100644
--- a/Zotlabs/Lib/Config.php
+++ b/Zotlabs/Lib/Config.php
@@ -36,7 +36,7 @@ class Config {
if (! array_key_exists('config_loaded', App::$config[$family])) {
$r = q("SELECT * FROM config WHERE cat = '%s'", dbesc($family));
- if ($r === false) {
+ if ($r === false && !App::$install) {
sleep(3);
$recursionCounter ++;
if ($recursionCounter > 10) {
@@ -44,7 +44,7 @@ class Config {
}
self::Load($family, $recursionCounter);
}
- else {
+ elseif (is_array($r)) {
foreach ($r as $rr) {
$k = $rr['k'];
App::$config[$family][$k] = $rr['v'];
@@ -72,7 +72,7 @@ class Config {
*/
public static function Set($family, $key, $value) {
// manage array value
- $dbvalue = ((is_array($value)) ? serialise($value) : $value);
+ $dbvalue = ((is_array($value)) ? 'json:' . json_encode($value) : $value);
$dbvalue = ((is_bool($dbvalue)) ? intval($dbvalue) : $dbvalue);
if (self::Get($family, $key) === false || (! self::get_from_storage($family, $key))) {
@@ -121,6 +121,7 @@ class Config {
* @return mixed Return value or false on error or if not set
*/
public static function Get($family, $key, $default = false) {
+
if ((! array_key_exists($family, App::$config)) || (! array_key_exists('config_loaded', App::$config[$family]))) {
self::Load($family);
}
@@ -130,11 +131,20 @@ class Config {
return $default;
}
- return ((! is_array(App::$config[$family][$key])) && (preg_match('|^a:[0-9]+:{.*}$|s', App::$config[$family][$key]))
- ? unserialize(App::$config[$family][$key])
- : App::$config[$family][$key]
- );
-
+ $value = App::$config[$family][$key];
+
+ if (! is_array($value)) {
+ if (substr($value, 0, 5) == 'json:') {
+ return json_decode(substr($value, 5), true);
+ } else if (preg_match('|^a:[0-9]+:{.*}$|s', $value)) {
+ // Unserialize in inherently unsafe. Try to mitigate by not
+ // allowing unserializing objects. Only kept for backwards
+ // compatibility. JSON serialization should be prefered.
+ return unserialize($value, array('allowed_classes' => false));
+ } else {
+ return $value;
+ }
+ }
}
return $default;
diff --git a/Zotlabs/Module/Siteinfo.php b/Zotlabs/Module/Siteinfo.php
index ac33747f8..18eb703a2 100644
--- a/Zotlabs/Module/Siteinfo.php
+++ b/Zotlabs/Module/Siteinfo.php
@@ -38,6 +38,8 @@ class Siteinfo extends \Zotlabs\Web\Controller {
'$prj_srctxt' => t('Developer homepage'),
'$prj_link' => \Zotlabs\Lib\System::get_project_link(),
'$prj_src' => \Zotlabs\Lib\System::get_project_srclink(),
+ '$addons' => array( t('Active addons'), \App::$plugins ),
+ '$blocked_sites' => array( t('Blocked sites'), \Zotlabs\Lib\Config::Get('system', 'blacklisted_sites') )
]
);
diff --git a/boot.php b/boot.php
index b9c03b1ae..50c880113 100644
--- a/boot.php
+++ b/boot.php
@@ -1403,7 +1403,7 @@ function x($s, $k = null) {
* @ref include/system_unavailable.php will handle everything further.
*/
function system_unavailable() {
- include('include/system_unavailable.php');
+ require_once('include/system_unavailable.php');
system_down();
killme();
}
diff --git a/include/text.php b/include/text.php
index 5330e19c7..5ef28bfde 100644
--- a/include/text.php
+++ b/include/text.php
@@ -904,6 +904,8 @@ function get_tags($s) {
$ret[] = $mtch;
}
}
+
+
if(preg_match_all('/([@#\!]\".*?\")/',$s,$match)) {
foreach($match[1] as $mtch) {
$ret[] = $mtch;
@@ -936,6 +938,8 @@ function get_tags($s) {
// or quote remnants from the quoted strings we already picked out earlier
if(strpos($mtch,'&quot'))
continue;
+ if(strpos($mtch,'"'))
+ continue;
$ret[] = $mtch;
}
@@ -1639,6 +1643,7 @@ function format_hashtags(&$item) {
$s = '';
$terms = isset($item['term']) ? get_terms_oftype($item['term'], array(TERM_HASHTAG, TERM_COMMUNITYTAG)) : [];
+
if($terms) {
foreach($terms as $t) {
$term = htmlspecialchars($t['term'], ENT_COMPAT, 'UTF-8', false) ;
diff --git a/tests/unit/Lib/ConfigTest.php b/tests/unit/Lib/ConfigTest.php
new file mode 100644
index 000000000..a8ae3631b
--- /dev/null
+++ b/tests/unit/Lib/ConfigTest.php
@@ -0,0 +1,61 @@
+<?php
+declare(strict_types=1);
+
+/**
+ * Tests for the Zotlabs\Lib\Config class.
+ *
+ * Until we have database testing in place, we can only test the Congig::Get
+ * method for now. This should be improved once the database test framework is
+ * merged.
+ */
+class ConfigTest extends Zotlabs\Tests\Unit\UnitTestCase {
+ /*
+ * Hardcode a config that we can test against, and that we can
+ * reuse in all the test cases.
+ */
+ public function setUp(): void {
+ \App::$config = array(
+ 'test' => array (
+ 'plain' => 'plain value',
+ 'php-array' => 'a:3:{i:0;s:3:"one";i:1;s:3:"two";i:2;s:5:"three";}',
+ 'json-array' => 'json:["one","two","three"]',
+ 'object-injection' => 'a:1:{i:0;O:18:"Zotlabs\Lib\Config":0:{}}',
+ 'config_loaded' => true,
+ ),
+ );
+ }
+
+ public function testGetPlainTextValue(): void {
+ $this->assertEquals(
+ Zotlabs\Lib\Config::Get('test', 'plain'),
+ 'plain value'
+ );
+ }
+
+ public function testGetJSONSerializedArray(): void {
+ $this->assertEquals(
+ Zotlabs\Lib\Config::Get('test', 'json-array'),
+ array('one', 'two', 'three')
+ );
+ }
+
+ /*
+ * Test that we can retreive old style serialized arrays that were
+ * serialized with th PHP `serialize()` function.
+ */
+ public function testGetPHPSerializedArray(): void {
+ $this->assertEquals(
+ Zotlabs\Lib\Config::Get('test', 'php-array'),
+ array('one', 'two', 'three')
+ );
+ }
+
+ /*
+ * Make sure we're not vulnerable to PHP Object injection attacks when
+ * using the PHP `unserialize()` function.
+ */
+ public function testGetMaliciousPHPSerializedArray(): void {
+ $value = Zotlabs\Lib\Config::Get('test', 'object-injection');
+ $this->assertEquals($value[0]::class, '__PHP_Incomplete_Class');
+ }
+}
diff --git a/view/nb-no/hmessages.po b/view/nb-no/hmessages.po
index eb91de095..d8f0bffc4 100644
--- a/view/nb-no/hmessages.po
+++ b/view/nb-no/hmessages.po
@@ -10,7 +10,7 @@ msgstr ""
"Project-Id-Version: 8.6RC1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-07-04 17:57+0000\n"
-"PO-Revision-Date: 2023-09-09 15:38+0200\n"
+"PO-Revision-Date: 2023-12-15 22:33+0100\n"
"Last-Translator: Harald Eilertsen <haraldei@anduin.net>\n"
"Language-Team: Norwegian Bokmal <l10n-no@lister.huftis.org>\n"
"Language: nb_NO\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1 ? 1 : 0);\n"
-"X-Generator: Poedit 3.3.2\n"
+"X-Generator: Lokalize 23.08.4\n"
#: ../../view/theme/redbasic/php/config.php:15
#: ../../addon/cart/submodules/orderoptions.php:335
@@ -7234,31 +7234,31 @@ msgstr "OpenWebAuth: %1$s ønsker %2$s velkommen"
#: ../../Zotlabs/Widget/Activity_order.php:96
msgid "Commented Date"
-msgstr ""
+msgstr "Sist kommentert"
#: ../../Zotlabs/Widget/Activity_order.php:100
msgid "Order by last commented date"
-msgstr ""
+msgstr "Sorter etter dato for siste kommentar"
#: ../../Zotlabs/Widget/Activity_order.php:103
msgid "Posted Date"
-msgstr ""
+msgstr "Innleggsdato"
#: ../../Zotlabs/Widget/Activity_order.php:107
msgid "Order by last posted date"
-msgstr ""
+msgstr "Sorter etter dato innlegg ble postet"
#: ../../Zotlabs/Widget/Activity_order.php:110
msgid "Date Unthreaded"
-msgstr ""
+msgstr "Utrådet"
#: ../../Zotlabs/Widget/Activity_order.php:114
msgid "Order unthreaded by date"
-msgstr ""
+msgstr "Sorter innlegg og kommentarer uavhengig av hverandre etter dato"
#: ../../Zotlabs/Widget/Activity_order.php:129
msgid "Stream Order"
-msgstr ""
+msgstr "Sortering av innlegg"
#: ../../Zotlabs/Widget/Tokens.php:41
msgid "Add new guest"
@@ -7534,7 +7534,7 @@ msgstr "Bokmerkede chatrom"
#: ../../Zotlabs/Widget/Appcategories.php:49
msgid "App Categories"
-msgstr ""
+msgstr "Appkategorier"
#: ../../Zotlabs/Widget/Hq_controls.php:23
msgid "Toggle post editor"
@@ -7710,15 +7710,15 @@ msgstr "Filtere for tidslinjen"
#: ../../Zotlabs/Widget/Appstore.php:16
msgid "App Collections"
-msgstr ""
+msgstr "Appsamlinger"
#: ../../Zotlabs/Widget/Appstore.php:18
msgid "Installed apps"
-msgstr ""
+msgstr "Installerte apper"
#: ../../Zotlabs/Widget/Appstore.php:19 ../../Zotlabs/Module/Apps.php:51
msgid "Available Apps"
-msgstr ""
+msgstr "Tilgjengelige apper"
#: ../../Zotlabs/Widget/Privacygroups.php:45
msgid "Add new group"
@@ -10610,7 +10610,7 @@ msgstr ""
#: ../../Zotlabs/Module/Admin/Site.php:427 ../../Zotlabs/Module/Siteinfo.php:24
msgid "Site Information"
-msgstr ""
+msgstr "Nettstedsinformasjon"
#: ../../Zotlabs/Module/Admin/Site.php:427
msgid ""
@@ -11408,11 +11408,11 @@ msgstr ""
#: ../../Zotlabs/Module/Apps.php:51
msgid "Installed Apps"
-msgstr ""
+msgstr "Installerte apper"
#: ../../Zotlabs/Module/Apps.php:54
msgid "Manage Apps"
-msgstr ""
+msgstr "Behandle apper"
#: ../../Zotlabs/Module/Apps.php:55
msgid "Create Custom App"
@@ -11925,7 +11925,7 @@ msgstr "Kanalnavn"
#: ../../Zotlabs/Module/New_channel.php:178
#: ../../Zotlabs/Module/Settings/Channel.php:233
msgid "Channel role"
-msgstr ""
+msgstr "Kanalrolle"
#: ../../Zotlabs/Module/New_channel.php:181
msgid "Create a Channel"
@@ -11971,7 +11971,7 @@ msgstr "Angi ditt nåværende humør og fortell dine venner"
#: ../../Zotlabs/Module/Siteinfo.php:21
msgid "About this site"
-msgstr ""
+msgstr "Om dette nettstedet "
#: ../../Zotlabs/Module/Siteinfo.php:22
#, fuzzy
@@ -11984,20 +11984,20 @@ msgstr "Administrator"
#: ../../Zotlabs/Module/Siteinfo.php:29
msgid "Software and Project information"
-msgstr ""
+msgstr "Program- og prosjektinformasjon"
#: ../../Zotlabs/Module/Siteinfo.php:30
msgid "This site is powered by $Projectname"
-msgstr ""
+msgstr "Dette nettstedet drives av $Projectname"
#: ../../Zotlabs/Module/Siteinfo.php:31
msgid ""
"Federated and decentralised networking and identity services provided by Zot"
-msgstr ""
+msgstr "Fødererte og desentraliserte nettverks- og identitetstjenester via Zot"
#: ../../Zotlabs/Module/Siteinfo.php:34
msgid "Additional federated transport protocols:"
-msgstr ""
+msgstr "Øvrige fødererte transportprotokoller:"
#: ../../Zotlabs/Module/Siteinfo.php:36
#, php-format
@@ -12006,11 +12006,11 @@ msgstr "Versjon %s"
#: ../../Zotlabs/Module/Siteinfo.php:37
msgid "Project homepage"
-msgstr ""
+msgstr "Prosjektets hjemmeside"
#: ../../Zotlabs/Module/Siteinfo.php:38
msgid "Developer homepage"
-msgstr ""
+msgstr "Utviklers hjemmeside"
#: ../../Zotlabs/Module/Appman.php:39 ../../Zotlabs/Module/Appman.php:56
msgid "App installed."
@@ -13601,7 +13601,7 @@ msgstr "Ekstra funksjoner"
#: ../../Zotlabs/Module/Settings/Channel.php:105
#: ../../Zotlabs/Module/Settings/Channel.php:217
msgid "Please select a channel role"
-msgstr ""
+msgstr "Velg en kanalrolle"
#: ../../Zotlabs/Module/Settings/Channel.php:194
msgid "Your channel address is"
@@ -13609,7 +13609,7 @@ msgstr "Din kanaladresse er"
#: ../../Zotlabs/Module/Settings/Channel.php:197
msgid "Your files/photos are accessible via WebDAV at"
-msgstr ""
+msgstr "Dine filer og foto er tilgjengelig via WebDAV på"
#: ../../Zotlabs/Module/Settings/Channel.php:228
msgid "Channel Settings"
@@ -13621,11 +13621,11 @@ msgstr "Grunninnstillinger"
#: ../../Zotlabs/Module/Settings/Channel.php:236
msgid "Channel timezone:"
-msgstr ""
+msgstr "Tidssone for kanalen:"
#: ../../Zotlabs/Module/Settings/Channel.php:237
msgid "Default post location:"
-msgstr ""
+msgstr "Standard plassering for innlegg:"
#: ../../Zotlabs/Module/Settings/Channel.php:237
msgid "Geographical location to display on your posts"
@@ -13637,11 +13637,12 @@ msgstr ""
#: ../../Zotlabs/Module/Settings/Channel.php:239
msgid "Adult content"
-msgstr ""
+msgstr "Voksent innhold"
#: ../../Zotlabs/Module/Settings/Channel.php:239
msgid "This channel frequently or regularly publishes adult content"
msgstr ""
+"Denne kanalen vil ofte, eller regelmessig poste innlegg med voksent innhold"
#: ../../Zotlabs/Module/Settings/Channel.php:240
msgid "Maximum Friend Requests/Day:"
@@ -13851,7 +13852,7 @@ msgstr "Annet kanal innhold utløper etter så mange dager"
#: ../../Zotlabs/Module/Settings/Channel.php:284
msgid "0 or blank to use the website limit."
-msgstr ""
+msgstr "0 eller la være tomt for å bruke grensen til nettstedet."
#: ../../Zotlabs/Module/Settings/Channel.php:284
#, php-format
@@ -13860,11 +13861,11 @@ msgstr ""
#: ../../Zotlabs/Module/Settings/Channel.php:284
msgid "This website does not expire imported content."
-msgstr ""
+msgstr "Dette nettstedet sletter ikke importert innhold."
#: ../../Zotlabs/Module/Settings/Channel.php:284
msgid "The website limit takes precedence if lower than your limit."
-msgstr ""
+msgstr "Nettstedets grense vil gjelde dersom den er lavere enn din grense."
#: ../../Zotlabs/Module/Settings/Channel.php:285
#: ../../Zotlabs/Module/Settings/Channel.php:286
@@ -13872,6 +13873,8 @@ msgid ""
"Words one per line or #tags, $categories, /patterns/, lang=xx, lang!=xx - "
"leave blank to import all posts"
msgstr ""
+"Ett ord per linje eller #emneknagger, $kategorier, /mønster/, lang=xx,"
+" lang!=xx - la være tomt for å importere alle innlegg"
#: ../../Zotlabs/Module/Settings/Account.php:21
msgid "Not valid email."
@@ -15436,19 +15439,19 @@ msgstr ""
#: ../../Zotlabs/Lib/Apps.php:611
msgid "Add to app-tray"
-msgstr ""
+msgstr "Legg til i meny"
#: ../../Zotlabs/Lib/Apps.php:612
msgid "Remove from app-tray"
-msgstr ""
+msgstr "Fjern fra meny"
#: ../../Zotlabs/Lib/Apps.php:613
msgid "Pin to navbar"
-msgstr ""
+msgstr "Fest til navigasjonslinjen"
#: ../../Zotlabs/Lib/Apps.php:614
msgid "Unpin from navbar"
-msgstr ""
+msgstr "Fjern fra navigasjonslinjen"
#: ../../Zotlabs/Lib/Techlevels.php:10
msgid "0. Beginner/Basic"
@@ -16048,3 +16051,4 @@ msgstr "Cron/planlagte oppgaver kjører ikke."
#~ msgid "Page owner information could not be retrieved."
#~ msgstr "Informasjon om sideeier kunne ikke hentes."
+
diff --git a/view/nb-no/hstrings.php b/view/nb-no/hstrings.php
index f66946062..7b1bf396d 100644
--- a/view/nb-no/hstrings.php
+++ b/view/nb-no/hstrings.php
@@ -1596,13 +1596,13 @@ App::$strings[" on "] = "På";
App::$strings["Embedded content"] = "Innebygget innhold";
App::$strings["Embedding disabled"] = "Innbygging avskrudd";
App::$strings["OpenWebAuth: %1\$s welcomes %2\$s"] = "OpenWebAuth: %1\$s ønsker %2\$s velkommen";
-App::$strings["Commented Date"] = "";
-App::$strings["Order by last commented date"] = "";
-App::$strings["Posted Date"] = "";
-App::$strings["Order by last posted date"] = "";
-App::$strings["Date Unthreaded"] = "";
-App::$strings["Order unthreaded by date"] = "";
-App::$strings["Stream Order"] = "";
+App::$strings["Commented Date"] = "Sist kommentert";
+App::$strings["Order by last commented date"] = "Sorter etter dato for siste kommentar";
+App::$strings["Posted Date"] = "Innleggsdato";
+App::$strings["Order by last posted date"] = "Sorter etter dato innlegg ble postet";
+App::$strings["Date Unthreaded"] = "Utrådet";
+App::$strings["Order unthreaded by date"] = "Sorter innlegg og kommentarer uavhengig av hverandre etter dato";
+App::$strings["Stream Order"] = "Sortering av innlegg";
App::$strings["Add new guest"] = "";
App::$strings["Guest access"] = "";
App::$strings["Archives"] = "Arkiv";
@@ -1670,7 +1670,7 @@ App::$strings["Ignore/Hide"] = "Ignorer/Skjul";
App::$strings["Suggestions"] = "Forslag";
App::$strings["See more..."] = "Se mer...";
App::$strings["Bookmarked Chatrooms"] = "Bokmerkede chatrom";
-App::$strings["App Categories"] = "";
+App::$strings["App Categories"] = "Appkategorier";
App::$strings["Toggle post editor"] = "Vis redigering av innlegg";
App::$strings["Toggle personal notes"] = "";
App::$strings["Channel activities"] = "";
@@ -1711,9 +1711,9 @@ App::$strings["Panel search"] = "";
App::$strings["Filter by name"] = "Filtrer etter navn";
App::$strings["Remove active filter"] = "";
App::$strings["Stream Filters"] = "Filtere for tidslinjen";
-App::$strings["App Collections"] = "";
-App::$strings["Installed apps"] = "";
-App::$strings["Available Apps"] = "";
+App::$strings["App Collections"] = "Appsamlinger";
+App::$strings["Installed apps"] = "Installerte apper";
+App::$strings["Available Apps"] = "Tilgjengelige apper";
App::$strings["Add new group"] = "";
App::$strings["Privacy groups"] = "Personverngrupper";
App::$strings["Rating Tools"] = "Vurderingsverktøy";
@@ -2343,7 +2343,7 @@ App::$strings["Banner/Logo"] = "Banner/Logo";
App::$strings["Unfiltered HTML/CSS/JS is allowed"] = "";
App::$strings["Administrator Information"] = "Administratorinformasjon";
App::$strings["Contact information for site administrators. Displayed on siteinfo page. BBCode can be used here"] = "Kontaktinformasjon til nettstedsadministratorer. Vises på siteinfo-siden. BBCode kan brukes her";
-App::$strings["Site Information"] = "";
+App::$strings["Site Information"] = "Nettstedsinformasjon";
App::$strings["Publicly visible description of this site. Displayed on siteinfo page. BBCode can be used here"] = "";
App::$strings["System theme"] = "Systemtema";
App::$strings["Default system theme - may be over-ridden by user profiles - <a href='#' id='cnftheme'>change theme settings</a>"] = "Standard systemtema - kan overstyres av brukerprofiler - <a href='#' id='cnftheme'>endre temainnstillinger</a>";
@@ -2516,8 +2516,8 @@ App::$strings["Manage Repos"] = "";
App::$strings["Installed Addon Repositories"] = "";
App::$strings["Install a New Addon Repository"] = "";
App::$strings["Switch branch"] = "";
-App::$strings["Installed Apps"] = "";
-App::$strings["Manage Apps"] = "";
+App::$strings["Installed Apps"] = "Installerte apper";
+App::$strings["Manage Apps"] = "Behandle apper";
App::$strings["Create Custom App"] = "";
App::$strings["Some blurb about what to do when you're new here"] = "En standardtekst om hva du bør gjøre som ny her";
App::$strings["Channel removals are not allowed within 48 hours of changing the account password."] = "Fjerning av kanaler er ikke tillatt innen 48 timer etter endring av kontopassordet.";
@@ -2632,7 +2632,7 @@ App::$strings["Examples: \"Bob Jameson\", \"Lisa and her Horses\", \"Soccer\", \
App::$strings["This will be used to create a unique network address (like an email address)."] = "";
App::$strings["Allowed characters are a-z 0-9, - and _"] = "";
App::$strings["Channel name"] = "Kanalnavn";
-App::$strings["Channel role"] = "";
+App::$strings["Channel role"] = "Kanalrolle";
App::$strings["Create a Channel"] = "";
App::$strings["A channel is a unique network identity. It can represent a person (social network profile), a forum (group), a business or celebrity page, a newsfeed, and many other things."] = "";
App::$strings["or <a href=\"import\">import an existing channel</a> from another location."] = "eller <a href=\"import\">importer en eksisterende kanal</a> fra et annet sted.";
@@ -2642,16 +2642,16 @@ App::$strings["Entry OK"] = "";
App::$strings["No service class restrictions found."] = "Ingen restriksjoner er funnet i tjenesteklasse.";
App::$strings["Mood"] = "Stemning";
App::$strings["Set your current mood and tell your friends"] = "Angi ditt nåværende humør og fortell dine venner";
-App::$strings["About this site"] = "";
+App::$strings["About this site"] = "Om dette nettstedet ";
App::$strings["Site Name"] = "Nettstedets navn";
App::$strings["Administrator"] = "Administrator";
-App::$strings["Software and Project information"] = "";
-App::$strings["This site is powered by \$Projectname"] = "";
-App::$strings["Federated and decentralised networking and identity services provided by Zot"] = "";
-App::$strings["Additional federated transport protocols:"] = "";
+App::$strings["Software and Project information"] = "Program- og prosjektinformasjon";
+App::$strings["This site is powered by \$Projectname"] = "Dette nettstedet drives av \$Projectname";
+App::$strings["Federated and decentralised networking and identity services provided by Zot"] = "Fødererte og desentraliserte nettverks- og identitetstjenester via Zot";
+App::$strings["Additional federated transport protocols:"] = "Øvrige fødererte transportprotokoller:";
App::$strings["Version %s"] = "Versjon %s";
-App::$strings["Project homepage"] = "";
-App::$strings["Developer homepage"] = "";
+App::$strings["Project homepage"] = "Prosjektets hjemmeside";
+App::$strings["Developer homepage"] = "Utviklers hjemmeside";
App::$strings["App installed."] = "App installert.";
App::$strings["Malformed app."] = "Feil oppsett for app-en.";
App::$strings["Embed code"] = "Innbyggingskode";
@@ -3010,17 +3010,17 @@ App::$strings["Max height of content (in pixels)"] = "Maks høyde for innhold (i
App::$strings["Click to expand content exceeding this height"] = "Klikk for å vise hele innlegg som overskrider denne grensen";
App::$strings["Stream Settings"] = "Instillinger for tidslinjen";
App::$strings["Additional Features"] = "Ekstra funksjoner";
-App::$strings["Please select a channel role"] = "";
+App::$strings["Please select a channel role"] = "Velg en kanalrolle";
App::$strings["Your channel address is"] = "Din kanaladresse er";
-App::$strings["Your files/photos are accessible via WebDAV at"] = "";
+App::$strings["Your files/photos are accessible via WebDAV at"] = "Dine filer og foto er tilgjengelig via WebDAV på";
App::$strings["Channel Settings"] = "Kanalinnstillinger";
App::$strings["Basic Settings"] = "Grunninnstillinger";
-App::$strings["Channel timezone:"] = "";
-App::$strings["Default post location:"] = "";
+App::$strings["Channel timezone:"] = "Tidssone for kanalen:";
+App::$strings["Default post location:"] = "Standard plassering for innlegg:";
App::$strings["Geographical location to display on your posts"] = "Geografisk plassering som vises på dine innlegg";
App::$strings["Use browser location"] = "";
-App::$strings["Adult content"] = "";
-App::$strings["This channel frequently or regularly publishes adult content"] = "";
+App::$strings["Adult content"] = "Voksent innhold";
+App::$strings["This channel frequently or regularly publishes adult content"] = "Denne kanalen vil ofte, eller regelmessig poste innlegg med voksent innhold";
App::$strings["Maximum Friend Requests/Day:"] = "Maksimalt antall venneforespørsler per dag:";
App::$strings["May reduce spam activity"] = "Kan redusere søppelpostaktivitet";
App::$strings["Notification Settings"] = "Varslingsinnstillinger";
@@ -3070,11 +3070,11 @@ App::$strings["%Y - current year, %m - current month"] = "%Y - nåværende år,
App::$strings["Default file upload folder"] = "Standard mappe for opplasting av filer";
App::$strings["Remove this channel."] = "Fjern denne kanalen.";
App::$strings["Expire other channel content after this many days"] = "Annet kanal innhold utløper etter så mange dager";
-App::$strings["0 or blank to use the website limit."] = "";
+App::$strings["0 or blank to use the website limit."] = "0 eller la være tomt for å bruke grensen til nettstedet.";
App::$strings["This website expires after %d days."] = "";
-App::$strings["This website does not expire imported content."] = "";
-App::$strings["The website limit takes precedence if lower than your limit."] = "";
-App::$strings["Words one per line or #tags, \$categories, /patterns/, lang=xx, lang!=xx - leave blank to import all posts"] = "";
+App::$strings["This website does not expire imported content."] = "Dette nettstedet sletter ikke importert innhold.";
+App::$strings["The website limit takes precedence if lower than your limit."] = "Nettstedets grense vil gjelde dersom den er lavere enn din grense.";
+App::$strings["Words one per line or #tags, \$categories, /patterns/, lang=xx, lang!=xx - leave blank to import all posts"] = "Ett ord per linje eller #emneknagger, \$kategorier, /mønster/, lang=xx, lang!=xx - la være tomt for å importere alle innlegg";
App::$strings["Not valid email."] = "Ikke gyldig e-post.";
App::$strings["Protected email address. Cannot change to that email."] = "Beskyttet e-postadresse. Kan ikke endre til den e-postadressen.";
App::$strings["System failure storing new email. Please try again."] = "Systemfeil ved lagring av ny e-post. Vennligst prøv igjen.";
@@ -3428,10 +3428,10 @@ App::$strings["My Chatrooms"] = "";
App::$strings["Channel Export"] = "";
App::$strings["Purchase"] = "Kjøp";
App::$strings["Undelete"] = "";
-App::$strings["Add to app-tray"] = "";
-App::$strings["Remove from app-tray"] = "";
-App::$strings["Pin to navbar"] = "";
-App::$strings["Unpin from navbar"] = "";
+App::$strings["Add to app-tray"] = "Legg til i meny";
+App::$strings["Remove from app-tray"] = "Fjern fra meny";
+App::$strings["Pin to navbar"] = "Fest til navigasjonslinjen";
+App::$strings["Unpin from navbar"] = "Fjern fra navigasjonslinjen";
App::$strings["0. Beginner/Basic"] = "";
App::$strings["1. Novice - not skilled but willing to learn"] = "";
App::$strings["2. Intermediate - somewhat comfortable"] = "";
diff --git a/view/tpl/siteinfo.tpl b/view/tpl/siteinfo.tpl
index fef3b961e..6cf7da756 100644
--- a/view/tpl/siteinfo.tpl
+++ b/view/tpl/siteinfo.tpl
@@ -12,6 +12,26 @@
<div>{{if $admin_about}}{{$admin_about}}{{else}}--{{/if}}</div>
+{{if $addons.1}}
+<br>
+<h3>{{$addons.0}}</h3>
+<ul>
+ {{foreach $addons.1 as $addon}}
+ <li>{{$addon}}</li>
+ {{/foreach}}
+</ul>
+{{/if}}
+
+{{if $blocked_sites.1}}
+<br>
+<h3>{{$blocked_sites.0}}</h3>
+<ul>
+ {{foreach $blocked_sites.1 as $site}}
+ <li>{{$site}}</li>
+ {{/foreach}}
+</ul>
+{{/if}}
+
<br><br>
<div><a href="help/TermsOfService">{{$terms}}</a></div>