Changeset 3545


Ignore:
Timestamp:
12/01/07 02:55:39 (5 years ago)
Author:
tick
Message:

gsmd: Submitting a PIN for authentication needs to respond with status too.(Andrzej Zaborowski)

Location:
trunk/src/target/gsm
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/target/gsm/include/gsmd/unsolicited.h

    r2712 r3545  
    1616extern int unsolicited_register_array(const struct gsmd_unsolicit *arr, 
    1717                int len); 
     18extern const int pintype_from_cme[]; 
    1819 
    1920#endif /* __GSMD__ */ 
  • trunk/src/target/gsm/include/libgsmd/pin.h

    r1314 r3545  
    44extern const char *lgsm_pin_name(enum gsmd_pin_type ptype); 
    55 
    6 extern int lgsm_pin(struct lgsm_handle *lh, unsigned int type, char *pin, char *newpin); 
     6extern int lgsm_pin(struct lgsm_handle *lh, unsigned int type, 
     7                const char *pin, const char *newpin); 
    78 
    89#endif 
  • trunk/src/target/gsm/src/gsmd/unsolicited.c

    r3390 r3545  
    488488} 
    489489 
     490const int pintype_from_cme[GSM0707_CME_UNKNOWN] = { 
     491        [GSM0707_CME_PH_SIM_PIN_REQUIRED]       = GSMD_PIN_PH_SIM_PIN, 
     492        [GSM0707_CME_PH_FSIM_PIN_REQUIRED]      = GSMD_PIN_PH_FSIM_PIN, 
     493        [GSM0707_CME_PH_FSIM_PUK_REQUIRED]      = GSMD_PIN_PH_FSIM_PUK, 
     494        [GSM0707_CME_SIM_PIN_REQUIRED]          = GSMD_PIN_SIM_PIN, 
     495        [GSM0707_CME_SIM_PUK_REQUIRED]          = GSMD_PIN_SIM_PUK, 
     496        [GSM0707_CME_SIM_PIN2_REQUIRED]         = GSMD_PIN_SIM_PIN2, 
     497        [GSM0707_CME_SIM_PUK2_REQUIRED]         = GSMD_PIN_SIM_PUK2, 
     498        [GSM0707_CME_NETPERS_PIN_REQUIRED]      = GSMD_PIN_PH_NET_PIN, 
     499        [GSM0707_CME_NETPERS_PUK_REQUIRED]      = GSMD_PIN_PH_NET_PUK, 
     500        [GSM0707_CME_NETSUBSET_PIN_REQUIRED]    = GSMD_PIN_PH_NETSUB_PIN, 
     501        [GSM0707_CME_NETSUBSET_PUK_REQUIRED]    = GSMD_PIN_PH_NETSUB_PUK, 
     502        [GSM0707_CME_PROVIDER_PIN_REQUIRED]     = GSMD_PIN_PH_SP_PIN, 
     503        [GSM0707_CME_PROVIDER_PUK_REQUIRED]     = GSMD_PIN_PH_SP_PUK, 
     504        [GSM0707_CME_CORPORATE_PIN_REQUIRED]    = GSMD_PIN_PH_CORP_PIN, 
     505        [GSM0707_CME_CORPORATE_PUK_REQUIRED]    = GSMD_PIN_PH_CORP_PUK, 
     506        /* FIXME: */ 
     507        [GSM0707_CME_SIM_FAILURE]               = 0, 
     508        [GSM0707_CME_SIM_BUSY]                  = 0, 
     509        [GSM0707_CME_SIM_WRONG]                 = 0, 
     510        [GSM0707_CME_MEMORY_FULL]               = 0, 
     511        [GSM0707_CME_MEMORY_FAILURE]            = 0, 
     512        [GSM0707_CME_PHONE_FAILURE]             = 0, 
     513        [GSM0707_CME_PHONE_NOCONNECT]           = 0, 
     514        [GSM0707_CME_PHONE_ADAPT_RESERVED]      = 0, 
     515        [GSM0707_CME_SIM_NOT_INSERTED]          = 0, 
     516}; 
     517 
    490518int generate_event_from_cme(struct gsmd *g, unsigned int cme_error) 
    491519{ 
     
    493521        struct gsmd_evt_auxdata *eaux; 
    494522 
    495         if (!is_in_array(cme_error, errors_creating_events, 
     523        if (!is_in_array(cme_error, errors_creating_events, 
    496524                ARRAY_SIZE(errors_creating_events))) { 
    497525 
     
    502530                eaux->u.cme_err.number = cme_error; 
    503531                return usock_evt_send(g, gu, GSMD_EVT_IN_ERROR); 
    504         } 
    505         else { 
    506                 gu = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_PIN, sizeof(*eaux)); 
     532        } else { 
     533                if (cme_error >= GSM0707_CME_UNKNOWN || 
     534                                !pintype_from_cme[cme_error]) 
     535                        return 0; 
     536 
     537                gu = usock_build_event(GSMD_MSG_EVENT, GSMD_EVT_PIN, 
     538                                sizeof(*eaux)); 
    507539                if (!gu) 
    508540                        return -1; 
     541 
    509542                eaux = ((void *)gu) + sizeof(*gu); 
    510          
    511                 switch (cme_error) { 
    512                 case GSM0707_CME_PH_SIM_PIN_REQUIRED: 
    513                         eaux->u.pin.type = GSMD_PIN_PH_SIM_PIN; 
    514                         break; 
    515                 case GSM0707_CME_PH_FSIM_PIN_REQUIRED: 
    516                         eaux->u.pin.type = GSMD_PIN_PH_FSIM_PIN; 
    517                         break; 
    518                 case GSM0707_CME_PH_FSIM_PUK_REQUIRED: 
    519                         eaux->u.pin.type = GSMD_PIN_PH_FSIM_PUK; 
    520                         break; 
    521                 case GSM0707_CME_SIM_PIN_REQUIRED: 
    522                         eaux->u.pin.type = GSMD_PIN_SIM_PIN; 
    523                         break; 
    524                 case GSM0707_CME_SIM_PUK_REQUIRED: 
    525                         eaux->u.pin.type = GSMD_PIN_SIM_PUK; 
    526                         break; 
    527                 case GSM0707_CME_SIM_PIN2_REQUIRED: 
    528                         eaux->u.pin.type = GSMD_PIN_SIM_PIN2; 
    529                         break; 
    530                 case GSM0707_CME_SIM_PUK2_REQUIRED: 
    531                         eaux->u.pin.type = GSMD_PIN_SIM_PUK2; 
    532                         break; 
    533                 case GSM0707_CME_NETPERS_PIN_REQUIRED: 
    534                         eaux->u.pin.type = GSMD_PIN_PH_NET_PIN; 
    535                         break; 
    536                 case GSM0707_CME_NETPERS_PUK_REQUIRED: 
    537                         eaux->u.pin.type = GSMD_PIN_PH_NET_PUK; 
    538                         break; 
    539                 case GSM0707_CME_NETSUBSET_PIN_REQUIRED: 
    540                         eaux->u.pin.type = GSMD_PIN_PH_NETSUB_PIN; 
    541                         break; 
    542                 case GSM0707_CME_NETSUBSET_PUK_REQUIRED: 
    543                         eaux->u.pin.type = GSMD_PIN_PH_NETSUB_PUK; 
    544                         break; 
    545                 case GSM0707_CME_PROVIDER_PIN_REQUIRED: 
    546                         eaux->u.pin.type = GSMD_PIN_PH_SP_PIN; 
    547                         break; 
    548                 case GSM0707_CME_PROVIDER_PUK_REQUIRED: 
    549                         eaux->u.pin.type = GSMD_PIN_PH_SP_PUK; 
    550                         break; 
    551                 case GSM0707_CME_CORPORATE_PIN_REQUIRED: 
    552                         eaux->u.pin.type = GSMD_PIN_PH_CORP_PIN; 
    553                         break; 
    554                 case GSM0707_CME_CORPORATE_PUK_REQUIRED: 
    555                         eaux->u.pin.type = GSMD_PIN_PH_CORP_PUK; 
    556                         break; 
    557          
    558                 case GSM0707_CME_SIM_FAILURE: 
    559                 case GSM0707_CME_SIM_BUSY: 
    560                 case GSM0707_CME_SIM_WRONG: 
    561                 case GSM0707_CME_MEMORY_FULL: 
    562                 case GSM0707_CME_MEMORY_FAILURE: 
    563                 case GSM0707_CME_PHONE_FAILURE: 
    564                 case GSM0707_CME_PHONE_NOCONNECT: 
    565                 case GSM0707_CME_PHONE_ADAPT_RESERVED: 
    566                 case GSM0707_CME_SIM_NOT_INSERTED: 
    567                         /* FIXME */ 
    568                         talloc_free(gu); 
    569                         return 0; 
    570                         break; 
    571                 default: 
    572                         talloc_free(gu); 
    573                         return 0; 
    574                         break; 
    575                 } 
     543                eaux->u.pin.type = pintype_from_cme[cme_error]; 
    576544                return usock_evt_send(g, gu, GSMD_EVT_PIN); 
    577545        } 
  • trunk/src/target/gsm/src/gsmd/usock.c

    r3544 r3545  
    186186static int pin_cmd_cb(struct gsmd_atcmd *cmd, void *ctx, char *resp) 
    187187{ 
    188         gsmd_log(GSMD_DEBUG, "pin cmd cb\n"); 
    189  
    190         /* We need to verify if there is some error */ 
    191         switch (cmd->ret) { 
    192         case 0: 
    193                 break; 
    194         case GSM0707_CME_INCORRECT_PASSWORD: 
    195                 /* prompt for pin again */ 
    196                 break; 
    197         default:         
    198                 /* something went wrong */ 
    199                 break; 
    200         } 
     188        struct gsmd_user *gu = ctx; 
     189        struct gsmd_ucmd *ucmd = gsmd_ucmd_fill(sizeof(int), GSMD_MSG_PIN, 
     190                        GSMD_PIN_INPUT, 0); 
     191 
     192        if (!ucmd) 
     193                return -ENOMEM; 
     194 
     195        /* Pass a GSM07.07 CME code directly, don't issue a new PIN 
     196         * request because the client waits for a response to her 
     197         * PIN submission rather than an event.  */ 
     198        ((int *) ucmd->buf)[0] = cmd->ret; 
     199        usock_cmd_enqueue(ucmd, gu); 
    201200        return 0; 
    202201} 
     
    410409        if (!ucmd) 
    411410                return NULL; 
    412          
     411 
    413412        ucmd->hdr.version = GSMD_PROTO_VERSION; 
    414413        ucmd->hdr.msg_type = msg_type; 
     
    652651        num->name[len] = 0; 
    653652        num->addr.type = type; 
    654         num->is_last = (cmd->ret == 0, NULL); 
     653        num->is_last = (cmd->ret == 0); 
    655654 
    656655        usock_cmd_enqueue(ucmd, gu); 
  • trunk/src/target/gsm/src/libgsmd/libgsmd_pin.c

    r3497 r3545  
    5656} 
    5757 
    58 int lgsm_pin(struct lgsm_handle *lh, unsigned int type, char *pin, char *newpin) 
     58int lgsm_pin(struct lgsm_handle *lh, unsigned int type, 
     59                const char *pin, const char *newpin) 
    5960{ 
    6061        int rc; 
     
    7576 
    7677        gm->gp.type = type; 
    77  
    78         gm->gp.pin[0] = '\0'; 
    79         strcat(gm->gp.pin, pin); 
     78        strcpy(gm->gp.pin, pin); 
    8079 
    8180        switch (type) { 
     
    8584                 * require a new pin to be specified! Don't know if this is a 
    8685                 * bug or a feature. */ 
    87                 if (!newpin) 
     86                if (!newpin) { 
     87                        free(gm); 
    8888                        return -EINVAL; 
    89                 gm->gp.newpin[0] = '\0'; 
    90                 strcat(gm->gp.newpin, newpin); 
     89                } 
     90                strcpy(gm->gp.newpin, newpin); 
    9191                break; 
    9292        default: 
  • trunk/src/target/gsm/src/util/pin.c

    r1314 r3545  
    2828#include <libgsmd/pin.h> 
    2929 
     30#include "shell.h" 
     31 
    3032#define PIN_SIZE 8 
    3133 
    32 static char *pin; 
     34static const char *pin; 
    3335static char pinbuf[PIN_SIZE+1]; 
    3436static char pinbuf2[PIN_SIZE+1]; 
    3537 
    36 static int pin_handler(struct lgsm_handle *lh, int evt, struct gsmd_evt_auxdata *aux) 
     38static int pin_handler(struct lgsm_handle *lh, 
     39                int evt, struct gsmd_evt_auxdata *aux) 
    3740{ 
    3841        int rc; 
     
    4043        char *newpin = NULL; 
    4144 
    42         printf("EVENT: PIN request (type='%s') ", lgsm_pin_name(aux->u.pin.type)); 
     45        printf("EVENT: PIN request (type='%s') ", lgsm_pin_name(type)); 
    4346 
    4447        /* FIXME: read pin from STDIN and send it back via lgsm_pin */ 
    4548        if (type == 1 && pin) { 
    4649                printf("Auto-responding with pin `%s'\n", pin); 
    47                 lgsm_pin(lh, type, pin, NULL); 
     50                pending_responses ++; 
     51                return lgsm_pin(lh, type, pin, NULL); 
    4852        } else { 
    4953                do { 
     
    6569                } 
    6670 
     71                pending_responses ++; 
    6772                return lgsm_pin(lh, type, pinbuf, newpin); 
    6873        } 
    69  
    70         return 0; 
    7174} 
    7275 
  • trunk/src/target/gsm/src/util/shell.c

    r3544 r3545  
    4545static int nREADRG = 0; 
    4646 
    47 static int pending_responses = 0; 
     47int pending_responses = 0; 
    4848 
    4949/* this is the handler for receiving passthrough responses */ 
     
    373373        return 0; 
    374374} 
     375 
     376static int pin_msghandler(struct lgsm_handle *lh, struct gsmd_msg_hdr *gmh) 
     377{ 
     378        int result = *(int *) gmh->data; 
     379 
     380        if (result) 
     381                printf("PIN error %i\n", result); 
     382        else 
     383                printf("PIN accepted!\n"); 
     384        pending_responses --; 
     385        return 0; 
     386} 
     387 
     388static const struct msghandler_s { 
     389        int type; 
     390        lgsm_msg_handler *fn; 
     391} msghandlers[] = { 
     392        { GSMD_MSG_PASSTHROUGH, pt_msghandler }, 
     393        { GSMD_MSG_PHONEBOOK,   pb_msghandler }, 
     394        { GSMD_MSG_SMS,         sms_msghandler }, 
     395        { GSMD_MSG_NETWORK,     net_msghandler }, 
     396        { GSMD_MSG_PHONE,       phone_msghandler }, 
     397        { GSMD_MSG_PIN,         pin_msghandler }, 
     398 
     399        { 0, 0 } 
     400}; 
    375401 
    376402static int shell_help(void) 
     
    425451        char *ptr, *fcomma, *lcomma; 
    426452        int gsm_fd = lgsm_fd(lgsmh); 
    427  
    428         lgsm_register_handler(lgsmh, GSMD_MSG_PASSTHROUGH, &pt_msghandler); 
    429         lgsm_register_handler(lgsmh, GSMD_MSG_PHONEBOOK, &pb_msghandler); 
    430         lgsm_register_handler(lgsmh, GSMD_MSG_SMS, &sms_msghandler); 
    431         lgsm_register_handler(lgsmh, GSMD_MSG_NETWORK, &net_msghandler); 
    432         lgsm_register_handler(lgsmh, GSMD_MSG_PHONE, &phone_msghandler); 
     453        const struct msghandler_s *hndl; 
     454 
     455        for (hndl = msghandlers; hndl->fn; hndl ++) 
     456                lgsm_register_handler(lgsmh, hndl->type, hndl->fn); 
    433457 
    434458        fcntl(0, F_SETFD, O_NONBLOCK); 
  • trunk/src/target/gsm/src/util/shell.h

    r3448 r3545  
    1  
    21extern int shell_main(struct lgsm_handle *lgsmh, int sync); 
     2extern int pending_responses; 
Note: See TracChangeset for help on using the changeset viewer.