summaryrefslogtreecommitdiffhomepage
path: root/plugin/ipc.c
diff options
context:
space:
mode:
authorSamuel Lidén Borell <samuel@slbdata.se>2011-04-22 18:03:10 +0200
committerSamuel Lidén Borell <samuel@slbdata.se>2011-04-22 18:03:10 +0200
commita6b0b406279723177bd7d4e6e35e60b62c219f1a (patch)
tree68837f3e126518e5619e2c3e23dade5fc5b13531 /plugin/ipc.c
parentd852ae1be2359f3335ed57f21ee5f9b17d952c78 (diff)
downloadfribid-a6b0b406279723177bd7d4e6e35e60b62c219f1a.tar.gz
fribid-a6b0b406279723177bd7d4e6e35e60b62c219f1a.tar.bz2
fribid-a6b0b406279723177bd7d4e6e35e60b62c219f1a.zip
Simplify the IPC code
This patch simplifies the IPC code and makes the site information (URL, hostname, ip) available to all commands.
Diffstat (limited to 'plugin/ipc.c')
-rw-r--r--plugin/ipc.c71
1 files changed, 33 insertions, 38 deletions
diff --git a/plugin/ipc.c b/plugin/ipc.c
index 04b06eb..07ee51c 100644
--- a/plugin/ipc.c
+++ b/plugin/ipc.c
@@ -37,7 +37,6 @@
#include "plugin.h"
static const char mainBinary[] = SIGNING_EXECUTABLE;
-static const char versionOption[] = "--internal--bankid-version-string";
static const char ipcOption[] = "--internal--ipc=" IPCVERSION;
static const char windowIdOption[] = "--internal--window-id";
@@ -51,7 +50,7 @@ typedef struct {
pid_t child;
} PipeInfo;
-static void openPipes(PipeInfo *pipeinfo, const char *argv[]) {
+static void openPipesWithArgs(PipeInfo *pipeinfo, const char *argv[]) {
int pipeIn[2];
int pipeOut[2];
@@ -87,21 +86,22 @@ static void openPipes(PipeInfo *pipeinfo, const char *argv[]) {
}
}
-static void openVersionPipes(PipeInfo *pipeinfo) {
- const char *argv[] = {
- mainBinary, versionOption, (char *)NULL,
- };
- openPipes(pipeinfo, argv);
-}
-
-static void openInteractivePipes(PipeInfo *pipeinfo, Plugin *plugin) {
+static void openPipes(PipeInfo *pipeinfo, const Plugin *plugin) {
char windowId[21]; // This holds a native window id (such as an XID)
const char *argv[] = {
mainBinary, ipcOption, windowIdOption, windowId, (char *)NULL,
};
snprintf(windowId, 21, "%ld", plugin->windowId);
- openPipes(pipeinfo, argv);
+ openPipesWithArgs(pipeinfo, argv);
+}
+
+static void sendHeader(PipeInfo *pipeinfo, const Plugin *plugin,
+ PipeCommand command) {
+ pipe_sendCommand(pipeinfo->out, command);
+ pipe_sendString(pipeinfo->out, plugin->url);
+ pipe_sendString(pipeinfo->out, plugin->hostname);
+ pipe_sendString(pipeinfo->out, plugin->ip);
}
static BankIDError waitReply(PipeInfo *pipeinfo) {
@@ -121,36 +121,31 @@ static void closePipes(PipeInfo *pipeinfo) {
char *version_getVersion(Plugin *plugin) {
- char buff[1000];
PipeInfo pipeinfo;
- openVersionPipes(&pipeinfo);
- if (fgets(buff, sizeof(buff), pipeinfo.in) == NULL) {
- buff[0] = '\0';
- }
- closePipes(&pipeinfo);
+ openPipes(&pipeinfo, plugin);
+ sendHeader(&pipeinfo, plugin, PC_GetVersion);
+ pipe_finishCommand(pipeinfo.out);
- return strdup(buff);
+ char *version = pipe_readString(pipeinfo.in);
+ closePipes(&pipeinfo);
+ return version;
}
-static void sendSignCommon(PipeInfo pipeinfo, Plugin *plugin) {
- pipe_sendString(pipeinfo.out, plugin->info.auth.challenge);
- pipe_sendInt(pipeinfo.out, plugin->info.auth.serverTime);
- pipe_sendOptionalString(pipeinfo.out, plugin->info.auth.policys);
- pipe_sendOptionalString(pipeinfo.out, plugin->info.auth.subjectFilter);
- pipe_sendString(pipeinfo.out, plugin->url);
- pipe_sendString(pipeinfo.out, plugin->hostname);
- pipe_sendString(pipeinfo.out, plugin->ip);
+static void sendSignCommon(PipeInfo *pipeinfo, const Plugin *plugin) {
+ pipe_sendString(pipeinfo->out, plugin->info.auth.challenge);
+ pipe_sendInt(pipeinfo->out, plugin->info.auth.serverTime);
+ pipe_sendOptionalString(pipeinfo->out, plugin->info.auth.policys);
+ pipe_sendOptionalString(pipeinfo->out, plugin->info.auth.subjectFilter);
}
int sign_performAction_Authenticate(Plugin *plugin) {
PipeInfo pipeinfo;
- openInteractivePipes(&pipeinfo, plugin);
- pipe_sendCommand(pipeinfo.out, PC_Authenticate);
-
- sendSignCommon(pipeinfo, plugin);
+ openPipes(&pipeinfo, plugin);
+ sendHeader(&pipeinfo, plugin, PC_Authenticate);
+ sendSignCommon(&pipeinfo, plugin);
plugin->lastError = waitReply(&pipeinfo);
plugin->info.auth.signature = pipe_readString(pipeinfo.in);
@@ -161,10 +156,10 @@ int sign_performAction_Authenticate(Plugin *plugin) {
int sign_performAction_Sign(Plugin *plugin) {
PipeInfo pipeinfo;
- openInteractivePipes(&pipeinfo, plugin);
- pipe_sendCommand(pipeinfo.out, PC_Sign);
+ openPipes(&pipeinfo, plugin);
+ sendHeader(&pipeinfo, plugin, PC_Sign);
+ sendSignCommon(&pipeinfo, plugin);
- sendSignCommon(pipeinfo, plugin);
pipe_sendString(pipeinfo.out, plugin->info.sign.message);
pipe_sendOptionalString(pipeinfo.out, plugin->info.sign.invisibleMessage);
@@ -177,10 +172,10 @@ int sign_performAction_Sign(Plugin *plugin) {
char *regutil_createRequest(Plugin *plugin) {
PipeInfo pipeinfo;
- openInteractivePipes(&pipeinfo, plugin);
- pipe_sendCommand(pipeinfo.out, PC_CreateRequest);
- // TODO should send URL here, maybe it should be a common parameter?
+ openPipes(&pipeinfo, plugin);
+ sendHeader(&pipeinfo, plugin, PC_CreateRequest);
+ // Send password policy
pipe_sendInt(pipeinfo.out, plugin->info.regutil.input.minPasswordLength);
pipe_sendInt(pipeinfo.out, plugin->info.regutil.input.minPasswordNonDigits);
pipe_sendInt(pipeinfo.out, plugin->info.regutil.input.minPasswordDigits);
@@ -218,8 +213,8 @@ char *regutil_createRequest(Plugin *plugin) {
void regutil_storeCertificates(Plugin *plugin, const char *certs) {
PipeInfo pipeinfo;
- openInteractivePipes(&pipeinfo, plugin);
- pipe_sendCommand(pipeinfo.out, PC_StoreCertificates);
+ openPipes(&pipeinfo, plugin);
+ sendHeader(&pipeinfo, plugin, PC_StoreCertificates);
pipe_sendOptionalString(pipeinfo.out, certs);