| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890 |
- (function() {
- var attachedPrefix, charCodeUnderscore, colors, profileColorPalette, profileColors;
- angular.module('omega').constant('builtinProfiles', OmegaPac.Profiles.builtinProfiles);
- profileColors = ['#9ce', '#9d9', '#fa8', '#fe9', '#d497ee', '#47b', '#5b5', '#d63', '#ca0'];
- colors = [].concat(profileColors);
- profileColorPalette = ((function() {
- var _results;
- _results = [];
- while (colors.length) {
- _results.push(colors.splice(0, 3));
- }
- return _results;
- })());
- angular.module('omega').constant('profileColors', profileColors);
- angular.module('omega').constant('profileColorPalette', profileColorPalette);
- attachedPrefix = '__ruleListOf_';
- angular.module('omega').constant('getAttachedName', function(name) {
- return attachedPrefix + name;
- });
- angular.module('omega').constant('getParentName', function(name) {
- if (name.indexOf(attachedPrefix) === 0) {
- return name.substr(attachedPrefix.length);
- } else {
- return void 0;
- }
- });
- charCodeUnderscore = '_'.charCodeAt(0);
- angular.module('omega').constant('charCodeUnderscore', charCodeUnderscore);
- angular.module('omega').constant('isProfileNameHidden', function(name) {
- return name.charCodeAt(0) === charCodeUnderscore;
- });
- angular.module('omega').constant('isProfileNameReserved', function(name) {
- return name.charCodeAt(0) === charCodeUnderscore && name.charCodeAt(1) === charCodeUnderscore;
- });
- angular.module('omega').config(function($stateProvider, $urlRouterProvider, $httpProvider, $animateProvider, $compileProvider) {
- $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|chrome-extension|moz-extension):/);
- $compileProvider.imgSrcSanitizationWhitelist(/^\s*(https?|local|data|chrome-extension|moz-extension):/);
- $animateProvider.classNameFilter(/angular-animate/);
- $urlRouterProvider.otherwise('/about');
- $urlRouterProvider.otherwise(function($injector, $location) {
- if ($location.path() === '') {
- return $injector.get('omegaTarget').lastUrl() || '/about';
- } else {
- return '/about';
- }
- });
- return $stateProvider.state('ui', {
- url: '/ui',
- templateUrl: 'partials/ui.html'
- }).state('general', {
- url: '/general',
- templateUrl: 'partials/general.html'
- }).state('io', {
- url: '/io',
- templateUrl: 'partials/io.html',
- controller: 'IoCtrl'
- }).state('profile', {
- url: '/profile/*name',
- templateUrl: 'partials/profile.html',
- controller: 'ProfileCtrl'
- }).state('about', {
- url: '/about',
- templateUrl: 'partials/about.html',
- controller: 'AboutCtrl'
- });
- });
- angular.module('omega').factory('$exceptionHandler', function($log) {
- return function(exception, cause) {
- if (exception.message === 'transition aborted') {
- return;
- }
- if (exception.message === 'transition superseded') {
- return;
- }
- if (exception.message === 'transition prevented') {
- return;
- }
- if (exception.message === 'transition failed') {
- return;
- }
- return $log.error(exception, cause);
- };
- });
- angular.module('omega').factory('omegaDebug', function($window, $rootScope, $injector) {
- var omegaDebug, _ref;
- omegaDebug = (_ref = $window.OmegaDebug) != null ? _ref : {};
- if (omegaDebug.downloadLog == null) {
- omegaDebug.downloadLog = function() {
- var blob, downloadFile, _ref1;
- downloadFile = (_ref1 = $injector.get('downloadFile')) != null ? _ref1 : saveAs;
- blob = new Blob([localStorage['log']], {
- type: "text/plain;charset=utf-8"
- });
- return downloadFile(blob, "OmegaLog_" + (Date.now()) + ".txt");
- };
- }
- if (omegaDebug.reportIssue == null) {
- omegaDebug.reportIssue = function() {
- $window.open('https://github.com/FelisCatus/SwitchyOmega/issues/new?title=&body=');
- };
- }
- if (omegaDebug.resetOptions == null) {
- omegaDebug.resetOptions = function() {
- return $rootScope.resetOptions();
- };
- }
- return omegaDebug;
- });
- angular.module('omega').factory('downloadFile', function() {
- var _ref;
- if ((typeof browser !== "undefined" && browser !== null ? (_ref = browser.downloads) != null ? _ref.download : void 0 : void 0) != null) {
- return function(blob, filename) {
- var url;
- url = URL.createObjectURL(blob);
- if (filename) {
- return browser.downloads.download({
- url: url,
- filename: filename
- });
- } else {
- return browser.downloads.download({
- url: url
- });
- }
- };
- } else {
- return function(blob, filename) {
- var noAutoBom;
- noAutoBom = true;
- return saveAs(blob, filename, noAutoBom);
- };
- }
- });
- }).call(this);
- (function() {
- angular.module('omega').controller('AboutCtrl', function($scope, $rootScope, $modal, omegaDebug) {
- var _;
- $scope.downloadLog = omegaDebug.downloadLog;
- $scope.reportIssue = omegaDebug.reportIssue;
- $scope.showResetOptionsModal = function() {
- return $modal.open({
- templateUrl: 'partials/reset_options_confirm.html'
- }).result.then(function() {
- return omegaDebug.resetOptions();
- });
- };
- try {
- return $scope.version = omegaDebug.getProjectVersion();
- } catch (_error) {
- _ = _error;
- return $scope.version = '?.?.?';
- }
- });
- }).call(this);
- (function() {
- angular.module('omega').controller('FixedProfileCtrl', function($scope, $modal, trFilter) {
- var defaultLabel, defaultPort, onBypassListChange, onProxyChange, proxyProperties, scheme, socks5AuthSupported, _fn, _i, _j, _len, _len1, _ref, _ref1, _ref2;
- $scope.urlSchemes = ['', 'http', 'https', 'ftp'];
- $scope.urlSchemeDefault = 'fallbackProxy';
- proxyProperties = {
- '': 'fallbackProxy',
- 'http': 'proxyForHttp',
- 'https': 'proxyForHttps',
- 'ftp': 'proxyForFtp'
- };
- $scope.schemeDisp = {
- '': null,
- 'http': 'http://',
- 'https': 'https://',
- 'ftp': 'ftp://'
- };
- defaultPort = {
- 'http': 80,
- 'https': 443,
- 'socks4': 1080,
- 'socks5': 1080
- };
- $scope.showAdvanced = false;
- $scope.optionsForScheme = {};
- _ref = $scope.urlSchemes;
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- scheme = _ref[_i];
- defaultLabel = scheme ? trFilter('options_protocol_useDefault') : trFilter('options_protocol_direct');
- $scope.optionsForScheme[scheme] = [
- {
- label: defaultLabel,
- value: void 0
- }, {
- label: 'HTTP',
- value: 'http'
- }, {
- label: 'HTTPS',
- value: 'https'
- }, {
- label: 'SOCKS4',
- value: 'socks4'
- }, {
- label: 'SOCKS5',
- value: 'socks5'
- }
- ];
- }
- $scope.proxyEditors = {};
- socks5AuthSupported = ((typeof browser !== "undefined" && browser !== null ? (_ref1 = browser.proxy) != null ? _ref1.register : void 0 : void 0) != null);
- $scope.authSupported = {
- "http": true,
- "https": true,
- "socks5": socks5AuthSupported
- };
- $scope.isProxyAuthActive = function(scheme) {
- var _ref2;
- return ((_ref2 = $scope.profile.auth) != null ? _ref2[proxyProperties[scheme]] : void 0) != null;
- };
- $scope.editProxyAuth = function(scheme) {
- var auth, prop, proxy, scope, _ref2;
- prop = proxyProperties[scheme];
- proxy = $scope.profile[prop];
- scope = $scope.$new('isolate');
- scope.proxy = proxy;
- auth = (_ref2 = $scope.profile.auth) != null ? _ref2[prop] : void 0;
- scope.auth = auth && angular.copy(auth);
- scope.authSupported = $scope.authSupported[proxy.scheme];
- scope.protocolDisp = proxy.scheme;
- return $modal.open({
- templateUrl: 'partials/fixed_auth_edit.html',
- scope: scope,
- size: scope.authSupported ? 'sm' : 'lg'
- }).result.then(function(auth) {
- var _base;
- if (!(auth != null ? auth.username : void 0)) {
- if ($scope.profile.auth) {
- return $scope.profile.auth[prop] = void 0;
- }
- } else {
- if ((_base = $scope.profile).auth == null) {
- _base.auth = {};
- }
- return $scope.profile.auth[prop] = auth;
- }
- });
- };
- onProxyChange = function(proxyEditors, oldProxyEditors) {
- var proxy, _base, _j, _len1, _name, _ref2, _ref3, _results;
- if (!proxyEditors) {
- return;
- }
- _ref2 = $scope.urlSchemes;
- _results = [];
- for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
- scheme = _ref2[_j];
- proxy = proxyEditors[scheme];
- if ($scope.profile.auth && !$scope.authSupported[proxy.scheme]) {
- delete $scope.profile.auth[proxyProperties[scheme]];
- }
- if (!proxy.scheme) {
- if (!scheme) {
- proxyEditors[scheme] = {};
- }
- delete $scope.profile[proxyProperties[scheme]];
- continue;
- } else if (!oldProxyEditors[scheme].scheme) {
- if (proxy.scheme === proxyEditors[''].scheme) {
- if (proxy.port == null) {
- proxy.port = proxyEditors[''].port;
- }
- }
- if (proxy.port == null) {
- proxy.port = defaultPort[proxy.scheme];
- }
- if (proxy.host == null) {
- proxy.host = (_ref3 = proxyEditors[''].host) != null ? _ref3 : 'example.com';
- }
- }
- _results.push((_base = $scope.profile)[_name = proxyProperties[scheme]] != null ? _base[_name] : _base[_name] = proxy);
- }
- return _results;
- };
- _ref2 = $scope.urlSchemes;
- _fn = function(scheme) {
- return $scope.$watch((function() {
- return $scope.profile[proxyProperties[scheme]];
- }), function(proxy) {
- if (scheme && proxy) {
- $scope.showAdvanced = true;
- }
- return $scope.proxyEditors[scheme] = proxy != null ? proxy : {};
- });
- };
- for (_j = 0, _len1 = _ref2.length; _j < _len1; _j++) {
- scheme = _ref2[_j];
- _fn(scheme);
- }
- $scope.$watch('proxyEditors', onProxyChange, true);
- onBypassListChange = function(list) {
- var item;
- return $scope.bypassList = ((function() {
- var _k, _len2, _results;
- _results = [];
- for (_k = 0, _len2 = list.length; _k < _len2; _k++) {
- item = list[_k];
- _results.push(item.pattern);
- }
- return _results;
- })()).join('\n');
- };
- $scope.$watch('profile.bypassList', onBypassListChange, true);
- return $scope.$watch('bypassList', function(bypassList, oldList) {
- var entry;
- if ((bypassList == null) || bypassList === oldList) {
- return;
- }
- return $scope.profile.bypassList = (function() {
- var _k, _len2, _ref3, _results;
- _ref3 = bypassList.split(/\r?\n/);
- _results = [];
- for (_k = 0, _len2 = _ref3.length; _k < _len2; _k++) {
- entry = _ref3[_k];
- if (entry) {
- _results.push({
- conditionType: "BypassCondition",
- pattern: entry
- });
- }
- }
- return _results;
- })();
- });
- });
- }).call(this);
- (function() {
- angular.module('omega').controller('IoCtrl', function($scope, $rootScope, $window, $http, omegaTarget, downloadFile) {
- omegaTarget.state('web.restoreOnlineUrl').then(function(url) {
- if (url) {
- return $scope.restoreOnlineUrl = url;
- }
- });
- $scope.exportOptions = function() {
- return $rootScope.applyOptionsConfirm().then(function() {
- var blob, content, plainOptions;
- plainOptions = angular.fromJson(angular.toJson($rootScope.options));
- content = JSON.stringify(plainOptions);
- blob = new Blob([content], {
- type: "text/plain;charset=utf-8"
- });
- return downloadFile(blob, "OmegaOptions.bak");
- });
- };
- $scope.importSuccess = function() {
- return $rootScope.showAlert({
- type: 'success',
- i18n: 'options_importSuccess',
- message: 'Options imported.'
- });
- };
- $scope.restoreLocal = function(content) {
- $scope.restoringLocal = true;
- return $rootScope.resetOptions(content).then((function() {
- return $scope.importSuccess();
- }), function() {
- return $scope.restoreLocalError();
- })["finally"](function() {
- return $scope.restoringLocal = false;
- });
- };
- $scope.restoreLocalError = function() {
- return $rootScope.showAlert({
- type: 'error',
- i18n: 'options_importFormatError',
- message: 'Invalid backup file!'
- });
- };
- $scope.downloadError = function() {
- return $rootScope.showAlert({
- type: 'error',
- i18n: 'options_importDownloadError',
- message: 'Error downloading backup file!'
- });
- };
- $scope.triggerFileInput = function() {
- angular.element('#restore-local-file').click();
- };
- $scope.restoreOnline = function() {
- omegaTarget.state('web.restoreOnlineUrl', $scope.restoreOnlineUrl);
- $scope.restoringOnline = true;
- return $http({
- method: 'GET',
- url: $scope.restoreOnlineUrl,
- cache: false,
- timeout: 10000,
- responseType: "text"
- }).then((function(result) {
- return $rootScope.resetOptions(result.data).then((function() {
- return $scope.importSuccess();
- }), function() {
- return $scope.restoreLocalError();
- });
- }), $scope.downloadError)["finally"](function() {
- return $scope.restoringOnline = false;
- });
- };
- $scope.enableOptionsSync = function(args) {
- var enable;
- enable = function() {
- return omegaTarget.setOptionsSync(true, args)["finally"](function() {
- return $window.location.reload();
- });
- };
- if (args != null ? args.force : void 0) {
- return enable();
- } else {
- return $rootScope.applyOptionsConfirm().then(enable);
- }
- };
- $scope.disableOptionsSync = function() {
- return omegaTarget.setOptionsSync(false).then(function() {
- return $rootScope.applyOptionsConfirm().then(function() {
- return $window.location.reload();
- });
- });
- };
- return $scope.resetOptionsSync = function() {
- return omegaTarget.resetOptionsSync().then(function() {
- return $rootScope.applyOptionsConfirm().then(function() {
- return $window.location.reload();
- });
- });
- };
- });
- }).call(this);
- (function() {
- var __hasProp = {}.hasOwnProperty;
- angular.module('omega').controller('MasterCtrl', function($scope, $rootScope, $window, $q, $modal, $state, profileColors, profileIcons, omegaTarget, $timeout, $location, $filter, getAttachedName, isProfileNameReserved, isProfileNameHidden, dispNameFilter, downloadFile) {
- var checkFormValid, diff, onOptionChange, showFirstRun, showFirstRunOnce, tr, type, _ref, _ref1, _ref2;
- if (((typeof browser !== "undefined" && browser !== null ? (_ref = browser.proxy) != null ? _ref.register : void 0 : void 0) != null) || ((typeof browser !== "undefined" && browser !== null ? (_ref1 = browser.proxy) != null ? _ref1.registerProxyScript : void 0 : void 0) != null)) {
- $scope.isExperimental = true;
- $scope.pacProfilesUnsupported = true;
- }
- tr = $filter('tr');
- $rootScope.options = null;
- omegaTarget.addOptionsChangeCallback(function(newOptions) {
- $rootScope.options = angular.copy(newOptions);
- $rootScope.optionsOld = angular.copy(newOptions);
- omegaTarget.state('syncOptions').then(function(syncOptions) {
- return $scope.syncOptions = syncOptions;
- });
- return $timeout(function() {
- $rootScope.optionsDirty = false;
- return showFirstRun();
- });
- });
- $rootScope.revertOptions = function() {
- return $window.location.reload();
- };
- $rootScope.exportScript = function(name) {
- var getProfileName;
- getProfileName = name ? $q.when(name) : omegaTarget.state('currentProfileName');
- return getProfileName.then(function(profileName) {
- var ast, blob, fileName, missingProfile, pac, profile, profileNotFound, _ref2;
- if (!profileName) {
- return;
- }
- profile = $rootScope.profileByName(profileName);
- if ((_ref2 = profile.profileType) === 'DirectProfile' || _ref2 === 'SystemProfile') {
- return;
- }
- missingProfile = null;
- profileNotFound = function(name) {
- missingProfile = name;
- return 'dumb';
- };
- ast = OmegaPac.PacGenerator.script($rootScope.options, profileName, {
- profileNotFound: profileNotFound
- });
- pac = ast.print_to_string({
- beautify: true,
- comments: true
- });
- pac = OmegaPac.PacGenerator.ascii(pac);
- blob = new Blob([pac], {
- type: "text/plain;charset=utf-8"
- });
- fileName = profileName.replace(/\W+/g, '_');
- downloadFile(blob, "OmegaProfile_" + fileName + ".pac");
- if (missingProfile) {
- return $timeout(function() {
- return $rootScope.showAlert({
- type: 'error',
- message: tr('options_profileNotFound', [missingProfile])
- });
- });
- }
- });
- };
- diff = jsondiffpatch.create({
- objectHash: function(obj) {
- return JSON.stringify(obj);
- },
- textDiff: {
- minLength: 1 / 0
- }
- });
- $rootScope.showAlert = function(alert) {
- return $timeout(function() {
- $scope.alert = alert;
- $scope.alertShown = true;
- $scope.alertShownAt = Date.now();
- $timeout($rootScope.hideAlert, 3000);
- });
- };
- $rootScope.hideAlert = function() {
- return $timeout(function() {
- if (Date.now() - $scope.alertShownAt >= 1000) {
- return $scope.alertShown = false;
- }
- });
- };
- checkFormValid = function() {
- var fields;
- fields = angular.element('.ng-invalid');
- if (fields.length > 0) {
- fields[0].focus();
- $rootScope.showAlert({
- type: 'error',
- i18n: 'options_formInvalid'
- });
- return false;
- }
- return true;
- };
- $rootScope.applyOptions = function() {
- var patch, plainOptions;
- if (!checkFormValid()) {
- return;
- }
- if ($rootScope.$broadcast('omegaApplyOptions').defaultPrevented) {
- return;
- }
- plainOptions = angular.fromJson(angular.toJson($rootScope.options));
- patch = diff.diff($rootScope.optionsOld, plainOptions);
- return omegaTarget.optionsPatch(patch).then(function() {
- return $rootScope.showAlert({
- type: 'success',
- i18n: 'options_saveSuccess'
- });
- });
- };
- $rootScope.resetOptions = function(options) {
- return omegaTarget.resetOptions(options).then(function() {
- return $rootScope.showAlert({
- type: 'success',
- i18n: 'options_resetSuccess'
- });
- })["catch"](function(err) {
- $rootScope.showAlert({
- type: 'error',
- message: err
- });
- return $q.reject(err);
- });
- };
- $rootScope.profileByName = function(name) {
- return OmegaPac.Profiles.byName(name, $rootScope.options);
- };
- $rootScope.systemProfile = $rootScope.profileByName('system');
- $rootScope.externalProfile = {
- color: '#49afcd',
- name: tr('popup_externalProfile'),
- profileType: 'FixedProfile',
- fallbackProxy: {
- host: "127.0.0.1",
- port: 42,
- scheme: "http"
- }
- };
- $rootScope.applyOptionsConfirm = function() {
- if (!checkFormValid()) {
- return $q.reject('form_invalid');
- }
- if (!$rootScope.optionsDirty) {
- return $q.when(true);
- }
- return $modal.open({
- templateUrl: 'partials/apply_options_confirm.html'
- }).result.then(function() {
- return $rootScope.applyOptions();
- });
- };
- $rootScope.newProfile = function() {
- var scope;
- scope = $rootScope.$new('isolate');
- scope.options = $rootScope.options;
- scope.isProfileNameReserved = isProfileNameReserved;
- scope.isProfileNameHidden = isProfileNameHidden;
- scope.profileByName = $rootScope.profileByName;
- scope.validateProfileName = {
- conflict: '!$value || !profileByName($value)',
- reserved: '!$value || !isProfileNameReserved($value)'
- };
- scope.profileIcons = profileIcons;
- scope.dispNameFilter = dispNameFilter;
- scope.options = $scope.options;
- scope.pacProfilesUnsupported = $scope.pacProfilesUnsupported;
- return $modal.open({
- templateUrl: 'partials/new_profile.html',
- scope: scope
- }).result.then(function(profile) {
- var choice;
- profile = OmegaPac.Profiles.create(profile);
- choice = Math.floor(Math.random() * profileColors.length);
- if (profile.color == null) {
- profile.color = profileColors[choice];
- }
- OmegaPac.Profiles.updateRevision(profile);
- $rootScope.options[OmegaPac.Profiles.nameAsKey(profile)] = profile;
- return $state.go('profile', {
- name: profile.name
- });
- });
- };
- $rootScope.replaceProfile = function(fromName, toName) {
- return $rootScope.applyOptionsConfirm().then(function() {
- var scope;
- scope = $rootScope.$new('isolate');
- scope.options = $rootScope.options;
- scope.fromName = fromName;
- scope.toName = toName;
- scope.profileByName = $rootScope.profileByName;
- scope.dispNameFilter = dispNameFilter;
- scope.options = $scope.options;
- scope.profileSelect = function(model) {
- return "<div omega-profile-select=\"options | profiles:profile\"\n ng-model=\"" + model + "\" options=\"options\"\n disp-name=\"dispNameFilter\" style=\"display: inline-block;\">\n</div>";
- };
- return $modal.open({
- templateUrl: 'partials/replace_profile.html',
- scope: scope
- }).result.then(function(_arg) {
- var fromName, toName;
- fromName = _arg.fromName, toName = _arg.toName;
- return omegaTarget.replaceRef(fromName, toName).then(function() {
- return $rootScope.showAlert({
- type: 'success',
- i18n: 'options_replaceProfileSuccess'
- });
- })["catch"](function(err) {
- return $rootScope.showAlert({
- type: 'error',
- message: err
- });
- });
- });
- });
- };
- $rootScope.renameProfile = function(fromName) {
- return $rootScope.applyOptionsConfirm().then(function() {
- var profile, scope;
- profile = $rootScope.profileByName(fromName);
- scope = $rootScope.$new('isolate');
- scope.options = $rootScope.options;
- scope.fromName = fromName;
- scope.isProfileNameReserved = isProfileNameReserved;
- scope.isProfileNameHidden = isProfileNameHidden;
- scope.profileByName = $rootScope.profileByName;
- scope.validateProfileName = {
- conflict: '!$value || $value == fromName || !profileByName($value)',
- reserved: '!$value || !isProfileNameReserved($value)'
- };
- scope.dispNameFilter = $scope.dispNameFilter;
- scope.options = $scope.options;
- return $modal.open({
- templateUrl: 'partials/rename_profile.html',
- scope: scope
- }).result.then(function(toName) {
- var attachedName, defaultProfileName, rename, toAttachedName;
- if (toName !== fromName) {
- rename = omegaTarget.renameProfile(fromName, toName);
- attachedName = getAttachedName(fromName);
- if ($rootScope.profileByName(attachedName)) {
- toAttachedName = getAttachedName(toName);
- defaultProfileName = void 0;
- if ($rootScope.profileByName(toAttachedName)) {
- defaultProfileName = profile.defaultProfileName;
- rename = rename.then(function() {
- var toAttachedKey;
- toAttachedKey = OmegaPac.Profiles.nameAsKey(toAttachedName);
- profile = $rootScope.profileByName(toName);
- profile.defaultProfileName = 'direct';
- OmegaPac.Profiles.updateRevision(profile);
- delete $rootScope.options[toAttachedKey];
- return $rootScope.applyOptions();
- });
- }
- rename = rename.then(function() {
- return omegaTarget.renameProfile(attachedName, toAttachedName);
- });
- if (defaultProfileName) {
- rename = rename.then(function() {
- profile = $rootScope.profileByName(toName);
- profile.defaultProfileName = defaultProfileName;
- return $rootScope.applyOptions();
- });
- }
- }
- return rename.then(function() {
- return $state.go('profile', {
- name: toName
- });
- })["catch"](function(err) {
- return $rootScope.showAlert({
- type: 'error',
- message: err
- });
- });
- }
- });
- });
- };
- $scope.updatingProfile = {};
- $rootScope.updateProfile = function(name) {
- return $rootScope.applyOptionsConfirm().then(function() {
- if (name != null) {
- $scope.updatingProfile[name] = true;
- } else {
- OmegaPac.Profiles.each($scope.options, function(key, profile) {
- if (!profile.builtin) {
- return $scope.updatingProfile[profile.name] = true;
- }
- });
- }
- return omegaTarget.updateProfile(name, 'bypass_cache').then(function(results) {
- var error, profileName, result, singleErr, success;
- success = 0;
- error = 0;
- for (profileName in results) {
- if (!__hasProp.call(results, profileName)) continue;
- result = results[profileName];
- if (result instanceof Error) {
- error++;
- } else {
- success++;
- }
- }
- if (error === 0) {
- return $rootScope.showAlert({
- type: 'success',
- i18n: 'options_profileDownloadSuccess'
- });
- } else {
- if (error === 1) {
- singleErr = results[OmegaPac.Profiles.nameAsKey(name)];
- if (singleErr) {
- return $q.reject(singleErr);
- }
- }
- return $q.reject(results);
- }
- })["catch"](function(err) {
- var message, _ref2, _ref3, _ref4;
- message = tr('options_profileDownloadError_' + err.name, [(_ref2 = (_ref3 = err.statusCode) != null ? _ref3 : (_ref4 = err.original) != null ? _ref4.statusCode : void 0) != null ? _ref2 : '']);
- if (message) {
- return $rootScope.showAlert({
- type: 'error',
- message: message
- });
- } else {
- return $rootScope.showAlert({
- type: 'error',
- i18n: 'options_profileDownloadError'
- });
- }
- })["finally"](function() {
- if (name != null) {
- return $scope.updatingProfile[name] = false;
- } else {
- return $scope.updatingProfile = {};
- }
- });
- });
- };
- onOptionChange = function(options, oldOptions) {
- if (options === oldOptions || (oldOptions == null)) {
- return;
- }
- return $rootScope.optionsDirty = true;
- };
- $rootScope.$watch('options', onOptionChange, true);
- $rootScope.$on('$stateChangeStart', function(event, _, __, fromState) {
- if (!checkFormValid()) {
- return event.preventDefault();
- }
- });
- $rootScope.$on('$stateChangeSuccess', function() {
- return omegaTarget.lastUrl($location.url());
- });
- $window.onbeforeunload = function() {
- if ($rootScope.optionsDirty) {
- return tr('options_optionsNotSaved');
- } else {
- return null;
- }
- };
- document.addEventListener('click', (function() {
- return $rootScope.hideAlert();
- }), false);
- $scope.profileIcons = profileIcons;
- $scope.dispNameFilter = dispNameFilter;
- _ref2 = OmegaPac.Profiles.formatByType;
- for (type in _ref2) {
- if (!__hasProp.call(_ref2, type)) continue;
- $scope.profileIcons[type] = $scope.profileIcons['RuleListProfile'];
- }
- $scope.alertIcons = {
- 'success': 'glyphicon-ok',
- 'warning': 'glyphicon-warning-sign',
- 'error': 'glyphicon-remove',
- 'danger': 'glyphicon-danger'
- };
- $scope.alertClassForType = function(type) {
- if (!type) {
- return '';
- }
- if (type === 'error') {
- type = 'danger';
- }
- return 'alert-' + type;
- };
- $scope.downloadIntervals = [15, 60, 180, 360, 720, 1440, -1];
- $scope.downloadIntervalI18n = function(interval) {
- return "options_downloadInterval_" + (interval < 0 ? "never" : interval);
- };
- $scope.openShortcutConfig = omegaTarget.openShortcutConfig.bind(omegaTarget);
- showFirstRunOnce = true;
- showFirstRun = function() {
- if (!showFirstRunOnce) {
- return;
- }
- showFirstRunOnce = false;
- return omegaTarget.state('firstRun').then(function(firstRun) {
- var profileName, scope;
- if (!firstRun) {
- return;
- }
- omegaTarget.state('firstRun', '');
- profileName = null;
- OmegaPac.Profiles.each($rootScope.options, function(key, profile) {
- if (!profileName && profile.profileType === 'FixedProfile') {
- return profileName = profile.name;
- }
- });
- if (!profileName) {
- return;
- }
- scope = $rootScope.$new('isolate');
- scope.upgrade = firstRun === 'upgrade';
- return $modal.open({
- templateUrl: 'partials/options_welcome.html',
- keyboard: false,
- scope: scope,
- backdrop: 'static',
- backdropClass: 'opacity-half'
- }).result.then(function(r) {
- switch (r) {
- case 'later':
- break;
- case 'show':
- return $state.go('profile', {
- name: profileName
- }).then(function() {
- return $script('js/options_guide.js');
- });
- }
- });
- });
- };
- return omegaTarget.refresh();
- });
- }).call(this);
- (function() {
- angular.module('omega').controller('PacProfileCtrl', function($scope, $modal) {
- var oldLastUpdate, oldPacScript, oldPacUrl, onProfileChange, set;
- $scope.urlRegex = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
- $scope.urlWithFile = /^(ftp|http|https|file):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
- $scope.isFileUrl = OmegaPac.Profiles.isFileUrl;
- $scope.pacUrlCtrl = {
- ctrl: null
- };
- set = OmegaPac.Profiles.referencedBySet($scope.profile, $scope.options);
- $scope.referenced = Object.keys(set).length > 0;
- oldPacUrl = null;
- oldLastUpdate = null;
- oldPacScript = null;
- onProfileChange = function(profile, oldProfile) {
- if (!(profile && oldProfile)) {
- return;
- }
- if (profile.pacUrl !== oldProfile.pacUrl) {
- if (profile.lastUpdate) {
- oldPacUrl = oldProfile.pacUrl;
- oldLastUpdate = profile.lastUpdate;
- oldPacScript = oldProfile.pacScript;
- profile.lastUpdate = null;
- } else if (oldPacUrl && profile.pacUrl === oldPacUrl) {
- profile.lastUpdate = oldLastUpdate;
- profile.pacScript = oldPacScript;
- }
- }
- return $scope.pacUrlIsFile = $scope.isFileUrl(profile.pacUrl);
- };
- $scope.$watch('profile', onProfileChange, true);
- return $scope.editProxyAuth = function(scheme) {
- var auth, prop, scope, _ref;
- prop = 'all';
- auth = (_ref = $scope.profile.auth) != null ? _ref[prop] : void 0;
- scope = $scope.$new('isolate');
- scope.auth = auth && angular.copy(auth);
- return $modal.open({
- templateUrl: 'partials/fixed_auth_edit.html',
- scope: scope,
- size: 'sm'
- }).result.then(function(auth) {
- var _base;
- if (!(auth != null ? auth.username : void 0)) {
- if ($scope.profile.auth) {
- return $scope.profile.auth[prop] = void 0;
- }
- } else {
- if ((_base = $scope.profile).auth == null) {
- _base.auth = {};
- }
- return $scope.profile.auth[prop] = auth;
- }
- });
- };
- });
- }).call(this);
- (function() {
- var __hasProp = {}.hasOwnProperty;
- angular.module('omega').controller('ProfileCtrl', function($scope, $stateParams, $location, $rootScope, $timeout, $state, $modal, profileColorPalette, getAttachedName, getParentName, getVirtualTarget) {
- var name, profileTemplates, unwatch;
- name = $stateParams.name;
- profileTemplates = {
- 'FixedProfile': 'profile_fixed.html',
- 'PacProfile': 'profile_pac.html',
- 'VirtualProfile': 'profile_virtual.html',
- 'SwitchProfile': 'profile_switch.html',
- 'RuleListProfile': 'profile_rule_list.html'
- };
- $scope.spectrumOptions = {
- localStorageKey: 'spectrum.profileColor',
- palette: profileColorPalette,
- preferredFormat: 'hex',
- showButtons: false,
- showInitial: true,
- showInput: true,
- showPalette: true,
- showSelectionPalette: true,
- maxSelectionSize: 5
- };
- $scope.getProfileColor = function() {
- var color, profile;
- color = void 0;
- profile = $scope.profile;
- while (profile) {
- color = profile.color;
- profile = getVirtualTarget(profile, $scope.options);
- }
- return color;
- };
- $scope.deleteProfile = function() {
- var key, parent, pname, profileName, refProfiles, refSet, refs, scope;
- profileName = $scope.profile.name;
- refs = OmegaPac.Profiles.referencedBySet(profileName, $rootScope.options);
- scope = $rootScope.$new('isolate');
- scope.profile = $scope.profile;
- scope.dispNameFilter = $scope.dispNameFilter;
- scope.options = $scope.options;
- if (Object.keys(refs).length > 0) {
- refSet = {};
- for (key in refs) {
- if (!__hasProp.call(refs, key)) continue;
- pname = refs[key];
- parent = getParentName(pname);
- if (parent) {
- key = OmegaPac.Profiles.nameAsKey(parent);
- pname = parent;
- }
- refSet[key] = pname;
- }
- refProfiles = [];
- for (key in refSet) {
- if (!__hasProp.call(refSet, key)) continue;
- refProfiles.push(OmegaPac.Profiles.byKey(key, $rootScope.options));
- }
- scope.refs = refProfiles;
- $modal.open({
- templateUrl: 'partials/cannot_delete_profile.html',
- scope: scope
- });
- } else {
- return $modal.open({
- templateUrl: 'partials/delete_profile.html',
- scope: scope
- }).result.then(function() {
- var attachedName, i, quickSwitch, _i, _ref;
- attachedName = getAttachedName(profileName);
- delete $rootScope.options[OmegaPac.Profiles.nameAsKey(attachedName)];
- delete $rootScope.options[OmegaPac.Profiles.nameAsKey(profileName)];
- if ($rootScope.options['-startupProfileName'] === profileName) {
- $rootScope.options['-startupProfileName'] = "";
- }
- quickSwitch = $rootScope.options['-quickSwitchProfiles'];
- for (i = _i = 0, _ref = quickSwitch.length; 0 <= _ref ? _i < _ref : _i > _ref; i = 0 <= _ref ? ++_i : --_i) {
- if (profileName === quickSwitch[i]) {
- quickSwitch.splice(i, 1);
- break;
- }
- }
- return $state.go('ui');
- });
- }
- };
- $scope.watchAndUpdateRevision = function(expression) {
- var onChange, revisionChanged;
- revisionChanged = false;
- onChange = function(profile, oldProfile) {
- if (profile === oldProfile || !profile || !oldProfile) {
- return profile;
- }
- if (revisionChanged && profile.revision !== oldProfile.revision) {
- return revisionChanged = false;
- } else {
- OmegaPac.Profiles.updateRevision(profile);
- return revisionChanged = true;
- }
- };
- return this.$watch(expression, onChange, true);
- };
- $scope.exportRuleList = null;
- $scope.exportRuleListOptions = null;
- $scope.setExportRuleListHandler = function(exportRuleList, options) {
- $scope.exportRuleList = exportRuleList;
- return $scope.exportRuleListOptions = options;
- };
- return unwatch = $scope.$watch((function() {
- var _ref;
- return (_ref = $scope.options) != null ? _ref['+' + name] : void 0;
- }), function(profile) {
- var templ, type, unwatch2, _ref;
- if (!profile) {
- if ($scope.options) {
- unwatch();
- $location.path('/');
- } else {
- unwatch2 = $scope.$watch('options', function() {
- if ($scope.options) {
- unwatch2();
- if (!$scope.options['+' + name]) {
- unwatch();
- return $location.path('/');
- }
- }
- });
- }
- return;
- }
- if (OmegaPac.Profiles.formatByType[profile.profileType]) {
- profile.format = OmegaPac.Profiles.formatByType[profile.profileType];
- profile.profileType = 'RuleListProfile';
- }
- $scope.profile = profile;
- type = $scope.profile.profileType;
- templ = (_ref = profileTemplates[type]) != null ? _ref : 'profile_unsupported.html';
- $scope.profileTemplate = 'partials/' + templ;
- $scope.scriptable = true;
- return $scope.watchAndUpdateRevision('profile');
- });
- });
- }).call(this);
- (function() {
- angular.module('omega').controller('QuickSwitchCtrl', function($scope, $filter) {
- $scope.sortableOptions = {
- tolerance: 'pointer',
- axis: 'y',
- forceHelperSize: true,
- forcePlaceholderSize: true,
- connectWith: '.cycle-profile-container',
- containment: '#quick-switch-settings'
- };
- return $scope.$watchCollection('options', function(options) {
- var profile;
- if (options == null) {
- return;
- }
- return $scope.notCycledProfiles = (function() {
- var _i, _len, _ref, _results;
- _ref = $filter('profiles')(options, 'all');
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- profile = _ref[_i];
- if (options["-quickSwitchProfiles"].indexOf(profile.name) < 0) {
- _results.push(profile.name);
- }
- }
- return _results;
- })();
- });
- });
- }).call(this);
- (function() {
- angular.module('omega').controller('RuleListProfileCtrl', function($scope) {
- return $scope.ruleListFormats = OmegaPac.Profiles.ruleListFormats;
- });
- }).call(this);
- (function() {
- var __hasProp = {}.hasOwnProperty;
- angular.module('omega').controller('SwitchProfileCtrl', function($scope, $rootScope, $location, $timeout, $q, $modal, profileIcons, getAttachedName, omegaTarget, trFilter, downloadFile) {
- var advancedConditionTypesExpanded, attachedReady, attachedReadyDefer, basicConditionTypeSet, basicConditionTypesExpanded, expandGroups, exportLegacyRuleList, exportRuleList, oldLastUpdate, oldRuleList, oldSourceUrl, onAttachedChange, parseOmegaRules, parseSource, rulesReady, rulesReadyDefer, stateEditorKey, stopWatchingForRules, type, unwatchRules, unwatchRulesShowNote, updateHasConditionTypes, _i, _len;
- $scope.ruleListFormats = OmegaPac.Profiles.ruleListFormats;
- exportRuleList = function() {
- var blob, eol, fileName, info, text;
- text = OmegaPac.RuleList.Switchy.compose({
- rules: $scope.profile.rules,
- defaultProfileName: $scope.attachedOptions.defaultProfileName
- });
- eol = '\r\n';
- info = '\n';
- info += '; Require: SwitchyOmega >= 2.3.2' + eol;
- info += ("; Date: " + (new Date().toLocaleDateString())) + eol;
- info += ("; Usage: " + (trFilter('ruleList_usageUrl'))) + eol;
- text = text.replace('\n', info);
- blob = new Blob([text], {
- type: "text/plain;charset=utf-8"
- });
- fileName = $scope.profile.name.replace(/\W+/g, '_');
- return downloadFile(blob, "OmegaRules_" + fileName + ".sorl");
- };
- exportLegacyRuleList = function() {
- var blob, fileName, i, regexpRules, rule, text, wildcardRules, _i, _len, _ref;
- wildcardRules = '';
- regexpRules = '';
- _ref = $scope.profile.rules;
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- rule = _ref[_i];
- i = '';
- if (rule.profileName === $scope.attachedOptions.defaultProfileName) {
- i = '!';
- }
- switch (rule.condition.conditionType) {
- case 'HostWildcardCondition':
- wildcardRules += i + '@*://' + rule.condition.pattern + '/*' + '\r\n';
- break;
- case 'UrlWildcardCondition':
- wildcardRules += i + '@' + rule.condition.pattern + '\r\n';
- break;
- case 'UrlRegexCondition':
- regexpRules += i + rule.condition.pattern + '\r\n';
- }
- }
- text = "; Summary: Proxy Switchy! Exported Rule List\n; Date: " + (new Date().toLocaleDateString()) + "\n; Website: " + (trFilter('ruleList_usageUrl')) + "\n\n#BEGIN\n\n[wildcard]\n" + wildcardRules + "\n[regexp]\n" + regexpRules + "\n#END";
- blob = new Blob([text], {
- type: "text/plain;charset=utf-8"
- });
- fileName = $scope.profile.name.replace(/\W+/g, '_');
- return downloadFile(blob, "SwitchyRules_" + fileName + ".ssrl");
- };
- $scope.conditionHelp = {
- show: $location.search().help === 'condition'
- };
- $scope.basicConditionTypes = [
- {
- group: 'default',
- types: ['HostWildcardCondition', 'UrlWildcardCondition', 'UrlRegexCondition', 'FalseCondition']
- }
- ];
- $scope.advancedConditionTypes = [
- {
- group: 'host',
- types: ['HostWildcardCondition', 'HostRegexCondition', 'HostLevelsCondition', 'IpCondition']
- }, {
- group: 'url',
- types: ['UrlWildcardCondition', 'UrlRegexCondition', 'KeywordCondition']
- }, {
- group: 'special',
- types: ['WeekdayCondition', 'TimeCondition', 'FalseCondition']
- }
- ];
- expandGroups = function(groups) {
- var group, result, type, _i, _j, _len, _len1, _ref;
- result = [];
- for (_i = 0, _len = groups.length; _i < _len; _i++) {
- group = groups[_i];
- _ref = group.types;
- for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
- type = _ref[_j];
- result.push({
- type: type,
- group: 'condition_group_' + group.group
- });
- }
- }
- return result;
- };
- basicConditionTypesExpanded = expandGroups($scope.basicConditionTypes);
- advancedConditionTypesExpanded = expandGroups($scope.advancedConditionTypes);
- basicConditionTypeSet = {};
- for (_i = 0, _len = basicConditionTypesExpanded.length; _i < _len; _i++) {
- type = basicConditionTypesExpanded[_i];
- basicConditionTypeSet[type.type] = type.type;
- }
- $scope.conditionTypes = basicConditionTypesExpanded;
- $scope.showConditionTypes = 0;
- $scope.hasConditionTypes = 0;
- $scope.hasUrlConditions = false;
- $scope.isUrlConditionType = {
- 'UrlWildcardCondition': true,
- 'UrlRegexCondition': true
- };
- updateHasConditionTypes = function() {
- var rule, _j, _k, _len1, _len2, _ref, _ref1, _ref2, _results;
- if (((_ref = $scope.profile) != null ? _ref.rules : void 0) == null) {
- return;
- }
- $scope.hasUrlConditions = false;
- _ref1 = $scope.profile.rules;
- for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {
- rule = _ref1[_j];
- if ($scope.isUrlConditionType[rule.condition.conditionType]) {
- $scope.hasUrlConditions = true;
- break;
- }
- }
- if ($scope.hasConditionTypes !== 0) {
- return;
- }
- _ref2 = $scope.profile.rules;
- _results = [];
- for (_k = 0, _len2 = _ref2.length; _k < _len2; _k++) {
- rule = _ref2[_k];
- if (rule.condition.conditionType === 'TrueCondition') {
- rule.condition = {
- conditionType: 'HostWildcardCondition',
- pattern: '*'
- };
- }
- if (!basicConditionTypeSet[rule.condition.conditionType]) {
- $scope.hasConditionTypes = 1;
- $scope.showConditionTypes = 1;
- break;
- } else {
- _results.push(void 0);
- }
- }
- return _results;
- };
- $scope.$watch('options["-showConditionTypes"]', function(show) {
- show || (show = 0);
- if (show > 0) {
- $scope.showConditionTypes = show;
- } else {
- updateHasConditionTypes();
- $scope.showConditionTypes = $scope.hasConditionTypes;
- }
- if ($scope.options['-exportLegacyRuleList']) {
- if ($scope.showConditionTypes > 0) {
- $scope.setExportRuleListHandler(exportRuleList, {
- warning: true
- });
- } else {
- $scope.setExportRuleListHandler(exportLegacyRuleList);
- }
- } else {
- $scope.setExportRuleListHandler(exportRuleList);
- }
- if ($scope.showConditionTypes === 0) {
- $scope.conditionTypes = basicConditionTypesExpanded;
- if ($scope.options['-exportLegacyRuleList']) {
- return $scope.setExportRuleListHandler(exportLegacyRuleList);
- }
- } else {
- $scope.conditionTypes = advancedConditionTypesExpanded;
- if ($scope.options["-showConditionTypes"] == null) {
- $scope.options["-showConditionTypes"] = $scope.showConditionTypes;
- }
- return typeof unwatchRules === "function" ? unwatchRules() : void 0;
- }
- });
- if ($scope.hasConditionTypes === 0) {
- unwatchRules = $scope.$watch('profile.rules', updateHasConditionTypes, true);
- }
- rulesReadyDefer = $q.defer();
- rulesReady = rulesReadyDefer.promise;
- stopWatchingForRules = $scope.$watch('profile.rules', function(rules) {
- if (!rules) {
- return;
- }
- stopWatchingForRules();
- return rulesReadyDefer.resolve(rules);
- });
- $scope.addRule = function() {
- var rule, templ, _ref;
- rule = $scope.profile.rules.length > 0 ? ((_ref = $scope.profile.rules, templ = _ref[_ref.length - 1], _ref), angular.copy(templ)) : {
- condition: {
- conditionType: 'HostWildcardCondition',
- pattern: ''
- },
- profileName: $scope.attachedOptions.defaultProfileName
- };
- if (rule.condition.pattern) {
- rule.condition.pattern = '';
- }
- return $scope.profile.rules.push(rule);
- };
- $scope.validateCondition = function(condition, pattern) {
- var _;
- if (condition.conditionType.indexOf('Regex') >= 0) {
- try {
- new RegExp(pattern);
- } catch (_error) {
- _ = _error;
- return false;
- }
- }
- return true;
- };
- $scope.conditionHasWarning = function(condition) {
- var pattern;
- if (condition.conditionType === 'HostWildcardCondition') {
- pattern = condition.pattern;
- return pattern.indexOf(':') >= 0 || pattern.indexOf('/') >= 0;
- }
- return false;
- };
- $scope.validateIpCondition = function(condition, input) {
- var ip;
- if (!input) {
- return false;
- }
- ip = OmegaPac.Conditions.parseIp(input);
- return ip != null;
- };
- $scope.getWeekdayList = OmegaPac.Conditions.getWeekdayList;
- $scope.updateDay = function(condition, i, selected) {
- var char;
- condition.days || (condition.days = '-------');
- char = selected ? 'SMTWtFs'[i] : '-';
- condition.days = condition.days.substr(0, i) + char + condition.days.substr(i + 1);
- delete condition.startDay;
- return delete condition.endDay;
- };
- $scope.removeRule = function(index) {
- var removeForReal, scope;
- removeForReal = function() {
- return $scope.profile.rules.splice(index, 1);
- };
- if ($scope.options['-confirmDeletion']) {
- scope = $scope.$new('isolate');
- scope.rule = $scope.profile.rules[index];
- scope.ruleProfile = $scope.profileByName(scope.rule.profileName);
- scope.dispNameFilter = $scope.dispNameFilter;
- scope.options = $scope.options;
- return $modal.open({
- templateUrl: 'partials/rule_remove_confirm.html',
- scope: scope
- }).result.then(removeForReal);
- } else {
- return removeForReal();
- }
- };
- $scope.cloneRule = function(index) {
- var rule;
- rule = angular.copy($scope.profile.rules[index]);
- $scope.profile.rules.splice(index + 1, 0, rule);
- return $timeout(function() {
- var input, _ref, _ref1;
- input = angular.element(".switch-rule-row:nth-child(" + (index + 2) + ") input");
- if ((_ref = input[0]) != null) {
- _ref.focus();
- }
- return (_ref1 = input[0]) != null ? _ref1.select() : void 0;
- });
- };
- $scope.showNotes = false;
- $scope.addNote = function(index) {
- $scope.showNotes = true;
- return unwatchRulesShowNote();
- };
- unwatchRulesShowNote = $scope.$watch('profile.rules', (function(rules) {
- if (rules && rules.some(function(rule) {
- return !!rule.note;
- })) {
- $scope.showNotes = true;
- return unwatchRulesShowNote();
- }
- }), true);
- $scope.resetRules = function() {
- var scope;
- scope = $scope.$new('isolate');
- scope.ruleProfile = $scope.profileByName($scope.attachedOptions.defaultProfileName);
- scope.dispNameFilter = $scope.dispNameFilter;
- scope.options = $scope.options;
- return $modal.open({
- templateUrl: 'partials/rule_reset_confirm.html',
- scope: scope
- }).result.then(function() {
- var rule, _j, _len1, _ref, _results;
- _ref = $scope.profile.rules;
- _results = [];
- for (_j = 0, _len1 = _ref.length; _j < _len1; _j++) {
- rule = _ref[_j];
- _results.push(rule.profileName = $scope.attachedOptions.defaultProfileName);
- }
- return _results;
- });
- };
- $scope.sortableOptions = {
- handle: '.sort-bar',
- tolerance: 'pointer',
- axis: 'y',
- forceHelperSize: true,
- forcePlaceholderSize: true,
- containment: 'parent'
- };
- attachedReadyDefer = $q.defer();
- attachedReady = attachedReadyDefer.promise;
- $scope.$watch('profile.name', function(name) {
- $scope.attachedName = getAttachedName(name);
- return $scope.attachedKey = OmegaPac.Profiles.nameAsKey($scope.attachedName);
- });
- $scope.$watch('options[attachedKey]', function(attached) {
- return $scope.attached = attached;
- });
- $scope.watchAndUpdateRevision('options[attachedKey]');
- oldSourceUrl = null;
- oldLastUpdate = null;
- oldRuleList = null;
- onAttachedChange = function(attached, oldAttached) {
- if (!(attached && oldAttached)) {
- return;
- }
- if (attached.sourceUrl !== oldAttached.sourceUrl) {
- if (attached.lastUpdate) {
- oldSourceUrl = oldAttached.sourceUrl;
- oldLastUpdate = attached.lastUpdate;
- oldRuleList = oldAttached.ruleList;
- return attached.lastUpdate = null;
- } else if (oldSourceUrl && attached.sourceUrl === oldSourceUrl) {
- attached.lastUpdate = oldLastUpdate;
- return attached.ruleList = oldRuleList;
- }
- }
- };
- $scope.$watch('options[attachedKey]', onAttachedChange, true);
- $scope.attachedOptions = {
- enabled: false
- };
- $scope.$watch('profile.defaultProfileName', function(name) {
- $scope.attachedOptions.enabled = name === $scope.attachedName;
- if (!$scope.attached || !$scope.attachedOptions.enabled) {
- return $scope.attachedOptions.defaultProfileName = name;
- }
- });
- $scope.$watch('attachedOptions.enabled', function(enabled, oldValue) {
- if (enabled === oldValue) {
- return;
- }
- if (enabled) {
- if ($scope.profile.defaultProfileName !== $scope.attachedName) {
- return $scope.profile.defaultProfileName = $scope.attachedName;
- }
- } else {
- if ($scope.profile.defaultProfileName === $scope.attachedName) {
- if ($scope.attached) {
- $scope.profile.defaultProfileName = $scope.attached.defaultProfileName;
- return $scope.attachedOptions.defaultProfileName = $scope.attached.defaultProfileName;
- } else {
- $scope.profile.defaultProfileName = 'direct';
- return $scope.attachedOptions.defaultProfileName = 'direct';
- }
- }
- }
- });
- $scope.$watch('attached.defaultProfileName', function(name) {
- if (name && $scope.attachedOptions.enabled) {
- return $scope.attachedOptions.defaultProfileName = name;
- }
- });
- $scope.$watch('attachedOptions.defaultProfileName', function(name) {
- attachedReadyDefer.resolve();
- if ($scope.attached && $scope.attachedOptions.enabled) {
- return $scope.attached.defaultProfileName = name;
- } else {
- return $scope.profile.defaultProfileName = name;
- }
- });
- $scope.attachNew = function() {
- $scope.attached = OmegaPac.Profiles.create({
- name: $scope.attachedName,
- defaultProfileName: $scope.profile.defaultProfileName,
- profileType: 'RuleListProfile',
- color: $scope.profile.color
- });
- OmegaPac.Profiles.updateRevision($scope.attached);
- $scope.options[$scope.attachedKey] = $scope.attached;
- $scope.attachedOptions.enabled = true;
- return $scope.profile.defaultProfileName = $scope.attachedName;
- };
- $scope.removeAttached = function() {
- var scope;
- if (!$scope.attached) {
- return;
- }
- scope = $scope.$new('isolate');
- scope.attached = $scope.attached;
- scope.dispNameFilter = $scope.dispNameFilter;
- scope.options = $scope.options;
- return $modal.open({
- templateUrl: 'partials/delete_attached.html',
- scope: scope
- }).result.then(function() {
- $scope.profile.defaultProfileName = $scope.attached.defaultProfileName;
- return delete $scope.options[$scope.attachedKey];
- });
- };
- stateEditorKey = 'web._profileEditor.' + $scope.profile.name;
- $scope.loadRules = false;
- $scope.editSource = false;
- parseOmegaRules = function(code, _arg) {
- var detect, err, key, name, refs, requireResult, setError, _ref;
- _ref = _arg != null ? _arg : {}, detect = _ref.detect, requireResult = _ref.requireResult;
- setError = function(error) {
- var args, message, _ref1;
- if (error.reason) {
- args = (_ref1 = error.args) != null ? _ref1 : [error.sourceLineNo, error.source];
- message = trFilter('ruleList_error_' + error.reason, args);
- if (message) {
- error.message = message;
- }
- }
- return {
- error: error
- };
- };
- if (detect && !OmegaPac.RuleList.Switchy.detect(code)) {
- return {
- error: {
- reason: 'notSwitchy'
- }
- };
- }
- refs = OmegaPac.RuleList.Switchy.directReferenceSet({
- ruleList: code
- });
- if (requireResult && !refs) {
- return setError({
- reason: 'resultNotEnabled'
- });
- }
- for (key in refs) {
- if (!__hasProp.call(refs, key)) continue;
- name = refs[key];
- if (!OmegaPac.Profiles.byKey(key, $scope.options)) {
- return setError({
- reason: 'unknownProfile',
- args: [name]
- });
- }
- }
- try {
- return {
- rules: OmegaPac.RuleList.Switchy.parseOmega(code, null, null, {
- strict: true,
- source: false
- })
- };
- } catch (_error) {
- err = _error;
- return setError(err);
- }
- };
- parseSource = function() {
- var diff, error, oldRules, patch, rules, _ref;
- if (!$scope.source) {
- return true;
- }
- _ref = parseOmegaRules($scope.source.code.trim(), {
- requireResult: true
- }), rules = _ref.rules, error = _ref.error;
- if (error) {
- $scope.source.error = error;
- $scope.editSource = true;
- return false;
- } else {
- $scope.source.error = void 0;
- }
- $scope.attachedOptions.defaultProfileName = rules.pop().profileName;
- diff = jsondiffpatch.create({
- objectHash: function(obj) {
- return JSON.stringify(obj);
- },
- textDiff: {
- minLength: 1 / 0
- }
- });
- oldRules = angular.fromJson(angular.toJson($scope.profile.rules));
- patch = diff.diff(oldRules, rules);
- jsondiffpatch.patch($scope.profile.rules, patch);
- return true;
- };
- $scope.toggleSource = function() {
- return $q.all([attachedReady, rulesReady]).then(function() {
- var args, code;
- $scope.editSource = !$scope.editSource;
- if ($scope.editSource) {
- args = {
- rules: $scope.profile.rules,
- defaultProfileName: $scope.attachedOptions.defaultProfileName
- };
- code = OmegaPac.RuleList.Switchy.compose(args, {
- withResult: true
- });
- $scope.source = {
- code: code
- };
- } else {
- if (!parseSource()) {
- return;
- }
- $scope.source = null;
- $scope.loadRules = true;
- }
- return omegaTarget.state(stateEditorKey, {
- editSource: $scope.editSource
- });
- });
- };
- $rootScope.$on('$stateChangeStart', function(event, _, __, fromState) {
- var sourceValid;
- if ($scope.editSource && $scope.source.touched) {
- sourceValid = parseSource();
- if (!sourceValid) {
- return event.preventDefault();
- }
- }
- });
- $scope.$on('omegaApplyOptions', function(event) {
- var error, _ref;
- if (((_ref = $scope.attached) != null ? _ref.ruleList : void 0) && !$scope.attached.sourceUrl) {
- $scope.attachedRuleListError = void 0;
- error = parseOmegaRules($scope.attached.ruleList.trim(), {
- detect: true
- }).error;
- if (error) {
- if (error.reason !== 'resultNotEnabled' && error.reason !== 'notSwitchy') {
- $scope.attachedRuleListError = error;
- event.preventDefault();
- angular.element('#attached-rulelist')[0].focus();
- }
- } else {
- $scope.attached.format = 'Switchy';
- }
- }
- if ($scope.editSource && $scope.source.touched) {
- event.preventDefault();
- if (parseSource()) {
- $scope.source.touched = false;
- return $timeout(function() {
- return $rootScope.applyOptions();
- });
- }
- }
- });
- return omegaTarget.state(stateEditorKey).then(function(opts) {
- var getState;
- if (opts != null ? opts.editSource : void 0) {
- return $scope.toggleSource();
- } else {
- $scope.loadRules = true;
- getState = omegaTarget.state(['web.switchGuide', 'firstRun']);
- return $q.all([rulesReady, getState]).then(function(_arg) {
- var firstRun, switchGuide, _, _ref;
- _ = _arg[0], (_ref = _arg[1], switchGuide = _ref[0], firstRun = _ref[1]);
- if (firstRun || switchGuide === 'shown') {
- return;
- }
- omegaTarget.state('web.switchGuide', 'shown');
- if ($scope.profile.rules.length === 0) {
- return;
- }
- return $script('js/switch_profile_guide.js');
- });
- }
- });
- });
- }).call(this);
- (function() {
- angular.module('omega').directive('inputGroupClear', function($timeout) {
- return {
- restrict: 'A',
- templateUrl: 'partials/input_group_clear.html',
- scope: {
- 'model': '=model',
- 'type': '@type',
- 'ngPattern': '=?ngPattern',
- 'placeholder': '@placeholder',
- 'controller': '=?controller'
- },
- link: function(scope, element, attrs) {
- scope.catchAll = new RegExp('');
- $timeout(function() {
- return scope.controller = element.find('input').controller('ngModel');
- });
- scope.oldModel = '';
- scope.controller = scope.input;
- scope.modelChange = function() {
- if (scope.model) {
- return scope.oldModel = '';
- }
- };
- return scope.toggleClear = function() {
- var _ref;
- return _ref = [scope.oldModel, scope.model], scope.model = _ref[0], scope.oldModel = _ref[1], _ref;
- };
- }
- };
- });
- angular.module('omega').directive('omegaUpload', function() {
- return {
- restrict: 'A',
- scope: {
- success: '&omegaUpload',
- error: '&omegaError'
- },
- link: function(scope, element, attrs) {
- var input;
- input = element[0];
- return element.on('change', function() {
- var reader;
- if (input.files.length > 0 && input.files[0].name.length > 0) {
- reader = new FileReader();
- reader.addEventListener('load', function(e) {
- return scope.$apply(function() {
- return scope.success({
- '$content': e.target.result
- });
- });
- });
- reader.addEventListener('error', function(e) {
- return scope.$apply(function() {
- return scope.error({
- '$error': e.target.error
- });
- });
- });
- reader.readAsText(input.files[0]);
- return input.value = '';
- }
- });
- }
- };
- });
- angular.module('omega').directive('omegaIp2str', function() {
- return {
- restrict: 'A',
- priority: 2,
- require: 'ngModel',
- link: function(scope, element, attr, ngModel) {
- ngModel.$parsers.push(function(value) {
- if (value) {
- return OmegaPac.Conditions.fromStr('Ip: ' + value);
- } else {
- return {
- conditionType: 'IpCondition',
- ip: '0.0.0.0',
- prefixLength: 0
- };
- }
- });
- return ngModel.$formatters.push(function(value) {
- if (value != null ? value.ip : void 0) {
- return OmegaPac.Conditions.str(value).split(' ', 2)[1];
- } else {
- return '';
- }
- });
- }
- };
- });
- }).call(this);
- (function() {
- angular.module('omega').filter('profiles', function(builtinProfiles, profileOrder, isProfileNameHidden, isProfileNameReserved) {
- var builtinProfileList, charCodePlus, profile, _;
- charCodePlus = '+'.charCodeAt(0);
- builtinProfileList = (function() {
- var _results;
- _results = [];
- for (_ in builtinProfiles) {
- profile = builtinProfiles[_];
- _results.push(profile);
- }
- return _results;
- })();
- return function(options, filter) {
- var name, result, value;
- result = [];
- for (name in options) {
- value = options[name];
- if (name.charCodeAt(0) === charCodePlus) {
- result.push(value);
- }
- }
- if (typeof filter === 'object' || (typeof filter === 'string' && filter.charCodeAt(0) === charCodePlus)) {
- if (typeof filter === 'string') {
- filter = filter.substr(1);
- }
- result = OmegaPac.Profiles.validResultProfilesFor(filter, options);
- }
- if (filter === 'all') {
- result = result.filter(function(profile) {
- return !isProfileNameHidden(profile.name);
- });
- result = result.concat(builtinProfileList);
- } else {
- result = result.filter(function(profile) {
- return !isProfileNameReserved(profile.name);
- });
- }
- if (filter === 'sorted') {
- result.sort(profileOrder);
- }
- return result;
- };
- });
- angular.module('omega').filter('tr', function(omegaTarget) {
- return omegaTarget.getMessage;
- });
- angular.module('omega').filter('dispName', function(omegaTarget) {
- return function(name) {
- if (typeof name === 'object') {
- name = name.name;
- }
- return omegaTarget.getMessage('profile_' + name) || name;
- };
- });
- }).call(this);
|