void ProjectSelectionPage::itemChanged( const QModelIndex& current, const QModelIndex& ) { KStandardDirs* dirs = m_templatesModel->plugin()->componentData().dirs(); QString picPath = dirs->findResource("apptemplate_previews", m_templatesModel->data( current, Qt::UserRole+2 ).toString() ); if( picPath.isEmpty() ) { picPath = dirs->findResource("apptemplate_previews", "default-kdevelop.png"); } ui->preview->setPixmap( QPixmap( picPath ) ); ui->description->setText( m_templatesModel->data( current ).toString() ); validateData(); }
/* * This creates a Tab OCR */ void KOCRBase::ocrIntro( ) { m_ocrPage = addVBoxPage( i18n("OCR") ); // Caption - Label and image /* labelstring */ (void) new QLabel( i18n("<b>Starting Optical Character Recognition with %1</b><p>"). arg( ocrEngineName() ), m_ocrPage ); // Find the kadmos logo and display if available KStandardDirs stdDir; QString logo = stdDir.findResource( "data", "kooka/pics/" + ocrEngineLogo() ); kdDebug(28000)<< "Reading logo " << logo << endl; QPixmap pix; QWidget *pa = m_ocrPage; if( pix.load( logo )) { QHBox *hb_cap = new QHBox( m_ocrPage ); hb_cap->setSpacing( KDialog::spacingHint()); QLabel *imgLab = new QLabel( hb_cap ); imgLab->setAlignment( Qt::AlignHCenter | Qt::AlignTop ); imgLab->setPixmap( pix ); pa = hb_cap; } (void) new KActiveLabel( ocrEngineDesc(), pa ); }
void Rad::load() { if (loaded) return; KStandardDirs *dirs = KGlobal::dirs(); QString radkfile = dirs->findResource("data", "kiten/radkfile"); if (radkfile.isNull()) { KMessageBox::error(0, i18n("Kanji radical information file not installed, so radical searching cannot be used.")); return; } QFile f(radkfile); if (!f.open(IO_ReadOnly)) { KMessageBox::error(0, i18n("Kanji radical information could not be loaded, so radical searching cannot be used.")); } QTextStream t(&f); t.setCodec(QTextCodec::codecForName("eucJP")); Radical cur; while (!t.eof()) { QString s = t.readLine(); QChar first = s.at(0); if (first == '#') // comment! { // nothing } else if (first == '$') // header { // save previous one if( !cur.kanji().isNull() ) list.append(cur); //first entry is trim(last 4 chars).. <rad><space><strokes> unsigned int strokes = s.right(2).toUInt(); QString radical = QString(s.at(2)); cur = Radical(radical, strokes); } else // continuation { cur.addKanji(s); } } // we gotta append the last one!! // this nagged jasonkb for a bit wondering why fue wasn't showing up ;) list.append(cur); f.close(); loaded = true; }
KRomajiEdit::KRomajiEdit(QWidget *parent, const char *name) : KLineEdit(parent, name) { kana = "unset"; KStandardDirs *dirs = KGlobal::dirs(); QString romkana = dirs->findResource("data", "kiten/romkana.cnv"); if (romkana.isNull()) { KMessageBox::error(0, i18n("Romaji information file not installed, so Romaji conversion cannot be used.")); return; } QFile f(romkana); if (!f.open(IO_ReadOnly)) { KMessageBox::error(0, i18n("Romaji information could not be loaded, so Romaji conversion cannot be used.")); } QTextStream t(&f); t.setCodec(QTextCodec::codecForName("eucJP")); while (!t.eof()) { QString s = t.readLine(); QChar first = s.at(0); if (first == '#') // comment! { // nothing } else if (first == '$') // header { if (kana == "unset") kana = "hiragana"; else kana = "katakana"; } else // body { QStringList things(QStringList::split(QChar(' '), s)); QString thekana(things.first()); QString romaji(*things.at(1)); if (kana == "hiragana") hiragana[romaji] = thekana; else if (kana == "katakana") katakana[romaji] = thekana; } } f.close(); kana = "english"; }
void TrafficGraph::drawBackground(QPainter *p, int w, int h) { p->fillRect(0,0,w, h, mBackgroundColor); if(mSvgFilename.isEmpty()) return; //nothing to draw, return QSvgRenderer *svgRenderer; if(!sSvgRenderer.contains(mSvgFilename)) { KStandardDirs* kstd = KGlobal::dirs(); QString file = kstd->findResource( "data", "ksysguard/" + mSvgFilename); svgRenderer = new QSvgRenderer(file, this); sSvgRenderer.insert(mSvgFilename, svgRenderer); } else svgRenderer = sSvgRenderer[mSvgFilename]; svgRenderer->render(p); }
QString Workspace::makeNameForNewSheet() const { /* Find a name of the form "Sheet %d" that is not yet used by any * of the existing worksheets. */ int i = 1; bool found = false; QString sheetName; KStandardDirs* kstd = KGlobal::dirs(); do { sheetName = i18n( "Sheet %1" , i++ ); //Check we don't have any existing files with this name found = !(kstd->findResource( "data", "ksysguard/" + sheetName + ".sgrd").isEmpty()); //Check if we have any sheets with the same tab name or file name for(int i = 0; !found && i < mSheetList.size(); i++) if ( tabText(indexOf(mSheetList.at(i))) == sheetName || QString(sheetName+".sgrd") == mSheetList.at(i)->fileName()) found = true; } while ( found ); return sheetName; }
/** * Executes the script using the "sh" shell. * @param sCscopePath If given, overrides the automatic check for Cscope's * path * @param sCtagsPath If given, overrides the automatic check for Ctags' * path * @param sDotPath If given, overrides the automatic check for Dot's * path * @param bCscopeOptsOnly Only verify cscope's path and options * @return true if successful, false otherwise */ bool ConfigFrontend::run(const QString& sCscopePath, const QString& sCtagsPath, const QString& sDotPath, bool bCscopeOptsOnly) { QStringList slArgs; KStandardDirs sd; QString sScript; // Execute using the user's shell setUseShell(); // Find the configuration script sScript = sd.findResource("data", "kscope/kscope_config"); if (sScript.isEmpty()) return false; // Set command line arguments slArgs << QString("sh") << sScript; // Initialise environment setEnv("CSCOPE_PATH", sCscopePath); if (bCscopeOptsOnly){ slArgs << QString("-co"); } else { setEnv("CTAGS_PATH", sCtagsPath); setEnv("DOT_PATH", sDotPath); } // Parser initialisation m_delim = Newline; m_nNextResult = CscopePath; if (!Frontend::run("sh", QStringList(slArgs))) return false; emit test(CscopePath); return true; }
void Workspace::readProperties( const KConfigGroup& cfg ) { QStringList selectedSheets = cfg.readPathEntry( "SelectedSheets", QStringList() ); if ( selectedSheets.isEmpty() ) { /* If SelectedSheets config entry is not there, then it's * probably the first time the user has started KSysGuard. We * then "restore" a special default configuration. */ selectedSheets << "ProcessTable.sgrd"; selectedSheets << "SystemLoad2.sgrd"; } else if(selectedSheets[0] != "ProcessTable.sgrd") { //We need to make sure that this is really is the process table on the first tab. No GUI way of changing this, but should make sure anyway. //Plus this migrates users from the kde3 setup selectedSheets.removeAll("ProcessTable.sgrd"); selectedSheets.prepend( "ProcessTable.sgrd"); } int oldSystemLoad = selectedSheets.indexOf("SystemLoad.sgrd"); if(oldSystemLoad != -1) { selectedSheets.replace(oldSystemLoad, "SystemLoad2.sgrd"); } KStandardDirs* kstd = KGlobal::dirs(); QString filename; for ( QStringList::Iterator it = selectedSheets.begin(); it != selectedSheets.end(); ++it ) { filename = kstd->findResource( "data", "ksysguard/" + *it); if(!filename.isEmpty()) { restoreWorkSheet( filename, false); } } int idx = cfg.readEntry( "currentSheet", 0 ); if (idx < 0 || idx > count() - 1) { idx = 0; } setCurrentIndex(idx); }
bool ThumbView::readSettings() { KConfig *cfg = KGlobal::config(); cfg->setGroup( THUMB_GROUP ); bool dirty = false; QColor color; color = cfg->readColorEntry( MARGIN_COLOR1, &(colorGroup().base())); if( color != m_marginColor1 ) { dirty = true; m_marginColor1 = color; } color = cfg->readColorEntry( MARGIN_COLOR2, &(colorGroup().foreground())); if( color != m_marginColor2 ) { dirty = true; m_marginColor2 = color; } int value; bool sizeDirty = false; value = cfg->readNumEntry( THUMB_MARGIN, 5 ); if( value != m_thumbMargin ) { sizeDirty = true; m_thumbMargin = value; } value = cfg->readNumEntry( PIXMAP_WIDTH, 100 ); if( value != m_pixWidth || m_pixWidth == 0 ) { sizeDirty = true; m_pixWidth = value; } value = cfg->readNumEntry( PIXMAP_HEIGHT, 120 ); if( value != m_pixHeight || m_pixHeight == 0 ) { sizeDirty = true; m_pixHeight = value; } if( sizeDirty ) { int gX = 2*m_thumbMargin+m_pixWidth+10; int gY = 2*m_thumbMargin+m_pixHeight+10; m_iconView->setGridX(gX); m_iconView->setGridY(gY); kdDebug(28000) << "Setting Grid " << gX << " - " << gY << endl; } KStandardDirs stdDir; QString newBgImg = cfg->readEntry( BG_WALLPAPER, stdDir.findResource( "data", STD_TILE_IMG ) ); if( m_bgImg != newBgImg ) { m_bgImg = newBgImg; slSetBackGround(); } return (sizeDirty || dirty); }
KdeSudo::KdeSudo(QWidget *parent, const char *name,const QString& icon, const QString& generic, bool withIgnoreButton) : KPasswordDialog(KPasswordDialog::Password, false, (withIgnoreButton ? User1: false), icon, parent, name) { KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); QString defaultComment = i18n("<b>%1</b> needs administrative privileges. Please enter your password for verification."); p=NULL; bError=false; m_pCookie = new KCookie; // Set vars bool newDcop = args->isSet("newdcop"); bool realtime = args->isSet("r"); bool priority = args->isSet("p"); bool showCommand = (!args->isSet("d")); bool changeUID = true; bool noExec = false; keepPwd = (!args->isSet("n")); emptyPwd = args->isSet("s"); QString runas = args->getOption("u"); QString cmd; if (!args->isSet("c") && !args->count() && (!args->isSet("s"))) { KMessageBox::information(NULL, i18n("No command arguments supplied!\nUsage: kdesudo [-u <runas>] <command>\nKdeSudo will now exit...")); noExec = true; } p = new KProcess; p->clearArguments(); // Parsins args /* Get the comment out of cli args */ QByteArray commentBytes = args->getOption("comment"); QTextCodec* tCodecConv = QTextCodec::codecForLocale(); QString comment = tCodecConv->toUnicode(commentBytes, commentBytes.size()); if (args->isSet("f")) { // If file is writeable, do not change uid QString filename = QFile::decodeName(args->getOption("f")); QString file = filename; if (!file.isEmpty()) { if (file.at(0) != '/') { KStandardDirs dirs; dirs.addKDEDefaults(); file = dirs.findResource("config", file); if (file.isEmpty()) { kdError(1206) << "Config file not found: " << file << "\n"; exit(1); } } QFileInfo fi(file); if (!fi.exists()) { kdError(1206) << "File does not exist: " << file << "\n"; exit(1); } if (fi.isWritable()) { changeUID = false; } } } if (withIgnoreButton) { setButtonText(User1, i18n("&Ignore")); } // Apologies for the C code, taken from kdelibs/kdesu/kdesu_stub.c // KControl and other places need to use the user's existing DCOP server // For that we set DCOPSERVER. Create a file in /tmp and use iceauth to add magic cookies // from the existing server and set ICEAUTHORITY to point to the file if (!newDcop) { dcopServer = m_pCookie->dcopServer(); QCString dcopAuth = m_pCookie->dcopAuth(); QCString iceAuth = m_pCookie->iceAuth(); FILE *fout; char iceauthority[200]; char *host, *auth; host = qstrdup(dcopServer); auth = qstrdup(iceAuth); int tempfile; int oldumask = umask(077); strcpy(iceauthority, "/tmp/iceauth.XXXXXXXXXX"); tempfile = mkstemp(iceauthority); umask(oldumask); if (tempfile == -1) { kdError() << "error in kdesudo mkstemp" << endl; exit(1); } else { // close(tempfile); //FIXME why does this make the connect() call later crash? } iceauthorityFile = iceauthority; //FIXME we should change owner of iceauthority file, but don't have permissions setenv("ICEAUTHORITY", iceauthorityFile, 1); fout = popen("iceauth >/dev/null 2>&1", "w"); if (!fout) { kdError() << "error in kdesudo running iceauth" << endl; exit(1); } fprintf(fout, "add ICE \"\" %s %s\n", host, auth); auth = qstrdup(dcopAuth); //auth = xstrsep(params[P_DCOP_AUTH].value); fprintf(fout, "add DCOP \"\" %s %s\n", host, auth); unsetenv("ICEAUTHORITY"); pclose(fout); } connect( p, SIGNAL(receivedStdout(KProcess*, char*, int)), this, SLOT(receivedOut(KProcess*, char*, int)) ); connect( p, SIGNAL(receivedStderr(KProcess*, char*, int)), this, SLOT(receivedOut(KProcess*, char*, int)) ); connect( p, SIGNAL(processExited (KProcess *)), this, SLOT(procExited(KProcess*))); QString xauthenv = QString(getenv("HOME")) + "/.Xauthority"; p->setEnvironment("XAUTHORITY", xauthenv); // Generate the xauth cookie and put it in a tempfile // set the environment variables to reflect that. // Default cookie-timeout is 60 sec. . // 'man xauth' for more info on xauth cookies. KTempFile temp = KTempFile("/tmp/kdesudo-","-xauth"); m_tmpname = temp.name(); FILE *f; char buf[1024]; QCString disp = m_pCookie->display(); // command: xauth -q -f m_tmpname generate $DISPLAy . trusted timeout 60 QString c = "/usr/bin/xauth -q -f " + m_tmpname + " generate " + QString::fromLocal8Bit(disp) + " . trusted timeout 60"; blockSigChild(); // pclose uses waitpid() if (!(f = popen(c, "r"))) { kdWarning() << k_lineinfo << "Cannot run: " << c << "\n"; unblockSigChild(); return; } // non root users need to be able to read the xauth file. // the xauth file is deleted when kdesudo exits. security? QFile tf(m_tmpname); if (!runas.isEmpty() && runas != "root" && tf.exists()) chmod(m_tmpname.ascii(),0644); QCStringList output; while (fgets(buf, 1024, f) > 0) output += buf; if (pclose(f) < 0) { kdError() << k_lineinfo << "Could not run xauth.\n"; unblockSigChild(); return; } unblockSigChild(); p->setEnvironment("DISPLAY", disp); p->setEnvironment("XAUTHORITY", m_tmpname); if (emptyPwd) *p << "sudo" << "-k"; else { if (changeUID) { *p << "sudo" << "-H" << "-S" << "-p" << "passprompt"; if (!runas.isEmpty()) *p << "-u" << runas; } if (!dcopServer.isEmpty()) *p << "DCOPSERVER=" + dcopServer; if (!iceauthorityFile.isEmpty()) *p << "ICEAUTHORITY=" + iceauthorityFile; if (realtime) { *p << "nice" << "-n" << "10"; addLine(i18n("Priority:"), i18n("realtime:") + QChar(' ') + QString("50/100")); } else if (priority) { QString n = args->getOption("p"); int intn = atoi(n); intn = (intn * 40 / 100) - (20 + 0.5); QString strn; strn.sprintf("%d",intn); *p << "nice" << "-n" << strn; addLine(i18n("Priority:"), n + QString("/100")); } *p << "--"; if (args->isSet("c")) { QString command = args->getOption("c"); QStringList commandSplit = QStringList::split(" ", command); for (int i = 0; i < commandSplit.count(); i++) { QString toto = validArg(commandSplit[i]); *p << toto; cmd += validArg(commandSplit[i]) + QChar(' '); } } else if (args->count()) { for (int i = 0; i < args->count(); i++) { if (i==0) { QStringList argsSplit = QStringList::split(" ", args->arg(i)); for (int i = 0; i < argsSplit.count(); i++) { *p << validArg(argsSplit[i]); cmd += validArg(argsSplit[i]) + QChar(' '); } } else { *p << validArg(args->arg(i)); cmd += validArg(args->arg(i)) + QChar(' '); } } } // strcmd needs to be defined if (showCommand && !cmd.isEmpty()) addLine(i18n("Command:"), cmd); } if (comment.isEmpty()) { if (!generic.isEmpty()) setPrompt(defaultComment.arg(generic)); else setPrompt(defaultComment.arg(cmd)); } else setPrompt(comment); if (noExec) exit(0); else p->start( KProcess::NotifyOnExit, KProcess::All ); }
void KraftViewRO::setup( DocGuardedPtr doc ) { KraftViewBase::setup( doc ); if ( !doc ) return; KLocale *locale = doc->locale(); if ( !locale ) locale = KGlobal::locale(); // do stuff like open a template and render values into it. KStandardDirs stdDirs; QString templFileName = QString( "kraftdoc_ro.trml" ); QString findFile = "kraft/reports/" + templFileName; QString tmplFile = stdDirs.findResource( "data", findFile ); QByteArray kraftHome = qgetenv("KRAFT_HOME"); if( !kraftHome.isEmpty() ) { QString file = QString( "%1/reports/kraftdoc_ro.trml").arg(QString::fromLocal8Bit(kraftHome)); QFileInfo fi(file); if( fi.exists() && fi.isReadable() ) { tmplFile = file; } } if( tmplFile.isEmpty() ) { kDebug() << "Could not find template to render ro view of document."; return; } TextTemplate tmpl( tmplFile ); if( !tmpl.open() ) { return; } tmpl.setValue( DOC_RO_TAG( "HEADLINE" ), doc->docType() + " " + doc->ident() ); tmpl.setValue( DOC_RO_TAG( "DATE" ), locale->formatDate( doc->date(), KLocale::ShortDate ) ); tmpl.setValue( DOC_RO_TAG( "DOC_TYPE" ), doc->docType() ); QString address = doc->address(); address.replace( '\n', "<br/>" ); tmpl.setValue( DOC_RO_TAG( "ADDRESS" ), address ); tmpl.setValue( DOC_RO_TAG( "DOCNO" ), doc->ident() ); tmpl.setValue( DOC_RO_TAG( "PRETEXT" ), doc->preText() ); tmpl.setValue( DOC_RO_TAG( "POSTTEXT" ), doc->postText() ); tmpl.setValue( DOC_RO_TAG( "SALUT" ), doc->salut() ); tmpl.setValue( DOC_RO_TAG( "GOODBYE" ), doc->goodbye() ); DocPositionList positions = doc->positions(); // check the tax settings: If all items have the same settings, its not individual. bool individualTax = false; int ttype = -1; foreach( DocPositionBase *dp, positions ) { if( ttype == -1 ) { ttype = dp->taxType(); } else { if( ttype != dp->taxType() ) { // different from previous one? individualTax = true; break; } } } int pos = 1; int taxFreeCnt = 0; int reducedTaxCnt = 0; int fullTaxCnt = 0; QString docType = doc->docType(); DocType dt(docType); foreach( DocPositionBase *dpb, positions ) { DocPosition *dp = static_cast<DocPosition*>(dpb); tmpl.createDictionary( "ITEMS" ); tmpl.setValue( "ITEMS", "NUMBER", QString::number( pos++ ) ); tmpl.setValue( "ITEMS", "TEXT", dp->text() ); tmpl.setValue( "ITEMS", "AMOUNT", locale->formatNumber( dp->amount() ) ); tmpl.setValue( "ITEMS", "UNIT", dp->unit().einheit( dp->amount() ) ); double singlePrice = dp->unitPrice().toDouble(); if( dt.pricesVisible() ) { tmpl.createSubDictionary("ITEMS", "PRICE_DISPLAY"); tmpl.setValue( "PRICE_DISPLAY", "SINGLE_PRICE", locale->formatMoney( singlePrice ) ); QString style( "positive" ); if ( singlePrice < 0 ) { style = "negative"; } tmpl.setValue( "PRICE_DISPLAY", "PRICE_STYLE", style ); tmpl.setValue( "PRICE_DISPLAY", "PRICE", locale->formatMoney( dp->overallPrice().toDouble() ) ); } #if 0 QString taxType; if( individualTax ) { if( dp->taxType() == 1 ) { taxFreeCnt++; taxType = "TAX_FREE"; } else if( dp->taxType() == 2 ) { taxType = "REDUCED_TAX"; reducedTaxCnt++; } else { // ATTENTION: Default for all non known tax types is full tax. fullTaxCnt++; taxType = "FULL_TAX"; } } #endif }
static int startApp() { KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); // Stop daemon and exit? if (args->isSet("s")) { KDEsuClient client; if (client.ping() == -1) { kdError(1206) << "Daemon not running -- nothing to stop\n"; exit(1); } if (client.stopServer() != -1) { kdDebug(1206) << "Daemon stopped\n"; exit(0); } kdError(1206) << "Could not stop daemon\n"; exit(1); } QString icon; if ( args->isSet("i")) icon = args->getOption("i"); bool prompt = true; if ( args->isSet("d")) prompt = false; // Get target uid QCString user = args->getOption("u"); QCString auth_user = user; struct passwd *pw = getpwnam(user); if (pw == 0L) { kdError(1206) << "User " << user << " does not exist\n"; exit(1); } bool change_uid = (getuid() != pw->pw_uid); // If file is writeable, do not change uid QString file = QFile::decodeName(args->getOption("f")); if (change_uid && !file.isEmpty()) { if (file.at(0) != '/') { KStandardDirs dirs; dirs.addKDEDefaults(); file = dirs.findResource("config", file); if (file.isEmpty()) { kdError(1206) << "Config file not found: " << file << "\n"; exit(1); } } QFileInfo fi(file); if (!fi.exists()) { kdError(1206) << "File does not exist: " << file << "\n"; exit(1); } change_uid = !fi.isWritable(); } // Get priority/scheduler QCString tmp = args->getOption("p"); bool ok; int priority = tmp.toInt(&ok); if (!ok || (priority < 0) || (priority > 100)) { KCmdLineArgs::usage(i18n("Illegal priority: %1").arg(tmp)); exit(1); } int scheduler = SuProcess::SchedNormal; if (args->isSet("r")) scheduler = SuProcess::SchedRealtime; if ((priority > 50) || (scheduler != SuProcess::SchedNormal)) { change_uid = true; auth_user = "******"; } // Get command if (args->isSet("c")) { command = args->getOption("c"); for (int i=0; i<args->count(); i++) { QString arg = QFile::decodeName(args->arg(i)); KRun::shellQuote(arg); command += " "; command += QFile::encodeName(arg); } } else { if( args->count() == 0 ) { KCmdLineArgs::usage(i18n("No command specified.")); exit(1); } command = args->arg(0); for (int i=1; i<args->count(); i++) { QString arg = QFile::decodeName(args->arg(i)); KRun::shellQuote(arg); command += " "; command += QFile::encodeName(arg); } } // Don't change uid if we're don't need to. if (!change_uid) { int result = system(command); result = WEXITSTATUS(result); return result; } // Check for daemon and start if necessary bool just_started = false; bool have_daemon = true; KDEsuClient client; if (!client.isServerSGID()) { kdWarning(1206) << "Daemon not safe (not sgid), not using it.\n"; have_daemon = false; } else if (client.ping() == -1) { if (client.startServer() == -1) { kdWarning(1206) << "Could not start daemon, reduced functionality.\n"; have_daemon = false; } just_started = true; } // Try to exec the command with kdesud. bool keep = !args->isSet("n") && have_daemon; bool terminal = args->isSet("t"); bool new_dcop = args->isSet("newdcop"); bool withIgnoreButton = args->isSet("ignorebutton"); QCStringList env; QCString options; env << ( "DESKTOP_STARTUP_ID=" + kapp->startupId()); if (pw->pw_uid) { // Only propagate KDEHOME for non-root users, // root uses KDEROOTHOME // Translate the KDEHOME of this user to the new user. QString kdeHome = KGlobal::dirs()->relativeLocation("home", KGlobal::dirs()->localkdedir()); if (kdeHome[0] != '/') kdeHome.prepend("~/"); else kdeHome=QString::null; // Use default env << ("KDEHOME="+ QFile::encodeName(kdeHome)); } KUser u; env << (QCString) ("KDESU_USER="******"KDESYCOCA="+QFile::encodeName(locateLocal("cache", "ksycoca")); env << ksycoca; options += "xf"; // X-only, dcop forwarding enabled. } if (keep && !terminal && !just_started) { client.setPriority(priority); client.setScheduler(scheduler); int result = client.exec(command, user, options, env); if (result == 0) { result = client.exitCode(); return result; } } // Set core dump size to 0 because we will have // root's password in memory. struct rlimit rlim; rlim.rlim_cur = rlim.rlim_max = 0; if (setrlimit(RLIMIT_CORE, &rlim)) { kdError(1206) << "rlimit(): " << ERR << "\n"; exit(1); } // Read configuration KConfig *config = KGlobal::config(); config->setGroup("Passwords"); int timeout = config->readNumEntry("Timeout", defTimeout); // Check if we need a password SuProcess proc; proc.setUser(auth_user); int needpw = proc.checkNeedPassword(); if (needpw < 0) { QString err = i18n("Su returned with an error.\n"); KMessageBox::error(0L, err); exit(1); } if (needpw == 0) { keep = 0; kdDebug() << "Don't need password!!\n"; } // Start the dialog QCString password; if (needpw) { KStartupInfoId id; id.initId( kapp->startupId()); KStartupInfoData data; data.setSilent( KStartupInfoData::Yes ); KStartupInfo::sendChange( id, data ); KDEsuDialog dlg(user, auth_user, keep && !terminal,icon, withIgnoreButton); if (prompt) dlg.addLine(i18n("Command:"), command); if ((priority != 50) || (scheduler != SuProcess::SchedNormal)) { QString prio; if (scheduler == SuProcess::SchedRealtime) prio += i18n("realtime: "); prio += QString("%1/100").arg(priority); if (prompt) dlg.addLine(i18n("Priority:"), prio); } int ret = dlg.exec(); if (ret == KDEsuDialog::Rejected) { KStartupInfo::sendFinish( id ); exit(0); } if (ret == KDEsuDialog::AsUser) change_uid = false; password = dlg.password(); keep = dlg.keep(); data.setSilent( KStartupInfoData::No ); KStartupInfo::sendChange( id, data ); } // Some events may need to be handled (like a button animation) kapp->processEvents(); // Run command if (!change_uid) { int result = system(command); result = WEXITSTATUS(result); return result; } else if (keep && have_daemon) { client.setPass(password, timeout); client.setPriority(priority); client.setScheduler(scheduler); int result = client.exec(command, user, options, env); if (result == 0) { result = client.exitCode(); return result; } } else { SuProcess proc; proc.setTerminal(terminal); proc.setErase(true); proc.setUser(user); if (!new_dcop) { proc.setXOnly(true); proc.setDCOPForwarding(true); } proc.setEnvironment(env); proc.setPriority(priority); proc.setScheduler(scheduler); proc.setCommand(command); int result = proc.exec(password); return result; } return -1; }
int process_config_file(void) { // Where is ktalkdlg installed ? QString ktalkdlg_dir = locate("exe", "ktalkdlg"); ktalkdlg_dir.truncate( ktalkdlg_dir.findRev('/') ); // Has to be done, for any $KDEBINDIR in ktalkdrc. setenv("KDEBINDIR", QFile::encodeName(ktalkdlg_dir), 0/*don't overwrite*/); KConfig * syscfg = new KConfig( "ktalkdrc" ); syscfg -> setGroup("ktalkd"); syscfg -> setDollarExpansion(true); QString result; #define found(k) (!(result = syscfg -> readEntry(k)).isEmpty()) // QString cfgStr = cfgStr0.stripWhiteSpace(); if (found("AnswMach")) { Options.answmach=booleanresult(result.ascii()); ktalk_debug("AnswMach : %d",Options.answmach);} if (found("XAnnounce")) { Options.XAnnounce=booleanresult(result.ascii()); ktalk_debug("XAnnounce : %d",Options.XAnnounce); } if (found("Time")) { Options.time_before_answmach=result.toInt(); ktalk_debug("Time : %d",Options.time_before_answmach); } if (found("Sound")) { Options.sound=booleanresult(result.ascii()); ktalk_debug("Sound : %d",Options.sound); } if (found("SoundFile")) { qstrncpy(Options.soundfile,QFile::encodeName(result),S_CFGLINE); ktalk_debug("SoundFile = %s",Options.soundfile); } if (found("SoundPlayer")) { qstrncpy(Options.soundplayer,QFile::encodeName(result),S_CFGLINE); ktalk_debug("SoundPlayer = %s",Options.soundplayer); } if (found("SoundPlayerOpt")) { qstrncpy(Options.soundplayeropt,QFile::encodeName(result),S_CFGLINE); ktalk_debug("SoundPlayerOpt = %s",Options.soundplayeropt); } if (found("MailProg")) { qstrncpy(Options.mailprog,QFile::encodeName(result),S_CFGLINE); ktalk_debug("Mail prog = %s",Options.mailprog); } /* text based announcement */ if (found("Announce1")) { qstrncpy(Options.announce1,result.local8Bit(),S_CFGLINE); } if (found("Announce2")) { qstrncpy(Options.announce2,result.local8Bit(),S_CFGLINE); } if (found("Announce3")) { qstrncpy(Options.announce3,result.local8Bit(),S_CFGLINE); } if (found("NEUUser")) { qstrncpy(Options.NEU_user,result.local8Bit(),S_CFGLINE); ktalk_debug("NEUUser = %s", Options.NEU_user); } if (found("NEUBehaviour")) { Options.NEU_behaviour=result.toInt(); ktalk_debug("NEUBehaviour : %d",Options.NEU_behaviour); } if (found("NEUForwardMethod")) { qstrncpy(Options.NEU_forwardmethod,result.ascii(),5); ktalk_debug("NEUForwardMethod = %s", Options.NEU_forwardmethod); } if (found("ExtPrg")) { qstrncpy(Options.extprg,QFile::encodeName(result),S_CFGLINE); ktalk_debug("Ext prg = %s",Options.extprg); } else { /* has to work even without config file at all */ KStandardDirs stddirs; qstrncpy(Options.extprg, QFile::encodeName(stddirs.findResource("exe","ktalkdlg")), S_CFGLINE-1); } delete syscfg; ktalk_debug("End of global configuration"); return 1; }
static int startApp() { KCmdLineArgs *args = KCmdLineArgs::parsedArgs(); // Stop daemon and exit? if (args->isSet("s")) { KDEsuClient client; if (client.ping() == -1) { kError(1206) << "Daemon not running -- nothing to stop\n"; exit(1); } if (client.stopServer() != -1) { kDebug(1206) << "Daemon stopped\n"; exit(0); } kError(1206) << "Could not stop daemon\n"; exit(1); } QString icon; if ( args->isSet("i")) icon = args->getOption("i"); bool prompt = true; if ( args->isSet("d")) prompt = false; // Get target uid QByteArray user = args->getOption("u").toLocal8Bit(); QByteArray auth_user = user; struct passwd *pw = getpwnam(user); if (pw == 0L) { kError(1206) << "User " << user << " does not exist\n"; exit(1); } bool other_uid = (getuid() != pw->pw_uid); bool change_uid = other_uid; if (!change_uid) { char *cur_user = getenv("USER"); if (!cur_user) cur_user = getenv("LOGNAME"); change_uid = (!cur_user || user != cur_user); } // If file is writeable, do not change uid QString file = args->getOption("f"); if (other_uid && !file.isEmpty()) { if (file.at(0) != '/') { KStandardDirs dirs; file = dirs.findResource("config", file); if (file.isEmpty()) { kError(1206) << "Config file not found: " << file << "\n"; exit(1); } } QFileInfo fi(file); if (!fi.exists()) { kError(1206) << "File does not exist: " << file << "\n"; exit(1); } change_uid = !fi.isWritable(); } // Get priority/scheduler QString tmp = args->getOption("p"); bool ok; int priority = tmp.toInt(&ok); if (!ok || (priority < 0) || (priority > 100)) { KCmdLineArgs::usageError(i18n("Illegal priority: %1", tmp)); exit(1); } int scheduler = SuProcess::SchedNormal; if (args->isSet("r")) scheduler = SuProcess::SchedRealtime; if ((priority > 50) || (scheduler != SuProcess::SchedNormal)) { change_uid = true; auth_user = "******"; } // Get command if (args->isSet("c")) { command = args->getOption("c").toLocal8Bit(); // Accepting additional arguments here is somewhat weird, // but one can conceive use cases: have a complex command with // redirections and additional file names which need to be quoted // safely. } else { if( args->count() == 0 ) { KCmdLineArgs::usageError(i18n("No command specified.")); exit(1); } } for (int i = 0; i < args->count(); i++) { command += ' '; command += QFile::encodeName(KShell::quoteArg(args->arg(i))); } // Don't change uid if we're don't need to. if (!change_uid) { int result = system(command); result = WEXITSTATUS(result); return result; } // Check for daemon and start if necessary bool just_started = false; bool have_daemon = true; KDEsuClient client; if (!client.isServerSGID()) { kWarning(1206) << "Daemon not safe (not sgid), not using it.\n"; have_daemon = false; } else if (client.ping() == -1) { if (client.startServer() == -1) { kWarning(1206) << "Could not start daemon, reduced functionality.\n"; have_daemon = false; } just_started = true; } // Try to exec the command with kdesud. bool keep = !args->isSet("n") && have_daemon; bool terminal = args->isSet("t"); bool withIgnoreButton = args->isSet("ignorebutton"); int winid = -1; bool attach = args->isSet("attach"); if(attach) { winid = args->getOption("attach").toInt(&attach, 0); //C style parsing. If the string begins with "0x", base 16 is used; if the string begins with "0", base 8 is used; otherwise, base 10 is used. if(!attach) kWarning(1206) << "Specified winid to attach to is not a valid number"; } else if(args->isSet("embed")) { /* KDialog originally used --embed for attaching the dialog box. However this is misleading and so we changed to --attach. * For consistancy, we silently map --embed to --attach */ attach = true; winid = args->getOption("embed").toInt(&attach, 0); //C style parsing. If the string begins with "0x", base 16 is used; if the string begins with "0", base 8 is used; otherwise, base 10 is used. if(!attach) kWarning(1206) << "Specified winid to attach to is not a valid number"; } QList<QByteArray> env; QByteArray options; env << ( "DESKTOP_STARTUP_ID=" + kapp->startupId()); if (pw->pw_uid) { // Only propagate KDEHOME for non-root users, // root uses KDEROOTHOME // Translate the KDEHOME of this user to the new user. QString kdeHome = KGlobal::dirs()->relativeLocation("home", KGlobal::dirs()->localkdedir()); if (kdeHome[0] != '/') kdeHome.prepend("~/"); else kdeHome.clear(); // Use default env << ("KDEHOME="+ QFile::encodeName(kdeHome)); } KUser u; env << (QByteArray) ("KDESU_USER="******"rlimit(): " << ERR << "\n"; exit(1); } // Read configuration KConfigGroup config(KGlobal::config(), "Passwords"); int timeout = config.readEntry("Timeout", defTimeout); // Check if we need a password SuProcess proc; proc.setUser(auth_user); int needpw = proc.checkNeedPassword(); if (needpw < 0) { QString err = i18n("Su returned with an error.\n"); KMessageBox::error(0L, err); exit(1); } if (needpw == 0) { keep = 0; kDebug() << "Don't need password!!\n"; } // Start the dialog QString password; if (needpw) { #ifdef Q_WS_X11 KStartupInfoId id; id.initId( kapp->startupId()); KStartupInfoData data; data.setSilent( KStartupInfoData::Yes ); KStartupInfo::sendChange( id, data ); #endif KDEsuDialog dlg(user, auth_user, keep && !terminal, icon, withIgnoreButton); if (prompt) dlg.addCommentLine(i18n("Command:"), QFile::decodeName(command)); if (defKeep) dlg.setKeepPassword(true); if ((priority != 50) || (scheduler != SuProcess::SchedNormal)) { QString prio; if (scheduler == SuProcess::SchedRealtime) prio += i18n("realtime: "); prio += QString("%1/100").arg(priority); if (prompt) dlg.addCommentLine(i18n("Priority:"), prio); } //Attach dialog #ifdef Q_WS_X11 if(attach) KWindowSystem::setMainWindow(&dlg, (WId)winid); #endif int ret = dlg.exec(); if (ret == KDEsuDialog::Rejected) { #ifdef Q_WS_X11 KStartupInfo::sendFinish( id ); #endif exit(1); } if (ret == KDEsuDialog::AsUser) change_uid = false; password = dlg.password(); keep = dlg.keepPassword(); #ifdef Q_WS_X11 data.setSilent( KStartupInfoData::No ); KStartupInfo::sendChange( id, data ); #endif } // Some events may need to be handled (like a button animation) kapp->processEvents(); // Run command if (!change_uid) { int result = system(command); result = WEXITSTATUS(result); return result; } else if (keep && have_daemon) { client.setPass(password.toLocal8Bit(), timeout); client.setPriority(priority); client.setScheduler(scheduler); int result = client.exec(command, user, options, env); if (result == 0) { result = client.exitCode(); return result; } } else { SuProcess proc; proc.setTerminal(terminal); proc.setErase(true); proc.setUser(user); proc.setEnvironment(env); proc.setPriority(priority); proc.setScheduler(scheduler); proc.setCommand(command); int result = proc.exec(password.toLocal8Bit()); return result; } return -1; }