-rw-r--r-- | core/opie-login/passworddialogimpl.cpp | 6 | ||||
-rw-r--r-- | noncore/settings/aqpkg/ipkg.cpp | 11 |
2 files changed, 14 insertions, 3 deletions
diff --git a/core/opie-login/passworddialogimpl.cpp b/core/opie-login/passworddialogimpl.cpp index d9132e2..3c1b474 100644 --- a/core/opie-login/passworddialogimpl.cpp +++ b/core/opie-login/passworddialogimpl.cpp | |||
@@ -119,97 +119,101 @@ void PasswordDialogImpl::done(int res) { | |||
119 | } | 119 | } |
120 | 120 | ||
121 | if(m_isSet) | 121 | if(m_isSet) |
122 | PasswordDialog::done( res ); | 122 | PasswordDialog::done( res ); |
123 | } | 123 | } |
124 | 124 | ||
125 | /* | 125 | /* |
126 | * Lets see if we can write either shadow | 126 | * Lets see if we can write either shadow |
127 | * | 127 | * |
128 | */ | 128 | */ |
129 | /** | 129 | /** |
130 | * CRYPT the password and then tries to write it either to the shadow password | 130 | * CRYPT the password and then tries to write it either to the shadow password |
131 | * or to the plain /etc/passwd | 131 | * or to the plain /etc/passwd |
132 | */ | 132 | */ |
133 | void PasswordDialogImpl::writePassword() { | 133 | void PasswordDialogImpl::writePassword() { |
134 | /* | 134 | /* |
135 | * Check if both texts are the same | 135 | * Check if both texts are the same |
136 | */ | 136 | */ |
137 | if ( m_pass->text() != m_confirm->text() ) | 137 | if ( m_pass->text() != m_confirm->text() ) |
138 | return error( tr("Passwords don't match"), | 138 | return error( tr("Passwords don't match"), |
139 | tr("<qt>The two passwords don't match. Please try again.</qt>") ); | 139 | tr("<qt>The two passwords don't match. Please try again.</qt>") ); |
140 | 140 | ||
141 | 141 | ||
142 | /* | 142 | /* |
143 | * Now crypt the password so we can write it later | 143 | * Now crypt the password so we can write it later |
144 | */ | 144 | */ |
145 | char* password = ::crypt( m_pass->text().latin1(), crypt_make_salt() ); | 145 | char* password = ::crypt( m_pass->text().latin1(), crypt_make_salt() ); |
146 | 146 | ||
147 | if ( !password ) | 147 | if ( !password ) |
148 | return error( tr("Password not legal" ), | 148 | return error( tr("Password not legal" ), |
149 | tr("<qt>The entered password is not a valid password." | 149 | tr("<qt>The entered password is not a valid password." |
150 | "Please try entering a valid password.</qt>" ) ); | 150 | "Please try entering a valid password.</qt>" ) ); |
151 | 151 | ||
152 | /* rewind and rewrite the password file */ | 152 | /* rewind and rewrite the password file */ |
153 | ::setpwent(); | 153 | ::setpwent(); |
154 | 154 | ||
155 | FILE* file = ::fopen( "/etc/passwd.new", "w" ); | 155 | FILE* file = ::fopen( "/etc/passwd.new", "w" ); |
156 | struct passwd* pass; | 156 | struct passwd* pass; |
157 | while ( (pass = ::getpwent()) != 0l ) { | 157 | while ( (pass = ::getpwent()) != 0l ) { |
158 | /* no shadow password support */ | 158 | /* no shadow password support */ |
159 | if ( pass->pw_uid == 0 ) | 159 | if ( pass->pw_uid == 0 ) |
160 | pass->pw_passwd = password; | 160 | pass->pw_passwd = password; |
161 | 161 | ||
162 | ::putpwent( pass, file ); | 162 | ::putpwent( pass, file ); |
163 | } | 163 | } |
164 | 164 | ||
165 | ::fclose( file ); | 165 | ::fclose( file ); |
166 | ::endpwent(); | 166 | ::endpwent(); |
167 | ::rename("/etc/passwd.new","/etc/passwd" ); | 167 | if (::rename("/etc/passwd.new","/etc/passwd" ) == -1) |
168 | return error( tr("Rename /etc/passwd failed"), | ||
169 | tr("<qt>Renaming /etc/passwd.new to /etc/passwd failed." | ||
170 | "Please check your /etc/passed file, your /etc directory " | ||
171 | "or your filesystem.</qt>") ); | ||
168 | 172 | ||
169 | /* should be done now */ | 173 | /* should be done now */ |
170 | #ifdef OPIE_LOGIN_SHADOW_PW | 174 | #ifdef OPIE_LOGIN_SHADOW_PW |
171 | #error "Can't write Shadow Passwords fixme" | 175 | #error "Can't write Shadow Passwords fixme" |
172 | #endif | 176 | #endif |
173 | } | 177 | } |
174 | 178 | ||
175 | /** | 179 | /** |
176 | * Raise an error. Delete input and set the focus after showing | 180 | * Raise an error. Delete input and set the focus after showing |
177 | * the error to the user | 181 | * the error to the user |
178 | */ | 182 | */ |
179 | void PasswordDialogImpl::error( const QString& caption, const QString& text ) { | 183 | void PasswordDialogImpl::error( const QString& caption, const QString& text ) { |
180 | m_isSet = false; | 184 | m_isSet = false; |
181 | QMessageBox::critical(this,caption, text, | 185 | QMessageBox::critical(this,caption, text, |
182 | QMessageBox::Ok, QMessageBox::NoButton ); | 186 | QMessageBox::Ok, QMessageBox::NoButton ); |
183 | 187 | ||
184 | m_pass->setText(""); | 188 | m_pass->setText(""); |
185 | m_pass->setFocus(); | 189 | m_pass->setFocus(); |
186 | 190 | ||
187 | m_confirm->setText(""); | 191 | m_confirm->setText(""); |
188 | } | 192 | } |
189 | 193 | ||
190 | void PasswordDialogImpl::slotToggleEcho( bool b ) { | 194 | void PasswordDialogImpl::slotToggleEcho( bool b ) { |
191 | m_pass-> setEchoMode( b ? QLineEdit::Normal : QLineEdit::Password ); | 195 | m_pass-> setEchoMode( b ? QLineEdit::Normal : QLineEdit::Password ); |
192 | m_confirm->setEchoMode( b ? QLineEdit::Normal : QLineEdit::Password ); | 196 | m_confirm->setEchoMode( b ? QLineEdit::Normal : QLineEdit::Password ); |
193 | } | 197 | } |
194 | 198 | ||
195 | ///////////////////////// | 199 | ///////////////////////// |
196 | /// static functions | 200 | /// static functions |
197 | /// | 201 | /// |
198 | 202 | ||
199 | /** | 203 | /** |
200 | * Ask whether or not we need to show the dialog. It returns true if | 204 | * Ask whether or not we need to show the dialog. It returns true if |
201 | * no root password is set so that the user will be able to set one. | 205 | * no root password is set so that the user will be able to set one. |
202 | */ | 206 | */ |
203 | bool PasswordDialogImpl::needDialog() { | 207 | bool PasswordDialogImpl::needDialog() { |
204 | /* | 208 | /* |
205 | * This can cope with no password and shadow passwords | 209 | * This can cope with no password and shadow passwords |
206 | * Let us go through the user database until we find 'root' and then | 210 | * Let us go through the user database until we find 'root' and then |
207 | * see if it is 'shadow' and see if shadow is empty or see if the password is empty | 211 | * see if it is 'shadow' and see if shadow is empty or see if the password is empty |
208 | */ | 212 | */ |
209 | bool need = false; | 213 | bool need = false; |
210 | struct passwd *pwd; | 214 | struct passwd *pwd; |
211 | ::setpwent(); | 215 | ::setpwent(); |
212 | 216 | ||
213 | while((pwd = ::getpwent() ) ) { | 217 | while((pwd = ::getpwent() ) ) { |
214 | /* found root */ | 218 | /* found root */ |
215 | if( pwd->pw_uid == 0 ) { | 219 | if( pwd->pw_uid == 0 ) { |
diff --git a/noncore/settings/aqpkg/ipkg.cpp b/noncore/settings/aqpkg/ipkg.cpp index dd9e78d..c5c6387 100644 --- a/noncore/settings/aqpkg/ipkg.cpp +++ b/noncore/settings/aqpkg/ipkg.cpp | |||
@@ -164,158 +164,165 @@ void Ipkg :: createSymLinks() | |||
164 | for ( pkg = dependantPackages->first(); pkg != 0; pkg = dependantPackages->next() ) | 164 | for ( pkg = dependantPackages->first(); pkg != 0; pkg = dependantPackages->next() ) |
165 | { | 165 | { |
166 | if ( *pkg == package ) | 166 | if ( *pkg == package ) |
167 | continue; | 167 | continue; |
168 | emit outputText( " " ); | 168 | emit outputText( " " ); |
169 | emit outputText( tr( "Creating symbolic links for %1" ).arg( *pkg ) ); | 169 | emit outputText( tr( "Creating symbolic links for %1" ).arg( *pkg ) ); |
170 | linkPackage( Utils::getPackageNameFromIpkFilename( *pkg ), destination, destDir ); | 170 | linkPackage( Utils::getPackageNameFromIpkFilename( *pkg ), destination, destDir ); |
171 | } | 171 | } |
172 | } | 172 | } |
173 | } | 173 | } |
174 | 174 | ||
175 | delete dependantPackages; | 175 | delete dependantPackages; |
176 | 176 | ||
177 | emit outputText( tr("Finished") ); | 177 | emit outputText( tr("Finished") ); |
178 | emit outputText( "" ); | 178 | emit outputText( "" ); |
179 | } | 179 | } |
180 | 180 | ||
181 | void Ipkg :: removeStatusEntry() | 181 | void Ipkg :: removeStatusEntry() |
182 | { | 182 | { |
183 | QString statusFile = destDir; | 183 | QString statusFile = destDir; |
184 | if ( statusFile.right( 1 ) != "/" ) | 184 | if ( statusFile.right( 1 ) != "/" ) |
185 | statusFile.append( "/" ); | 185 | statusFile.append( "/" ); |
186 | statusFile.append( "usr/lib/ipkg/status" ); | 186 | statusFile.append( "usr/lib/ipkg/status" ); |
187 | QString outStatusFile = statusFile; | 187 | QString outStatusFile = statusFile; |
188 | outStatusFile.append( ".tmp" ); | 188 | outStatusFile.append( ".tmp" ); |
189 | 189 | ||
190 | emit outputText( "" ); | 190 | emit outputText( "" ); |
191 | emit outputText( tr("Removing status entry...") ); | 191 | emit outputText( tr("Removing status entry...") ); |
192 | QString tempstr = tr("status file - "); | 192 | QString tempstr = tr("status file - "); |
193 | tempstr.append( statusFile ); | 193 | tempstr.append( statusFile ); |
194 | emit outputText( tempstr ); | 194 | emit outputText( tempstr ); |
195 | tempstr = tr("package - "); | 195 | tempstr = tr("package - "); |
196 | tempstr.append( package ); | 196 | tempstr.append( package ); |
197 | emit outputText( tempstr ); | 197 | emit outputText( tempstr ); |
198 | 198 | ||
199 | QFile readFile( statusFile ); | 199 | QFile readFile( statusFile ); |
200 | QFile writeFile( outStatusFile ); | 200 | QFile writeFile( outStatusFile ); |
201 | 201 | ||
202 | if ( !readFile.open( IO_ReadOnly ) ) | 202 | if ( !readFile.open( IO_ReadOnly ) ) |
203 | { | 203 | { |
204 | tempstr = tr("Couldn't open status file - "); | 204 | tempstr = tr("Couldn't open status file - "); |
205 | tempstr.append( statusFile ); | 205 | tempstr.append( statusFile ); |
206 | emit outputText( tempstr ); | 206 | emit outputText( tempstr ); |
207 | return; | 207 | return; |
208 | } | 208 | } |
209 | 209 | ||
210 | if ( !writeFile.open( IO_WriteOnly ) ) | 210 | if ( !writeFile.open( IO_WriteOnly ) ) |
211 | { | 211 | { |
212 | tempstr = tr("Couldn't create tempory status file - "); | 212 | tempstr = tr("Couldn't create temporary status file - "); |
213 | tempstr.append( outStatusFile ); | 213 | tempstr.append( outStatusFile ); |
214 | emit outputText( tempstr ); | 214 | emit outputText( tempstr ); |
215 | return; | 215 | return; |
216 | } | 216 | } |
217 | 217 | ||
218 | int i = 0; | 218 | int i = 0; |
219 | 219 | ||
220 | QTextStream readStream( &readFile ); | 220 | QTextStream readStream( &readFile ); |
221 | QTextStream writeStream( &writeFile ); | 221 | QTextStream writeStream( &writeFile ); |
222 | QString line; | 222 | QString line; |
223 | 223 | ||
224 | char k[21]; | 224 | char k[21]; |
225 | char v[1001]; | 225 | char v[1001]; |
226 | QString key; | 226 | QString key; |
227 | QString value; | 227 | QString value; |
228 | 228 | ||
229 | while ( !readStream.atEnd() ) | 229 | while ( !readStream.atEnd() ) |
230 | { | 230 | { |
231 | //read new line | 231 | //read new line |
232 | line = readStream.readLine(); | 232 | line = readStream.readLine(); |
233 | 233 | ||
234 | if ( line.contains( ":", TRUE ) ) | 234 | if ( line.contains( ":", TRUE ) ) |
235 | { | 235 | { |
236 | //grep key and value from line | 236 | //grep key and value from line |
237 | k[0] = '\0'; | 237 | k[0] = '\0'; |
238 | v[0] = '\0'; | 238 | v[0] = '\0'; |
239 | sscanf( line, "%[^:]: %[^\n]", k, v ); | 239 | sscanf( line, "%[^:]: %[^\n]", k, v ); |
240 | key = k; | 240 | key = k; |
241 | value = v; | 241 | value = v; |
242 | key = key.stripWhiteSpace(); | 242 | key = key.stripWhiteSpace(); |
243 | value = value.stripWhiteSpace(); | 243 | value = value.stripWhiteSpace(); |
244 | } else { | 244 | } else { |
245 | key = ""; | 245 | key = ""; |
246 | value = ""; | 246 | value = ""; |
247 | } | 247 | } |
248 | 248 | ||
249 | if ( key == "Package" && value == package ) | 249 | if ( key == "Package" && value == package ) |
250 | { | 250 | { |
251 | //skip lines from the deleted package | 251 | //skip lines from the deleted package |
252 | while ( ( !readStream.atEnd() ) && ( line.stripWhiteSpace() != "" ) ) | 252 | while ( ( !readStream.atEnd() ) && ( line.stripWhiteSpace() != "" ) ) |
253 | { | 253 | { |
254 | line = readStream.readLine(); | 254 | line = readStream.readLine(); |
255 | } | 255 | } |
256 | } else { | 256 | } else { |
257 | 257 | ||
258 | //write other lines into the tempfile | 258 | //write other lines into the tempfile |
259 | writeStream << line << "\n"; | 259 | writeStream << line << "\n"; |
260 | 260 | ||
261 | // Improve UI responsiveness | 261 | // Improve UI responsiveness |
262 | i++; | 262 | i++; |
263 | if ( ( i % 50 ) == 0 ) | 263 | if ( ( i % 50 ) == 0 ) |
264 | qApp->processEvents(); | 264 | qApp->processEvents(); |
265 | } | 265 | } |
266 | } | 266 | } |
267 | 267 | ||
268 | readFile.close(); | 268 | readFile.close(); |
269 | writeFile.close(); | 269 | writeFile.close(); |
270 | 270 | ||
271 | // Remove old status file and put tmp stats file in its place | 271 | // Remove old status file and put tmp stats file in its place |
272 | remove( statusFile ); | 272 | remove( statusFile ); |
273 | rename( outStatusFile, statusFile ); | 273 | if (::rename( outStatusFile, statusFile ) == -1) |
274 | { | ||
275 | tempstr = tr("Couldn't rename temporary status file - "); | ||
276 | tempstr.append( outStatusFile ); | ||
277 | tempstr.append( tr("to status file - ") ); | ||
278 | tempstr.append( statusFile ); | ||
279 | emit outputText( tempstr ); | ||
280 | } | ||
274 | } | 281 | } |
275 | 282 | ||
276 | int Ipkg :: executeIpkgLinkCommand( QStringList *cmd ) | 283 | int Ipkg :: executeIpkgLinkCommand( QStringList *cmd ) |
277 | { | 284 | { |
278 | // If one is already running - should never be but just to be safe | 285 | // If one is already running - should never be but just to be safe |
279 | if ( proc ) | 286 | if ( proc ) |
280 | { | 287 | { |
281 | delete proc; | 288 | delete proc; |
282 | proc = 0; | 289 | proc = 0; |
283 | } | 290 | } |
284 | 291 | ||
285 | // OK we're gonna use OProcess to run this thing | 292 | // OK we're gonna use OProcess to run this thing |
286 | proc = new OProcess(); | 293 | proc = new OProcess(); |
287 | aborted = false; | 294 | aborted = false; |
288 | 295 | ||
289 | // Connect up our slots | 296 | // Connect up our slots |
290 | connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)), | 297 | connect(proc, SIGNAL(processExited(Opie::Core::OProcess*)), |
291 | this, SLOT( linkProcessFinished())); | 298 | this, SLOT( linkProcessFinished())); |
292 | connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)), | 299 | connect(proc, SIGNAL(receivedStdout(Opie::Core::OProcess*,char*,int)), |
293 | this, SLOT(linkCommandStdout(Opie::Core::OProcess*,char*,int))); | 300 | this, SLOT(linkCommandStdout(Opie::Core::OProcess*,char*,int))); |
294 | 301 | ||
295 | *proc << *cmd; | 302 | *proc << *cmd; |
296 | 303 | ||
297 | if(!proc->start(OProcess::NotifyOnExit, OProcess::All)) | 304 | if(!proc->start(OProcess::NotifyOnExit, OProcess::All)) |
298 | { | 305 | { |
299 | emit outputText( tr("Couldn't start ipkg-link process" ) ); | 306 | emit outputText( tr("Couldn't start ipkg-link process" ) ); |
300 | } | 307 | } |
301 | 308 | ||
302 | return 0; | 309 | return 0; |
303 | } | 310 | } |
304 | 311 | ||
305 | void Ipkg::linkProcessFinished() | 312 | void Ipkg::linkProcessFinished() |
306 | { | 313 | { |
307 | // Report that the link process succeeded/failed | 314 | // Report that the link process succeeded/failed |
308 | 315 | ||
309 | if ( error ) | 316 | if ( error ) |
310 | emit outputText( tr("Symbolic linking failed!\n") ); | 317 | emit outputText( tr("Symbolic linking failed!\n") ); |
311 | else | 318 | else |
312 | emit outputText( tr("Symbolic linking succeeded.\n") ); | 319 | emit outputText( tr("Symbolic linking succeeded.\n") ); |
313 | 320 | ||
314 | delete proc; | 321 | delete proc; |
315 | proc = 0; | 322 | proc = 0; |
316 | finished = true; | 323 | finished = true; |
317 | } | 324 | } |
318 | 325 | ||
319 | void Ipkg::linkCommandStdout(OProcess*, char *buffer, int buflen) | 326 | void Ipkg::linkCommandStdout(OProcess*, char *buffer, int buflen) |
320 | { | 327 | { |
321 | QString lineStr = buffer; | 328 | QString lineStr = buffer; |