This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

HTTP Autentication not working (NDK) - TI-RTOS

Other Parts Discussed in Thread: SYSBIOS

Hello Guys,

  I am implementing a HTTP Server in my project and I used the excelente stuff provided by Todd Mullanix (Making a HTTP Server with Ti-RTOS). It works fine and Tood is clear in all slides. I am using TI-RTOS 2.16 with NDK 2.25

  Now I need to put HTTP Basic Authentication in my server, at the root folder. Following the documentation (Apendix E from spru524h.pdf), I configured the Realm 1 and added a user to this. After that, I added just the index.html file to the root folder. The browser asks for user and password but when I provide the credentials, I receive back the window asking again for the credentials. It seeems like the HTTP Server did not like my credentials.

Below the source code. It is pretty straightforward.

Void AddWebFiles(Void) {
    CI_ACCT CA;
    int rc;
    HANDLE hCfg;

    hCfg = CfgNew();
    CfgSetDefault(hCfg);

    hCfg =  CfgGetDefault();

    // Creates the Authorization Realm 1
    rc = CfgAddEntry(hCfg, CFGTAG_SYSINFO, CFGITEM_SYSINFO_REALM1, 0, 7, (UINT8 *)"REALM1", 0);

    strcpy(CA.Username, "admin");
    strcpy(CA.Password, "admin");
    CA.Flags = CFG_ACCTFLG_CH1;		// Adds the user the the Realm 1
    rc = CfgAddEntry(hCfg, CFGTAG_ACCT, CFGITEM_ACCT_REALM, 0, sizeof(CI_ACCT), (UINT8 *)&CA, 0);

    // All files in the root folder are protected by authentication
	efs_createfile("%R%", 4, (UINT8 *)&securityRealm);
	efs_createfile("index.html", INDEX_SIZE, (UINT8 *)INDEX);
}

Any advice will be welcome

Best Regards

Leandro

  • Hi Leandro,
    Can you put a breakpoint in efs_filecheck() which is the function the HTTP server calls to validate the user has access to the requested file. The function takes in the filename, the username, password and realm. Once execution halts there, can you verify if the username/password/realm all match what you set?
    I'll like to see more of your code if you don't mind maybe I can spot something you're doing wrong.

    Best,
    Moses
  • Tks Moses,

    I started an empty project and I added just 2 functions: AddWebFiles and RemoveWebFiles. There is no more changes but I will put the empty.c here.

    By the way, I don't know how to set a breakpoint in the efs_filecheck(). Do I have access to the source code?

    /*
    * Copyright (c) 2015, Texas Instruments Incorporated
    * All rights reserved.
    *
    * Redistribution and use in source and binary forms, with or without
    * modification, are permitted provided that the following conditions
    * are met:
    *
    * * Redistributions of source code must retain the above copyright
    * notice, this list of conditions and the following disclaimer.
    *
    * * Redistributions in binary form must reproduce the above copyright
    * notice, this list of conditions and the following disclaimer in the
    * documentation and/or other materials provided with the distribution.
    *
    * * Neither the name of Texas Instruments Incorporated nor the names of
    * its contributors may be used to endorse or promote products derived
    * from this software without specific prior written permission.
    *
    * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
    * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
    * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
    * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
    * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
    * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
    * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
    * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
    * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
    * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
    * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    */

    /*
    * ======== empty.c ========
    */
    /* XDCtools Header files */
    #include <xdc/std.h>
    #include <xdc/runtime/System.h>

    /* BIOS Header files */
    #include <ti/sysbios/BIOS.h>
    #include <ti/sysbios/knl/Task.h>

    /* TI-RTOS Header files */
    // #include <ti/drivers/EMAC.h>
    #include <ti/drivers/GPIO.h>
    // #include <ti/drivers/I2C.h>
    // #include <ti/drivers/SDSPI.h>
    // #include <ti/drivers/SPI.h>
    // #include <ti/drivers/UART.h>
    // #include <ti/drivers/USBMSCHFatFs.h>
    // #include <ti/drivers/Watchdog.h>
    // #include <ti/drivers/WiFi.h>

    #include <ti/ndk/inc/netmain.h>
    #include "index.h"
    #include "style.h"
    #include "remotta.h"
    #include "scientts.h"
    #include "config.h"
    #include "status.h"

    /* Board Header file */
    #include "Board.h"

    #define TASKSTACKSIZE 512

    Task_Struct task0Struct;
    Char task0Stack[TASKSTACKSIZE];

    /*
    * ======== heartBeatFxn ========
    * Toggle the Board_LED0. The Task_sleep is determined by arg0 which
    * is configured for the heartBeat Task instance.
    */
    Void heartBeatFxn(UArg arg0, UArg arg1)
    {
    while (1) {
    Task_sleep((unsigned int)arg0);
    GPIO_toggle(Board_LED0);
    }
    }

    static int securityRealm = 1;

    Void AddWebFiles(Void) {
    CI_ACCT CA;
    int rc;
    HANDLE hCfg;

    hCfg = CfgNew();
    CfgSetDefault(hCfg);

    hCfg = CfgGetDefault();

    // Creates the Authorization Realm 1
    rc = CfgAddEntry(hCfg, CFGTAG_SYSINFO, CFGITEM_SYSINFO_REALM1, 0, 7, (UINT8 *)"REALM1", 0);

    strcpy(CA.Username, "admin");
    strcpy(CA.Password, "admin");
    CA.Flags = CFG_ACCTFLG_CH1; // Adds the user the the Realm 1
    rc = CfgAddEntry(hCfg, CFGTAG_ACCT, CFGITEM_ACCT_REALM, 0, sizeof(CI_ACCT), (UINT8 *)&CA, 0);

    // All files in the root folder are protected by authentication
    efs_createfile("/%R%", 4, (UINT8 *)&securityRealm);
    efs_createfile("index.html", INDEX_SIZE, (UINT8 *)INDEX);
    }


    Void RemoveWebFiles(Void) {
    efs_destroyfile("index.html");
    }
    /*
    * ======== main ========
    */
    int main(void)
    {
    Task_Params taskParams;

    /* Call board init functions */
    Board_initGeneral();
    Board_initEMAC();
    Board_initGPIO();
    // Board_initI2C();
    // Board_initSDSPI();
    // Board_initSPI();
    // Board_initUART();
    // Board_initUSB(Board_USBDEVICE);
    // Board_initUSBMSCHFatFs();
    // Board_initWatchdog();
    // Board_initWiFi();

    /* Construct heartBeat Task thread */
    Task_Params_init(&taskParams);
    taskParams.arg0 = 1000;
    taskParams.stackSize = TASKSTACKSIZE;
    taskParams.stack = &task0Stack;
    Task_construct(&task0Struct, (Task_FuncPtr)heartBeatFxn, &taskParams, NULL);

    /* Turn on user LED */
    GPIO_write(Board_LED0, Board_LED_ON);

    System_printf("Starting the example\nSystem provider is set to SysMin. "
    "Halt the target to view any SysMin contents in ROV.\n");
    /* SysMin will only print to the console when you call flush or exit */
    System_flush();

    /* Start BIOS */
    BIOS_start();

    return (0);
    }
  • Hi Leandro,

        Looking at your code, one thing that stood out was the lines:

    hCfg = CfgNew();
    CfgSetDefault(hCfg);

    You shouldn't have those. The configuration step that "compiles" your cfg file already generates a hCfg handle for your specific network stack configuration. You don't need to create one but just add to the existing one. The hCfg = CfgGetDefault() line should return the already available cfg handle. I haven't spotted anything else. Give that a try and let me know if it worked.

    Regards,

    Moses

  • Hi Moses,

     I changed the code just performing:

     hCfg =  CfgGetDefault();
    

    as you suggested,. but now I have a null pointer at hCfg. 

    Regards

    L.

  • Hi Moses,

    Taking a look at the example provided by Todd, there are an implementation of all efs_* methods. I think I need to take this step into account and implement my own efs_filecheck method.
    I will do it and as soon as I have results I will let you know.

    Regards,
    Leandro