//----------------------------------------------------------------------------
//FILE IO FUNCTIONS
//----------------------------------------------------------------------------
var blogcrypt_FileIO = {
	// kulcs felvétele
	add_passwd_to_db: function(domain, keyID, password)
	{
		var str=blogcrypt_FileIO.read_key_db(); //jelszó adatbázis elkérése
		var passwd_in_db=blogcrypt_FileIO.get_passwd_from_db(domain,keyID); //jelszó elkérése
		// ha a jelszó nincs az adatbázisban
		if(passwd_in_db==false)
		{
			// jelszó felvétele a struktúra végére
			str=str+domain+';'+keyID+';'+password+'\n';
			blogcrypt_FileIO.write_key_db(str);
		}
		else // ha benne van
		{
			if(passwd_in_db!=password) // ha felülírás szükséges, akkor rákérdezünk
				if(confirm("Key exists!\nDomain: "+domain+"\nKeyID: "+keyID+"\n Would you like to overwrite it?"))
				{
					blogcrypt_FileIO.delete_passwd_from_db(domain, keyID); // ha felül kell írni, akkor törlöm
					blogcrypt_FileIO.add_passwd_to_db(domain, keyID, password); // hozzáadom (itt már nem lesz ütközés)
					return true;
				}
				else
				{
					return false;
				}
		}
		return true;
	},

	//egy kulcs elkérése
	get_passwd_from_db: function(domain, keyID)
	{
		var str=blogcrypt_FileIO.read_key_db(); // a nyers string elkérése
		
		//tördelés
		var rows=str.split('\n'); //sorokra
		var key_table=new Array();
		for(var i=0;i<rows.length;i++)
		{	//sorok tördelése
			key_table[i]=rows[i].split(';');
			//kulcs keresése
			if((key_table[i][0]==domain)&&(key_table[i][1]==keyID))
			{
				return key_table[i][2];
			}
		}
		// keresés a globális kulcsok között
		for(var i=0;i<rows.length;i++)
		{
			if((key_table[i][0]=="global")&&(key_table[i][1]==keyID))
			{
				return key_table[i][2];
			}
		}
		return false;
	},
	
	// jelszó adatbázis elkérése
	get_passwd_db: function()
	{
		var str=blogcrypt_FileIO.read_key_db();
		//a mátrix előállítása
		var rows=str.split('\n'); //sorok
		var key_table=new Array();
		for(var i=0;i<rows.length;i++)
		{	//sorok tördelése
			key_table[i]=rows[i].split(';');
		}
		return key_table;
	},
	
	//kulcs törlése
	delete_passwd_from_db: function(domain, keyID)
	{
		var str=blogcrypt_FileIO.read_key_db(); //adatbázis elkérése
		var rows=str.split('\n'); //sorokra tördelés
		var key_table=new Array();
		for(var i=0;i<rows.length;i++)
		{	//sorok tördelése
			key_table[i]=rows[i].split(';');
		}
		var newstr=""; //az új adatbázist gyűjtő string
		for(var i=0;i<rows.length-1; i++)
		{
			if(key_table[i][0]==domain && key_table[i][1]==keyID) //ha a kulcs a törlendő
			{
				//akkor nem adjuk hozzá
			}
			else
			{
				//kulcs felvétele - megtartjuk
				newstr=newstr+key_table[i][0]+';'+key_table[i][1]+';'+key_table[i][2]+'\n';
			}
		}
		blogcrypt_FileIO.write_key_db(newstr); //kiírás
	},
	
	// kulcs adatbázis beolvasása
	read_key_db: function()
	{	// a titkosított string elkérése a beállítás kezelőtől
		var	str = Components.classes["@mozilla.org/preferences-service;1"]
         .getService(Components.interfaces.nsIPrefService)
         .getBranch("blogcrypt.").QueryInterface(Components.interfaces.nsIPrefBranch2).getCharPref("keys");

		var masterpasswd=blogcrypt_FileIO.get_master_passwd(); // mesterjelszó  elkérése
		
		var decr=blogcrypt_crypting_functions.decrypt(str,masterpasswd,"AES-CBC-MD5"); //visszafejtés
		return decr;
	},
	
	// adatbázis kiírása
	write_key_db: function(dbstring)
	{
		var masterpasswd=blogcrypt_FileIO.get_master_passwd(); //mesterjelszó
		var encr=blogcrypt_crypting_functions.encrypt(dbstring,masterpasswd,"AES-CBC-MD5"); //a nyílt adatbázis titkosítása
		Components.classes["@mozilla.org/preferences-service;1"]
         .getService(Components.interfaces.nsIPrefService)
         .getBranch("blogcrypt.").QueryInterface(Components.interfaces.nsIPrefBranch2).setCharPref("keys",encr);
		 //kiírás a beállításkezelővel
	},
	
	get_master_passwd: function()
	{
		var hostname = 'chrome://blogcrypt';
		var formSubmitURL = null; 
		var httprealm = 'BC';
		var username = 'Blogcrypt';
		var password;

		try 
		{
			// Get Login Manager 
			var myLoginManager = Components.classes["@mozilla.org/login-manager;1"]
                         .getService(Components.interfaces.nsILoginManager);
			var nsLoginInfo = new Components.Constructor("@mozilla.org/login-manager/loginInfo;1",
                                             Components.interfaces.nsILoginInfo,
                                             "init");

			// Find users for the given parameters
			//var logins = myLoginManager.getAllLogins({});
			var logins = myLoginManager.findLogins({}, hostname, formSubmitURL, httprealm);
			// Find user from returned array of nsILoginInfo objects
			for (var i = 0; i < logins.length; i++) 
			{
				
				if (
					(logins[i].username == username) 
					//&& 	(logins[i].hostname==hostname)
					//&&(logins[i].httprealm==httprealm)
					)
				{
				password = logins[i].password;
				//alert(password);
				return password;
				break;
				}
			}
			var masterpassword=prompt("Type in the master password!");
			 var extLoginInfo = new nsLoginInfo('chrome://blogcrypt',
                      null, 'BC',
                      'Blogcrypt', masterpassword, "", "");
			 myLoginManager.addLogin(extLoginInfo);
			 return masterpassword;
		}catch(ex) { alert(ex.message);}
		return null;
	},
	
	remove_master_passwd: function()
	{
			var hostname = 'chrome://blogcrypt';
		var formSubmitURL = null; 
		var httprealm = 'BC';
		var username = 'Blogcrypt';
		var password;

		try 
		{
					// Get Login Manager 
			var myLoginManager = Components.classes["@mozilla.org/login-manager;1"]
                         .getService(Components.interfaces.nsILoginManager);
			var nsLoginInfo = new Components.Constructor("@mozilla.org/login-manager/loginInfo;1",
                                             Components.interfaces.nsILoginInfo,
                                             "init");

			// Find users for the given parameters
			var logins = myLoginManager.findLogins({}, hostname, formSubmitURL, httprealm);
      
			// Find user from returned array of nsILoginInfo objects
			for (var i = 0; i < logins.length; i++) 
			{
				if (logins[i].username == username) 
				{
				password = logins[i].password;
				var extLoginInfo = new nsLoginInfo('chrome://blogcrypt',
                      null, 'BC',
                      'Blogcrypt', password, "", "");
			 myLoginManager.removeLogin(extLoginInfo);
				
				break;
				}
			}
			 
		}catch(ex) { alert(ex.message);}

	}
};


