예제 #1
0
        private FtpResponse RemoveFile(FtpRequest request, FtpData ftpData)
        {
            var path = request.Arguments.Length > 0 ?
                       Path.GetFullPath(ftpData.CurrentDirectory + "\\" + request.Arguments.Aggregate((prev, next) => prev + " " + next)) :
                       null;

            if (path != null)
            {
                if (File.Exists(path))
                {
                    File.Delete(path);
                    return(new FtpResponse {
                        StatusCode = FtpResponseCodes.RequestedFileActionOkay, Message = $"Removed file {request.Arguments[0]}!"
                    });
                }
                else
                {
                    return(new FtpResponse {
                        StatusCode = FtpResponseCodes.FileUnavailable, Message = $"File {request.Arguments[0]} not found!"
                    });
                }
            }
            else
            {
                return(new FtpResponse {
                    StatusCode = FtpResponseCodes.RequestedActionAborted, Message = $"No path argument provided!"
                });
            }
        }
예제 #2
0
        private FtpResponse RemoveDirectory(FtpRequest request, FtpData ftpData)
        {
            var path = request.Arguments.Length > 0 ?
                       Path.GetFullPath(ftpData.CurrentDirectory + "\\" + request.Arguments.Aggregate((prev, next) => prev + " " + next)) :
                       ftpData.CurrentDirectory;

            if (!path.IsSubPathOf(Path.GetFullPath(this.RootPath)))
            {
                return(new FtpResponse {
                    StatusCode = FtpResponseCodes.FileUnavailable, Message = "Directory not found!"
                });
            }

            if (Directory.Exists(path))
            {
                Directory.Delete(path, true);
                return(new FtpResponse {
                    StatusCode = FtpResponseCodes.RequestedFileActionOkay, Message = "Removed directory!"
                });
            }
            else
            {
                return(new FtpResponse {
                    StatusCode = FtpResponseCodes.FileUnavailable, Message = "Directory not found!"
                });
            }
        }
예제 #3
0
        private FtpResponse StoreFile(FtpRequest request, FtpData ftpData)
        {
            var path = request.Arguments.Length > 0 ?
                       Path.GetFullPath(ftpData.CurrentDirectory + "\\" + request.Arguments.Aggregate((prev, next) => prev + " " + next)) :
                       null;

            if (path != null)
            {
                using (var fs = File.Create(path))
                {
                    while (ftpData.AvailableBytes() > 0)
                    {
                        var bytes = ftpData.GetBytes(ftpData.AvailableBytes());
                        fs.Write(bytes, 0, bytes.Length);
                    }
                }

                return(new FtpResponse {
                    StatusCode = FtpResponseCodes.ClosingDataConnection, Message = "Transfer complete"
                });
            }
            else
            {
                return(new FtpResponse {
                    StatusCode = FtpResponseCodes.RequestedActionAborted, Message = $"No path argument provided!"
                });
            }
        }
예제 #4
0
        public override void Export(TextAsset packageJsonAsset, Action success, Action fail)
        {
            var writePass = writePassword;

            writePassword = string.Empty;
            EditorUtility.SetDirty(this);
            AssetDatabase.Refresh();

            ExecuteAction(() =>
            {
                var packageJson      = JsonUtility.FromJson <PackageJson>(packageJsonAsset.text);
                var unityPackageFile = GetTempUnityPackagePath();

                ExportUnityPackage(packageJsonAsset, unityPackageFile, () =>
                {
                    writePassword = writePass;
                    EditorUtility.SetDirty(this);
                    AssetDatabase.Refresh();

                    var data = new FtpData
                    {
                        Url              = url,
                        User             = user,
                        Password         = writePassword,
                        LocalFile        = unityPackageFile,
                        PackageName      = packageJson.name,
                        PackageVersion   = packageJson.version,
                        UnityPackageName = name,
                    };

                    FtpUtils.Upload(data, success, fail);
                }, fail);
            }, fail);
        }
예제 #5
0
        public override void Import(TextAsset packageJsonAsset, Action success, Action fail)
        {
            ExecuteAction(() =>
            {
                var packageJson      = JsonUtility.FromJson <PackageJson>(packageJsonAsset.text);
                var unityPackageFile = GetTempUnityPackagePath();

                var data = new FtpData
                {
                    Url              = url,
                    User             = user,
                    Password         = readPassword,
                    LocalFile        = unityPackageFile,
                    PackageName      = packageJson.name,
                    PackageVersion   = packageJson.version,
                    UnityPackageName = name,
                };

                FtpUtils.Download(data, () =>
                {
                    AssetDatabase.ImportPackage(unityPackageFile, true);
                    success();
                }, fail);
            }, fail);
        }
예제 #6
0
        private FtpResponse EnableActiveMode(FtpRequest request, FtpData ftpData)
        {
            ftpData.TransferDetails.Socket?.Dispose();

            var portArgs = request.Arguments[0].Split(',');

            ftpData.TransferDetails.Mode = TransferDetails.TransferMode.Active;
            byte[] addressBytes = { byte.Parse(portArgs[0]), byte.Parse(portArgs[1]), byte.Parse(portArgs[2]), byte.Parse(portArgs[3]) };
            byte[] portBytes    = { byte.Parse(portArgs[4]), byte.Parse(portArgs[5]) };

            if (!BitConverter.IsLittleEndian)
            {
                Array.Reverse(portBytes);
            }

            var address = new IPAddress(addressBytes);
            var port    = BitConverter.ToUInt16(portBytes, 0);

            ftpData.TransferDetails.DestinationDataAddress = address;
            ftpData.TransferDetails.DestinationDataPort    = port;

            ftpData.TransferDetails.Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            return(new FtpResponse {
                StatusCode = FtpResponseCodes.ActionCompleted, Message = "PORT Command Accepted"
            });
        }
예제 #7
0
        private FtpResponse ChangeCurrentDirectory(FtpRequest request, FtpData ftpData)
        {
            var directory = this.RootPath + request.Arguments.Aggregate((prev, next) => prev + " " + next);

            ftpData.CurrentDirectory = Path.GetFullPath(directory);
            return(new FtpResponse {
                StatusCode = FtpResponseCodes.ActionCompleted, Message = "Changed working directory!"
            });
        }
예제 #8
0
        private FtpResponse ListFolder(FtpRequest request, FtpData ftpData)
        {
            var path = request.Arguments.Length > 0 ?
                       Path.GetFullPath(ftpData.CurrentDirectory + request.Arguments.Aggregate((prev, next) => prev + " " + next)) :
                       ftpData.CurrentDirectory;
            var directories = Directory.EnumerateDirectories(path);
            var files       = Directory.EnumerateFiles(path);

            foreach (var dir in directories)
            {
                var editDate = Directory.GetLastWriteTime(dir);

                var date = editDate < DateTime.Now.Subtract(TimeSpan.FromDays(180)) ?
                           editDate.ToString("MMM dd  yyyy", CultureInfo.InvariantCulture) :
                           editDate.ToString("MMM dd HH:mm", CultureInfo.InvariantCulture);

                var data  = "drwxr-xr-x    2 2003     2003         4096 " + date + ' ' + Path.GetFileName(dir) + "\r\n";
                var bytes = Encoding.UTF8.GetBytes(data);
                ftpData.SendData(bytes, bytes.Length);
            }

            foreach (var file in files)
            {
                var f = new FileInfo(file);

                var date = f.LastWriteTime < DateTime.Now.Subtract(TimeSpan.FromDays(180)) ?
                           f.LastWriteTime.ToString("MMM dd  yyyy", CultureInfo.InvariantCulture) :
                           f.LastWriteTime.ToString("MMM dd HH:mm", CultureInfo.InvariantCulture);

                var line = "-rw-r--r--    2 2003     2003     ";

                var length = f.Length.ToString(CultureInfo.InvariantCulture);

                if (length.Length < 8)
                {
                    for (var i = 0; i < 8 - length.Length; i++)
                    {
                        line += ' ';
                    }
                }

                line += length + ' ' + date + ' ' + f.Name + "\r\n";
                var bytes = Encoding.UTF8.GetBytes(line);
                ftpData.SendData(bytes, bytes.Length);
            }

            return(new FtpResponse {
                StatusCode = FtpResponseCodes.ClosingDataConnection, Message = "Transfer complete"
            });
        }
예제 #9
0
        private FtpResponse PrintCurrentDirectory(FtpRequest request, FtpData ftpData)
        {
            var relativePath = ftpData.CurrentDirectory.RelativePath(Path.GetFullPath(this.RootPath));

            if (string.IsNullOrWhiteSpace(relativePath))
            {
                relativePath = "\\";
            }
            else
            {
                relativePath = relativePath.Substring(this.RootPath.Length) + "\\";
            }

            return(new FtpResponse {
                StatusCode = FtpResponseCodes.PATHNAMECreated, Message = $"\"{relativePath}\" is current directory"
            });
        }
예제 #10
0
        private FtpResponse ChangeToParentDirectory(FtpRequest request, FtpData ftpData)
        {
            var directoryInfo = Directory.GetParent(ftpData.CurrentDirectory);

            if (!directoryInfo.FullName.IsSubPathOf(Path.GetFullPath(this.RootPath)))
            {
                return(new FtpResponse {
                    StatusCode = FtpResponseCodes.SyntaxError, Message = "Cannot CDUP from root directory!"
                });
            }
            else
            {
                ftpData.CurrentDirectory = directoryInfo.FullName;
                return(new FtpResponse {
                    StatusCode = FtpResponseCodes.ActionCompleted, Message = $"Changed working directory!"
                });
            }
        }
예제 #11
0
        private FtpResponse RetrieveFile(FtpRequest request, FtpData ftpData)
        {
            var path = request.Arguments.Length > 0 ?
                       Path.GetFullPath(ftpData.CurrentDirectory + request.Arguments.Aggregate((prev, next) => prev + " " + next)) :
                       null;

            if (path != null)
            {
                using var fs = File.OpenRead(path);
                var buffer = new byte[256];
                int bytesRead;
                while ((bytesRead = fs.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ftpData.SendData(buffer, bytesRead);
                }
            }

            return(new FtpResponse {
                StatusCode = FtpResponseCodes.ClosingDataConnection, Message = "Transfer complete"
            });
        }
예제 #12
0
 private FtpResponse HandleTypeArguments(FtpRequest request, FtpData ftpData)
 {
     if (request.Arguments[0] == "I")
     {
         ftpData.TransferDetails.Type = TransferDetails.TransferType.BINARY;
         return(new FtpResponse {
             StatusCode = FtpResponseCodes.ActionCompleted, Message = "Set transfer encoding to binary"
         });
     }
     else if (request.Arguments[0] == "A")
     {
         ftpData.TransferDetails.Type = TransferDetails.TransferType.ASCII;
         return(new FtpResponse {
             StatusCode = FtpResponseCodes.ActionCompleted, Message = "Set transfer encoding to ASCII"
         });
     }
     else
     {
         return(new FtpResponse {
             StatusCode = FtpResponseCodes.CommandNotImplementedForParameter, Message = $"Command not implemented for parameter {request.Arguments[0]}"
         });
     }
 }
예제 #13
0
        private FtpResponse EnablePassiveMode(FtpRequest request, FtpData ftpData, ClientData client)
        {
            ftpData.TransferDetails.Socket?.Dispose();

            ftpData.TransferDetails.Mode   = TransferDetails.TransferMode.Passive;
            ftpData.TransferDetails.Socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            ftpData.TransferDetails.Socket.Bind(new IPEndPoint(IPAddress.Any, 0));
            var address   = ((IPEndPoint)client.Socket.LocalEndPoint).Address.GetAddressBytes();
            var portBytes = BitConverter.GetBytes((short)ftpData.TransferDetails.LocalDataPort);

            if (BitConverter.IsLittleEndian)
            {
                Array.Reverse(portBytes);
            }

            ftpData.TransferDetails.Socket.Listen(10);

            return(new FtpResponse
            {
                StatusCode = FtpResponseCodes.EnterPassiveMode,
                Message = $"Entering Passive mode ({address[0]},{address[1]},{address[2]},{address[3]},{portBytes[0]},{portBytes[1]})"
            });
        }
예제 #14
0
        private FtpResponse CreateDirectory(FtpRequest request, FtpData ftpData)
        {
            var path = request.Arguments.Length > 0 ?
                       Path.GetFullPath(ftpData.CurrentDirectory + "\\" + request.Arguments.Aggregate((prev, next) => prev + " " + next)) :
                       null;

            if (path != null)
            {
                if (!path.IsSubPathOf(Path.GetFullPath(this.RootPath)))
                {
                    return(new FtpResponse {
                        StatusCode = FtpResponseCodes.RequestedFileActionNotTaken, Message = "Path not found!"
                    });
                }

                if (!Directory.Exists(path))
                {
                    Directory.CreateDirectory(path);
                    return(new FtpResponse {
                        StatusCode = FtpResponseCodes.RequestedFileActionOkay, Message = $"Created directory {request.Arguments[0]}!"
                    });
                }
                else
                {
                    return(new FtpResponse {
                        StatusCode = FtpResponseCodes.RequestedFileActionNotTaken, Message = $"Directory {request.Arguments[0]} already exists!"
                    });
                }
            }
            else
            {
                return(new FtpResponse {
                    StatusCode = FtpResponseCodes.RequestedActionAborted, Message = $"No path argument provided!"
                });
            }
        }