Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * AccessRulesControler.cpp
- *
- * Created on: Mar 17, 2014
- * Author: tshw
- */
- #include "AccessRulesControler.h"
- #include "SimpleAccessRules.h"
- #include "TwoMenRuleAccessRules.h"
- #include "../ezlogger/ezlogger_headers.hpp"
- #include "../WebsocketComponents/UIWebSocketConnection.h"
- #include "HamiltonAccessRules.h"
- #include <boost/algorithm/string/join.hpp>
- #include <boost/algorithm/string.hpp>
- #include <vector>
- bool ZoneWing::AccessRulesControler::GetAccessRulesDefinition(int Channel, ZoneWing::AccessRulesDefinition & accessRulesDefinition)
- {
- DBMutexLockGuard db_mutex_lock_guard;
- bool retVal = false;
- sqlite3_stmt * sql_stmt;
- std::stringstream query_stream;
- std::string query;
- query_stream << std::string("select * from accessrules where ChannelID =") << Channel;
- query = query_stream.str();
- if(sqlite3_prepare_v2(mpSqlDBConnectionPtr->SqLitePtr(), query.c_str(), -1, &sql_stmt, NULL) != SQLITE_OK)
- {
- sqlite3_finalize(sql_stmt);
- throw std::runtime_error( std::string( "SQL error at loading schedules" ) );
- }
- unsigned evaluation_result = sqlite3_step(sql_stmt);
- if(evaluation_result == SQLITE_ROW)
- {
- accessRulesDefinition.SetAccessResultType( static_cast< AccessRulesType >(sqlite3_column_int(sql_stmt, 1)) );
- accessRulesDefinition.SetParameters( reinterpret_cast< const char *>(sqlite3_column_text(sql_stmt, 2)));
- accessRulesDefinition.SetKeypad( static_cast< bool >(sqlite3_column_int(sql_stmt, 3)));
- retVal = true;
- }
- if( sqlite3_finalize(sql_stmt) != SQLITE_OK )
- {
- throw std::runtime_error( std::string( "SQL error at loading schedules 2" ));
- }
- return retVal;
- }
- void ZoneWing::AccessRulesControler::SetAccessRulesDefinition(int Channel, const ZoneWing::AccessRulesDefinition & accessRulesDefinition)
- {
- DBMutexLockGuard db_mutex_lock_guard;
- sqlite3_stmt * sql_stmt;
- std::stringstream sql_stream;
- std::string query;
- unsigned evaluation_result;
- // sql_stream << std::string("insert or replace INTO accessrules (ChannelID, AccessRuleType, Parameters, ReportingParameter, Keypad) VALUES (?,?,?)");
- sql_stream << std::string("insert or replace INTO accessrules (ChannelID, AccessRuleType, Parameters, Keypad) VALUES (?,?,?,?)");
- query = sql_stream.str();
- if((sqlite3_prepare_v2(mpSqlDBConnectionPtr->SqLitePtr(), query.c_str(), -1, &sql_stmt, NULL) != SQLITE_OK) ||
- (sqlite3_bind_int(sql_stmt, 1, Channel) != SQLITE_OK) ||
- (sqlite3_bind_int(sql_stmt, 2, accessRulesDefinition.GetAccessRulesType()) != SQLITE_OK) ||
- (sqlite3_bind_text(sql_stmt, 3, accessRulesDefinition.GetParameters().c_str(), accessRulesDefinition.GetParameters().size(), NULL) != SQLITE_OK) ||
- (sqlite3_bind_int(sql_stmt, 4, accessRulesDefinition.GetKeypad()) != SQLITE_OK))
- {
- sqlite3_finalize(sql_stmt);
- throw std::runtime_error( std::string( "SQL error adding access rules definitions! " ));
- }
- evaluation_result = sqlite3_step(sql_stmt);
- if(evaluation_result != SQLITE_DONE)
- {
- sqlite3_finalize(sql_stmt);
- throw std::runtime_error( std::string( "SQL error adding access rules definitions! " ));
- }
- if( sqlite3_finalize(sql_stmt) != SQLITE_OK )
- {
- throw std::runtime_error( std::string( "SQL error adding access rules definitions! " ));
- }
- }
- ZoneWing::AccessRulesControler::TCommResp ZoneWing::AccessRulesControler::DefineChannelProperties(ZoneWing::NetMessagePtr pNetMessage)
- {
- /*Name: XS_ChannelProp
- Sender: HOST
- Response: GenAck
- Format: C_Dchannel_TaccessRulesType_PaccessRulesParams
- */
- int Channel = -1;
- bool accessRuleDefined = false;
- std::string params = "";
- AccessRulesDefinition access_rules_definition;
- access_rules_definition.SetAccessResultType( AR_SIMPLE );
- access_rules_definition.SetKeypad(false);
- if(pNetMessage->DoesFieldExist(string(1,'D')))
- {
- Channel = pNetMessage->GetIntegerField(std::string(1,'D'));
- }
- if(pNetMessage->DoesFieldExist(std::string(1,'T')))
- {
- access_rules_definition.SetAccessResultType( static_cast< AccessRulesType >(pNetMessage->GetIntegerField(std::string(1,'T'))));
- accessRuleDefined = true;
- }
- if(pNetMessage->DoesFieldExist(std::string(1,'K')))
- {
- if(pNetMessage->GetIntegerField(std::string(1,'K'))>0)
- {
- access_rules_definition.SetKeypad(true);
- }
- }
- if(pNetMessage->DoesFieldExist(std::string(1,'P')))
- {
- params = pNetMessage->rGetField(std::string(1,'P'));
- //We need to make sure there are no newline and carriage return chars in the string... Lexical cast later on fails if this is left in the string.
- if(!params.empty() && params[params.size() -1] == '\n')
- {
- params.erase(params.size() - 1);
- }
- if(!params.empty() && params[params.size() -1] == '\r')
- {
- params.erase(params.size() - 1);
- }
- access_rules_definition.SetParameters(params);
- }
- if(pNetMessage->DoesFieldExist(std::string(1,'S')))
- {
- if(Channel == 0) //this monstrocity is result of the fact, this information is sent in every channel despite being a device wide setting......... Software issue.
- {
- bool enterSettings = false;
- if(pNetMessage->GetIntegerField(std::string(1,'S'))>0)
- {
- enterSettings = true;
- }
- else
- {
- enterSettings = false;
- }
- HamiltonAccessRules *hamrules = dynamic_cast<HamiltonAccessRules*>(mAccessRules[0].get());
- if(hamrules)
- {
- hamrules->setEnterSettings(enterSettings);
- }
- }
- }
- if(pNetMessage->DoesFieldExist(std::string(1,'H')))
- {
- if(Channel == 0) //see monstrosity comment above
- {
- bool touchscreen = true;
- if(pNetMessage->GetIntegerField(std::string(1,'H'))>0)
- {
- touchscreen = true;
- }
- else
- {
- touchscreen = false;
- }
- HamiltonAccessRules *hamrules = dynamic_cast<HamiltonAccessRules*>(mAccessRules[0].get());
- if(hamrules)
- {
- hamrules->setTouchscreenEnabled(touchscreen);
- }
- }
- }
- if(Channel >= 0 && accessRuleDefined)
- {
- SetAccessRulesDefinition(Channel, access_rules_definition);
- //InitAccessRule(Channel, false);
- }
- return crAck;
- }
- ZoneWing::AccessRulesControler::TCommResp ZoneWing::AccessRulesControler::DefineReportingParametersParser(ZoneWing::NetMessagePtr pNetMessage)
- /*
- This packet is used to define alternate reporting functionality.
- Name: XS_DefSch
- Sender: HOST
- Response: GenAck
- Format: C_Dchannel_EreportParameter
- D-channel number
- E-reporting parameter - 0 - Stops reporting of registrations which are not "granted"
- */
- {
- TCommResp retVal = crAck;
- int channel = -1;
- string reporting_parameter = "";
- if(pNetMessage->DoesFieldExist(std::string(1,'D')))
- {
- channel = pNetMessage->GetIntegerField(std::string(1,'D'));
- }
- if(pNetMessage->DoesFieldExist(std::string(1,'E')))
- {
- reporting_parameter = pNetMessage->rGetField(std::string(1,'E'));
- }
- if(channel != -1 && reporting_parameter != "")
- {
- ReportingParameterPtr parameter = boost::make_shared< ReportingParameterObj >();
- parameter->Channel = channel;
- parameter->ReportingParameter = reporting_parameter;
- mpReportingParameters.push_back(parameter);
- }
- else
- {
- EZLOGGERSTREAM << "Unknown ExtendedConfigFile command (reporting parameter). " << std::endl;
- }
- return retVal;
- }
- ZoneWing::AccessRulesControler::TCommResp ZoneWing::AccessRulesControler::DefineDapZ1TTimeout(ZoneWing::NetMessagePtr pNetMessage)
- {
- TCommResp retVal = crAck;
- AccessRulesDefinition access_rules_definition;
- std::string timeout;
- if(pNetMessage->DoesFieldExist(std::string(1,'T')))
- {
- timeout = pNetMessage->rGetField(std::string(1,'T'));
- std::cout << "Got the time and am setting it to: " << timeout << std::endl;
- }
- for(int channelID = 0;channelID<64;channelID++)
- {
- if(mAccessRules[channelID].get() != NULL)
- {
- if(GetAccessRulesDefinition(channelID, access_rules_definition))
- {
- if(access_rules_definition.GetAccessRulesType() == AR_HAMILTON)
- {
- std::string resource_file_name = "";
- std::vector<std::string> tmpVector;
- boost::split(tmpVector, access_rules_definition.GetParameters(), boost::is_any_of(";"));
- if(tmpVector.size() >= 2)
- {
- resource_file_name = tmpVector[2];
- }
- ptree pt;
- if(resource_file_name != "")
- {
- std::ifstream infile;
- ptree child;
- ptree resourcePacket;
- infile.open(resource_file_name.c_str());
- std::stringstream strStream;
- strStream << infile.rdbuf();
- boost::property_tree::json_parser::read_json(strStream, child);
- child.put("Settings.dapResponseTimeout", timeout);
- boost::property_tree::write_json(resource_file_name,child);
- }
- }
- }
- }
- }
- return retVal;
- }
- ZoneWing::AccessRulesControler::TCommResp ZoneWing::AccessRulesControler::DefineRegexFilter(ZoneWing::NetMessagePtr pNetMessage)
- /*
- This packet is used to define single schedule.
- Name: XS_DefSch
- Sender: HOST
- Response: GenAck
- Format: b_Cchannel_Eexclusivity_RregexExpression
- C - channel
- E - exclusivity
- R - regex expression
- */
- {
- TCommResp retVal = crAck;
- int channel = -1;
- bool isExclusivitySet = false;
- bool exclusivity = false;
- string regex_expression = "";
- if(pNetMessage->DoesFieldExist(std::string(1,'C')))
- {
- channel = pNetMessage->GetIntegerField(string(1,'C'));
- }
- if(pNetMessage->DoesFieldExist(std::string(1,'E')))
- {
- isExclusivitySet = true;
- exclusivity = !!(pNetMessage->GetIntegerField(string(1,'E')));
- }
- if(pNetMessage->DoesFieldExist(std::string(1,'R')))
- {
- regex_expression = pNetMessage->rGetField(string(1,'R'));
- if(!regex_expression.empty() && regex_expression[regex_expression.size() -1] == '\n')
- {
- regex_expression.erase(regex_expression.size() -
- 1);
- }
- if(!regex_expression.empty() && regex_expression[regex_expression.size() -1] == '\r')
- {
- regex_expression.erase(regex_expression.size() - 1);
- }
- }
- if(channel != -1 && regex_expression != "" && isExclusivitySet)
- {
- RegexFilterPtr filters = boost::make_shared< RegexFilter >();
- filters->Channel = channel;
- filters->Exclusivity = exclusivity;
- filters->RegexExpression = regex_expression;
- mpRegexFilters.push_back(filters);
- }
- else
- {
- EZLOGGERSTREAM << "Unknown ExtendedConfigFile command (badge filters). " << std::endl;
- }
- return retVal;
- }
- ZoneWing::AccessRulesControler::TCommResp ZoneWing::AccessRulesControler::DefineUiConfigFile(ZoneWing::NetMessagePtr pNetMessage)
- {
- AccessRulesDefinition access_rules_definition;
- TCommResp retVal = crAck;
- int channelID = 0;
- std::string resource_file_name = "";
- int first_index = 0;
- int second_index = 0;
- std::vector<std::string> translations_vector;
- std::vector<std::string> ptree_translations_vector = {
- "Translations.Dates.Day.Sun",
- "Translations.Dates.Day.Mon",
- "Translations.Dates.Day.Tue",
- "Translations.Dates.Day.Wed",
- "Translations.Dates.Day.Thu",
- "Translations.Dates.Day.Fri",
- "Translations.Dates.Day.Sat",
- "Translations.Dates.Month.Jan",
- "Translations.Dates.Month.Feb",
- "Translations.Dates.Month.Mar",
- "Translations.Dates.Month.Apr",
- "Translations.Dates.Month.May",
- "Translations.Dates.Month.Jun",
- "Translations.Dates.Month.Jul",
- "Translations.Dates.Month.Aug",
- "Translations.Dates.Month.Sep",
- "Translations.Dates.Month.Oct",
- "Translations.Dates.Month.Nov",
- "Translations.Dates.Month.Dec",
- "Translations.UI.PlaceBadge",
- "Translations.UI.SelectEvent",
- "Translations.UI.PlaceCard",
- "Translations.UI.PlaceFinger",
- "Translations.UI.EnterPIN",
- "Translations.UI.EnterBadge",
- "Translations.UI.EnterNumberic",
- "Translations.UI.RegistrationSuccessful",
- "Translations.UI.RegistrationUnsuccessful"
- };
- if(pNetMessage->DoesFieldExist(std::string(1,'S')))
- {
- first_index = pNetMessage->GetIntegerField(std::string(1,'S'))-1;
- }
- if(pNetMessage->DoesFieldExist(std::string(1,'E')))
- {
- second_index = pNetMessage->GetIntegerField(std::string(1,'E'))-1;
- }
- if(pNetMessage->DoesFieldExist(std::string(1,'L')))
- {
- boost::split(translations_vector,pNetMessage->rGetField(std::string(1,'L')),boost::is_any_of(";"));
- }
- for(;channelID<64;channelID++)
- {
- if(mAccessRules[channelID].get() != NULL)
- {
- if(GetAccessRulesDefinition(channelID, access_rules_definition))
- {
- if(access_rules_definition.GetAccessRulesType() == AR_HAMILTON)
- {
- std::string resource_file_name = "";
- std::vector<std::string> tmpVector;
- boost::split(tmpVector, access_rules_definition.GetParameters(), boost::is_any_of(";"));
- if(tmpVector.size() >= 2)
- {
- resource_file_name = tmpVector[2];
- }
- ptree pt;
- if(resource_file_name != "")
- {
- std::ifstream infile;
- ptree child;
- ptree resourcePacket;
- infile.open(resource_file_name.c_str());
- std::stringstream strStream;
- strStream << infile.rdbuf();
- boost::property_tree::json_parser::read_json(strStream, child);
- for(int x = 0;first_index<second_index;first_index++)
- {
- child.put(ptree_translations_vector[first_index], translations_vector[x]);
- x++;
- }
- boost::property_tree::write_json(resource_file_name,child);
- }
- }
- }
- }
- }
- return retVal;
- }
- void ZoneWing::AccessRulesControler::InitAccessRule(int channelID, bool create)
- {
- AccessRulesDefinition access_rules_definition;
- if(mAccessRules[channelID].get() == NULL && create == false)
- {
- return;
- }
- if(GetAccessRulesDefinition(channelID, access_rules_definition))
- {
- switch(access_rules_definition.GetAccessRulesType())
- {
- case AR_SIMPLE:
- {
- mAccessRules[channelID] = boost::make_shared< SimpleAccessRules > (mChannels[channelID], mpUserProfileLoader, mpSchedules ,mpEventDefLoader, mpAPB, mpRegexFilters, mpReportingParameters,access_rules_definition.GetKeypad());
- break;
- }
- case AR_TMR:
- {
- int timeout;
- timeout = boost::lexical_cast<int>(access_rules_definition.GetParameters());
- EZLOGGERSTREAM << "Creating two men rule on channel: " << channelID << " with parameters: " << access_rules_definition.GetParameters() << std::endl;
- mAccessRules[channelID] = boost::make_shared< TwoMenRuleAccessRules >(mChannels[channelID], mpUserProfileLoader, mpSchedules ,mpEventDefLoader, mpRegexFilters, mpReportingParameters, access_rules_definition.GetKeypad(), timeout );
- break;
- }
- case AR_HAMILTON:
- {
- int tcp_port = 2200;
- int morpho_tcp_port = 2300;
- std::string resource_file_name = "hamilton.json";
- std::string factory_file_name = "factory.json";
- std::vector<std::string> lVector;
- boost::split(lVector, access_rules_definition.GetParameters(), boost::is_any_of(";"));
- std::cout << "Hamilton AC: " << lVector[0] << " " << lVector[1] << std::endl;
- if(lVector.size() >= 1)
- tcp_port = boost::lexical_cast<int>(lVector[0]);
- if(lVector.size() >= 2)
- morpho_tcp_port = boost::lexical_cast<int>(lVector[1]);
- if(lVector.size() >= 3)
- resource_file_name = lVector[2];
- if(lVector.size() >= 4)
- factory_file_name = lVector[3];
- EZLOGGERSTREAM << "Creating hamilton rules: " << channelID << " with parameters: " << access_rules_definition.GetParameters() << " and resource file: " << resource_file_name << std::endl;
- UIWebSocketConnectionPtr gui_connection = boost::make_shared< UIWebSocketConnection >(tcp_port );
- UIWebSocketConnectionPtr morpho_connection = boost::make_shared< UIWebSocketConnection >(morpho_tcp_port);
- EZLOGGERSTREAM << "Websocket created" << std::endl;
- mAccessRules[channelID] = boost::make_shared< HamiltonAccessRules >(mChannels[channelID], mpUserProfileLoader, mpSchedules ,mpEventDefLoader, mpAPB, gui_connection, morpho_connection, resource_file_name, factory_file_name, mpSqlDBConnectionPtr);
- EZLOGGERSTREAM << "Rules created" << std::endl;
- break;
- }
- }
- }
- else // if access rules are not defined, use default
- {
- mAccessRules[channelID] = boost::make_shared< SimpleAccessRules > (mChannels[channelID], mpUserProfileLoader, mpSchedules ,mpEventDefLoader, mpAPB, mpRegexFilters , mpReportingParameters, false );
- }
- if(mAccessRules[channelID].get() != NULL)
- {
- mAccessRules[channelID]->InitAccessRules();
- }
- else
- {
- EZLOGGERSTREAM << "Access rules not defined on channel: " << channelID << std::endl;
- }
- }
- void ZoneWing::AccessRulesControler::InitAccessRules()
- {
- EZLOGGERSTREAM << "Initializing access rules... " << std::endl;
- for(int i = 0; i < MAX_CHECKPOINT; i++)
- {
- InitAccessRule(i);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement