Пример #1
0
void options_file_save(GKeyFile *kf, const char *leafname)
{
    char *pathname = options_file_filename_for_saving(leafname, NULL);
    char *file_data;
    gsize data_len;
    GError *err = NULL;

    if (!pathname)
        return;
    /* leafname may actually be a relative path, so make sure any directories
     * in it exist */
    if (strchr(leafname, G_DIR_SEPARATOR))
    {
        char *dirname = g_path_get_dirname(pathname);

        options_file_mkdir_with_parents(dirname);
        g_free(dirname);
    }
    file_data = g_key_file_to_data(kf, &data_len, &err);
    if (err)
    {
        if (err && !STR_EMPTY(err->message))
        {
            dlg_critical(NULL, _("Unable to generate options file %s: %s"),
                         pathname, err->message);
        }
        else
        {
            dlg_critical(NULL, _("Unable to generate options file %s"),
                         pathname);
        }
        g_error_free(err);
    }
    else if (file_data)
    {
        if (!g_file_set_contents(pathname, file_data, data_len, &err))
        {
            if (err && !STR_EMPTY(err->message))
            {
                dlg_critical(NULL, _("Unable to save options file %s: %s"),
                             pathname, err->message);
            }
            else
            {
                dlg_critical(NULL, _("Unable to save options file %s"),
                             pathname);
            }
            if (err)
                g_error_free(err);
        }
    }
    g_free(pathname);
    g_free(file_data);
}
Пример #2
0
/* --- PRIVATE FUNCTIONS ---------------------------------------------------- */
static void CallbackGroupMember(
	_In_ CSV_HANDLE hOutfile,
	_In_ CSV_HANDLE hDenyOutfile,
	_Inout_ LPTSTR *tokens
) {
	BOOL bResult = FALSE;
	LPTSTR pMember = NULL;
	LPTSTR next = NULL;
	LPTSTR listMember = NULL;

	UNREFERENCED_PARAMETER(hDenyOutfile);

	if (STR_EMPTY(tokens[LdpListMember]))
		return;

		listMember = _tcsdup(tokens[LdpListMember]);
		pMember = _tcstok_s(listMember, _T(";"), &next);
		while (pMember) {
			bResult = ControlWriteOutline(hOutfile, pMember, tokens[LdpListDn], CONTROL_MEMBER_KEYWORD);
			if (!bResult) {
				LOG(Err, _T("Cannot write outline for <%s>"), tokens[LdpListDn]);
			}
			pMember = _tcstok_s(NULL, _T(";"), &next);
		}
		free(listMember);
}
static void CallbackMakeAllNodes(
	_In_ CSV_HANDLE hOutfile,
	_In_ CSV_HANDLE hDenyOutfile,
	_In_ LPTSTR *tokens
) {
	BOOL bResult = FALSE;
	CACHE_OBJECT_BY_DN cacheEntry = { 0 };
	PCACHE_OBJECT_BY_DN inserted = NULL;
	BOOL newElement = FALSE;
	DWORD i = 0;

	UNREFERENCED_PARAMETER(hDenyOutfile);

	if (STR_EMPTY(tokens[RelDnMaster]) || STR_EMPTY(tokens[RelDnSlave]))
		return;

	for (i = 0; i < 2; i++) {
		cacheEntry.dn = _tcsdup(tokens[i]);
		if (!cacheEntry.dn)
			FATAL(_T("Could not dup dn <%s>"), tokens[i]);
		cacheEntry.objectClass = _tcsdup(_T("unknown"));
		if (!cacheEntry.objectClass)
			FATAL(_T("Could not dup objectclass for dn <%s>"), tokens[i]);

		CacheEntryInsert(
			ppCache,
			(PVOID)&cacheEntry,
			sizeof(CACHE_OBJECT_BY_DN),
			&inserted,
			&newElement
		);
		if (!inserted) {
			LOG(Err, _T("cannot insert new object-by-dn cache entry <%s>"), tokens[i]);
		}
		else if (!newElement) {
			LOG(Dbg, _T("object-by-dn cache entry is not new <%s>"), tokens[i]);
			free(cacheEntry.dn);
			free(cacheEntry.objectClass);
		}
		else {
			LOG(Dbg, _T("successfully inserted new object-by-dn entry for <%d>, writing to file"), tokens[i]);
			bResult = ControlWriteOutline(hOutfile, cacheEntry.dn, cacheEntry.objectClass, CONTROL_ALLNODES_KEYWORD);
		}
	}
}
/* --- PRIVATE FUNCTIONS ---------------------------------------------------- */
static void CallbackExchRoleEntry(
	_In_ CSV_HANDLE hOutfile,
	_In_ CSV_HANDLE hDenyOutfile,
	_Inout_ LPTSTR *tokens
) {
	UNREFERENCED_PARAMETER(hDenyOutfile);
	BOOL bResult = FALSE;
	LPTSTR roleEntry = NULL;
	LPTSTR roleEntryName = NULL;
	LPTSTR listMsExchRoleEntries = NULL;
	LPTSTR nextEntry = NULL;
	LPTSTR nextEntryField = NULL;
	LPTSTR domainDN = NULL;
	LPTSTR dn = NULL;
	DWORD roleEntryIndex = 0;
	size_t eTSDNlen = 0;

	if (!exchangeTrustedSubsystemDN) {
		dn = _tcsdup(tokens[LdpListDn]);
		domainDN = _tcsstr(dn, _T("dc="));
		eTSDNlen = _tcslen(ETS_PARTIAL_DN) + _tcslen(domainDN) + 1;
		exchangeTrustedSubsystemDN = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,eTSDNlen * sizeof(TCHAR));
		if (!exchangeTrustedSubsystemDN) {
			LOG(Err, _T("Cannot allocate DN string"));
		}
		_tcsncat_s(exchangeTrustedSubsystemDN, eTSDNlen, ETS_PARTIAL_DN, _tcslen(ETS_PARTIAL_DN));
		_tcsncat_s(exchangeTrustedSubsystemDN, eTSDNlen, domainDN, _tcslen(domainDN));
	}

	// Do we have role entries
	if (STR_EMPTY(tokens[LdpListMsExchRoleEntries]))
		return;

	listMsExchRoleEntries = _tcsdup(tokens[LdpListMsExchRoleEntries]);
	CharLower(listMsExchRoleEntries);
	roleEntry = _tcstok_s(listMsExchRoleEntries, _T(";"), &nextEntry);
	while (roleEntry) {
		roleEntryName = _tcstok_s(roleEntry, _T(","), &nextEntryField);
		roleEntryName = _tcstok_s(NULL, _T(","), &nextEntryField);
		if (IsInSetOfStrings(roleEntryName, controlRoleEntryList, CONTROL_ROLE_ENTRY_COUNT, &roleEntryIndex)) {
			bResult = ControlWriteOutline(hOutfile, tokens[LdpListDn], exchangeTrustedSubsystemDN, gc_RoleEntryKeyword[roleEntryIndex]);
			if (!bResult) {
				LOG(Err, _T("Cannot write outline for <%s>"), tokens[LdpListDn]);
			}
		}
		nextEntryField = NULL;
		roleEntry = _tcstok_s(NULL, _T(";"), &nextEntry);
	}
	free(listMsExchRoleEntries);
}
Пример #5
0
static void
home_widget_add_module_response (ClutterActor *dialog,
    const gchar *module,
    MnbHomeWidget *self)
{
  if (!STR_EMPTY (module))
    {
      DEBUG ("Setting module '%s', chosen from dialog", module);
      home_widget_set_module (self, module);
    }

  g_object_unref (dialog);
  /* FIXME: why do I need this */
  clutter_actor_queue_redraw (clutter_actor_get_stage (CLUTTER_ACTOR (self)));
}
Пример #6
0
static void
home_widget_set_module (MnbHomeWidget *self,
    const gchar *module)
{
  if (0 == g_strcmp0 (module, self->priv->module))
    return;

  DEBUG ("%s -> %s (%s)", self->priv->module, module,
      self->priv->settings_path);

  g_free (self->priv->module);
  self->priv->module = g_strdup (module);

  if (self->priv->app != NULL)
    dawati_home_plugins_app_deinit (self->priv->app);

  g_clear_object (&self->priv->app);

  if (STR_EMPTY (self->priv->module))
    {
      DEBUG ("no module, going into edit mode (%s)",
          self->priv->settings_path);
      mnb_home_widget_set_edit_mode (self, TRUE);
    }
  else
    {
      DEBUG ("module = '%s' (%s)", self->priv->module,
          self->priv->settings_path);

      if (self->priv->engine == NULL)
        self->priv->engine = mnb_home_plugins_engine_dup ();

      self->priv->app =
        mnb_home_plugins_engine_create_app (self->priv->engine,
            self->priv->module, self->priv->settings_path);
      if (self->priv->app != NULL)
        dawati_home_plugins_app_init (self->priv->app);
    }

  /* reload the widget */
  mnb_home_widget_set_edit_mode (self, self->priv->edit_mode);

  g_object_notify (G_OBJECT (self), "module");
}
Пример #7
0
GKeyFile *options_file_open(const char *leafname, const char *group_name)
{
    char *filename;
    GKeyFile *kf = g_key_file_new();
    GError *err = NULL;
    char *first_group;

    options_file_init_paths();
    filename = options_file_build_filename(leafname, NULL);
    if (!filename)
        return kf;

    if (!g_key_file_load_from_file(kf, filename,
                                   G_KEY_FILE_KEEP_COMMENTS | G_KEY_FILE_KEEP_TRANSLATIONS,
                                   &err))
    {
        if (err && !STR_EMPTY(err->message))
            dlg_critical(NULL, _("Can't read options file %s: %s"),
                         filename, err->message);
        else
            dlg_critical(NULL, _("Can't read options file %s"), filename);
        if (err)
            g_error_free(err);
        g_free(filename);
        return kf;
    }

    first_group = g_key_file_get_start_group(kf);
    if (!first_group || strcmp(first_group, group_name))
    {
        dlg_critical(NULL, _("Options file %s does not start with group '%s'"),
                     filename, group_name);
        g_key_file_free(kf);
        kf = g_key_file_new();
    }

    g_free(first_group);
    g_free(filename);

    return kf;
}
Пример #8
0
void
mnb_home_widget_set_edit_mode (MnbHomeWidget *self,
    gboolean edit_mode)
{
  //if (edit_mode == self->priv->edit_mode)
  //  return;

  DEBUG ("%d -> %d for widget %s", self->priv->edit_mode,
      edit_mode, self->priv->settings_path);
  self->priv->edit_mode = edit_mode;
  //g_object_notify (G_OBJECT (self), "edit-mode");

  /* FIXME: should hold refs to the actors rather than destroy/recreate them? */
  mx_bin_set_child (MX_BIN (self), NULL);

  /* FIXME: animate this */
  if (edit_mode)
    {
      ClutterActor *table;

      table = mx_table_new ();
      mx_bin_set_child (MX_BIN (self), table);

      if (!STR_EMPTY (self->priv->module))
        {
          ClutterActor *config, *remove;

          remove = mx_button_new_with_label ("x");
          mx_table_insert_actor_with_properties (MX_TABLE (table), remove, 0, 1,
                                                 "x-expand", FALSE,
                                                 "y-expand", FALSE,
                                                 "x-fill", FALSE,
                                                 "y-fill", FALSE,
                                                 NULL);

          g_signal_connect (remove, "clicked",
              G_CALLBACK (home_widget_remove_module), self);

          if (self->priv->app != NULL)
            config = dawati_home_plugins_app_get_configuration (
                self->priv->app);
          else
            config = mx_label_new_with_text (_("Plugin missing"));

          if (CLUTTER_IS_ACTOR (config))
            mx_table_insert_actor_with_properties (MX_TABLE (table), config, 1, 0,
                                                   "x-expand", TRUE,
                                                   "y-expand", TRUE,
                                                   "x-fill", TRUE,
                                                   "y-fill", TRUE,
                                                   NULL);
        }
      else /* STR_EMPTY (self->priv->module) */
        {
          ClutterActor *button;

          button = mx_button_new_with_label ("+");
          mx_table_insert_actor (MX_TABLE (table), button, 0, 0);

          g_signal_connect (button, "clicked",
              G_CALLBACK (home_widget_add_module), self);
        }

      clutter_actor_show_all (table);
    }
  else /* !edit_mode */
    {
      ClutterActor *widget = NULL;

      if (self->priv->app != NULL)
        {
          widget = dawati_home_plugins_app_get_widget (self->priv->app);

          if (!CLUTTER_IS_ACTOR (widget))
            /* FIXME: make this better */
            {
            widget = mx_label_new_with_text (_("Broken plugin"));
            }
        }
      else if (!STR_EMPTY (self->priv->module))
        {
          widget = mx_label_new_with_text (_("Plugin missing"));
        }

      if (widget != NULL)
        mx_bin_set_child (MX_BIN (self), widget);
    }
}
Пример #9
0
/*
 * Executes SQL statement zSql on zDatabase, using parameters zArgs and file name substitutions zFileArgs
 * Result data is loaded onto pData, and pRowCnt and pColCnt will indicate number of loaded rows and
 * number of columns in the row. Total number of items in pData will be nRowCnt * nColCnt
 */
static int
_runSql(char *zDatabase, char *zSrcSql, char *zArgs, char *zFileArgs, Array_t *pData, int *pColCnt,
        char *zEntryFilePath,
        char *zSubstFileNames)
{
    int result;

    sqlite3 *pDB = NULL;
    sqlite3_stmt *pStmt = NULL;
    sqlite3_stmt *pArgsStmt = NULL;
    Array_t sqlArgs;
    char *zError = NULL;
    char *zFullFilePath = NULL;
    sqlite3_stmt *pSubstStmt = NULL;
    char *zFileContent = NULL;
    char *zSchemaSql = NULL;

    char *zSql = strCopy(zSrcSql, -1);

    /*
    * Only first 16 substitute parameters will be processed. This is related to the fact that in C there
    * is no non-hacking way to dynamically build variadic arguments. So, to support list of values we just
    * limit maximum number of substitute strings to reasonably high number (16)
    */
    const char *zz[16];
    memset(&zz, 0, sizeof(zz));

    Array_init(&sqlArgs, sizeof(SqlArg_t), (void *) _freeSqlArg);

    *pColCnt = 0;

    //    Array_init(pData, sizeof(sqlite3_value *), (void *) _freeSqliteValue);

    /*
    * Open database (use :memory: if not defined)
    */
    if (zDatabase == NULL || strlen(zDatabase) == 0)
    {
        zDatabase = ":memory:";
    }
    CHECK_CALL(sqlite3_open_v2(zDatabase, &pDB,
                               SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | SQLITE_OPEN_SHAREDCACHE,
                               NULL));

    CHECK_CALL(sqlite3_enable_load_extension(pDB, 1));

    // load extension library
    CHECK_CALL(sqlite3_load_extension(pDB, "../../bin/libFlexilite", NULL, &zError));

    // load and run db schema
    CHECK_CALL(file_load_utf8("../../sql/dbschema.sql", &zSchemaSql));
    CHECK_CALL(sqlite3_exec(pDB, (const char *) zSchemaSql, NULL, NULL, &zError));

    /*
     * Substitute strings
     */
    if (!STR_EMPTY(zSubstFileNames))
    {
        CHECK_STMT_PREPARE(pDB, "select key, value from json_each(:1);", &pSubstStmt);
        CHECK_CALL(sqlite3_bind_text(pSubstStmt, 1, zSubstFileNames, -1, NULL));
        int nSubst = 0;
        while ((result = sqlite3_step(pSubstStmt)) == SQLITE_ROW)
        {
            if (nSubst >= 16)
            {
                result = SQLITE_ERROR;
                zError = "Number of substitute strings must not exceed 16";
                goto ONERROR;
            }
            sqlite3_free(zFullFilePath);
            zFullFilePath = NULL;

            Path_join(&zFullFilePath, zEntryFilePath, (char *) sqlite3_column_text(pSubstStmt, 1));

            CHECK_CALL(file_load_utf8(zFullFilePath, &zFileContent));

            zz[nSubst++] = zFileContent;
            zFileContent = NULL; // Memory will be freed by zz
        }
        if (result != SQLITE_DONE)
            goto ONERROR;

        char *zTemp = zSql;
        zSql = sqlite3_mprintf(zTemp, zz[0], zz[1], zz[2], zz[3], zz[4], zz[5], zz[6], zz[7], zz[8],
                               zz[9], zz[10], zz[11], zz[12], zz[13], zz[14], zz[15]);
        sqlite3_free(zTemp);
    }

    // TODO use flexi('init')

    CHECK_STMT_PREPARE(pDB, zSql, &pStmt);

    // Check if we have arguments JSON. Prepare arguments
    if (!STR_EMPTY(zArgs))
    {
        CHECK_STMT_PREPARE(pDB, "select value, type from json_each(:1);", &pArgsStmt);
        CHECK_CALL(sqlite3_bind_text(pArgsStmt, 1, zArgs, -1, NULL));
        int nArgCnt = 0;
        while ((result = sqlite3_step(pArgsStmt)) == SQLITE_ROW)
        {
            SqlArg_t item;
            memset(&item, 0, sizeof(item));
            item.pValue = sqlite3_value_dup(sqlite3_column_value(pArgsStmt, 0));
            Array_setNth(&sqlArgs, sqlArgs.iCnt, &item);
            nArgCnt++;
        }

        if (result != SQLITE_DONE)
            goto ONERROR;

        /*
         * Process file args
         */
        CHECK_CALL(sqlite3_reset(pArgsStmt));
        CHECK_CALL(sqlite3_bind_text(pArgsStmt, 1, zFileArgs, -1, NULL));
        while ((result = sqlite3_step(pArgsStmt)) == SQLITE_ROW)
        {
            int argNo = sqlite3_column_int(pArgsStmt, 0);
            if (argNo >= 1 && argNo <= nArgCnt)
            {
                sqlite3_free(zFullFilePath);
                zFullFilePath = NULL;

                SqlArg_t *arg = Array_getNth(&sqlArgs, (u32) argNo - 1);
                Path_join(&zFullFilePath, zEntryFilePath, (char *) sqlite3_value_text(arg->pValue));

                CHECK_CALL(file_load_utf8(zFullFilePath, &arg->zText));
            }
        }

        if (result != SQLITE_DONE)
            goto ONERROR;

        Array_each(&sqlArgs, (void *) _bindSqlArg, pStmt);
    }

    while ((result = sqlite3_step(pStmt)) == SQLITE_ROW)
    {
        if (*pColCnt == 0)
            *pColCnt = sqlite3_column_count(pStmt);
        int iCol;
        for (iCol = 0; iCol < *pColCnt; iCol++)
        {
            sqlite3_value *pVal = sqlite3_value_dup(sqlite3_column_value(pStmt, iCol));
            Array_setNth(pData, pData->iCnt, &pVal);
        }
    }

    if (result != SQLITE_DONE)
        goto ONERROR;
    result = SQLITE_OK;
    goto EXIT;

    ONERROR:
    Array_clear(pData);
    if (pDB && zError == NULL)
    {
        zError = (char *) sqlite3_errmsg(pDB);
    }
    if (zError != NULL)
        printf("Error: %s\n", zError);

    EXIT:

    sqlite3_free(zSchemaSql);
    sqlite3_finalize(pStmt);
    sqlite3_finalize(pArgsStmt);
    sqlite3_finalize(pSubstStmt);
    if (pDB != NULL)
    {
        result = sqlite3_close(pDB);
        if (result != SQLITE_OK)
        {
            printf("DB Close Error %d. %s\n", result, sqlite3_errmsg(pDB));
        }
    }
    Array_clear(&sqlArgs);
    sqlite3_free(zFullFilePath);
    sqlite3_free(zSql);

    for (int i = 0; i < ARRAY_LEN(zz); i++)
        sqlite3_free((void *) zz[i]);

    if (zFileContent != NULL)
        sqlite3_free(zFileContent);

    return result;
}
/* --- PRIVATE FUNCTIONS ---------------------------------------------------- */
static void CallbackBuildDnCache(
	_In_ CSV_HANDLE hOutfile,
	_In_ CSV_HANDLE hDenyOutfile,
	_In_ LPTSTR *tokens
) {
	BOOL bResult = FALSE;
	CACHE_OBJECT_BY_DN cacheEntry = { 0 };
	CACHE_OBJECT_BY_DN mailCacheEntry = { 0 };
	PCACHE_OBJECT_BY_DN inserted = NULL;
	BOOL newElement = FALSE;
	LPTSTR objectClass = NULL;

	UNREFERENCED_PARAMETER(hDenyOutfile);

	if (STR_EMPTY(tokens[LdpListDn]) || STR_EMPTY(tokens[LdpListObjectClass]))
		return;

	cacheEntry.dn = _tcsdup(tokens[LdpListDn]);
	if (!cacheEntry.dn)
		FATAL(_T("Could not dup dn <%s>"), tokens[LdpListDn]);

	cacheEntry.objectClass = _tcsdup(tokens[LdpListObjectClass]);
	if (!cacheEntry.objectClass)
		FATAL(_T("Could not dup objectClass <%s>"), tokens[LdpListObjectClass]);

	CacheEntryInsert(
		ppCache,
		(PVOID)&cacheEntry,
		sizeof(CACHE_OBJECT_BY_DN),
		&inserted,
		&newElement
	);
	if (!inserted) {
		LOG(Err, _T("cannot insert new object-by-dn cache entry <%s>"), tokens[LdpListDn]);
	}
	else if (!newElement) {
		LOG(Dbg, _T("object-by-dn cache entry is not new <%s>"), tokens[LdpListDn]);
		free(cacheEntry.dn);
		free(cacheEntry.objectClass);
	}
	else {
		objectClass = _tcsrchr(tokens[LdpListObjectClass], _T(';')) + 1;
		bResult = ControlWriteOutline(hOutfile, tokens[LdpListDn], objectClass, CONTROL_ALLNODES_KEYWORD);
		if (!bResult)
			LOG(Err, _T("Cannot write outline for <%s>"), tokens[LdpListDn]);
	}

	// Writing Mail attributes as object of type email
	if (STR_EMPTY(tokens[LdpListMail]))
		return;

	mailCacheEntry.dn = _tcsdup(tokens[LdpListMail]);
	if (!mailCacheEntry.dn)
		FATAL(_T("Could not dup dn <%s>"), tokens[LdpListMail]);

	mailCacheEntry.objectClass = _tcsdup(_T("email"));
	if (!mailCacheEntry.objectClass)
		FATAL(_T("Could not dup objectClass <%s>"), _T("email"));

	CacheEntryInsert(
		ppCache,
		(PVOID)&mailCacheEntry,
		sizeof(CACHE_OBJECT_BY_DN),
		&inserted,
		&newElement
	);
	if (!inserted) {
		LOG(Err, _T("cannot insert new object-by-dn cache entry <%s>"), tokens[LdpListMail]);
	}
	else if (!newElement) {
		LOG(Dbg, _T("object-by-dn cache entry is not new <%s>"), tokens[LdpListMail]);
		free(mailCacheEntry.dn);
		free(mailCacheEntry.objectClass);
	}
	else {
		bResult = ControlWriteOutline(hOutfile, tokens[LdpListMail], _T("email"), CONTROL_ALLNODES_KEYWORD);
		if (!bResult)
			LOG(Err, _T("Cannot write outline for <%s>"), tokens[LdpListMail]);
	}

}