示例#1
0
        /// <summary>
        /// FileDetails
        /// </summary>
        /// <param name="context">The web context.</param>
        /// <returns>True if error; else false.</returns>
        private bool FileDetails(HttpContext context)
        {
            bool isError = false;

            AutoResetEvent waitEvent = new AutoResetEvent(false);

            try
            {
                // Get the user unique id and the current token issued.
                string uniqueIdentifier = context.Request.QueryString["UniqueIdentifier"];
                string token            = context.Request.QueryString["Token"];

                // State object.
                Common.TokenState tokenState = new Common.TokenState();
                tokenState.IsValid    = false;
                tokenState.Permission = null;

                // Is token valid.
                _token.IsValid(uniqueIdentifier, _serviceName, token, (result, permission, state) =>
                {
                    try
                    {
                        // Get the token validation data.
                        Common.TokenState stateToken = (Common.TokenState)state;
                        stateToken.IsValid           = result;
                        stateToken.Permission        = permission;
                    }
                    catch { }

                    // Validation has ended.
                    waitEvent.Set();
                }, uniqueIdentifier, tokenState);

                // Wait until the token validation.
                waitEvent.WaitOne((int)(_requestTimeout + 10000));

                // If not valid vredentails
                if (!tokenState.IsValid)
                {
                    throw new Nequeo.Exceptions.InvalidCredentailsException("Invalid credentails.");
                }

                // Attempt to find the permission.
                Nequeo.Security.IPermission perState = tokenState.Permission;

                // If download permission is denied.
                if (perState == null || !perState.Access() || !perState.Permission.HasFlag(Nequeo.Security.PermissionType.Download))
                {
                    throw new Nequeo.Exceptions.PermissionException("Permission denied");
                }

                // Get the user unique id.
                string   fileNameQuery         = context.Request.QueryString["FileName"];
                string   fileSubDirectoryQuery = context.Request.QueryString["Directory"];
                string   fileNamePath          = Common.Helper.GetFilePath(fileNameQuery, fileSubDirectoryQuery);
                string[] details = new string[15];

                // Get the file information.
                FileInfo fileInfo = new FileInfo(fileNamePath);
                details[0]  = fileInfo.Attributes.ToString();
                details[1]  = fileInfo.CreationTime.ToString();
                details[2]  = fileInfo.CreationTimeUtc.ToString();
                details[3]  = Common.Helper.GetRelativePath(fileInfo.Directory.FullName);
                details[4]  = Common.Helper.GetRelativePath(fileInfo.DirectoryName);
                details[5]  = fileInfo.Exists.ToString();
                details[6]  = fileInfo.Extension.ToString();
                details[7]  = Common.Helper.GetRelativePath(fileInfo.FullName);
                details[8]  = fileInfo.IsReadOnly.ToString();
                details[9]  = fileInfo.LastAccessTime.ToString();
                details[10] = fileInfo.LastAccessTimeUtc.ToString();
                details[11] = fileInfo.LastWriteTime.ToString();
                details[12] = fileInfo.LastWriteTimeUtc.ToString();
                details[13] = fileInfo.Length.ToString();
                details[14] = fileInfo.Name.ToString();

                // Convert the paths to byte array.
                string buffer = String.Join("\r\n", details);

                // Send the file.
                context.Response.AddHeader("Content-Length", buffer.Length.ToString());
                context.Response.ContentType = "text/txt";
                context.Response.AddHeader("MemberResult", true.ToString());

                // Write the data to the stream.
                context.Response.Write(buffer);
            }
            catch (Nequeo.Exceptions.InvalidPathException)
            {
                try
                {
                    // Send an error response.
                    context.Response.StatusCode        = 500;
                    context.Response.StatusDescription = "Internal server error";
                    context.Response.AddHeader("Content-Length", "0");
                    context.Response.AddHeader("MemberResult", false.ToString());
                    context.Response.Write("");
                }
                catch { }
            }
            catch (Nequeo.Exceptions.PermissionException)
            {
                try
                {
                    // Send an error response.
                    context.Response.StatusCode        = 500;
                    context.Response.StatusDescription = "Internal server error";
                    context.Response.AddHeader("Content-Length", "0");
                    context.Response.AddHeader("MemberResult", false.ToString());
                    context.Response.Write("");
                }
                catch { }
            }
            catch (Nequeo.Exceptions.InvalidCredentailsException)
            {
                try
                {
                    // Send an error response.
                    context.Response.StatusCode        = 500;
                    context.Response.StatusDescription = "Internal server error";
                    context.Response.AddHeader("Content-Length", "0");
                    context.Response.AddHeader("MemberResult", false.ToString());
                    context.Response.Write("");
                }
                catch { }
            }
            catch { }
            finally
            {
                if (waitEvent != null)
                {
                    waitEvent.Dispose();
                }
            }

            // Return the result.
            return(isError);
        }
示例#2
0
        /// <summary>
        /// DownloadFile
        /// </summary>
        /// <param name="context">The web context.</param>
        /// <returns>True if error; else false.</returns>
        private bool DownloadFile(HttpContext context)
        {
            bool isError = false;

            AutoResetEvent waitEvent     = new AutoResetEvent(false);
            FileStream     requestStream = null;

            try
            {
                // Get the user unique id and the current token issued.
                string uniqueIdentifier = context.Request.QueryString["UniqueIdentifier"];
                string token            = context.Request.QueryString["Token"];

                // State object.
                Common.TokenState tokenState = new Common.TokenState();
                tokenState.IsValid    = false;
                tokenState.Permission = null;

                // Is token valid.
                _token.IsValid(uniqueIdentifier, _serviceName, token, (result, permission, state) =>
                {
                    try
                    {
                        // Get the token validation data.
                        Common.TokenState stateToken = (Common.TokenState)state;
                        stateToken.IsValid           = result;
                        stateToken.Permission        = permission;
                    }
                    catch { }

                    // Validation has ended.
                    waitEvent.Set();
                }, uniqueIdentifier, tokenState);

                // Wait until the token validation.
                waitEvent.WaitOne((int)(_requestTimeout + 10000));

                // If not valid vredentails
                if (!tokenState.IsValid)
                {
                    throw new Nequeo.Exceptions.InvalidCredentailsException("Invalid credentails.");
                }

                // Attempt to find the permission.
                Nequeo.Security.IPermission perState = tokenState.Permission;

                // If download permission is denied.
                if (perState == null || !perState.Access() || !perState.Permission.HasFlag(Nequeo.Security.PermissionType.Download))
                {
                    throw new Nequeo.Exceptions.PermissionException("Permission denied");
                }

                // Get the file location.
                string   fileNameQuery         = context.Request.QueryString["FileName"];
                string   fileSubDirectoryQuery = context.Request.QueryString["Directory"];
                string   fileNamePath          = Common.Helper.GetDownloadFile(fileNameQuery, fileSubDirectoryQuery);
                string   fileName  = System.IO.Path.GetFileName(fileNamePath);
                string   extension = System.IO.Path.GetExtension(fileNamePath);
                FileInfo fileInfo  = new FileInfo(fileNamePath);

                // Get the file read position.
                long fileReadPosition = 0;
                long contentLength    = fileInfo.Length;

                // Get the read position of the file.
                if (context.Request.QueryString["FileReadPosition"] != null)
                {
                    fileReadPosition = Int64.Parse(context.Request.QueryString["FileReadPosition"]);
                }

                // If the file read position is too large.
                if (fileReadPosition > fileInfo.Length)
                {
                    // Throw position too large.
                    throw new Nequeo.Exceptions.InvalidLengthException("File read position invalid.");
                }
                else
                {
                    // Open and read the file.
                    requestStream = new FileStream(fileNamePath, FileMode.Open, FileAccess.Read, FileShare.Read);

                    // Set the position to start reading from.
                    requestStream.Seek(fileReadPosition, SeekOrigin.Begin);
                }

                // If the read position has been set.
                if (fileReadPosition > 0)
                {
                    // Get the difference.
                    contentLength = fileInfo.Length - fileReadPosition;
                }

                // Send the file.
                context.Response.AddHeader("Content-Length", contentLength.ToString());
                context.Response.ContentType = "application/" + extension;
                context.Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + "\"");
                context.Response.AddHeader("MemberResult", true.ToString());

                // Send the file to the stream.
                Nequeo.IO.Stream.Operation.CopyStream(requestStream, context.Response.OutputStream, contentLength, _responseTimeout, _writeBufferSize);
                requestStream.Close();
            }
            catch (Nequeo.Exceptions.InvalidPathException)
            {
                try
                {
                    // Send an error response.
                    context.Response.StatusCode        = 500;
                    context.Response.StatusDescription = "Internal server error";
                    context.Response.AddHeader("Content-Length", "0");
                    context.Response.AddHeader("MemberResult", false.ToString());
                    context.Response.Write("");
                }
                catch { }
            }
            catch (Nequeo.Exceptions.PermissionException)
            {
                try
                {
                    // Send an error response.
                    context.Response.StatusCode        = 500;
                    context.Response.StatusDescription = "Internal server error";
                    context.Response.AddHeader("Content-Length", "0");
                    context.Response.AddHeader("MemberResult", false.ToString());
                    context.Response.Write("");
                }
                catch { }
            }
            catch (Nequeo.Exceptions.InvalidCredentailsException)
            {
                try
                {
                    // Send an error response.
                    context.Response.StatusCode        = 500;
                    context.Response.StatusDescription = "Internal server error";
                    context.Response.AddHeader("Content-Length", "0");
                    context.Response.AddHeader("MemberResult", false.ToString());
                    context.Response.Write("");
                }
                catch { }
            }
            catch { }
            finally
            {
                // Dispose of the buffer.
                if (requestStream != null)
                {
                    requestStream.Dispose();
                }

                if (waitEvent != null)
                {
                    waitEvent.Dispose();
                }
            }

            // Return the result.
            return(isError);
        }