cgi-io: support SHA256 checksums for file uploads
Report SHA256 checksums in addition to the MD5 ones to make cgi-io suitable for sysupgrade image verification. Also allow stat(), md5sum and/or sha256sum to fail and respond with a JSON null value instead, leaving it to the frontend to handle errors as needed. Fixes #4790. Signed-off-by: Jo-Philipp Wich <jo@mein.io>
This commit is contained in:
parent
68ae65f3bc
commit
46d0799c43
|
@ -8,7 +8,7 @@
|
||||||
include $(TOPDIR)/rules.mk
|
include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=cgi-io
|
PKG_NAME:=cgi-io
|
||||||
PKG_RELEASE:=4
|
PKG_RELEASE:=5
|
||||||
|
|
||||||
PKG_LICENSE:=GPL-2.0+
|
PKG_LICENSE:=GPL-2.0+
|
||||||
|
|
||||||
|
|
|
@ -117,11 +117,11 @@ out:
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
md5sum(const char *file)
|
checksum(const char *applet, size_t sumlen, const char *file)
|
||||||
{
|
{
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
int fds[2];
|
int fds[2];
|
||||||
static char md5[33];
|
static char chksum[65];
|
||||||
|
|
||||||
if (pipe(fds))
|
if (pipe(fds))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -141,20 +141,20 @@ md5sum(const char *file)
|
||||||
close(fds[0]);
|
close(fds[0]);
|
||||||
close(fds[1]);
|
close(fds[1]);
|
||||||
|
|
||||||
if (execl("/bin/busybox", "/bin/busybox", "md5sum", file, NULL))
|
if (execl("/bin/busybox", "/bin/busybox", applet, file, NULL))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
memset(md5, 0, sizeof(md5));
|
memset(chksum, 0, sizeof(chksum));
|
||||||
read(fds[0], md5, 32);
|
read(fds[0], chksum, sumlen);
|
||||||
waitpid(pid, NULL, 0);
|
waitpid(pid, NULL, 0);
|
||||||
close(fds[0]);
|
close(fds[0]);
|
||||||
close(fds[1]);
|
close(fds[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return md5;
|
return chksum;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
|
@ -266,7 +266,7 @@ postdecode(char **fields, int n_fields)
|
||||||
static int
|
static int
|
||||||
response(bool success, const char *message)
|
response(bool success, const char *message)
|
||||||
{
|
{
|
||||||
char *md5;
|
char *chksum;
|
||||||
struct stat s;
|
struct stat s;
|
||||||
|
|
||||||
printf("Status: 200 OK\r\n");
|
printf("Status: 200 OK\r\n");
|
||||||
|
@ -274,9 +274,22 @@ response(bool success, const char *message)
|
||||||
|
|
||||||
if (success)
|
if (success)
|
||||||
{
|
{
|
||||||
if (!stat(st.filename, &s) && (md5 = md5sum(st.filename)) != NULL)
|
if (!stat(st.filename, &s))
|
||||||
printf("\t\"size\": %u,\n\t\"checksum\": \"%s\"\n",
|
printf("\t\"size\": %u,\n", (unsigned int)s.st_size);
|
||||||
(unsigned int)s.st_size, md5);
|
else
|
||||||
|
printf("\t\"size\": null,\n");
|
||||||
|
|
||||||
|
chksum = checksum("md5sum", 32, st.filename);
|
||||||
|
printf("\t\"checksum\": %s%s%s,\n",
|
||||||
|
chksum ? "\"" : "",
|
||||||
|
chksum ? chksum : "null",
|
||||||
|
chksum ? "\"" : "");
|
||||||
|
|
||||||
|
chksum = checksum("sha256sum", 64, st.filename);
|
||||||
|
printf("\t\"sha256sum\": %s%s%s\n",
|
||||||
|
chksum ? "\"" : "",
|
||||||
|
chksum ? chksum : "null",
|
||||||
|
chksum ? "\"" : "");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue