Compare commits

..

57 Commits
8.8 ... 8.8.5

Author SHA1 Message Date
Mario Vavti
d655e1d765 version 8.8.5 2024-01-01 21:30:45 +01:00
Mario Vavti
db70ed006d Merge branch 'dev' 2024-01-01 21:29:53 +01:00
Mario Vavti
ce1dd5c632 changelog 2024-01-01 21:29:15 +01:00
Mario Vavti
9e2a253dda Merge branch 'dev' 2024-01-01 21:21:04 +01:00
Mario
95c645865d Merge branch 'doc-fixes' into 'dev'
docs: Update admin guide requirements

See merge request hubzilla/core!2080
2024-01-01 20:17:52 +00:00
Mario Vavti
f2f9cfaf28 Work around possible loop and use Lib/Config in init 2024-01-01 21:01:47 +01:00
Mario Vavti
62db8c3969 fix php errors and deprecation warnings 2023-12-31 09:55:27 +01:00
Mario Vavti
ae3db366e5 deprecate simplepie idna_convert 2023-12-31 09:54:54 +01:00
Harald Eilertsen
57570c144a doc/admin-guide: Update min php version and reqd extensions. 2023-12-26 15:34:50 +01:00
Mario
c3a235242e do not double process quoted strings 2023-12-21 10:19:26 +00:00
Mario
b629eb5657 fix merge conflict 2023-12-20 12:32:15 +00:00
Mario
2e674cd0b3 version 8.8.4 2023-12-20 12:26:28 +00:00
Mario
3330e9a19a Merge branch 'dev' 2023-12-20 12:25:43 +00:00
Mario
c5f6208396 changelog 2023-12-20 12:25:27 +00:00
Mario
c0d93bbcf4 Merge branch 'dev' 2023-12-20 12:20:04 +00:00
Mario
db941e7007 changelog 2023-12-20 12:17:35 +00:00
Mario
4761857157 Revert "changelog"
This reverts commit 3aefe23184.
2023-12-20 12:15:42 +00:00
Mario
3aefe23184 changelog 2023-12-20 12:15:24 +00:00
Mario
6f852814fd move App::$install check to Config::Load() as suggested by Harald 2023-12-20 11:58:33 +01:00
Mario
b15e521b0e Merge branch 'fix-config-deserialization' into 'dev'
Fix deserialization of config values broken by 69266cd6.

See merge request hubzilla/core!2077
2023-12-20 10:27:56 +00:00
Mario
63c401e6d6 Merge branch 'extend-siteinfo' into 'dev'
Add active addons and blocked sites to siteinfo (html)

See merge request hubzilla/core!2079
2023-12-20 10:16:44 +00:00
Harald Eilertsen
e59750e8de Add active addons and blocked sites to siteinfo (html)
This adds information about addons activated on the hub, as well as
which other sites this hub won't federate with in the HTML version of
siteinfo.

Based on suggestions by @rockyiii@huby.infozoo.de.
2023-12-18 15:05:23 +01:00
Harald Eilertsen
9c184ddfd0 Fix deserialization of config values broken by 69266cd6.
This should fix issue #1828.

This patch makes it explicit that we store arrays in the config as json
encoded arrays, while we allow both json encoded and PHP serialized
arrays to be deserialized correctly. Unless it's a brand new install,
the existing data in the database will be PHP serialized.

I've also added a hardening measure in case we fall back to PHP
unserialize, making sure we're not vulnerable to a PHP Object Injection
attack. This means that deserializing arrays containing PHP objects will
no longer work, but afaict we never do that anyways, so I don't think
that should break anything.
2023-12-17 19:30:05 +01:00
Mario
9df6e821d8 use reqiure_once() - second part of issue #1827 2023-12-17 16:47:19 +00:00
Mario
9551dc5ecd fix loop as described in issue #1827 2023-12-17 16:36:13 +00:00
Mario
d372daff60 Revert "check return from Config::Load() and retry on failure plus cleanup"
This reverts commit 69266cd6c6
2023-12-17 11:16:58 +00:00
Mario
f742e6e394 Merge branch 'dev' 2023-12-17 08:53:32 +00:00
Mario
414b2b0e4c changelog 2023-12-17 08:53:14 +00:00
Mario
603c5692ae Merge branch 'dev' 2023-12-17 08:50:39 +00:00
Mario
b35e994d1b Merge branch 'translations-nb_no' into 'dev'
More translations for Norwegian Bokmål (nb_NO)

See merge request hubzilla/core!2075
2023-12-17 08:50:13 +00:00
Mario
abe2ab229a version 8.8.3 2023-12-17 08:43:08 +00:00
Mario
5ad9939bcf Merge branch 'dev' 2023-12-17 08:41:48 +00:00
Mario
ce451128ba changelog 2023-12-17 08:41:21 +00:00
Mario
70470016cc Merge branch 'dev' 2023-12-17 08:35:33 +00:00
Harald Eilertsen
2122ea77e1 More translations for Norwegian Bokmål (nb_NO) 2023-12-16 14:57:01 +01:00
Mario Vavti
69266cd6c6 check return from Config::Load() and retry on failure plus cleanup 2023-12-14 12:32:34 +01:00
Mario Vavti
062d61567e return if we could not fetch the author 2023-12-14 12:06:50 +01:00
Mario Vavti
d6120fc908 Merge branch 'dev' of https://framagit.org/hubzilla/core into dev 2023-12-14 12:06:21 +01:00
Mario
91f8e7a07b typo 2023-12-13 14:34:34 +00:00
Mario Vavti
f57d89245c add the app terms before syncing - otherwise the terms will be reset at the other end 2023-12-08 21:44:32 +01:00
Mario Vavti
c307a71f53 Merge branch 'dev' 2023-12-08 18:08:03 +01:00
Mario Vavti
1e4e59bb57 if it is not an array do not attempt count() 2023-12-08 18:02:54 +01:00
Mario
f62d16d274 Merge branch 'dev' 2023-12-06 11:27:54 +00:00
Mario
f175712d4b typo 2023-12-06 11:27:35 +00:00
Mario
5f942d78e6 Merge branch 'dev' 2023-12-06 11:23:21 +00:00
Mario
538c8885ad changelog 2023-12-06 11:23:02 +00:00
Mario
c8158c3d62 vesrion 8.8.2 2023-12-06 11:14:00 +00:00
Mario
1f4762060f Merge branch 'dev' 2023-12-06 11:12:25 +00:00
Mario
81c3682781 more issue #1820 2023-12-06 09:47:13 +00:00
Mario
2e6e1fdd55 css fixes 2023-12-04 09:28:16 +00:00
Mario
1a09cd560b require acl_selectors.php - fix issue #1820 2023-11-30 08:02:33 +00:00
Mario
8c9d2bc6f6 Merge branch 'dev' 2023-11-27 08:48:47 +00:00
Mario
78ad5ca713 changelog 2023-11-27 08:48:23 +00:00
Mario
43c2e71b25 Merge branch 'dev' 2023-11-27 08:45:19 +00:00
Mario
5b9f32fade Merge branch 'dev' into 'dev'
Update doubleleft.css and doubleright.css according to v.8.8 default.css

See merge request hubzilla/core!2074
2023-11-27 08:44:25 +00:00
Mario
76a1a6da34 version 8.8.1 2023-11-27 08:42:09 +00:00
zlaxy
a2b0abc90d Update doubleleft.css and doubleright.css according to v.8.8 default.css 2023-11-27 10:50:31 +03:00
21 changed files with 327 additions and 158 deletions

View File

@@ -1,3 +1,36 @@
Hubzilla 8.8.5 (2024-01-01)
Fix possible loop if DB is not reachable (introduced in 8.8.3)
Fix some errors and deprecation warnings with PHP 8.2
Deprecate simplepie idna_convert in favor of PHP native function
Fix double processed quoted strings in get_tags()
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
Hubzilla 8.8.1 (2023-11-27)
- Fix error in cards addon
- Fix error in articles addon
- Fix double left and right template css
Hubzilla 8.8 (2023-11-25)
- Add additional observer and channel info for nav templates
- Do not provide confidential channel info for templates
@@ -30,7 +63,6 @@ Hubzilla 8.8 (2023-11-25)
- Transparent background for colorbox controls icons
- Use body background color for colorboxes in redbasic
Bugfixes
- Remove fragment from actor urls
- HTTPsig case insensitive digest algorithm
@@ -45,7 +77,6 @@ Hubzilla 8.8 (2023-11-25)
- Fix sabre/dav caldav php warnings
- Fix public stream comments/reactions not allowed if item_fetched is set
Addons
- Superblock: fix php warnings
- Pubcrawl: restrict mod ap_probe to admin and add checkbox for signed requests

View File

@@ -2,6 +2,7 @@
namespace Zotlabs\Lib;
use App;
class Config {
@@ -14,20 +15,41 @@ class Config {
* @param string $family
* The category of the configuration value
*/
static public function Load($family) {
if(! array_key_exists($family, \App::$config))
\App::$config[$family] = array();
public static function Load($family, $recursionCounter = 0) {
if (! array_key_exists($family, App::$config)) {
App::$config[$family] = [];
}
if(! array_key_exists('config_loaded', \App::$config[$family])) {
// We typically continue when presented with minor DB issues,
// but loading the site configuration is more important.
// Check for query returning false and give it approx 30 seconds
// to recover if there's a problem. This is intended to fix a
// rare issue on Galera where temporary sync issues were causing
// the site encryption keys to be regenerated, which was causing
// communication issues for members.
// This code probably belongs at the database layer, but we don't
// necessarily want to shut the site down for problematic queries
// caused by bad data. That could be used in a denial of service
// attack. Those do need to be (and they are) logged.
if (! array_key_exists('config_loaded', App::$config[$family])) {
$r = q("SELECT * FROM config WHERE cat = '%s'", dbesc($family));
if($r !== false) {
if($r) {
foreach($r as $rr) {
$k = $rr['k'];
\App::$config[$family][$k] = $rr['v'];
}
if ($r === false && !App::$install) {
sleep(3);
$recursionCounter ++;
if ($recursionCounter > 10) {
system_unavailable();
}
\App::$config[$family]['config_loaded'] = true;
self::Load($family, $recursionCounter);
}
elseif (is_array($r)) {
foreach ($r as $rr) {
$k = $rr['k'];
App::$config[$family][$k] = $rr['v'];
}
App::$config[$family]['config_loaded'] = true;
}
}
}
@@ -46,19 +68,19 @@ class Config {
* @return mixed
* Return the set value, or false if the database update failed
*/
static public function Set($family, $key, $value) {
public static function Set($family, $key, $value) {
// manage array value
$dbvalue = ((is_array($value)) ? serialize($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))) {
if (self::Get($family, $key) === false || (! self::get_from_storage($family, $key))) {
$ret = q("INSERT INTO config ( cat, k, v ) VALUES ( '%s', '%s', '%s' ) ",
dbesc($family),
dbesc($key),
dbesc($dbvalue)
);
if($ret) {
\App::$config[$family][$key] = $value;
if ($ret) {
App::$config[$family][$key] = $value;
$ret = $value;
}
return $ret;
@@ -70,8 +92,8 @@ class Config {
dbesc($key)
);
if($ret) {
\App::$config[$family][$key] = $value;
if ($ret) {
App::$config[$family][$key] = $value;
$ret = $value;
}
@@ -96,18 +118,31 @@ class Config {
* @param string $default (optional) default false
* @return mixed Return value or false on error or if not set
*/
static public function Get($family, $key, $default = false) {
if((! array_key_exists($family, \App::$config)) || (! array_key_exists('config_loaded', \App::$config[$family])))
self::Load($family);
public static function Get($family, $key, $default = false) {
if(array_key_exists('config_loaded', \App::$config[$family])) {
if(! array_key_exists($key, \App::$config[$family])) {
if ((! array_key_exists($family, App::$config)) || (! array_key_exists('config_loaded', App::$config[$family]))) {
self::Load($family);
}
if (array_key_exists('config_loaded', App::$config[$family])) {
if (! array_key_exists($key, App::$config[$family])) {
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;
@@ -125,12 +160,13 @@ class Config {
* The configuration key to delete
* @return mixed
*/
static public function Delete($family, $key) {
public static function Delete($family, $key) {
$ret = false;
if(array_key_exists($family, \App::$config) && array_key_exists($key, \App::$config[$family]))
unset(\App::$config[$family][$key]);
if (array_key_exists($family, App::$config) && array_key_exists($key, App::$config[$family])) {
unset(App::$config[$family][$key]);
}
$ret = q("DELETE FROM config WHERE cat = '%s' AND k = '%s'",
dbesc($family),
@@ -153,7 +189,7 @@ class Config {
* The configuration key to query
* @return mixed
*/
static private function get_from_storage($family,$key) {
private static function get_from_storage($family, $key) {
$ret = q("SELECT * FROM config WHERE cat = '%s' AND k = '%s' LIMIT 1",
dbesc($family),
dbesc($key)
@@ -161,5 +197,4 @@ class Config {
return $ret;
}
}

View File

@@ -1234,17 +1234,16 @@ class Libzot {
if ($z) {
$r = Activity::get_actor_hublocs($author_url);
}
if (!$r) {
logger('Could not fetch author');
return;
}
}
if ($r) {
$r = self::zot_record_preferred($r);
$item['author_xchan'] = $r['hubloc_hash'];
}
$r = self::zot_record_preferred($r);
if (! $item['author_xchan']) {
logger('No author!');
return;
}
$item['author_xchan'] = $r['hubloc_hash'];
$item['owner_xchan'] = $env['sender'];

View File

@@ -110,6 +110,11 @@ class Appman extends \Zotlabs\Web\Controller {
dbesc($papp['guid'])
);
$sync[0]['term'] = q("select * from term where otype = %d and oid = %d",
intval(TERM_OBJ_APP),
intval($sync[0]['id'])
);
if (intval($sync[0]['app_system'])) {
Libsync::build_sync_packet(local_channel(), ['sysapp' => $sync]);
}
@@ -126,6 +131,11 @@ class Appman extends \Zotlabs\Web\Controller {
dbesc($papp['guid'])
);
$sync[0]['term'] = q("select * from term where otype = %d and oid = %d",
intval(TERM_OBJ_APP),
intval($sync[0]['id'])
);
if (intval($sync[0]['app_system'])) {
Libsync::build_sync_packet(local_channel(), ['sysapp' => $sync]);
}

View File

@@ -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') )
]
);

View File

@@ -17,11 +17,11 @@ class PhotoGd extends PhotoDriver {
$t = [];
$t['image/jpeg'] = 'jpg';
if(imagetypes() & IMG_PNG)
if(\imagetypes() & IMG_PNG)
$t['image/png'] = 'png';
if(imagetypes() & IMG_GIF)
if(\imagetypes() & IMG_GIF)
$t['image/gif'] = 'gif';
if(imagetypes() & IMG_WEBP)
if(\imagetypes() & IMG_WEBP)
$t['image/webp'] = 'webp';
return $t;

View File

@@ -24,7 +24,7 @@ class Tagadelic {
$x ++;
}
usort($tags,'self::tags_sort');
usort($tags, [self::class, 'tags_sort']);
$range = max(.01, $max - $min) * 1.0001;
@@ -41,4 +41,4 @@ class Tagadelic {
return((strtolower($a[0]) < strtolower($b[0])) ? -1 : 1);
}
}
}

View File

@@ -22,6 +22,7 @@ class Receiver {
protected $prvkey;
protected $rawdata;
protected $sigdata;
protected $hub;
function __construct($handler, $localdata = null) {

View File

@@ -58,9 +58,11 @@ require_once('include/hubloc.php');
require_once('include/attach.php');
require_once('include/bbcode.php');
require_once('include/items.php');
require_once('include/conversation.php');
require_once('include/acl_selectors.php');
define('PLATFORM_NAME', 'hubzilla');
define('STD_VERSION', '8.8');
define('STD_VERSION', '8.8.5');
define('ZOT_REVISION', '6.0');
define('DB_UPDATE_VERSION', 1259);
@@ -678,8 +680,8 @@ function sys_boot() {
* Load configs from db. Overwrite configs from .htconfig.php
*/
load_config('system');
load_config('feature');
Config::Load('system');
Config::Load('feature');
App::$session = new Zotlabs\Web\Session();
App::$session->init();
@@ -1401,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();
}

View File

@@ -85,16 +85,16 @@ There are several ways to deploy a new hub.
Example config scripts are available for these platforms in doc/install.
Apache and nginx have the most support.
* PHP 7.1 or later.
* Note that on some shared hosting environments, the _command line_
version of PHP might differ from the _webserver_ version
* PHP 8.1 or later.
Note that on some shared hosting environments, the _command line_
version of PHP might differ from the _webserver_ version
* PHP *command line* access with register_argc_argv set to true in the
php.ini file * and with no hosting provider restrictions on the use of
php.ini file, and with no hosting provider restrictions on the use of
exec() and proc_open().
* curl, gd (with at least jpeg and png support), mysqli, mbstring, zip,
and openssl extensions. The imagick extension is not required but desirable.
* curl, gd (with at least jpeg and png support), pdo-mysql (or pdo-postgres), mbstring, zip,
and openssl extensions. The imagick extension is not required, but recommended.
* xml extension is required if you want webdav to work.

View File

@@ -190,7 +190,7 @@ function reload_plugins() {
$plugins = get_config('system', 'addon');
if(strlen($plugins)) {
$r = dbq("SELECT * FROM addon WHERE installed = 1");
if(count($r))
if($r)
$installed = $r;
else
$installed = array();

View File

@@ -3,7 +3,10 @@
require_once("include/network.php");
function system_down() {
http_status(503, 'Service Unavailable');
// Set $skiplog to true here. Otherwise we will run into a loop
// when system_unavailable() -> system_down() is called from Zotlabs\Lib\Config::Load()
// but the DB is not available.
http_status(503, 'Service Unavailable', true);
echo <<< EOT
<html>
<head><title>System Unavailable</title></head>
@@ -12,4 +15,4 @@ Apologies but this site is unavailable at the moment. Please try again later.
</body>
</html>
EOT;
}
}

View File

@@ -122,7 +122,7 @@ function store_item_tag($uid,$iid,$otype,$type,$term,$url = '') {
function get_terms_oftype($arr, $type) {
$ret = [];
if(!is_array($arr) && count($arr))
if(!is_array($arr))
return $ret;
if(! is_array($type))

View File

@@ -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) ;
@@ -3834,30 +3839,21 @@ function featured_sort($a,$b) {
}
// Be aware that punify will convert domain names and pathnames
function unpunify($s) {
if (function_exists('idn_to_utf8') && isset($s)) {
return idn_to_utf8($s);
}
return $s;
}
function punify($s) {
require_once('vendor/simplepie/simplepie/idn/idna_convert.class.php');
$x = new idna_convert(['encoding' => 'utf8']);
return $x->encode($s);
if (function_exists('idn_to_ascii') && isset($s)) {
return idn_to_ascii($s);
}
return $s;
}
/**
* Be aware that unpunify() will only convert domain names and not pathnames.
*
* @param string $s
* @return string
*/
function unpunify($s) {
require_once('vendor/simplepie/simplepie/idn/idna_convert.class.php');
$x = new idna_convert(['encoding' => 'utf8']);
return $x->decode($s);
}
function unique_multidim_array($array, $key) {
$temp_array = array();
$i = 0;

View File

@@ -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');
}
}

View File

@@ -19,13 +19,15 @@ main {
#region_1 {
position: relative;
order: 1;
padding: 4.5rem 7px 0px 7px;
padding: 0 7px 0 7px;
width: 25%;
min-width: 300px;
}
#region_2 {
position: relative;
flex: 1;
order: 2;
padding: 4.5rem 7px 200px 7px;
padding: 0 7px 200px 7px;
min-width: 0;
}

View File

@@ -20,12 +20,14 @@ main {
position: relative;
flex: 1;
order: 1;
padding: 4.5rem 7px 200px 7px;
padding: 0 7px 200px 7px;
min-width: 0;
}
#region_2 {
position: relative;
order: 2;
padding: 4.5rem 7px 0px 7px;
padding: 0 7px 0 7px;
width: 25%;
min-width: 300px;
}

View File

@@ -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."

View File

@@ -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"] = "";

View File

@@ -1487,6 +1487,7 @@ dl.bb-dl > dd > li {
.onoffswitch-inner {
display: block; width: 200%; margin-left: -100%;
color: var(--bs-secondary-color);
transition: margin 0.19s ease-in-out;
}
@@ -1498,15 +1499,15 @@ dl.bb-dl > dd > li {
.onoffswitch-inner:before {
content: attr(data-on);
padding-right: 21px;
background-color: var(--bs-secondary-bg);
text-align: right;
background-color: var(--bs-tertiary-bg);
}
.onoffswitch-inner:after {
content: attr(data-off);
padding-left: 21px;
background-color: var(--bs-secondary-bg);
text-align: left;
background-color: var(--bs-tertiary-bg);
}
.onoffswitch-switch {

View File

@@ -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>