Browse Source

Mudança na forma de fazer login. método get_response_login recebe RESPONSE do login. get_welcome mostra a mensagem que aparece de benvindo do manager

pull/1/head
Rodgger 2 years ago
parent
commit
87cdebc1e5
  1. 22
      src/ami.c
  2. 3
      src/ami.h
  3. 16
      src/ami_c.h
  4. 136
      src/net.c
  5. 10
      src/net.h
  6. 17
      src/parse_action.c
  7. 2
      src/parse_string.c

22
src/ami.c

@ -174,8 +174,7 @@ int ami_send_action(AMI *ami, struct ss_action *action ){
int return_send = -1;
const char *str_action = NULL;
if(ami->net.is_connected && ami->asterisk.is_logged){
if(ami->net.is_connected == 1 && ami->asterisk.is_logged == 1){
str_action = build_str_action(action);
ami_actionid_add(&ami->asterisk.list_actionid, action->args[0].value);
@ -428,3 +427,22 @@ EVENT *ami_get_event_name( AMI *ami, EVENT *list_event, const char *event_name )
}
/*
* Recebe o texto usado quando é conectado ao manager
* \param ami estrutura opaca
* \return mensagem
*/
const char *get_welcome( AMI *ami ){
return ami->asterisk.welcome;
}
/*
* RESPONSE da action de login. ACTION
* \param ami estrutura opaca
* \return response de login
*/
RESPONSE *get_response_login(AMI *ami){
return ami->asterisk.response_login;
}

3
src/ami.h

@ -28,6 +28,8 @@ typedef struct s_ami_actionid {
typedef struct s_ami_asterisk {
unsigned int is_logged:1; /*!< */
unsigned int disable_events:1; /*!< disativa os eventos sem actionid */
char welcome[64];
RESPONSE *response_login;
ACTIONID *list_actionid;
} ASTERISK;
@ -91,7 +93,6 @@ struct ami {
};
#include <parse_action.h>
#include <parse_event.h>
#include <parse_string.h>

16
src/ami_c.h

@ -315,5 +315,21 @@ int ami_has_key( AMI *ami, ARGS *args, const char *key);
EVENT *ami_get_event_name( AMI *ami, EVENT *list_event, const char *event_name );
/*
* Recebe o texto usado quando é conectado ao manager
* \param ami estrutura opaca
* \return mensagem
*/
const char *get_welcome( AMI *ami );
/*
* RESPONSE da action de login. ACTION
* \param ami estrutura opaca
* \return response de login
*/
RESPONSE *get_response_login(AMI *ami);
#endif

136
src/net.c

@ -52,12 +52,11 @@ void *ami_net(void *void_ami){
}
if(ami->net.is_connected == 1 && ami->asterisk.is_logged == 0){
if(ami_dispatch_login(ami) == -1){
ami_connect_login_down(&ami->net, &ami->asterisk);
}
ami_dispatch_login(ami);
}
if(ami->net.is_connected == 1 && ami->asterisk.is_logged == 1){
if( ami->net.is_connected == 1 ){
sleep( 1 );
ami_communication_ami(ami);
ami_connect_login_down(&ami->net, &ami->asterisk);
@ -166,28 +165,41 @@ int ami_dispatch_action(AMI *ami, const char *action){
*/
int ami_dispatch_login(AMI *ami){
if( ami->net.is_connected == 0 || ami->asterisk.is_logged == 1 ){
if( ami->net.is_connected == 0 ){
return -1;
}
const char *str_login = NULL;
str_login = build_str_login(&ami->credential);
if( ami_dispatch_action(ami, str_login) == -1 ){
struct ss_action *action = NULL;
action = ami_create_new_action(2);
if(!action){
return -1;
}
strcpy( action->name_action, "Login" );
strcpy( action->args[0].value, "_LOGIN_" );
free_str_login((char *) str_login);
strcpy( action->args[1].key, "username" );
strncpy( action->args[1].value, ami->credential.username, strlen(ami->credential.username) );
if( ami_done_login( &ami->net ) == -1 ){
ami_connect_login_down(&ami->net, &ami->asterisk);
return -1;
strcpy( action->args[2].key, "secret" );
strncpy( action->args[2].value, ami->credential.password, strlen(ami->credential.password) );
const char *text_login = NULL;
text_login = build_str_action(action);
if(ami_dispatch_action(ami, text_login) == 1){
goto fail;
}
ami_login_up(&ami->asterisk);
ami_destroy_action(action);
str_action_free((char *)text_login);
return 0;
fail:
str_action_free((char *)text_login);
ami_destroy_action(action);
ami_connect_login_down(&ami->net, &ami->asterisk);
return -1;
}
@ -211,64 +223,6 @@ int ami_sock_close(int sock){
/*!
* Verifica a resposta do login, se retornar 0 o usuário está logado
*
* \return sucesso 0, falha -1
*/
int ami_done_login( NET *net ){
int len_message_login = 90;
char result_login[len_message_login];
char login_success[56] = "Response: Success\r\nMessage: Authentication accepted";
int bytes = 0;
int attempt_wait_login = 0;
while( 1 ){
struct pollfd pfd[1];
pfd[0].fd = net->sock;
pfd[0].events = POLLIN;
if(poll(pfd, 1, 10) == -1){
return -1;
}
if(pfd[0].revents & POLLHUP) {
return -1;
}
if(pfd[0].revents & POLLERR) {
return -1;
}
else if(pfd[0].revents & POLLIN) {
bytes = recv(net->sock, result_login, len_message_login - 1, 0);
result_login[bytes] = '\0';
if(!strstr(result_login, "Response")){
continue;
}
if(strstr(result_login, login_success) != NULL){
break;
}
else { /* login fail */
return -1;
}
}
attempt_wait_login++;
if(attempt_wait_login == 100){
return -1;
}
}
return 0;
}
/*!
* Connectar a ami e retorna está conectado
*
@ -279,7 +233,7 @@ int ami_connect_ami(NET *net){
while(1){
if (connect(net->sock, (struct sockaddr *)&net->sock_addr, sizeof(struct sockaddr_in) ) == -1){
usleep(10000);
usleep( 100000 );
continue;
}
@ -306,7 +260,6 @@ static int ami_create_socket(NET *net){
net->sock = socket(net->sock_addr.sin_family, SOCK_STREAM, 0);
return 0;
}
@ -322,7 +275,7 @@ int ami_communication_ami(AMI *ami){
int bytes = 0;
char more_buffer[MAX_BUFFER_NET + MAX_BUFFER_NET];
int i = 0;
int timeout = 1;
int timeout = 2;
while(1){
struct pollfd pfd[1];
@ -352,7 +305,7 @@ int ami_communication_ami(AMI *ami){
else if(pfd[0].revents & POLLIN) {
char *buffer = NULL;
timeout = 1;
timeout = 2;
i = 0;
if(ami->net.imcomplete_net == 0){
@ -382,6 +335,20 @@ int ami_communication_ami(AMI *ami){
continue;
}
if( ami->asterisk.is_logged == 0 ){
if(!strncmp( buffer, "Asterisk Call", 12 )){
memset(ami->asterisk.welcome, 0, 64);
int i = 0;
for( i = 0; i < 64 && *buffer != '\n' && *buffer != '\0'; i++ ){
ami->asterisk.welcome[i] = *(buffer);
buffer++;
}
ami->asterisk.welcome[i] = *(buffer);
buffer++;
}
}
char *block = NULL;
block = define_block(buffer, &buffer);
while(block){
@ -396,20 +363,21 @@ int ami_communication_ami(AMI *ami){
}
}
else{
if( i > 100 && i < 120){
timeout = 50;
// 2 * 200 = 400 = 0.4 seconds
if( i > 200 ){
timeout = 100;
}
if( i > 121 && i < 200){
// 100 * 4 = 400
if( i >= 203 ){
usleep(100000); // sleep 0.1 segundos
}
if( i > 150){
timeout = 100;
if( i >= 208 ){
usleep(200000);
}
if(i < 190){
if(i < 240){
++i;
}
}

10
src/net.h

@ -101,16 +101,6 @@ int ami_sock_close(int sock);
/*!
* Verifica a resposta do login, se retornar 0 o usuário está logado
*
* \return sucesso 0, falha -1
*/
int ami_done_login( NET *net );
/*!
* Connectar a ami e retorna está conectado
*

17
src/parse_action.c

@ -83,6 +83,23 @@ void parse_response(AMI *ami, const char *buffer){
}
pthread_mutex_lock(&ami->thread.mutex_actions);
if( !strcmp( p_action->actionid, "_LOGIN_" ) ) {
if( !strcasecmp(p_action->response->response, "Success") ) {
ami_login_up(&ami->asterisk);
}
else{
ami_connect_login_down(&ami->net, &ami->asterisk);
}
RESPONSE *login = ami_response_create();
memcpy(login, p_action->response, sizeof(RESPONSE));
ami_action_free(p_action);
ami->asterisk.response_login = login;
pthread_mutex_unlock(&ami->thread.mutex_actions);
return;
}
ami_action_add( &ami->actions, p_action );
pthread_mutex_unlock(&ami->thread.mutex_actions);

2
src/parse_string.c

@ -15,7 +15,7 @@
const char *build_str_login(CREDENTIAL *credential) {
char *login = NULL;
char *str_login = "action: Login\r\nusername: %s\r\nsecret: %s\r\n\r\n";
char *str_login = "action: Login\r\nActionID:%s\r\nusername: %s\r\nsecret: %s\r\n\r\n";
login = calloc(1, strlen(str_login) + strlen(credential->username) + strlen(credential->password) + 2);
sprintf(login, str_login, credential->username, credential->password);

Loading…
Cancel
Save