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

    関数 説明

    saf_exit_add_group

    新規グループをTACFに登録するための顧客環境固有のルールを追加します。

    saf_exit_alter_group

    TACFに登録されたグループを変更するための顧客環境固有のルールを追加します。

    saf_exit_delete_group

    TACFに登録されたグループを削除するための顧客環境固有のルールを追加します。

  • ユーザー関連API

    関数 説明

    saf_exit_add_user

    新規ユーザーをTACFに登録するための顧客環境固有のルールを追加します。

    saf_exit_alter_user

    TACFに登録されたユーザーを変更するための顧客環境固有のルールを追加します。

    saf_exit_delete_user

    TACFに登録されたユーザーを削除するための顧客環境固有のルールを追加します。

  • 接続と接続解除関連API

    関数 説明

    saf_exit_connect

    ユーザーの接続グループを設定するための顧客環境固有のルールを追加します。

    saf_exit_remove

    ユーザーとグループの接続を解除するための顧客環境固有のルールを追加します。

  • パスワード関連API

    関数 説明

    saf_exit_password

    ユーザーのパスワードを登録または変更するための顧客環境固有のルールを追加します。

  • データセット関連API

    関数 説明

    saf_exit_add_dsd

    個別データセット・プロファイルまたは一般データセット・プロファイルをTACFに登録します。

    saf_exit_alter_dsd

    TACFに登録された個別データセット・プロファイルまたは一般データセット・プロファイルを変更します。

    saf_exit_delete_dsd

    TACFに登録された個別データセット・プロファイルまたは一般データセット・プロファイルを削除します。

  • リソース関連API

    関数 説明

    saf_exit_define_resource

    リソース・プロファイルを定義するための顧客環境固有のルールを追加します。

    saf_exit_alter_resource

    リソース・プロファイルを変更するための顧客環境固有のルールを追加します。

    saf_exit_delete_resource

    リソース・プロファイルを削除するための顧客環境固有のルールを追加します。

  • 権限管理関連API

    関数 説明

    saf_exit_permit_access

    特定のユーザーまたはグループにリソースへの権限を付与するための顧客環境固有のルールを追加します。

    saf_exit_permit_delete

    特定のユーザーまたはグループのリソースへの権限を解除するための顧客環境固有のルールを追加します。

2. グループ関連API

新しいグループをTACFに登録・変更・削除するための顧客環境固有のルールを追加するために使用します。TACFに新しいグループのプロファイルを登録・変更・削除するとき、顧客環境固有のルールを確認します。

2.1. saf_exit_add_group

saf_exit_add_group関数は、新しいグループをTACFに登録するための顧客環境固有のルールを追加します。関数を呼び出す前に顧客環境固有のルールを確認してください。

以下の図は、関数の呼び出し時点を示しています。

figure ag
  • プロトタイプ

    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に登録されたグループを変更するための顧客環境固有のルールを追加します。関数を呼び出す前に顧客環境固有のルールを確認してください。

以下の図は、関数の呼び出し時点を示しています。

figure alg
  • プロトタイプ

    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に登録されたグループを削除するための顧客環境固有のルールを追加します。関数を呼び出す前に顧客環境固有のルールを確認してください。

以下の図は、関数の呼び出し時点を示しています。

figure dg
  • プロトタイプ

    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に登録するための顧客環境固有のルールを追加します。

以下の図は、関数の呼び出し時点を示しています。

figure au
  • プロトタイプ

    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に存在するユーザーのプロファイルを変更する前に顧客環境固有のルールを確認します。

以下の図は、関数の呼び出し時点を示しています。

figure alu
  • プロトタイプ

    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に登録されたユーザーを削除するための顧客環境固有のルールを追加します。

以下の図は、関数の呼び出し時点を示しています。

figure dg
  • プロトタイプ

    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

ユーザーを接続するグループを設定するための顧客環境固有のルールを追加します。ユーザーを接続するグループを設定するとき、顧客環境固有のルールを確認します。

以下の図は、関数の呼び出し時点を示しています。

figure co
  • プロトタイプ

    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関数は、ユーザーとグループの接続を解除するための顧客環境固有のルールを追加します。ユーザーの接続を解除する前に顧客環境固有のルールを確認します。

以下の図は、関数の呼び出し時点を示しています。

figure re
  • プロトタイプ

    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コマンドを使用した場合や、ユーザー認証が必要な場合にもパスワードを確認します。

figure saf exit password
  • プロトタイプ

    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に変更するための顧客環境固有のルールを追加します。データセット・プロファイルを変更する前に顧客環境固有のルールを確認します。

以下の図は、関数の呼び出し時点を示しています。

figure ald
  • プロトタイプ

    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から削除するための顧客環境固有のルールを追加します。データセット・プロファイルを削除する前に顧客環境固有のルールを確認します。

以下の図は、関数の呼び出し時点を示しています。

figure dsd
  • プロトタイプ

    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に新しいリソース・プロファイルを登録する前に顧客環境固有のルールを確認します。

以下の図は、関数の呼び出し時点を示しています。

figure rd
  • プロトタイプ

    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関数は、リソース・プロファイルを変更するための顧客環境固有のルールを追加します。リソース・プロファイルを変更する前に顧客環境固有のルールを確認します。

以下の図は、関数の呼び出し時点を示しています。

figure ra
  • プロトタイプ

    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関数は、リソース・プロファイルを削除するための顧客環境固有のルールを追加します。リソース・プロファイルを削除する前に顧客環境固有のルールを確認します。

以下の図は、関数の呼び出し時点を示しています。

figure rde
  • プロトタイプ

    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関数は、特定のユーザーまたはグループにリソースへの権限を付与するための顧客環境固有のルールを追加します。権限を付与する前に顧客環境固有のルールを確認します。

以下の図は、関数の呼び出し時点を示しています。

figure pa
  • プロトタイプ

    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関数は、特定のユーザーまたはグループからリソース権限を削除するための顧客環境固有のルールを追加します。権限を削除する前に顧客環境固有のルールを確認します。

以下の図は、関数の呼び出し時点を示しています。

figure pd
  • プロトタイプ

    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