コード例 #1
0
ファイル: Topology.cpp プロジェクト: bugburner/xcsoar
void TopologyWriter::DeleteFiles(void) {
  // Delete all files, since zziplib interface doesn't handle file modes
  // properly
  if (strlen(filename)>0) {
    TCHAR fname[MAX_PATH];
    ascii2unicode(filename, fname);
    _tcscat(fname, TEXT(".shp"));
    DeleteFile(fname);
    ascii2unicode(filename, fname);
    _tcscat(fname, TEXT(".shx"));
    DeleteFile(fname);
    ascii2unicode(filename, fname);
    _tcscat(fname, TEXT(".dbf"));
    DeleteFile(fname);
  }
}
コード例 #2
0
ファイル: O2Boards.cpp プロジェクト: Hiroyuki-Nagata/o2on
// ---------------------------------------------------------------------------
//	ImportNodeFromXML()
//	
// ---------------------------------------------------------------------------
void
O2Boards::
ImportNodeFromXML(const O2Node &node, const char *in, size_t len)
{
	wstring xml;
	size_t p = 0;
	size_t p1;
	size_t p2;
	ascii2unicode(in, len, xml);
	wstring domain_bbsname;
	O2BoardExMapIt exit;

	while (p < len) {
		p1 = xml.find(L"<board>", p);
		if (p1 == wstring::npos) break;
		p1 += 7;

		p2 = xml.find(L"</board>", p1);
		if (p2 == wstring::npos) break;

		if (p2 > p1) {
			domain_bbsname.assign(xml, p1, p2-p1);
			ExLock.Lock();
			{
				exit = exmap.find(domain_bbsname);
				if (exit != exmap.end()) {
					exit->second->collectors.push(node);
				}
			}
			ExLock.Unlock();
		}
		p = p2 + 8;
	}
}
コード例 #3
0
ファイル: lwip_chap_ms.c プロジェクト: 0xc0170/mbed
/*
 * Set mppe_xxxx_key from MS-CHAP credentials. (see RFC 3079)
 */
static void Set_Start_Key(ppp_pcb *pcb, const u_char *rchallenge, const char *secret, int secret_len) {
    u_char	unicodePassword[MAX_NT_PASSWORD * 2];
    u_char	PasswordHash[MD4_SIGNATURE_SIZE];
    u_char	PasswordHashHash[MD4_SIGNATURE_SIZE];
    lwip_sha1_context	sha1Context;
    u_char	Digest[SHA1_SIGNATURE_SIZE];	/* >= MPPE_MAX_KEY_LEN */

    /* Hash (x2) the Unicode version of the secret (== password). */
    ascii2unicode(secret, secret_len, unicodePassword);
    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);
    NTPasswordHash(PasswordHash, sizeof(PasswordHash), PasswordHashHash);

    lwip_sha1_init(&sha1Context);
    lwip_sha1_starts(&sha1Context);
    lwip_sha1_update(&sha1Context, PasswordHashHash, MD4_SIGNATURE_SIZE);
    lwip_sha1_update(&sha1Context, PasswordHashHash, MD4_SIGNATURE_SIZE);
    lwip_sha1_update(&sha1Context, rchallenge, 8);
    lwip_sha1_finish(&sha1Context, Digest);
    lwip_sha1_free(&sha1Context);

    /* Same key in both directions. */
    mppe_set_key(pcb, &pcb->mppe_comp, Digest);
    mppe_set_key(pcb, &pcb->mppe_decomp, Digest);

    pcb->mppe_keys_set = 1;
}
コード例 #4
0
ファイル: ts_string.cpp プロジェクト: MaxKellermann/LK8000
unsigned short* ts_strdup_ascii_to_unicode(const char* str)
{
	unsigned short* result = (unsigned short*)malloc((strlen(str)+1)*2);
	if (result == NULL)
		return NULL;
	ascii2unicode(str, (wchar_t *)result);
	return result;
}
コード例 #5
0
ファイル: ts_string.cpp プロジェクト: MaxKellermann/LK8000
unsigned short* ts_strcat(unsigned short* dest, const char* src)
{
	unsigned short* p = dest;
	while (*p != '\0')
		p++;
	ascii2unicode(src, (wchar_t *)p);
	return dest;
}
コード例 #6
0
ファイル: O2Protocol.hpp プロジェクト: Hiroyuki-Nagata/o2on
	// -----------------------------------------------------------------------
	//	GetTargetBoardFromHeader
	// -----------------------------------------------------------------------
	bool GetTargetBoardFromHeader(const HTTPHeader &header
								, wstring &board)
	{
		strmap::const_iterator it = header.fields.find(X_O2_TARGET_BOARD);
		if (it == header.fields.end())
			return false;
		ascii2unicode(it->second, board);
		return true;
	}
コード例 #7
0
ファイル: lwip_chap_ms.c プロジェクト: 0xc0170/mbed
static void ChapMS_NT(const u_char *rchallenge, const char *secret, int secret_len,
	  u_char NTResponse[24]) {
    u_char	unicodePassword[MAX_NT_PASSWORD * 2];
    u_char	PasswordHash[MD4_SIGNATURE_SIZE];

    /* Hash the Unicode version of the secret (== password). */
    ascii2unicode(secret, secret_len, unicodePassword);
    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);

    ChallengeResponse(rchallenge, PasswordHash, NTResponse);
}
コード例 #8
0
ファイル: chap_ms.c プロジェクト: jhbsz/DIR-850L_A1
static void
GenerateAuthenticatorResponse(char *secret, int secret_len,
                              u_char NTResponse[24], u_char PeerChallenge[16],
                              u_char *rchallenge, char *username,
                              u_char authResponse[MS_AUTH_RESPONSE_LENGTH+1])
{
    /*
     * "Magic" constants used in response generation, from RFC 2759.
     */
    u_char Magic1[39] = /* "Magic server to client signing constant" */
    {   0x4D, 0x61, 0x67, 0x69, 0x63, 0x20, 0x73, 0x65, 0x72, 0x76,
        0x65, 0x72, 0x20, 0x74, 0x6F, 0x20, 0x63, 0x6C, 0x69, 0x65,
        0x6E, 0x74, 0x20, 0x73, 0x69, 0x67, 0x6E, 0x69, 0x6E, 0x67,
        0x20, 0x63, 0x6F, 0x6E, 0x73, 0x74, 0x61, 0x6E, 0x74
    };
    u_char Magic2[41] = /* "Pad to make it do more than one iteration" */
    {   0x50, 0x61, 0x64, 0x20, 0x74, 0x6F, 0x20, 0x6D, 0x61, 0x6B,
        0x65, 0x20, 0x69, 0x74, 0x20, 0x64, 0x6F, 0x20, 0x6D, 0x6F,
        0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x6E, 0x20, 0x6F, 0x6E,
        0x65, 0x20, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6F,
        0x6E
    };

    int		i;
    SHA1_CTX	sha1Context;
    u_char	unicodePassword[MAX_NT_PASSWORD * 2];
    u_char	PasswordHash[MD4_SIGNATURE_SIZE];
    u_char	PasswordHashHash[MD4_SIGNATURE_SIZE];
    u_char	Digest[SHA1_SIGNATURE_SIZE];
    u_char	Challenge[8];

    /* Hash (x2) the Unicode version of the secret (== password). */
    ascii2unicode(secret, secret_len, unicodePassword);
    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);
    NTPasswordHash(PasswordHash, sizeof(PasswordHash), PasswordHashHash);

    SHA1_Init(&sha1Context);
    SHA1_Update(&sha1Context, PasswordHashHash, sizeof(PasswordHashHash));
    SHA1_Update(&sha1Context, NTResponse, 24);
    SHA1_Update(&sha1Context, Magic1, sizeof(Magic1));
    SHA1_Final(Digest, &sha1Context);

    ChallengeHash(PeerChallenge, rchallenge, username, Challenge);

    SHA1_Init(&sha1Context);
    SHA1_Update(&sha1Context, Digest, sizeof(Digest));
    SHA1_Update(&sha1Context, Challenge, sizeof(Challenge));
    SHA1_Update(&sha1Context, Magic2, sizeof(Magic2));
    SHA1_Final(Digest, &sha1Context);

    /* Convert to ASCII hex string. */
    for (i = 0; i < MAX((MS_AUTH_RESPONSE_LENGTH / 2), sizeof(Digest)); i++)
        sprintf((char *)&authResponse[i * 2], "%02X", Digest[i]);
}
コード例 #9
0
ファイル: O2Boards.cpp プロジェクト: Hiroyuki-Nagata/o2on
// ---------------------------------------------------------------------------
//	AddEx()
//	
// ---------------------------------------------------------------------------
bool
O2Boards::
AddEx(const char *url)
{
	HTTPHeader h(0);
	h.SplitURL(url);

	if (h.paths.empty() || h.paths[0] == "/")
		return false;

	wstring hostname;
	ascii2unicode(h.hostname, hostname);

	const wchar_t *domain = host2domain(hostname.c_str());
	if (!domain)
		return false;

	wstring bbsname;
	ascii2unicode(h.paths[0], bbsname);

	wstring domain_bbsname;
	domain_bbsname = domain;
	domain_bbsname += L':';
	domain_bbsname += bbsname;

	O2BoardExMapIt exit = exmap.find(domain_bbsname);
	if (exit != exmap.end())
		return false;

	ExLock.Lock();
	{
		O2BoardEx *ex = new O2BoardEx();
		ex->collectors.SetObject(Profile, Client);
		exmap.insert(O2BoardExMap::value_type(domain_bbsname, ex));
	}
	ExLock.Unlock();
	return true;
}
コード例 #10
0
ファイル: chap_ms.c プロジェクト: jhbsz/DIR-850L_A1
/*
 * Set mppe_xxxx_key from MS-CHAP credentials. (see RFC 3079)
 */
static void
Set_Start_Key(u_char *rchallenge, char *secret, int secret_len)
{
    u_char	unicodePassword[MAX_NT_PASSWORD * 2];
    u_char	PasswordHash[MD4_SIGNATURE_SIZE];
    u_char	PasswordHashHash[MD4_SIGNATURE_SIZE];

    /* Hash (x2) the Unicode version of the secret (== password). */
    ascii2unicode(secret, secret_len, unicodePassword);
    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);
    NTPasswordHash(PasswordHash, sizeof(PasswordHash), PasswordHashHash);

    mppe_set_keys(rchallenge, PasswordHashHash);
}
コード例 #11
0
void Topology::Open() {

    TCHAR ufname[MAX_PATH]; // 091105
    shapefileopen = false;

    if (append) {
        if (msSHPOpenFile(&shpfile, (char*)"rb+", filename) == -1) {
            ascii2unicode(filename,ufname);
            // StartupStore(_T(". Topology: Open: append failed for <%s> (this can be normal)%s"),ufname,NEWLINE);
            return;
        }
    } else {
        if (msSHPOpenFile(&shpfile, (char*)"rb", filename) == -1) {
            ascii2unicode(filename,ufname);
            StartupStore(_T("------ Topology: Open FAILED for <%s>%s"),ufname,NEWLINE);
            return;
        }
    }
    ascii2unicode(filename,ufname); // 091105
    // StartupStore(_T(". Topology: Open <%s>%s"),ufname,NEWLINE);

    scaleThreshold = 1000.0;
    shpCache = (XShape**)malloc(sizeof(XShape*)*shpfile.numshapes);
    if (shpCache) {
        shapefileopen = true;
#ifdef TOPOFASTCACHE
        initCache();
#else
        for (int i=0; i<shpfile.numshapes; i++) {
            shpCache[i] = NULL;
        }
#endif
    } else {
        StartupStore(_T("------ ERR Topology,  malloc failed shpCache%s"), NEWLINE);
    }
}
コード例 #12
0
ファイル: args.cpp プロジェクト: KojiTakizawa/wcecompat
static BOOL wildcardFindFirst(const char* arg, HANDLE* findHandle, char** expandedArg)
{
	WIN32_FIND_DATA	findData;
	WCHAR			argW[1024];
	int				filenameLen;
	ascii2unicode(arg, argW, 1024);
	*findHandle = FindFirstFile(argW, &findData);
	if (*findHandle == (HANDLE)0xffffffff)
		return FALSE;
	filenameLen = wcslen(findData.cFileName);
	*expandedArg = (char*)malloc(filenameLen+1);
	if (*expandedArg == NULL)
		return FALSE;
	unicode2ascii(findData.cFileName, *expandedArg, filenameLen+1);
	return TRUE;
}
コード例 #13
0
ファイル: chap_ms.c プロジェクト: jhbsz/DIR-850L_A1
static void
ChapMS2_NT(u_char *rchallenge, u_char PeerChallenge[16], char *username,
           char *secret, int secret_len, u_char NTResponse[24])
{
    u_char	unicodePassword[MAX_NT_PASSWORD * 2];
    u_char	PasswordHash[MD4_SIGNATURE_SIZE];
    u_char	Challenge[8];

    ChallengeHash(PeerChallenge, rchallenge, username, Challenge);

    /* Hash the Unicode version of the secret (== password). */
    ascii2unicode(secret, secret_len, unicodePassword);
    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);

    ChallengeResponse(Challenge, PasswordHash, NTResponse);
}
コード例 #14
0
ファイル: vlistview.cpp プロジェクト: DerellLicht/der_libs
//*******************************************************************************
//  if VListView class is used, this function is incorporated within the class
//*******************************************************************************
void CVListView::lview_assign_column_headers(void)
{
   DWORD styles = 0 ;
   if (style_flags & LVL_STY_EX_GRIDLINES) {
      styles |= LVS_EX_GRIDLINES ;
   }
   if (style_flags & LVL_STY_EX_FULL_ROW) {
      /// styles |= (LVS_EX_FULLROWSELECT | LVS_SHOWSELALWAYS) ;
      styles |= LVS_EX_FULLROWSELECT ;
   }
   
   // LVS_EX_INFOTIP enables tooltips
   // LVS_EX_LABELTIP ensures the full tooltip is shown and is not partially hidden
   if (style_flags & LVL_STY_EX_TOOLTIPS) {
      styles |= (LVS_EX_INFOTIP | LVS_EX_LABELTIP) ;
   }
   if (styles != 0)
      ListView_SetExtendedListViewStyle(hwndVListView, styles) ;   //lint !e522

   //  set extended styles
   // ListView_SetExtendedListViewStyle(tiSelf->hwndRxData, LVS_EX_ONECLICKACTIVATE) ;

   // initialize the column
   //  Even though we've disabled column headers with LVS_NOCOLUMNHEADER,
   //  we *still* need to insert the column.
   //  Mind you, this should *only* be done ONCE...
   LVCOLUMN LvColumn;                 // Make Column struct for ListView
   memset (&LvColumn, 0, sizeof (LvColumn)); // Reset Column
   
   LvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
   LvColumn.fmt = LVCFMT_LEFT;
   //  shorten column by width of the vertical scroll bar,
   //  so we don't get a horizontal scroll bar once the 
   //  vertical scroll bar gets drawn.
   // syslog("vertical scroll-bar width=%u pixels\n", iOffset) ;
   uint iOffset = GetSystemMetrics (SM_CXVSCROLL);
   iOffset += 6 ;
   LvColumn.cx = cxClient - iOffset ;
   // LvColumn.pszText = "comm-port terminal" ;
#ifdef UNICODE            
   LvColumn.pszText = ascii2unicode(".") ;
#else
   LvColumn.pszText = "." ;   //lint !e1778  asmt is not const safe
#endif
   SendMessage(hwndVListView, LVM_INSERTCOLUMN, 0, (LPARAM)(const LV_COLUMN*)(&LvColumn)) ;
}
コード例 #15
0
ファイル: lwip_chap_ms.c プロジェクト: 0xc0170/mbed
static void GenerateAuthenticatorResponsePlain(
		 const char *secret, int secret_len,
		 u_char NTResponse[24], const u_char PeerChallenge[16],
		 const u_char *rchallenge, const char *username,
		 u_char authResponse[MS_AUTH_RESPONSE_LENGTH+1]) {
    u_char	unicodePassword[MAX_NT_PASSWORD * 2];
    u_char	PasswordHash[MD4_SIGNATURE_SIZE];
    u_char	PasswordHashHash[MD4_SIGNATURE_SIZE];

    /* Hash (x2) the Unicode version of the secret (== password). */
    ascii2unicode(secret, secret_len, unicodePassword);
    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);
    NTPasswordHash(PasswordHash, sizeof(PasswordHash),
		   PasswordHashHash);

    GenerateAuthenticatorResponse(PasswordHashHash, NTResponse, PeerChallenge,
				  rchallenge, username, authResponse);
}
コード例 #16
0
ファイル: vlistview.cpp プロジェクト: DerellLicht/der_libs
//*****************************************************************************
void CVListView::set_header_text(uint idx, char *msg)
{
   HWND hwndHeader = ListView_GetHeader(hwndVListView);
   if (hwndHeader) {
      HDITEM item;
      item.mask = HDI_TEXT ;
#ifdef UNICODE            
      item.pszText = ascii2unicode(msg) ;
      item.cchTextMax = _tcslen(item.pszText) ;
#else
      item.pszText = msg ;
      item.cchTextMax = strlen(msg) ;
#endif
      item.fmt = HDF_STRING | HDF_CENTER ;
      Header_SetItem(hwndHeader, idx, &item);  //lint !e522
   } else { //lint !e550  Symbol 'item' (line 753) not accessed
      syslog("ListView_GetHeader: %s\n", get_system_message()) ;
   }
}
コード例 #17
0
ファイル: O2Profile.cpp プロジェクト: Hiroyuki-Nagata/o2on
bool
O2Profile::
ExportToXML(const O2ProfileSelectCondition cond, string &out)
{
	wstring tmpstr;
	wchar_t tmp[32];

	wstring xml;
	xml += L"<?xml version=\"1.0\" encoding=\"";
	xml += cond.charset;
	xml += L"\"?>" EOL;
	if (!cond.xsl.empty()) {
		xml += L"<?xml-stylesheet type=\"text/xsl\" href=\"";
		xml += cond.xsl;
		xml += L"\"?>" EOL;
	}

	xml += L"<";
	xml += cond.rootelement;
	xml += L">" EOL;

	Lock();

	//ID
	if (cond.mask & PROF_XMLELM_ID) {
		ID.to_string(tmpstr);
		xml += L" <ID>";
		xml += tmpstr;
		xml += L"</ID>" EOL;
	}

	//IP
	if (cond.mask & PROF_XMLELM_IP) {
		ip2e(IP, tmpstr);
		xml += L" <IP>";
		xml += tmpstr;
		xml += L"</IP>" EOL;
	}

	//NodeName
	if (cond.mask & PROF_XMLELM_NAME) {
		makeCDATA(NodeNameW, tmpstr);
		xml += L" <nodename>";
		xml += tmpstr;
		xml += L"</nodename>" EOL;
	}

	//Comment
	if (cond.mask & PROF_XMLELM_COMMENT) {
		makeCDATA(Comment, tmpstr);
		xml += L" <comment>";
		xml += tmpstr;
		xml += L"</comment>" EOL;
	}

	//P2PPort
	if (cond.mask & PROF_XMLELM_P2PPORT) {
		xml += L" <port>";
		swprintf_s(tmp, 16, L"%d", P2PPort);
		xml += tmp;
		xml += L"</port>" EOL;
	}

	//ProxyPort
	if (cond.mask & PROF_XMLELM_PROXYPORT) {
		xml += L" <ProxyPort>";
		swprintf_s(tmp, 16, L"%d", ProxyPort);
		xml += tmp;
		xml += L"</ProxyPort>" EOL;
	}

	//AdminPort
	if (cond.mask & PROF_XMLELM_ADMINPORT) {
		xml += L" <AdminPort>";
		swprintf_s(tmp, 16, L"%d", AdminPort);
		xml += tmp;
		xml += L"</AdminPort>" EOL;
	}
	
	//PrivKey
	if (cond.mask & PROF_XMLELM_PRIVKEY) {
		PrivKey.to_string(tmpstr);
		xml += L" <PrivKey>";
		xml += tmpstr;
		xml += L"</PrivKey>" EOL;
	}

	//PubKey
	if (cond.mask & PROF_XMLELM_PUBKEY) {
		PubKey.to_string(tmpstr);
		xml += L" <PubKey>";
		xml += tmpstr;
		xml += L"</PubKey>" EOL;
	}

	//DBDir
	if (cond.mask & PROF_XMLELM_DBDIR) {
		makeCDATA(DBDirW, tmpstr);
		xml += L" <DBDir>";
		xml += tmpstr;
		xml += L"</DBDir>" EOL;
	}

	//CacheRoot
	if (cond.mask & PROF_XMLELM_CACHEROOT) {
		makeCDATA(CacheRootW, tmpstr);
		xml += L" <CacheRoot>";
		xml += tmpstr;
		xml += L"</CacheRoot>" EOL;
	}

	//AdminRoot
	if (cond.mask & PROF_XMLELM_ADMINROOT) {
		makeCDATA(AdminRootW, tmpstr);
		xml += L" <AdminRoot>";
		xml += tmpstr;
		xml += L"</AdminRoot>" EOL;
	}

	//AdminBrowserType
	if (cond.mask & PROF_XMLELM_ADMIN_BROWSER_TYPE) {
		xml += L" <AdminBrowserType>";
		xml += AdminBrowserType;
		xml += L"</AdminBrowserType>" EOL;
	}

	//AdminBrowserPath
	if (cond.mask & PROF_XMLELM_ADMIN_BROWSER_PATH) {
		makeCDATA(AdminBrowserPath, tmpstr);
		xml += L" <AdminBrowserPath>";
		xml += tmpstr;
		xml += L"</AdminBrowserPath>" EOL;
	}

	//UPnPAdapterName
	if (cond.mask & PROF_XMLELM_UPNP_ADAPTERNAME) {
		ascii2unicode(UPnPAdapterName, tmpstr);
		makeCDATA(tmpstr, tmpstr);
		xml += L" <UPnPAdapterName>";
		xml += tmpstr;
		xml += L"</UPnPAdapterName>" EOL;
	}

	//UPnPLocation
	if (cond.mask & PROF_XMLELM_UPNP_LOCATION) {
		ascii2unicode(UPnPLocation, tmpstr);
		makeCDATA(tmpstr, tmpstr);
		xml += L" <UPnPLocation>";
		xml += tmpstr;
		xml += L"</UPnPLocation>" EOL;
	}

	//UPnPServiceId
	if (cond.mask & PROF_XMLELM_UPNP_SERVICEID) {
		ascii2unicode(UPnPServiceId, tmpstr);
		makeCDATA(tmpstr, tmpstr);
		xml += L" <UPnPServiceId>";
		xml += tmpstr;
		xml += L"</UPnPServiceId>" EOL;
	}

	//limits
	if (cond.mask & PROF_XMLELM_LIMIT) {
		swprintf_s(tmp, 16, L"%u", P2PSessionLimit);
		xml += L" <p2psessionlimit>";
		xml += tmp;
		xml += L"</p2psessionlimit>" EOL;

/*
		swprintf_s(tmp, 16, L"%u", NodeLimit);
		xml += L" <nodelimit>";
		xml += tmp;
		xml += L"</nodelimit>" EOL;
*/
		swprintf_s(tmp, 16, L"%u", KeyLimit);
		xml += L" <keylimit>";
		xml += tmp;
		xml += L"</keylimit>" EOL;

		swprintf_s(tmp, 16, L"%u", QueryLimit);
		xml += L" <querylimit>";
		xml += tmp;
		xml += L"</querylimit>" EOL;

		swprintf_s(tmp, 16, L"%u", LogLimit);
		xml += L" <loglimit>";
		xml += tmp;
		xml += L"</loglimit>" EOL;

		swprintf_s(tmp, 16, L"%u", NetLogLimit);
		xml += L" <netloglimit>";
		xml += tmp;
		xml += L"</netloglimit>" EOL;

		swprintf_s(tmp, 16, L"%u", HokanLogLimit);
		xml += L" <hokanloglimit>";
		xml += tmp;
		xml += L"</hokanloglimit>" EOL;

		swprintf_s(tmp, 16, L"%u", IPFLogLimit);
		xml += L" <ipfloglimit>";
		xml += tmp;
		xml += L"</ipfloglimit>" EOL;

		swprintf_s(tmp, 32, L"%I64u", QuarterSize);
		xml += L" <quartersize>";
		xml += tmp;
		xml += L"</quartersize>" EOL;

		swprintf_s(tmp, 16, L"%u", QuarterFullOperation);
		xml += L" <quarterfulloperation>";
		xml += tmp;
		xml += L"</quarterfulloperation>" EOL;

		swprintf_s(tmp, 16, L"%u", ResumeDelayMs);
		xml += L" <ResumeDelayMs>";
		xml += tmp;
		xml += L"</ResumeDelayMs>" EOL;
	}

	if (cond.mask & PROF_XMLELM_BOOL) {
		xml += L" <port0>";
		xml += (Port0 ? L"1" : L"0");
		xml += L"</port0>" EOL;

		xml += L" <p2pautostart>";
		xml += (P2PAutoStart ? L"1" : L"0");
		xml += L"</p2pautostart>" EOL;

		xml += L" <loadsubdirindex>";
		xml += (LoadSubdirIndex ? L"1" : L"0");
		xml += L"</loadsubdirindex>" EOL;

		xml += L" <maruuser>";
		xml += (MaruUser ? L"1" : L"0");
		xml += L"</maruuser>" EOL;

		xml += L" <publicprofile>";
		xml += (PublicReport ? L"1" : L"0");
		xml += L"</publicprofile>" EOL;

		xml += L" <publicrecentdat>";
		xml += (PublicRecentDat ? L"1" : L"0");
		xml += L"</publicrecentdat>" EOL;

		xml += L" <baloon_p2p>";
		xml += (Baloon_P2P ? L"1" : L"0");
		xml += L"</baloon_p2p>" EOL;

		xml += L" <baloon_query>";
		xml += (Baloon_Query ? L"1" : L"0");
		xml += L"</baloon_query>" EOL;

		xml += L" <baloon_hokan>";
		xml += (Baloon_Hokan ? L"1" : L"0");
		xml += L"</baloon_hokan>" EOL;

		xml += L" <baloon_im>";
		xml += (Baloon_IM ? L"1" : L"0");
		xml += L"</baloon_im>" EOL;

		xml += L" <AutoResume>";
		xml += (AutoResume ? L"1" : L"0");
		xml += L"</AutoResume>" EOL;

		xml += L" <UseUPnP>";
		xml += (UseUPnP ? L"1" : L"0");
		xml += L"</UseUPnP>" EOL;
	}

	Unlock();

	xml += L"</";
	xml += cond.rootelement;
	xml += L">" EOL;

	return (FromUnicode(cond.charset.c_str(), xml, out));
}
コード例 #18
0
ファイル: O2ReportMaker.cpp プロジェクト: a-fujisaki/o2on
void
O2ReportMaker::
GetReport(string &out, bool pub)
{
	double ptime;
	double ptimeavg;
	int handle_c;
	int thread_c;
	PerformanceCounter->GetValue(ptime, ptimeavg, handle_c, thread_c);

	long tzoffset;
	_get_timezone(&tzoffset);

	// start time
	time_t starttime = PerformanceCounter->GetStartTime();
	wchar_t starttime_str[32];
	if (starttime != 0) {
		time_t t = starttime - tzoffset;
		struct tm tm;
		gmtime_s(&tm, &t);
		wcsftime(starttime_str, 32, L"%Y/%m/%d %H:%M:%S", &tm);
	}
	else
		wcscpy_s(starttime_str, 32, L"-");

	// uptime
	uint64 uptime = PerformanceCounter->GetUptime();
	wchar_t uptime_str[32];
	if (uptime != 0) {
		swprintf_s(uptime_str, 32, L"%I64dd %02I64d:%02I64d:%02I64d",
			uptime/86400, (uptime%86400)/3600, (uptime%3600)/60, uptime%60);
	}
	else
		wcscpy_s(uptime_str, 32, L"-");

	// uptime (累計)
	uint64 total_uptime = PerformanceCounter->GetTotalUptime() + uptime;
	wchar_t total_uptime_str[32];
	swprintf_s(total_uptime_str, 32, L"%I64dd %02I64d:%02I64d:%02I64d",
		total_uptime/86400, (total_uptime%86400)/3600, (total_uptime%3600)/60, total_uptime%60);

	wchar_t ptime_str[32];
	swprintf_s(ptime_str, 32, L"%.1f%% (%.1f%%)", ptime, ptimeavg);

	// 送受信バイト数 (現在のセッション)
	uint64 total_u = Server_P2P->GetSendByte()
		+ Client->GetSendByte();
	uint64 total_d = Server_P2P->GetRecvByte()
		+ Client->GetRecvByte();
	wchar_t traffic_u[32];
	swprintf_s(traffic_u, 32, L"%.1f(%.1f)",
		(uptime == 0 ? 0 : (double)total_u/1024/uptime),
		(uptime == 0 ? 0 : (double)total_u/uptime*8));
	wchar_t traffic_d[32];
	swprintf_s(traffic_d, 32, L"%.1f(%.1f)",
		(uptime == 0 ? 0 : (double)total_d/1024/uptime),
		(uptime == 0 ? 0 : (double)total_d/uptime*8));
	wchar_t traffic_ud[32];
	swprintf_s(traffic_ud, 32, L"%.1f(%.1f)",
		(uptime == 0 ? 0 : (double)(total_u+total_d)/1024/uptime),
		(uptime == 0 ? 0 : (double)(total_u+total_d)/uptime*8));

	// 送受信バイト数 (累計)
	uint64 accum_total_u =
		PerformanceCounter->GetTotalSend() + total_u;
	uint64 accum_total_d =
		PerformanceCounter->GetTotalRecv() + total_d;
	wchar_t a_traffic_u[32];
	swprintf_s(a_traffic_u, 32, L"%.1f(%.1f)",
		(total_uptime == 0 ? 0 : (double)accum_total_u/1024/total_uptime),
		(total_uptime == 0 ? 0 : (double)accum_total_u/total_uptime*8));
	wchar_t a_traffic_d[32];
	swprintf_s(a_traffic_d, 32, L"%.1f(%.1f)",
		(total_uptime == 0 ? 0 : (double)accum_total_d/1024/total_uptime),
		(total_uptime == 0 ? 0 : (double)accum_total_d/total_uptime*8));
	wchar_t a_traffic_ud[32];
	swprintf_s(a_traffic_ud, 32, L"%.1f(%.1f)",
		(total_uptime == 0 ? 0 : (double)(accum_total_u+accum_total_d)/1024/total_uptime),
		(total_uptime == 0 ? 0 : (double)(accum_total_u+accum_total_d)/total_uptime*8));

	//dat数、サイズ
	uint64 datnum = 0;
	uint64 datsize = 0;
	uint64 pubnum = 0;
	DatDB->select_report(PUBLISH_ORIGINAL_TT, datnum, datsize, pubnum);
	
	//publish率
	wchar_t publishper[32];
	if (datnum == 0)
		wcscpy_s(publishper, 32, L"0.0%");
	else {
		swprintf(publishper, 32, L"%.1f%% (%I64u)", (double)pubnum/datnum*100.0, pubnum);
	}

	wstring tmpstr;
	wstring xml;
	xml += L"<?xml version=\"1.0\" encoding=\"";
	xml += _T(DEFAULT_XML_CHARSET);
	xml += L"\"?>"EOL;
	if (pub) xml += L"<?xml-stylesheet type=\"text/xsl\" href=\"/profile.xsl\"?>";
	xml += L"<report>"EOL;

	//
	//	名前、コメント、閲覧履歴
	//
	if (pub)
	{
		makeCDATA(Profile->GetNodeNameW(), tmpstr);
		xml += L"<name>";
		xml += tmpstr;
		xml += L"</name>"EOL;
		xml += L"<category>"EOL;
		xml += L"<table>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"ID");
		hashT hash;
		Profile->GetID(hash);
		wstring hashstr;
		hash.to_string(hashstr);
		xml_AddElement(xml, L"td", L"class=\"L\"", hashstr.c_str());
		xml += L"</tr>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"コメント");
		makeCDATA(Profile->GetComment(), tmpstr);
		xml += L" <pre>";
		xml += tmpstr;
		xml += L"</pre>"EOL;
		xml += L"</tr>"EOL;
		//
		if (Profile->IsPublicRecentDat()) {
			xml += L"<tr>"EOL;
			xml_AddElement(xml, L"td", L"type=\"h\"", L"閲覧履歴");
			xml += L"<pre>";
			O2KeyList recent;
			Server_Proxy->GetRecentDatList(recent);
			tmpstr.erase();
			for (O2KeyListIt it = recent.begin(); it != recent.end(); it++) {
				wchar_t timestr[TIMESTR_BUFF_SIZE];
				struct tm tm;
				localtime_s(&tm, &it->date);
				wcsftime(timestr, TIMESTR_BUFF_SIZE, L"%Y/%m/%d %H:%M:%S", &tm);
				tmpstr += timestr;
				tmpstr += L" [ ";
				tmpstr += it->url;
				tmpstr += L" ] ";
				tmpstr += it->title;
				tmpstr += L"\r\n";
			}
			makeCDATA(tmpstr, tmpstr);
			xml += tmpstr;
			xml += L"</pre>"EOL;
			xml += L"</tr>"EOL;
		}
		xml += L"</table>"EOL;
		xml += L"</category>"EOL;
	}

	//
	//	概要
	//
	if (!pub || Profile->IsPublicReport())
	{
		xml += L"<category>"EOL;
		xml_AddElement(xml, L"caption", NULL, L"概要");
		xml += L"<table>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"状態");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"CPU(平均)");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"ハンドル");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"スレッド");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"総dat数");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"総datサイズ");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"publish率");
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		if (PerformanceCounter->IsActive())
			xml_AddElement(xml, L"td", L"class=\"active\"", L"稼動中");
		else
			xml_AddElement(xml, L"td", L"class=\"deactive\"", L"停止中");
		xml_AddElement(xml, L"td", L"class=\"C\"", ptime_str);
		xml_AddElement(xml, L"td", L"class=\"N\"", handle_c);
		xml_AddElement(xml, L"td", L"class=\"N\"", thread_c);
		xml_AddElement(xml, L"td", L"class=\"N\"", datnum);
		xml_AddElement(xml, L"td", L"class=\"N\"", datsize);
		xml_AddElement(xml, L"td", L"class=\"R\"", publishper);
		xml += L"</tr>"EOL;
		xml += L"</table>"EOL;
		//
		xml += L"<table>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"起動日時");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"グローバルIP");
		xml_AddElement(xml, L"td", (Server_P2P->IsActive()   ? L"type=\"h\" class=\"active\"" : L"type=\"h\" class=\"deactive\""), L"P2P");
		xml_AddElement(xml, L"td", (Server_Proxy->IsActive() ? L"type=\"h\" class=\"active\"" : L"type=\"h\" class=\"deactive\""), L"Proxy");
		xml_AddElement(xml, L"td", (Server_Admin->IsActive() ? L"type=\"h\" class=\"active\"" : L"type=\"h\" class=\"deactive\""), L"Admin");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Ver");
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		wstring ipstr;
		ulong2ipstr(Profile->GetIP(), ipstr);
		xml_AddElement(xml, L"td", L"class=\"C\"", starttime_str);
		xml_AddElement(xml, L"td", L"class=\"C\"", ipstr.c_str());
		xml_AddElement(xml, L"td", L"class=\"C\"", Profile->GetP2PPort());
		xml_AddElement(xml, L"td", L"class=\"C\"", Profile->GetProxyPort());
		xml_AddElement(xml, L"td", L"class=\"C\"", Profile->GetAdminPort());
		xml_AddElement(xml, L"td", L"class=\"C\"", Profile->GetUserAgentW());
		xml += L"</tr>"EOL;
		xml += L"</table>"EOL;
		//
		xml += L"<table>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"稼働時間");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"上り");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"下り");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"合計");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"上りKB/s(bps)");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"下りKB/s(bps)");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"合計KB/s(bps)");
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"今回");
		xml_AddElement(xml, L"td", L"class=\"C\"", uptime_str);
		xml_AddElement(xml, L"td", L"class=\"N\"", total_u);
		xml_AddElement(xml, L"td", L"class=\"N\"", total_d);
		xml_AddElement(xml, L"td", L"class=\"N\"", total_u+total_d);
		xml_AddElement(xml, L"td", L"", L"");
		xml_AddElement(xml, L"td", L"class=\"R\"", traffic_u);
		xml_AddElement(xml, L"td", L"class=\"R\"", traffic_d);
		xml_AddElement(xml, L"td", L"class=\"R\"", traffic_ud);
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"累計");
		xml_AddElement(xml, L"td", L"class=\"C\"", total_uptime_str);
		xml_AddElement(xml, L"td", L"class=\"N\"", accum_total_u);
		xml_AddElement(xml, L"td", L"class=\"N\"", accum_total_d);
		xml_AddElement(xml, L"td", L"class=\"N\"", accum_total_u+accum_total_d);
		xml_AddElement(xml, L"td", L"", L"");
		xml_AddElement(xml, L"td", L"class=\"R\"", a_traffic_u);
		xml_AddElement(xml, L"td", L"class=\"R\"", a_traffic_d);
		xml_AddElement(xml, L"td", L"class=\"R\"", a_traffic_ud);
		xml += L"</tr>"EOL;
		xml += L"</table>"EOL;
		xml += L"</category>"EOL;
		//
		//	DB
		//
		xml += L"<category>"EOL;
		xml_AddElement(xml, L"caption", NULL, L"DB");
		xml += L"<table>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Node");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Friend");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Key");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"SakuKey");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Query");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Saku");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"IM");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Broadcast");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"BCQueue");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Logger");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"IPFilter");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"DatRequest");
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"保持数");
		xml_AddElement(xml, L"td", L"class=\"N\"", NodeDB->count());
		xml_AddElement(xml, L"td", L"class=\"N\"", FriendDB->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", KeyDB->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", SakuKeyDB->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", QueryDB->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", SakuDB->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", IMDB->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", BroadcastDB->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", Job_Broadcast->GetQueueCount());
		xml_AddElement(xml, L"td", L"class=\"N\"", Logger->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", IPFilter_P2P->Count()+IPFilter_Proxy->Count()+IPFilter_Admin->Count());
		xml_AddElement(xml, L"td", L"class=\"N\"", Job_QueryDat->GetRequestQueueCount());
		xml += L"</tr>"EOL;
		xml += L"</table>"EOL;
		xml += L"</category>"EOL;
		//
		//	Server
		//
		xml += L"<category>"EOL;
		xml_AddElement(xml, L"caption", NULL, L"Server");
		xml += L"<table>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"dat");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"collection");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"im");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"broadcast");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"profile");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"ping");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"store");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"findnode");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"findvalue");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"ERROR");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"?");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"計");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Proxy");
		xml_AddElement(xml, L"td", L"type=\"h\"", L"Admin");
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"接続回数");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("dat"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("collection"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("im"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("broadcast"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("profile"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("ping"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("store"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("findnode"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("findvalue"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("ERROR"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath("?"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionCountByPath(NULL));
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_Proxy->GetTotalSessionCount());
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_Admin->GetTotalSessionCount());
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"up");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("dat"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("collection"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("im"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("broadcast"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("profile"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("ping"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("store"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("findnode"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("findvalue"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("ERROR"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("?"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath(NULL));
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_Proxy->GetSendByte());
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_Admin->GetSendByte());
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"down");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("dat"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("collection"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("im"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("broadcast"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("profile"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("ping"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("store"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("findnode"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("findvalue"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("ERROR"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath("?"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetRecvByteByPath(NULL));
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_Proxy->GetRecvByte());
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_Admin->GetRecvByte());
		xml += L"</tr>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"up + down");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("dat")			+ Server_P2P->GetRecvByteByPath("dat"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("collection")	+ Server_P2P->GetRecvByteByPath("collection"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("im")			+ Server_P2P->GetRecvByteByPath("im"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("broadcast")	+ Server_P2P->GetRecvByteByPath("broadcast"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("profile")		+ Server_P2P->GetRecvByteByPath("profile"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("ping")		+ Server_P2P->GetRecvByteByPath("ping"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("store")		+ Server_P2P->GetRecvByteByPath("store"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("findnode")	+ Server_P2P->GetRecvByteByPath("findnode"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("findvalue")	+ Server_P2P->GetRecvByteByPath("findvalue"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("ERROR")		+ Server_P2P->GetRecvByteByPath("ERROR"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath("UNKNOWN")		+ Server_P2P->GetRecvByteByPath("UNKNOWN"));
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSendByteByPath(NULL)			+ Server_P2P->GetRecvByteByPath(NULL));
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_Proxy->GetSendByte() + Server_Proxy->GetRecvByte());
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_Admin->GetRecvByte() + Server_Admin->GetRecvByte());
		xml += L"</tr>"EOL;
		xml += L"</table>"EOL;
		xml += L"<table>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"同時接続数ピーク");
		xml_AddElement(xml, L"td", L"class=\"N\"", Server_P2P->GetSessionPeak());
		xml += L"</tr>"EOL;
		xml += L"</table>"EOL;
		xml += L"</category>"EOL;
		//
		//	Agent
		//
		xml += L"<category>"EOL;
		xml_AddElement(xml, L"caption", NULL, L"Agent");
		xml += L"<table>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"");
		size_t i;
		for (i = 0; i < Jobs.size(); i++) {
			if (Jobs[i]->IsActive())
				xml_AddElement(xml, L"td", L"type=\"h\" class=\"active\"", Jobs[i]->GetName());
			else
				xml_AddElement(xml, L"td", L"type=\"h\" class=\"deactive\"", Jobs[i]->GetName());
		}
		xml += L"</tr>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"実行");
		for (i = 0; i < Jobs.size(); i++) {
			if (!Jobs[i]->IsActive())
				xml_AddElement(xml, L"td", L"class=\"C\"", L"-");
			else if (Jobs[i]->IsWorking())
				xml_AddElement(xml, L"td", L"class=\"active\"", L"実行中");
			else
				xml_AddElement(xml, L"td", L"class=\"wait\"", L"待機");
		}
		xml += L"</tr>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"間隔(s)");
		for (i = 0; i < Jobs.size(); i++) {
			if (!Jobs[i]->IsActive())
				xml_AddElement(xml, L"td", L"class=\"C\"", L"-");
			else
				xml_AddElement(xml, L"td", L"class=\"C\"", Jobs[i]->GetInterval());
		}
		xml += L"</tr>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"起動まで");
		for (i = 0; i < Jobs.size(); i++) {
			if (!Jobs[i]->IsActive() || Jobs[i]->IsWorking())
				xml_AddElement(xml, L"td", L"class=\"C\"", L"-");
			else
				xml_AddElement(xml, L"td", L"class=\"C\"", Jobs[i]->GetRemain());
		}
		xml += L"</tr>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"接続回数");
		for (i = 0; i < Jobs.size(); i++) {
			if (!Jobs[i]->IsActive())
				xml_AddElement(xml, L"td", L"class=\"R\"", L"-");
			else
				xml_AddElement(xml, L"td", L"class=\"N\"", Jobs[i]->GetTotalSessionCount());
		}
		xml += L"</tr>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"up");
		for (i = 0; i < Jobs.size(); i++) {
			if (!Jobs[i]->IsActive())
				xml_AddElement(xml, L"td", L"class=\"R\"", L"-");
			else
				xml_AddElement(xml, L"td", L"class=\"N\"", Jobs[i]->GetSendByte());
		}
		xml += L"</tr>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"down");
		for (i = 0; i < Jobs.size(); i++) {
			if (!Jobs[i]->IsActive())
				xml_AddElement(xml, L"td", L"class=\"R\"", L"-");
			else
				xml_AddElement(xml, L"td", L"class=\"N\"", Jobs[i]->GetRecvByte());
		}
		xml += L"</tr>"EOL;
		//
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"up+down");
		for (i = 0; i < Jobs.size(); i++) {
			if (!Jobs[i]->IsActive())
				xml_AddElement(xml, L"td", L"class=\"R\"", L"-");
			else
				xml_AddElement(xml, L"td", L"class=\"N\"", Jobs[i]->GetSendByte()+Jobs[i]->GetRecvByte());
		}
		xml += L"</tr>"EOL;
		xml += L"</table>"EOL;
		xml += L"<table>"EOL;
		xml += L"<tr>"EOL;
		xml_AddElement(xml, L"td", L"type=\"h\"", L"同時接続数ピーク");
		xml_AddElement(xml, L"td", L"class=\"N\"", Client->GetSessionPeak());
		xml += L"</tr>"EOL;
		xml += L"</table>"EOL;
		xml += L"</category>"EOL;

		if (O2DEBUG && TRACE_CONNECTIONS && !pub) {
			//
			//	Connections
			//
			xml += L"<category>"EOL;
			xml_AddElement(xml, L"caption", NULL, L"Connections");
			xml += L"<table>"EOL;
			xml += L"<tr>"EOL;
			xml_AddElement(xml, L"td", L"type=\"h\"", L"");
			xml_AddElement(xml, L"td", L"type=\"h\"", L"IP");
			xml_AddElement(xml, L"td", L"type=\"h\"", L"Port");
			xml_AddElement(xml, L"td", L"type=\"h\"", L"接続時間(s)");
			xml_AddElement(xml, L"td", L"type=\"h\"", L"recv");
			xml_AddElement(xml, L"td", L"type=\"h\"", L"send");
			xml_AddElement(xml, L"td", L"type=\"h\"", L"rbuff");
			xml += L"</tr>"EOL;
			O2SocketSessionPList lst;
			time_t now = time(NULL);
			Server_P2P->GetSessionList(lst);
			for (O2SocketSessionPListIt it = lst.begin(); it != lst.end(); it++) {
				O2SocketSession *ss = *it;
				wstring e_ip;
				ip2e(ss->ip, e_ip);
				xml += L"<tr>"EOL;
				xml_AddElement(xml, L"td", L"class=\"C\"", L"Server");
				xml_AddElement(xml, L"td", L"class=\"C\"", e_ip.c_str());
				xml_AddElement(xml, L"td", L"class=\"C\"", ss->port);
				xml_AddElement(xml, L"td", L"class=\"R\"", now - ss->connect_t);
				xml_AddElement(xml, L"td", L"class=\"N\"", ss->rbuffoffset);
				xml_AddElement(xml, L"td", L"class=\"N\"", ss->sbuffoffset);
				wstring rbuff;
				ascii2unicode(ss->rbuff, rbuff);
				xml_AddElement(xml, L"td", L"class=\"L\"", rbuff.c_str(), true);
				xml += L"</tr>"EOL;
				delete *it;
			}
			lst.clear();
			Client->GetSessionList(lst);
			for (O2SocketSessionPListIt it = lst.begin(); it != lst.end(); it++) {
				O2SocketSession *ss = *it;
				wstring e_ip;
				ip2e(ss->ip, e_ip);
				xml += L"<tr>"EOL;
				xml_AddElement(xml, L"td", L"class=\"C\"", L"Agent");
				xml_AddElement(xml, L"td", L"class=\"C\"", e_ip.c_str());
				xml_AddElement(xml, L"td", L"class=\"C\"", ss->port);
				xml_AddElement(xml, L"td", L"class=\"R\"", now - ss->connect_t);
				xml_AddElement(xml, L"td", L"class=\"N\"", ss->rbuffoffset);
				xml_AddElement(xml, L"td", L"class=\"N\"", ss->sbuffoffset);
				wstring rbuff;
				ascii2unicode(ss->rbuff, rbuff);
				xml_AddElement(xml, L"td", L"class=\"L\"", rbuff.c_str(), true);
				xml += L"</tr>"EOL;
				delete *it;
			}
			xml += L"</table>"EOL;
			xml += L"</category>"EOL;
		}
	}
	xml += L"</report>"EOL;

	FromUnicode(_T(DEFAULT_XML_CHARSET), xml, out);
}
コード例 #19
0
ファイル: redir.cpp プロジェクト: andrik78/edc-examples
static bool _open_fds(const char* filename, int flags, int mode, _FD_STRUCT* fds)
{
	WCHAR	filenameW[1024];
	ascii2unicode(filename, filenameW, 1024);
	return _wopen_fds(filenameW, flags, mode, fds);
}
コード例 #20
0
ファイル: O2Protocol.hpp プロジェクト: Hiroyuki-Nagata/o2on
	// -----------------------------------------------------------------------
	//	GetNodeInfoFromHeader
	// -----------------------------------------------------------------------
	bool GetNodeInfoFromHeader(const HTTPHeader &header
							 , const ulong ip
							 , const ushort port
							 , O2Node &node)
	{
		strmap::const_iterator it;

		//ID
		it = header.fields.find(X_O2_NODE_ID);
		if (it == header.fields.end())
			return false;
		node.id.assign(it->second.c_str(), it->second.size());

		//IP
		node.ip = ip;

		//Port
		if (header.GetType() == HTTPHEADERTYPE_REQUEST) {
			it = header.fields.find(X_O2_PORT);
			if (it == header.fields.end())
				return false;
			node.port = (ushort)strtoul(it->second.c_str(), NULL, 10);
		}
		else
			node.port = port;

		//RSA Public Key
		it = header.fields.find(X_O2_RSAPUBLICKEY);
		if (it == header.fields.end())
			return false;
		node.pubkey.assign(it->second.c_str(), it->second.size());

		//NodeName
		it = header.fields.find(X_O2_NODENAME);
		if (it != header.fields.end())
			ToUnicode(_T(DEFAULT_XML_CHARSET), it->second, node.name);

		//Flags
		it = header.fields.find(X_O2_NODE_FLAGS);
		if (it != header.fields.end())
			ascii2unicode(it->second, node.flags);

		//User-Agent
		byte status;
		switch (header.GetType()) {
			case HTTPHEADERTYPE_REQUEST:
				it = header.fields.find("User-Agent");
				status = O2_NODESTATUS_LINKEDFROM;
				break;
			case HTTPHEADERTYPE_RESPONSE:
				it = header.fields.find("Server");
				status = O2_NODESTATUS_LINKEDTO;
				break;
			default:
				return false;
		}
		if (it == header.fields.end())
			return false;
		ascii2unicode(it->second, node.ua);

		// ノードのユーザーエージェントから情報を取得
		// O2/0.2 (o2on/0.02.0027; Win32)
		// O2/0.2 (opy2on/0.00.0001; Linux x86_64)
		//など「O2/プロトコルバージョン (アプリ名/アプリバージョン; 環境等)」形式であること
		size_t ProtoNamePos = node.ua.find(L"O2/", 0);
		if (ProtoNamePos != 0) {
			// プロトコル名が見つからない
			return false;
		}
		size_t AppNamePeriodPos = node.ua.find(L" ", ProtoNamePos);
		if ( AppNamePeriodPos == wstring::npos ) {
			// プロトコル・アプリ名の区切りが見つからない
			return false;
		}
		node.proto_ver = node.ua.substr( 3, AppNamePeriodPos - 3 );
		size_t AppNameStartPos = node.ua.find(L"(", AppNamePeriodPos);
		if (( AppNameStartPos == wstring::npos ) || ((AppNameStartPos + 1) == node.ua.size() )) {
			// アプリ名の開始位置が見つからない
			return false;
		}
		AppNameStartPos++;
		size_t AppNameEndPos = node.ua.find(L"/", AppNameStartPos);
		if ( AppNameEndPos == wstring::npos ) {
			// アプリ名の終了位置が見つからない
			return false;
		}
		node.app_name = node.ua.substr( AppNameStartPos, AppNameEndPos - AppNameStartPos );
 		if ((wcscmp(node.app_name.c_str(), _T(APP_NAME)) == 0) && ((AppNameEndPos + 1) < node.ua.size() )) {
			// 同じアプリならバージョン番号を取得
			AppNameEndPos++;
			size_t VerEndPos = node.ua.find(L";", AppNameEndPos);
			if ( VerEndPos == wstring::npos ) {
				// バージョン番号の終了位置が見つからない
				return false;
			}
			node.app_ver = node.ua.substr(AppNameEndPos, VerEndPos - AppNameEndPos);
		}
		else 
		{
			wchar_t tmpW[128];
			swprintf_s(tmpW, 128, L"異なるアプリ:%s\n", node.app_name.c_str());
			TRACEW(tmpW);
		}

		return true;
	}
コード例 #21
0
ファイル: LiveTracker.cpp プロジェクト: PhilColbert/LK8000
// Do a transaction with server
// returns received bytes, -1 if transaction failed
static int DoTransactionToServer(char *txbuf, unsigned int txbuflen, char *rxbuf, unsigned int maxrxbuflen)
{
  SOCKET s = INVALID_SOCKET;
  unsigned int sent = 0;
  int tmpres;
  int rxfsm = 0;
  unsigned int rxlen = 0;
  char recvbuf[BUFSIZ];
  unsigned char cdata;

  s = EstablishConnection(_server_name, _server_port);
  if ( s==INVALID_SOCKET ) return -1;

  //Send the query to the server
  while(sent < txbuflen) {
    tmpres = send(s, txbuf+sent, txbuflen-sent, 0);
    if( tmpres == SOCKET_ERROR ) {
      rxlen = -1;
      goto cleanup;
    }
    sent += tmpres;
  }

  //Receive the page
  while( (tmpres = recv(s, recvbuf, BUFSIZ, 0)) > 0) {
    for (int i=0; i<tmpres; i++) {
      cdata = recvbuf[i];
      switch (rxfsm) {
        default:
        case 0:
          if (cdata=='\r') rxfsm++;
          break;
        case 1:
          if (cdata=='\n') { rxfsm++; break; }
          rxfsm=0;
          break;
        case 2:
          if (cdata=='\r') { rxfsm++; break; }
          rxfsm=0;
          break;
        case 3:
          if (cdata=='\n') { rxfsm++; rxlen=0; break; }
          rxfsm=0;
          break;
        case 4:
          //Content chr
          rxbuf[rxlen] = cdata;
          if (rxlen<maxrxbuflen) rxlen++;
          break;
      }//sw
    } //for
  } //wh

  if(tmpres == SOCKET_ERROR) {
    rxlen = -1;
    goto cleanup;
  }  

  rxbuf[rxlen]=0;
  #ifdef LT_DEBUG
  TCHAR urxbuf[500];
  ascii2unicode(rxbuf,urxbuf,400);
  StartupStore(TEXT("Livetracker recv len=%d: %s%s"), rxlen, urxbuf, NEWLINE);
  #endif
cleanup:
  closesocket(s);
  return rxlen;
}
コード例 #22
0
ファイル: chap_ms.c プロジェクト: jhbsz/DIR-850L_A1
/*
 * Set mppe_xxxx_key from MS-CHAPv2 credentials. (see RFC 3079)
 */
static void
SetMasterKeys(char *secret, int secret_len, u_char NTResponse[24], int IsServer)
{
    SHA1_CTX	sha1Context;
    u_char	unicodePassword[MAX_NT_PASSWORD * 2];
    u_char	PasswordHash[MD4_SIGNATURE_SIZE];
    u_char	PasswordHashHash[MD4_SIGNATURE_SIZE];
    u_char	MasterKey[SHA1_SIGNATURE_SIZE];	/* >= MPPE_MAX_KEY_LEN */
    u_char	Digest[SHA1_SIGNATURE_SIZE];	/* >= MPPE_MAX_KEY_LEN */

    u_char SHApad1[40] =
    {   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
    };
    u_char SHApad2[40] =
    {   0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
        0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
        0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2,
        0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2, 0xf2
    };

    /* "This is the MPPE Master Key" */
    u_char Magic1[27] =
    {   0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74,
        0x68, 0x65, 0x20, 0x4d, 0x50, 0x50, 0x45, 0x20, 0x4d,
        0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4b, 0x65, 0x79
    };
    /* "On the client side, this is the send key; "
       "on the server side, it is the receive key." */
    u_char Magic2[84] =
    {   0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69,
        0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20,
        0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
        0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x6b, 0x65, 0x79,
        0x3b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
        0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73, 0x69, 0x64, 0x65,
        0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
        0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20,
        0x6b, 0x65, 0x79, 0x2e
    };
    /* "On the client side, this is the receive key; "
       "on the server side, it is the send key." */
    u_char Magic3[84] =
    {   0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69,
        0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20,
        0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
        0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20,
        0x6b, 0x65, 0x79, 0x3b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68,
        0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73,
        0x69, 0x64, 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73,
        0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20,
        0x6b, 0x65, 0x79, 0x2e
    };
    u_char *s;

    /* Hash (x2) the Unicode version of the secret (== password). */
    ascii2unicode(secret, secret_len, unicodePassword);
    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);
    NTPasswordHash(PasswordHash, sizeof(PasswordHash), PasswordHashHash);

    SHA1_Init(&sha1Context);
    SHA1_Update(&sha1Context, PasswordHashHash, sizeof(PasswordHashHash));
    SHA1_Update(&sha1Context, NTResponse, 24);
    SHA1_Update(&sha1Context, Magic1, sizeof(Magic1));
    SHA1_Final(MasterKey, &sha1Context);

    /*
     * generate send key
     */
    if (IsServer)
        s = Magic3;
    else
        s = Magic2;
    SHA1_Init(&sha1Context);
    SHA1_Update(&sha1Context, MasterKey, 16);
    SHA1_Update(&sha1Context, SHApad1, sizeof(SHApad1));
    SHA1_Update(&sha1Context, s, 84);
    SHA1_Update(&sha1Context, SHApad2, sizeof(SHApad2));
    SHA1_Final(Digest, &sha1Context);

    BCOPY(Digest, mppe_send_key, sizeof(mppe_send_key));

    /*
     * generate recv key
     */
    if (IsServer)
        s = Magic2;
    else
        s = Magic3;
    SHA1_Init(&sha1Context);
    SHA1_Update(&sha1Context, MasterKey, 16);
    SHA1_Update(&sha1Context, SHApad1, sizeof(SHApad1));
    SHA1_Update(&sha1Context, s, 84);
    SHA1_Update(&sha1Context, SHApad2, sizeof(SHApad2));
    SHA1_Final(Digest, &sha1Context);

    BCOPY(Digest, mppe_recv_key, sizeof(mppe_recv_key));
}
コード例 #23
0
ファイル: lwip_chap_ms.c プロジェクト: 0xc0170/mbed
/*
 * Set mppe_xxxx_key from MS-CHAPv2 credentials. (see RFC 3079)
 */
static void SetMasterKeys(ppp_pcb *pcb, const char *secret, int secret_len, u_char NTResponse[24], int IsServer) {
    u_char	unicodePassword[MAX_NT_PASSWORD * 2];
    u_char	PasswordHash[MD4_SIGNATURE_SIZE];
    u_char	PasswordHashHash[MD4_SIGNATURE_SIZE];
    lwip_sha1_context	sha1Context;
    u_char	MasterKey[SHA1_SIGNATURE_SIZE];	/* >= MPPE_MAX_KEY_LEN */
    u_char	Digest[SHA1_SIGNATURE_SIZE];	/* >= MPPE_MAX_KEY_LEN */
    const u_char *s;

    /* "This is the MPPE Master Key" */
    static const u_char Magic1[27] =
	{ 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74,
	  0x68, 0x65, 0x20, 0x4d, 0x50, 0x50, 0x45, 0x20, 0x4d,
	  0x61, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4b, 0x65, 0x79 };
    /* "On the client side, this is the send key; "
       "on the server side, it is the receive key." */
    static const u_char Magic2[84] =
	{ 0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69,
	  0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20,
	  0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
	  0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20, 0x6b, 0x65, 0x79,
	  0x3b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73,
	  0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73, 0x69, 0x64, 0x65,
	  0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
	  0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20,
	  0x6b, 0x65, 0x79, 0x2e };
    /* "On the client side, this is the receive key; "
       "on the server side, it is the send key." */
    static const u_char Magic3[84] =
	{ 0x4f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69,
	  0x65, 0x6e, 0x74, 0x20, 0x73, 0x69, 0x64, 0x65, 0x2c, 0x20,
	  0x74, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68,
	  0x65, 0x20, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x20,
	  0x6b, 0x65, 0x79, 0x3b, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68,
	  0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73,
	  0x69, 0x64, 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73,
	  0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x6e, 0x64, 0x20,
	  0x6b, 0x65, 0x79, 0x2e };

    /* Hash (x2) the Unicode version of the secret (== password). */
    ascii2unicode(secret, secret_len, unicodePassword);
    NTPasswordHash(unicodePassword, secret_len * 2, PasswordHash);
    NTPasswordHash(PasswordHash, sizeof(PasswordHash), PasswordHashHash);

    lwip_sha1_init(&sha1Context);
    lwip_sha1_starts(&sha1Context);
    lwip_sha1_update(&sha1Context, PasswordHashHash, MD4_SIGNATURE_SIZE);
    lwip_sha1_update(&sha1Context, NTResponse, 24);
    lwip_sha1_update(&sha1Context, Magic1, sizeof(Magic1));
    lwip_sha1_finish(&sha1Context, MasterKey);
    lwip_sha1_free(&sha1Context);

    /*
     * generate send key
     */
    if (IsServer)
	s = Magic3;
    else
	s = Magic2;
    lwip_sha1_init(&sha1Context);
    lwip_sha1_starts(&sha1Context);
    lwip_sha1_update(&sha1Context, MasterKey, 16);
    lwip_sha1_update(&sha1Context, mppe_sha1_pad1, SHA1_PAD_SIZE);
    lwip_sha1_update(&sha1Context, s, 84);
    lwip_sha1_update(&sha1Context, mppe_sha1_pad2, SHA1_PAD_SIZE);
    lwip_sha1_finish(&sha1Context, Digest);
    lwip_sha1_free(&sha1Context);

    mppe_set_key(pcb, &pcb->mppe_comp, Digest);

    /*
     * generate recv key
     */
    if (IsServer)
	s = Magic2;
    else
	s = Magic3;
    lwip_sha1_init(&sha1Context);
    lwip_sha1_starts(&sha1Context);
    lwip_sha1_update(&sha1Context, MasterKey, 16);
    lwip_sha1_update(&sha1Context, mppe_sha1_pad1, SHA1_PAD_SIZE);
    lwip_sha1_update(&sha1Context, s, 84);
    lwip_sha1_update(&sha1Context, mppe_sha1_pad2, SHA1_PAD_SIZE);
    lwip_sha1_finish(&sha1Context, Digest);
    lwip_sha1_free(&sha1Context);

    mppe_set_key(pcb, &pcb->mppe_decomp, Digest);

    pcb->mppe_keys_set = 1;
}
コード例 #24
0
static efi_status_t dir_read(struct file_handle *fh, u64 *buffer_size,
		void *buffer)
{
	struct efi_file_info *info = buffer;
	struct fs_dirent *dent;
	unsigned int required_size;

	if (!fh->dirs) {
		assert(fh->offset == 0);
		fh->dirs = fs_opendir(fh->path);
		if (!fh->dirs)
			return EFI_DEVICE_ERROR;
	}

	/*
	 * So this is a bit awkward.  Since fs layer is stateful and we
	 * can't rewind an entry, in the EFI_BUFFER_TOO_SMALL case below
	 * we might have to return without consuming the dent.. so we
	 * have to stash it for next call.
	 */
	if (fh->dent) {
		dent = fh->dent;
		fh->dent = NULL;
	} else {
		dent = fs_readdir(fh->dirs);
	}


	if (!dent) {
		/* no more files in directory: */
		/* workaround shim.efi bug/quirk.. as find_boot_csv()
		 * loops through directory contents, it initially calls
		 * read w/ zero length buffer to find out how much mem
		 * to allocate for the EFI_FILE_INFO, then allocates,
		 * and then calls a 2nd time.  If we return size of
		 * zero the first time, it happily passes that to
		 * AllocateZeroPool(), and when that returns NULL it
		 * thinks it is EFI_OUT_OF_RESOURCES.  So on first
		 * call return a non-zero size:
		 */
		if (*buffer_size == 0)
			*buffer_size = sizeof(*info);
		else
			*buffer_size = 0;
		return EFI_SUCCESS;
	}

	/* check buffer size: */
	required_size = sizeof(*info) + 2 * (strlen(dent->name) + 1);
	if (*buffer_size < required_size) {
		*buffer_size = required_size;
		fh->dent = dent;
		return EFI_BUFFER_TOO_SMALL;
	}

	*buffer_size = required_size;
	memset(info, 0, required_size);

	info->size = required_size;
	info->file_size = dent->size;
	info->physical_size = dent->size;

	if (dent->type == FS_DT_DIR)
		info->attribute |= EFI_FILE_DIRECTORY;

	ascii2unicode((u16 *)info->file_name, dent->name);

	fh->offset++;

	return EFI_SUCCESS;
}
コード例 #25
0
static efi_status_t EFIAPI efi_file_getinfo(struct efi_file_handle *file,
					    const efi_guid_t *info_type,
					    efi_uintn_t *buffer_size,
					    void *buffer)
{
	struct file_handle *fh = to_fh(file);
	efi_status_t ret = EFI_SUCCESS;

	EFI_ENTRY("%p, %p, %p, %p", file, info_type, buffer_size, buffer);

	if (!guidcmp(info_type, &efi_file_info_guid)) {
		struct efi_file_info *info = buffer;
		char *filename = basename(fh);
		unsigned int required_size;
		loff_t file_size;

		/* check buffer size: */
		required_size = sizeof(*info) + 2 * (strlen(filename) + 1);
		if (*buffer_size < required_size) {
			*buffer_size = required_size;
			ret = EFI_BUFFER_TOO_SMALL;
			goto error;
		}

		if (set_blk_dev(fh)) {
			ret = EFI_DEVICE_ERROR;
			goto error;
		}

		if (fs_size(fh->path, &file_size)) {
			ret = EFI_DEVICE_ERROR;
			goto error;
		}

		memset(info, 0, required_size);

		info->size = required_size;
		info->file_size = file_size;
		info->physical_size = file_size;

		if (fh->isdir)
			info->attribute |= EFI_FILE_DIRECTORY;

		ascii2unicode((u16 *)info->file_name, filename);
	} else if (!guidcmp(info_type, &efi_file_system_info_guid)) {
		struct efi_file_system_info *info = buffer;
		disk_partition_t part;
		efi_uintn_t required_size;
		int r;

		if (fh->fs->part >= 1)
			r = part_get_info(fh->fs->desc, fh->fs->part, &part);
		else
			r = part_get_info_whole_disk(fh->fs->desc, &part);
		if (r < 0) {
			ret = EFI_DEVICE_ERROR;
			goto error;
		}
		required_size = sizeof(info) + 2 *
				(strlen((const char *)part.name) + 1);
		if (*buffer_size < required_size) {
			*buffer_size = required_size;
			ret = EFI_BUFFER_TOO_SMALL;
			goto error;
		}

		memset(info, 0, required_size);

		info->size = required_size;
		info->read_only = true;
		info->volume_size = part.size * part.blksz;
		info->free_space = 0;
		info->block_size = part.blksz;
		/*
		 * TODO: The volume label is not available in U-Boot.
		 * Use the partition name as substitute.
		 */
		ascii2unicode((u16 *)info->volume_label,
			      (const char *)part.name);
	} else {
		ret = EFI_UNSUPPORTED;
	}

error:
	return EFI_EXIT(ret);
}