# module Veritrans::Tercerog::Mdk::MdkUtils

MdkUtils 共通ユーティリティモジュール

### Constants

DFAULT_ENCODE

  デフォルトエンコード

### Public Class Methods

mdk_base64_encode(data) click to toggle source

### 引数のデータをbase64エンコード（SAFE URL）した結果を返します。¶ ↑

@param

  data 対象データ

@return

  base64エンコード後のデータ（改行なし）

    # File tgMdk/lib/tg_mdk/mdk_utils.rb, line 114
    def mdk_base64_encode(data)
      [data].pack('m').gsub('/', '-').gsub('+', '_').gsub('=', '*').gsub(/\n/, '')
    end

mdk_delete_r_n(data) click to toggle source

### 引数のデータから改行コードを取り除いた値を返す¶ ↑

@param

  data 対象データ

@return

  改行を取り除いたデータ

    # File tgMdk/lib/tg_mdk/mdk_utils.rb, line 124
    def mdk_delete_r_n(data)
      tmp = data.gsub("\r\n", "")
      tmp = tmp.gsub("\n", "")
      tmp
    end

mdk_digest(data) click to toggle source

### 引数データのダイジェストを取得して、返却します。¶ ↑

@param

  data ダイジェスト取得対象データ

@return

  ダイジェスト（16進文字列）

    # File tgMdk/lib/tg_mdk/mdk_utils.rb, line 92
    def mdk_digest(data)
      digest_algorithm = Veritrans::Tercerog::Mdk::MdkConfig.instance.message_digest_type
      OpenSSL::Digest.hexdigest(digest_algorithm, data)
    end

mdk_encode(to, from, str) click to toggle source

### 与えられた文字コードにしたがって文字列を変換し、その結果を文字列として返す。¶ ↑

@param

  to 変換先の文字コード

@param

  from 変換前の文字コード

@param

  str 変換したい文字列

@return

  結果文字列

    # File tgMdk/lib/tg_mdk/mdk_utils.rb, line 31
    def mdk_encode(to, from, str)

      if str.nil?
        return str
      end

      unless /^([0-9^.]+).([^.]+).([^.]+)/m =~ RUBY_VERSION
        return str
      end

      major = $1.to_i
      if 2 <= major
        return str.encode(to, from)
      else
        return Iconv.conv(to, from, str)
      end
    end

mdk_encode_from(enc, str) click to toggle source

### 与えられた文字コードで構成された文字列をMDKで扱える文字コード(UTF-8)に変換して返す。¶ ↑

引数に文字コードが空の場合は変換処理が行われない。

@param

  enc 変換前の文字コード

@param

  str 変換したい文字列

@return

  結果文字列(UTF-8)

    # File tgMdk/lib/tg_mdk/mdk_utils.rb, line 57
    def mdk_encode_from(enc, str)

      if !str.nil? && !enc.nil? && enc.to_s.upcase != DFAULT_ENCODE
        # エンコードが指定されている場合
        return self::mdk_encode(DFAULT_ENCODE, enc, str)
      else
        return str
      end
    end

mdk_encode_to(enc, str) click to toggle source

### 与えられた文字コードにしたがって文字列を変換し、その結果を文字列として返す。¶ ↑

尚、引数に指定する文字列の文字コードはUTF-8であることを前提としている。 また、引数に文字コードが空の場合は変換処理が行われない。

@param

  enc 変換後の文字コード

@param

  str 変換したい文字列

@return

  結果文字列

    # File tgMdk/lib/tg_mdk/mdk_utils.rb, line 76
    def mdk_encode_to(enc, str)

      if !str.nil? && !enc.nil? && enc.to_s.upcase != DFAULT_ENCODE
        # エンコードが指定されている場合
        return self::mdk_encode(enc, DFAULT_ENCODE, str)
      else
        return str
      end
    end

mdk_gmtime() click to toggle source

### 現在日時(例：20000101010101000)をグリニッジ標準時間で取得する¶ ↑

@return

  グリニッジ標準時間の現在日時

    # File tgMdk/lib/tg_mdk/mdk_utils.rb, line 102
    def mdk_gmtime
      Time.now.gmtime.instance_eval {
        '%s%03d' % [strftime('%Y%m%d%H%M%S'), (usec / 1000.0).round]
      }
    end

mdk_mask_json(json) click to toggle source

### JSON文字列のマスク化を行う。¶ ↑

マスク対象項目は、内部設定ファイルで定義されているMASK_ITEMに設定されている値が対象となる。
値をアスタリスクで全置換する以外のマスクを必要とするならば、当該メソッドを修正する必要がある。
[マスク内容]
・defaultとしては全桁アスタリスクでマスク
・カード番号の場合は上位4桁マスク
・文字列mailaddr(大文字小文字問わない)を含む場合は@までをアスタリスクでマスク

@param

  json JSONの文字列

@return

  マスク化されたJSONの文字列

    # File tgMdk/lib/tg_mdk/mdk_utils.rb, line 143
    def mdk_mask_json(json)

      if json.nil?
        return nil
      end

      masked_json = json
      masked_json = "" unless "".instance_of?(json.class)

      # コンフィグクラス生成
      config = Veritrans::Tercerog::Mdk::MdkConfig.instance
      # マスク項目を大文字化して取得
      mask_item_list = config[:MASK_ITEM].upcase.split(",")

      mask_item_list.each do |candidate|
        if candidate.include?("MAILADDR")
          masked_json.gsub!(/(\"#{candidate}\":\"[\s]*)([^@]*)(@[^\"]*\")/mi) do |target|
            s1 = $1
            s2 = $2
            s3 = $3

            s1.gsub!(/-/m, "")
            s2.gsub!(/-/m, "")
            s2.gsub!(/./m ,"*")
            s3.gsub!(/-/m, "")
            "#{s1}#{s2}#{s3}"
          end
        elsif candidate.include?("CARDNUMBER") or candidate == "JCNTOKEN" or candidate == "JCNTOKENMEMBERNUM"
          masked_json.gsub!(/(\"#{candidate}\":[\s]*\"[^\"]{6})([^\"]*)([^\"]{2}\")/mi) do |target|
            s1 = $1
            s2 = $2
            s3 = $3

            s2.gsub!(/./m ,"*")
            "#{s1}#{s2}#{s3}"
          end
        else
          masked_json.gsub!(/(\"#{candidate}\":[\s]*\")([^\"]*)(\")/mi) do |target|
            s1 = $1
            s2 = $2
            s3 = $3

            s2.gsub!(/./m ,"*")
            "#{s1}#{s2}#{s3}"
          end
        end
      end

      return masked_json
    end

### Private Instance Methods

mdk_base64_encode(data) click to toggle source

### 引数のデータをbase64エンコード（SAFE URL）した結果を返します。¶ ↑

@param

  data 対象データ

@return

  base64エンコード後のデータ（改行なし）

    # File tgMdk/lib/tg_mdk/mdk_utils.rb, line 114
    def mdk_base64_encode(data)
      [data].pack('m').gsub('/', '-').gsub('+', '_').gsub('=', '*').gsub(/\n/, '')
    end

mdk_delete_r_n(data) click to toggle source

### 引数のデータから改行コードを取り除いた値を返す¶ ↑

@param

  data 対象データ

@return

  改行を取り除いたデータ

    # File tgMdk/lib/tg_mdk/mdk_utils.rb, line 124
    def mdk_delete_r_n(data)
      tmp = data.gsub("\r\n", "")
      tmp = tmp.gsub("\n", "")
      tmp
    end

mdk_digest(data) click to toggle source

### 引数データのダイジェストを取得して、返却します。¶ ↑

@param

  data ダイジェスト取得対象データ

@return

  ダイジェスト（16進文字列）

    # File tgMdk/lib/tg_mdk/mdk_utils.rb, line 92
    def mdk_digest(data)
      digest_algorithm = Veritrans::Tercerog::Mdk::MdkConfig.instance.message_digest_type
      OpenSSL::Digest.hexdigest(digest_algorithm, data)
    end

mdk_encode(to, from, str) click to toggle source

### 与えられた文字コードにしたがって文字列を変換し、その結果を文字列として返す。¶ ↑

@param

  to 変換先の文字コード

@param

  from 変換前の文字コード

@param

  str 変換したい文字列

@return

  結果文字列

    # File tgMdk/lib/tg_mdk/mdk_utils.rb, line 31
    def mdk_encode(to, from, str)

      if str.nil?
        return str
      end

      unless /^([0-9^.]+).([^.]+).([^.]+)/m =~ RUBY_VERSION
        return str
      end

      major = $1.to_i
      if 2 <= major
        return str.encode(to, from)
      else
        return Iconv.conv(to, from, str)
      end
    end

mdk_encode_from(enc, str) click to toggle source

### 与えられた文字コードで構成された文字列をMDKで扱える文字コード(UTF-8)に変換して返す。¶ ↑

引数に文字コードが空の場合は変換処理が行われない。

@param

  enc 変換前の文字コード

@param

  str 変換したい文字列

@return

  結果文字列(UTF-8)

    # File tgMdk/lib/tg_mdk/mdk_utils.rb, line 57
    def mdk_encode_from(enc, str)

      if !str.nil? && !enc.nil? && enc.to_s.upcase != DFAULT_ENCODE
        # エンコードが指定されている場合
        return self::mdk_encode(DFAULT_ENCODE, enc, str)
      else
        return str
      end
    end

mdk_encode_to(enc, str) click to toggle source

### 与えられた文字コードにしたがって文字列を変換し、その結果を文字列として返す。¶ ↑

尚、引数に指定する文字列の文字コードはUTF-8であることを前提としている。 また、引数に文字コードが空の場合は変換処理が行われない。

@param

  enc 変換後の文字コード

@param

  str 変換したい文字列

@return

  結果文字列

    # File tgMdk/lib/tg_mdk/mdk_utils.rb, line 76
    def mdk_encode_to(enc, str)

      if !str.nil? && !enc.nil? && enc.to_s.upcase != DFAULT_ENCODE
        # エンコードが指定されている場合
        return self::mdk_encode(enc, DFAULT_ENCODE, str)
      else
        return str
      end
    end

mdk_gmtime() click to toggle source

### 現在日時(例：20000101010101000)をグリニッジ標準時間で取得する¶ ↑

@return

  グリニッジ標準時間の現在日時

    # File tgMdk/lib/tg_mdk/mdk_utils.rb, line 102
    def mdk_gmtime
      Time.now.gmtime.instance_eval {
        '%s%03d' % [strftime('%Y%m%d%H%M%S'), (usec / 1000.0).round]
      }
    end

mdk_mask_json(json) click to toggle source

### JSON文字列のマスク化を行う。¶ ↑

マスク対象項目は、内部設定ファイルで定義されているMASK_ITEMに設定されている値が対象となる。
値をアスタリスクで全置換する以外のマスクを必要とするならば、当該メソッドを修正する必要がある。
[マスク内容]
・defaultとしては全桁アスタリスクでマスク
・カード番号の場合は上位4桁マスク
・文字列mailaddr(大文字小文字問わない)を含む場合は@までをアスタリスクでマスク

@param

  json JSONの文字列

@return

  マスク化されたJSONの文字列

    # File tgMdk/lib/tg_mdk/mdk_utils.rb, line 143
    def mdk_mask_json(json)

      if json.nil?
        return nil
      end

      masked_json = json
      masked_json = "" unless "".instance_of?(json.class)

      # コンフィグクラス生成
      config = Veritrans::Tercerog::Mdk::MdkConfig.instance
      # マスク項目を大文字化して取得
      mask_item_list = config[:MASK_ITEM].upcase.split(",")

      mask_item_list.each do |candidate|
        if candidate.include?("MAILADDR")
          masked_json.gsub!(/(\"#{candidate}\":\"[\s]*)([^@]*)(@[^\"]*\")/mi) do |target|
            s1 = $1
            s2 = $2
            s3 = $3

            s1.gsub!(/-/m, "")
            s2.gsub!(/-/m, "")
            s2.gsub!(/./m ,"*")
            s3.gsub!(/-/m, "")
            "#{s1}#{s2}#{s3}"
          end
        elsif candidate.include?("CARDNUMBER") or candidate == "JCNTOKEN" or candidate == "JCNTOKENMEMBERNUM"
          masked_json.gsub!(/(\"#{candidate}\":[\s]*\"[^\"]{6})([^\"]*)([^\"]{2}\")/mi) do |target|
            s1 = $1
            s2 = $2
            s3 = $3

            s2.gsub!(/./m ,"*")
            "#{s1}#{s2}#{s3}"
          end
        else
          masked_json.gsub!(/(\"#{candidate}\":[\s]*\")([^\"]*)(\")/mi) do |target|
            s1 = $1
            s2 = $2
            s3 = $3

            s2.gsub!(/./m ,"*")
            "#{s1}#{s2}#{s3}"
          end
        end
      end

      return masked_json
    end