OSDN Git Service

Fix the commit.
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Sat, 12 Apr 2014 12:50:03 +0000 (21:50 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Sat, 12 Apr 2014 12:50:03 +0000 (21:50 +0900)
updater.c [new file with mode: 0644]
updater.h [new file with mode: 0644]

diff --git a/updater.c b/updater.c
new file mode 100644 (file)
index 0000000..8503de6
--- /dev/null
+++ b/updater.c
@@ -0,0 +1,94 @@
+// updater.c\r
+// Copyright (C) 2014 Suguru Kawamoto\r
+// ソフトウェア自動更新\r
+\r
+#include <ws2tcpip.h>\r
+#include <windows.h>\r
+#include <mmsystem.h>\r
+typedef SOCKADDR_STORAGE_XP SOCKADDR_STORAGE;\r
+typedef SOCKADDR_STORAGE *PSOCKADDR_STORAGE, FAR *LPSOCKADDR_STORAGE;\r
+#include <winhttp.h>\r
+\r
+#include "updater.h"\r
+#include "socketwrapper.h"\r
+#include "protectprocess.h"\r
+\r
+BOOL DownloadFileViaHTTP(void* pOut, DWORD Length, DWORD* pLength, LPCWSTR UserAgent, LPCWSTR ServerName, LPCWSTR ObjectName)\r
+{\r
+       BOOL bResult;\r
+       HINTERNET hSession;\r
+       HINTERNET hConnect;\r
+       HINTERNET hRequest;\r
+       bResult = FALSE;\r
+       if(hSession = WinHttpOpen(UserAgent, WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0))\r
+       {\r
+               if(hConnect = WinHttpConnect(hSession, ServerName, INTERNET_DEFAULT_HTTP_PORT, 0))\r
+               {\r
+                       if(hRequest = WinHttpOpenRequest(hConnect, L"GET", ObjectName, NULL, WINHTTP_NO_REFERER, WINHTTP_DEFAULT_ACCEPT_TYPES, 0))\r
+                       {\r
+                               if(WinHttpSendRequest(hRequest, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0))\r
+                               {\r
+                                       if(WinHttpReceiveResponse(hRequest, NULL))\r
+                                       {\r
+                                               if(WinHttpQueryDataAvailable(hRequest, pLength))\r
+                                               {\r
+                                                       if(*pLength <= Length)\r
+                                                       {\r
+                                                               if(WinHttpReadData(hRequest, pOut, Length, pLength))\r
+                                                                       bResult = TRUE;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                               WinHttpCloseHandle(hRequest);\r
+                       }\r
+                       WinHttpCloseHandle(hConnect);\r
+               }\r
+               WinHttpCloseHandle(hSession);\r
+       }\r
+       return bResult;\r
+}\r
+\r
+// FFFTPの更新情報を確認\r
+BOOL CheckForUpdates()\r
+{\r
+       BOOL bResult;\r
+       BYTE Buf1[4096];\r
+       BYTE Buf2[1024];\r
+       BYTE Hash[20];\r
+       DWORD Length;\r
+       bResult = FALSE;\r
+       if(DownloadFileViaHTTP(&Buf1, sizeof(Buf1), &Length, HTTP_USER_AGENT, UPDATE_SERVER, UPDATE_HASH_PATH))\r
+       {\r
+               if(DecryptSignature(UPDATE_RSA_PUBLIC_KEY, &Buf1, Length, &Buf2, sizeof(Buf2), &Length))\r
+               {\r
+                       if(Length >= 20)\r
+                       {\r
+                               if(memcmp(&Buf2[0], UPDATE_SIGNATURE, 20) == 0)\r
+                               {\r
+                                       if(DownloadFileViaHTTP(&Buf1, sizeof(Buf1), &Length, HTTP_USER_AGENT, UPDATE_SERVER, UPDATE_LIST_PATH))\r
+                                       {\r
+                                               if(GetSHA1HashOfMemory(&Buf1, Length, &Hash))\r
+                                               {\r
+                                                       if(memcmp(&Hash, &Buf2[20], 20) == 0)\r
+                                                       {\r
+                                                               // TODO: 更新情報を解析\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+       return bResult;\r
+}\r
+\r
+// 別のプロセスでFFFTPを更新\r
+BOOL StartUpdateProcess()\r
+{\r
+       BOOL bResult;\r
+       bResult = FALSE;\r
+       // TODO: CreateProcess()\r
+       return bResult;\r
+}\r
+\r
diff --git a/updater.h b/updater.h
new file mode 100644 (file)
index 0000000..ff08feb
--- /dev/null
+++ b/updater.h
@@ -0,0 +1,30 @@
+// updater.h\r
+// Copyright (C) 2014 Suguru Kawamoto\r
+// ソフトウェア自動更新\r
+\r
+#ifndef __UPDATER_H__\r
+#define __UPDATER_H__\r
+\r
+#include <windows.h>\r
+\r
+#define HTTP_USER_AGENT L"Mozilla/4.0"\r
+#define UPDATE_SERVER L"ffftp.sourceforge.jp"\r
+#define UPDATE_HASH_PATH L"/update/hash"\r
+#define UPDATE_LIST_PATH L"/update/list"\r
+#define UPDATE_RSA_PUBLIC_KEY \\r
+       "-----BEGIN PUBLIC KEY-----\n" \\r
+       "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmJvR902LFeKcP9ldQfVQ\n" \\r
+       "F11f3Ph+KDZRIaMM30lBV77atXKuhJunbrjoiocakoSI7UZ1e7Em/Vx7DKi09Hu5\n" \\r
+       "P0Qr5VU4OZ1CoO0bLsot7kKm2LbvLvVD/D92Ff4nhTMD5jhtsdp/XIbRjcdRj+TI\n" \\r
+       "BmEdGOL62vXZ5XjZbrO3CRis7g0Ft/ojSgH1Qd3QSck5IJ3+L7844uIF9SB73xME\n" \\r
+       "RuL+tG2n+VGajM6Hi6xJ1ssbpr7iLB69QmQ5swIaJSiY8oE950mL+EBNFmI3Md0N\n" \\r
+       "vr4tDG8+fq/VhQB64k5hfgWaBImKYaEfftvg51L7yRX+CttgV6GM85ls41H/NDPM\n" \\r
+       "CwIDAQAB\n" \\r
+       "-----END PUBLIC KEY-----\n"\r
+#define UPDATE_SIGNATURE "\x15\x48\x1D\x36\x13\x9D\xA3\x84\x2F\x06\x73\x40\x74\xAC\xED\xFC\x2D\xED\x75\x86"\r
+\r
+BOOL CheckForUpdates();\r
+BOOL StartUpdateProcess();\r
+\r
+#endif\r
+\r