Exemple #1
0
/**
 * Get name component from UPN, Domain\User string, or NAME=VALUE pair.
 *
 * @param logonName Name to parse.
 * @return Name component (Dynamically allocated.)
 */
PSTR GetNameComp(IN PSTR logonName) {
    DWORD dwError = 0;
    PSTR name = NULL;
    int i;

    if(!logonName) {
        goto cleanup;
    }

    for(i = 0; i < strlen(logonName); ++i) {
        if(logonName[i] == '\\') {
            dwError = LwStrDupOrNull(logonName + i + 1, &name);
            ADT_BAIL_ON_ALLOC_FAILURE_NP(!dwError);

            goto cleanup;
        }
    }

    for(i = 0; i < strlen(logonName); ++i) {
        if(logonName[i] == '@') {
            dwError = LwStrndup(logonName, i, &name);
            ADT_BAIL_ON_ALLOC_FAILURE_NP(!dwError);

            goto cleanup;
        }
    }

    for(i = 0; i < strlen(logonName); ++i) {
        if(logonName[i] == '=') {
            dwError = LwStrndup(logonName + i + 1, strlen(logonName + i + 1), &name);
            ADT_BAIL_ON_ALLOC_FAILURE_NP(!dwError);

            goto cleanup;
        }
    }

    for(i = 0; i < strlen(logonName); ++i) {
        if(logonName[i] == '/') {
            dwError = LwAllocateMemory(sizeof(CHAR) * (i + 1), OUT_PPVOID(&name));
            ADT_BAIL_ON_ALLOC_FAILURE_NP(!dwError);

            strncpy(name, (PCSTR) logonName, i);
            goto cleanup;
        }
    }

    dwError = LwStrDupOrNull(logonName, &name);
    ADT_BAIL_ON_ALLOC_FAILURE_NP(!dwError);

    cleanup:
        return name;

    error:
        goto cleanup;
}
Exemple #2
0
DWORD
LsaGetDirectoryFromPath(
    IN PCSTR pszPath,
    OUT PSTR* ppszDir
    )
{
    PCSTR pszLastSlash = NULL;
    PSTR pszDir = NULL;
    DWORD dwError = 0;

    BAIL_ON_INVALID_POINTER(pszPath);

    pszLastSlash = strrchr(pszPath, '/');
    if (pszLastSlash == pszPath)
    {
        //Include the trailing / since this is the root directory ( / )
        pszLastSlash++;
    }

    if (pszLastSlash == NULL)
    {
        dwError = LwAllocateString(
                        ".",
                        &pszDir);
        BAIL_ON_LSA_ERROR(dwError);
    }
    else
    {
        dwError = LwStrndup(
                        pszPath,
                        pszLastSlash - pszPath,
                        &pszDir);
        BAIL_ON_LSA_ERROR(dwError);
    }

    *ppszDir = pszDir;

cleanup:

    return dwError;

error:

    LW_SAFE_FREE_STRING(pszDir);
    *ppszDir = NULL;
    goto cleanup;
}
Exemple #3
0
static
DWORD
EVTStringSplit(
    PCSTR   pszInput,
    PDWORD  pdwCount,
    PSTR**  pppszArray
    )
{
    DWORD  dwError = 0;
    DWORD  dwCount = 0;
    PCSTR  pszStart = NULL;
    PCSTR  pszEnd = NULL;
    PSTR* ppszArray = NULL;
    PSTR pszAdd = NULL;

    for (pszStart = pszInput; *pszStart !=  0; pszStart++)
    {
        if (*pszStart == ',') dwCount++;
    }
    dwCount++;

    dwError = LwAllocateMemory(
                  (dwCount+1)*sizeof(PCSTR),
                  (PVOID *)&ppszArray);

    dwCount = 0;
    pszStart = pszInput;
    while (TRUE)
    {
        pszEnd = strchr(pszStart, ',');
        if ( pszEnd )
        {
            dwError = LwStrndup(
                         pszStart,
                         pszEnd - pszStart,
                         &pszAdd);
            BAIL_ON_EVT_ERROR(dwError);
        }
        else
        {
            dwError = LwAllocateString(
                        pszStart,
                        &pszAdd);
            BAIL_ON_EVT_ERROR(dwError);
        }
        LwStripWhitespace(pszAdd, TRUE, TRUE);
        if (pszAdd[0])
        {
            ppszArray[dwCount++] = pszAdd;
            pszAdd = NULL;
        }
        else
        {
            LW_SAFE_FREE_STRING(pszAdd);
        }

        if (pszEnd)
        {
            pszStart = pszEnd + 1;
        }
        else
        {
            break;
        }
    }

    *pppszArray = ppszArray;
    *pdwCount = dwCount;

cleanup:
    LW_SAFE_FREE_STRING(pszAdd);
    return dwError;

error:
    LwFreeStringArray(
        ppszArray,
        dwCount);
    goto cleanup;
}
DWORD
LsaNISGetNicknames(
    PCSTR         pszNicknameFilePath,
    PDLINKEDLIST* ppNicknameList
    )
{
    typedef enum
    {
        NIS_NICKNAME_ALIAS = 0,
        NIS_NICKNAME_NAME
    } NISNicknameTokenType;
    DWORD dwError = 0;
    PDLINKEDLIST pNicknameList = NULL;
    BOOLEAN bFileExists = FALSE;
    PLSA_NIS_NICKNAME pNickname = NULL;
    FILE* fp = NULL;
    NISNicknameTokenType nextTokenType = NIS_NICKNAME_ALIAS;

    dwError = LsaCheckFileExists(
                    pszNicknameFilePath,
                    &bFileExists);
    BAIL_ON_LSA_ERROR(dwError);

    if (!bFileExists)
    {
        dwError = ERROR_FILE_NOT_FOUND;
        BAIL_ON_LSA_ERROR(dwError);
    }

    fp = fopen(pszNicknameFilePath, "r");
    if (!fp)
    {
        dwError = LwMapErrnoToLwError(errno);
        BAIL_ON_LSA_ERROR(dwError);
    }

    while (1)
    {
        CHAR  szBuf[1024+1];
        PSTR  pszToken = NULL;
        PCSTR pszDelim = " \t\r\n";

        szBuf[0] = '\0';

        if (fgets(szBuf, 1024, fp) == NULL)
        {
            if (feof(fp))
            {
                break;
            }
            else
            {
                dwError = LwMapErrnoToLwError(errno);
                BAIL_ON_LSA_ERROR(dwError);
            }
        }

        LwStripWhitespace(szBuf, TRUE, TRUE);

        if (!szBuf[0] || (szBuf[0] == '#'))
        {
            // skip comments
            continue;
        }

        if ((pszToken = strchr(szBuf, '#')))
        {
            // Skip trailing comments
            *pszToken = '\0';
        }

        pszToken = szBuf;

        if (nextTokenType == NIS_NICKNAME_ALIAS)
        {
            size_t stLen = 0;

            stLen = strcspn(pszToken, pszDelim);
            if (!stLen)
            {
                dwError = LW_ERROR_INTERNAL;
                BAIL_ON_LSA_ERROR(dwError);
            }

            dwError = LwAllocateMemory(
                            sizeof(LSA_NIS_NICKNAME),
                            (PVOID*)&pNickname);
            BAIL_ON_LSA_ERROR(dwError);

            dwError = LwStrndup(
                            pszToken,
                            stLen,
                            &pNickname->pszMapAlias);
            BAIL_ON_LSA_ERROR(dwError);

            // Skip token
            pszToken += stLen;

            stLen = strspn(pszToken, pszDelim);
            if (stLen)
            {
                // Skip delimiter
                pszToken += stLen;
            }

            nextTokenType = NIS_NICKNAME_NAME;
        }

        // The name might appear on the same line
        // Or it might appear on the next line
        if (nextTokenType == NIS_NICKNAME_NAME)
        {
            if (LW_IS_NULL_OR_EMPTY_STR(pszToken))
            {
                continue;
            }

            // The rest of the line is the name
            // we already removed trailing comments
            dwError = LwAllocateString(
                            pszToken,
                            &pNickname->pszMapName);
            BAIL_ON_LSA_ERROR(dwError);

            dwError = LsaDLinkedListAppend(
                            &pNicknameList,
                            pNickname);
            BAIL_ON_LSA_ERROR(dwError);

            pNickname = NULL;

            nextTokenType = NIS_NICKNAME_ALIAS;
        }
    }

    *ppNicknameList = pNicknameList;

cleanup:

    if (fp)
    {
        fclose(fp);
    }

    if (pNickname)
    {
        LsaNISFreeNickname(pNickname);
    }

    return dwError;

error:

    *ppNicknameList = NULL;

    if (pNicknameList)
    {
        LsaNISFreeNicknameList(pNicknameList);
    }

    goto cleanup;
}
static
DWORD
ParseTraceFlagArray(
    PCSTR            pszArg,
    PLSA_TRACE_INFO* ppTraceFlagArray,
    PDWORD           pdwNumFlags
    )
{
    DWORD dwError = 0;
    DWORD dwNumFlags = 0;
    DWORD iFlag = 0;
    size_t sFlagLen = 0;
    PCSTR pszInput = pszArg;
    PLSA_TRACE_INFO pTraceFlagArray = NULL;
    PSTR pszFlagAndValue = NULL;
    PSTR pszFlag = NULL;

    if (*pszArg == ',')
    {
        fprintf(stderr, "Error: Invalid argument [%s]\n", pszArg);
        dwError = LW_ERROR_INVALID_PARAMETER;
        BAIL_ON_LSA_ERROR(dwError);
    }

    // Figure out how many flags there are
    while ((sFlagLen = strcspn(pszInput, ",")) != 0)
    {
          size_t sDelimiterLen = 0;

          pszInput += sFlagLen;

          sDelimiterLen = strspn(pszInput, ",");

          pszInput += sDelimiterLen;

          dwNumFlags++;
    }

    dwError = LwAllocateMemory(
                    dwNumFlags * sizeof(LSA_TRACE_INFO),
                    (PVOID*)&pTraceFlagArray);
    BAIL_ON_LSA_ERROR(dwError);

    pszInput = pszArg;
    while ((sFlagLen = strcspn(pszInput, ",")) != 0)
    {
          size_t sDelimiterLen = 0;
          PCSTR pszIndex = NULL;

          LW_SAFE_FREE_STRING(pszFlagAndValue);

          dwError = LwStrndup(
                        pszInput,
                        sFlagLen,
                        &pszFlagAndValue);
          BAIL_ON_LSA_ERROR(dwError);

          if (!(pszIndex = strchr(pszFlagAndValue, ':')) ||
              LW_IS_NULL_OR_EMPTY_STR(pszIndex+1) ||
              (strcmp(pszIndex+1, "0") && strcmp(pszIndex + 1, "1")))
          {
              fprintf(stderr,
                      "Error: Invalid value specified for trace flag [%s]\n",
                      pszFlagAndValue);

              dwError = LW_ERROR_INVALID_PARAMETER;
              BAIL_ON_LSA_ERROR(dwError);
          }
          else if (pszIndex == pszFlagAndValue)
          {
              fprintf(stderr,
                      "Error: No name specified for trace flag [%s]\n",
                      pszFlagAndValue);

              dwError = LW_ERROR_INVALID_PARAMETER;
              BAIL_ON_LSA_ERROR(dwError);
          }
          else
          {
              PLSA_TRACE_INFO pTraceFlag = NULL;

              LW_SAFE_FREE_STRING(pszFlag);

              dwError = LwStrndup(
                            pszFlagAndValue,
                            (pszIndex - pszFlagAndValue),
                            &pszFlag);
              BAIL_ON_LSA_ERROR(dwError);

              pTraceFlag = &pTraceFlagArray[iFlag];

              dwError = ParseTraceFlag(
                            pszFlag,
                            &pTraceFlag->dwTraceFlag);
              BAIL_ON_LSA_ERROR(dwError);

              pTraceFlag->bStatus = atoi(pszIndex + 1);
          }

          pszInput += sFlagLen;

          sDelimiterLen = strspn(pszInput, ",");

          pszInput += sDelimiterLen;

          iFlag++;
    }

    *ppTraceFlagArray = pTraceFlagArray;
    *pdwNumFlags = dwNumFlags;

cleanup:

    LW_SAFE_FREE_STRING(pszFlag);
    LW_SAFE_FREE_STRING(pszFlagAndValue);

    return dwError;

error:

    *ppTraceFlagArray = NULL;
    *pdwNumFlags = 0;

    LW_SAFE_FREE_MEMORY(pTraceFlagArray);

    goto cleanup;
}
Exemple #6
0
/*
      The following are two example URIs and their component parts:

       foo://example.com:8042/over/there?name=ferret#nose
       \_/   \______________/\_________/ \_________/ \__/
        |           |            |            |        |
     scheme     authority       path        query   fragment
        |   _____________________|__
       / \ /                        \
       urn:example:animal:ferret:nose
*/
DWORD
LwURILdapDecode(
    PCSTR pszURI,
    PSTR *ppszScheme,
    PSTR *ppszAuthority,
    PSTR *ppszPath
    )
{
    DWORD dwError = 0;
    PCSTR pszSchemeStart = NULL;
    PCSTR pszAuthorityStart = NULL;
    PCSTR pszPathStart = NULL;
    PCSTR pszIter = NULL;
    PSTR pszScheme = NULL;
    PSTR pszAuthority = NULL;
    PSTR pszPath = NULL;
    PSTR pszPathURLDecode = NULL;

    pszSchemeStart = pszIter = pszURI;
    if (('a' <= *pszIter && *pszIter <= 'z') ||
        ('A' <= *pszIter && *pszIter <= 'Z'))
    {
        while (('a' <= *pszIter && *pszIter <= 'z') ||
           ('A' <= *pszIter && *pszIter <= 'Z') ||
           ('0' <= *pszIter && *pszIter <= '0') ||
           *pszIter == '+' ||
           *pszIter == '-' ||
           *pszIter == '.' )
        {
            pszIter++;
        }

        dwError = LwStrndup(
                    pszSchemeStart,
                    pszIter - pszSchemeStart,
                    &pszScheme);
        BAIL_ON_LW_ERROR(dwError);
    }
    else
    {
        dwError = LW_ERROR_INTERNAL;
        BAIL_ON_LW_ERROR(dwError);
    }

    if (pszIter[0] != ':' ||
        pszIter[1] != '/' ||
        pszIter[2] != '/')
    {
        dwError = LW_ERROR_INTERNAL;
        BAIL_ON_LW_ERROR(dwError);
    }
    pszIter += 3;

    pszAuthorityStart = pszIter;
    while (*pszIter != '\0' && *pszIter != '/')
    {
        pszIter++;
    }
    if (pszAuthorityStart != pszIter)
    {
        dwError = LwStrndup(
                    pszAuthorityStart,
                    pszIter - pszAuthorityStart,
                    &pszAuthority);
        BAIL_ON_LW_ERROR(dwError);
    }
    else
    {
        dwError = LW_ERROR_INTERNAL;
        BAIL_ON_LW_ERROR(dwError);
    }

    if (*pszIter)
    {
        pszIter++; // Move past separator

        pszPathStart = pszIter;
        while (*pszIter)
        {
            pszIter++;
        }

        if (pszPathStart != pszIter)
        {
            dwError = LwStrndup(
                        pszPathStart,
                        pszIter - pszPathStart,
                        &pszPath);
            BAIL_ON_LW_ERROR(dwError);

            dwError = LwURLDecodeString(pszPath, &pszPathURLDecode);
            BAIL_ON_LW_ERROR(dwError);
        }
        else
        {
            dwError = LW_ERROR_INTERNAL;
            BAIL_ON_LW_ERROR(dwError);
        }
    }

    if (ppszScheme)
    {
        *ppszScheme = pszScheme;
        pszScheme = NULL;
    }

    if (ppszAuthority)
    {
        *ppszAuthority = pszAuthority;
        pszAuthority = NULL;
    }
 
    if (ppszPath)
    {
        *ppszPath = pszPathURLDecode;
        pszPathURLDecode = NULL;
    }

cleanup:

    LW_SAFE_FREE_STRING(pszScheme);
    LW_SAFE_FREE_STRING(pszAuthority);
    LW_SAFE_FREE_STRING(pszPath);
    LW_SAFE_FREE_STRING(pszPathURLDecode);

    return dwError;

error:
    goto cleanup;
}