From 5f7eba4fee5bfffb76606007c51f9f7ac8213755 Mon Sep 17 00:00:00 2001 From: coderaiser Date: Mon, 29 Oct 2012 07:00:57 -0400 Subject: [PATCH] fixed bug with directory pathes detection --- ChangeLog | 9 +- client.js | 131 ++++--- lib/cloudfunc.js | 984 ++++++++++++++++++++++++----------------------- 3 files changed, 567 insertions(+), 557 deletions(-) diff --git a/ChangeLog b/ChangeLog index 991a0681..8c3719ac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -35,10 +35,17 @@ elements one-by-one. * Added function loadModule thet make it easier to connect new module. -* Fixed bug with context menu hiding (on Esc). Keys was unbinded. +* Fixed bug with context menu hiding (on Esc). +Keys was unbinded. * Added ability to disable web sockets. +* Moved cloudRequire to srvfunc.js file. + +* Fixed bug with directory pathes detection +(used document.location.href, now using +document.location.origin) + 2012.10.01, Version 0.1.7 diff --git a/client.js b/client.js index ad04d756..1cba393c 100644 --- a/client.js +++ b/client.js @@ -57,10 +57,10 @@ var CloudClient = { -var cloudcmd = CloudClient; +var cloudcmd = CloudClient, /* глобальные переменные */ -var CloudFunc, $, Util, KeyBinding, +CloudFunc, $, Util, KeyBinding, /* short names used all the time functions */ getByClass, getById; @@ -1290,9 +1290,9 @@ function baseInit(){ lTitle[0].textContent = 'Cloud Commander'; /* загружаем общие функции для клиента и сервера */ - Util.jsload(CloudClient.LIBDIR+'cloudfunc.js',function(){ + Util.jsload(CloudClient.LIBDIR + 'cloudfunc.js',function(){ /* берём из обьекта window общий с сервером функционал */ - CloudFunc=window.CloudFunc; + CloudFunc = window.CloudFunc; /* меняем ссылки на ajax'овые */ CloudClient._changeLinks(CloudFunc.LEFTPANEL); @@ -1328,7 +1328,7 @@ function baseInit(){ window.screen.height - (window.screen.height/3).toFixed(); - lHeight=(lHeight/100).toFixed()*100; + lHeight = (lHeight/100).toFixed()*100; CloudClient.HEIGHT = lHeight; @@ -1351,85 +1351,84 @@ CloudClient._changeLinks = function(pPanelID){ lClearcache.onclick = CloudClient.Cache.clear; /* меняем ссылки на ajax-запросы */ - var lPanel = getById(pPanelID); - var a = lPanel.getElementsByTagName('a'); + var lPanel = getById(pPanelID), + a = lPanel.getElementsByTagName('a'), /* номер ссылки иконки обновления страницы */ - var lREFRESHICON = 0; + lREFRESHICON = 0, /* путь в ссылке, который говорит * что js отключен */ - var lNoJS_s = CloudFunc.NOJS; - var lFS_s = CloudFunc.FS; - + lNoJS_s = CloudFunc.NOJS, + lFS_s = CloudFunc.FS, + /* right mouse click function varible */ - var lOnContextMenu_f = function(pEvent){ - var lReturn_b = true; - - KeyBinding.unSet(); - - /* getting html element - * currentTarget - DOM event - * target - jquery event - */ - var lTarget = pEvent.currentTarget || pEvent.target; - Util.setCurrentFile(lTarget); - - if(Util.isFunction(cloudcmd.Menu) ){ - cloudcmd.Menu({ - x: pEvent.x, - y: pEvent.y - }); + lOnContextMenu_f = function(pEvent){ + var lReturn_b = true; - /* disabling browsers menu*/ - lReturn_b = false; - Util.Images.showLoad(); - } + KeyBinding.unSet(); + + /* getting html element + * currentTarget - DOM event + * target - jquery event + */ + var lTarget = pEvent.currentTarget || pEvent.target; + Util.setCurrentFile(lTarget); + + if(Util.isFunction(cloudcmd.Menu) ){ + cloudcmd.Menu({ + x: pEvent.x, + y: pEvent.y + }); + + /* disabling browsers menu*/ + lReturn_b = false; + Util.Images.showLoad(); + } + + return lReturn_b; + }, - return lReturn_b; - }; - /* drag and drop function varible * download file from browser to descktop * in Chrome (HTML5) */ - var lOnDragStart_f = function(pEvent){ - var lElement = pEvent.target; - - var lLink = lElement.href; - var lName = lElement.textContent; + lOnDragStart_f = function(pEvent){ + var lElement = pEvent.target, + lLink = lElement.href, + lName = lElement.textContent, + /* if it's directory - adding json extension */ + lType = lElement.parentElement.nextSibling; + + if(lType && lType.textContent === ''){ + lLink = lLink.replace(lNoJS_s,''); + lName += '.json'; + } + + pEvent.dataTransfer.setData("DownloadURL", + 'application/octet-stream' + ':' + + lName + ':' + + lLink); + }, - /* if it's directory - adding json extension */ - var lType = lElement.parentElement.nextSibling; - if(lType && lType.textContent === ''){ - lLink = lLink.replace(lNoJS_s,''); - lName += '.json'; - } - - pEvent.dataTransfer.setData("DownloadURL", - 'application/octet-stream' + ':' + - lName + ':' + - lLink); - }; - - var lSetCurrentFile_f = function(pEvent){ - var pElement = pEvent.target; - - var lTag = pElement.tagName; - if(lTag !== 'LI') - do{ - pElement = pElement.parentElement; + lSetCurrentFile_f = function(pEvent){ + var pElement = pEvent.target, lTag = pElement.tagName; - }while(lTag !== 'LI'); + + if(lTag !== 'LI') + do{ + pElement = pElement.parentElement; + lTag = pElement.tagName; + }while(lTag !== 'LI'); + + Util.setCurrentFile(pElement); + }; - Util.setCurrentFile(pElement); - }; - - for(var i=0; i < a.length ; i++) + for(var i = 0, n = a.length; i < n ; i++) { /* убираем адрес хоста*/ - var link = '/'+a[i].href.replace(document.location.href,''); + var link = a[i].href.replace(document.location.origin,''); /* убираем значения, которые говорят, * * об отсутствии js */ diff --git a/lib/cloudfunc.js b/lib/cloudfunc.js index 2b182463..9ea9cf02 100644 --- a/lib/cloudfunc.js +++ b/lib/cloudfunc.js @@ -1,499 +1,503 @@ -"use strict"; -/** Модуль, содержащий функции, которые будут работать - * и на клиенте и на сервере - */ +var CloudFunc, exports; -var CloudFunc = { - /* Путь с которым мы сейчас работаем */ - Path : '', - /* КОНСТАНТЫ (общие для клиента и сервера)*/ - /* название программы */ - NAME : 'Cloud Commander', - /* если в ссылке будет эта строка - - * в браузере js отключен +(function(){ + "use strict"; + + /** Модуль, содержащий функции, которые будут работать + * и на клиенте и на сервере */ - NOJS : '/no-js', - FS : '/fs', - /* название css-класа кнопки обновления файловой структуры*/ - REFRESHICON : 'refresh-icon', - /* id панелей с файлами */ - LEFTPANEL : 'left', - RIGHTPANEL : 'right', - /* length of longest - * file name + + CloudFunc = { + /* Путь с которым мы сейчас работаем */ + Path : '', + /* КОНСТАНТЫ (общие для клиента и сервера)*/ + /* название программы */ + NAME : 'Cloud Commander', + /* если в ссылке будет эта строка - + * в браузере js отключен + */ + NOJS : '/no-js', + FS : '/fs', + /* название css-класа кнопки обновления файловой структуры*/ + REFRESHICON : 'refresh-icon', + /* id панелей с файлами */ + LEFTPANEL : 'left', + RIGHTPANEL : 'right', + /* length of longest + * file name + */ + SHORTNAMELENGTH : 16 +}; + + + /** + * Функция убирает последний слеш, + * если он - последний символ строки */ - SHORTNAMELENGTH : 16 -}; - - -/** - * Функция убирает последний слеш, - * если он - последний символ строки - */ -CloudFunc.removeLastSlash = function(pPath){ - if(typeof pPath==='string') - return (pPath.lastIndexOf('/') === pPath.length-1) ? - pPath.substr(pPath, pPath.length-1):pPath; - else return pPath; -}; - -/* Функция возвращает заголовок веб страницы */ -CloudFunc.setTitle = function(){ + CloudFunc.removeLastSlash = function(pPath){ + if(typeof pPath==='string') + return (pPath.lastIndexOf('/') === pPath.length-1) ? + pPath.substr(pPath, pPath.length-1):pPath; + else return pPath; + }; - return CloudFunc.Path==='' ? CloudFunc.NAME: - CloudFunc.Path + - ' - ' + - CloudFunc.NAME; -}; -/** - * Функция переводит права из цыфрового вида в символьный - * @param pPerm_s - строка с правами доступа - * к файлу в 8-миричной системе - */ -CloudFunc.convertPermissionsToSymbolic = function(pPerm_s){ - /* - S_IRUSR 0000400 protection: readable by owner - S_IWUSR 0000200 writable by owner - S_IXUSR 0000100 executable by owner - S_IRGRP 0000040 readable by group - S_IWGRP 0000020 writable by group - S_IXGRP 0000010 executable by group - S_IROTH 0000004 readable by all - S_IWOTH 0000002 writable by all - S_IXOTH 0000001 executable by all - */ - if(pPerm_s===undefined) return; - - /* тип файла */ - var lType=pPerm_s.charAt(0); - - switch (lType-0) { - case 1: /* обычный файл */ - lType='-'; - break; - case 2: /* байт-ориентированное (символьное) устройство*/ - lType='c'; - break; - case 4: /* каталог */ - lType='d'; - break; - default: - lType='-'; - } - - /* оставляем последние 3 символа*/ - pPerm_s=pPerm_s.length>5?pPerm_s.substr(3):pPerm_s.substr(2); - - /* Рекомендации гугла советуют вместо string[3] - * использовать string.charAt(3) - */ -/* - http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml?showone=Standards_features#Standards_features - - Always preferred over non-standards featuresFor - maximum portability and compatibility, always - prefer standards features over non-standards - features (e.g., string.charAt(3) over string[3] - and element access with DOM functions instead - of using an application-specific shorthand). -*/ - /* Переводим в двоичную систему */ - var lOwner = (pPerm_s[0]-0).toString(2); - var lGroup = (pPerm_s[1]-0).toString(2); - var lAll = (pPerm_s[2]-0).toString(2); - /* - console.log(lOwner+' '+lGroup+' '+lAll); - */ - /* переводим в символьную систему*/ - var lPermissions=//lType+' '+ - (lOwner[0]-0>0?'r':'-') + - (lOwner[1]-0>0?'w':'-') + - (lOwner[2]-0>0?'x':'-') + - ' ' + - (lGroup[0]-0>0?'r':'-') + - (lGroup[1]-0>0?'w':'-') + - (lGroup[2]-0>0?'x':'-') + - ' ' + - (lAll[0]-0>0?'r':'-') + - (lAll[1]-0>0?'w':'-') + - (lAll[2]-0>0?'x':'-'); - /* - console.log(lPermissions); - */ - return lPermissions; -}; - -/** - * Функция конвертирует права доступа к файлам из символьного вида - * в цыфровой - */ -CloudFunc.convertPermissionsToNumberic= function(pPerm_s){ - /* если передана правильная строка, конвертированная - * функциец convertPermissionsToSymbolic - */ - if(!pPerm_s || pPerm_s.length!==11)return pPerm_s; - - var lOwner= (pPerm_s[0]==='r'?4:0) + - (pPerm_s[1]==='w'?2:0) + - (pPerm_s[2]==='x'?1:0); - var lGroup= (pPerm_s[4]==='r'?4:0) + - (pPerm_s[5]==='w'?2:0) + - (pPerm_s[6]==='x'?1:0); - var lAll = (pPerm_s[8]==='r'?4:0) + - (pPerm_s[9]==='w'?2:0) + - (pPerm_s[10]==='x'?1:0); - /* добавляем 2 цыфры до 5 */ - return '00'+lOwner+lGroup+lAll; -}; -/** Функция получает короткие размеры - * конвертируя байт в килобайты, мегабойты, - * гигайбайты и терабайты - * @pSize - размер в байтах - */ -CloudFunc.getShortedSize = function(pSize){ - /* if pSize=0 - return it */ - if (pSize !== pSize-0) return pSize; - - /* Константы размеров, что используются - * внутри функции - */ - var l1BMAX = 1024; - var l1KBMAX = 1048576; - var l1MBMAX = 1073741824; - var l1GBMAX = 1099511627776; - var l1TBMAX = 1125899906842624; - - var lShorted; - - if (pSize < l1BMAX) lShorted = pSize + 'b'; - else if (pSize < l1KBMAX) lShorted = (pSize/l1BMAX) .toFixed(2) + 'kb'; - else if (pSize < l1MBMAX) lShorted = (pSize/l1KBMAX).toFixed(2) + 'mb'; - else if (pSize < l1GBMAX) lShorted = (pSize/l1MBMAX).toFixed(2) + 'gb'; - else if (pSize < l1TBMAX) lShorted = (pSize/l1GBMAX).toFixed(2) + 'tb'; - return lShorted; -}; - -/** Function gets file name and - * if it's bigger the 16 chars - * cut it and adds '..' - * @pName - file name - */ -CloudFunc.getShortedName = function(pName){ - return (pName.length > CloudFunc.SHORTNAMELENGTH ? - (pName.substr(pName, - CloudFunc.SHORTNAMELENGTH) + '..'): - pName); -}; - - -/** Функция парсит uid и имена пользователей - * из переданного в строке вычитаного файла /etc/passwd - * и возвращает массив обьектов имён и uid пользователей - * @pPasswd_s - строка, в которой находиться файл /etc/passwd - */ -CloudFunc.getUserUIDsAndNames=function(pPasswd_s){ - var lUsers={name:'',uid:''}; - var lUsersData=[]; - var i=0; - do{ - /* получаем первую строку */ - var lLine=pPasswd_s.substr(pPasswd_s,pPasswd_s.indexOf('\n')+1); - if(lLine){ - /* удаляем первую строку из /etc/passwd*/ - pPasswd_s=pPasswd_s.replace(lLine,''); - /* получаем первое слово строки */ - var lName=lLine.substr(lLine,lLine.indexOf(':')); - lLine=lLine.replace(lName+':x:',''); - /* получаем uid*/ - var lUID=lLine.substr(lLine,lLine.indexOf(':')); - if((lUID-0).toString()!=='NaN'){ - lUsers.name=lName; - lUsers.uid=lUID; - lUsersData[i++]=lUsers; - console.log('uid='+lUID+' name='+lName); - } - } - }while(pPasswd_s!==''); - - return lUsersData; -}; -/* Функция получает адреса каждого каталога в пути - * возвращаеться массив каталогов - * @url - адрес каталога - */ -CloudFunc._getDirPath = function(url) -{ - var folders=[]; - var i=0; - do{ - folders[i++]=url; url=url.substr(url,url.lastIndexOf('/')); - }while(url!==''); - - /* Формируем ссылки на каждый каталог в пути */ - var lHref=''; - var lHrefEnd=''; - - var lHtmlPath; - /* путь в ссылке, который говорит - * что js отключен - */ - var lNoJS_s = CloudFunc.NOJS; - var lFS_s = CloudFunc.FS; - /* корневой каталог */ - lHtmlPath = lHref + - lFS_s + - lNoJS_s + - lTitle + - '"/"' + - _l + - '/' + - lHrefEnd; - - for(i = folders.length - 1; i > 0; i--) - { - var lUrl=folders[i]; - var lShortName=lUrl.replace(lUrl.substr(lUrl,lUrl.lastIndexOf('/')+1),''); - if (i!==1) - lHtmlPath += lHref + - lFS_s + lNoJS_s + lUrl + - lTitle + lUrl + _l + - lShortName + - lHrefEnd + '/'; - else - lHtmlPath+=lShortName+'/'; - } - /* *** */ - return lHtmlPath; -}; - -/* - * Функция ищет в имени файла расширение - * и если находит возвращает true - * @pName - получает имя файла - * @pExt - расширение - */ -CloudFunc.checkExtension = function(pName, pExt) -{ - /* если длина имени больше - * длинны расширения - - * имеет смысл продолжать - */ - if (typeof pExt === 'string' && - pName.length > pExt.length) { - var lLength = pName.length; /* длина имени*/ - var lExtNum = pName.lastIndexOf(pExt); /* последнее вхождение расширения*/ - var lExtSub = lLength - lExtNum; /* длина расширения*/ - - /* если pExt - расширение pName */ - return lExtSub === pExt.length; - - }else if(typeof pExt === 'object' && - pExt.length){ - for(var i=0; i < pName.length; i++) - if(this.checkExtension(pName, pExt[i])) - return true; - }else - return false; -}; - -/* - * Функция формирует заголовки столбиков - * @pFileTableTitles - массив названий столбиков - */ -CloudFunc._getFileTableHeader=function(pFileTableTitles) -{ - var lHeader='
  • '; - lHeader+=''; - for(var i=0;i'+ - lStr+ - ''; - } - lHeader+='
  • '; - - return lHeader; -}; - -/* - * Функция строит таблицу файлв из JSON-информации о файлах - * @pJSON - информация о файлах - * @pKeyBinded - если клавиши назначены, выделяем верхний файл - * [{path:'путь',size:'dir'}, - * {name:'имя',size:'размер',mode:'права доступа'}] - */ -CloudFunc.buildFromJSON = function(pJSON, pKeyBinded) -{ - var files; - /* - * Если мы на клиенте и нет JSON - - * через eval парсим. - * Если-же мы на сервере, - * или на клиенте всё есть - * парсим стандарным методом - * - * По скольку мы прописали заголовок application/json - * нет необходимости его конвертировать, - * но она есть, если мы вытягиваем данные из - * localStorage - */ - files = pJSON; - - /* сохраняем путь каталога в котором мы сейчас находимся*/ - var lPath = files[0].path; - - /* сохраняем путь */ - CloudFunc.Path = lPath; - - /* - * Строим путь каталога в котором мы находимся - * со всеми подкаталогами - */ - var lHtmlPath = CloudFunc._getDirPath(lPath); - - /* Убираем последний слэш - * с пути для кнопки обновить страницу - * если он есть - */ - var lRefreshPath = CloudFunc.removeLastSlash(lPath); - - /* путь в ссылке, который говорит - * что js отключен - */ - var lNoJS_s = CloudFunc.NOJS; - var lFS_s = CloudFunc.FS; - - var lFileTable = - '
  • '+ - '' + - '' + - '' + - '' + - '' + - '' + - '' + lHtmlPath + '' + - '
  • '; - - var fileTableTitles = ['name','size','owner','mode']; - lFileTable += CloudFunc._getFileTableHeader(fileTableTitles); - - /* Если мы не в корне */ - if(lPath !== '/'){ - /* ссылка на верхний каталог*/ - var lDotDot; - /* убираем последний слеш и каталог в котором мы сейчас находимся*/ - lDotDot = lPath.substr(lPath,lPath.lastIndexOf('/')); - lDotDot = lDotDot.substr(lDotDot,lDotDot.lastIndexOf('/')); - /* Если предыдущий каталог корневой */ - if(lDotDot === '')lDotDot = '/'; + /* Функция возвращает заголовок веб страницы */ + CloudFunc.setTitle = function(){ - /* Сохраняем путь к каталогу верхнего уровня*/ - lFileTable += '
  • '+ - '' + - '' + - '' + - '' + ".." + - '' + - '<dir>'+ - '.' + - '' + - '
  • '; - } - var lLength = files.length; - - for(var i = 1; i < lLength; i++){ - lFileTable += '
  • '; - lFileTable += ''; - lFileTable += ''; - lFileTable += '' + - ' CloudFunc.SHORTNAMELENGTH ? - ' title="' + files[i].name + '">' + - CloudFunc.getShortedName(files[i].name) - : 'draggable=true>' + files[i].name) + - "" + + /* тип файла */ + var lType=pPerm_s.charAt(0); + + switch (lType-0) { + case 1: /* обычный файл */ + lType='-'; + break; + case 2: /* байт-ориентированное (символьное) устройство*/ + lType='c'; + break; + case 4: /* каталог */ + lType='d'; + break; + default: + lType='-'; + } + + /* оставляем последние 3 символа*/ + pPerm_s=pPerm_s.length>5?pPerm_s.substr(3):pPerm_s.substr(2); + + /* Рекомендации гугла советуют вместо string[3] + * использовать string.charAt(3) + */ + /* + http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml?showone=Standards_features#Standards_features + + Always preferred over non-standards featuresFor + maximum portability and compatibility, always + prefer standards features over non-standards + features (e.g., string.charAt(3) over string[3] + and element access with DOM functions instead + of using an application-specific shorthand). + */ + /* Переводим в двоичную систему */ + var lOwner = (pPerm_s[0]-0).toString(2); + var lGroup = (pPerm_s[1]-0).toString(2); + var lAll = (pPerm_s[2]-0).toString(2); + /* + console.log(lOwner+' '+lGroup+' '+lAll); + */ + /* переводим в символьную систему*/ + var lPermissions=//lType+' '+ + (lOwner[0]-0>0?'r':'-') + + (lOwner[1]-0>0?'w':'-') + + (lOwner[2]-0>0?'x':'-') + + ' ' + + (lGroup[0]-0>0?'r':'-') + + (lGroup[1]-0>0?'w':'-') + + (lGroup[2]-0>0?'x':'-') + + ' ' + + (lAll[0]-0>0?'r':'-') + + (lAll[1]-0>0?'w':'-') + + (lAll[2]-0>0?'x':'-'); + /* + console.log(lPermissions); + */ + return lPermissions; + }; + + /** + * Функция конвертирует права доступа к файлам из символьного вида + * в цыфровой + */ + CloudFunc.convertPermissionsToNumberic = function(pPerm_s){ + /* если передана правильная строка, конвертированная + * функциец convertPermissionsToSymbolic + */ + if(!pPerm_s || pPerm_s.length!==11)return pPerm_s; + + var lOwner= (pPerm_s[0]==='r'?4:0) + + (pPerm_s[1]==='w'?2:0) + + (pPerm_s[2]==='x'?1:0); + var lGroup= (pPerm_s[4]==='r'?4:0) + + (pPerm_s[5]==='w'?2:0) + + (pPerm_s[6]==='x'?1:0); + var lAll = (pPerm_s[8]==='r'?4:0) + + (pPerm_s[9]==='w'?2:0) + + (pPerm_s[10]==='x'?1:0); + /* добавляем 2 цыфры до 5 */ + return '00'+lOwner+lGroup+lAll; + }; + /** Функция получает короткие размеры + * конвертируя байт в килобайты, мегабойты, + * гигайбайты и терабайты + * @pSize - размер в байтах + */ + CloudFunc.getShortedSize = function(pSize){ + /* if pSize=0 - return it */ + if (pSize !== pSize-0) return pSize; + + /* Константы размеров, что используются + * внутри функции + */ + var l1BMAX = 1024; + var l1KBMAX = 1048576; + var l1MBMAX = 1073741824; + var l1GBMAX = 1099511627776; + var l1TBMAX = 1125899906842624; + + var lShorted; + + if (pSize < l1BMAX) lShorted = pSize + 'b'; + else if (pSize < l1KBMAX) lShorted = (pSize/l1BMAX) .toFixed(2) + 'kb'; + else if (pSize < l1MBMAX) lShorted = (pSize/l1KBMAX).toFixed(2) + 'mb'; + else if (pSize < l1GBMAX) lShorted = (pSize/l1MBMAX).toFixed(2) + 'gb'; + else if (pSize < l1TBMAX) lShorted = (pSize/l1GBMAX).toFixed(2) + 'tb'; + return lShorted; + }; + + /** Function gets file name and + * if it's bigger the 16 chars + * cut it and adds '..' + * @pName - file name + */ + CloudFunc.getShortedName = function(pName){ + return (pName.length > CloudFunc.SHORTNAMELENGTH ? + (pName.substr(pName, + CloudFunc.SHORTNAMELENGTH) + '..'): + pName); + }; + + + /** Функция парсит uid и имена пользователей + * из переданного в строке вычитаного файла /etc/passwd + * и возвращает массив обьектов имён и uid пользователей + * @pPasswd_s - строка, в которой находиться файл /etc/passwd + */ + CloudFunc.getUserUIDsAndNames = function(pPasswd_s){ + var lUsers={name:'',uid:''}; + var lUsersData=[]; + var i=0; + do{ + /* получаем первую строку */ + var lLine=pPasswd_s.substr(pPasswd_s,pPasswd_s.indexOf('\n')+1); + if(lLine){ + /* удаляем первую строку из /etc/passwd*/ + pPasswd_s=pPasswd_s.replace(lLine,''); + /* получаем первое слово строки */ + var lName=lLine.substr(lLine,lLine.indexOf(':')); + lLine=lLine.replace(lName+':x:',''); + /* получаем uid*/ + var lUID=lLine.substr(lLine,lLine.indexOf(':')); + if((lUID-0).toString()!=='NaN'){ + lUsers.name=lName; + lUsers.uid=lUID; + lUsersData[i++]=lUsers; + console.log('uid='+lUID+' name='+lName); + } + } + }while(pPasswd_s!==''); + + return lUsersData; + }; + + /** Функция получает адреса каждого каталога в пути + * возвращаеться массив каталогов + * @param url - адрес каталога + */ + CloudFunc._getDirPath = function(url){ + var folders=[]; + var i=0; + do{ + folders[i++]=url; url=url.substr(url,url.lastIndexOf('/')); + }while(url!==''); + + /* Формируем ссылки на каждый каталог в пути */ + var lHref=''; + var lHrefEnd=''; + + var lHtmlPath; + /* путь в ссылке, который говорит + * что js отключен + */ + var lNoJS_s = CloudFunc.NOJS; + var lFS_s = CloudFunc.FS; + /* корневой каталог */ + lHtmlPath = lHref + + lFS_s + + lNoJS_s + + lTitle + + '"/"' + + _l + + '/' + + lHrefEnd; + + for(i = folders.length - 1; i > 0; i--) + { + var lUrl=folders[i]; + var lShortName=lUrl.replace(lUrl.substr(lUrl,lUrl.lastIndexOf('/')+1),''); + if (i!==1) + lHtmlPath += lHref + + lFS_s + lNoJS_s + lUrl + + lTitle + lUrl + _l + + lShortName + + lHrefEnd + '/'; + else + lHtmlPath+=lShortName+'/'; + } + /* *** */ + return lHtmlPath; + }; + + /** + * Функция ищет в имени файла расширение + * и если находит возвращает true + * @param pName - получает имя файла + * @param pExt - расширение + */ + CloudFunc.checkExtension = function(pName, pExt) + { + /* если длина имени больше + * длинны расширения - + * имеет смысл продолжать + */ + if (typeof pExt === 'string' && + pName.length > pExt.length) { + var lLength = pName.length; /* длина имени*/ + var lExtNum = pName.lastIndexOf(pExt); /* последнее вхождение расширения*/ + var lExtSub = lLength - lExtNum; /* длина расширения*/ + + /* если pExt - расширение pName */ + return lExtSub === pExt.length; + + }else if(typeof pExt === 'object' && + pExt.length){ + for(var i=0; i < pName.length; i++) + if(this.checkExtension(pName, pExt[i])) + return true; + }else + return false; + }; + + /** + * Функция формирует заголовки столбиков + * @pFileTableTitles - массив названий столбиков + */ + CloudFunc._getFileTableHeader = function(pFileTableTitles) + { + var lHeader='
  • '; + lHeader+=''; + for(var i=0;i'+ + lStr+ ''; - /* если папка - не выводим размер */ - lFileTable +='' + - (files[i].size === 'dir' ? - '<dir>' - /* если это файл - получаем - * короткий размер - */ - : CloudFunc.getShortedSize( - files[i].size)); - lFileTable +='' + - '' + - (!files[i].uid ? 'root' : files[i].uid) + - '' + - '' + - /* конвертируем названия разрешений - * из числового формата в буквенный - * при этом корневой каталог не трогаем - * по скольку в нём и так всё уже - * установлено еще на сервере - */ - (//lPath==='/'?files[i].mode: - CloudFunc - .convertPermissionsToSymbolic - (files[i].mode)) + - ''; - lFileTable += '
  • '; - } - - /* если клавиши назначены и - * мы в корневом каталоге и - * верхний файл еще не выделен - - * выделяем верхний файл - */ - if(pKeyBinded && lPath === '/'&& - lFileTable.indexOf('
  • ') < 0){ - lFileTable = lFileTable - .replace('
  • ', - '
  • '); - } + } + lHeader+='
  • '; - return lFileTable; -}; - -/* - * Если мы на стороне сервера - - * прописываем экспортируемые функции - */ -var exports; -if(exports){ - /* экспортируемые функции */ - exports.checkExtension = CloudFunc.checkExtension; - exports.buildFromJSON = CloudFunc.buildFromJSON; - exports.setTitle = CloudFunc.setTitle; - exports.getUserUIDsAndNames = CloudFunc.getUserUIDsAndNames; + return lHeader; + }; - /* константы*/ - exports.Name = CloudFunc.NAME; - exports.NOJS = CloudFunc.NOJS; - exports.FS = CloudFunc.FS; -} \ No newline at end of file + /** + * Функция строит таблицу файлв из JSON-информации о файлах + * @param pJSON - информация о файлах + * @param pKeyBinded - если клавиши назначены, выделяем верхний файл + * [{path:'путь',size:'dir'}, + * {name:'имя',size:'размер',mode:'права доступа'}] + */ + CloudFunc.buildFromJSON = function(pJSON, pKeyBinded) + { + var files; + /* + * Если мы на клиенте и нет JSON - + * через eval парсим. + * Если-же мы на сервере, + * или на клиенте всё есть + * парсим стандарным методом + * + * По скольку мы прописали заголовок application/json + * нет необходимости его конвертировать, + * но она есть, если мы вытягиваем данные из + * localStorage + */ + files = pJSON; + + /* сохраняем путь каталога в котором мы сейчас находимся*/ + var lPath = files[0].path; + + /* сохраняем путь */ + CloudFunc.Path = lPath; + + /* + * Строим путь каталога в котором мы находимся + * со всеми подкаталогами + */ + var lHtmlPath = CloudFunc._getDirPath(lPath), + + /* Убираем последний слэш + * с пути для кнопки обновить страницу + * если он есть + */ + lRefreshPath = CloudFunc.removeLastSlash(lPath), + + /* путь в ссылке, который говорит + * что js отключен + */ + lNoJS_s = CloudFunc.NOJS, + lFS_s = CloudFunc.FS, + + lFileTable = + '
  • '+ + '' + + '' + + '' + + '' + + '' + + '' + + '' + lHtmlPath + '' + + '
  • ', + + fileTableTitles = ['name','size','owner','mode']; + + lFileTable += CloudFunc._getFileTableHeader(fileTableTitles); + + /* Если мы не в корне */ + if(lPath !== '/'){ + /* ссылка на верхний каталог*/ + var lDotDot; + /* убираем последний слеш и каталог в котором мы сейчас находимся*/ + lDotDot = lPath.substr(lPath,lPath.lastIndexOf('/')); + lDotDot = lDotDot.substr(lDotDot,lDotDot.lastIndexOf('/')); + /* Если предыдущий каталог корневой */ + if(lDotDot === '')lDotDot = '/'; + + /* Сохраняем путь к каталогу верхнего уровня*/ + lFileTable += '
  • '+ + '' + + '' + + '' + + '' + ".." + + '' + + '<dir>'+ + '.' + + '' + + '
  • '; + } + + for(var i = 1, n = files.length; i < n; i++){ + lFileTable += '
  • '; + lFileTable += ''; + lFileTable += ''; + lFileTable += '' + + ' CloudFunc.SHORTNAMELENGTH ? + ' title="' + files[i].name + '">' + + CloudFunc.getShortedName(files[i].name) + : 'draggable=true>' + files[i].name) + + "" + + ''; + /* если папка - не выводим размер */ + lFileTable += '' + + (files[i].size === 'dir' ? + '<dir>' + /* если это файл - получаем + * короткий размер + */ + : CloudFunc.getShortedSize( + files[i].size)); + lFileTable += '' + + '' + + (!files[i].uid ? 'root' : files[i].uid) + + '' + + '' + + /* конвертируем названия разрешений + * из числового формата в буквенный + * при этом корневой каталог не трогаем + * по скольку в нём и так всё уже + * установлено еще на сервере + */ + (//lPath==='/'?files[i].mode: + CloudFunc + .convertPermissionsToSymbolic + (files[i].mode)) + + ''; + lFileTable += '
  • '; + } + + /* если клавиши назначены и + * мы в корневом каталоге и + * верхний файл еще не выделен - + * выделяем верхний файл + */ + if(pKeyBinded && lPath === '/'&& + lFileTable.indexOf('
  • ') < 0){ + lFileTable = lFileTable + .replace('
  • ', + '
  • '); + } + + return lFileTable; + }; + + /* + * Если мы на стороне сервера - + * прописываем экспортируемые функции + */ + if(exports){ + /* экспортируемые функции */ + exports.checkExtension = CloudFunc.checkExtension; + exports.buildFromJSON = CloudFunc.buildFromJSON; + exports.setTitle = CloudFunc.setTitle; + exports.getUserUIDsAndNames = CloudFunc.getUserUIDsAndNames; + + /* константы*/ + exports.Name = CloudFunc.NAME; + exports.NOJS = CloudFunc.NOJS; + exports.FS = CloudFunc.FS; + } +})(); \ No newline at end of file