STATUS gcn_get_auth( GCN_RESOLVE_CB *grcb, GCN_MBUF *mbout ) { char passwd[ 20 ]; /* Need size > ((len + 8) * 2) */ char *m; GCN_MBUF *mbuf; STATUS status; i4 i; /* ** Encrypt the NOUSER password, so the local GCC can decrypt it. */ gcn_login(GCN_VLP_COMSVR, GCN_VLP_V1, TRUE, GCN_NOUSER, GCN_NOPASS, passwd); /* ** Produce the GCN2_RESOLVED message. */ if ( (status = gcn_connect_info( grcb, mbout, GCN_NOUSER, passwd, 0, NULL )) != OK ) return( status ); /* ** Prepare GCN_NS_AUTHORIZE message. */ mbuf = gcn_add_mbuf( mbout, TRUE, &status ); if ( status != OK ) return status; m = mbuf->data; m += gcu_put_int( m, GCN_AUTH_TICKET ); m += gcu_put_str( m, grcb->username ); m += gcu_put_str( m, IIGCn_static.lcl_vnode ); m += gcu_put_str( m, grcb->vnode ); m += gcu_put_int( m, IIGCn_static.ticket_cache_size ); mbuf->used = m - mbuf->data; mbuf->type = GCN_NS_AUTHORIZE; return( OK ); }
static STATUS transform_login( char *ibuff, char *obuff ) { char *pv[ 2 ]; char pbuff[ 128 ], tbuff[ 128 ]; char *pwd, *tmp; i4 len; STATUS status; /* ** Isolate user ID and encrypted password. ** Ensure output buffer is large enough. ** Decrypt the password. */ if ( gcu_words( ibuff, NULL, pv, ',', 2 ) < 2 ) pv[1] = ""; len = STlength( pv[1] ); pwd = (len < sizeof( pbuff )) ? pbuff : (char *)MEreqmem( 0, len + 1, FALSE, NULL ); if ( ! pwd ) status = E_GC0121_GCN_NOMEM; else status = gcn_login( GCN_VLP_CLIENT, 0, FALSE, pv[0], pv[1], pwd ); /* ** Re-encrypt password for storage */ if ( status == OK ) { /* ** Ensure temp buffer is large enough. */ len = (STlength( pwd ) + 8) * 2; tmp = (len < sizeof( tbuff )) ? tbuff : (char *)MEreqmem( 0, len + 1, FALSE, NULL ); if ( ! tmp ) status = E_GC0121_GCN_NOMEM; else status = gcn_login( GCN_VLP_LOGIN, IIGCn_static.pwd_enc_vers, TRUE, pv[0], pwd, tmp ); } /* ** Rebuild the login tuple value. */ if ( status == OK ) { char vers[ 32 ]; STprintf( vers, "V%d", IIGCn_static.pwd_enc_vers ); STpolycat( 5, pv[0], ",", tmp, ",", vers, obuff ); } if ( pwd != pbuff ) MEfree( (PTR)pwd ); if ( tmp != tbuff ) MEfree( (PTR)tmp ); return( status ); }