winevt_c 0.9.1 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,425 +1,425 @@
1
- #include <winevt_c.h>
2
-
3
- /* clang-format off */
4
- /*
5
- * Document-class: Winevt::EventLog::Session
6
- *
7
- * Manage Session information for Windows EventLog.
8
- *
9
- * @example
10
- * require 'winevt'
11
- *
12
- * @session = Winevt::EventLog::Session.new("127.0.0.1")
13
- *
14
- * @session.domain = "<EXAMPLEGROUP>"
15
- * @session.username = "<username>"
16
- * @session.password = "<password>"
17
- * # Then pass @session veriable into Winevt::EventLog::Query or
18
- * # Winevt::EventLog::Subscribe#subscribe
19
- * @query = Winevt::EventLog::Query.new(
20
- * "Application",
21
- * "*[System[(Level <= 3) and TimeCreated[timediff(@SystemTime) <= 86400000]]]",
22
- * @session
23
- * )
24
- * # some stuff.
25
- *
26
- * @subscribe = Winevt::EventLog::Subscribe.new
27
- * @subscribe.subscribe(
28
- * "Application",
29
- * "*[System[(Level <= 4) and TimeCreated[timediff(@SystemTime) <= 86400000]]]",
30
- * @session
31
- * )
32
- * # And some stuff.
33
- * @since v0.9.0
34
- */
35
- /* clang-format on */
36
-
37
- VALUE rb_cSession;
38
- VALUE rb_cRpcLoginFlag;
39
-
40
- static void session_free(void* ptr);
41
-
42
- static const rb_data_type_t rb_winevt_session_type = { "winevt/session",
43
- {
44
- 0,
45
- session_free,
46
- 0,
47
- },
48
- NULL,
49
- NULL,
50
- RUBY_TYPED_FREE_IMMEDIATELY };
51
-
52
- static void
53
- session_free(void* ptr)
54
- {
55
- struct WinevtSession* winevtSession = (struct WinevtSession*)ptr;
56
-
57
- if (winevtSession->server)
58
- free(winevtSession->server);
59
- if (winevtSession->domain)
60
- free(winevtSession->domain);
61
- if (winevtSession->username)
62
- free(winevtSession->username);
63
- if (winevtSession->password)
64
- free(winevtSession->password);
65
-
66
- xfree(ptr);
67
- }
68
-
69
- static VALUE
70
- rb_winevt_session_alloc(VALUE klass)
71
- {
72
- VALUE obj;
73
- struct WinevtSession* winevtSession;
74
- obj = TypedData_Make_Struct(
75
- klass, struct WinevtSession, &rb_winevt_session_type, winevtSession);
76
- return obj;
77
- }
78
-
79
- /*
80
- * Initalize Session class.
81
- *
82
- * @overload initialize(server, domain=nil, username=nil, password=nil, flags=Winevt::EventLog::Session::RpcLoginFlag::AuthDefault)
83
- * @param server [String] Server ip address or fqdn.
84
- * @param domain [String] Domain name.
85
- * @param username [String] username on remote server.
86
- * @param password [String] Remote server user password.
87
- * @param flags [Integer] Flags for authentication method choices.
88
- * @return [Session]
89
- *
90
- */
91
-
92
- static VALUE
93
- rb_winevt_session_initialize(VALUE self)
94
- {
95
- struct WinevtSession* winevtSession;
96
-
97
- TypedData_Get_Struct(
98
- self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
99
-
100
- winevtSession->server = NULL;
101
- winevtSession->domain = NULL;
102
- winevtSession->username = NULL;
103
- winevtSession->password = NULL;
104
- winevtSession->flags = EvtRpcLoginAuthDefault;
105
-
106
- return Qnil;
107
- }
108
-
109
- /*
110
- * This method returns server for remoting access.
111
- *
112
- * @return [String]
113
- */
114
- static VALUE
115
- rb_winevt_session_get_server(VALUE self)
116
- {
117
- struct WinevtSession* winevtSession;
118
-
119
- TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
120
-
121
- if (winevtSession->server) {
122
- return wstr_to_rb_str(CP_UTF8, winevtSession->server, -1);
123
- } else {
124
- return rb_str_new2("(NULL)");
125
- }
126
- }
127
-
128
- /*
129
- * This method specifies server for remoting access.
130
- *
131
- * @param rb_server [String] server
132
- */
133
- static VALUE
134
- rb_winevt_session_set_server(VALUE self, VALUE rb_server)
135
- {
136
- struct WinevtSession* winevtSession;
137
- DWORD len;
138
- VALUE vserverBuf;
139
- PWSTR wServer;
140
-
141
- Check_Type(rb_server, T_STRING);
142
-
143
- TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
144
-
145
- len =
146
- MultiByteToWideChar(CP_UTF8, 0,
147
- RSTRING_PTR(rb_server), RSTRING_LEN(rb_server),
148
- NULL, 0);
149
- wServer = ALLOCV_N(WCHAR, vserverBuf, len + 1);
150
- MultiByteToWideChar(CP_UTF8, 0,
151
- RSTRING_PTR(rb_server), RSTRING_LEN(rb_server),
152
- wServer, len);
153
- winevtSession->server = _wcsdup(wServer);
154
- wServer[len] = L'\0';
155
-
156
- ALLOCV_END(vserverBuf);
157
-
158
- return Qnil;
159
- }
160
-
161
- /*
162
- * This method returns domain for remoting access.
163
- *
164
- * @return [String]
165
- */
166
- static VALUE
167
- rb_winevt_session_get_domain(VALUE self)
168
- {
169
- struct WinevtSession* winevtSession;
170
-
171
- TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
172
-
173
- if (winevtSession->domain) {
174
- return wstr_to_rb_str(CP_UTF8, winevtSession->domain, -1);
175
- } else {
176
- return rb_str_new2("(NULL)");
177
- }
178
- }
179
-
180
- /*
181
- * This method specifies domain for remoting access.
182
- *
183
- * @param rb_domain [String] domain
184
- */
185
- static VALUE
186
- rb_winevt_session_set_domain(VALUE self, VALUE rb_domain)
187
- {
188
- struct WinevtSession* winevtSession;
189
- DWORD len;
190
- VALUE vdomainBuf;
191
- PWSTR wDomain;
192
-
193
- Check_Type(rb_domain, T_STRING);
194
-
195
- TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
196
-
197
- len =
198
- MultiByteToWideChar(CP_UTF8, 0,
199
- RSTRING_PTR(rb_domain), RSTRING_LEN(rb_domain),
200
- NULL, 0);
201
- wDomain = ALLOCV_N(WCHAR, vdomainBuf, len + 1);
202
- MultiByteToWideChar(CP_UTF8, 0,
203
- RSTRING_PTR(rb_domain), RSTRING_LEN(rb_domain),
204
- wDomain, len);
205
- wDomain[len] = L'\0';
206
-
207
- winevtSession->domain = _wcsdup(wDomain);
208
-
209
- ALLOCV_END(vdomainBuf);
210
-
211
- return Qnil;
212
- }
213
-
214
- /*
215
- * This method returns username for remoting access.
216
- *
217
- * @return [String]
218
- */
219
- static VALUE
220
- rb_winevt_session_get_username(VALUE self)
221
- {
222
- struct WinevtSession* winevtSession;
223
-
224
- TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
225
-
226
- if (winevtSession->username) {
227
- return wstr_to_rb_str(CP_UTF8, winevtSession->username, -1);
228
- } else {
229
- return rb_str_new2("(NULL)");
230
- }
231
- }
232
-
233
- /*
234
- * This method specifies username for remoting access.
235
- *
236
- * @param rb_username [String] username
237
- */
238
- static VALUE
239
- rb_winevt_session_set_username(VALUE self, VALUE rb_username)
240
- {
241
- struct WinevtSession* winevtSession;
242
- DWORD len;
243
- VALUE vusernameBuf;
244
- PWSTR wUsername;
245
-
246
- Check_Type(rb_username, T_STRING);
247
-
248
- TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
249
-
250
- len =
251
- MultiByteToWideChar(CP_UTF8, 0,
252
- RSTRING_PTR(rb_username), RSTRING_LEN(rb_username),
253
- NULL, 0);
254
- wUsername = ALLOCV_N(WCHAR, vusernameBuf, len + 1);
255
- MultiByteToWideChar(CP_UTF8, 0,
256
- RSTRING_PTR(rb_username), RSTRING_LEN(rb_username),
257
- wUsername, len);
258
- wUsername[len] = L'\0';
259
-
260
- winevtSession->username = _wcsdup(wUsername);
261
-
262
- ALLOCV_END(vusernameBuf);
263
-
264
- return Qnil;
265
- }
266
-
267
- /*
268
- * This method returns password for remoting access.
269
- *
270
- * @return [String]
271
- */
272
- static VALUE
273
- rb_winevt_session_get_password(VALUE self)
274
- {
275
- struct WinevtSession* winevtSession;
276
-
277
- TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
278
-
279
- if (winevtSession->password) {
280
- return wstr_to_rb_str(CP_UTF8, winevtSession->password, -1);
281
- } else {
282
- return rb_str_new2("(NULL)");
283
- }
284
- }
285
-
286
- /*
287
- * This method specifies password for remoting access.
288
- *
289
- * @param rb_password [String] password
290
- */
291
- static VALUE
292
- rb_winevt_session_set_password(VALUE self, VALUE rb_password)
293
- {
294
- struct WinevtSession* winevtSession;
295
- DWORD len;
296
- VALUE vpasswordBuf;
297
- PWSTR wPassword;
298
-
299
- Check_Type(rb_password, T_STRING);
300
-
301
- TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
302
-
303
- len =
304
- MultiByteToWideChar(CP_UTF8, 0,
305
- RSTRING_PTR(rb_password), RSTRING_LEN(rb_password),
306
- NULL, 0);
307
- wPassword = ALLOCV_N(WCHAR, vpasswordBuf, len + 1);
308
- MultiByteToWideChar(CP_UTF8, 0,
309
- RSTRING_PTR(rb_password), RSTRING_LEN(rb_password),
310
- wPassword, len);
311
- wPassword[len] = L'\0';
312
-
313
- winevtSession->password = _wcsdup(wPassword);
314
-
315
- ALLOCV_END(vpasswordBuf);
316
-
317
- return Qnil;
318
- }
319
-
320
- /*
321
- * This method returns flags for remoting access.
322
- *
323
- * @return [Integer]
324
- */
325
- static VALUE
326
- rb_winevt_session_get_flags(VALUE self)
327
- {
328
- struct WinevtSession* winevtSession;
329
-
330
- TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
331
-
332
- return LONG2NUM(winevtSession->flags);
333
- }
334
-
335
- static DWORD
336
- get_session_rpc_login_flag_from_cstr(char* flag_str)
337
- {
338
- if (strcmp(flag_str, "default") == 0)
339
- return EvtRpcLoginAuthDefault;
340
- else if (strcmp(flag_str, "negociate") == 0)
341
- return EvtRpcLoginAuthNegotiate;
342
- else if (strcmp(flag_str, "kerberos") == 0)
343
- return EvtRpcLoginAuthKerberos;
344
- else if (strcmp(flag_str, "ntlm") == 0)
345
- return EvtRpcLoginAuthNTLM;
346
- else
347
- rb_raise(rb_eArgError, "Unknown rpc login flag: %s", flag_str);
348
-
349
- return 0;
350
- }
351
-
352
-
353
- /*
354
- * This method specifies flags for remoting access.
355
- *
356
- * @param rb_flags [Integer] flags
357
- */
358
- static VALUE
359
- rb_winevt_session_set_flags(VALUE self, VALUE rb_flags)
360
- {
361
- struct WinevtSession* winevtSession;
362
- EVT_RPC_LOGIN_FLAGS flags = EvtRpcLoginAuthDefault;
363
-
364
- TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
365
-
366
- switch(TYPE(rb_flags)) {
367
- case T_SYMBOL:
368
- flags = get_session_rpc_login_flag_from_cstr(RSTRING_PTR(rb_sym2str(rb_flags)));
369
- break;
370
- case T_STRING:
371
- flags = get_session_rpc_login_flag_from_cstr(StringValuePtr(rb_flags));
372
- break;
373
- case T_FIXNUM:
374
- flags = NUM2LONG(rb_flags);
375
- break;
376
- default:
377
- rb_raise(rb_eArgError, "Expected Symbol, String or Fixnum in flags");
378
- }
379
- winevtSession->flags = flags;
380
-
381
- return Qnil;
382
- }
383
-
384
- void
385
- Init_winevt_session(VALUE rb_cEventLog)
386
- {
387
- rb_cSession = rb_define_class_under(rb_cEventLog, "Session", rb_cObject);
388
-
389
- rb_define_alloc_func(rb_cSession, rb_winevt_session_alloc);
390
-
391
- rb_cRpcLoginFlag = rb_define_module_under(rb_cSession, "RpcLoginFlag");
392
-
393
- rb_define_method(rb_cSession, "initialize", rb_winevt_session_initialize, 0);
394
- rb_define_method(rb_cSession, "server", rb_winevt_session_get_server, 0);
395
- rb_define_method(rb_cSession, "server=", rb_winevt_session_set_server, 1);
396
- rb_define_method(rb_cSession, "domain", rb_winevt_session_get_domain, 0);
397
- rb_define_method(rb_cSession, "domain=", rb_winevt_session_set_domain, 1);
398
- rb_define_method(rb_cSession, "username", rb_winevt_session_get_username, 0);
399
- rb_define_method(rb_cSession, "username=", rb_winevt_session_set_username, 1);
400
- rb_define_method(rb_cSession, "password", rb_winevt_session_get_password, 0);
401
- rb_define_method(rb_cSession, "password=", rb_winevt_session_set_password, 1);
402
- rb_define_method(rb_cSession, "flags", rb_winevt_session_get_flags, 0);
403
- rb_define_method(rb_cSession, "flags=", rb_winevt_session_set_flags, 1);
404
-
405
- /*
406
- * EVT_RPC_LOGIN_FLAGS enumeration: EvtRpcLoginAuthDefault
407
- * @see https://docs.microsoft.com/en-us/windows/win32/api/winevt/ne-winevt-evt_rpc_login_flags
408
- */
409
- rb_define_const(rb_cRpcLoginFlag, "AuthDefault", LONG2NUM(EvtRpcLoginAuthDefault));
410
- /*
411
- * EVT_RPC_LOGIN_FLAGS enumeration: EvtRpcLoginAuthNegociate
412
- * @see https://docs.microsoft.com/en-us/windows/win32/api/winevt/ne-winevt-evt_rpc_login_flags
413
- */
414
- rb_define_const(rb_cRpcLoginFlag, "AuthNegociate", LONG2NUM(EvtRpcLoginAuthNegotiate));
415
- /*
416
- * EVT_RPC_LOGIN_FLAGS enumeration: EvtRpcLoginAuthKerberos
417
- * @see https://docs.microsoft.com/en-us/windows/win32/api/winevt/ne-winevt-evt_rpc_login_flags
418
- */
419
- rb_define_const(rb_cRpcLoginFlag, "AuthKerberos", LONG2NUM(EvtRpcLoginAuthKerberos));
420
- /*
421
- * EVT_RPC_LOGIN_FLAGS enumeration: EvtRpcLoginAuthNTLM
422
- * @see https://docs.microsoft.com/en-us/windows/win32/api/winevt/ne-winevt-evt_rpc_login_flags
423
- */
424
- rb_define_const(rb_cRpcLoginFlag, "AuthNTLM", LONG2NUM(EvtRpcLoginAuthNTLM));
425
- }
1
+ #include <winevt_c.h>
2
+
3
+ /* clang-format off */
4
+ /*
5
+ * Document-class: Winevt::EventLog::Session
6
+ *
7
+ * Manage Session information for Windows EventLog.
8
+ *
9
+ * @example
10
+ * require 'winevt'
11
+ *
12
+ * @session = Winevt::EventLog::Session.new("127.0.0.1")
13
+ *
14
+ * @session.domain = "<EXAMPLEGROUP>"
15
+ * @session.username = "<username>"
16
+ * @session.password = "<password>"
17
+ * # Then pass @session veriable into Winevt::EventLog::Query or
18
+ * # Winevt::EventLog::Subscribe#subscribe
19
+ * @query = Winevt::EventLog::Query.new(
20
+ * "Application",
21
+ * "*[System[(Level <= 3) and TimeCreated[timediff(@SystemTime) <= 86400000]]]",
22
+ * @session
23
+ * )
24
+ * # some stuff.
25
+ *
26
+ * @subscribe = Winevt::EventLog::Subscribe.new
27
+ * @subscribe.subscribe(
28
+ * "Application",
29
+ * "*[System[(Level <= 4) and TimeCreated[timediff(@SystemTime) <= 86400000]]]",
30
+ * @session
31
+ * )
32
+ * # And some stuff.
33
+ * @since v0.9.0
34
+ */
35
+ /* clang-format on */
36
+
37
+ VALUE rb_cSession;
38
+ VALUE rb_cRpcLoginFlag;
39
+
40
+ static void session_free(void* ptr);
41
+
42
+ static const rb_data_type_t rb_winevt_session_type = { "winevt/session",
43
+ {
44
+ 0,
45
+ session_free,
46
+ 0,
47
+ },
48
+ NULL,
49
+ NULL,
50
+ RUBY_TYPED_FREE_IMMEDIATELY };
51
+
52
+ static void
53
+ session_free(void* ptr)
54
+ {
55
+ struct WinevtSession* winevtSession = (struct WinevtSession*)ptr;
56
+
57
+ if (winevtSession->server)
58
+ free(winevtSession->server);
59
+ if (winevtSession->domain)
60
+ free(winevtSession->domain);
61
+ if (winevtSession->username)
62
+ free(winevtSession->username);
63
+ if (winevtSession->password)
64
+ free(winevtSession->password);
65
+
66
+ xfree(ptr);
67
+ }
68
+
69
+ static VALUE
70
+ rb_winevt_session_alloc(VALUE klass)
71
+ {
72
+ VALUE obj;
73
+ struct WinevtSession* winevtSession;
74
+ obj = TypedData_Make_Struct(
75
+ klass, struct WinevtSession, &rb_winevt_session_type, winevtSession);
76
+ return obj;
77
+ }
78
+
79
+ /*
80
+ * Initalize Session class.
81
+ *
82
+ * @overload initialize(server, domain=nil, username=nil, password=nil, flags=Winevt::EventLog::Session::RpcLoginFlag::AuthDefault)
83
+ * @param server [String] Server ip address or fqdn.
84
+ * @param domain [String] Domain name.
85
+ * @param username [String] username on remote server.
86
+ * @param password [String] Remote server user password.
87
+ * @param flags [Integer] Flags for authentication method choices.
88
+ * @return [Session]
89
+ *
90
+ */
91
+
92
+ static VALUE
93
+ rb_winevt_session_initialize(VALUE self)
94
+ {
95
+ struct WinevtSession* winevtSession;
96
+
97
+ TypedData_Get_Struct(
98
+ self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
99
+
100
+ winevtSession->server = NULL;
101
+ winevtSession->domain = NULL;
102
+ winevtSession->username = NULL;
103
+ winevtSession->password = NULL;
104
+ winevtSession->flags = EvtRpcLoginAuthDefault;
105
+
106
+ return Qnil;
107
+ }
108
+
109
+ /*
110
+ * This method returns server for remoting access.
111
+ *
112
+ * @return [String]
113
+ */
114
+ static VALUE
115
+ rb_winevt_session_get_server(VALUE self)
116
+ {
117
+ struct WinevtSession* winevtSession;
118
+
119
+ TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
120
+
121
+ if (winevtSession->server) {
122
+ return wstr_to_rb_str(CP_UTF8, winevtSession->server, -1);
123
+ } else {
124
+ return rb_str_new2("(NULL)");
125
+ }
126
+ }
127
+
128
+ /*
129
+ * This method specifies server for remoting access.
130
+ *
131
+ * @param rb_server [String] server
132
+ */
133
+ static VALUE
134
+ rb_winevt_session_set_server(VALUE self, VALUE rb_server)
135
+ {
136
+ struct WinevtSession* winevtSession;
137
+ DWORD len;
138
+ VALUE vserverBuf;
139
+ PWSTR wServer;
140
+
141
+ Check_Type(rb_server, T_STRING);
142
+
143
+ TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
144
+
145
+ len =
146
+ MultiByteToWideChar(CP_UTF8, 0,
147
+ RSTRING_PTR(rb_server), RSTRING_LEN(rb_server),
148
+ NULL, 0);
149
+ wServer = ALLOCV_N(WCHAR, vserverBuf, len + 1);
150
+ MultiByteToWideChar(CP_UTF8, 0,
151
+ RSTRING_PTR(rb_server), RSTRING_LEN(rb_server),
152
+ wServer, len);
153
+ winevtSession->server = _wcsdup(wServer);
154
+ wServer[len] = L'\0';
155
+
156
+ ALLOCV_END(vserverBuf);
157
+
158
+ return Qnil;
159
+ }
160
+
161
+ /*
162
+ * This method returns domain for remoting access.
163
+ *
164
+ * @return [String]
165
+ */
166
+ static VALUE
167
+ rb_winevt_session_get_domain(VALUE self)
168
+ {
169
+ struct WinevtSession* winevtSession;
170
+
171
+ TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
172
+
173
+ if (winevtSession->domain) {
174
+ return wstr_to_rb_str(CP_UTF8, winevtSession->domain, -1);
175
+ } else {
176
+ return rb_str_new2("(NULL)");
177
+ }
178
+ }
179
+
180
+ /*
181
+ * This method specifies domain for remoting access.
182
+ *
183
+ * @param rb_domain [String] domain
184
+ */
185
+ static VALUE
186
+ rb_winevt_session_set_domain(VALUE self, VALUE rb_domain)
187
+ {
188
+ struct WinevtSession* winevtSession;
189
+ DWORD len;
190
+ VALUE vdomainBuf;
191
+ PWSTR wDomain;
192
+
193
+ Check_Type(rb_domain, T_STRING);
194
+
195
+ TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
196
+
197
+ len =
198
+ MultiByteToWideChar(CP_UTF8, 0,
199
+ RSTRING_PTR(rb_domain), RSTRING_LEN(rb_domain),
200
+ NULL, 0);
201
+ wDomain = ALLOCV_N(WCHAR, vdomainBuf, len + 1);
202
+ MultiByteToWideChar(CP_UTF8, 0,
203
+ RSTRING_PTR(rb_domain), RSTRING_LEN(rb_domain),
204
+ wDomain, len);
205
+ wDomain[len] = L'\0';
206
+
207
+ winevtSession->domain = _wcsdup(wDomain);
208
+
209
+ ALLOCV_END(vdomainBuf);
210
+
211
+ return Qnil;
212
+ }
213
+
214
+ /*
215
+ * This method returns username for remoting access.
216
+ *
217
+ * @return [String]
218
+ */
219
+ static VALUE
220
+ rb_winevt_session_get_username(VALUE self)
221
+ {
222
+ struct WinevtSession* winevtSession;
223
+
224
+ TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
225
+
226
+ if (winevtSession->username) {
227
+ return wstr_to_rb_str(CP_UTF8, winevtSession->username, -1);
228
+ } else {
229
+ return rb_str_new2("(NULL)");
230
+ }
231
+ }
232
+
233
+ /*
234
+ * This method specifies username for remoting access.
235
+ *
236
+ * @param rb_username [String] username
237
+ */
238
+ static VALUE
239
+ rb_winevt_session_set_username(VALUE self, VALUE rb_username)
240
+ {
241
+ struct WinevtSession* winevtSession;
242
+ DWORD len;
243
+ VALUE vusernameBuf;
244
+ PWSTR wUsername;
245
+
246
+ Check_Type(rb_username, T_STRING);
247
+
248
+ TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
249
+
250
+ len =
251
+ MultiByteToWideChar(CP_UTF8, 0,
252
+ RSTRING_PTR(rb_username), RSTRING_LEN(rb_username),
253
+ NULL, 0);
254
+ wUsername = ALLOCV_N(WCHAR, vusernameBuf, len + 1);
255
+ MultiByteToWideChar(CP_UTF8, 0,
256
+ RSTRING_PTR(rb_username), RSTRING_LEN(rb_username),
257
+ wUsername, len);
258
+ wUsername[len] = L'\0';
259
+
260
+ winevtSession->username = _wcsdup(wUsername);
261
+
262
+ ALLOCV_END(vusernameBuf);
263
+
264
+ return Qnil;
265
+ }
266
+
267
+ /*
268
+ * This method returns password for remoting access.
269
+ *
270
+ * @return [String]
271
+ */
272
+ static VALUE
273
+ rb_winevt_session_get_password(VALUE self)
274
+ {
275
+ struct WinevtSession* winevtSession;
276
+
277
+ TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
278
+
279
+ if (winevtSession->password) {
280
+ return wstr_to_rb_str(CP_UTF8, winevtSession->password, -1);
281
+ } else {
282
+ return rb_str_new2("(NULL)");
283
+ }
284
+ }
285
+
286
+ /*
287
+ * This method specifies password for remoting access.
288
+ *
289
+ * @param rb_password [String] password
290
+ */
291
+ static VALUE
292
+ rb_winevt_session_set_password(VALUE self, VALUE rb_password)
293
+ {
294
+ struct WinevtSession* winevtSession;
295
+ DWORD len;
296
+ VALUE vpasswordBuf;
297
+ PWSTR wPassword;
298
+
299
+ Check_Type(rb_password, T_STRING);
300
+
301
+ TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
302
+
303
+ len =
304
+ MultiByteToWideChar(CP_UTF8, 0,
305
+ RSTRING_PTR(rb_password), RSTRING_LEN(rb_password),
306
+ NULL, 0);
307
+ wPassword = ALLOCV_N(WCHAR, vpasswordBuf, len + 1);
308
+ MultiByteToWideChar(CP_UTF8, 0,
309
+ RSTRING_PTR(rb_password), RSTRING_LEN(rb_password),
310
+ wPassword, len);
311
+ wPassword[len] = L'\0';
312
+
313
+ winevtSession->password = _wcsdup(wPassword);
314
+
315
+ ALLOCV_END(vpasswordBuf);
316
+
317
+ return Qnil;
318
+ }
319
+
320
+ /*
321
+ * This method returns flags for remoting access.
322
+ *
323
+ * @return [Integer]
324
+ */
325
+ static VALUE
326
+ rb_winevt_session_get_flags(VALUE self)
327
+ {
328
+ struct WinevtSession* winevtSession;
329
+
330
+ TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
331
+
332
+ return LONG2NUM(winevtSession->flags);
333
+ }
334
+
335
+ static DWORD
336
+ get_session_rpc_login_flag_from_cstr(char* flag_str)
337
+ {
338
+ if (strcmp(flag_str, "default") == 0)
339
+ return EvtRpcLoginAuthDefault;
340
+ else if (strcmp(flag_str, "negociate") == 0)
341
+ return EvtRpcLoginAuthNegotiate;
342
+ else if (strcmp(flag_str, "kerberos") == 0)
343
+ return EvtRpcLoginAuthKerberos;
344
+ else if (strcmp(flag_str, "ntlm") == 0)
345
+ return EvtRpcLoginAuthNTLM;
346
+ else
347
+ rb_raise(rb_eArgError, "Unknown rpc login flag: %s", flag_str);
348
+
349
+ return 0;
350
+ }
351
+
352
+
353
+ /*
354
+ * This method specifies flags for remoting access.
355
+ *
356
+ * @param rb_flags [Integer] flags
357
+ */
358
+ static VALUE
359
+ rb_winevt_session_set_flags(VALUE self, VALUE rb_flags)
360
+ {
361
+ struct WinevtSession* winevtSession;
362
+ EVT_RPC_LOGIN_FLAGS flags = EvtRpcLoginAuthDefault;
363
+
364
+ TypedData_Get_Struct(self, struct WinevtSession, &rb_winevt_session_type, winevtSession);
365
+
366
+ switch(TYPE(rb_flags)) {
367
+ case T_SYMBOL:
368
+ flags = get_session_rpc_login_flag_from_cstr(RSTRING_PTR(rb_sym2str(rb_flags)));
369
+ break;
370
+ case T_STRING:
371
+ flags = get_session_rpc_login_flag_from_cstr(StringValuePtr(rb_flags));
372
+ break;
373
+ case T_FIXNUM:
374
+ flags = NUM2LONG(rb_flags);
375
+ break;
376
+ default:
377
+ rb_raise(rb_eArgError, "Expected Symbol, String or Fixnum in flags");
378
+ }
379
+ winevtSession->flags = flags;
380
+
381
+ return Qnil;
382
+ }
383
+
384
+ void
385
+ Init_winevt_session(VALUE rb_cEventLog)
386
+ {
387
+ rb_cSession = rb_define_class_under(rb_cEventLog, "Session", rb_cObject);
388
+
389
+ rb_define_alloc_func(rb_cSession, rb_winevt_session_alloc);
390
+
391
+ rb_cRpcLoginFlag = rb_define_module_under(rb_cSession, "RpcLoginFlag");
392
+
393
+ rb_define_method(rb_cSession, "initialize", rb_winevt_session_initialize, 0);
394
+ rb_define_method(rb_cSession, "server", rb_winevt_session_get_server, 0);
395
+ rb_define_method(rb_cSession, "server=", rb_winevt_session_set_server, 1);
396
+ rb_define_method(rb_cSession, "domain", rb_winevt_session_get_domain, 0);
397
+ rb_define_method(rb_cSession, "domain=", rb_winevt_session_set_domain, 1);
398
+ rb_define_method(rb_cSession, "username", rb_winevt_session_get_username, 0);
399
+ rb_define_method(rb_cSession, "username=", rb_winevt_session_set_username, 1);
400
+ rb_define_method(rb_cSession, "password", rb_winevt_session_get_password, 0);
401
+ rb_define_method(rb_cSession, "password=", rb_winevt_session_set_password, 1);
402
+ rb_define_method(rb_cSession, "flags", rb_winevt_session_get_flags, 0);
403
+ rb_define_method(rb_cSession, "flags=", rb_winevt_session_set_flags, 1);
404
+
405
+ /*
406
+ * EVT_RPC_LOGIN_FLAGS enumeration: EvtRpcLoginAuthDefault
407
+ * @see https://docs.microsoft.com/en-us/windows/win32/api/winevt/ne-winevt-evt_rpc_login_flags
408
+ */
409
+ rb_define_const(rb_cRpcLoginFlag, "AuthDefault", LONG2NUM(EvtRpcLoginAuthDefault));
410
+ /*
411
+ * EVT_RPC_LOGIN_FLAGS enumeration: EvtRpcLoginAuthNegociate
412
+ * @see https://docs.microsoft.com/en-us/windows/win32/api/winevt/ne-winevt-evt_rpc_login_flags
413
+ */
414
+ rb_define_const(rb_cRpcLoginFlag, "AuthNegociate", LONG2NUM(EvtRpcLoginAuthNegotiate));
415
+ /*
416
+ * EVT_RPC_LOGIN_FLAGS enumeration: EvtRpcLoginAuthKerberos
417
+ * @see https://docs.microsoft.com/en-us/windows/win32/api/winevt/ne-winevt-evt_rpc_login_flags
418
+ */
419
+ rb_define_const(rb_cRpcLoginFlag, "AuthKerberos", LONG2NUM(EvtRpcLoginAuthKerberos));
420
+ /*
421
+ * EVT_RPC_LOGIN_FLAGS enumeration: EvtRpcLoginAuthNTLM
422
+ * @see https://docs.microsoft.com/en-us/windows/win32/api/winevt/ne-winevt-evt_rpc_login_flags
423
+ */
424
+ rb_define_const(rb_cRpcLoginFlag, "AuthNTLM", LONG2NUM(EvtRpcLoginAuthNTLM));
425
+ }