mirror of
https://github.com/kiddin9/op-packages.git
synced 2026-11-13 20:08:05 +08:00
79 lines
5.0 KiB
Python
79 lines
5.0 KiB
Python
"""Verify the save receipt and the allowlisted, user-submitted preset draft."""
|
|
|
|
from pathlib import Path
|
|
import shutil
|
|
import subprocess
|
|
import unittest
|
|
|
|
|
|
JS_FILE = Path(__file__).resolve().parents[1] / "root/www/luci-static/resources/smart_srun.js"
|
|
|
|
|
|
class WizardContributionTests(unittest.TestCase):
|
|
def test_saved_receipt_and_draft_exclude_credentials(self):
|
|
node = shutil.which("node")
|
|
if not node:
|
|
self.skipTest("node is not installed")
|
|
script = r"""
|
|
const fs = require('fs'), vm = require('vm'), assert = require('assert');
|
|
const source = fs.readFileSync(process.argv[1], 'utf8');
|
|
let posts = 0, reloads = 0, renderCount = 0, response, callback;
|
|
const context = {findSchoolPreset: () => ({name:'Example Campus',short_name:'example'}),
|
|
location: {reload() {reloads++;}}, L: {hideModal() {}},
|
|
document: {getElementById(id) {return id === 'smart-srun-config-revision' ? {value:'0'} : null;}}};
|
|
vm.createContext(context);
|
|
vm.runInContext(source.slice(source.indexOf(' function configRevision()'), source.indexOf(' function startUpdate(')), context);
|
|
vm.runInContext(source.slice(source.indexOf(' var WIZ_STEPS'), source.indexOf(' function initAll()')), context);
|
|
context.wizRender = () => {renderCount++;};
|
|
context.wizNormalizeAddress = () => true;
|
|
context.wizPost = (action, payload, done) => {assert.strictEqual(action, 'enqueue'); posts++; callback=done;};
|
|
context.wizError = error => {context.wiz.busy=false; context.wiz.error=error;};
|
|
function setup() {
|
|
context.wizReset();
|
|
Object.assign(context.wiz, {step:4,school:'example',accessMode:'wifi',ssid:'CampusWiFi',
|
|
acId:'7',baseUrl:'https://url-user:url-password@portal.example.test/login?token=secret-token#session',
|
|
userId:'private-account',password:'private-password',wifiKey:'private-wifi-password',
|
|
current_ip:'192.0.2.199',bssid:'02:00:00:00:00:99',selectedSuffix:'realm.example',
|
|
wifiJob:'private-job',passwordVerified:true,
|
|
portalOps:[{suffix:'realm.example',label:'Student'},{suffix:'',label:'Guest'},
|
|
{suffix:'realm.example',label:'Duplicate'},{suffix:'??',label:'Unknown'}],
|
|
ops:[{suffix:'realm.example',label:'Student'},{suffix:'',label:'Guest'}]});
|
|
}
|
|
setup(); context.wizSave();
|
|
assert.strictEqual(posts,1); context.wizSave(); assert.strictEqual(posts,1,'double save while pending');
|
|
assert.ok(!context.wiz.saveComplete,'cannot show success while pending');
|
|
context.wiz.busy=false; callback(null, {ok:true,saved:true});
|
|
assert.strictEqual(context.wiz.saveComplete,true);
|
|
assert.strictEqual(reloads,0,'must keep the receipt open');
|
|
assert.strictEqual(context.wiz.wifiJob,'');
|
|
assert.strictEqual(context.wiz.userId,''); assert.strictEqual(context.wiz.password,'');
|
|
assert.strictEqual(context.wiz.wifiKey,'');
|
|
assert.strictEqual(context.wiz.contribution.defaults.base_url,'https://portal.example.test');
|
|
assert.deepStrictEqual(Array.from(context.wiz.contribution.operators, op=>op.suffix),['realm.example','']);
|
|
assert.strictEqual(context.wiz.contribution.status,'draft','saving is not proof of school-wide compatibility');
|
|
let body = context.wizContributionBody();
|
|
for(const secret of ['private-account','private-password','private-wifi-password','private-job','secret-token',
|
|
'url-user','url-password','192.0.2.199','02:00:00:00:00:99']) assert.ok(!body.includes(secret),secret+' leaked');
|
|
assert.ok(body.includes('已通过插件验证')); assert.ok(body.includes('尚未确认'));
|
|
context.wiz.contributionOnline=true; body=context.wizContributionBody(); assert.ok(body.includes('是(用户确认)'));
|
|
context.wizSave(); assert.strictEqual(posts,1,'cannot save a second account from receipt');
|
|
context.wizClose(); assert.strictEqual(reloads,1); assert.strictEqual(context.wiz,null);
|
|
setup(); context.wizSave(); context.wiz.busy=false; callback(new Error('Request failed'), {});
|
|
assert.ok(!context.wiz.saveComplete); assert.strictEqual(context.wiz.password,'private-password');
|
|
assert.ok(!context.wiz.saved,'failed save must remain retryable');
|
|
setup(); context.wizSave(); context.wiz.busy=false; callback(null, {ok:false,saved:true,message:'Post-save failure'});
|
|
assert.ok(!context.wiz.saveComplete,'partial failure must not claim success');
|
|
assert.strictEqual(context.wiz.saved,true); assert.strictEqual(context.wiz.wifiJob,'');
|
|
const before = posts; context.wizSave(); assert.strictEqual(posts,before,'partial saved result must not duplicate account');
|
|
setup(); context.wiz.portalOps=[]; context.wiz.ops=[]; context.wiz.selectedSuffix='special.school';
|
|
context.wiz.contribution=context.wizContributionData();
|
|
assert.strictEqual(context.wiz.contribution.operators[0].suffix,'special.school');
|
|
context.wiz.selectedSuffix=''; context.wiz.accessMode='wired';
|
|
context.wiz.contribution=context.wizContributionData();
|
|
assert.strictEqual(context.wiz.contribution.operators[0].suffix,'');
|
|
assert.ok(!('ssid' in context.wiz.contribution.defaults));
|
|
"""
|
|
result = subprocess.run([node, "-e", script, str(JS_FILE)], stdin=subprocess.DEVNULL,
|
|
capture_output=True, text=True, encoding="utf-8")
|
|
self.assertEqual(result.returncode, 0, result.stdout + result.stderr)
|