Remove old source which we don't need anymore
This commit is contained in:
parent
48839a9ea3
commit
917baf45af
4 changed files with 0 additions and 455 deletions
|
|
@ -1,282 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 Simon Fels <morphis@gravedo.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 3, as published
|
||||
* by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranties of
|
||||
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "anbox/id_map_writer.h"
|
||||
#include "anbox/not_reachable.h"
|
||||
#include "anbox/utils.h"
|
||||
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <boost/format.hpp>
|
||||
|
||||
#include <pwd.h>
|
||||
|
||||
namespace fs = boost::filesystem;
|
||||
|
||||
#define getid(type) ((unsigned) ((type) == GID ? getgid() : getuid()))
|
||||
#define idfile(type) ((type) == GID ? "gid_map" : "uid_map")
|
||||
#define idname(type) ((type) == GID ? "GID" : "UID")
|
||||
#define subpath(type) ((type) == GID ? "/etc/subgid" : "/etc/subuid")
|
||||
|
||||
namespace {
|
||||
char *append(char **destination, const char *format, ...) {
|
||||
char *extra, *result;
|
||||
va_list args;
|
||||
|
||||
va_start(args, format);
|
||||
if (vasprintf(&extra, format, args) < 0)
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error(""));
|
||||
va_end(args);
|
||||
|
||||
if (*destination == NULL) {
|
||||
*destination = extra;
|
||||
return extra;
|
||||
}
|
||||
|
||||
if (asprintf(&result, "%s%s", *destination, extra) < 0)
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error(""));
|
||||
free(*destination);
|
||||
free(extra);
|
||||
*destination = result;
|
||||
return result;
|
||||
}
|
||||
|
||||
char *string(const char *format, ...) {
|
||||
char *result;
|
||||
va_list args;
|
||||
|
||||
va_start(args, format);
|
||||
if (vasprintf(&result, format, args) < 0)
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error(""));
|
||||
va_end(args);
|
||||
return result;
|
||||
}
|
||||
|
||||
static char *getmap(pid_t pid, int type) {
|
||||
char *line = NULL, *result = NULL, *path;
|
||||
size_t size;
|
||||
unsigned count, first, lower;
|
||||
FILE *file;
|
||||
|
||||
if (pid == -1)
|
||||
path = string("/proc/self/%s", idfile(type));
|
||||
else
|
||||
path = string("/proc/%d/%s", pid, idfile(type));
|
||||
if (!(file = fopen(path, "r")))
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error(""));
|
||||
|
||||
while (getline(&line, &size, file) >= 0) {
|
||||
if (sscanf(line, " %u %u %u", &first, &lower, &count) != 3)
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error(""));
|
||||
append(&result, "%s%u:%u:%u", result ? "," : "", first, lower, count);
|
||||
}
|
||||
|
||||
if (!result)
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error(""));
|
||||
|
||||
fclose(file);
|
||||
free(line);
|
||||
free(path);
|
||||
return result;
|
||||
}
|
||||
|
||||
static char *mapitem(char *map, unsigned *first, unsigned *lower,
|
||||
unsigned *count) {
|
||||
ssize_t skip;
|
||||
|
||||
while (map && *map && strchr(",;", *map))
|
||||
map++;
|
||||
if (map == NULL || *map == '\0')
|
||||
return NULL;
|
||||
if (sscanf(map, "%u:%u:%u%zn", first, lower, count, &skip) < 3)
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error(""));
|
||||
return map + skip;
|
||||
}
|
||||
|
||||
static char *rangeitem(char *range, unsigned *start, unsigned *length) {
|
||||
ssize_t skip;
|
||||
|
||||
while (range && *range && strchr(",;", *range))
|
||||
range++;
|
||||
if (range == NULL || *range == '\0')
|
||||
return NULL;
|
||||
if (sscanf(range, "%u:%u%zn", start, length, &skip) < 2)
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error(""));
|
||||
return range + skip;
|
||||
}
|
||||
|
||||
static char *readranges(int type) {
|
||||
char *line = NULL, *range, *user;
|
||||
size_t end, size;
|
||||
struct passwd *passwd;
|
||||
unsigned length, start;
|
||||
FILE *file;
|
||||
|
||||
range = string("%u:1", getid(type));
|
||||
if (!(file = fopen(subpath(type), "r")))
|
||||
return range;
|
||||
|
||||
user = getenv("USER");
|
||||
user = user ? user : getenv("LOGNAME");
|
||||
user = user ? user : getlogin();
|
||||
if (!user || !(passwd = getpwnam(user)) || passwd->pw_uid != getuid()) {
|
||||
if (!(passwd = getpwuid(getuid())))
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error(""));
|
||||
user = passwd->pw_name;
|
||||
}
|
||||
endpwent();
|
||||
|
||||
while (getline(&line, &size, file) >= 0) {
|
||||
if (strncmp(line, user, strlen(user)))
|
||||
continue;
|
||||
if (sscanf(line + strlen(user), ":%u:%u%zn", &start, &length, &end) < 2)
|
||||
continue;
|
||||
if (strchr(":\n", line[end + strlen(user) + 1]))
|
||||
append(&range, ",%u:%u", start, length);
|
||||
}
|
||||
|
||||
free(line);
|
||||
fclose(file);
|
||||
return range;
|
||||
}
|
||||
|
||||
static char *rootdefault(int type) {
|
||||
char *cursor, *map, *result;
|
||||
unsigned count, first, last = INVALID, lower;
|
||||
|
||||
cursor = map = getmap(-1, type);
|
||||
while ((cursor = mapitem(cursor, &first, &lower, &count)))
|
||||
if (last == INVALID || last < first + count - 1)
|
||||
last = first + count - 1;
|
||||
result = string("0:%u:1", last);
|
||||
|
||||
cursor = map;
|
||||
while ((cursor = mapitem(cursor, &first, &lower, &count))) {
|
||||
if (first == 0) {
|
||||
if (count == 1 && first >= last)
|
||||
error(1, 0, "No unprivileged %s available\n", idname(type));
|
||||
first++, lower++, count--;
|
||||
}
|
||||
|
||||
if (last <= first + count - 1 && count > 0)
|
||||
count--;
|
||||
|
||||
if (count > 0)
|
||||
append(&result, "%s%u:%u:%u", result ? "," : "", first, first, count);
|
||||
}
|
||||
|
||||
free(map);
|
||||
return result;
|
||||
}
|
||||
|
||||
static char *userdefault(int type) {
|
||||
char *cursor, *map, *range, *result = NULL;
|
||||
unsigned count, first, index = 0, length, lower, start;
|
||||
|
||||
if (geteuid() != 0)
|
||||
return string("0:%u:1", getid(type));
|
||||
|
||||
map = getmap(-1, type);
|
||||
range = readranges(type);
|
||||
|
||||
while ((range = rangeitem(range, &start, &length))) {
|
||||
cursor = map;
|
||||
while ((cursor = mapitem(cursor, &first, &lower, &count))) {
|
||||
if (start + length <= first || first + count <= start)
|
||||
continue;
|
||||
if (first + count < start + length)
|
||||
length = start - first + count;
|
||||
if (start < first) {
|
||||
index += first - start;
|
||||
length -= first - start;
|
||||
start = first;
|
||||
}
|
||||
append(&result, "%s%u:%u:%u", result ? "," : "", index, start, length);
|
||||
index += length;
|
||||
}
|
||||
}
|
||||
|
||||
free(map);
|
||||
free(range);
|
||||
return result;
|
||||
}
|
||||
|
||||
static void validate(char *range, unsigned first, unsigned count) {
|
||||
unsigned length, start;
|
||||
|
||||
while ((range = rangeitem(range, &start, &length)))
|
||||
if (first < start + length && start < first + count) {
|
||||
if (first < start)
|
||||
validate(range, first, start - first);
|
||||
if (first + count > start + length)
|
||||
validate(range, start + length, first + count - start - length);
|
||||
return;
|
||||
}
|
||||
error(1, 0, "Cannot map onto IDs that are not delegated to you");
|
||||
}
|
||||
|
||||
static void verifymap(char *map, char *range) {
|
||||
unsigned count, first, lower;
|
||||
|
||||
while ((map = mapitem(map, &first, &lower, &count)))
|
||||
validate(range, lower, count);
|
||||
}
|
||||
|
||||
static void writemap(pid_t pid, int type, char *map) {
|
||||
char *path, *range, *text = NULL;
|
||||
int fd;
|
||||
unsigned count, first, lower;
|
||||
|
||||
if (!map) {
|
||||
map = (getuid() == 0 ? rootdefault : userdefault)(type);
|
||||
} else if (getuid() != 0) {
|
||||
range = readranges(type);
|
||||
verifymap(map, range);
|
||||
free(range);
|
||||
}
|
||||
|
||||
while ((map = mapitem(map, &first, &lower, &count)))
|
||||
append(&text, "%u %u %u\n", first, lower, count);
|
||||
|
||||
path = string("/proc/%d/%s", pid, idfile(type));
|
||||
if ((fd = open(path, O_WRONLY)) < 0)
|
||||
error(1, 0, "Failed to set container %s map", idname(type));
|
||||
else if (write(fd, text, strlen(text)) != (ssize_t) strlen(text))
|
||||
error(1, 0, "Failed to set container %s map", idname(type));
|
||||
|
||||
close(fd);
|
||||
free(path);
|
||||
free(text);
|
||||
}
|
||||
}
|
||||
|
||||
namespace anbox {
|
||||
IdMapWriter::IdMapWriter(const Type &type, const pid_t &pid) :
|
||||
type_(type),
|
||||
pid_(pid) {
|
||||
}
|
||||
|
||||
IdMapWriter::~IdMapWriter() {
|
||||
}
|
||||
|
||||
void IdMapWriter::apply() {
|
||||
const auto map = retrieve_mappings();
|
||||
}
|
||||
|
||||
} // namespace anbox
|
||||
|
|
@ -1,43 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 Simon Fels <morphis@gravedo.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 3, as published
|
||||
* by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranties of
|
||||
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef ANBOX_ID_MAP_WRITER_H_
|
||||
#define ANBOX_ID_MAP_WRITER_H_
|
||||
|
||||
#include <vector>
|
||||
#include <boost/filesystem.hpp>
|
||||
|
||||
namespace anbox {
|
||||
class IdMapWriter {
|
||||
public:
|
||||
enum class Type {
|
||||
UID,
|
||||
GID
|
||||
};
|
||||
|
||||
IdMapWriter(const Type &type, const pid_t &pid = -1);
|
||||
~IdMapWriter();
|
||||
|
||||
void apply();
|
||||
|
||||
private:
|
||||
Type type_;
|
||||
pid_t pid_;
|
||||
};
|
||||
} // namespace anbox
|
||||
|
||||
#endif
|
||||
|
|
@ -1,81 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 Simon Fels <morphis@gravedo.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 3, as published
|
||||
* by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranties of
|
||||
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "anbox/namespace_attacher.h"
|
||||
#include "anbox/utils.h"
|
||||
|
||||
#include <boost/throw_exception.hpp>
|
||||
#include <boost/filesystem.hpp>
|
||||
|
||||
#include <unistd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
namespace fs = boost::filesystem;
|
||||
|
||||
namespace anbox {
|
||||
std::string NamespaceAttacher::ns_type_to_string(NamespaceType type) {
|
||||
switch (type) {
|
||||
case NamespaceType::user:
|
||||
return "user";
|
||||
case NamespaceType::pid:
|
||||
return "pid";
|
||||
case NamespaceType::uts:
|
||||
return "uts";
|
||||
case NamespaceType::mount:
|
||||
return "mnt";
|
||||
case NamespaceType::ipc:
|
||||
return "ipc";
|
||||
case NamespaceType::net:
|
||||
return "net";
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error("Unknown namespace type"));
|
||||
}
|
||||
|
||||
NamespaceAttacher::NamespaceAttacher(const std::vector<NamespaceType> &types, pid_t pid) :
|
||||
pid_(pid) {
|
||||
|
||||
attach(types);
|
||||
}
|
||||
|
||||
NamespaceAttacher::~NamespaceAttacher() {
|
||||
}
|
||||
|
||||
void NamespaceAttacher::attach(const std::vector<NamespaceType> &types) {
|
||||
std::vector<int> fds;
|
||||
for (const auto &type : types) {
|
||||
const auto path = anbox::utils::string_format("/proc/%lu/ns/%s", pid_, ns_type_to_string(type));
|
||||
if (!fs::exists(fs::path(path)))
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error("Failed to open namespace file"));
|
||||
|
||||
const auto fd = ::open(path.c_str(), O_RDONLY);
|
||||
if (fd < 0)
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error("Failed to open namespace file"));
|
||||
|
||||
fds.push_back(fd);
|
||||
}
|
||||
|
||||
for (const auto &fd : fds) {
|
||||
if (::setns(fd, 0) == -1)
|
||||
BOOST_THROW_EXCEPTION(std::runtime_error("Could not attach to namespace"));
|
||||
|
||||
::close(fd);
|
||||
}
|
||||
}
|
||||
} // namespace anbox
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 Simon Fels <morphis@gravedo.de>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 3, as published
|
||||
* by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranties of
|
||||
* MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
|
||||
* PURPOSE. See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along
|
||||
* with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef ANBOX_NAMESPACE_ATTACHER_H_
|
||||
#define ANBOX_NAMESPACE_ATTACHER_H_
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
||||
namespace anbox {
|
||||
enum class NamespaceType {
|
||||
user,
|
||||
pid,
|
||||
uts,
|
||||
mount,
|
||||
ipc,
|
||||
net,
|
||||
};
|
||||
|
||||
class NamespaceAttacher {
|
||||
public:
|
||||
static std::string ns_type_to_string(NamespaceType type);
|
||||
|
||||
NamespaceAttacher(const std::vector<NamespaceType> &types, pid_t pid);
|
||||
~NamespaceAttacher();
|
||||
|
||||
private:
|
||||
void attach(const std::vector<NamespaceType> &types);
|
||||
|
||||
pid_t pid_;
|
||||
};
|
||||
} // namespace
|
||||
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue