Merge pull request #1601 from keymanapp/linux-kmx-filenames

[linux] Sanitize packageID, keyboardID, and kmx filenames
This commit is contained in:
Marc Durdin 2019-02-22 15:06:26 +11:00 committed by GitHub
commit d46ec0bbdd
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 3 deletions

View file

@ -1,5 +1,11 @@
# Keyman for Linux Version History
## 2019-02-22 11.0.111 beta
* use lowercase ID and kmx filenames when installing .kmp packages (#1601)
## 2019-02-20 11.0.110 beta
* update readme about launchpad (#1574)
## 2019-02-18 11.0.109 beta
* create appstream appdata for keyman-config (#1543)

View file

@ -30,6 +30,7 @@ def install_to_ibus(bus, keyboard_id):
preload_engines = ibus_settings.get_strv("preload-engines")
logging.debug(preload_engines)
if keyboard_id not in preload_engines:
# TODO: in the event preload_engines contains upper-case keyboards, we'll need to uninstall_from_ibus #1601
preload_engines.append(keyboard_id)
logging.debug(preload_engines)
ibus_settings.set_strv("preload-engines", preload_engines)

View file

@ -115,6 +115,10 @@ def check_keyman_dir(basedir, error_message):
raise InstallError(InstallStatus.Abort, error_message)
os.mkdir(keyman_dir)
def extract_package_id(inputfile):
packageID, ext = os.path.splitext(os.path.basename(inputfile))
return packageID.lower()
def install_kmp_shared(inputfile, online=False):
"""
Install a kmp file to /usr/local/share/keyman
@ -127,7 +131,7 @@ def install_kmp_shared(inputfile, online=False):
check_keyman_dir('/usr/local/share/doc', "You do not have permissions to install the documentation to the shared documentation area /usr/local/share/doc/keyman")
check_keyman_dir('/usr/local/share/fonts', "You do not have permissions to install the font files to the shared font area /usr/local/share/fonts")
packageID, ext = os.path.splitext(os.path.basename(inputfile))
packageID = extract_package_id(inputfile)
packageDir = os.path.join('/usr/local/share/keyman', packageID)
kmpdocdir = os.path.join('/usr/local/share/doc/keyman', packageID)
kmpfontdir = os.path.join('/usr/local/share/fonts/keyman', packageID)
@ -173,10 +177,17 @@ def install_kmp_shared(inputfile, online=False):
name, ext = os.path.splitext(f['name'])
ldmlfile = os.path.join(packageDir, name+".ldml")
output_ldml(ldmlfile, ldml)
# Special handling of icon to convert to PNG
elif ftype == KMFileTypes.KM_ICON:
# Special handling of icon to convert to PNG
logging.info("Converting %s to PNG and installing both as keyman files", f['name'])
checkandsaveico(fpath)
elif ftype == KMFileTypes.KM_KMX:
# Sanitize keyboard filename if not lower case
kmx_id, ext = os.path.splitext(os.path.basename(f['name']))
for kb in keyboards:
if kmx_id.lower() == kb['id'] and kmx_id != kb['id']:
os.rename(os.path.join(packageDir, f['name']), os.path.join(packageDir, kb['id']+'.kmx'))
for kb in keyboards:
# install all kmx for first lang not just packageID
kmx_file = os.path.join(packageDir, kb['id'] + ".kmx")
@ -191,7 +202,7 @@ def install_kmp_shared(inputfile, online=False):
raise InstallError(InstallStatus.Abort, message)
def install_kmp_user(inputfile, online=False):
packageID, ext = os.path.splitext(os.path.basename(inputfile))
packageID = extract_package_id(inputfile)
packageDir=user_keyboard_dir(packageID)
if not os.path.isdir(packageDir):
os.makedirs(packageDir)
@ -234,6 +245,13 @@ def install_kmp_user(inputfile, online=False):
elif ftype == KMFileTypes.KM_SOURCE:
#TODO for the moment just leave it for ibus-kmfl to ignore if it doesn't load
pass
elif ftype == KMFileTypes.KM_KMX:
# Sanitize keyboard filename if not lower case
kmx_id, ext = os.path.splitext(os.path.basename(f['name']))
for kb in keyboards:
if kmx_id.lower() == kb['id'] and kmx_id != kb['id']:
os.rename(os.path.join(packageDir, f['name']), os.path.join(packageDir, kb['id']+'.kmx'))
install_keyboards_to_ibus(keyboards, packageDir)
else:
logging.error("install_kmp.py: error: No kmp.json or kmp.inf found in %s", inputfile)