]> git.stg.codes - stg.git/blobdiff - projects/rlm_stg/iface.cpp
Added no_match settings to the radius plugin.
[stg.git] / projects / rlm_stg / iface.cpp
index 9d6a78333c0ffcfee64ab8535e1b81d1ffc9aab1..2f8f3e3794072fc72ee523e2146247cab5debde1 100644 (file)
 #include "iface.h"
 
-#include "loki/Singleton.h"
+#include "stg_client.h"
+#include "types.h"
+#include "radlog.h"
 
-#include "thriftclient.h"
+#include <stdexcept>
+#include <cstring>
 
-int stgInstantiateImpl(const char * server, uint16_t port, const char * password)
+#include <strings.h>
+
+namespace RLM = STG::RLM;
+
+using RLM::Client;
+using RLM::PAIRS;
+using RLM::RESULT;
+using RLM::REQUEST_TYPE;
+
+namespace
 {
-    if (STG_CLIENT_ST::Get().Configure(server, port, password))
-        return 1;
 
-    return 0;
+STG_PAIR* toSTGPairs(const PAIRS& source)
+{
+    STG_PAIR * pairs = new STG_PAIR[source.size() + 1];
+    for (size_t pos = 0; pos < source.size(); ++pos) {
+        bzero(pairs[pos].key, sizeof(pairs[pos].key));
+        bzero(pairs[pos].value, sizeof(pairs[pos].value));
+        strncpy(pairs[pos].key, source[pos].first.c_str(), sizeof(pairs[pos].key));
+        strncpy(pairs[pos].value, source[pos].second.c_str(), sizeof(pairs[pos].value));
+    }
+    bzero(pairs[source.size()].key, sizeof(pairs[source.size()].key));
+    bzero(pairs[source.size()].value, sizeof(pairs[source.size()].value));
+
+    return pairs;
+}
+
+PAIRS fromSTGPairs(const STG_PAIR* pairs)
+{
+    const STG_PAIR* pair = pairs;
+    PAIRS res;
+
+    while (!emptyPair(pair)) {
+        res.push_back(std::pair<std::string, std::string>(pair->key, pair->value));
+        ++pair;
+    }
+
+    return res;
+}
+
+STG_RESULT toResult(const RESULT& source)
+{
+    STG_RESULT result;
+    result.modify = toSTGPairs(source.modify);
+    result.reply = toSTGPairs(source.reply);
+    return result;
 }
 
-const STG_PAIR * stgAuthorizeImpl(const char * userName, const char * serviceType)
+STG_RESULT emptyResult()
 {
-    return STG_CLIENT_ST::Get().Authorize(userName, serviceType);
+    STG_RESULT result = {NULL, NULL};
+    return result;
+}
+
+std::string toString(const char* value)
+{
+    if (value == NULL)
+        return "";
+    else
+        return value;
+}
+
+STG_RESULT stgRequest(REQUEST_TYPE type, const char* userName, const char* password, const STG_PAIR* pairs)
+{
+    Client* client = Client::get();
+    if (client == NULL) {
+        RadLog("Client is not configured.");
+        return emptyResult();
+    }
+    try {
+        return toResult(client->request(type, toString(userName), toString(password), fromSTGPairs(pairs)));
+    } catch (const std::runtime_error& ex) {
+        RadLog("Error: '%s'.", ex.what());
+        return emptyResult();
+    }
+}
+
+}
+
+int stgInstantiateImpl(const char* address)
+{
+    if (Client::configure(toString(address)))
+        return 1;
+
+    return 0;
 }
 
-const STG_PAIR * stgAuthenticateImpl(const char * userName, const char * serviceType)
+STG_RESULT stgAuthorizeImpl(const char* userName, const char* password, const STG_PAIR* pairs)
 {
-    return STG_CLIENT_ST::Get().Authenticate(userName, serviceType);
+    return stgRequest(RLM::AUTHORIZE, userName, password, pairs);
 }
 
-const STG_PAIR * stgPostAuthImpl(const char * userName, const char * serviceType)
+STG_RESULT stgAuthenticateImpl(const char* userName, const char* password, const STG_PAIR* pairs)
 {
-    return STG_CLIENT_ST::Get().PostAuth(userName, serviceType);
+    return stgRequest(RLM::AUTHENTICATE, userName, password, pairs);
 }
 
-const STG_PAIR * stgPreAcctImpl(const char * userName, const char * serviceType)
+STG_RESULT stgPostAuthImpl(const char* userName, const char* password, const STG_PAIR* pairs)
 {
-    return STG_CLIENT_ST::Get().PreAcct(userName, serviceType);
+    return stgRequest(RLM::POST_AUTH, userName, password, pairs);
 }
 
-const STG_PAIR * stgAccountingImpl(const char * userName, const char * serviceType, const char * statusType, const char * sessionId)
+STG_RESULT stgPreAcctImpl(const char* userName, const char* password, const STG_PAIR* pairs)
 {
-    return STG_CLIENT_ST::Get().Account(userName, serviceType, statusType, sessionId);
+    return stgRequest(RLM::PRE_ACCT, userName, password, pairs);
 }
 
-void deletePairs(const STG_PAIR * pairs)
+STG_RESULT stgAccountingImpl(const char* userName, const char* password, const STG_PAIR* pairs)
 {
-    delete[] pairs;
+    return stgRequest(RLM::ACCOUNT, userName, password, pairs);
 }