Пример #1
0
static void _torControlCircuitBuild_circEvent(gpointer moduleData, gint code, gchar* line, gint circID, GString* path, gint status,
		gint buildFlags, gint purpose, gint reason, GDateTime* createTime) {
	TorCtlCircuitBuild *circuitBuild = moduleData;
	ShadowLogFunc log = circuitBuild->log;

	log(G_LOG_LEVEL_DEBUG, __FUNCTION__, "[%d] CIRC: circID=%d status=%d buildFlags=%d purpose=%d reason=%d",
			code, circID, status, buildFlags, purpose, reason);

	/* if our circuit was closed, build new one */
	if(status == TORCTL_CIRC_STATUS_CLOSED) {
		TorCtlCircuitBuild_Circuit *circuit = NULL;
		for(GList *iter = g_list_first(circuitBuild->circuits); iter && !circuit; iter = g_list_next(iter)) {
			TorCtlCircuitBuild_Circuit *tmp = iter->data;
			if(tmp->circID == circID) {
				circuit = tmp;
			}
		}

		if(circuit) {
			log(G_LOG_LEVEL_MESSAGE, __FUNCTION__, "circuit %d closed, rebuilding", circuit->circID);
			g_queue_push_tail(circuitBuild->circuitsToBuild, circuit);
			if(g_queue_get_length(circuitBuild->circuitsToBuild) == 1) {
				torControl_buildCircuit(circuitBuild->sockd, circuit->relays);
			}
			circuitBuild->state = TORCTL_CIRCBUILD_STATE_GET_CIRC_ID;
		}
	}
}
Пример #2
0
static void _torControlCircuitBuild_circEvent(gpointer moduleData, gint code, gchar* line, gint circID, GString* path, gint status,
		gint buildFlags, gint purpose, gint reason, GDateTime* createTime) {
	TorCtlCircuitBuild *circuitBuild = moduleData;
	ShadowLogFunc log = circuitBuild->log;

	log(G_LOG_LEVEL_DEBUG, __FUNCTION__, "[%d] CIRC: circID=%d status=%d buildFlags=%d purpose=%d reason=%d",
			code, circID, status, buildFlags, purpose, reason);

	/* if our circuit was closed, build new one */
	if(circID == circuitBuild->circID && status == TORCTL_CIRC_STATUS_CLOSED) {
	    torControl_buildCircuit(circuitBuild->sockd, circuitBuild->circuit);
	    circuitBuild->state = TORCTL_CIRCBUILD_STATE_GET_CIRC_ID;
	}
}
Пример #3
0
static void _torControlCircuitBuild_statusEvent(gpointer moduleData, gint code, gchar* line,
        gint type, gint severity, gchar *action, GHashTable *arguments) {
    TorCtlCircuitBuild *circuitBuild = moduleData;
    ShadowLogFunc log = circuitBuild->log;

    if(type == TORCTL_STATUS_TYPE_CLIENT && !g_ascii_strcasecmp(action, "BOOTSTRAP")) {
        gchar *progress = g_hash_table_lookup(arguments, "PROGRESS");
        if(!progress) {
            log(G_LOG_LEVEL_WARNING, __FUNCTION__, "Could not find argument PROGRESS in bootstrap status");
        } else if(!g_ascii_strcasecmp(progress, "100")) {
            circuitBuild->bootstrapped = TRUE;
            torControl_buildCircuit(circuitBuild->sockd, circuitBuild->circuit);
            circuitBuild->state = TORCTL_CIRCBUILD_STATE_GET_CIRC_ID;
        }
    }
}
Пример #4
0
static void _torControlCircuitBuild_responseEvent(gpointer moduleData, GList *reply, gpointer userData) {
	TorCtlCircuitBuild *circuitBuild = moduleData;
	ShadowLogFunc log = circuitBuild->log;

	TorControl_ReplyLine *replyLine = g_list_first(reply)->data;
	switch(TORCTL_CODE_TYPE(replyLine->code)) {
        case TORCTL_REPLY_ERROR: {
            log(G_LOG_LEVEL_WARNING, __FUNCTION__, "[%d] ERROR: %s", replyLine->code, replyLine->body);
            break;
        }

	    case TORCTL_REPLY_SUCCESS: {
	        log(G_LOG_LEVEL_MESSAGE, __FUNCTION__, "[%d] SUCCESS: %s", replyLine->code, replyLine->body);

	        switch(circuitBuild->state) {
	            case TORCTL_CIRCBUILD_STATE_AUTHENTICATE:
	            case TORCTL_CIRCBUILD_STATE_SETCONFS:
	            case TORCTL_CIRCBUILD_STATE_SETEVENTS:
	                circuitBuild->state = circuitBuild->nextState;
	                circuitBuild->waitingForResponse = FALSE;
	                break;

	            case TORCTL_CIRCBUILD_STATE_CHECKSTATUS: {
	                if(userData) {
                        TorControl_BootstrapPhase *phase = userData;
                        if(phase->progress == 100) {
                            circuitBuild->bootstrapped = TRUE;
                            torControl_buildCircuit(circuitBuild->sockd, circuitBuild->circuit);
                            circuitBuild->state = TORCTL_CIRCBUILD_STATE_GET_CIRC_ID;
                        } else {
                            circuitBuild->state = TORCTL_CIRCBUILD_STATE_CREATE_CIRCUIT;
                        }
	                }
                    break;
	            }

	            case TORCTL_CIRCBUILD_STATE_GET_CIRC_ID: {
	                if(userData) {
                        TorControl_ReplyExtended *extended = userData;
                        circuitBuild->circID = extended->circID;
                        circuitBuild->state = TORCTL_CIRCBUILD_STATE_ATTACH_STREAMS;

                        /* go through and reattach streams to this circuit */
                        for(GList *iter = circuitBuild->streamsToAttach; iter; iter = g_list_next(iter)) {
                            gint streamID = (gint)iter->data;
                            torControl_attachStream(circuitBuild->sockd, streamID, circuitBuild->circID);
                        }

                        g_list_free(circuitBuild->streamsToAttach);
                        circuitBuild->streamsToAttach = NULL;
	                }
                    break;
	            }

	            case TORCTL_CIRCBUILD_STATE_CREATE_CIRCUIT:
	            case TORCTL_CIRCBUILD_STATE_ATTACH_STREAMS:
	            	break;
            }
	    }

	    /* make sure we proceed with the next state */
	    _torControlCircuitBuild_initialize(moduleData);

	    break;
	}
}