mirror of
https://onedev.site.tesses.net/crosslang/crosslangextras
synced 2026-02-08 17:15:45 +00:00
Added the ability to delete packages you own
This commit is contained in:
@@ -1,3 +1,160 @@
|
|||||||
|
func DB.DeletePackages(email,password, packageListString)
|
||||||
|
{
|
||||||
|
if(TypeOf(email) != "String" || TypeOf(password) != "String")
|
||||||
|
{
|
||||||
|
return "Email or password not set in form";
|
||||||
|
}
|
||||||
|
if(TypeOf(packageListString) != "String")
|
||||||
|
{
|
||||||
|
return "Package List not set in form";
|
||||||
|
}
|
||||||
|
|
||||||
|
var accountId = DB.GetAccountId(email, password);
|
||||||
|
|
||||||
|
var failed = "";
|
||||||
|
|
||||||
|
func removeVersion(name, version)
|
||||||
|
{
|
||||||
|
var v = Version.Parse(version);
|
||||||
|
if(name.Length == 0)
|
||||||
|
{
|
||||||
|
failed += "No package name\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(v == null)
|
||||||
|
{
|
||||||
|
failed += "No package version\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
DB.Lock();
|
||||||
|
var db = DB.Open();
|
||||||
|
var exec = Sqlite.Exec(db, $"SELECT * FROM packages WHERE packageName = {Sqlite.Escape(name)};");
|
||||||
|
Sqlite.Close(db);
|
||||||
|
DB.Unlock();
|
||||||
|
|
||||||
|
if(exec.Length == 1)
|
||||||
|
{
|
||||||
|
var id = ParseLong(exec[0].id);
|
||||||
|
if(ParseLong(exec[0].accountId) != accountId)
|
||||||
|
{
|
||||||
|
failed += $"User does not own package {name}\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DB.Lock();
|
||||||
|
db = DB.Open();
|
||||||
|
exec = Sqlite.Exec(db, $"SELECT * FROM versions WHERE packageId = {id};");
|
||||||
|
var versionId = -1;
|
||||||
|
var shallEraseEntirePackage = false;
|
||||||
|
if(TypeOf(exec) == "List")
|
||||||
|
{
|
||||||
|
if(exec.Length == 1 && ParseLong(exec[0].version) == v.VersionInt)
|
||||||
|
{
|
||||||
|
shallEraseEntirePackage=true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
each(var item : exec)
|
||||||
|
{
|
||||||
|
if(ParseLong(item.version) == v.VersionInt)
|
||||||
|
{
|
||||||
|
versionId = ParseLong(item.id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(versionId > -1)
|
||||||
|
{
|
||||||
|
Sqlite.Exec(db, $"DELETE FROM versions WHERE id = {versionId};");
|
||||||
|
FS.Local.DeleteFile(DB.working / "Packages" / name / $"{name}-{version}.crvm");
|
||||||
|
}
|
||||||
|
Sqlite.Close(db);
|
||||||
|
DB.Unlock();
|
||||||
|
if(shallEraseEntirePackage) {
|
||||||
|
removePackage(name);
|
||||||
|
}
|
||||||
|
if(!shallEraseEntirePackage && versionId == -1)
|
||||||
|
{
|
||||||
|
failed += $"Failed to remove package {name}-{version}.crvm\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
failed += $"Could not find package {name}-{version}.crvm\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func removePackage(name)
|
||||||
|
{
|
||||||
|
if(name.Length == 0)
|
||||||
|
{
|
||||||
|
failed += "No package name\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DB.Lock();
|
||||||
|
var db = DB.Open();
|
||||||
|
var exec = Sqlite.Exec(db, $"SELECT * FROM packages WHERE packageName = {Sqlite.Escape(name)};");
|
||||||
|
Sqlite.Close(db);
|
||||||
|
DB.Unlock();
|
||||||
|
|
||||||
|
if(exec.Length == 1)
|
||||||
|
{
|
||||||
|
var id = ParseLong(exec[0].id);
|
||||||
|
if(ParseLong(exec[0].accountId) != accountId)
|
||||||
|
{
|
||||||
|
failed += $"User does not own package {name}\n";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
DB.Lock();
|
||||||
|
db = DB.Open();
|
||||||
|
exec = Sqlite.Exec(db, $"DELETE FROM versions WHERE packageId = {id};");
|
||||||
|
exec = Sqlite.Exec(db, $"DELETE FROM packages WHERE id = {id};");
|
||||||
|
Sqlite.Close(db);
|
||||||
|
DB.Unlock();
|
||||||
|
if(FS.Local.DirectoryExists(DB.working / "Packages" / name))
|
||||||
|
FS.Local.DeleteDirectoryRecurse(DB.working / "Packages" / name);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
failed += $"Could not find package {name}";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
each(var item : packageListString.Replace("\r","").Split("\n"))
|
||||||
|
{
|
||||||
|
var stageOrAstrisk = item.LastIndexOf('-');
|
||||||
|
if(stageOrAstrisk > -1)
|
||||||
|
{
|
||||||
|
if(item[stageOrAstrisk+1] == '*')
|
||||||
|
{
|
||||||
|
removePackage(item.Substring(0, stageOrAstrisk));
|
||||||
|
}
|
||||||
|
else if(item[stageOrAstrisk+1] == 'd' || item[stageOrAstrisk+1] == 'a' || item[stageOrAstrisk+1] == 'b' || item[stageOrAstrisk+1] == 'p') {
|
||||||
|
var versionIdx = item.LastIndexOf('-',stageOrAstrisk-1);
|
||||||
|
if(versionIdx > -1)
|
||||||
|
{
|
||||||
|
removeVersion(item.Substring(0,versionIdx),item.Substring(versionIdx+1));
|
||||||
|
|
||||||
|
|
||||||
|
} else {
|
||||||
|
failed += $"{item}, Failed to find version part\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
failed += $"{item}, Invalid version\n";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
failed += $"{item}, No version at all\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(failed.Length > 0) return failed;
|
||||||
|
|
||||||
|
return "Success";
|
||||||
|
}
|
||||||
func DB.CanUploadPackagePrefix(userId, packageName)
|
func DB.CanUploadPackagePrefix(userId, packageName)
|
||||||
{
|
{
|
||||||
var prefix = packageName.Split(".",true,2);
|
var prefix = packageName.Split(".",true,2);
|
||||||
|
|||||||
@@ -85,6 +85,7 @@ func Pages.Account(ctx)
|
|||||||
|
|
||||||
<if(active.active)>
|
<if(active.active)>
|
||||||
<true>
|
<true>
|
||||||
|
|
||||||
<form action="./change_motto" method="POST">
|
<form action="./change_motto" method="POST">
|
||||||
|
|
||||||
<if(motto_ta.Length == 0)>
|
<if(motto_ta.Length == 0)>
|
||||||
@@ -99,9 +100,12 @@ func Pages.Account(ctx)
|
|||||||
<a class="btn btn-secondary" href="./admin">Admin</a>
|
<a class="btn btn-secondary" href="./admin">Admin</a>
|
||||||
</true>
|
</true>
|
||||||
</if>
|
</if>
|
||||||
|
<a class="btn btn-danger" href="./delete_packages">Delete Packages</a>
|
||||||
<a class="btn btn-danger" href="./logout">Logout</a>
|
<a class="btn btn-danger" href="./logout">Logout</a>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</true>
|
</true>
|
||||||
<false>
|
<false>
|
||||||
<hr>
|
<hr>
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
func Pages.DeletePackages(ctx)
|
||||||
|
{
|
||||||
|
var pages = [
|
||||||
|
{
|
||||||
|
active = false,
|
||||||
|
route = "/packages",
|
||||||
|
text = "Packages"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
active = false,
|
||||||
|
route = "/upload",
|
||||||
|
text = "Upload"
|
||||||
|
},
|
||||||
|
DB.LoginButton(ctx,false)
|
||||||
|
];
|
||||||
|
var form = <div class="container"><form action="./delete_packages" method="POST">
|
||||||
|
<b>Please don{"'"}t do this unless you absolutely need to as it may break other software</b>
|
||||||
|
<label for="packages">One package per line with packagename-packageversion-stage or packagename-* for deleting entire package at once</label>
|
||||||
|
<textarea class="form-control" name="packages" placeholder="Packages" id="packages" style="height: 100px"></textarea>
|
||||||
|
<h4>Your credentials are needed due to this being a dangerous action</h4>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="email" class="form-label">Email address</label>
|
||||||
|
<input type="email" class="form-control" id="email" name="email">
|
||||||
|
</div>
|
||||||
|
<div class="mb-3">
|
||||||
|
<label for="pass" class="form-label">Password</label>
|
||||||
|
<input type="password" class="form-control" id="pass" name="password">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<input class="btn btn-danger" type="submit" value="Delete Packages">
|
||||||
|
</form></div>;
|
||||||
|
return Shell("Delete packages", pages, form);
|
||||||
|
}
|
||||||
@@ -243,6 +243,23 @@ func main(args)
|
|||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if(ctx.Path == "/delete_packages")
|
||||||
|
{
|
||||||
|
if(ctx.Method == "GET")
|
||||||
|
{
|
||||||
|
ctx.WithMimeType("text/html").SendText(Pages.DeletePackages(ctx));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if(ctx.Method == "POST")
|
||||||
|
{
|
||||||
|
var packages = ctx.QueryParams.TryGetFirst("packages");
|
||||||
|
var email = ctx.QueryParams.TryGetFirst("email");
|
||||||
|
var password = ctx.QueryParams.TryGetFirst("password");
|
||||||
|
var msg = DB.DeletePackages(email,password, packages);
|
||||||
|
var html = <div class="container"><h1>{msg}</h1></div>;
|
||||||
|
ctx.WithMimeType("text/html").SendText(Shell(msg,[], html));
|
||||||
|
}
|
||||||
|
}
|
||||||
if(ctx.Path == "/api/v1/upload")
|
if(ctx.Path == "/api/v1/upload")
|
||||||
{
|
{
|
||||||
if(ctx.Method == "PUT")
|
if(ctx.Method == "PUT")
|
||||||
|
|||||||
Reference in New Issue
Block a user