SAF_EXITヘッダー・ファイルとAPI
本章では、ユーザー出口(user-exit)機能を提供するためのヘッダー・ファイルおよびAPIについて説明します。
1. 概要
顧客環境でユーザーIDとパスワードの固有のルールがある場合は、プラグイン形式のSAF_EXITモジュールが提供するインターフェースに合わせて顧客環境固有のAPIを作成すると、TACF内ではそのAPIを呼び出すことになるため、TACF内のモジュールを修正することなく、お客さま固有の業務を適用することができます。
以下は、使用中の関数名をTACFで使用する関数名に置き換える例です。
/* -------------------------- compatible API switch ------------------------- */ #define SAF_EXIT_IMPL_NAME_LEN 31 typedef struct { /* identification */ char saf_exit_impl_name[SAF_EXIT_IMPL_NAME_LEN + 1]; int saf_exit_version; /* group management */ int (*saf_exit_add_group_entry)(char *aceeusri, char *groupname, char *owner, char *supgroup); int (*saf_exit_alter_group_entry)(char *aceeusri, char *groupname, char *owner, char *supgroup); int (*saf_exit_delete_group_entry)(char *aceeusri, char *groupname); /* user management */ int (*saf_exit_add_user_entry)(char *aceeusri, char *userid, char *owner, char *dfltgrp); int (*saf_exit_alter_user_entry)(char *aceeusri, char *userid, char *owner, char *dfltgrp); int (*saf_exit_delete_user_entry)(char *aceeusri, char *userid); /* connect & remove */ int (*saf_exit_connect_entry)(char *aceeusri, char *userid, char *groupname, char *owner); int (*saf_exit_remove_entry)(char *aceeusri, char *userid, char *groupname, char *owner); /* password check */ int (*saf_exit_password_entry)(char *userid, char *password, int count, char *history[]); /* dataset management */ int (*saf_exit_add_dsd_entry)(char *aceeusri, char *profname, char *owner, char *notify); int (*saf_exit_alter_dsd_entry)(char *aceeusri, char *profname, char *owner, char *notify); int (*saf_exit_delete_dsd_entry)(char *aceeusri, char *profname); /* resource management */ int (*saf_exit_define_resource_entry)(char *aceeusri, char *classname, char *profname, char *owner, char *notify); int (*saf_exit_alter_resource_entry)(char *aceeusri, char *classname, char *profname, char *owner, char *notify); int (*saf_exit_delete_resource_entry)(char *aceeusri, char *classname, char *profname); /* permission management */ int (*saf_exit_permit_access_entry)(char *aceeusri, char *classname, char *profname, char *access, char *id, char *reset); int (*saf_exit_permit_delete_entry)(char *aceeusri, char *classname, char *profname, char *id, char *reset); } saf_exit_switch_t;
以下は、ヘッダー・ファイルのAPIについての説明です。各関数についての詳細は、該当の節を参照してください。
-
グループ関連API
関数 説明 新規グループをTACFに登録するための顧客環境固有のルールを追加します。
TACFに登録されたグループを変更するための顧客環境固有のルールを追加します。
TACFに登録されたグループを削除するための顧客環境固有のルールを追加します。
-
ユーザー関連API
関数 説明 新規ユーザーをTACFに登録するための顧客環境固有のルールを追加します。
TACFに登録されたユーザーを変更するための顧客環境固有のルールを追加します。
TACFに登録されたユーザーを削除するための顧客環境固有のルールを追加します。
-
接続と接続解除関連API
関数 説明 ユーザーの接続グループを設定するための顧客環境固有のルールを追加します。
ユーザーとグループの接続を解除するための顧客環境固有のルールを追加します。
-
パスワード関連API
関数 説明 ユーザーのパスワードを登録または変更するための顧客環境固有のルールを追加します。
-
データセット関連API
関数 説明 個別データセット・プロファイルまたは一般データセット・プロファイルをTACFに登録します。
TACFに登録された個別データセット・プロファイルまたは一般データセット・プロファイルを変更します。
TACFに登録された個別データセット・プロファイルまたは一般データセット・プロファイルを削除します。
-
リソース関連API
関数 説明 リソース・プロファイルを定義するための顧客環境固有のルールを追加します。
リソース・プロファイルを変更するための顧客環境固有のルールを追加します。
リソース・プロファイルを削除するための顧客環境固有のルールを追加します。
-
権限管理関連API
関数 説明 特定のユーザーまたはグループにリソースへの権限を付与するための顧客環境固有のルールを追加します。
特定のユーザーまたはグループのリソースへの権限を解除するための顧客環境固有のルールを追加します。
2. グループ関連API
新しいグループをTACFに登録・変更・削除するための顧客環境固有のルールを追加するために使用します。TACFに新しいグループのプロファイルを登録・変更・削除するとき、顧客環境固有のルールを確認します。
2.1. saf_exit_add_group
saf_exit_add_group関数は、新しいグループをTACFに登録するための顧客環境固有のルールを追加します。関数を呼び出す前に顧客環境固有のルールを確認してください。
以下の図は、関数の呼び出し時点を示しています。

-
プロトタイプ
saf_exit_add_group(aceeusri, groupname, owner, supgroup) (*(saf_exit_sw.saf_exit_add_group_entry))(aceeusri, groupname, owner, supgroup)
-
パラメータ
パラメータ 説明 aceeusri
ログインしたユーザーのユーザーIDです。
groupname
追加するグループのグループ名です。
owner
追加するグループ所有者のユーザーIDまたはグループ名です。
supgroup
追加するグループの上位グループです。
2.2. saf_exit_alter_group
saf_exit_alter_group関数は、TACFに登録されたグループを変更するための顧客環境固有のルールを追加します。関数を呼び出す前に顧客環境固有のルールを確認してください。
以下の図は、関数の呼び出し時点を示しています。

-
プロトタイプ
saf_exit_alter_group(aceeusri, groupname, owner, supgroup) (*(saf_exit_sw.saf_exit_alter_group_entry))(aceeusri, groupname, owner, supgroup)
-
パラメータ
パラメータ 説明 aceeusri
ログインしたユーザーのユーザーIDです。
groupname
変更するグループのグループ名です。
owner
変更するグループ所有者のユーザーIDまたはグループ名です。
supgroup
変更するグループの上位グループです。
2.3. saf_exit_delete_group
saf_exit_delete_group関数は、TACFに登録されたグループを削除するための顧客環境固有のルールを追加します。関数を呼び出す前に顧客環境固有のルールを確認してください。
以下の図は、関数の呼び出し時点を示しています。

-
プロトタイプ
saf_exit_delete_group(aceeusri, groupname) (*(saf_exit_sw.saf_exit_delete_group_entry))(aceeusri, groupname)
-
パラメータ
パラメータ 説明 aceeusri
ログインしたユーザーのユーザーIDです。
groupname
変更するグループのグループ名です。
3. ユーザー関連API
新しいユーザーをTACFに登録・変更・削除するための顧客環境固有のルールを追加するために使用します。
3.1. saf_exit_add_user
saf_exit_add_user関数は、新しいユーザーをTACFに登録するための顧客環境固有のルールを追加します。
以下の図は、関数の呼び出し時点を示しています。

-
プロトタイプ
saf_exit_add_user(aceeusri, userid, owner, dfltgrp) (*(saf_exit_sw.saf_exit_add_user_entry))(aceeusri, userid, owner, dfltgrp)
-
パラメータ
パラメータ 説明 aceeusri
ログインしたユーザーのユーザーIDです。
userid
追加するユーザーのユーザーIDです。
owner
追加するユーザー・プロファイル所有者のユーザーIDまたはグループ名です。
dfltgrp
追加するグループのデフォルト・グループです。
3.2. saf_exit_alter_user
saf_exit_alter_user関数は、TACFに登録されたユーザーを変更するための顧客環境固有のルールを追加します。TACFに存在するユーザーのプロファイルを変更する前に顧客環境固有のルールを確認します。
以下の図は、関数の呼び出し時点を示しています。

-
プロトタイプ
saf_exit_alter_user(aceeusri, userid, owner, dfltgrp) (*(saf_exit_sw.saf_exit_alter_user_entry))(aceeusri, userid, owner, dfltgrp)
-
パラメータ
パラメータ 説明 aceeusri
ログインしたユーザーのユーザーIDです。
userid
変更するユーザーのユーザーIDです。
owner
変更するユーザー・プロファイル所有者のユーザーIDまたはグループ名です。
dfltgrp
変更するグループのデフォルト・グループです。
3.3. saf_exit_delete_user
saf_exit_delete_user関数は、TACFに登録されたユーザーを削除するための顧客環境固有のルールを追加します。
以下の図は、関数の呼び出し時点を示しています。

-
プロトタイプ
saf_exit_add_user(acee, userid, owner, dfltgrp) (*(saf_exit_sw.saf_exit_add_user_entry))(aceeusri, userid, owner, dfltgrp)
-
パラメータ
パラメータ 説明 aceeusri
ログインしたユーザーのユーザーIDです。
userid
削除するユーザーのユーザーIDです。
4. 接続および接続解除関連API
ユーザーを接続するグループの設定・解除のための顧客環境固有のルールを追加するために使用します。
4.1. saf_exit_connect
ユーザーを接続するグループを設定するための顧客環境固有のルールを追加します。ユーザーを接続するグループを設定するとき、顧客環境固有のルールを確認します。
以下の図は、関数の呼び出し時点を示しています。

-
プロトタイプ
saf_exit_connect(aceeusri, userid, groupname, owner) (*(saf_exit_sw.saf_exit_connect_entry))(aceeusri, userid, groupname, owner)
-
パラメータ
パラメータ 説明 aceeusri
ログインしたユーザーのユーザーIDです。
userid
特定のグループに接続されるユーザーのユーザーIDです。
groupname
特定のユーザーと接続されるグループ名です。
owner
特定のユーザーと接続されるグループ・プロファイル所有者のユーザーIDまたはグループ名です。
4.2. saf_exit_remove
saf_exit_remove関数は、ユーザーとグループの接続を解除するための顧客環境固有のルールを追加します。ユーザーの接続を解除する前に顧客環境固有のルールを確認します。
以下の図は、関数の呼び出し時点を示しています。

-
プロトタイプ
saf_exit_remove(aceeusri, userid, groupname, owner) (*(saf_exit_sw.saf_exit_remove_entry))(aceeusri, userid, groupname, owner)
-
パラメータ
パラメータ 説明 aceeusri
ログインしたユーザーのユーザーIDです。
userid
特定のグループとの接続を解除するユーザーのユーザーIDです。
groupname
特定のユーザーとの接続を解除するグループ名です。
owner
特定のユーザーとの接続を解除するグループ・プロファイル所有者のユーザーIDまたはグループ名です。
5. パスワード関連API
ユーザーのパスワードを登録または変更するための顧客環境固有のルールを追加するために使用します。
5.1. saf_exit_password
saf_exit_password関数は、ユーザーのパスワードを登録または変更するための顧客環境固有のルールを追加します。ユーザーのパスワードを設定する前に顧客環境固有のルールを確認します。
以下の図は、関数の呼び出し時点を示しています。tacfmgrのPASSWORDコマンドによって呼び出されることもありますが、ALTUSERコマンドを使用した場合や、ユーザー認証が必要な場合にもパスワードを確認します。

-
プロトタイプ
saf_exit_password(userid, password, count, history) (*(saf_exit_sw.saf_exit_password_entry))(userid, password, count, history)
-
パラメータ
パラメータ 説明 userid
ログインしたユーザーのユーザーIDです。
password
変更する新しいパスワードです。
count
パスワードが変更された回数です。
history
変更前に使用したパスワードの履歴です。
6. データセット関連API
個別データセット・プロファイルや一般データセット・プロファイルをTACFに登録・変更・削除するための顧客環境固有のルールを追加するために使用します。
6.1. saf_exit_add_dsd
saf_exit_add_dsd関数は、個別データセット・プロファイルまたは一般データセット・プロファイルをTACFに登録するための顧客環境固有のルールを追加します。TACFに新しいデータセット・プロファイルを追加する前に顧客環境固有のルールを確認します。
以下の図は、関数の呼び出し時点を示しています。

-
プロトタイプ
saf_exit_add_dsd(aceeusri, profname, owner, notify) (*(saf_exit_sw.saf_exit_add_dsd_entry))(aceeusri, profname, owner, notify)
-
パラメータ
パラメータ 説明 aceeusri
ログインしたユーザーのユーザーIDです。
profname
登録するデータセットのプロファイル名です。
owner
登録するデータセットのプロファイル所有者のユーザーIDまたはグループ名です。
notify
データセットへのアクセス拒否を通知するユーザーIDです。
6.2. saf_exit_alter_dsd
saf_exit_alter_dsd関数は、個別データセット・プロファイルまたは一般データセット・プロファイルをTACFに変更するための顧客環境固有のルールを追加します。データセット・プロファイルを変更する前に顧客環境固有のルールを確認します。
以下の図は、関数の呼び出し時点を示しています。

-
プロトタイプ
saf_exit_alter_dsd(aceeusri, profname, owner, notify) (*(saf_exit_sw.saf_exit_alter_dsd_entry))(aceeusri, profname, owner, notify)
-
パラメータ
パラメータ 説明 aceeusri
ログインしたユーザーのユーザーIDです。
profname
変更するデータセットのプロファイル名です。
owner
変更するデータセットのプロファイル所有者のユーザーIDまたはグループ名です。
notify
データセットへのアクセス拒否を通知するユーザーIDです。
6.3. saf_exit_delete_dsd
saf_exit_delete_dsd関数は、個別データセット・プロファイルまたは一般データセット・プロファイルをTACFから削除するための顧客環境固有のルールを追加します。データセット・プロファイルを削除する前に顧客環境固有のルールを確認します。
以下の図は、関数の呼び出し時点を示しています。

-
プロトタイプ
saf_exit_delete_dsd(aceeusri, profname) (*(saf_exit_sw.saf_exit_delete_dsd_entry))(aceeusri, profname)
-
パラメータ
パラメータ 説明 aceeusri
ログインしたユーザーのユーザーIDです。
groupname
削除するデータセットのプロファイル名です。
7. リソース関連API
リソース・プロファイルを定義・変更・削除するための顧客環境固有のルールを追加するために使用します。
7.1. saf_exit_define_resource
saf_exit_define_resource関数は、リソース・プロファイルを定義するための顧客環境固有のルールを追加します。TACFに新しいリソース・プロファイルを登録する前に顧客環境固有のルールを確認します。
以下の図は、関数の呼び出し時点を示しています。

-
プロトタイプ
saf_exit_define_resource(aceeusri, classname, profname, owner, notify) (*(saf_exit_sw.saf_exit_define_resource_entry))(aceeusri, classname, profname, owner, notify)
-
パラメータ
パラメータ 説明 aceeusri
ログインしたユーザーのユーザーIDです。
classname
追加するリソース・プロファイルのクラス名です。
owner
登録するリソースのプロファイル所有者のユーザーIDまたはグループ名です。
notify
リソースへのアクセス拒否を通知するユーザーIDです。
7.2. saf_exit_alter_resource
saf_exit_alter_resource関数は、リソース・プロファイルを変更するための顧客環境固有のルールを追加します。リソース・プロファイルを変更する前に顧客環境固有のルールを確認します。
以下の図は、関数の呼び出し時点を示しています。

-
プロトタイプ
saf_exit_alter_resource(aceeusri, classname, profname, owner, notify) (*(saf_exit_sw.saf_exit_alter_resource_entry))(aceeusri, classname, profname, owner, notify)
-
パラメータ
パラメータ 説明 aceeusri
ログインしたユーザーのユーザーIDです。
classname
変更するリソース・プロファイルのクラス名です。
owner
変更するリソース・プロファイル所有者のユーザーIDまたはグループ名です。
notify
リソースへのアクセス拒否を通知するユーザーIDです。
7.3. saf_exit_delete_resource
saf_exit_delete_resource関数は、リソース・プロファイルを削除するための顧客環境固有のルールを追加します。リソース・プロファイルを削除する前に顧客環境固有のルールを確認します。
以下の図は、関数の呼び出し時点を示しています。

-
プロトタイプ
saf_exit_delete_resource(aceeusri, classname, profname) (*(saf_exit_sw.saf_exit_delete_resource_entry))(aceeusri, classname, profname)
-
パラメータ
パラメータ 説明 aceeusri
ログインしたユーザーのユーザーIDです。
classname
削除するリソース・プロファイルのクラス名です。
profname
削除するリソースのプロファイル名です。
8. 権限管理関連API
特定のユーザーまたはグループにリソースへの権限を付与および削除するための顧客環境固有のルールを追加するために使用します。
8.1. saf_exit_permit_access
saf_exit_permit_access関数は、特定のユーザーまたはグループにリソースへの権限を付与するための顧客環境固有のルールを追加します。権限を付与する前に顧客環境固有のルールを確認します。
以下の図は、関数の呼び出し時点を示しています。

-
プロトタイプ
saf_exit_permit_access(aceeusri, classname, profname, access, id, reset) (*(saf_exit_sw.saf_exit_permit_access_entry))(aceeusri, classname, profname, access, id, reset)
-
パラメータ
パラメータ 説明 aceeusri
ログインしたユーザーのユーザーIDです。
classname
権限が付与されるリソースのクラス名です。
profname
権限が付与されるリソースのプロファイル名です。
access
付与するアクセス権限のレベルです。
id
アクセス権限が付与されるユーザーのユーザーIDです。
reset
プロファイルのアクセス・リストの削除レベルです。
8.2. saf_exit_permit_delete
saf_exit_permit_delete関数は、特定のユーザーまたはグループからリソース権限を削除するための顧客環境固有のルールを追加します。権限を削除する前に顧客環境固有のルールを確認します。
以下の図は、関数の呼び出し時点を示しています。

-
プロトタイプ
saf_exit_permit_delete(aceeusri, classname, profname, id, reset) (*(saf_exit_sw.saf_exit_permit_delete_entry))(aceeusri, classname, profname, id, reset)
-
パラメータ
パラメータ 説明 aceeusri
ログインしたユーザーのユーザーIDです。
classname
権限を削除するリソースのクラス名です。
profname
権限を削除するリソースのプロファイル名です。
id
権限を失うユーザーのユーザーIDです。
reset
プロファイルのアクセス・リストの削除レベルです。
9. サンプル・コード
以下は、saf_exit.cの例です。この例では、パスワードにのみユーザー・ルールが作成されています。その他の項目は、ルールなしで通過させます。
<saf_exit.c>
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "saf_exit.h" /* group management */ /* customerをお客様の社名に置き換えて使用することができます。 */ int customer_saf_exit_add_group(char *aceeusri, char *groupname, char *owner, char *supgroup); int customer_saf_exit_alter_group(char *aceeusri, char *groupname, char *owner, char *supgroup); int customer_saf_exit_delete_group(char *aceeusri, char *groupname); ... (中略) /* user management, connect & remove は省略します。 */ ... /* password check */ int customer_saf_exit_password(char *userid, char *password, int count, char *history[]); ... (中略) /* dataset management, resource management も省略します。 */ ... /* permission management */ int customer_saf_exit_permit_access(char *aceeusri, char *classname, char *profname, char *access, char *id, char *reset); int customer_saf_exit_permit_delete(char *aceeusri, char *classname, char *profname, char *id, char *reset); /* compatible API switch */ saf_exit_switch_t saf_exit_sw = { /* identification */ "CUSTOMER SAF EXIT", 1, /* group management */ customer_saf_exit_add_group, customer_saf_exit_alter_group, customer_saf_exit_delete_group, /* user management */ customer_saf_exit_add_user, customer_saf_exit_alter_user, customer_saf_exit_delete_user, /* connect & remove */ customer_saf_exit_connect, customer_saf_exit_remove, /* password check */ customer_saf_exit_password, /* dataset management */ customer_saf_exit_add_dsd, customer_saf_exit_alter_dsd, customer_saf_exit_delete_dsd, /* resource management */ customer_saf_exit_define_resource, customer_saf_exit_alter_resource, customer_saf_exit_delete_resource, /* permission management */ customer_saf_exit_permit_access, customer_saf_exit_permit_delete, }; /******************************************************************************/ /* group management */ /******************************************************************************/ int customer_saf_exit_add_group(char *aceeusri, char *groupname, char *owner, char *supgroup) { return 0; } int customer_saf_exit_alter_group(char *aceeusri, char *groupname, char *owner, char *supgroup) { return 0; } int customer_saf_exit_delete_group(char *aceeusri, char *groupname) { return 0; } ... (中略) ... /******************************************************************************/ /* password check */ /******************************************************************************/ int customer_saf_exit_password(char *userid, char *password, int count, char *history[]) { int i; /* check if password length is greater than 4 */ /* パスワードの長さは4以上である必要があります。 */ /* ユーザー・ルールに違反した場合は、-1を返します。 */ if( strlen(password) <= 4 ) return -1; /* check if password is not same as userid */ /* ユーザーIDとパスワードは同じものを使用できません。 */ if( ! strcmp(password, userid) ) return -1; /* check if password is not used before */ /* 過去に使用されたことのあるパスワードかどうかを確認します。*/ for( i = 0; i < count; i++ ) { if( ! strcmp(password, history[i]) ) return -1; } /* return success code */ /* すべてのユーザー規約を満たした場合、0を返します。 */ return 0; } ... (中略) ... /******************************************************************************/ /* permission management */ /******************************************************************************/ int customer_saf_exit_permit_access(char *aceeusri, char *classname, char *profname, char *access, char *id, char *reset) { return 0; } int customer_saf_exit_permit_delete(char *aceeusri, char *classname, char *profname, char *id, char *reset) { return 0; }
注意事項
saf_exit.cファイルを共有オブジェクト形式でコンパイルした後、以下のように$OPENFRAME_HOME/lib/libsafexit.sl(または$OPENFRAME_HOME/lib/libsafexit.so)にリンクさせます。
ln -s libsafexit_openframe.sl libsafexit.sl