BOOL CSettingsPage::OnInitDialog() { int t; BYTE buf[_MAX_PATH*sizeof(TCHAR)]; DWORD bufLen; DWORD dwType; CWaitCursor wait; CTooltipPropertyPage::OnInitDialog(); SetDlgItemInt(IDC_PSERVERPORT,(t=QueryDword(_T("PServerPort")))>=0?t:2401,FALSE); bufLen=sizeof(buf); if(RegQueryValueEx(g_hServerKey,_T("LockServer"),NULL,&dwType,buf,&bufLen)) { SetDlgItemText(IDC_LOCKSERVER,_T("localhost")); SetDlgItemInt(IDC_LOCKSERVERPORT,(t=QueryDword(_T("LockServerPort")))>=0?t:2402,FALSE); } else { RegDeleteValue(g_hServerKey,_T("LockServerPort")); TCHAR *p=_tcschr((TCHAR*)buf,':'); if(p) *p='\0'; m_edLockServer.SetWindowText((LPCTSTR)buf); SetDlgItemInt(IDC_LOCKSERVERPORT,p?_tstoi(p+1):2402,FALSE); } if(!RegQueryValueEx(g_hServerKey,_T("AnonymousUsername"),NULL,&dwType,buf,&bufLen)) m_edAnonUser.SetWindowText((TCHAR*)buf); SendDlgItemMessage(IDC_PSERVERPORT,EM_LIMITTEXT,4); SendDlgItemMessage(IDC_LOCKSERVERPORT,EM_LIMITTEXT,4); m_sbServerPort.SetRange32(1,65535); m_sbLockPort.SetRange32(1,65535); bufLen=sizeof(buf); if(RegQueryValueEx(g_hServerKey,_T("TempDir"),NULL,&dwType,buf,&bufLen) && SHRegGetUSValue(_T("SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment"),_T("TEMP"),NULL,(LPVOID)buf,&bufLen,TRUE,NULL,0) && !GetEnvironmentVariable(_T("TEMP"),(LPTSTR)buf,sizeof(buf)) && !GetEnvironmentVariable(_T("TMP"),(LPTSTR)buf,sizeof(buf))) { // Not set *buf='\0'; } m_edTempDir.SetWindowText((LPCTSTR)buf); m_cbEncryption.ResetContent(); m_cbEncryption.SetItemData(m_cbEncryption.AddString(_T("Optional")),0); m_cbEncryption.SetItemData(m_cbEncryption.AddString(_T("Request Authentication")),1); m_cbEncryption.SetItemData(m_cbEncryption.AddString(_T("Request Encryption")),2); m_cbEncryption.SetItemData(m_cbEncryption.AddString(_T("Require Authentication")),3); m_cbEncryption.SetItemData(m_cbEncryption.AddString(_T("Require Encryption")),4); m_cbCompression.ResetContent(); m_cbCompression.SetItemData(m_cbCompression.AddString(_T("Optional")),0); m_cbCompression.SetItemData(m_cbCompression.AddString(_T("Request Compression")),1); m_cbCompression.SetItemData(m_cbCompression.AddString(_T("Require Compression")),2); m_cbEncryption.SetCurSel((t=QueryDword(_T("EncryptionLevel")))>=0?t:0); m_cbCompression.SetCurSel((t=QueryDword(_T("CompressionLevel")))>=0?t:0); /* Migrate the old setting */ if((t=QueryDword(_T("DontUseDomain")))>=0) { if(t) { /* If dont use domain is set, force domain to computer name */ /* The server will automatically pick up the domain otherwise */ bufLen=sizeof(buf); GetComputerName((LPTSTR)buf,&bufLen); RegSetValueEx(g_hServerKey,_T("DefaultDomain"),0,REG_SZ,(BYTE*)buf,_tcslen((LPCTSTR)buf)); } RegDeleteValue(g_hServerKey,_T("DontUseDomain")); if(g_bPrivileged) GetParent()->PostMessage(PSM_CHANGED, (WPARAM)m_hWnd); /* SetModified happens too early */ } m_cbDefaultDomain.ResetContent(); DWORD dwLen = sizeof(mw_computer)/sizeof(mw_computer[0]); m_cbDefaultDomain.AddString(_T("(default)")); GetComputerName(mw_computer,&dwLen); m_cbDefaultDomain.AddString(mw_computer); if(isDomainMember(mw_domain)) { LPWSTR pw_pdc; m_cbDefaultDomain.AddString(mw_domain); if(!NetGetAnyDCName(NULL,mw_domain,(LPBYTE*)&pw_pdc) || !NetGetDCName(NULL,mw_domain,(LPBYTE*)&pw_pdc)) { wcscpy(mw_pdc,pw_pdc); NetApiBufferFree(pw_pdc); } } CString szDefaultDomain = QueryString(_T("DefaultDomain")); int n = m_cbDefaultDomain.FindStringExact(-1,szDefaultDomain); m_cbDefaultDomain.SetCurSel(n>0?n:0); m_cbRunAsUser.ResetContent(); m_cbRunAsUser.AddString(_T("(client user)")); CString usr = QueryString(_T("RunAsUser")); if(!usr.GetLength()) m_cbRunAsUser.SetCurSel(0); else m_cbRunAsUser.SetCurSel(m_cbRunAsUser.AddString(usr)); if(!g_bPrivileged) { m_edTempDir.EnableWindow(FALSE); m_edLockServer.EnableWindow(FALSE); m_cbEncryption.EnableWindow(FALSE); m_cbCompression.EnableWindow(FALSE); m_sbServerPort.EnableWindow(FALSE); m_sbLockPort.EnableWindow(FALSE); m_cbDefaultDomain.EnableWindow(FALSE); m_cbRunAsUser.EnableWindow(FALSE); m_edAnonUser.EnableWindow(FALSE); ::EnableWindow(*GetDlgItem(IDC_CHANGETEMP),FALSE); ::EnableWindow(*GetDlgItem(IDC_LOCKSERVERPORT),FALSE); ::EnableWindow(*GetDlgItem(IDC_PSERVERPORT),FALSE); } return TRUE; }
int passwd (int argc, char **argv) { int c; int err = 0; char *typed_password = NULL, *typed_password2 = NULL; const char *username, *user; passwd_entry *passnode; char *linebuf = NULL; char *real_user = NULL; char *password_domain = NULL; int adduser=0,deluser=0,disableuser=0,realuser=0,remove_realuser=0,use_domain=0; int arg_specified = 0; if (argc == -1) usage (passwd_usage); optind = 0; while ((c = getopt (argc, argv, "axXr:RD:")) != -1) { switch (c) { case 'a': if(arg_specified) usage (passwd_usage); arg_specified = 1; adduser = 1; break; case 'x': if(arg_specified) usage (passwd_usage); arg_specified = 1; disableuser = 1; break; case 'X': if(arg_specified) usage (passwd_usage); arg_specified = 1; deluser = 1; break; case 'r': realuser = 1; real_user = xstrdup(optarg); break; case 'R': remove_realuser = 1; break; case 'D': use_domain = 1; password_domain = xstrdup(optarg); break; case '?': default: usage (passwd_usage); break; } } argc -= optind; argv += optind; if(!argc) user = NULL; else user=argv[0]; #ifdef CLIENT_SUPPORT if (current_parsed_root->isremote) { if (argc > 1) usage (passwd_usage); if (!supported_request ("passwd")) error (1, 0, "server does not support passwd"); if(!user && adduser) { error(1,0,"You cannot add yourself"); } if(!user && deluser) { error(1,0,"You cannot delete yourself"); } if(user || current_parsed_root->username || current_parsed_root->hostname) { printf ("%s %s@%s\n", (adduser) ? "Adding user" : (deluser) ? "Deleting user" : "Changing repository password for", user?user:current_parsed_root->username?current_parsed_root->username:getcaller(),current_parsed_root->hostname); } else { printf ("Changing repository password for %s\n",getcaller()); } fflush (stdout); if(!use_domain && !deluser && !disableuser) { typed_password = getpass ("New password: "******"Verify password: "******"Passwords do not match, try again"); } memset (typed_password2, 0, strlen (typed_password2)); typed_password = xrealloc(typed_password, strlen(typed_password) +32); if(strlen(typed_password)) crypt_password(typed_password); } if (adduser) send_arg ("-a"); if (disableuser) send_arg ("-x"); if (deluser) send_arg ("-X"); if (realuser) { send_arg ("-r"); send_arg (real_user); } if (remove_realuser) send_arg ("-R"); if(use_domain) { send_arg ("-D"); send_arg (password_domain); } if (argc == 1) send_arg(user); else send_arg("*"); if(typed_password) { send_arg (typed_password); /* Send the new password */ memset (typed_password, 0, strlen (typed_password)); xfree (typed_password); } send_to_server ("passwd\012", 0); return get_responses_and_close (); } if(!server_active) #endif { if(argc!=0 && argc!=1) usage (passwd_usage); if(!user && adduser) { error(1,0,"You cannot add yourself"); } if(!user && deluser) { error(1,0,"You cannot delete yourself"); } if(user || current_parsed_root->username) { printf ("%s %s\n", (adduser) ? "Adding user" : (deluser) ? "Deleting user" : "Changing password for", user?user:current_parsed_root->username); } else { printf ("Changing repository password for %s\n",getcaller()); } fflush (stdout); if (argc == 0) username = CVS_Username; else { username = user; } if(!use_domain && !deluser && !disableuser) { typed_password = getpass ("New password: "******"Verify password: "******"Passwords do not match, try again"); } memset (typed_password2, 0, strlen (typed_password2)); typed_password = xrealloc(typed_password, strlen(typed_password) +32); if(strlen(typed_password)) crypt_password(typed_password); } } #ifdef SERVER_SUPPORT if(server_active) { if ((argc != 1) && (argc != 2)) usage (passwd_usage); if(!strcmp(user,"*")) username = CVS_Username; else { username = user; #if defined(_WIN32) #ifdef SJIS if(_mbschr(username,'\\') && !isDomainMember()) #else if(strchr(username,'\\') && !isDomainMember()) #endif { error(1,0,"CVS server is not acting as a domain member - cannot specify domains"); } #endif } if(argc==2) typed_password = argv[1]; } #endif if (typed_password && (strcmp(username, CVS_Username) != 0) && (! verify_admin ())) error (1, 0, "Only administrators can add or change another's password"); read_passwd_list(); passnode = find_passwd_entry(username); if (passnode == NULL) { if (!adduser) error (1, 0, "Could not find %s in password file", username); if (! verify_admin()) { error (1, 0, "Only administrators can add users" ); } passnode = new_passwd_entry(); passnode->username=xstrdup(username); passnode->password=xstrdup(typed_password); passnode->real_username=NULL; } if(deluser) { if (! verify_admin()) { error (1, 0, "Only administrators can delete users" ); } xfree(passnode->username); passnode->username = NULL; } else if(disableuser) { if (! verify_admin()) { error (1, 0, "Only administrators can disable users" ); } xfree(passnode->password); passnode->password=xstrdup("#DISABLED#"); } else { xfree(passnode->password); #ifdef _WIN32 /* Unix servers can't make any sense of this */ if(use_domain) { passnode->password = xmalloc(strlen(password_domain)+2); strcpy(passnode->password,"!"); strcat(passnode->password,password_domain); } else #endif passnode->password = xstrdup(typed_password); if(realuser) { if(!getpwnam(real_user)) error(1, 0, "User '%s' is not a real user on the system.",real_user); xfree(passnode->real_username); passnode->real_username = xstrdup(real_user); } else if (remove_realuser) { xfree(passnode->real_username); passnode->real_username=NULL; } if((passnode->real_username && !getpwnam(passnode->real_username)) || (!passnode->real_username && passnode->username && !getpwnam(passnode->username))) { error(0,0,"*WARNING* CVS user '%s' will not be able to log in until they are aliased to a valid system user.",username); } } write_passwd_list(); free_passwd_list(); xfree(real_user); xfree(password_domain); return (err); }
DWORD BreakNameIntoParts(LPCTSTR name, LPWSTR w_name, LPWSTR w_domain, LPWSTR w_pdc) { static wchar_t *pw_pdc; const TCHAR *ptr; wchar_t w_defaultdomain[DNLEN+1]= {0}; int is_domain = isDomainMember(w_defaultdomain); #ifdef TRACE if(is_domain) TRACE(3,"Machine is domain member"); else TRACE(3,"Machine is standalone"); #endif ptr=_tcschr(name, '\\'); if (ptr) { #ifdef _UNICODE _tcscpy(w_name,ptr+1); _tcsncpy(w_domain,name,ptr-name); w_domain[ptr-name]='\0'; #else w_name[MultiByteToWideChar(CP_ACP,0,ptr+1,-1,w_name,UNLEN+1)]='\0'; w_domain[MultiByteToWideChar(CP_ACP,0,name,ptr-name,w_domain,DNLEN)]='\0'; #endif } else { #ifdef _UNICODE _tcscpy(w_name,name); #else w_name[MultiByteToWideChar(CP_ACP,0,name,-1,w_name,UNLEN+1)]='\0'; #endif if(is_domain) wcscpy(w_domain,w_defaultdomain); else *w_domain='\0'; } if(w_pdc) { typedef DWORD (WINAPI *DsGetDcNameW_t)(LPCWSTR ComputerName,LPCWSTR DomainName,GUID *DomainGuid,LPCWSTR SiteName,ULONG Flags,PDOMAIN_CONTROLLER_INFOW *DomainControllerInfo); DsGetDcNameW_t pDsGetDcNameW; pDsGetDcNameW=(DsGetDcNameW_t)GetProcAddress(GetModuleHandle(_T("netapi32")),"DsGetDcNameW"); w_pdc[0]='\0'; if(w_domain[0] && pDsGetDcNameW) { PDOMAIN_CONTROLLER_INFOW pdi; if(!pDsGetDcNameW(NULL,w_domain,NULL,NULL,DS_IS_FLAT_NAME,&pdi) || !pDsGetDcNameW(NULL,w_domain,NULL,NULL,DS_IS_DNS_NAME,&pdi)) { wcscpy(w_pdc,pdi->DomainControllerName); NetApiBufferFree(pdi); } } else if(w_domain[0]) { if(!NetGetAnyDCName(NULL,w_domain,(LPBYTE*)&pw_pdc) || !NetGetDCName(NULL,w_domain,(LPBYTE*)&pw_pdc)) { wcscpy(w_pdc,pw_pdc); NetApiBufferFree(pw_pdc); } } #ifdef TRACE TRACE(3,"Authenticating server: %S",w_pdc[0]?w_pdc:L"(local)"); #endif } return ERROR_SUCCESS; }