示例#1
0
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 );
}
示例#2
0
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 );
}