示例#1
0
        private static async Task InitliazeDb()
        {
            using (var context = new BakaContext())
            {
                await context.Database.EnsureCreatedAsync();

                var root_user = await context.Users.FirstOrDefaultAsync(x => x.Token == Config.RootToken);

                if (root_user != null)
                {
                    Console.WriteLine("Root user already exists!\n" + JsonConvert.SerializeObject(root_user));
                    return;
                }

                root_user = new BakaUser()
                {
                    Name          = "ROOT_USER",
                    Username      = "******",
                    InitialIp     = "ROOT_USER",
                    UploadLimitMB = 500,
                    Deleted       = false,
                    Disabled      = false,
                    Timestamp     = DateTime.Now,
                    Email         = "ROOT_USER_DO_NOT_USE_FOR_UPLOADING_OBJECTS",
                    Token         = Config.RootToken,
                    AccountType   = "su_full"
                };

                await context.Users.AddAsync(root_user);

                await context.SaveChangesAsync();

                Console.WriteLine("Created root user!\n" + JsonConvert.SerializeObject(root_user));
            }
        }
示例#2
0
        public async Task <IActionResult> GetUserInfo(string token)
        {
            try
            {
                AuthModel model = Authorize("su_full");
                if (!model.Authorized)
                {
                    Response.StatusCode = 401;

                    return(Json(new
                    {
                        success = false,
                        error = model.Reason,
                        code = 401
                    }));
                }

                using (var context = new BakaContext())
                {
                    BakaUser return_usr = await context.Users.FirstOrDefaultAsync(x => x.Token == token);

                    if (return_usr == null)
                    {
                        return(NotFound(new { success = false, error = "404 Not Found", code = 404 }));
                    }

                    return(Json(new
                    {
                        id = return_usr.Id,
                        username = return_usr.Username,
                        name = return_usr.Name,
                        email = return_usr.Email,
                        upload_limit = return_usr.UploadLimitMB,
                        initial_ip = return_usr.InitialIp,
                        timestamp = return_usr.Timestamp.ToFileTimeUtc().ToString(),
                        token = return_usr.Token,
                        deleted = return_usr.Deleted,
                        disabled = return_usr.Disabled,
                        account_type = return_usr.AccountType,
                        links = return_usr.Links,
                        files = return_usr.Files,
                    }));
                }
            }
            catch
            {
                Response.StatusCode = 500;

                return(Json(new
                {
                    success = false,
                    error = "500 Internal Server Error",
                    code = 500
                }));
            }
        }
示例#3
0
        public async Task <IActionResult> DeleteUser(string token)
        {
            try
            {
                AuthModel model = Authorize("su_full");
                if (!model.Authorized)
                {
                    Response.StatusCode = 401;

                    return(Json(new
                    {
                        success = false,
                        error = model.Reason,
                        code = 401
                    }));
                }
                using (var context = new BakaContext())
                {
                    BakaUser return_usr = await context.Users.FirstOrDefaultAsync(x => x.Token == token);

                    if (return_usr == null)
                    {
                        return(NotFound(new { success = false, error = "404 Not Found", code = 404 }));
                    }

                    if (!Globals.Config.PreserveDeletedFiles)
                    {
                        context.Users.Remove(return_usr);
                    }
                    else
                    {
                        return_usr.Deleted = true;
                    }

                    await context.SaveChangesAsync();

                    return(Json(new
                    {
                        success = true,
                        code = 200,
                        deleted = true
                    }));
                }
            }
            catch
            {
                Response.StatusCode = 500;

                return(Json(new
                {
                    success = false,
                    error = "500 Internal Server Error",
                    code = 500
                }));
            }
        }
示例#4
0
        public async Task <IActionResult> ResetUserToken(string token)
        {
            try
            {
                AuthModel model = Authorize("su_full");
                if (!model.Authorized)
                {
                    Response.StatusCode = 401;

                    return(Json(new
                    {
                        success = false,
                        error = model.Reason,
                        code = 401
                    }));
                }

                using (var context = new BakaContext())
                {
                    BakaUser return_usr = await context.Users.FirstOrDefaultAsync(x => x.Token == token);

                    if (return_usr == null)
                    {
                        return(NotFound(new
                        {
                            success = false,
                            error = "404 Not Found",
                            code = 404
                        }));
                    }

                    return_usr.Token = Globals.GenerateToken(return_usr);

                    await context.SaveChangesAsync();

                    return(Json(new
                    {
                        new_token = return_usr.Token
                    }));
                }
            }
            catch
            {
                Response.StatusCode = 500;

                return(Json(new
                {
                    success = false,
                    error = "500 Internal Server Error",
                    code = 500
                }));
            }
        }
示例#5
0
        private async Task <IActionResult> GetLink(string name, string ext, string url)
        {
            using (var context = new BakaContext())
            {
                var link = await context.Links.FirstOrDefaultAsync(u => u.ExternalId == name);

                if (link == null)
                {
                    return(null);
                }

                return(Redirect(link.Destination));
            }
        }
示例#6
0
        internal AuthModel Authorize(string type)
        {
            AuthModel model = new AuthModel();

            var token = Request.Headers["baka_token"].FirstOrDefault();

            if (string.IsNullOrWhiteSpace(token))
            {
                return(NullModel());
            }

            using (var context = new BakaContext())
            {
                var usr = context.Users.FirstOrDefault(u => u.Token == token);
                if (usr == null)
                {
                    return(NullModel());
                }

                if (usr.Disabled)
                {
                    model.Authorized = false;
                    model.Reason     = "Your account has been disabled";
                }
                else if (usr.Deleted)
                {
                    model.Reason = "Invalid token";
                }
                else if (usr.AccountType != type)
                {
                    model.Authorized = false;
                    model.Reason     = "Missing permissions";
                }
                else
                {
                    model.Authorized = true;
                }

                model.User = usr;

                return(model);
            }
        }
示例#7
0
        public async Task <IActionResult> GetFileOrLink(string name, string ext, string url)
        {
            using (var context = new BakaContext())
            {
                Console.WriteLine(name + " || " + ext);
                var file = await context.Files.FirstOrDefaultAsync(u => u.ExternalId == name);

                if (file == null || file.Deleted)
                {
                    IActionResult link = await GetLink(name, ext, url);

                    if (link != null)
                    {
                        return(link);
                    }

                    Response.StatusCode = 404;

                    return(Json(new
                    {
                        success = false,
                        error = "Object not found",
                        code = 404
                    }));
                }

                string file_ext          = Path.GetExtension(file.Filename);
                string use_url_extention = Request.Query["u"].FirstOrDefault() ?? "0";

                if (use_url_extention == "1" || use_url_extention == "true")
                {
                    file_ext = ext;
                }

                return(File(await Globals.GetFile(file.BackendFileId), BakaMime.GetMimeType(file_ext)));
            }
        }
示例#8
0
        public async Task <IActionResult> CreateUser([FromBody] NewUserModel details)
        {
            try
            {
                AuthModel model = Authorize("su_full");
                if (!model.Authorized)
                {
                    Response.StatusCode = 401;

                    return(Json(new
                    {
                        success = false,
                        error = model.Reason,
                        code = 401
                    }));
                }

                BakaUser return_usr;

                using (var context = new BakaContext())
                {
                    var usr = new BakaUser()
                    {
                        Name          = details.Name,
                        Username      = details.Username,
                        Email         = details.Email,
                        InitialIp     = null,
                        Timestamp     = DateTime.Now,
                        UploadLimitMB = details.UploadLimit,
                        Deleted       = false,
                        Disabled      = false,
                        AccountType   = "su_upload"
                    };

                    usr.Token = Globals.GenerateToken(usr);

                    await context.Users.AddAsync(usr);

                    await context.SaveChangesAsync();

                    return_usr = usr;
                }

                return(Json(new
                {
                    id = return_usr.Id,
                    username = return_usr.Username,
                    name = return_usr.Name,
                    initial_ip = return_usr.InitialIp,
                    timestamp = return_usr.Timestamp.ToFileTimeUtc().ToString(),
                    token = return_usr.Token,
                    deleted = return_usr.Deleted,
                    disabled = return_usr.Disabled,
                    email = return_usr.Email,
                    upload_limit = return_usr.UploadLimitMB,
                }));
            }
            catch (Exception e)
            {
                Response.StatusCode = 500;

                if (!Globals.Config.IsDebug)
                {
                    return(Json(new
                    {
                        success = false,
                        error = "500 Internal Server Error",
                        code = 500
                    }));
                }

                return(Json(new
                {
                    success = false,
                    error = "500 Internal Server Error",
                    code = 500,
                    exception = e.ToString(),
                }));
            }
        }
示例#9
0
        public async Task <IActionResult> UploadFile([FromForm(Name = "file")] List <IFormFile> files)
        {
            AuthModel model = Authorize("su_upload");

            if (!model.Authorized)
            {
                Response.StatusCode = 401;

                return(Json(new
                {
                    success = false,
                    error = model.Reason,
                    code = 401
                }));
            }

            IFormFile file;

            if (files == null || !files.Any() || files.FirstOrDefault() == null)
            {
                Response.StatusCode = 400;

                return(Json(new
                {
                    success = false,
                    code = 400,
                    error = "Uploads must be sent as 'file' and not be empty",
                    result_id = "e-400"
                }));
            }
            else
            {
                file = files.FirstOrDefault();
            }

            double FileSize = Globals.ConvertBytesToMegabytes(file.Length);

            if (FileSize > model.User.UploadLimitMB)
            {
                Response.StatusCode = 400;

                return(Json(new
                {
                    success = false,
                    code = 400,
                    error = "Exceeds max file size",
                    max_file_size = model.User.UploadLimitMB,
                    global_limit = false,
                    result_id = "e-400"
                }));
            }

            string extension = Path.GetExtension(file.FileName);

            if (!extension.StartsWith("."))
            {
                extension = "." + extension;
            }

            BakaFile db_file = new BakaFile()
            {
                FileSizeMB     = FileSize,
                Filename       = file.FileName,
                Deleted        = false,
                ExternalId     = Globals.GenerateFileId(),
                BackendFileId  = Globals.Config.S3KeyPrefix + Globals.GenerateBackendId() + extension,
                Timestamp      = DateTime.Now,
                Extension      = extension,
                IpUploadedFrom = GetIp()
            };

            await Globals.UploadFile(file.OpenReadStream(), db_file.BackendFileId, db_file.ContentType);

            using (var context = new BakaContext())
            {
                var user = await context.Users.FirstOrDefaultAsync(x => x.Id == model.User.Id);

                user.Files.Add(db_file);

                if (user.InitialIp == null)
                {
                    string ip = GetIp();
                    user.InitialIp = ip;
                }

                await context.SaveChangesAsync();
            }

            return(Json(new
            {
                id = db_file.Id,
                result_id = db_file.ExternalId,
                full_result_id = db_file.ExternalId + db_file.Extension,
                file_size = FileSize,
                timestamp = db_file.Timestamp.ToFileTimeUtc().ToString(),
                file_name = db_file.Filename,
                success = true,
                code = 200
            }));
        }
示例#10
0
        public async Task <IActionResult> GetUserFromId(int id)
        {
            AuthModel model = Authorize("su_full");

            if (!model.Authorized)
            {
                Response.StatusCode = 401;

                return(Json(new
                {
                    success = false,
                    error = model.Reason,
                    code = 401
                }));
            }

            try
            {
                using (var context = new BakaContext())
                {
                    BakaUser return_usr = await context.Users.Include(x => x.Links).Include(x => x.Files).FirstOrDefaultAsync(x => x.Id == id);

                    if (return_usr == null)
                    {
                        return(NotFound(new { success = false, error = "404 Not Found", code = 404 }));
                    }

                    return(Json(new
                    {
                        id = return_usr.Id,
                        username = return_usr.Username,
                        name = return_usr.Name,
                        email = return_usr.Email,
                        upload_limit = return_usr.UploadLimitMB,
                        initial_ip = return_usr.InitialIp,
                        timestamp = return_usr.Timestamp.ToFileTimeUtc().ToString(),
                        token = return_usr.Token,
                        deleted = return_usr.Deleted,
                        disabled = return_usr.Disabled,
                        account_type = return_usr.AccountType,
                        links = return_usr.Links.ToList(),
                        files = return_usr.Files.ToList(),
                    }));
                }
            }
            catch (Exception e)
            {
                Response.StatusCode = 500;

                if (!Globals.Config.IsDebug)
                {
                    return(Json(new
                    {
                        success = false,
                        error = "500 Internal Server Error",
                        code = 500
                    }));
                }

                return(Json(new
                {
                    success = false,
                    error = "500 Internal Server Error",
                    code = 500,
                    exception = e.ToString(),
                }));
            }
        }
示例#11
0
        public async Task <IActionResult> GetUsersList()
        {
            try
            {
                AuthModel model = Authorize("su_full");
                if (!model.Authorized)
                {
                    Response.StatusCode = 401;

                    return(Json(new
                    {
                        success = false,
                        error = model.Reason,
                        code = 401
                    }));
                }

                using (var context = new BakaContext())
                {
                    var users = await context.Users.Include(x => x.Files).Include(x => x.Links).ToListAsync();

                    var usr_list = new List <dynamic>();

                    foreach (var usr in users)
                    {
                        var temp_usr = new
                        {
                            id           = usr.Id,
                            username     = usr.Username,
                            name         = usr.Name,
                            email        = usr.Email,
                            upload_limit = usr.UploadLimitMB,
                            initial_ip   = usr.InitialIp,
                            timestamp    = usr.Timestamp.ToFileTimeUtc().ToString(),
                            token        = usr.Token,
                            deleted      = usr.Deleted,
                            disabled     = usr.Disabled,
                            account_type = usr.AccountType,
                            links        = usr.Links.ToList(),
                            files        = usr.Files.ToList(),
                        };

                        usr_list.Add(temp_usr);
                    }

                    return(Json(new
                    {
                        users = usr_list
                    }));
                }
            }
            catch (Exception e)
            {
                Response.StatusCode = 500;

                if (!Globals.Config.IsDebug)
                {
                    return(Json(new
                    {
                        success = false,
                        error = "500 Internal Server Error",
                        code = 500
                    }));
                }

                return(Json(new
                {
                    success = false,
                    error = "500 Internal Server Error",
                    code = 500,
                    exception = e.ToString(),
                }));
            }
        }