197 lines
4.6 KiB
C++
197 lines
4.6 KiB
C++
/**
|
|
* accfile.cpp
|
|
* This file is part of the YATE Project http://YATE.null.ro
|
|
*
|
|
* Account provider for client registrations and settings.
|
|
*
|
|
* Yet Another Telephony Engine - a fully featured software PBX and IVR
|
|
* Copyright (C) 2004, 2005 Null Team
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY 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, write to the Free Software
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
*/
|
|
|
|
#include <yatengine.h>
|
|
|
|
using namespace TelEngine;
|
|
|
|
static Mutex s_mutex;
|
|
static Configuration s_cfg(Engine::configFile("accfile"));
|
|
|
|
class AccHandler : public MessageHandler
|
|
{
|
|
public:
|
|
AccHandler()
|
|
: MessageHandler("user.account")
|
|
{ }
|
|
virtual bool received(Message &msg);
|
|
};
|
|
|
|
class CmdHandler : public MessageHandler
|
|
{
|
|
public:
|
|
CmdHandler()
|
|
: MessageHandler("engine.command")
|
|
{ }
|
|
virtual bool received(Message &msg);
|
|
};
|
|
|
|
class StatusHandler : public MessageHandler
|
|
{
|
|
public:
|
|
StatusHandler()
|
|
: MessageHandler("engine.status")
|
|
{ }
|
|
virtual bool received(Message &msg);
|
|
};
|
|
|
|
class StartHandler : public MessageHandler
|
|
{
|
|
public:
|
|
StartHandler()
|
|
: MessageHandler("engine.start",150)
|
|
{ }
|
|
virtual bool received(Message &msg);
|
|
};
|
|
|
|
class AccFilePlugin : public Plugin
|
|
{
|
|
public:
|
|
AccFilePlugin();
|
|
~AccFilePlugin(){}
|
|
virtual void initialize();
|
|
private:
|
|
bool m_first;
|
|
};
|
|
|
|
static void copyParams(NamedList& dest, const NamedList& src)
|
|
{
|
|
for (unsigned int i=0;i<src.length();i++) {
|
|
const NamedString* par = src.getParam(i);
|
|
if (par && par->name() && (par->name() != "operation"))
|
|
dest.addParam(par->name(),*par);
|
|
}
|
|
}
|
|
|
|
static void emitAccounts(const char* operation = 0)
|
|
{
|
|
Lock lock(s_mutex);
|
|
for (unsigned int i=0;i<s_cfg.sections();i++) {
|
|
NamedList* acc = s_cfg.getSection(i);
|
|
if (!(acc && acc->getValue("username") && acc->getBoolValue("enabled",true)))
|
|
continue;
|
|
Message* m = new Message("user.login");
|
|
copyParams(*m,*acc);
|
|
m->setParam("account",*acc);
|
|
if (operation)
|
|
m->setParam("operation",operation);
|
|
Engine::enqueue(m);
|
|
}
|
|
}
|
|
|
|
bool AccHandler::received(Message &msg)
|
|
{
|
|
String action = msg.getValue("operation");
|
|
if (action.null())
|
|
return false;
|
|
if (action == "list") {
|
|
for (unsigned int i=0;i<s_cfg.sections();i++) {
|
|
NamedList* acc = s_cfg.getSection(i);
|
|
if (!(acc && acc->getValue("username") && acc->getBoolValue("enabled",true)))
|
|
continue;
|
|
msg.retValue().append(*acc,",");
|
|
}
|
|
return false;
|
|
}
|
|
String account = msg.getValue("account");
|
|
if (account.null())
|
|
return false;
|
|
Lock lock(s_mutex);
|
|
NamedList* acc = s_cfg.getSection(account);
|
|
if (acc) {
|
|
copyParams(msg,*acc);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
bool CmdHandler::received(Message &msg)
|
|
{
|
|
String line = msg.getValue("line");
|
|
if (!line.startSkip("accounts"))
|
|
return false;
|
|
if (line == "reload") {
|
|
Lock lock(s_mutex);
|
|
s_cfg.load();
|
|
}
|
|
else
|
|
emitAccounts(line);
|
|
return true;
|
|
}
|
|
|
|
bool StatusHandler::received(Message &msg)
|
|
{
|
|
String dest(msg.getValue("module"));
|
|
if (dest && (dest != "accfile") && (dest != "misc"))
|
|
return false;
|
|
Lock lock(s_mutex);
|
|
unsigned int n = s_cfg.sections();
|
|
if (!s_cfg.getSection(0))
|
|
--n;
|
|
msg.retValue() << "name=accfile,type=misc;users=" << n << ";";
|
|
bool first = true;
|
|
for (unsigned int i=0;i<s_cfg.sections();i++) {
|
|
NamedList *acct = s_cfg.getSection(i);
|
|
if (!acct)
|
|
continue;
|
|
const char* user = acct->getValue("username");
|
|
if (first)
|
|
first = false;
|
|
else
|
|
msg.retValue() << ",";
|
|
msg.retValue() << *acct << "=" << user;
|
|
}
|
|
msg.retValue() <<"\n";
|
|
return false;
|
|
}
|
|
|
|
bool StartHandler::received(Message &msg)
|
|
{
|
|
emitAccounts("login");
|
|
return false;
|
|
};
|
|
|
|
AccFilePlugin::AccFilePlugin()
|
|
: m_first(true)
|
|
{
|
|
Output("Loaded module Accounts from file");
|
|
}
|
|
|
|
void AccFilePlugin::initialize()
|
|
{
|
|
Output("Initializing module Accounts from file");
|
|
if (m_first) {
|
|
Lock lock(s_mutex);
|
|
m_first = false;
|
|
s_cfg.load();
|
|
Engine::install(new StatusHandler);
|
|
Engine::install(new StartHandler);
|
|
Engine::install(new CmdHandler);
|
|
}
|
|
}
|
|
|
|
INIT_PLUGIN(AccFilePlugin);
|
|
|
|
/* vi: set ts=8 sw=4 sts=4 noet: */
|