public SgtTicket requestSgt()

in kerby-kerb/kerb-client/src/main/java/org/apache/kerby/kerberos/kerb/client/impl/AbstractInternalKrbClient.java [136:194]


    public SgtTicket requestSgt(KOptions requestOptions) throws KrbException {
        TgsRequest tgsRequest = null;
        TgtTicket tgtTicket = null;
        if (requestOptions.contains(TokenOption.USER_AC_TOKEN)) {
            tgsRequest = new TgsRequestWithToken(context);
        } else if (requestOptions.contains(KrbOption.USE_TGT)) {
            KOption kOpt = requestOptions.getOption(KrbOption.USE_TGT);
            tgtTicket = (TgtTicket) kOpt.getOptionInfo().getValue();
            tgsRequest = new TgsRequestWithTgt(context, tgtTicket);
        }

        if (tgsRequest == null) {
            throw new IllegalArgumentException(
                    "No valid krb client request option found");
        }

        String serverPrincipalString = fixPrincipal(requestOptions.
                getStringOption(KrbOption.SERVER_PRINCIPAL));
        PrincipalName serverPrincipalName = new PrincipalName(serverPrincipalString);
        PrincipalName clientPrincipalName = null;

        if (tgtTicket != null) {
            String sourceRealm = tgtTicket.getRealm();
            String destRealm = serverPrincipalName.getRealm();
            clientPrincipalName = tgtTicket.getClientPrincipal();

            if (!sourceRealm.equals(destRealm)) {
                KrbConfig krbConfig = krbSetting.getKrbConfig();
                LinkedList<String> capath = krbConfig.getCapath(sourceRealm, destRealm);
                for (int i = 0; i < capath.size() - 1; i++) {
                    PrincipalName tgsPrincipalName = KrbUtil.makeTgsPrincipal(
                        capath.get(i), capath.get(i + 1));
                    tgsRequest.setServerPrincipal(tgsPrincipalName);
                    tgsRequest.setRequestOptions(requestOptions);
                    SgtTicket sgtTicket = doRequestSgt(tgsRequest);
                    sgtTicket.setClientPrincipal(clientPrincipalName);
                    tgsRequest = new TgsRequestWithTgt(context, sgtTicket);
                }
            }

        } else {
            //This code is for the no-tgt case but works only with CLIENT_PRINCIPAL option
            //Should be expanded later to encompass more use-cases
            String clientPrincipalString = (String) requestOptions.getOptionValue(KrbOption.CLIENT_PRINCIPAL);
            if (clientPrincipalString != null) {
                clientPrincipalName = new PrincipalName(clientPrincipalString);
            }
        }

        tgsRequest.setServerPrincipal(serverPrincipalName);
        tgsRequest.setRequestOptions(requestOptions);
        SgtTicket sgtTicket = doRequestSgt(tgsRequest);

        if (clientPrincipalName != null) {
            sgtTicket.setClientPrincipal(clientPrincipalName);
        }

        return sgtTicket;
    }