root/GpgDlg.cpp

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. CGpgDlg
  2. DoDataExchange
  3. BEGIN_MESSAGE_MAP
  4. ReDraw
  5. TranslateKeycode
  6. TruncateSubKey
  7. Str2Sliststack
  8. OnGetdispinfoGpgList1
  9. OnSelchangeGpgDate2
  10. OnGpgCreateKey
  11. InitializeAddKey
  12. OnGpgClear1
  13. OnGpgAddKey
  14. OnGpgClear2
  15. OnGpgOpenKey
  16. OnGpgDel
  17. OnGpgExport

/*
 * Copyright (C) 2002-2003 chik, s.hiranaka
 * For license terms, see the file COPYING in this directory.
 */

// GpgDlg.cpp : インプリメンテーション ファイル
//

#include "stdafx.h"
#include "Pochy.h"
#include "GpgDlg.h"
#include "Gpg.h"
#include "lib.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CGpgDlg ダイアログ


CGpgDlg::CGpgDlg(CWnd* pParent /*=NULL*/)
        : CDialog(CGpgDlg::IDD, pParent)
{
        //{{AFX_DATA_INIT(CGpgDlg)
        m_key_length = -1;
        m_key_type = -1;
        //}}AFX_DATA_INIT
}


void CGpgDlg::DoDataExchange(CDataExchange* pDX)
{
        CDialog::DoDataExchange(pDX);
        //{{AFX_DATA_MAP(CGpgDlg)
        DDX_Control(pDX, IDC_GPG_STATUS, m_status);
        DDX_Control(pDX, IDC_GPG_KEY, m_key);
        DDX_Control(pDX, IDC_GPG_DATE2, m_date2);
        DDX_Control(pDX, IDC_GPG_DATE1, m_date1);
        DDX_Control(pDX, IDC_GPG_COMMENT, m_comment);
        DDX_Control(pDX, IDC_PASS, m_password);
        DDX_Control(pDX, IDC_MAIL_ADDRESS, m_mail_address);
        DDX_Control(pDX, IDC_GPG_REAL_NAME, m_real_name);
        DDX_Control(pDX, IDC_GPG_LIST1, m_lc);
        DDX_Radio(pDX, IDC_GPG_KEY_LENGTH, m_key_length);
        DDX_Radio(pDX, IDC_GPG_KEY_TYPE, m_key_type);
        //}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CGpgDlg, CDialog)
        //{{AFX_MSG_MAP(CGpgDlg)
        ON_NOTIFY(LVN_GETDISPINFO, IDC_GPG_LIST1, OnGetdispinfoGpgList1)
        ON_CBN_SELCHANGE(IDC_GPG_DATE2, OnSelchangeGpgDate2)
        ON_BN_CLICKED(IDC_GPG_CREATE, OnGpgCreateKey)
        ON_BN_CLICKED(IDC_GPG_CLEAR1, OnGpgClear1)
        ON_BN_CLICKED(IDC_GPG_ADD_KEY, OnGpgAddKey)
        ON_BN_CLICKED(IDC_GPG_CLEAR2, OnGpgClear2)
        ON_BN_CLICKED(IDC_GPG_OPEN_KEY, OnGpgOpenKey)
        ON_BN_CLICKED(IDC_GPG_DEL, OnGpgDel)
        ON_BN_CLICKED(IDC_GPG_EXPORT, OnGpgExport)
        //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGpgDlg メッセージ ハンドラ

BOOL CGpgDlg::OnInitDialog()
{
        CDialog::OnInitDialog();

        int Num;
        int ColumnWidth[] = { 175, 50, 65, 185, 75, 75 };
        char* Column[] = { "鍵の種類", "鍵長", "信頼度", "名前", "生成日", "有効期限" };
        LV_COLUMN lvc;
        lvc.mask = LVCF_FMT|LVCF_TEXT|LVCF_WIDTH|LVCF_SUBITEM;
        lvc.fmt = LVCFMT_LEFT;
        for(Num = 0; Num < 6; Num++){
                lvc.pszText = Column[Num];
                lvc.cx = ColumnWidth[Num];
                m_lc.InsertColumn(Num, &lvc);
        }
        m_lc.SetExtendedStyle(LVS_EX_FULLROWSELECT);

        ReDraw();

        m_key_type = 0;
        m_key_length = 1;

        m_date2.AddString("期限なし");
        m_date2.AddString("日");
        m_date2.AddString("週");
        m_date2.AddString("月");
        m_date2.AddString("年");
        m_date2.SetCurSel(0);

        m_date1.SetReadOnly();

        UpdateData(FALSE);

        return TRUE;  // コントロールにフォーカスを設定しないとき、戻り値は TRUE となります
        // 例外: OCX プロパティ ページの戻り値は FALSE となります
}

void CGpgDlg::ReDraw()
{
        // かぎリスト取得
        CGpg gpg;
        CStringArray comline;
        CString pub;
        CString out2;
        CString body;
        body = gpg.GetKeyList();

        // リストビューに表示
        int i;
        SLISTSTACK list;
        CStringArray bodya;
        g_cstr2cstra(body, bodya, "\r\n");

        m_keylist.RemoveAll();
        for(i=0;i<bodya.GetSize();i++){
                CString tmps = bodya.GetAt(i);
                if(tmps.Find("pub")==0 || tmps.Find("sub")==0 || tmps.Find("sec")==0 || tmps.Find("ssb")==0){
                        Str2Sliststack(bodya.GetAt(i),list);
                        TranslateKeycode(list);
                        m_keylist.Add(list);
                }
        }
        TruncateSubKey();

        m_lc.DeleteAllItems();
        for(i=0;i<m_keylist.GetSize();i++)
                m_lc.InsertItem(m_lc.GetItemCount(),m_keylist.GetAt(i).m_str4);

        // 初期状態の設定
        m_lc.SetFocus();
        m_lc.SetItemState(0,LVIS_SELECTED | LVIS_FOCUSED,-1);
}

void CGpgDlg::TranslateKeycode(SLISTSTACK& ls)
{
        if(ls.m_str4=="16"){
                if(ls.m_str1=="pub" || ls.m_str1=="sub")
                ls.m_str4="ELGamal(encrypt)";
                if(ls.m_str1=="sec" || ls.m_str1=="ssb")
                ls.m_str4="ELGamal(decrypt)";
        }
        if(ls.m_str4=="17"){
                if(ls.m_str1=="pub" || ls.m_str1=="sub")
                ls.m_str4="DSA(verify)";
                if(ls.m_str1=="sec" || ls.m_str1=="ssb")
                ls.m_str4="DSA(sign)";
        }
        if(ls.m_str4=="20"){
                if(ls.m_str1=="pub" || ls.m_str1=="sub")
                        ls.m_str4="ELGamal(public)";
                if(ls.m_str1=="sec" || ls.m_str1=="ssb")
                        ls.m_str4="ELGamal(secret)";
        }
        if(ls.m_str7.IsEmpty())
                ls.m_str7="-";
        if(ls.m_str2=="u")
                ls.m_str2="Ultimately";
        if(ls.m_str2=="q")
                ls.m_str2="Undefined";
        if(ls.m_str2=="f")
                ls.m_str2="Full";
        ls.m_str8 = "#"+ls.m_str8;
}

void CGpgDlg::TruncateSubKey()
{
        for(int i=0;i<m_keylist.GetSize();i++){
                if(m_keylist.GetAt(i).m_str1 == "sec" || m_keylist.GetAt(i).m_str1 == "ssb"){
                        for(int j=0;j<m_keylist.GetSize();j++){
                                if(m_keylist.GetAt(j).m_str5 == m_keylist.GetAt(i).m_str5 && (m_keylist.GetAt(j).m_str1 == "pub" || m_keylist.GetAt(j).m_str1 == "sub")){
                                        m_keylist[i].m_str8 = m_keylist.GetAt(j).m_str8;
                                }
                        }
                }
        }
        for(i=0;i<m_keylist.GetSize();i++){
                if(m_keylist.GetAt(i).m_str1 == "sub"){
                        for(int j=0;j<m_keylist.GetSize();j++){
                                if(m_keylist.GetAt(j).m_str8 == m_keylist.GetAt(i).m_str8 && m_keylist.GetAt(j).m_str1 == "pub"){
                                        m_keylist[j].m_str4 += "/"+m_keylist.GetAt(i).m_str4;
                                }
                        }
                        m_keylist.RemoveAt(i);
                        i--;
                }
        }
        for(i=0;i<m_keylist.GetSize();i++)
                TRACE("ID=%s\n",m_keylist.GetAt(i).m_str8);
        for(i=0;i<m_keylist.GetSize();i++){
                if(m_keylist.GetAt(i).m_str1 == "ssb"){
                        for(int j=0;j<m_keylist.GetSize();j++){
                                if(m_keylist.GetAt(j).m_str8 == m_keylist.GetAt(i).m_str8 && m_keylist.GetAt(j).m_str1 == "sec")
                                        m_keylist[j].m_str4 += "/"+m_keylist.GetAt(i).m_str4;
                        }
                        m_keylist.RemoveAt(i);
                        i--;
                }
        }
}

void CGpgDlg::Str2Sliststack(CString& str,SLISTSTACK& ls)
{
        int i;
        CStringArray stra;
        CString* pstr;
        CString buf;
        g_cstr2cstra(str,stra,":");
        for(i=0;i<stra.GetSize()-1;i++){
                pstr = &ls.m_str1 + i;
                buf = stra.GetAt(i);
                buf.TrimRight(":");
                *pstr = buf;
        }
}


void CGpgDlg::OnGetdispinfoGpgList1(NMHDR* pNMHDR, LRESULT* pResult)
{
/*      LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;
        // TODO: この位置にコントロール通知ハンドラ用のコードを追加してください
        
        *pResult = 0;*/

        LV_DISPINFO* pDispInfo = (LV_DISPINFO*)pNMHDR;

        int num,max_num;
        char *buf;

        num = pDispInfo->item.iItem;
        max_num = m_keylist.GetSize();

        if(pDispInfo->item.mask & LVIF_TEXT){
                switch(pDispInfo->item.iSubItem){
                        case 1:// 鍵長
                                buf = m_keylist[num].m_str3.GetBuffer(0);
                                break;
                        case 2:// 信頼度
                                buf = m_keylist[num].m_str2.GetBuffer(0);
                                break;
                        case 3:// 名前
                                buf = m_keylist[num].m_str10.GetBuffer(0);
                                break;
                        case 4:// 生成日
                                buf = m_keylist[num].m_str6.GetBuffer(0);
                                break;
                        case 5:// 有効期限
                                buf = m_keylist[num].m_str7.GetBuffer(0);
                                break;
                }
                lstrcpy(pDispInfo->item.pszText, buf);
        }
        *pResult = 0;
}

void CGpgDlg::OnSelchangeGpgDate2()
{
        if(0 != m_date2.GetCurSel())
                m_date1.SetReadOnly(FALSE);
        else
                m_date1.SetReadOnly();
}

void CGpgDlg::OnGpgCreateKey()
{
//      CDialog wd;
//      wd.Create(IDD_DIALOG8,this);

        m_status.SetWindowText("鍵作成中です。しばらくお待ちください。");

        CString out1;
        CString out2;
        CStringArray comline;
        CString tmp;
        CString gen_info_file;
        GEN_KEY_STRUCT key_info;
        CGpg gpg;
        UpdateData();

        switch(m_key_length){
        case 0:
                key_info.Key_Length = "768";
                key_info.Subkey_Length = "768";
                break;
        case 1:
                key_info.Key_Length = "1024";
                key_info.Subkey_Length = "1024";
                break;
        case 2:
                key_info.Key_Length = "2048";
                key_info.Subkey_Length = "2048";
                break;
        }

/*      switch(m_key_type){
        case 0:
                key_info.Key_Type = "DSA";
                break;
        case 1:
                key_info.Key_Type = 
        case 2:

        }*/

        CString d;
        m_date1.GetWindowText(d);
        switch(m_date2.GetCurSel()){
        case 0:
                key_info.Expire_Date = "0";
                break;
        case 1:
                key_info.Expire_Date = d;
                break;
        case 2:
                key_info.Expire_Date = d+"w";
                break;
        case 3:
                key_info.Expire_Date = d+"m";
                break;
        case 4:
                key_info.Expire_Date = d+"y";
                break;
        }
        key_info.Key_Type = "DSA";
        key_info.Subkey_Type = "ELG-E";
        m_real_name.GetWindowText(key_info.Name_Real);
        m_comment.GetWindowText(key_info.Name_Comment);
        m_mail_address.GetWindowText(key_info.Name_Email);
        m_password.GetWindowText(key_info.Passphrase);

        if(!gpg.GenKey(&key_info)){
                m_status.SetWindowText("");
                return;
        }
        ReDraw();
        InitializeAddKey();
        m_status.SetWindowText("");
}

void CGpgDlg::InitializeAddKey()
{
        m_real_name.SetWindowText("");
        m_comment.SetWindowText("");
        m_mail_address.SetWindowText("");
        m_password.SetWindowText("");
        m_key_type = 0;
        m_key_length = 1;
        m_date1.SetWindowText("");
        m_date1.SetReadOnly();
        m_date2.SetCurSel(0);
        UpdateData(FALSE);
}

void CGpgDlg::OnGpgClear1()
{
        InitializeAddKey();     
}

void CGpgDlg::OnGpgAddKey()
{
        CString key;
        CGpg gpg;
        m_status.SetWindowText("鍵追加中です。しばらくお待ちください。");
        m_key.GetWindowText(key);
        if(!gpg.ImportKey(key)){
                m_status.SetWindowText("");
                return;
        }
        m_key.SetWindowText("");
        m_status.SetWindowText("");
        ReDraw();
}

void CGpgDlg::OnGpgClear2()
{
        m_key.SetWindowText("");        
}

void CGpgDlg::OnGpgOpenKey()
{
        CString path;
        CFileDialog dlg(TRUE, NULL, NULL, OFN_PATHMUSTEXIST, NULL, this);
        dlg.m_ofn.lpstrTitle = _T( "キーを追加する" );
        if(dlg.DoModal() == IDOK){
                path = dlg.GetPathName();
        }else{
                return;
        }

        CString buf;
        g_file2cstring(path, buf);
        m_key.SetWindowText(buf);
}

void CGpgDlg::OnGpgDel() 
{
        POSITION pos = m_lc.GetFirstSelectedItemPosition();
        int si;

        CGpg gpg;
        CString message;
        while(pos){
                si = m_lc.GetNextSelectedItem(pos);
                message = m_keylist[si].m_str10+"\r\n\r\n削除しても良いですか?";
                if(IDYES != AfxMessageBox(message, MB_YESNO))
                        continue;
                if(m_keylist[si].m_str1 == "pub")
                        gpg.DelPubKey(g_ma(m_keylist[si].m_str10));
                if(m_keylist[si].m_str1 == "sec")
                        gpg.DelSecKey(g_ma(m_keylist[si].m_str10));
        }
        ReDraw();       
}

void CGpgDlg::OnGpgExport() 
{
        
}

/* [<][>][^][v][top][bottom][index][help] */