forked from freeipa/freeipa
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
wgi/plugins.py: ignore empty plugin directories
Dynamic plugin registry returns as a plugin any folder within the plugins directory. Web UI then attempts to load for each plugin 'foo' a JavaScript file named 'foo/foo.js'. The problem is that if 'foo/foo.js' does not exist, Web UI breaks and it is impossible to recover until the empty folder is removed or 'foo/foo.js' (even empty) is created at the server side. Check that 'foo/foo.js' actual exists when including a plugin into the registry. Test the registry generator by creating fake plugins and removing them during the test. Fixes: https://pagure.io/freeipa/issue/8567 Signed-off-by: Alexander Bokovoy <[email protected]> Reviewed-By: Florence Blanc-Renaud <[email protected]>
- Loading branch information
Showing
2 changed files
with
72 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
# Copyright (C) 2020 FreeIPA Contributors see COPYING for license | ||
|
||
import os | ||
import pytest | ||
|
||
from ipatests.test_ipaserver.httptest import Unauthorized_HTTP_test | ||
from ipatests.util import assert_equal, assert_not_equal | ||
from ipaplatform.paths import paths | ||
|
||
|
||
@pytest.mark.tier1 | ||
class test_jsplugins(Unauthorized_HTTP_test): | ||
app_uri = '/ipa/ui/js/freeipa/plugins.js' | ||
jsplugins = (('foo', 'foo.js'), ('bar', '')) | ||
content_type = 'application/javascript' | ||
|
||
def test_jsplugins(self): | ||
empty_response = "define([],function(){return[];});" | ||
|
||
# Step 1: make sure default response has no additional plugins | ||
response = self.send_request(method='GET') | ||
assert_equal(response.status, 200) | ||
response_data = response.read().decode(encoding='utf-8') | ||
assert_equal(response_data, empty_response) | ||
|
||
# Step 2: add fake plugins | ||
try: | ||
for (d, f) in self.jsplugins: | ||
dir = os.path.join(paths.IPA_JS_PLUGINS_DIR, d) | ||
if not os.path.exists(dir): | ||
os.mkdir(dir, 0o755) | ||
if f: | ||
with open(os.path.join(dir, f), 'w') as js: | ||
js.write("/* test js plugin */") | ||
|
||
except OSError as e: | ||
pytest.skip( | ||
'Cannot set up test JS plugin: %s' % e | ||
) | ||
|
||
# Step 3: query plugins to see if our plugins exist | ||
response = self.send_request(method='GET') | ||
assert_equal(response.status, 200) | ||
response_data = response.read().decode(encoding='utf-8') | ||
assert_not_equal(response_data, empty_response) | ||
for (d, f) in self.jsplugins: | ||
if f: | ||
assert "'" + d + "'" in response_data | ||
else: | ||
assert "'" + d + "'" not in response_data | ||
|
||
# Step 4: remove fake plugins | ||
try: | ||
for (d, f) in self.jsplugins: | ||
dir = os.path.join(paths.IPA_JS_PLUGINS_DIR, d) | ||
file = os.path.join(dir, f) | ||
if f and os.path.exists(file): | ||
os.unlink(file) | ||
if os.path.exists(dir): | ||
os.rmdir(dir) | ||
except OSError: | ||
pass | ||
|
||
# Step 5: make sure default response has no additional plugins | ||
response = self.send_request(method='GET') | ||
assert_equal(response.status, 200) | ||
response_data = response.read().decode(encoding='utf-8') | ||
assert_equal(response_data, empty_response) |