| 213 | | |
|---|
| 214 | | return CL_ASSIGN; |
|---|
| 215 | | } |
|---|
| | 195 | return process(); |
|---|
| | 196 | } |
|---|
| | 197 | |
|---|
| | 198 | |
|---|
| | 199 | |
|---|
| | 200 | |
|---|
| | 201 | ConsumeLevel ServiceGotek2Dialogue::process() |
|---|
| | 202 | { |
|---|
| | 203 | logPF(); |
|---|
| | 204 | ConsumeLevel cl = CL_ASSIGN; |
|---|
| | 205 | bool needmoredata=false; |
|---|
| | 206 | while ( needmoredata == false && cl == CL_ASSIGN ) |
|---|
| | 207 | { |
|---|
| | 208 | switch ( m_ClientType ) |
|---|
| | 209 | { |
|---|
| | 210 | case GCT_LOGIN: |
|---|
| | 211 | cl= processLOGIN(&needmoredata); |
|---|
| | 212 | break; |
|---|
| | 213 | |
|---|
| | 214 | case GCT_CTRL: |
|---|
| | 215 | cl=processCTRL(&needmoredata); |
|---|
| | 216 | break; |
|---|
| | 217 | |
|---|
| | 218 | case GCT_DATA: |
|---|
| | 219 | cl=processDATA(&needmoredata); |
|---|
| | 220 | break; |
|---|
| | 221 | } |
|---|
| | 222 | } |
|---|
| | 223 | return cl; |
|---|
| | 224 | } |
|---|
| | 225 | |
|---|
| | 226 | ConsumeLevel ServiceGotek2Dialogue::processLOGIN(bool *needmoredata) |
|---|
| | 227 | { |
|---|
| | 228 | logPF(); |
|---|
| | 229 | // verify the packet is complete |
|---|
| | 230 | |
|---|
| | 231 | if (m_Buffer.size() < 5) |
|---|
| | 232 | { |
|---|
| | 233 | *needmoredata = true; |
|---|
| | 234 | return CL_ASSIGN; |
|---|
| | 235 | } |
|---|
| | 236 | |
|---|
| | 237 | GotekPacket gp = GotekPacket(m_Buffer); |
|---|
| | 238 | |
|---|
| | 239 | gp.readByte(); |
|---|
| | 240 | |
|---|
| | 241 | if (m_Buffer.size() < gp.readUnsignedInt32() - 5 ) |
|---|
| | 242 | { |
|---|
| | 243 | *needmoredata = true; |
|---|
| | 244 | return CL_ASSIGN; |
|---|
| | 245 | } |
|---|
| | 246 | |
|---|
| | 247 | // parse the data |
|---|
| | 248 | string hash; |
|---|
| | 249 | unsigned char command; |
|---|
| | 250 | try |
|---|
| | 251 | { |
|---|
| | 252 | gp.readString(); |
|---|
| | 253 | gp.readString(); |
|---|
| | 254 | m_Username = gp.readString(); |
|---|
| | 255 | hash = pg.readRawString(64); |
|---|
| | 256 | command = gp.readByte(); |
|---|
| | 257 | |
|---|
| | 258 | } |
|---|
| | 259 | catch ( GotekException e ) |
|---|
| | 260 | { |
|---|
| | 261 | return CL_DROP; |
|---|
| | 262 | } |
|---|
| | 263 | |
|---|
| | 264 | // verfiy the data is sane |
|---|
| | 265 | if ( command != CTYPE_CTRL && command != CTYPE_DATA ) |
|---|
| | 266 | { |
|---|
| | 267 | return CL_DROP; |
|---|
| | 268 | } |
|---|
| | 269 | |
|---|
| | 270 | for ( char * c = (char *)m_Username.c_str(); * c; ++c ) |
|---|
| | 271 | if ( !isalpha(* c) && * c != '.' && * c != '-' ) |
|---|
| | 272 | return CL_DROP; |
|---|
| | 273 | |
|---|
| | 274 | // create the query context so we know which query returns, so we can answer appropriate |
|---|
| | 275 | |
|---|
| | 276 | SQLContext *sqlctx = new SQLContext(command,time(NULL)); |
|---|
| | 277 | |
|---|
| | 278 | // query |
|---|
| | 279 | string query = "SELECT \"authkey\" FROM \"users-dp\".\"users\" WHERE username = '"; |
|---|
| | 280 | query += m_Username.c_str(); |
|---|
| | 281 | query += "';"; |
|---|
| | 282 | |
|---|
| | 283 | SQLQuery *sqlquery = g_Library->getSQLMgr()->addQuery(&query,this,(void *)sqlctx); |
|---|
| | 284 | m_QueryQueue.push_back(sqlquery); |
|---|
| | 285 | |
|---|
| | 286 | |
|---|
| | 287 | |
|---|
| | 288 | |
|---|
| | 289 | } |
|---|
| | 290 | |
|---|
| | 291 | |
|---|
| | 292 | |
|---|
| | 293 | |
|---|
| | 294 | |
|---|
| | 295 | ConsumeLevel ServiceGotek2Dialogue::processCTRL(bool *needmoredata) |
|---|
| | 296 | { |
|---|
| | 297 | logPF(); |
|---|
| | 298 | |
|---|
| | 299 | if (m_Buffer.size() < 1 ) |
|---|
| | 300 | { |
|---|
| | 301 | *needmoredata = true; |
|---|
| | 302 | return CL_ASSIGN; |
|---|
| | 303 | } |
|---|
| | 304 | |
|---|
| | 305 | if (m_Buffer[0] == CCMD_NOOP) |
|---|
| | 306 | { |
|---|
| | 307 | m_Buffer.erase(0,1); |
|---|
| | 308 | return CL_ASSIGN; |
|---|
| | 309 | } |
|---|
| | 310 | |
|---|
| | 311 | if (m_Buffer.size() < 5) |
|---|
| | 312 | { |
|---|
| | 313 | *needmoredata = true; |
|---|
| | 314 | return CL_ASSIGN; |
|---|
| | 315 | } |
|---|
| | 316 | |
|---|
| | 317 | ConsumeLevel cl = CL_ASSIGN; |
|---|
| | 318 | |
|---|
| | 319 | GotekPacket gp = GotekPacket(m_Buffer); |
|---|
| | 320 | |
|---|
| | 321 | uint8_t command = gp.readByte(); |
|---|
| | 322 | |
|---|
| | 323 | if (m_Buffer.size() < gp.readUnsignedInt32() - 5 ) |
|---|
| | 324 | { |
|---|
| | 325 | *needmoredata = true; |
|---|
| | 326 | return CL_ASSIGN; |
|---|
| | 327 | } |
|---|
| | 328 | |
|---|
| | 329 | try |
|---|
| | 330 | { |
|---|
| | 331 | switch ( command ) |
|---|
| | 332 | { |
|---|
| | 333 | case CCMD_CHECK_PRESENCE: |
|---|
| | 334 | cl = processCTRL_CHECK_PRESENCE(&gp); |
|---|
| | 335 | break; |
|---|
| | 336 | |
|---|
| | 337 | case CCMD_STORE_MAGNET: |
|---|
| | 338 | cl = processCTRL_STORE_MAGNET(&gp); |
|---|
| | 339 | break; |
|---|
| | 340 | |
|---|
| | 341 | case CCMD_REQUEST_NOTIFICATION: |
|---|
| | 342 | cl = processCTRL_REQUEST_NOTIFICATION(&gp); |
|---|
| | 343 | break; |
|---|
| | 344 | |
|---|
| | 345 | case CCMD_REQUEST_SILENCE: |
|---|
| | 346 | cl = processCTRL_REQUEST_SILENCE(&gp); |
|---|
| | 347 | break; |
|---|
| | 348 | |
|---|
| | 349 | case CCMD_REPORT_INSTANCE: |
|---|
| | 350 | cl = processCTRL_REPORT_INSTANCE(&gp); |
|---|
| | 351 | break; |
|---|
| | 352 | } |
|---|
| | 353 | } |
|---|
| | 354 | catch ( GotekException e ) |
|---|
| | 355 | { |
|---|
| | 356 | return CL_DROP; |
|---|
| | 357 | } |
|---|
| | 358 | |
|---|
| | 359 | |
|---|
| | 360 | return cl; |
|---|
| | 361 | } |
|---|
| | 362 | |
|---|
| | 363 | ConsumeLevel ServiceGotek2Dialogue::processCTRL_CHECK_PRESENCE(GotekPacket *gp) |
|---|
| | 364 | { |
|---|
| | 365 | logPF(); |
|---|
| | 366 | return CL_DROP; |
|---|
| | 367 | } |
|---|
| | 368 | |
|---|
| | 369 | ConsumeLevel ServiceGotek2Dialogue::processCTRL_STORE_MAGNET(GotekPacket *gp) |
|---|
| | 370 | { |
|---|
| | 371 | logPF(); |
|---|
| | 372 | return CL_DROP; |
|---|
| | 373 | } |
|---|
| | 374 | |
|---|
| | 375 | ConsumeLevel ServiceGotek2Dialogue::processCTRL_REQUEST_NOTIFICATION(GotekPacket *gp) |
|---|
| | 376 | { |
|---|
| | 377 | logPF(); |
|---|
| | 378 | return CL_DROP; |
|---|
| | 379 | } |
|---|
| | 380 | |
|---|
| | 381 | ConsumeLevel ServiceGotek2Dialogue::processCTRL_REQUEST_SILENCE(GotekPacket *gp) |
|---|
| | 382 | { |
|---|
| | 383 | logPF(); |
|---|
| | 384 | return CL_DROP; |
|---|
| | 385 | } |
|---|
| | 386 | |
|---|
| | 387 | ConsumeLevel ServiceGotek2Dialogue::processCTRL_REPORT_INSTANCE(GotekPacket *gp) |
|---|
| | 388 | { |
|---|
| | 389 | logPF(); |
|---|
| | 390 | return CL_DROP; |
|---|
| | 391 | } |
|---|
| | 392 | |
|---|
| | 393 | |
|---|
| | 394 | |
|---|
| | 395 | |
|---|
| | 396 | ConsumeLevel ServiceGotek2Dialogue::processDATA(bool *needmoredata) |
|---|
| | 397 | { |
|---|
| | 398 | logPF(); |
|---|
| | 399 | return CL_DROP; |
|---|
| | 400 | } |
|---|
| | 401 | |
|---|
| | 402 | ConsumeLevel ServiceGotek2Dialogue::processDATA_MAGNET(GotekPacket *gp) |
|---|
| | 403 | { |
|---|
| | 404 | logPF(); |
|---|
| | 405 | return CL_DROP; |
|---|
| | 406 | } |
|---|
| | 407 | |
|---|
| | 408 | ConsumeLevel ServiceGotek2Dialogue::processDATA_SAMPLE_GET(GotekPacket *gp) |
|---|
| | 409 | { |
|---|
| | 410 | logPF(); |
|---|
| | 411 | return CL_DROP; |
|---|
| | 412 | } |
|---|
| | 413 | |
|---|
| | 414 | ConsumeLevel ServiceGotek2Dialogue::processDATA_SAMPLE_ADD(GotekPacket *gp) |
|---|
| | 415 | { |
|---|
| | 416 | logPF(); |
|---|
| | 417 | return CL_DROP; |
|---|
| | 418 | } |
|---|
| | 419 | |
|---|
| | 420 | ConsumeLevel ServiceGotek2Dialogue::processDATA_SAMPLE_ADD_GZIP(GotekPacket *gp) |
|---|
| | 421 | { |
|---|
| | 422 | logPF(); |
|---|
| | 423 | return CL_DROP; |
|---|
| | 424 | } |
|---|
| | 425 | |
|---|
| 263 | | return true; |
|---|
| 264 | | } |
|---|
| | 473 | logPF(); |
|---|
| | 474 | |
|---|
| | 475 | if ( m_QueryQueue.size() == 0 ) |
|---|
| | 476 | { |
|---|
| | 477 | logCrit("unexpected Query callback for query %s\n",sqlresult->getQuery().c_str()); |
|---|
| | 478 | m_Socket->setStatus(SS_CLOSED); |
|---|
| | 479 | return false; |
|---|
| | 480 | } |
|---|
| | 481 | |
|---|
| | 482 | switch ( m_ClientType ) |
|---|
| | 483 | { |
|---|
| | 484 | case GCT_LOGIN: |
|---|
| | 485 | ret = sqlSuccessLOGIN(sqlresult); |
|---|
| | 486 | break; |
|---|
| | 487 | |
|---|
| | 488 | case GCT_CTRL: |
|---|
| | 489 | ret = sqlSuccessCTRL(sqlresult); |
|---|
| | 490 | break; |
|---|
| | 491 | |
|---|
| | 492 | case GCT_DATA: |
|---|
| | 493 | ret = sqlSuccessDATA(sqlresult); |
|---|
| | 494 | break; |
|---|
| | 495 | } |
|---|
| | 496 | |
|---|
| | 497 | } |
|---|
| | 498 | |
|---|
| | 499 | |
|---|
| | 500 | bool ServiceGotek2Dialogue::sqlSuccessLOGIN(SQLResult *sqlresult) |
|---|
| | 501 | { |
|---|
| | 502 | logPF(); |
|---|
| | 503 | vector< map<string,string> > result = *sqlresult->getResult(); |
|---|
| | 504 | |
|---|
| | 505 | SQLContext *sqlctx = (SQLContext *)sqlresult->getObject(); |
|---|
| | 506 | |
|---|
| | 507 | if ( result.size() == 1 ) |
|---|
| | 508 | { |
|---|
| | 509 | string bkey(result[0]["authkey"].data(), result[0]["authkey"].size()); |
|---|
| | 510 | bkey.append((char *)&m_SessionKey,8); |
|---|
| | 511 | |
|---|
| | 512 | |
|---|
| | 513 | unsigned char hash[64]; |
|---|
| | 514 | g_Library->getUtilities()->sha512((unsigned char *)bkey.c_str(),bkey.size(),hash); |
|---|
| | 515 | |
|---|
| | 516 | if ( memcmp(m_Buffer.data(),hash,64) == 0 ) |
|---|
| | 517 | { |
|---|
| | 518 | logInfo("Login success: %s\n",m_Username.c_str()); |
|---|
| | 519 | if (sqlctx->getCommand() == CTYPE_CTRL ) |
|---|
| | 520 | { |
|---|
| | 521 | m_ClientType = GCT_CONTROL; |
|---|
| | 522 | }else |
|---|
| | 523 | if (sqlctx->getCommand() == CTYPE_DATA ) |
|---|
| | 524 | { |
|---|
| | 525 | m_ClientType = GCT_DATA; |
|---|
| | 526 | } |
|---|
| | 527 | |
|---|
| | 528 | m_Socket->doWrite(&RPL_AUTHORIZED,1); |
|---|
| | 529 | |
|---|
| | 530 | }else |
|---|
| | 531 | { |
|---|
| | 532 | // invalid login |
|---|
| | 533 | logInfo("Login failed: %s\n",m_Username.c_str()); |
|---|
| | 534 | m_Socket->doWrite(&RPL_DENIED,1); |
|---|
| | 535 | m_Socket->setStatus(SS_CLEANQUIT); |
|---|
| | 536 | } |
|---|
| | 537 | |
|---|
| | 538 | } else |
|---|
| | 539 | { |
|---|
| | 540 | // invalid login |
|---|
| | 541 | logInfo("Login failed: %s\n",m_Username.c_str()); |
|---|
| | 542 | m_Socket->doWrite(&RPL_DENIED,1); |
|---|
| | 543 | m_Socket->setStatus(SS_CLEANQUIT); |
|---|
| | 544 | } |
|---|
| | 545 | |
|---|
| | 546 | delete sqlctx; |
|---|
| | 547 | |
|---|
| | 548 | |
|---|
| | 549 | return true; |
|---|
| | 550 | } |
|---|
| | 551 | |
|---|
| | 552 | bool ServiceGotek2Dialogue::sqlSuccessCTRL(SQLResult *sqlresult) |
|---|
| | 553 | { |
|---|
| | 554 | logPF(); |
|---|
| | 555 | |
|---|
| | 556 | return true; |
|---|
| | 557 | } |
|---|
| | 558 | |
|---|
| | 559 | bool ServiceGotek2Dialogue::sqlSuccessDATA(SQLResult *sqlresult) |
|---|
| | 560 | { |
|---|
| | 561 | logPF(); |
|---|
| | 562 | |
|---|
| | 563 | return true; |
|---|
| | 564 | } |
|---|
| | 565 | |
|---|
| | 566 | |
|---|
| | 567 | |
|---|
| | 568 | |
|---|
| | 569 | |
|---|