forked from mirrors/gecko-dev
		
	 d0732b6e03
			
		
	
	
		d0732b6e03
		
	
	
	
	
		
			
			Differential Revision: https://phabricator.services.mozilla.com/D50750 --HG-- extra : moz-landing-system : lando
		
			
				
	
	
		
			149 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			149 lines
		
	
	
	
		
			4.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| ChromeUtils.defineModuleGetter(
 | |
|   this,
 | |
|   "ctypes",
 | |
|   "resource://gre/modules/ctypes.jsm"
 | |
| );
 | |
| 
 | |
| add_task(async function() {
 | |
|   let migrator = await MigrationUtils.getMigrator("ie");
 | |
|   // Sanity check for the source.
 | |
|   Assert.ok(await migrator.isSourceAvailable());
 | |
| 
 | |
|   // Windows versions newer than 1709 don't store cookies as files anymore,
 | |
|   // thus our migrators don't import anything and this test is pointless.
 | |
|   // In these versions the CookD folder contains a deprecated.cookie file.
 | |
|   let deprecatedCookie = Services.dirsvc.get("CookD", Ci.nsIFile);
 | |
|   deprecatedCookie.append("deprecated.cookie");
 | |
|   if (deprecatedCookie.exists()) {
 | |
|     return;
 | |
|   }
 | |
| 
 | |
|   const BOOL = ctypes.bool;
 | |
|   const LPCTSTR = ctypes.char16_t.ptr;
 | |
|   const DWORD = ctypes.uint32_t;
 | |
|   const LPDWORD = DWORD.ptr;
 | |
| 
 | |
|   let wininet = ctypes.open("Wininet");
 | |
| 
 | |
|   /*
 | |
|   BOOL InternetSetCookieW(
 | |
|     _In_  LPCTSTR lpszUrl,
 | |
|     _In_  LPCTSTR lpszCookieName,
 | |
|     _In_  LPCTSTR lpszCookieData
 | |
|   );
 | |
|   */
 | |
|   // NOTE: Even though MSDN documentation does not indicate a calling convention,
 | |
|   // InternetSetCookieW is declared in SDK headers as __stdcall but is exported
 | |
|   // from wininet.dll without name mangling, so it is effectively winapi_abi
 | |
|   let setIECookie = wininet.declare(
 | |
|     "InternetSetCookieW",
 | |
|     ctypes.winapi_abi,
 | |
|     BOOL,
 | |
|     LPCTSTR,
 | |
|     LPCTSTR,
 | |
|     LPCTSTR
 | |
|   );
 | |
| 
 | |
|   /*
 | |
|   BOOL InternetGetCookieW(
 | |
|     _In_    LPCTSTR lpszUrl,
 | |
|     _In_    LPCTSTR lpszCookieName,
 | |
|     _Out_   LPCTSTR  lpszCookieData,
 | |
|     _Inout_ LPDWORD lpdwSize
 | |
|   );
 | |
|   */
 | |
|   // NOTE: Even though MSDN documentation does not indicate a calling convention,
 | |
|   // InternetGetCookieW is declared in SDK headers as __stdcall but is exported
 | |
|   // from wininet.dll without name mangling, so it is effectively winapi_abi
 | |
|   let getIECookie = wininet.declare(
 | |
|     "InternetGetCookieW",
 | |
|     ctypes.winapi_abi,
 | |
|     BOOL,
 | |
|     LPCTSTR,
 | |
|     LPCTSTR,
 | |
|     LPCTSTR,
 | |
|     LPDWORD
 | |
|   );
 | |
| 
 | |
|   // We need to randomize the cookie to avoid clashing with other cookies
 | |
|   // that might have been set by previous tests and not properly cleared.
 | |
|   let date = new Date().getDate();
 | |
|   const COOKIE = {
 | |
|     get host() {
 | |
|       return new URL(this.href).host;
 | |
|     },
 | |
|     href: `http://mycookietest.${Math.random()}.com`,
 | |
|     name: "testcookie",
 | |
|     value: "testvalue",
 | |
|     expiry: new Date(new Date().setDate(date + 2)),
 | |
|   };
 | |
|   let data = ctypes.char16_t.array()(256);
 | |
|   let sizeRef = DWORD(256).address();
 | |
| 
 | |
|   registerCleanupFunction(() => {
 | |
|     // Remove the cookie.
 | |
|     try {
 | |
|       let expired = new Date(new Date().setDate(date - 2));
 | |
|       let rv = setIECookie(
 | |
|         COOKIE.href,
 | |
|         COOKIE.name,
 | |
|         `; expires=${expired.toUTCString()}`
 | |
|       );
 | |
|       Assert.ok(rv, "Expired the IE cookie");
 | |
|       Assert.ok(
 | |
|         !getIECookie(COOKIE.href, COOKIE.name, data, sizeRef),
 | |
|         "The cookie has been properly removed"
 | |
|       );
 | |
|     } catch (ex) {}
 | |
| 
 | |
|     // Close the library.
 | |
|     try {
 | |
|       wininet.close();
 | |
|     } catch (ex) {}
 | |
|   });
 | |
| 
 | |
|   // Create the persistent cookie in IE.
 | |
|   let value = `${COOKIE.value}; expires=${COOKIE.expiry.toUTCString()}`;
 | |
|   let rv = setIECookie(COOKIE.href, COOKIE.name, value);
 | |
|   Assert.ok(rv, "Added a persistent IE cookie: " + value);
 | |
| 
 | |
|   // Sanity check the cookie has been created.
 | |
|   Assert.ok(
 | |
|     getIECookie(COOKIE.href, COOKIE.name, data, sizeRef),
 | |
|     "Found the added persistent IE cookie"
 | |
|   );
 | |
|   info("Found cookie: " + data.readString());
 | |
|   Assert.equal(
 | |
|     data.readString(),
 | |
|     `${COOKIE.name}=${COOKIE.value}`,
 | |
|     "Found the expected cookie"
 | |
|   );
 | |
| 
 | |
|   // Sanity check that there are no cookies.
 | |
|   Assert.equal(
 | |
|     Services.cookies.countCookiesFromHost(COOKIE.host),
 | |
|     0,
 | |
|     "There are no cookies initially"
 | |
|   );
 | |
| 
 | |
|   // Migrate cookies.
 | |
|   await promiseMigration(migrator, MigrationUtils.resourceTypes.COOKIES);
 | |
| 
 | |
|   Assert.equal(
 | |
|     Services.cookies.countCookiesFromHost(COOKIE.host),
 | |
|     1,
 | |
|     "Migrated the expected number of cookies"
 | |
|   );
 | |
| 
 | |
|   // Now check the cookie details.
 | |
|   let cookies = Services.cookies.getCookiesFromHost(COOKIE.host, {});
 | |
|   Assert.ok(cookies.length);
 | |
|   let foundCookie = cookies[0];
 | |
| 
 | |
|   Assert.equal(foundCookie.name, COOKIE.name);
 | |
|   Assert.equal(foundCookie.value, COOKIE.value);
 | |
|   Assert.equal(foundCookie.host, "." + COOKIE.host);
 | |
|   Assert.equal(foundCookie.expiry, Math.floor(COOKIE.expiry / 1000));
 | |
| });
 |