HTTPサーバーとWeb開発

46. Web からのログインでもユーザー・プロフィールを有効にするには?

HTMLインターフェースのWeb入力では、すべてのユーザーは「QTMHHTP1」という
同じユーザーとなる。ログインしたユーザーに応じてアクセス制限など設けたい場合があったとしても、
すべて「QTMHHTP1」という同じユーザーとなってしまうので、折角、ユーザー別にOS/400の
機密保護を設けていたとしても役には立たなくなる。
一方、ログインしたユーザー名に対してCGI でいちいち CHKOBJ などによって使用権限を
検査するのも大変であるし、当然、漏れが出てくる可能性もある。
既にユーザー別にある程度確立した保護が施されているのであれば、次の2つのAPI
役に立つ。

QSYGETPH ・・・ ユーザーとパスワードを検査して正しければ個別のハンドルを発生させる。
QWTSETP ・・・ 個別ハンドルに対してそのユーザーでの仮想ジョブを開始する。

Enterprise Server の Hostサーバーはマルチ・スレッドJOB としてユーザーからの要求に
待機していて、要求があれば、そのユーザーで対話を開始する。
このとき、Hostサーバーはマルチスレッドであるのでユーザーとの会話の前には既に別のユーザー
としてジョブは開始されているが、ログインされたユーザーに応じてQSYGETPH と QWTSETP
を使用して仮想的にユーザーJOBを開始する。QWTSETP 以降は、ログイン・ユーザーと同じ
機密保護レベル
として振る舞いを開始するのである。
これによって QTMHHTP1 というユーザーであっても QUSER としてWebからログインしたので
あれば、実態は QUSER として CGI は処理を開始することができる。
以下にソースの抜粋を紹介する。
これは実際にHostサーバーに使用されているソースの一部である。

ソースコード
#include <QSYGETPH.h> 
#include <QWTSETP.h>  
   /*[ 子スレッドのジョブの開始 ]*/                           
     err_code.bytes_prov = err_code.bytes_avail = 0;          
     /*[ ログイン・ユーザーとパスワードの検査 ]*/             
     rcv_data[24] = 0x00;                                     
     memcpy(UserID, &rcv_data[4],  10); UserID[10] = 0x00;    
     memcpy(Pwd,    &rcv_data[14], 10); Pwd[10] = 0x00;       
     err = 1;                                                 
     QSYGETPH(UserID, Pwd, PRFHND);                           
     err = 0;                                                 
CHKPWD:                                                       
     if(err == 1){                                            
        GetLastError(2, 1, mysockfd, Java);                   
        memcpy(err_user, UserID, 10);                         
        SendError(5); free(arg);  close(mysockfd);            
        CUR_CLIENT--;                                         
        pthread_exit((void *)NULL); exit(0);}                 
   /*[ 指定したユーザー・プロフィールで JOB を開始する。 ]*/  
     err = 1;                                                 
   #pragma exception_handler(MONMSG, ca, 0, _C2_MH_ESCAPE,   
                                            _CTLA_HANDLE)     
     QWTSETP(PRFHND);