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);