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!" }); } }
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!" }); } }
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!" }); } }
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); }
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); }
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" }); }
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!" }); }
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" }); }
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" }); }
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!" }); } }
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" }); }
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]}" }); } }
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]})" }); }
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!" }); } }