From 9032e2ee65afc0fd856986c57630b8410b7433dd Mon Sep 17 00:00:00 2001 From: Stefan Sayer Date: Sun, 29 Jul 2007 15:14:14 +0000 Subject: [PATCH] authenticated announcement (SEMS call originator) git-svn-id: http://svn.berlios.de/svnroot/repos/sems/trunk@410 8eb893ce-cfd4-0310-b710-fb5ebe64c474 --- apps/announcement/Announcement.cpp | 51 +++++++++++++++++++++++++++--- apps/announcement/Announcement.h | 19 +++++++++-- 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/apps/announcement/Announcement.cpp b/apps/announcement/Announcement.cpp index 3f72e8ef..b87463fa 100644 --- a/apps/announcement/Announcement.cpp +++ b/apps/announcement/Announcement.cpp @@ -28,6 +28,7 @@ #include "Announcement.h" #include "AmConfig.h" #include "AmUtils.h" +#include "AmPlugIn.h" #include "sems.h" #include "log.h" @@ -70,8 +71,7 @@ int AnnouncementFactory::onLoad() return 0; } -AmSession* AnnouncementFactory::onInvite(const AmSipRequest& req) -{ +string AnnouncementFactory::getAnnounceFile(const AmSipRequest& req) { string announce_path = AnnouncePath; string announce_file = announce_path + req.domain + "/" + req.user + ".wav"; @@ -88,11 +88,48 @@ AmSession* AnnouncementFactory::onInvite(const AmSipRequest& req) announce_file = AnnouncePath + AnnounceFile; end: - return new AnnouncementDialog(announce_file); + return announce_file; } -AnnouncementDialog::AnnouncementDialog(const string& filename) - : filename(filename) +AmSession* AnnouncementFactory::onInvite(const AmSipRequest& req) +{ + return new AnnouncementDialog(getAnnounceFile(req), NULL); +} + +AmSession* AnnouncementFactory::onInvite(const AmSipRequest& req, + AmArg& session_params) +{ + UACAuthCred* cred = NULL; + if (session_params.getType() == AmArg::AObject) { + ArgObject* cred_obj = session_params.asObject(); + if (cred_obj) + cred = dynamic_cast(cred_obj); + } + + AmSession* s = new AnnouncementDialog(getAnnounceFile(req), cred); + + if (NULL == cred) { + WARN("discarding unknown session parameters.\n"); + } else { + AmSessionEventHandlerFactory* uac_auth_f = + AmPlugIn::instance()->getFactory4Seh("uac_auth"); + if (uac_auth_f != NULL) { + DBG("UAC Auth enabled for new announcement session.\n"); + AmSessionEventHandler* h = uac_auth_f->getHandler(s); + if (h != NULL ) + s->addHandler(h); + } else { + ERROR("uac_auth interface not accessible. " + "Load uac_auth for authenticated dialout.\n"); + } + } + + return s; +} + +AnnouncementDialog::AnnouncementDialog(const string& filename, + UACAuthCred* credentials) + : filename(filename), cred(credentials) { } @@ -142,3 +179,7 @@ void AnnouncementDialog::process(AmEvent* event) AmSession::process(event); } + +inline UACAuthCred* AnnouncementDialog::getCredentials() { + return cred.get(); +} diff --git a/apps/announcement/Announcement.h b/apps/announcement/Announcement.h index df255116..618f97c2 100644 --- a/apps/announcement/Announcement.h +++ b/apps/announcement/Announcement.h @@ -31,11 +31,16 @@ #include "AmSession.h" #include "AmConfigReader.h" +#include "ampi/UACAuthAPI.h" + #include using std::string; +#include + class AnnouncementFactory: public AmSessionFactory { + inline string getAnnounceFile(const AmSipRequest& req); public: static string AnnouncePath; static string AnnounceFile; @@ -44,15 +49,21 @@ public: int onLoad(); AmSession* onInvite(const AmSipRequest& req); + AmSession* onInvite(const AmSipRequest& req, + AmArg& session_params); + }; -class AnnouncementDialog : public AmSession +class AnnouncementDialog : public AmSession, + public CredentialHolder { AmAudioFile wav_file; string filename; - + + std::auto_ptr cred; public: - AnnouncementDialog(const string& filename); + AnnouncementDialog(const string& filename, + UACAuthCred* credentials = NULL); ~AnnouncementDialog(); void onSessionStart(const AmSipRequest& req); @@ -62,6 +73,8 @@ public: void onDtmf(int event, int duration_msec) {} void process(AmEvent* event); + + UACAuthCred* getCredentials(); }; #endif