jsharmony-cms 1.9.3 → 1.9.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/jsHarmonyCMSSFTPServer.js +148 -130
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -797,154 +797,172 @@ jsHarmonyCMSSFTPServer.prototype.Run = function(run_cb){
|
|
|
797
797
|
|
|
798
798
|
|
|
799
799
|
}).on('READDIR', function(reqid, handle) {
|
|
800
|
-
_this.DebugLog(clientDesc + 'READDIR');
|
|
800
|
+
_this.DebugLog(clientDesc + 'READDIR '+reqid);
|
|
801
801
|
//.name(reqid, names) names = array of { filename, longname, attrs }
|
|
802
802
|
//.status(reqid, statusCode, [message])
|
|
803
803
|
|
|
804
804
|
var handleInfo = getHandleInfo(handle);
|
|
805
805
|
if(!handleInfo) return sftpStream.status(reqid, ssh2.SFTP_STATUS_CODE.FAILURE, 'Handle not found');
|
|
806
806
|
|
|
807
|
-
handleInfo
|
|
807
|
+
waitForLock(handleInfo, function(){
|
|
808
|
+
handleInfo.lock = true;
|
|
808
809
|
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
if(handleInfo.
|
|
812
|
-
|
|
813
|
-
|
|
810
|
+
handleInfo.page++;
|
|
811
|
+
|
|
812
|
+
if(!handleInfo.syspath){
|
|
813
|
+
//Root folder
|
|
814
|
+
if(handleInfo.page > 1){
|
|
815
|
+
handleInfo.lock = false;
|
|
816
|
+
sftpStream.status(reqid, ssh2.SFTP_STATUS_CODE.EOF);
|
|
817
|
+
closeHandle(handle);
|
|
818
|
+
}
|
|
819
|
+
else {
|
|
820
|
+
var filename = 'sites';
|
|
821
|
+
handleInfo.lock = false;
|
|
822
|
+
sftpStream.name(reqid, [{
|
|
823
|
+
filename: filename,
|
|
824
|
+
longname: 'drwxrwxrwx 1 sys sys 4096 '+moment().format('MMM D YYYY')+' ' + filename,
|
|
825
|
+
attrs: {
|
|
826
|
+
mode: 0777 + fs.constants.S_IFDIR, // eslint-disable-line no-octal
|
|
827
|
+
uid: 0,
|
|
828
|
+
gid: 0,
|
|
829
|
+
size: 4096,
|
|
830
|
+
atime: moment().unix(),
|
|
831
|
+
mtime: moment().unix(),
|
|
832
|
+
}
|
|
833
|
+
}]);
|
|
834
|
+
}
|
|
814
835
|
}
|
|
815
836
|
else {
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
attrs: {
|
|
821
|
-
mode: 0777 + fs.constants.S_IFDIR, // eslint-disable-line no-octal
|
|
822
|
-
uid: 0,
|
|
823
|
-
gid: 0,
|
|
824
|
-
size: 4096,
|
|
825
|
-
atime: moment().unix(),
|
|
826
|
-
mtime: moment().unix(),
|
|
837
|
+
fs.exists(handleInfo.syspath, function(exists){
|
|
838
|
+
if(!exists){
|
|
839
|
+
handleInfo.lock = false;
|
|
840
|
+
return sftpStream.status(reqid, ssh2.SFTP_STATUS_CODE.NO_SUCH_FILE);
|
|
827
841
|
}
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
842
|
+
fs.readdir(handleInfo.syspath, function(err, files){
|
|
843
|
+
if(err){
|
|
844
|
+
handleInfo.lock = false;
|
|
845
|
+
return sftpStream.status(reqid, ssh2.SFTP_STATUS_CODE.FAILURE, 'Error retrieving directory listing');
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
Helper.execif((handleInfo.path=='/sites'),
|
|
849
|
+
function(f){
|
|
850
|
+
files = [];
|
|
851
|
+
jsh.AppSrv.ExecRecordset(req._DBContext, cms.funcs.replaceSchema("select site_id,site_name from {schema}.v_my_site where site_sts='ACTIVE' order by site_id"), [], { }, function (err, rslt) {
|
|
852
|
+
if (err) {
|
|
853
|
+
jsh.Log.error(err);
|
|
854
|
+
handleInfo.lock = false;
|
|
855
|
+
return sftpStream.status(reqid, ssh2.SFTP_STATUS_CODE.FAILURE, 'Error retrieving site listing');
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
if(rslt && rslt[0]) _.each(rslt[0], function(site){
|
|
859
|
+
var filename_short = HelperFS.cleanFileName(site.site_id);
|
|
860
|
+
var filename_long = HelperFS.cleanFileName(site.site_id+'_'+site.site_name);
|
|
861
|
+
files.push({
|
|
862
|
+
filename: filename_short,
|
|
863
|
+
longname: 'drwxrwxrwx 0 sys sys 4096 '+moment().format('MMM D YYYY')+' ' + filename_short,
|
|
864
|
+
attrs: {
|
|
865
|
+
mode: 0777, // eslint-disable-line no-octal
|
|
866
|
+
uid: 0,
|
|
867
|
+
gid: 0,
|
|
868
|
+
size: 4096,
|
|
869
|
+
atime: moment().unix(),
|
|
870
|
+
mtime: moment().unix(),
|
|
871
|
+
}
|
|
872
|
+
});
|
|
873
|
+
files.push({
|
|
874
|
+
filename: filename_long,
|
|
875
|
+
longname: 'lrwxrwxrwx 1 sys sys 4096 '+moment().format('MMM D YYYY')+' ' + filename_long,
|
|
876
|
+
attrs: {
|
|
877
|
+
mode: 0777 + fs.constants.S_IFDIR, // eslint-disable-line no-octal
|
|
878
|
+
uid: 0,
|
|
879
|
+
gid: 0,
|
|
880
|
+
size: 4096,
|
|
881
|
+
atime: moment().unix(),
|
|
882
|
+
mtime: moment().unix(),
|
|
883
|
+
}
|
|
884
|
+
});
|
|
869
885
|
});
|
|
886
|
+
|
|
887
|
+
return f();
|
|
870
888
|
});
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
sftpStream.status(reqid, ssh2.SFTP_STATUS_CODE.EOF);
|
|
881
|
-
closeHandle(handle);
|
|
882
|
-
}
|
|
883
|
-
else{
|
|
884
|
-
for(var i=filesPerPage*(handleInfo.page-1);i<filesPerPage*handleInfo.page&&i<files.length;i++){
|
|
885
|
-
var file = files[i];
|
|
886
|
-
if(_.isString(file)){
|
|
887
|
-
pageFiles.push(file);
|
|
888
|
-
dirPage.push({
|
|
889
|
-
filename: file,
|
|
890
|
-
longname: file,
|
|
891
|
-
attrs: {}
|
|
892
|
-
});
|
|
893
|
-
}
|
|
894
|
-
else {
|
|
895
|
-
pageFiles.push('');
|
|
896
|
-
dirPage.push(file);
|
|
897
|
-
}
|
|
889
|
+
},
|
|
890
|
+
function(){
|
|
891
|
+
var filesPerPage = 1000;
|
|
892
|
+
var pageFiles = [];
|
|
893
|
+
var dirPage = [];
|
|
894
|
+
if((handleInfo.page-1)*filesPerPage >= files.length){
|
|
895
|
+
handleInfo.lock = false;
|
|
896
|
+
sftpStream.status(reqid, ssh2.SFTP_STATUS_CODE.EOF);
|
|
897
|
+
closeHandle(handle);
|
|
898
898
|
}
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
if(
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
dirPage[idx] = undefined;
|
|
910
|
-
return file_cb();
|
|
899
|
+
else{
|
|
900
|
+
for(var i=filesPerPage*(handleInfo.page-1);i<filesPerPage*handleInfo.page&&i<files.length;i++){
|
|
901
|
+
var file = files[i];
|
|
902
|
+
if(_.isString(file)){
|
|
903
|
+
pageFiles.push(file);
|
|
904
|
+
dirPage.push({
|
|
905
|
+
filename: file,
|
|
906
|
+
longname: file,
|
|
907
|
+
attrs: {}
|
|
908
|
+
});
|
|
911
909
|
}
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
dirPage[idx].attrs = {
|
|
917
|
-
mode: 0777 + (longname[0]=='d' ? fs.constants.S_IFDIR : longname[0]=='l' ? fs.constants.S_IFLNK : fs.constants.S_IFREG), // eslint-disable-line no-octal
|
|
918
|
-
uid: 0,
|
|
919
|
-
gid: 0,
|
|
920
|
-
size: (longname=='-' ? fstat.size : 4096),
|
|
921
|
-
atime: Math.floor(fstat.atime/1000),
|
|
922
|
-
mtime: Math.floor(fstat.mtime/1000),
|
|
923
|
-
};
|
|
924
|
-
|
|
925
|
-
return file_cb();
|
|
926
|
-
});
|
|
927
|
-
}, function(err){
|
|
928
|
-
if(err){
|
|
929
|
-
jsh.Log.error(err);
|
|
930
|
-
return sftpStream.status(reqid, ssh2.SFTP_STATUS_CODE.FAILURE, 'Error retrieving directory listing');
|
|
931
|
-
}
|
|
932
|
-
//Remove undefined entries from dirPage
|
|
933
|
-
for(var i=0;i<dirPage.length;i++){
|
|
934
|
-
if(typeof dirPage[i]=='undefined'){
|
|
935
|
-
dirPage.splice(i, 1);
|
|
936
|
-
i--;
|
|
910
|
+
else {
|
|
911
|
+
pageFiles.push('');
|
|
912
|
+
dirPage.push(file);
|
|
937
913
|
}
|
|
938
914
|
}
|
|
939
|
-
|
|
940
|
-
|
|
915
|
+
async.eachOfLimit(pageFiles, 50, function(pageFile, idx, file_cb){
|
|
916
|
+
if(!pageFile) return file_cb();
|
|
917
|
+
fs.stat(fspath.join(handleInfo.syspath, pageFile), function(err, fstat){
|
|
918
|
+
if(err) return file_cb();
|
|
919
|
+
|
|
920
|
+
var longname = '';
|
|
921
|
+
if(fstat.isDirectory()) longname += 'd';
|
|
922
|
+
//else if(fstat.isSymbolicLink()) longname += 'l';
|
|
923
|
+
else if(fstat.isFile()) longname += '-';
|
|
924
|
+
else{
|
|
925
|
+
dirPage[idx] = undefined;
|
|
926
|
+
return file_cb();
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
longname += 'rwxrwxrwx 0 sys sys '+(longname=='-' ? fstat.size : 4096)+' '+moment(fstat.mtime).format('MMM D YYYY')+' '+pageFile;
|
|
930
|
+
dirPage[idx].longname = longname;
|
|
931
|
+
|
|
932
|
+
dirPage[idx].attrs = {
|
|
933
|
+
mode: 0777 + (longname[0]=='d' ? fs.constants.S_IFDIR : longname[0]=='l' ? fs.constants.S_IFLNK : fs.constants.S_IFREG), // eslint-disable-line no-octal
|
|
934
|
+
uid: 0,
|
|
935
|
+
gid: 0,
|
|
936
|
+
size: (longname=='-' ? fstat.size : 4096),
|
|
937
|
+
atime: Math.floor(fstat.atime/1000),
|
|
938
|
+
mtime: Math.floor(fstat.mtime/1000),
|
|
939
|
+
};
|
|
940
|
+
|
|
941
|
+
return file_cb();
|
|
942
|
+
});
|
|
943
|
+
}, function(err){
|
|
944
|
+
if(err){
|
|
945
|
+
jsh.Log.error(err);
|
|
946
|
+
handleInfo.lock = false;
|
|
947
|
+
return sftpStream.status(reqid, ssh2.SFTP_STATUS_CODE.FAILURE, 'Error retrieving directory listing');
|
|
948
|
+
}
|
|
949
|
+
//Remove undefined entries from dirPage
|
|
950
|
+
for(var i=0;i<dirPage.length;i++){
|
|
951
|
+
if(typeof dirPage[i]=='undefined'){
|
|
952
|
+
dirPage.splice(i, 1);
|
|
953
|
+
i--;
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
handleInfo.lock = false;
|
|
957
|
+
sftpStream.name(reqid, dirPage);
|
|
958
|
+
});
|
|
959
|
+
}
|
|
941
960
|
}
|
|
942
|
-
|
|
943
|
-
);
|
|
961
|
+
);
|
|
962
|
+
});
|
|
944
963
|
});
|
|
945
|
-
}
|
|
946
|
-
}
|
|
947
|
-
|
|
964
|
+
}
|
|
965
|
+
});
|
|
948
966
|
|
|
949
967
|
}).on('LSTAT', function(reqid, fpath) {
|
|
950
968
|
_this.DebugLog(clientDesc + 'LSTAT '+fpath);
|