Index: crypto_pkcs11.cc |
diff --git a/crypto_pkcs11.cc b/crypto_pkcs11.cc |
index a31aeb940a1e882f3b68478dbf8a4855d09cde42..0f5502b52ac560a1154c65d373d5ef83005ef79d 100644 |
--- a/crypto_pkcs11.cc |
+++ b/crypto_pkcs11.cc |
@@ -499,6 +499,8 @@ bool Pkcs11::Session::InitializeTemplate( |
BindMethod(instance_t, &Pkcs11::Session::FindObjects, "findObjects"); |
BindMethod(instance_t, &Pkcs11::Session::CreateObject, "createObject"); |
+ BindMethod(instance_t, &Pkcs11::Session::LogoutAndClose, "logoutAndClose"); |
+ |
return true; |
} |
@@ -543,6 +545,12 @@ v8::Handle<v8::Value> Pkcs11::Session::Close(const v8::Arguments& args) { |
if (!session_handle_) |
return ThrowException("Not open"); |
+ if (logged_in_) { |
+ if (!OkOrThrow(C_Logout(session_handle_))) |
+ return v8::Undefined(); |
+ logged_in_ = false; |
+ } |
+ |
OkOrThrow(C_CloseSession(session_handle_)); |
session_handle_ = 0; |
return v8::Undefined(); |
@@ -561,6 +569,8 @@ v8::Handle<v8::Value> Pkcs11::Session::Login(const v8::Arguments& args) { |
v8::String::AsciiValue ascii_pin(args[1]); |
+ logged_in_ = false; |
+ |
CK_RV rv = C_Login(session_handle_, user_type, |
reinterpret_cast<CK_CHAR_PTR>(*ascii_pin), |
ascii_pin.length()); |
@@ -571,11 +581,20 @@ v8::Handle<v8::Value> Pkcs11::Session::Login(const v8::Arguments& args) { |
if (!OkOrThrow(rv)) |
return v8::Undefined(); |
+ logged_in_ = true; |
return v8::True(); |
} |
v8::Handle<v8::Value> Pkcs11::Session::Logout(const v8::Arguments& args) { |
OkOrThrow(C_Logout(session_handle_)); |
+ logged_in_ = false; |
+ return v8::Undefined(); |
+} |
+ |
+v8::Handle<v8::Value> Pkcs11::Session::LogoutAndClose( |
+ const v8::Arguments& args) { |
+ Logout(args); |
+ Close(args); |
return v8::Undefined(); |
} |