return Sign(data.data(), data.size(), proxy, identifier, entitlements, requirement, key, slots);
}
-Bundle Sign(const std::string &root, Folder &folder, const std::string &key, std::map<std::string, Hash> &remote, const std::string &entitlements, const std::string &requirement) {
+Bundle Sign(const std::string &root, Folder &folder, const std::string &key, std::map<std::string, Hash> &remote, const std::string &requirement, const Functor<std::string (const std::string &, const std::string &)> &alter) {
std::string executable;
std::string identifier;
mac = true;
}
+ std::string entitlements;
+ folder.Open(executable, fun([&](std::streambuf &buffer, const void *flag) {
+ // XXX: this is a miserable fail
+ std::stringbuf temp;
+ auto size(copy(buffer, temp));
+ // XXX: this is a stupid hack
+ pad(temp, 0x10 - (size & 0xf));
+ auto data(temp.str());
+ entitlements = alter(root, Analyze(data.data(), data.size()));
+ }));
+
static const std::string directory("_CodeSignature/");
static const std::string signature(directory + "CodeResources");
auto bundle(root + Split(name).dir);
bundle.resize(bundle.size() - resources.size());
SubFolder subfolder(folder, bundle);
- bundles[nested[1]] = Sign(bundle, subfolder, key, local, "", "");
+
+ bundles[nested[1]] = Sign(bundle, subfolder, key, local, "", Starts(name, "PlugIns/") ? alter :
+ static_cast<const Functor<std::string (const std::string &, const std::string &)> &>(fun([&](const std::string &, const std::string &entitlements) -> std::string { return entitlements; })));
}), fun([&](const std::string &name, const Functor<std::string ()> &read) {
}));
return bundle;
}
-Bundle Sign(const std::string &root, Folder &folder, const std::string &key, const std::string &entitlements, const std::string &requirement) {
+Bundle Sign(const std::string &root, Folder &folder, const std::string &key, const std::string &requirement, const Functor<std::string (const std::string &, const std::string &)> &alter) {
std::map<std::string, Hash> local;
- return Sign(root, folder, key, local, entitlements, requirement);
+ return Sign(root, folder, key, local, requirement, alter);
}
#endif
#ifndef LDID_NOPLIST
_assert(!flag_r);
ldid::DiskFolder folder(path);
- path += "/" + Sign("", folder, key, entitlements, requirement).path;
+ path += "/" + Sign("", folder, key, requirement, ldid::fun([&](const std::string &, const std::string &) -> std::string { return entitlements; })).path;
#else
_assert(false);
#endif
std::vector<char> hash;
};
-Bundle Sign(const std::string &root, Folder &folder, const std::string &key, const std::string &entitlements, const std::string &requirement);
+Bundle Sign(const std::string &root, Folder &folder, const std::string &key, const std::string &requirement, const Functor<std::string (const std::string &, const std::string &)> &alter);
typedef std::map<uint32_t, std::vector<char>> Slots;
-std::string Analyze(const void *data, size_t size);
std::vector<char> Sign(const void *idata, size_t isize, std::streambuf &output, const std::string &identifier, const std::string &entitlements, const std::string &requirement, const std::string &key, const Slots &slots);
}