Browse Source

Allowed relative path with theme_utils.dirlist

sisyphus
JezerM 3 years ago
parent
commit
ca421e701e
No known key found for this signature in database
GPG Key ID: 66BBC5D01388C6B5
  1. 3
      .editorconfig
  2. 4
      web-greeter/bridge/ThemeUtils.py
  3. 61
      web-greeter/resources/js/ThemeUtils.js

3
.editorconfig

@ -14,6 +14,9 @@ max_line_length = 99
tab_width = 4 tab_width = 4
trim_trailing_whitespace = true trim_trailing_whitespace = true
[*.js]
indent_style = space
[*.py] [*.py]
indent_style = space indent_style = space

4
web-greeter/bridge/ThemeUtils.py

@ -46,6 +46,7 @@ class ThemeUtils(BridgeObject):
self._greeter = greeter self._greeter = greeter
self._allowed_dirs = ( self._allowed_dirs = (
os.path.dirname(self._config["config"]["greeter"]["theme"]),
self._config["app"]["theme_dir"], self._config["app"]["theme_dir"],
self._config["config"]["branding"]["background_images_dir"], self._config["config"]["branding"]["background_images_dir"],
self._greeter.shared_data_directory, self._greeter.shared_data_directory,
@ -57,6 +58,9 @@ class ThemeUtils(BridgeObject):
if not dir_path or not isinstance(dir_path, str) or '/' == dir_path: if not dir_path or not isinstance(dir_path, str) or '/' == dir_path:
return [] return []
if (dir_path.startswith("./")):
dir_path = os.path.join(os.path.dirname(self._config["config"]["greeter"]["theme"]), dir_path)
dir_path = os.path.realpath(os.path.normpath(dir_path)) dir_path = os.path.realpath(os.path.normpath(dir_path))
if not os.path.isabs(dir_path) or not os.path.isdir(dir_path): if not os.path.isabs(dir_path) or not os.path.isdir(dir_path):

61
web-greeter/resources/js/ThemeUtils.js

@ -25,11 +25,9 @@
* along with web-greeter; If not, see <http://www.gnu.org/licenses/>. * along with web-greeter; If not, see <http://www.gnu.org/licenses/>.
*/ */
let time_language = null, let time_language = null,
_ThemeUtils = null; _ThemeUtils = null;
/** /**
* Provides various utility methods for use in greeter themes. The greeter will automatically * Provides various utility methods for use in greeter themes. The greeter will automatically
* create an instance of this class when it starts. The instance can be accessed * create an instance of this class when it starts. The instance can be accessed
@ -38,11 +36,11 @@ let time_language = null,
* @memberOf LightDM * @memberOf LightDM
*/ */
class ThemeUtils { class ThemeUtils {
constructor(instance) { constructor(instance) {
if (null !== _ThemeUtils) { if (null !== _ThemeUtils) {
return _ThemeUtils; return _ThemeUti;
} }
ls;
_ThemeUtils = instance; _ThemeUtils = instance;
} }
@ -55,18 +53,20 @@ class ThemeUtils {
* @return {object} `context` with `this` bound to it for all of its methods. * @return {object} `context` with `this` bound to it for all of its methods.
*/ */
bind_this(context) { bind_this(context) {
let excluded_methods = ['constructor']; let excluded_methods = ["constructor"];
function not_excluded(_method, _context) { function not_excluded(_method, _context) {
let is_excluded = excluded_methods.findIndex( excluded_method => _method === excluded_method ) > -1, let is_excluded =
is_method = 'function' === typeof _context[_method]; excluded_methods.findIndex((excluded_method) => _method === excluded_method) >
-1,
is_method = "function" === typeof _context[_method];
return is_method && !is_excluded; return is_method && !is_excluded;
} }
for (let obj = context; obj; obj = Object.getPrototypeOf(obj)) { for (let obj = context; obj; obj = Object.getPrototypeOf(obj)) {
// Stop once we have traveled all the way up the inheritance chain // Stop once we have traveled all the way up the inheritance chain
if ( 'Object' === obj.constructor.name ) { if ("Object" === obj.constructor.name) {
break; break;
} }
@ -80,7 +80,6 @@ class ThemeUtils {
return context; return context;
} }
/** /**
* Returns the contents of directory found at `path` provided that the (normalized) `path` * Returns the contents of directory found at `path` provided that the (normalized) `path`
* meets at least one of the following conditions: * meets at least one of the following conditions:
@ -94,18 +93,16 @@ class ThemeUtils {
* @param {function(string[])} callback Callback function to be called with the result. * @param {function(string[])} callback Callback function to be called with the result.
*/ */
dirlist(path, only_images = true, callback) { dirlist(path, only_images = true, callback) {
if ( '' === path || 'string' !== typeof path ) { if ("" === path || "string" !== typeof path) {
console.error(`theme_utils.dirlist(): path must be a non-empty string!`); console.error(`theme_utils.dirlist(): path must be a non-empty string!`);
return callback([]); return callback([]);
} else if (null !== path.match(/^[^/].+/)) { } else if (null !== path.match(/^[^/].+/)) {
console.error(`theme_utils.dirlist(): path must be absolute!`); return _ThemeUtils.dirlist(path, only_images, callback);
return callback([]);
} }
if (null !== path.match(/\/\.+(?=\/)/)) { if (null !== path.match(/\/\.+(?=\/)/)) {
// No special directory names allowed (eg ../../) // No special directory names allowed (eg ../../)
path = path.replace(/\/\.+(?=\/)/g, '' ); path = path.replace(/\/\.+(?=\/)/g, "");
} }
try { try {
@ -123,26 +120,26 @@ class ThemeUtils {
* @returns {Object} The current date. * @returns {Object} The current date.
*/ */
get_current_localized_date() { get_current_localized_date() {
let config = greeter_config.greeter let config = greeter_config.greeter;
var locale = [] var locale = [];
if (time_language === null) { if (time_language === null) {
time_language = config.time_language || "" time_language = config.time_language || "";
} }
if (time_language != "") { if (time_language != "") {
locale.push(time_language) locale.push(time_language);
} }
let optionsDate = { day: "2-digit", month: "2-digit", year: "2-digit" } let optionsDate = { day: "2-digit", month: "2-digit", year: "2-digit" };
let fmtDate = Intl.DateTimeFormat(locale, optionsDate) let fmtDate = Intl.DateTimeFormat(locale, optionsDate);
let now = new Date() let now = new Date();
var date = fmtDate.format(now) var date = fmtDate.format(now);
return date return date;
} }
/** /**
@ -152,25 +149,25 @@ class ThemeUtils {
* @returns {Object} The current time. * @returns {Object} The current time.
*/ */
get_current_localized_time() { get_current_localized_time() {
let config = greeter_config.greeter let config = greeter_config.greeter;
var locale = [] var locale = [];
if (time_language === null) { if (time_language === null) {
time_language = config.time_language || "" time_language = config.time_language || "";
} }
if (time_language != "") { if (time_language != "") {
locale.push(time_language) locale.push(time_language);
} }
let optionsTime = { hour: "2-digit", minute: "2-digit" } let optionsTime = { hour: "2-digit", minute: "2-digit" };
let fmtTime = Intl.DateTimeFormat(locale, optionsTime) let fmtTime = Intl.DateTimeFormat(locale, optionsTime);
let now = new Date() let now = new Date();
var time = fmtTime.format(now) var time = fmtTime.format(now);
return time return time;
} }
} }

Loading…
Cancel
Save